html { font-size: 24px; height: 100%; } body { min-height: 100%; margin: 0; display: flex; flex-direction: column; line-height: 1.25; background: #101214; color: white; } /* Generic element styling */ input[type=radio], input[type=checkbox] { margin: 0.125em; vertical-align: middle; } button { font-size: inherit; padding: 0.125em 0.5em; border: 1px solid black; background: #909090; border-image: url(button.png) 33.333% fill / auto repeat; text-transform: lowercase; } h1, h2, h3, h4, h5, h6 { font-weight: normal; margin: 0; } p { margin: 0.5em 0; } p:first-child { margin-top: 0; } p:last-child { margin-bottom: 0; } /* Main page structure */ body > header { display: flex; align-items: center; padding: 0.5em; background: #00080c; } body > header > h1 { flex: 1; font-size: 1.25rem; } body > header > nav { display: flex; gap: 0.5em; } /* Overlay styling */ .overlay { display: flex; align-items: center; justify-content: center; position: fixed; top: 0; bottom: 0; left: 0; right: 0; background: #fff4; } .dialog { display: flex; flex-direction: column; min-width: 33%; max-width: 80%; max-height: 80%; border: 1px solid black; color: black; background: #f4f4f4; box-shadow: 0 1px 3px #000c; } .dialog > header { padding: 0.5em; line-height: 1; background: hsl(225, 20%, 40%); color: white; } .dialog > header h1 { font-size: 1em; } .dialog > footer { display: flex; justify-content: end; gap: 0.5em; padding: 0.5em; background: #d0d0d0; } .dialog > header:empty, .dialog > footer:empty { display: none; } .dialog > section { overflow: auto; padding: 1em; } /* Individual overlays */ table.level-browser { width: 100%; /* for some reason the table ignores the bottom padding when it overflows */ margin-bottom: 1em; line-height: 1.25; border-spacing: 0; cursor: pointer; } table.level-browser td { padding: 0 0.25em; } table.level-browser tr:hover { background: hsl(225, 60%, 90%); } /* Bits and pieces */ .compat-lynx, .compat-ms { font-size: 0.75em; display: inline-block; margin: 0 0.25em; padding: 0.25em; line-height: 1; vertical-align: middle; color: white; background: gray; border-radius: 0.25em; } /* Game area */ main { flex: 0; margin: auto; /* center in both directions baby */ isolation: isolate; display: grid; align-items: center; grid: "header header" "level chips" "level time" "level bonus" "level message" 1fr "level inventory" "controls controls" /* Need explicit min-content to force the hint to wrap */ / min-content min-content ; column-gap: 1em; row-gap: 0.5em; image-rendering: optimizeSpeed; --tile-width: 32px; --tile-height: 32px; --scale: 1; } main > header { grid-area: header; display: grid; grid-auto-columns: 1fr auto; align-items: center; gap: 0.25em; } main > header > h1, main > header > h2 { grid-column: 1; line-height: 1; } main > header > nav { grid-column: 2; justify-self: end; display: flex; gap: 0.25em; } .level { grid-area: level; position: relative; } .level canvas { display: block; width: calc(var(--viewport-width) * var(--tile-width) * var(--scale)); --viewport-width: 9; --viewport-height: 9; } .bummer { grid-area: level; place-self: stretch; display: flex; flex-direction: column; justify-content: center; align-items: center; z-index: 1; font-size: 48px; padding: 10%; background: #0009; color: white; text-align: center; font-weight: bold; text-shadow: 0 2px 1px black; } .bummer:empty { display: none; } .bummer p { margin: 0; } dl.score-chart { display: grid; grid-auto-columns: 1fr 1fr; font-size: 1.25rem; font-weight: normal; } dl.score-chart dt { grid-column: 1; text-align: left; } dl.score-chart dd { grid-column: 2; margin: 0; text-align: right; } dl.score-chart .-sum { margin-bottom: 0.5em; border-top: 1px solid white; color: hsl(40, 75%, 80%); } .meta { grid-area: meta; color: yellow; background: black; text-align: center; } .chips { grid-area: chips; } .time { grid-area: time; } .bonus { grid-area: bonus; } .chips, .time, .bonus { display: flex; align-items: center; } .chips h3, .time h3, .bonus h3 { flex: 1; font-size: 1.25rem; line-height: 1; } .chips output, .time output, .bonus output { flex: 0; font-size: 2em; padding: 0.125em; min-width: 2em; min-height: 1em; line-height: 1; text-align: right; font-family: monospace; color: hsl(45, 100%, 60%); background: #080808; border: 1px inset #202020; } .message { grid-area: message; align-self: stretch; padding: 0.5em; font-family: serif; font-style: italic; color: hsl(45, 100%, 60%); background: #080808; border: 1px inset #202020; } .message:empty { display: none; } .inventory { grid-area: inventory; display: flex; flex-wrap: wrap; align-items: start; background-size: calc(var(--tile-width) * var(--scale)) calc(var(--tile-height) * var(--scale)); width: calc(4 * var(--tile-width) * var(--scale)); min-height: calc(2 * var(--tile-height) * var(--scale)); } .inventory img { width: calc(var(--tile-width) * var(--scale)); } .controls { grid-area: controls; display: flex; } .play-controls, .demo-controls { display: flex; gap: 0.25em; } .play-controls { align-self: start; } .demo-controls { display: none; flex: 1; justify-content: end; } main.--has-demo .demo-controls { display: flex; } /* Debug stuff */ .input { display: grid; display: none; grid: "drop up cycle" 1.5em "left swap right" 1.5em ". down . " 1.5em / 1.5em 1.5em 1.5em ; gap: 0.5em; } .input-action { padding: 0.25em; line-height: 1; color: #fff4; background: #202020; } .input-action[data-action=up] { grid-area: up; } .input-action[data-action=down] { grid-area: down; } .input-action[data-action=left] { grid-area: left; } .input-action[data-action=right] { grid-area: right; } .input-action[data-action=swap] { grid-area: swap; } .input-action[data-action=cycle] { grid-area: cycle; } .input-action[data-action=drop] { grid-area: drop; } .input-action.--pressed { color: white; background: hsl(225, 75%, 25%); }