:root { --resin: #0c0908; --resin-2: #120c0a; --soot: #1a100d; --ember: #e8432a; --blood: #a8271a; --bone: #efe4d4; --ash: #9b8579; --ash-2: #6d5b52; --line: rgba(232, 64, 42, 0.18); --line-soft: rgba(155, 133, 121, 0.14); --font-display: 'Cormorant Garamond', 'Iowan Old Style', 'Palatino Linotype', serif; --font-mono: 'JetBrains Mono', 'SF Mono', 'Cascadia Mono', monospace; --rail-h: 48px; --transport-h: 66px; --panel-l: 318px; --panel-r: 274px; --m: 0; --bass: 0; --crack: 0; --voice: 0; --noise: 0; --silt: 0; color-scheme: dark; } *, *::before, *::after { box-sizing: border-box; } html, body, #app { height: 100%; } body { margin: 0; overflow: hidden; background: var(--resin); color: var(--bone); font-family: var(--font-mono); font-size: 12px; line-height: 1.5; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; } button { appearance: none; border: 0; padding: 0; margin: 0; background: transparent; color: inherit; font: inherit; cursor: pointer; } button:focus-visible, a:focus-visible, [tabindex]:focus-visible { outline: 1px solid var(--ember); outline-offset: 3px; } ::selection { background: var(--ember); color: var(--resin); } .app { display: grid; grid-template-rows: var(--rail-h) minmax(0, 1fr) var(--transport-h); height: 100vh; height: 100dvh; min-height: 560px; background: var(--resin); } /* — rail — */ .rail { position: relative; z-index: 6; display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 0 18px; border-bottom: 1px solid rgba(155, 133, 121, 0.12); background: rgba(8, 5, 4, 0.9); animation: rise 0.7s cubic-bezier(0.2, 0.7, 0.2, 1) both; } .rail::after { content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 1px; background: var(--ember); opacity: calc(0.04 + var(--m) * 0.22); pointer-events: none; } .brand { display: flex; align-items: baseline; gap: 9px; min-width: 150px; } .mark { font-family: var(--font-display); font-size: 21px; font-weight: 400; letter-spacing: 0.24em; line-height: 1; color: var(--bone); padding-right: 1px; } .version { font-size: 9px; letter-spacing: 0.08em; color: var(--ash-2); font-variant-numeric: tabular-nums; } .project { overflow: hidden; max-width: 190px; padding-left: 9px; border-left: 1px solid var(--line-soft); font-size: 8.5px; letter-spacing: 0.08em; color: var(--ash-2); white-space: nowrap; text-overflow: ellipsis; } .rail-right { display: flex; align-items: center; gap: 14px; min-width: 0; } .history { display: flex; gap: 2px; } .history-button { padding: 3px 5px; border: 1px solid rgba(155, 133, 121, 0.16); font-size: 8px; letter-spacing: 0.04em; color: var(--ash); transition: color 0.2s ease, border-color 0.2s ease; } .history-button:hover:not(:disabled) { border-color: rgba(232, 64, 42, 0.4); color: var(--ember); } .history-button:disabled { opacity: 0.28; cursor: default; } .rail-center { display: flex; align-items: center; gap: 12px; min-width: 0; } .room { position: relative; padding-bottom: 3px; font-family: var(--font-display); font-size: 16px; font-weight: 400; color: var(--ash); letter-spacing: 0.01em; } .room.is-on { color: var(--bone); } .room.is-on::after { content: ''; position: absolute; left: 0; right: 1px; bottom: 0; height: 1px; background: var(--ember); opacity: 0.65; } .mode-dot { display: inline-block; width: 3px; height: 3px; margin-right: 5px; vertical-align: 2px; border-radius: 50%; background: var(--ember); opacity: calc(0.4 + var(--bass) * 0.6); } .rail-rule { width: 1px; height: 10px; background: var(--line-soft); } .rail-note { font-size: 9px; letter-spacing: 0.12em; color: var(--ash-2); font-variant-numeric: tabular-nums; white-space: nowrap; } .net { display: flex; align-items: center; gap: 7px; min-width: 128px; justify-content: flex-end; font-size: 9px; letter-spacing: 0.08em; color: var(--ash-2); } .net b { font-weight: 400; color: var(--ash); } .net.is-live b { color: var(--ember); } .net .dot { width: 4px; height: 4px; border-radius: 50%; background: var(--ash-2); transition: background 0.2s ease; } .net.is-live .dot { background: var(--ember); box-shadow: 0 0 calc(3px + var(--m) * 14px) rgba(232, 64, 42, 0.55); opacity: calc(0.55 + var(--m) * 0.45); } /* — hero — */ .hero { position: relative; min-height: 0; overflow: hidden; background: var(--resin); } .descent { position: absolute; inset: 0; z-index: 0; } .descent canvas { display: block; width: 100%; height: 100%; cursor: crosshair; } .scene { position: absolute; top: 24.5%; left: 50%; z-index: 1; width: min(78%, 760px); transform: translateX(-50%); text-align: center; pointer-events: none; } .scene h1 { margin: 0; font-family: var(--font-display); font-size: clamp(38px, 4vw, 54px); font-weight: 300; font-style: italic; line-height: 1; letter-spacing: 0.005em; color: var(--bone); text-shadow: 0 0 calc(12px + var(--voice) * 46px) rgba(232, 64, 42, 0.16); } .scene p { margin: 16px 0 0; font-size: 9px; line-height: 1.6; letter-spacing: 0.16em; color: var(--ash); opacity: calc(0.55 + var(--voice) * 0.35 + var(--m) * 0.1); font-variant-numeric: tabular-nums; } .scene p::before { content: ''; display: block; width: 56px; height: 1px; margin: 0 auto 13px; background: linear-gradient(90deg, transparent, var(--ember), transparent); opacity: 0.45; } .lanes { position: absolute; left: 50%; bottom: calc(10% - 34px); z-index: 3; display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); width: min(56%, 940px); transform: translateX(-50%); animation: fade 0.9s 0.1s ease both; } .lane { position: relative; overflow: hidden; padding: 9px 10px 7px; border-top: 1px solid rgba(155, 133, 121, 0.2); text-align: left; color: rgba(239, 228, 212, calc(0.44 + var(--level) * 0.5)); transition: color 0.2s ease, border-color 0.2s ease; } .lane:hover, .lane.is-on { color: var(--bone); } .lane.is-on { border-top-color: var(--ember); } .lane-fill { position: absolute; left: 0; bottom: 0; width: 100%; height: calc(var(--level) * 100%); background: linear-gradient(to top, rgba(232, 64, 42, 0.2), rgba(232, 64, 42, 0.02)); border-bottom: 1px solid rgba(232, 64, 42, calc(0.2 + var(--level) * 0.5)); transition: height 90ms linear; pointer-events: none; } .lane-name { position: relative; z-index: 1; display: block; font-size: 10px; letter-spacing: 0.08em; line-height: 1.4; } /* — pools — */ .pool { position: absolute; top: 0; bottom: 0; z-index: 4; display: flex; flex-direction: column; width: var(--panel-l); padding: 20px 20px 0 22px; background: linear-gradient(180deg, rgba(8, 5, 4, 0.95), rgba(8, 5, 4, 0.88)); overflow: hidden; animation: rise 0.75s 0.05s cubic-bezier(0.2, 0.7, 0.2, 1) both; } .pool--wire { left: 0; border-right: 1px solid rgba(155, 133, 121, 0.13); } .pool--engine { right: 0; width: var(--panel-r); padding-right: 22px; padding-bottom: 16px; border-left: 1px solid rgba(155, 133, 121, 0.13); overflow-y: auto; } .pool::after { content: ''; position: absolute; top: 0; bottom: 0; width: 1px; background: var(--ember); opacity: calc(0.04 + var(--m) * 0.2); pointer-events: none; } .pool--wire::after { right: 0; } .pool--engine::after { left: 0; } .pool-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; padding-bottom: 13px; border-bottom: 1px solid rgba(155, 133, 121, 0.12); } .pool-head h2 { margin: 0; font-family: var(--font-display); font-size: 25px; font-weight: 300; line-height: 1; letter-spacing: 0.01em; color: var(--bone); } .pool-sub { margin: 5px 0 0; font-size: 8px; line-height: 1.5; letter-spacing: 0.14em; color: var(--ash-2); } .pool-state { display: flex; align-items: center; gap: 6px; padding-top: 3px; font-size: 9px; letter-spacing: 0.07em; color: var(--ash-2); white-space: nowrap; } .pool-state .dot { width: 4px; height: 4px; border-radius: 50%; background: var(--ash-2); } .pool-state.is-live { color: var(--ash); } .pool-state.is-live .dot { background: var(--ember); box-shadow: 0 0 calc(3px + var(--m) * 10px) rgba(232, 64, 42, 0.45); } /* — wire — */ .wire-list { flex: 1; min-height: 0; margin: 10px 0 0; padding: 0 0 18px; list-style: none; overflow-y: auto; scrollbar-width: thin; scrollbar-color: rgba(155, 133, 121, 0.3) transparent; } .wire-list::-webkit-scrollbar { width: 4px; } .wire-list::-webkit-scrollbar-thumb { background: rgba(155, 133, 121, 0.28); } .wire-empty { padding: 16px 0; font-size: 10px; color: var(--ash-2); } .wire-entry { display: grid; grid-template-columns: 48px 13px minmax(0, 1fr); gap: 6px; align-items: baseline; padding: 7px 0; border-bottom: 1px solid rgba(155, 133, 121, 0.07); animation: entry 0.35s ease both; } .wire-time { font-size: 8.5px; letter-spacing: 0.02em; color: var(--ash-2); font-variant-numeric: tabular-nums; } .wire-dir { font-size: 10px; line-height: 1.3; text-align: center; color: var(--ash-2); } .wire-copy { display: flex; flex-direction: column; gap: 1px; min-width: 0; } .wire-label { font-size: 10px; line-height: 1.55; color: var(--bone); overflow-wrap: anywhere; } .wire-detail { font-size: 9px; line-height: 1.55; color: var(--ash); overflow-wrap: anywhere; } .wire-entry--send .wire-dir { color: var(--ember); } .wire-entry--recv .wire-dir { color: var(--bone); } .wire-entry--error .wire-label, .wire-entry--error .wire-dir { color: var(--ember); } .wire-foot { display: flex; flex-wrap: wrap; gap: 13px; padding: 11px 0 10px; border-top: 1px solid rgba(155, 133, 121, 0.1); font-size: 8.5px; letter-spacing: 0.04em; color: var(--ash-2); } .wire-foot b { font-weight: 400; color: var(--ash); } .wire-offline { margin-top: auto; padding: 14px 0 18px; border-top: 1px solid rgba(155, 133, 121, 0.12); } .wire-offline p { margin: 0; font-size: 10px; line-height: 1.6; color: var(--ash); } .wire-offline code { display: block; margin-top: 9px; padding: 8px 0 8px 9px; border-left: 1px solid var(--ember); font-family: var(--font-mono); font-size: 8.5px; line-height: 1.7; color: var(--bone); overflow-wrap: anywhere; } .wire-offline button, .reconnect { margin-top: 12px; padding-bottom: 2px; border-bottom: 1px solid var(--ember); font-size: 9px; letter-spacing: 0.06em; color: var(--ember); } /* — engine — */ .facts { display: flex; flex-direction: column; margin-top: 12px; } .fact { display: grid; grid-template-columns: 64px minmax(0, 1fr); gap: 8px; padding: 4.5px 0; border-bottom: 1px solid rgba(155, 133, 121, 0.07); font-size: 9.5px; line-height: 1.55; } .fact span { color: var(--ash-2); letter-spacing: 0.04em; } .fact b { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: right; font-weight: 400; color: var(--bone); } .cilia-head { display: flex; align-items: baseline; justify-content: space-between; margin-top: 19px; padding-bottom: 8px; font-size: 9px; letter-spacing: 0.12em; color: var(--ash-2); } .cilia-master { color: var(--ash); font-variant-numeric: tabular-nums; letter-spacing: 0.02em; } .cilia { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 7px; align-items: end; height: 118px; } .cilium { display: flex; flex-direction: column; align-items: center; justify-content: flex-end; gap: 7px; height: 100%; min-width: 0; } .cilium-track { position: relative; display: flex; align-items: flex-end; width: 1px; height: 86px; background: rgba(155, 133, 121, 0.16); } .cilium-fill { display: block; width: 1px; height: calc(var(--level) * 100%); background: linear-gradient(to top, rgba(232, 64, 42, 0.25), var(--ember)); box-shadow: 0 0 7px rgba(232, 64, 42, 0.28); transition: height 80ms linear; } .cilium-tip { position: absolute; left: 50%; bottom: calc(var(--level) * 100%); width: 3px; height: 3px; transform: translateX(-50%); border-radius: 50%; background: var(--ember); opacity: calc(0.4 + var(--level) * 0.6); box-shadow: 0 0 calc(3px + var(--level) * 12px) rgba(232, 64, 42, 0.5); transition: bottom 80ms linear; } .cilium-name { font-size: 9px; letter-spacing: 0.02em; color: var(--ash); white-space: nowrap; } .master-track { height: 1px; margin-top: 10px; background: rgba(155, 133, 121, 0.14); } .master-track span { display: block; height: 1px; background: var(--ember); box-shadow: 0 0 6px rgba(232, 64, 42, 0.4); transition: width 70ms linear; } .veins-head { display: flex; align-items: baseline; justify-content: space-between; margin-top: 16px; padding-bottom: 5px; font-size: 8px; letter-spacing: 0.12em; color: var(--ash-2); } .veins { display: flex; flex-direction: column; gap: 1px; } .vein-row { display: grid; grid-template-columns: 42px minmax(0, 1fr) 27px; gap: 8px; align-items: center; font-size: 9px; line-height: 1.5; } .vein-name { color: var(--ash); letter-spacing: 0.02em; } .vein-gain { color: var(--bone); text-align: right; font-variant-numeric: tabular-nums; } .vein-range { width: 100%; height: 16px; margin: 0; appearance: none; -webkit-appearance: none; background: transparent; cursor: pointer; } .vein-range::-webkit-slider-runnable-track { height: 1px; background: rgba(155, 133, 121, 0.24); } .vein-range::-webkit-slider-thumb { width: 7px; height: 7px; margin-top: -3px; border-radius: 50%; background: var(--ember); box-shadow: 0 0 6px rgba(232, 64, 42, 0.45); -webkit-appearance: none; } .vein-range::-moz-range-track { height: 1px; background: rgba(155, 133, 121, 0.24); } .vein-range::-moz-range-thumb { width: 7px; height: 7px; border: 0; border-radius: 50%; background: var(--ember); box-shadow: 0 0 6px rgba(232, 64, 42, 0.45); } .trace-head { display: flex; align-items: baseline; justify-content: space-between; margin-top: auto; padding-top: 17px; padding-bottom: 6px; font-size: 8px; letter-spacing: 0.12em; color: var(--ash-2); } .trace { display: block; width: 100%; height: 46px; } /* — transport — */ .transport { position: relative; z-index: 6; display: flex; align-items: center; gap: 18px; min-width: 0; padding: 0 20px; border-top: 1px solid rgba(155, 133, 121, 0.14); background: rgba(8, 5, 4, 0.94); animation: rise 0.75s 0.12s cubic-bezier(0.2, 0.7, 0.2, 1) both; } .transport-master { position: absolute; top: 0; left: 0; height: 1px; width: calc(var(--master) * 100%); background: var(--ember); box-shadow: 0 0 8px rgba(232, 64, 42, 0.5); transition: width 60ms linear; } .play { display: grid; place-items: center; flex: 0 0 auto; width: 40px; height: 40px; border: 1px solid rgba(232, 64, 42, 0.45); border-radius: 50%; background: rgba(232, 64, 42, 0.04); transition: background 0.2s ease, border-color 0.2s ease; } .play:hover, .play.is-playing { background: rgba(232, 64, 42, 0.12); border-color: var(--ember); } .icon-play { width: 0; height: 0; margin-left: 3px; border-top: 6px solid transparent; border-bottom: 6px solid transparent; border-left: 9px solid var(--bone); } .icon-stop { width: 8px; height: 8px; background: var(--bone); } .clock { display: flex; flex-direction: column; gap: 1px; min-width: 104px; } .clock-time { font-size: 19px; font-weight: 300; line-height: 1.2; letter-spacing: 0.03em; color: var(--bone); font-variant-numeric: tabular-nums; } .clock-bar { font-size: 8.5px; letter-spacing: 0.08em; color: var(--ash-2); font-variant-numeric: tabular-nums; } .tempo { display: flex; align-items: center; gap: 6px; } .tempo button { display: grid; place-items: center; width: 19px; height: 19px; border: 1px solid rgba(155, 133, 121, 0.25); color: var(--ash); font-size: 12px; line-height: 1; transition: color 0.2s ease, border-color 0.2s ease; } .tempo button:hover { color: var(--ember); border-color: var(--ember); } .tempo-value { min-width: 27px; text-align: right; font-size: 11px; color: var(--bone); font-variant-numeric: tabular-nums; } .tempo-unit { font-size: 8px; letter-spacing: 0.08em; color: var(--ash-2); } .master-read { display: flex; flex-direction: column; gap: 1px; min-width: 62px; } .master-label { font-size: 8px; letter-spacing: 0.1em; color: var(--ash-2); } .master-db { font-size: 9.5px; color: var(--ash); font-variant-numeric: tabular-nums; } .strike { display: flex; align-items: center; gap: 8px; margin-left: auto; padding: 8px 11px; border: 1px solid rgba(232, 64, 42, 0.32); background: rgba(232, 64, 42, 0.035); color: var(--bone); font-size: 9.5px; letter-spacing: 0.06em; transition: border-color 0.2s ease, background 0.2s ease; } .strike:hover { border-color: var(--ember); background: rgba(232, 64, 42, 0.1); } .strike-glyph { width: 4px; height: 4px; border-radius: 50%; background: var(--ember); box-shadow: 0 0 calc(3px + var(--m) * 12px) rgba(232, 64, 42, 0.55); opacity: calc(0.55 + var(--m) * 0.45); } .strike-vein { color: var(--ember); font-size: 8.5px; letter-spacing: 0.05em; } .wire-status { display: flex; align-items: center; gap: 6px; min-width: 122px; font-size: 8.5px; letter-spacing: 0.06em; color: var(--ash-2); white-space: nowrap; } .status-dot { width: 4px; height: 4px; border-radius: 50%; background: var(--ash-2); } .wire-status.is-live { color: var(--ash); } .wire-status.is-live .status-dot { background: var(--ember); box-shadow: 0 0 calc(3px + var(--m) * 10px) rgba(232, 64, 42, 0.45); } .wire-status.is-offline { color: var(--ember); } .wire-status.is-offline .status-dot { background: var(--ember); opacity: 0.45; } .wire-status .reconnect { margin-top: 0; margin-left: 2px; } /* — motion — */ @keyframes rise { from { opacity: 0; transform: translateY(7px); } to { opacity: 1; transform: translateY(0); } } @keyframes fade { from { opacity: 0; } to { opacity: 1; } } @keyframes entry { from { opacity: 0; transform: translateY(2px); } to { opacity: 1; transform: translateY(0); } } /* — quarry — */ button.room { border: 0; background: transparent; cursor: pointer; } .quarry { position: absolute; inset: 0; z-index: 2; padding: 22px calc(var(--panel-r) + 20px) 26px calc(var(--panel-l) + 22px); overflow-y: auto; background: radial-gradient(ellipse at 50% 4%, rgba(232, 64, 42, 0.06), transparent 55%), var(--resin); animation: fade 0.7s 0.05s ease both; scrollbar-width: thin; scrollbar-color: rgba(155, 133, 121, 0.3) transparent; } .quarry-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 12px; padding-bottom: 12px; border-bottom: 1px solid rgba(155, 133, 121, 0.12); } .quarry-head h1 { margin: 0; font-family: var(--font-display); font-size: 30px; font-style: italic; font-weight: 300; line-height: 1; color: var(--bone); } .quarry-head p { margin: 5px 0 0; font-size: 8.5px; letter-spacing: 0.14em; color: var(--ash-2); } .quarry-actions { display: flex; align-items: center; gap: 10px; } .import-state { font-size: 8.5px; letter-spacing: 0.08em; color: var(--ash-2); font-variant-numeric: tabular-nums; } .import, .empty-action { padding: 7px 11px; border: 1px solid rgba(232, 64, 42, 0.35); background: rgba(232, 64, 42, 0.04); color: var(--bone); font-size: 9.5px; letter-spacing: 0.04em; transition: border-color 0.2s ease, background 0.2s ease; } .import:hover, .empty-action:hover { border-color: var(--ember); background: rgba(232, 64, 42, 0.1); } .import:disabled, .empty-action:disabled { opacity: 0.45; cursor: wait; } .record { display: inline-flex; align-items: center; gap: 6px; padding: 7px 10px; border: 1px solid rgba(155, 133, 121, 0.28); background: transparent; color: var(--bone); font-size: 9.5px; letter-spacing: 0.03em; transition: border-color 0.2s ease, color 0.2s ease, background 0.2s ease; } .record:hover:not(:disabled) { border-color: var(--ember); } .record.is-on { border-color: var(--ember); background: rgba(232, 64, 42, 0.06); color: var(--ember); } .record:disabled { opacity: 0.4; cursor: not-allowed; } .record-dot { width: 5px; height: 5px; border-radius: 50%; background: var(--ember); } .record.is-on .record-dot { animation: pulse-dot 1.1s ease-in-out infinite; } @keyframes pulse-dot { 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(232, 64, 42, 0.5); } 50% { opacity: 0.4; box-shadow: 0 0 0 4px rgba(232, 64, 42, 0); } } .record-error { margin: 8px 0 0; font-size: 9px; line-height: 1.6; color: var(--ember); } .empty-actions { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; } .file { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; } .quarry-empty { max-width: 460px; margin: 13vh auto 0; text-align: center; } .empty-title { margin: 0; font-family: var(--font-display); font-size: 30px; font-style: italic; font-weight: 300; line-height: 1; color: var(--bone); } .empty-copy { margin: 14px 0 18px; font-size: 10px; line-height: 1.8; color: var(--ash); } .empty-formats { margin-top: 14px; font-size: 8px; letter-spacing: 0.14em; color: var(--ash-2); } .core-strip { display: flex; gap: 2px; margin-top: 10px; overflow-x: auto; border-bottom: 1px solid rgba(155, 133, 121, 0.1); scrollbar-width: none; } .core-strip::-webkit-scrollbar { display: none; } .core-tab { flex: 0 0 auto; padding: 7px 10px 6px; border-top: 1px solid rgba(155, 133, 121, 0.16); text-align: left; color: var(--ash); transition: color 0.2s ease, border-color 0.2s ease; } .core-tab:hover, .core-tab.is-on { color: var(--bone); } .core-tab.is-on { border-top-color: var(--ember); } .core-name { display: block; font-size: 10px; letter-spacing: 0.02em; line-height: 1.4; } .core-meta { display: block; font-size: 8px; letter-spacing: 0.04em; color: var(--ash-2); font-variant-numeric: tabular-nums; } .quarry-grid { display: grid; grid-template-columns: minmax(0, 1fr) 196px; gap: 18px; align-items: start; margin-top: 12px; } .quarry-left { min-width: 0; } .material-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 10px; } .material-head h2 { margin: 0; font-family: var(--font-display); font-size: 25px; font-weight: 300; line-height: 1.1; color: var(--bone); } .material-head p { margin: 4px 0 0; font-size: 8.5px; letter-spacing: 0.06em; color: var(--ash-2); font-variant-numeric: tabular-nums; } .material-rank { font-size: 8.5px; letter-spacing: 0.06em; color: var(--ash); white-space: nowrap; font-variant-numeric: tabular-nums; } .wave { display: block; width: 100%; height: 154px; margin-top: 7px; border-top: 1px solid rgba(155, 133, 121, 0.12); border-bottom: 1px solid rgba(155, 133, 121, 0.12); } .wave-axis { display: flex; justify-content: space-between; padding: 4px 0 9px; font-size: 8px; color: var(--ash-2); font-variant-numeric: tabular-nums; } .face-wall { display: grid; grid-template-columns: repeat(8, minmax(0, 1fr)); gap: 3px; } .face { position: relative; height: 34px; overflow: hidden; padding: 4px 5px; border: 1px solid rgba(155, 133, 121, 0.14); background: rgba(12, 9, 8, 0.62); text-align: left; color: var(--ash); transition: border-color 0.2s ease, color 0.2s ease; } .face:hover { border-color: rgba(232, 64, 42, 0.5); color: var(--bone); } .face.is-on { border-color: var(--ember); color: var(--bone); box-shadow: inset 0 0 0 1px rgba(232, 64, 42, 0.35); } .face-index { position: relative; z-index: 1; display: block; font-size: 8.5px; line-height: 1.3; color: var(--bone); font-variant-numeric: tabular-nums; } .face-rank { position: relative; z-index: 1; display: block; font-size: 7.5px; line-height: 1.3; color: var(--ash-2); font-variant-numeric: tabular-nums; } .face-energy { position: absolute; left: 0; bottom: 0; width: 100%; height: calc(var(--energy) * 100%); background: linear-gradient(to top, rgba(232, 64, 42, 0.28), rgba(232, 64, 42, 0.02)); pointer-events: none; } .material-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 9px; margin-top: 10px; } .face-strike, .assign { padding: 7px 10px; border: 1px solid rgba(155, 133, 121, 0.25); color: var(--bone); font-size: 9.5px; letter-spacing: 0.03em; transition: border-color 0.2s ease, background 0.2s ease; } .face-strike:hover, .assign:hover { border-color: var(--ember); background: rgba(232, 64, 42, 0.08); } .assign { border-color: rgba(232, 64, 42, 0.42); color: var(--ember); } .face-strike:disabled, .assign:disabled { opacity: 0.35; cursor: not-allowed; } .assign-note { font-size: 8px; color: var(--ash-2); } .pattern-head { display: flex; justify-content: space-between; padding: 14px 0 7px; margin-top: 9px; border-top: 1px solid rgba(155, 133, 121, 0.12); font-size: 8px; letter-spacing: 0.12em; color: var(--ash-2); } .pattern { display: grid; grid-template-columns: 94px minmax(0, 1fr); gap: 1px 8px; align-items: center; } .pattern-row { display: flex; flex-direction: column; min-width: 0; padding: 4px 0; border-top: 1px solid transparent; text-align: left; color: var(--ash); transition: color 0.2s ease, border-color 0.2s ease; } .pattern-row:hover, .pattern-row.is-on { color: var(--bone); } .pattern-row.is-on { border-top-color: var(--ember); } .pattern-name { font-size: 9.5px; line-height: 1.4; } .pattern-face { overflow: hidden; font-size: 7.5px; line-height: 1.4; color: var(--ash-2); white-space: nowrap; text-overflow: ellipsis; } .pattern-cells { display: grid; grid-template-columns: repeat(16, minmax(0, 1fr)); gap: 2px; } .step { position: relative; height: 22px; overflow: hidden; border-top: 1px solid rgba(155, 133, 121, 0.14); background: rgba(155, 133, 121, 0.03); } .step.is-downbeat { border-top-color: rgba(155, 133, 121, 0.34); } .step.is-on { background: rgba(232, 64, 42, 0.07); } .step:hover { background: rgba(232, 64, 42, 0.16); } .step-fill { position: absolute; left: 0; bottom: 0; width: 100%; height: calc(var(--velocity) * 100%); background: linear-gradient(to top, rgba(232, 64, 42, 0.55), rgba(232, 64, 42, 0.14)); pointer-events: none; } .quarry-side { min-width: 0; padding-left: 16px; border-left: 1px solid rgba(155, 133, 121, 0.12); } .side-head { display: flex; justify-content: space-between; font-size: 8px; letter-spacing: 0.12em; color: var(--ash-2); } .side-note { margin: 7px 0 11px; font-size: 9px; line-height: 1.75; color: var(--ash); } .face-stats { display: flex; flex-direction: column; } .face-stats div { display: flex; justify-content: space-between; gap: 8px; padding: 4px 0; border-bottom: 1px solid rgba(155, 133, 121, 0.07); font-size: 9px; } .face-stats span { color: var(--ash-2); } .face-stats b { overflow: hidden; color: var(--bone); font-weight: 400; text-overflow: ellipsis; white-space: nowrap; font-variant-numeric: tabular-nums; } .side-rule { height: 1px; margin: 14px 0; background: rgba(155, 133, 121, 0.1); } .side-legend { display: flex; gap: 7px; padding: 3px 0; font-size: 8px; color: var(--ash-2); } .legend-key { min-width: 64px; color: var(--ash); } .side-footer { display: flex; justify-content: space-between; gap: 6px; margin-top: 20px; padding-top: 10px; border-top: 1px solid rgba(155, 133, 121, 0.1); font-size: 8px; color: var(--ash-2); } .side-footer b { color: var(--bone); font-weight: 400; } /* — responsive — */ @media (max-width: 1240px) { :root { --panel-l: 286px; --panel-r: 248px; } .scene h1 { font-size: clamp(34px, 4.4vw, 50px); } .lanes { width: min(58%, 780px); } .transport { gap: 13px; padding: 0 16px; } .clock { min-width: 94px; } } @media (max-width: 980px) { body { overflow: auto; } .app { height: auto; min-height: 100dvh; grid-template-rows: var(--rail-h) auto auto; } .hero { display: flex; flex-direction: column; overflow: visible; } .descent { position: relative; inset: auto; height: 58vh; min-height: 420px; width: 100%; } .quarry { position: relative; inset: auto; width: 100%; padding: 20px 18px 24px; } .quarry-grid { grid-template-columns: 1fr; } .quarry-side { padding-top: 14px; padding-left: 0; border-top: 1px solid rgba(155, 133, 121, 0.12); border-left: 0; } .wave { height: 130px; } .scene { top: 27%; width: 86%; } .scene h1 { font-size: clamp(34px, 8vw, 48px); } .lanes { bottom: 12px; width: 68%; } .pool { position: relative; inset: auto; width: 100%; max-height: none; border: 0; border-top: 1px solid rgba(155, 133, 121, 0.14); padding: 20px 22px 16px; } .pool--wire { border-right: 0; } .pool--engine { width: 100%; border-left: 0; } .pool::after { display: none; } .wire-list { max-height: 280px; flex: none; } .wire-offline { margin-top: 0; } .cilia { height: 96px; } .cilium-track { height: 68px; } .transport { position: sticky; bottom: 0; flex-wrap: wrap; height: auto; min-height: 66px; padding: 10px 16px; gap: 12px 16px; } .strike { margin-left: 0; } .wire-status { margin-left: auto; } } @media (max-width: 640px) { .rail { padding: 0 13px; gap: 8px; } .brand { min-width: 0; } .project { max-width: 110px; } .mark { font-size: 18px; letter-spacing: 0.2em; } .rail-center { gap: 8px; } .room { font-size: 14px; } .rail-note { display: none; } .project { display: none; } .rail-right { gap: 8px; } .history-button { padding: 2px 4px; } .net { min-width: 0; gap: 5px; } .net-label { display: none; } .descent { height: 62vh; min-height: 380px; } .scene { top: 25%; } .scene p { font-size: 8px; letter-spacing: 0.1em; } .lanes { width: 84%; } .lane { padding: 7px 5px 5px; } .lane-name { font-size: 9px; } .transport { padding: 10px 13px; gap: 9px 12px; } .play { width: 36px; height: 36px; } .clock-time { font-size: 17px; } .tempo { gap: 4px; } .master-read { min-width: 52px; } .strike { padding: 7px 9px; } .wire-status { width: 100%; margin-left: 0; justify-content: flex-end; } .quarry { padding: 18px 14px 22px; } .quarry-head h1 { font-size: 26px; } .quarry-head { flex-wrap: wrap; } .quarry-actions { width: 100%; justify-content: flex-end; gap: 6px; } .import-state { display: none; } .record { padding: 6px 8px; font-size: 8.5px; } .face-wall { grid-template-columns: repeat(4, minmax(0, 1fr)); } .pattern { grid-template-columns: 66px minmax(0, 1fr); } .pattern-cells { gap: 1px; } .step { height: 19px; } .pattern-face { display: none; } .pool { padding: 18px 16px 14px; } .pool-head h2 { font-size: 22px; } .facts .fact { grid-template-columns: 58px minmax(0, 1fr); } } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.001ms !important; animation-iteration-count: 1 !important; transition-duration: 0.001ms !important; } }