X-Git-Url: https://git.auder.net/?p=xogo.git;a=blobdiff_plain;f=common.css;h=cdfbc7a809b77aa76568be564f84757072399dcb;hp=638a588c8f88c50945e251392e0ac110c65fc753;hb=HEAD;hpb=c7bf7b1b10a6d5059f75f540787aba3daaa435f7 diff --git a/common.css b/common.css index 638a588..eabf641 100644 --- a/common.css +++ b/common.css @@ -1,29 +1,58 @@ +/* CSS reset */ +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} + +html { + height: 100%; +} body { + height: 100%; margin: 0; - text-align: center; background-color: #f8f8f8; font-family: Arial, Verdana, Tahoma, sans-serif; + /* https://stackoverflow.com/a/24392249/12660887 */ + position: relative; } - -#gameInfos, #boardContainer, #gameStopped, #pendingSeek, #pendingRematch, #newGameForm { - display: none; +main { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + flex-wrap: nowrap; + font-size: 1.25rem; } - -#gameStopped > h1 { - margin-bottom: 10px; +h1 { + font-size: 2rem; + font-weight: bold; + text-align: center; + display: block; + margin: 10px 0; } - -/* Sticky footer */ -footer { - position: absolute; - bottom: 0; - left: 0; - right: 0; - height: 50px; +h4 { + font-size: 1.5rem; + font-weight: bold; + text-align: center; + display: block; + margin: 10px 0; + color: darkgreen; +} +a { + text-decoration: none; +} +.bold { + font-weight: bold; } - button { - background-color: green; + background-color: #757575; border: none; color: white; padding: 10px 15px; @@ -35,48 +64,231 @@ button { border-radius: 20%; margin: 15px 0; } - -button:hover { - background-color: darkblue; +button:hover, button.block-btn:hover { + background-color: #b11adc; } - button.block-btn { display: block; - margin: 30px auto 20px auto; - font-size: 1.5em; + background-color: #01786F; + margin: 0 auto 30px auto; /*TODO: margin-bottom 20px ? */ + font-size: 2rem; padding: 15px 32px; } +button.cancel-something { + background-color: darkred; + display: block; + margin-left: auto; + margin-right: auto; +} -#upLeftInfos { +/* "Sticky footer" */ +#footer { position: absolute; + bottom: 0; left: 0; - top: 0; + right: 0; + height: 50px; + text-align: center; +} +@media(max-height: 399px) { + #footer { + display: none; + } +} +a.left-link { + margin-right: 25px; +} +a.right-link { + margin-left: 25px; +} +#footer a > img { + height: 1.2em; + display: inline-block; + transform: translateY(3px); } -#upRightStop { - position: absolute; - left: calc(100% - 25px); - top: 0; +main > div { + margin-top: 25vh; + min-height: 500px; + min-width: 320px; +} +#gameInfos { + max-width: 800px; +} +@media(max-height: 800px) { + #newGameForm, #gameInfos { + margin-top: 30px; + } +} +@media(max-width: 767px) { + main > div { + padding: 0 10px; + } +} +#gameInfos, +#boardContainer, +#gameStopped, +#pendingSeek, +#pendingRematch, +#newGameForm { + display: none; +} +#gameStopped > h1 { + margin-bottom: 10px; } -#upLeftInfos > img, #upRightStop > img { - width: 25px; - cursor: pointer; +#gameInfos > .players-info { + text-align: center; +} +#gameInfos > .options-info { + text-align: center; + color: #757575; + margin-bottom: 15px; +} +#gameInfos > div { + margin: 10px 0; +} +#gameInfos > .rules { + color: #732E6C; +} +#gameInfos > .rules p, +#gameInfos > .rules ul, +#gameInfos > .rules ol { + margin: 10px 0; +} +#gameInfos > .rules ul { + list-style-type: square; + padding-left: 30px; +} +#gameInfos > .rules ol { + list-style-type: numeric; + padding-left: 30px; +} +#gameInfos > .rules a { + padding-bottom: 1px; + border-bottom: 1px dotted black; +} +#gameInfos > .rules .author { + color: darkblue; + font-style: italic; } -#ng-select { +/* Complete rules (separate page) */ +.full-rules { + max-width: 800px; + margin: 20px auto; + padding: 0 10px; + overflow: auto; +} +.full-rules figure.show-pieces { + max-width: 90%; + text-align: center; + margin: 0 auto; +} +.full-rules figure.show-pieces > img { + max-width: 100px; +} +.full-rules > div { margin-bottom: 20px; } - -#ng-name { - /* TODO */ +.full-rules h1, .full-rules h2, .full-rules h3, .full-rules h4 { + font-weight: bold; + display: block; +} +.full-rules h1 { + font-size: 2.5em; + margin: 10px 0 20px 0; +} +.full-rules h2 { + color: darkred; + font-size: 2em; + margin: 10px 0; +} +.full-rules h3 { + color: darkviolet; + font-size: 1.8em; + margin: 10px 0; +} +.full-rules h4 { + color: darkgreen; + font-size: 1.5em; + margin: 5px 0; + text-align: center; +} +piece.mark { + background-image: url('/pieces/mark.svg'); +} +piece.mark.transparent { + opacity: 0.65; +} +.full-rules figure { + display: block; + overflow: visible; + margin-top: 20px; +} +.full-rules figure::after { + content: ''; + display: block; + clear: both; + margin-bottom: 20px; +} +.full-rules .diag { + position: relative; + margin: 0 auto; +} +.full-rules .left { + float: left; +} +.full-rules .right { + float: right; +} +@media screen and (max-width: 550px) { + .full-rules .left { + float: none; + margin-bottom: 10px; + } + .full-rules .right { + float: none; + margin-top: 10px; + } +} +.full-rules figcaption { + display: block; + text-align: center; + clear: both; + font-size: 0.9em; + color: #0D1C46; + font-weight: bold; +} +.full-rules .img-center { + display: block; + margin: 0 auto; +} +/* TODO: use same CSS for rules and full-rules? */ +.full-rules p, .full-rules ul, .full-rules ol { + margin: 10px 0; +} +.full-rules ul { + list-style-type: square; + padding-left: 30px; +} +.full-rules ol { + list-style-type: numeric; + padding-left: 30px; } +#ng-select { + margin-bottom: 20px; +} /* Options when starting custom game */ -p.words { +.words { line-height: 0.9em; + margin-top: 15px; } -.word { +.words > .row { + margin: 0; +} +.words span { cursor: pointer; padding: 3px; display: inline-block; @@ -85,32 +297,82 @@ p.words { .highlight-word { background-color: lightblue; } +#gameOptions { + text-align: center; +} +.option-select, .option-input { + margin: 15px 0 0 0; +} +.option-input { + display: inline-block; + margin-right: 10px; +} +.option-input input[type=number] { + width: 64px; +} +.btn-wrap { + text-align: center; +} +#gameLink { + width: inherit; + text-align: center; +} /* Game link div + custom game "button" */ -#gameLink span, #gameLink a, #playCustom { - text-decoration: underline; - color: blue; +#gameLink span, #gameLink a, #footer a { + padding-bottom: 1px; + border-bottom: 1px dotted darkgrey; + color: darkred; +} +#gameLink span { + display: inline-box; cursor: pointer; } - -#selectVariant { - margin-right: 15px; +#gameLink > p { + margin: 10px 0; } -/* Board container (without reserves) */ -#chessboard { +/* Board container (with reserves) */ +#boardContainer { + position: fixed; + width: 100%; + height: 100%; + left: 0; + top: 0; + margin: 0; + padding: 0; + border: none; +} +#upLeftInfos { + position: absolute; + left: 0; + top: 0; +} +#upRightStop { position: absolute; + left: calc(100% - 25px); + top: 0; +} +#upLeftInfos > svg, #upRightStop > svg { + width: 25px; cursor: pointer; } - -/* Board container can be resized */ -.resizeable { - resize: both; - overflow: hidden; - min-width: 200px; - min-height: 200px; +@media(max-width: 767px) { + #upRightStop { + left: calc(100% - 35px); + } + #upLeftInfos > svg, #upRightStop > svg { + width: 35px; + } + #upLeftInfos > svg path, #upRightStop > svg path { + fill: #999; + } +} +/* Playing board (without reserves) */ +.chessboard { + position: absolute; + cursor: pointer; } - piece { position: absolute; top: 0; @@ -120,13 +382,15 @@ piece { will-change: transform; pointer-events: none; } - +piece.hidden { + display: none; +} /* Drawing of the board */ -#chessboard_SVG { +.chessboard_SVG { width: 100%; height: 100%; } - +/* Default squares colors (can be overriden or unused) */ .dark-square { fill: #b58863; } @@ -136,39 +400,190 @@ piece { .in-shadow { filter: brightness(50%); } - .reserves { position: absolute; display: block; cursor: pointer; } - .reserve-cell { position: relative; display: block; float: left; } - /* Pieces' counter for reserves */ .reserve-num { color: red; position: absolute; display: block; font-weight: bold; - /*z-index: 10;*/ } - -/* Choices div after a promotion (TODO: do not hide board) */ +/* Choices div after a promotion */ #choices, .choice { position: absolute; cursor: pointer; } +/* https://moderncss.dev/custom-select-styles-with-pure-css/ */ +:root { + --select-border: #777; + --select-focus: #b11adc; + --select-arrow: var(--select-border); +} +select { + appearance: none; + background-color: transparent; + border: none; + padding: 0 1em 0 0; + margin: 0; + width: 100%; + font-family: inherit; + font-size: inherit; + cursor: inherit; + line-height: inherit; + z-index: 1; + outline: none; +} +.select { + display: grid; + grid-template-areas: "select"; + align-items: center; + position: relative; + min-width: 15ch; + max-width: 30ch; + border: 1px solid var(--select-border); + border-radius: 0.25em; + padding: 0.25em 0.5em; + font-size: 1.25rem; + cursor: pointer; + line-height: 1.1; + background-color: #fff; + background-image: linear-gradient(to top, #f9f9f9, #fff 33%); + width: 100%; + margin: auto; +} +select, .select::after { + grid-area: select; +} +.select::after { + content: ""; + justify-self: end; + width: 0.8em; + height: 0.5em; + background-color: var(--select-arrow); + clip-path: polygon(100% 0%, 0 0%, 50% 100%); +} +select:focus + .focus { + position: absolute; + top: -1px; + left: -1px; + right: -1px; + bottom: -1px; + border: 2px solid var(--select-focus); + border-radius: inherit; +} + +/* https://auralinna.blog/post/2018/how-to-create-material-design-like-form-text-fields/ */ +.form-field { + display: block; + margin-bottom: 16px; +} +.form-field--is-active .form-field__control::after { + border-bottom: 2px solid #b11adc; + transform: scaleX(150); +} +.form-field--is-active .form-field__label { + color: #b11adc; + font-size: 0.75rem; + transform: translateY(-14px); +} +.form-field--is-filled .form-field__label { + font-size: 0.75rem; + transform: translateY(-14px); +} +.form-field__label { + display: block; + font-size: 1.2rem; + font-weight: normal; + left: 0; + margin: 0; + padding: 18px 12px 0; + position: absolute; + top: 0; + transition: all 0.4s; + width: 100%; +} +.form-field__control { + background: #eee; + border-radius: 8px 8px 0 0; + overflow: hidden; + position: relative; + width: 100%; +} +.form-field__control::after { + border-bottom: 2px solid #b11adc; + bottom: 0; + content: ""; + display: block; + left: 0; + margin: 0 auto; + position: absolute; + right: 0; + transform: scaleX(0); + transition: all 0.4s; + width: 1%; +} +.form-field__input { + appearance: none; + background: transparent; + border: 0; + border-bottom: 1px solid #999; + color: #333; + display: block; + font-size: 1.2rem; + margin-top: 24px; + outline: 0; + padding: 0 12px 10px 12px; + width: 100%; +} + +/* https://dev.to/kallmanation/styling-a-checkbox-with-only-css-3o3p */ +label.checkbox > input[type="checkbox"] { + display: none; +} +label.checkbox > input[type="checkbox"] + *::before { + content: ""; + display: inline-block; + vertical-align: bottom; + margin-bottom: 3px; + width: 1.1rem; + height: 1.1rem; + border-radius: 10%; + border-style: solid; + border-width: 0.1rem; + border-color: gray; +} +label.checkbox > input[type="checkbox"]:checked + *::before { + content: "✓"; + font-size: 1.1rem; + /*padding:10px;*/ + color: white; + text-align: center; + background: teal; + border-color: teal; +} +label.checkbox > input[type="checkbox"]:checked + * { + color: teal; +} +label.checkbox > span.spacer { + width: 10px; + content: " "; +} + /* https://theanam.github.io/css-only-loaders/ ("hour-glass") */ :root{ --loader-width: 70px; --loader-height: 70px; - --loader-color-primary: #141D58; + --loader-color-primary: #01786F; --loader-color-secondary: #EEE; --line-width: 3px; --animation-duration: 3s; @@ -179,7 +594,6 @@ piece { flex-grow: 0; flex-shrink: 0; } - @keyframes slide { 0% { transform: translateY(0%); @@ -197,7 +611,6 @@ piece { transform: translateY(0%); } } - @keyframes spin { 0% { transform: rotate(0deg); @@ -215,7 +628,6 @@ piece { transform: rotate(360deg); } } - .loader.hour-glass { position: relative; width: var(--loader-width, 100px); @@ -227,7 +639,6 @@ piece { animation: spin var(--animation-duration, 4s) infinite ease-in-out; margin: 20px auto; } - .hour-glass:before { content: ""; position: absolute;