/* * Shared presentation shell for the reference exhibits. * * This is deliberately generic chrome only: page frame, panel layout, * control primitives, and the announcement strip. Every domain-specific * colour, texture, and scene style lives in the exhibit's own style.css. * Nothing here knows what an exhibit is about. */ * { box-sizing: border-box; } html, body { margin: 0; padding: 0; height: 100%; } body { font-family: "Segoe UI", Tahoma, Verdana, sans-serif; font-size: 14px; line-height: 1.45; background: #10131a; color: #e8ecf2; overflow: hidden; } .exhibit { display: grid; grid-template-columns: minmax(0, 1fr) 320px; grid-template-rows: auto minmax(0, 1fr) auto; grid-template-areas: "header header" "stage panel" "footer footer"; height: 100vh; gap: 10px; padding: 10px; } .exhibit-header { grid-area: header; display: flex; align-items: baseline; gap: 12px; padding: 8px 14px; border-radius: 6px; background: rgba(255, 255, 255, 0.04); border: 1px solid rgba(255, 255, 255, 0.08); } .exhibit-header h1 { margin: 0; font-size: 17px; font-weight: 600; letter-spacing: 0.04em; } .exhibit-header .subtitle { font-size: 12px; opacity: 0.6; } .exhibit-header .status { margin-left: auto; font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; opacity: 0.55; } .stage { grid-area: stage; position: relative; min-height: 0; border-radius: 6px; overflow: hidden; border: 1px solid rgba(255, 255, 255, 0.08); } .stage canvas { display: block; width: 100%; height: 100%; } .panel { grid-area: panel; min-height: 0; overflow-y: auto; padding: 12px; border-radius: 6px; background: rgba(255, 255, 255, 0.04); border: 1px solid rgba(255, 255, 255, 0.08); } .panel h2 { margin: 0 0 8px; font-size: 11px; font-weight: 600; letter-spacing: 0.12em; text-transform: uppercase; opacity: 0.55; } .panel section + section { margin-top: 16px; padding-top: 14px; border-top: 1px solid rgba(255, 255, 255, 0.07); } .control { margin-bottom: 12px; } .control:last-child { margin-bottom: 0; } .control label { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; font-size: 12px; margin-bottom: 5px; opacity: 0.85; } .control .readout { font-variant-numeric: tabular-nums; font-size: 11px; opacity: 0.7; } input[type="range"] { width: 100%; accent-color: currentColor; } select { width: 100%; padding: 5px 6px; font: inherit; font-size: 12px; color: inherit; background: rgba(0, 0, 0, 0.35); border: 1px solid rgba(255, 255, 255, 0.18); border-radius: 4px; } button { font: inherit; font-size: 12px; padding: 6px 10px; color: inherit; background: rgba(255, 255, 255, 0.07); border: 1px solid rgba(255, 255, 255, 0.18); border-radius: 4px; cursor: pointer; } button:hover { background: rgba(255, 255, 255, 0.14); } button:active { transform: translateY(1px); } button[aria-pressed="true"] { background: rgba(255, 255, 255, 0.22); border-color: rgba(255, 255, 255, 0.4); } .button-row { display: flex; flex-wrap: wrap; gap: 6px; } .button-row button { flex: 1 1 auto; } .toggle-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 8px; font-size: 12px; } .toggle-row:last-child { margin-bottom: 0; } .exhibit-footer { grid-area: footer; display: flex; align-items: center; gap: 10px; padding: 8px 14px; border-radius: 6px; background: rgba(255, 255, 255, 0.04); border: 1px solid rgba(255, 255, 255, 0.08); font-size: 12px; min-height: 38px; } .exhibit-footer .announcement-label { font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; opacity: 0.45; flex: 0 0 auto; } /* Announcement text is written with textContent only — never innerHTML. */ .exhibit-footer .announcement-text { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; opacity: 0.9; } .exhibit-footer .announcement-text.is-idle { opacity: 0.4; font-style: italic; } @media (max-width: 900px) { .exhibit { grid-template-columns: minmax(0, 1fr); grid-template-rows: auto minmax(0, 1fr) auto auto; grid-template-areas: "header" "stage" "panel" "footer"; height: auto; min-height: 100vh; } .stage { min-height: 320px; } body { overflow: auto; } }