@font-face {
  font-family: 'DM Sans';
  font-style: normal;
  font-weight: 100 1000;
  font-display: swap;
  src: url('./fonts/dm-sans-latin.woff2') format('woff2');
}
@font-face {
  font-family: 'IBM Plex Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('./fonts/ibm-plex-mono-latin.woff2') format('woff2');
}:root{color-scheme:dark;--bg:#141613;--panel:#1b1e1a;--text:#edede2;--muted:#989d90;--faint:#6d7469;--line:#34392f;--orange:#ed9153;--mono:'IBM Plex Mono',monospace;--sans:'DM Sans',sans-serif;--swatch:#fff}[hidden]{display:none!important}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font:14px var(--sans);-webkit-font-smoothing:antialiased}button,a,input{-webkit-tap-highlight-color:transparent}button{font:inherit;color:inherit;cursor:pointer}button{background:none;border:0}a{color:inherit;text-decoration:none}svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}.icon-library{display:none}button:focus-visible,a:focus-visible,input:focus-visible,canvas:focus-visible{outline:2px solid var(--orange);outline-offset:5px}button{transition:background .18s,color .18s,border-color .18s,transform .18s}button:active{transform:translateY(1px)}.workspace{display:grid;grid-template-columns:minmax(0,1fr) 330px;max-width:1920px;margin:auto;min-height:100dvh}.stage{position:relative;min-height:830px;overflow:hidden;background:radial-gradient(ellipse at 53% 42%,#29302755,transparent 66%),#141613}.canvas-wrap{position:absolute;inset:0 0 150px;z-index:1}#scene{display:block;width:100%;height:100%;touch-action:none;cursor:grab;outline-offset:-5px}#scene:active{cursor:grabbing}.view-mode{position:absolute;right:28px;top:34px;display:flex;gap:3px;padding:4px;border:1px solid var(--line);border-radius:7px;z-index:4;background:#171b16e8}.view-mode button{font-size:11px;padding:7px 12px;border-radius:3px;color:var(--muted)}.view-mode .selected{background:#383f32;color:var(--text)}.view-mode button:hover{color:var(--text)}.specimen-label{position:absolute;right:34px;top:57%;display:flex;gap:12px;align-items:flex-start;font:28px var(--mono);color:#d7dfcd;z-index:2;pointer-events:none}.label-line{height:1px;width:38px;background:#67715e;margin-top:17px;position:relative}.label-line:before{content:'';position:absolute;left:-3px;top:-2px;width:5px;height:5px;border:1px solid #67715e;border-radius:100%}.specimen-sub{display:block;font:8px var(--mono);letter-spacing:1px;color:var(--muted);margin-top:4px}.stage-tools{position:absolute;bottom:162px;left:38px;right:30px;display:flex;align-items:center;justify-content:flex-end;z-index:3}.tool-buttons{display:flex;gap:7px}.icon-button{width:31px;height:31px;display:flex;align-items:center;justify-content:center;color:var(--muted);border-radius:5px;border:1px solid #373e31}.icon-button svg{width:16px;height:16px}.icon-button.active{border-color:#726b50;color:#e2bb83;background:#2c2d21}.icon-button:hover{background:#343a2d;color:var(--text)}.exposure-dock{position:absolute;bottom:26px;left:36px;right:30px;padding:18px 22px 15px;border:1px solid #3a4033;border-radius:9px;background:#21261eea;z-index:3;box-shadow:0 10px 40px #0002}.exposure-top{display:flex;align-items:center;gap:14px;margin-bottom:10px}.exposure-top label{font:9px var(--mono);letter-spacing:1.4px;color:#adb6a0}.exposure-top output{margin-left:auto;font:25px/1 var(--mono);letter-spacing:-1px;color:var(--text)}.exposure-top output span{font-size:12px;margin-left:3px;color:var(--muted)}.phase{display:flex;align-items:center;gap:6px;font-size:10px;color:#bdc7b1}.phase>span:first-child{width:5px;height:5px;border-radius:50%;background:var(--orange);display:inline-block}.age-labels{display:flex;justify-content:space-between;margin:7px -3px -4px}.age-labels button{font:8px var(--mono);padding:3px;color:#8b957e}.age-labels button:hover,.age-labels button.active{color:#dcdcc6}.control-panel{border-left:1px solid var(--line);background:var(--panel);padding:28px 25px 21px;position:relative;z-index:3}h3{font-size:11px;font-weight:500;margin:0}.control{margin-bottom:19px}.control.compact{margin-bottom:17px}.control-label{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:9px}.control-label label{font-size:11px;color:#bbc2b2}.control-label output{font:11px var(--mono);color:#e3e3ce}.control-label output span{font-size:9px;color:var(--faint);margin-left:3px}input[type=range]{--fill:50%;appearance:none;-webkit-appearance:none;width:100%;height:3px;display:block;background:linear-gradient(to right,#c3c7a8 var(--fill),#3c4234 var(--fill));border-radius:4px;cursor:pointer;margin:0;touch-action:pan-y}input[type=range]::-webkit-slider-thumb{appearance:none;-webkit-appearance:none;width:10px;height:10px;border-radius:50%;background:#e2e3c6;border:2px solid #e2e3c6;box-shadow:0 0 0 4px #1b1e1a;transition:box-shadow .15s}input[type=range]::-moz-range-thumb{width:7px;height:7px;border-radius:50%;background:#e2e3c6;border:2px solid #e2e3c6;box-shadow:0 0 0 4px #1b1e1a}input[type=range]:hover::-webkit-slider-thumb{box-shadow:0 0 0 5px #373d30}input.age-range{height:4px;background:linear-gradient(to right,#ee975a var(--fill),#444a38 var(--fill));margin:12px 0 9px}input.age-range::-webkit-slider-thumb{width:12px;height:12px;border-color:var(--orange);background:var(--orange);box-shadow:0 0 0 4px #322e21}input.age-range::-moz-range-thumb{width:9px;height:9px;border-color:var(--orange);background:var(--orange)}.palette-heading{display:flex;align-items:center;justify-content:space-between;margin-top:24px;margin-bottom:10px}.palette-heading>span{font:8px var(--mono);color:var(--faint)}.palette-options{display:flex;gap:9px}.palette{height:32px;border:1px solid #444b3b;display:flex;flex:1;gap:3px;padding:6px;border-radius:5px;position:relative}.palette>span:not(.palette-check){background:var(--swatch);flex:1;border-radius:1px;opacity:.85}.palette:hover{border-color:#b2b79e}.palette.selected{border-color:#bfc2a9;box-shadow:0 0 0 1px #bfc2a933}.palette-check{display:none;position:absolute;right:3px;bottom:3px;background:#282d24;line-height:11px;width:12px;height:12px;border-radius:50%;font-size:8px;color:#edf0d7}.palette.selected .palette-check{display:block}.new-specimen{display:flex;align-items:center;gap:8px;width:100%;border-bottom:1px solid var(--line);padding:9px 0 17px;font-size:10px;color:#c4cbb9}.new-specimen svg{width:12px;height:12px}.new-specimen>span{margin-left:auto;font:8px var(--mono);letter-spacing:.5px;color:var(--faint)}.new-specimen:hover{color:var(--orange)}.loading{position:absolute;z-index:5;inset:0 0 150px;display:flex;align-items:center;justify-content:center;flex-direction:column;gap:20px;background:#141613;color:#9ca58e;font:11px var(--mono);transition:opacity .6s;pointer-events:none}.loading.complete{opacity:0}.loader-ring{width:38px;height:38px;border:1px solid #515c41;border-top-color:#e89b63;border-radius:50%;animation:spin 1.4s linear infinite}.webgl-error{position:absolute;inset:30%;z-index:7;min-width:200px;background:#20271c;padding:20px;border:1px solid #737654;align-self:center}.webgl-error h2{font-size:20px}.webgl-error p{color:#a9b39b}.webgl-error button{padding:8px;border:1px solid #6a725d}.toast{position:fixed;left:50%;bottom:25px;transform:translate(-50%,15px);background:#e4e3cd;color:#303625;padding:13px 20px;font-size:12px;border-radius:6px;z-index:100;opacity:0;pointer-events:none;transition:opacity .25s,transform .25s;box-shadow:0 5px 30px #0004}.toast.show{opacity:1;transform:translate(-50%,0)}
@keyframes spin{to{transform:rotate(360deg)}}
@media(min-width:1450px){.workspace{grid-template-columns:minmax(0,1fr) 360px}.control-panel{padding:33px 30px}.stage{min-height:850px}.exposure-dock{left:44px;right:40px}.canvas-wrap{inset:0 0 140px}.control{margin-bottom:22px}}
@media(min-width:901px) and (max-height:850px){.workspace{min-height:100dvh}.stage{min-height:740px}.control-panel{padding-top:23px;padding-bottom:18px}.control{margin-bottom:15px}.control.compact{margin-bottom:15px}.palette-heading{margin-top:18px}}
@media(max-width:1100px){.workspace{grid-template-columns:minmax(0,1fr) 300px}.control-panel{padding-left:22px;padding-right:22px}.specimen-label{right:24px;font-size:23px}.label-line{width:20px}.specimen-sub{font-size:7px}.stage-tools{left:26px;right:23px}.exposure-dock{left:24px;right:22px}.view-mode{right:22px}}
@media(max-width:900px){.workspace{display:block}.stage{min-height:750px;height:100dvh;max-height:900px;border-bottom:1px solid var(--line)}.canvas-wrap{inset:0 0 144px}.control-panel{border-left:0;display:grid;grid-template-columns:1fr 1fr;column-gap:32px;padding:28px;max-width:800px;margin:auto}.control{margin-bottom:24px}.control.compact{margin-bottom:24px}.palette-heading{grid-column:1 / -1;margin-top:4px}.palette-options{grid-column:1 / -1;max-width:360px}.new-specimen{grid-column:1 / -1}.new-specimen{margin-top:8px}.view-mode{top:27px;right:25px}.stage-tools{bottom:157px}.exposure-dock{bottom:25px}.specimen-label{top:58%;right:28px}.exposure-top output{font-size:24px}}
@media(max-width:480px){.stage{min-height:660px;max-height:770px}.view-mode{top:29px;right:19px;padding:3px}.view-mode button{font-size:9px;padding:6px 8px}.specimen-label{top:61%;right:25px;font-size:22px}.specimen-sub{font-size:6px}.exposure-dock{left:18px;right:18px;padding:16px 16px 14px;bottom:24px}.exposure-top{gap:9px}.phase{font-size:8px}.exposure-top label{font-size:8px}.age-labels button{font-size:6px}.stage-tools{left:23px;right:21px;bottom:155px}.icon-button{height:29px;width:29px}.control-panel{padding:27px 23px;column-gap:24px}.control-label label{font-size:10px}.control-label output{font-size:10px}.palette-options{max-width:none}.toast{font-size:11px;max-width:90vw;text-align:center;width:max-content}}
@media(prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}.repaint-button{margin-bottom:25px;display:flex;align-items:center;justify-content:center;gap:7px;border:1px solid #444b3a;border-radius:4px;width:100%;padding:9px;font-size:10px;color:#c7cfb8}.repaint-button svg{width:12px;height:12px}.repaint-button:hover{color:#efd38c;border-color:#b29d69;background:#2c3025}.individual-colors{display:grid;grid-template-columns:1fr 1fr;gap:9px 12px;margin:16px 0 22px}.color-control{display:flex;align-items:center;gap:9px;min-height:40px;cursor:pointer}.color-control>span{font-size:10px;color:#c5ccb8}.color-control small{display:block;font:7px var(--mono);color:#89957e;margin-top:4px;letter-spacing:.3px}.color-control input[type=color]{appearance:none;-webkit-appearance:none;width:29px;height:31px;border:1px solid #525e44;border-radius:5px;background:transparent;padding:3px;cursor:pointer;flex:none}.color-control input[type=color]::-webkit-color-swatch-wrapper{padding:0}.color-control input[type=color]::-webkit-color-swatch{border:none;border-radius:2px}.color-control input[type=color]::-moz-color-swatch{border:none;border-radius:2px}.color-control:hover input{border-color:#c4bd93}.control-panel{scrollbar-width:thin;scrollbar-color:#505a43 #1b1e1a}.new-specimen{margin-top:4px}
@media(min-width:901px){.workspace{height:100dvh;min-height:760px;align-items:stretch}.stage{height:100%;min-height:0}.control-panel{height:100%;overflow-y:auto;overscroll-behavior:contain;padding-bottom:25px}.control{margin-bottom:17px}.control.compact{margin-bottom:17px}}
@media(min-width:901px) and (max-height:850px){.workspace{height:100dvh;min-height:690px}}
@media(max-width:900px){.repaint-button,.individual-colors{grid-column:1 / -1}.individual-colors{grid-template-columns:repeat(3,1fr)}.control-panel{height:auto;overflow:visible}.color-control>span{font-size:11px}.color-control small{font-size:8px}}
@media(max-width:480px){.individual-colors{grid-template-columns:1fr 1fr}.color-control input[type=color]{width:32px;height:34px}}.color-control:has(input:disabled){opacity:.45;cursor:default}.color-control input:disabled{cursor:default}.material-picker{position:absolute;left:50%;bottom:204px;transform:translateX(-50%);display:flex;gap:10px;z-index:4;padding:8px 10px;border:1px solid #59604b55;border-radius:12px;background:#171c16b8;backdrop-filter:blur(8px);max-width:calc(100% - 36px)}.material-swatch{display:flex;flex-direction:column;align-items:center;gap:7px;padding:7px 5px;min-width:53px;border:1px solid transparent;border-radius:8px;font:8px var(--mono);color:var(--muted)}.material-swatch:hover{background:#ffffff0a;color:var(--text)}.material-swatch.selected{border-color:#c4b68a;background:#c4b68a12;color:var(--text)}.metal-sample{display:block;width:34px;height:34px;border-radius:50%;box-shadow:inset 0 0 0 1px #ffffff30,0 2px 6px #0006;background:radial-gradient(circle at 32% 25%,var(--shine),var(--base) 48%,var(--shade) 90%)}.metal-sample.iron{--shine:#a3a7a0;--base:#515850;--shade:#252b25}.metal-sample.copper{--shine:#f2c19b;--base:#b86d42;--shade:#4b2d20}.metal-sample.bronze{--shine:#d9ca87;--base:#9a8046;--shade:#3b3420}.metal-sample.aluminum{--shine:#fff;--base:#bdc7cc;--shade:#57666e}
@media(max-width:480px){.material-picker{bottom:201px;gap:5px;padding:6px}.material-swatch{min-width:49px;padding:5px 3px;font-size:7px}.metal-sample{width:29px;height:29px}}.paint-bucket{justify-content:center;margin-left:3px;position:relative}.paint-bucket svg{width:34px;height:34px;padding:3px;color:#9ca68e;stroke-width:1.4}.paint-bucket.selected svg{color:#e9b777}.paint-bucket:before{content:'';position:absolute;left:-8px;top:12px;bottom:12px;width:1px;background:#59604b55}
@media(max-width:480px){.paint-bucket{margin-left:1px}.paint-bucket svg{width:29px;height:29px}.paint-bucket:before{left:-4px}}


.exposure-playback{margin-left:auto;display:flex;align-items:center;gap:10px;flex-shrink:0}
.exposure-playback button,.exposure-playback select{height:32px;border:1px solid var(--line);border-radius:5px;background:#171b16;color:var(--text)}
.exposure-playback button{width:32px;display:flex;align-items:center;justify-content:center}
.exposure-playback button:hover{background:#383f32}
.exposure-playback select{font:11px var(--mono);padding:0 5px;cursor:pointer}
.exposure-playback select:focus-visible{outline:2px solid var(--orange);outline-offset:3px}
.exposure-playback output{min-width:48px;text-align:right}
@media(max-width:480px){.exposure-top{flex-wrap:wrap;row-gap:6px}.exposure-top .phase{order:3;flex-basis:100%}.exposure-playback{gap:6px}}

.material-picker{flex-direction:column;gap:7px}
.picker-row{display:flex;gap:10px}
.shape-row{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));border-top:1px solid #59604b55;padding-top:7px}
.shape-swatch{min-width:0;flex:1;justify-content:center}
.shape-swatch svg{width:24px;height:24px}
@media(max-width:480px){.picker-row{gap:5px}.material-picker{gap:5px}.shape-row{padding-top:5px}.shape-swatch svg{width:21px;height:21px}}

.paint-options{position:absolute;right:0;bottom:calc(100% + 8px);width:210px;padding:14px;border:1px solid var(--line);border-radius:10px;background:#20261f;box-shadow:0 6px 24px #0005;font:11px var(--sans)}
.paint-enabled,.paint-colour{display:flex;align-items:center;gap:8px;cursor:pointer}
.paint-enabled input{accent-color:var(--orange)}
.paint-colour{justify-content:space-between;margin-top:12px}
.paint-colour input{width:54px;height:34px;padding:2px;border:1px solid var(--line);border-radius:5px;background:none;cursor:pointer}

/* Keep specimen controls together below the scene. */
.specimen-dock{position:absolute;left:24px;right:24px;bottom:20px;z-index:4;display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:12px;align-items:end}
.specimen-dock .exposure-dock,.specimen-dock .material-picker{position:relative;inset:auto;transform:none;margin:0;max-width:none;min-width:0}
.specimen-dock .exposure-dock{padding:6px 12px;border-radius:8px}
.specimen-dock .exposure-top{gap:8px;margin-bottom:5px;flex-wrap:nowrap}
.specimen-dock .exposure-top label{font-size:8px;letter-spacing:1px}
.specimen-dock .phase{font-size:8px;white-space:nowrap;order:0;flex-basis:auto}
.specimen-dock .exposure-playback{gap:5px}
.specimen-dock .exposure-playback button,.specimen-dock .exposure-playback select{height:24px}
.specimen-dock .exposure-playback button{width:26px}
.specimen-dock .exposure-playback select{font-size:10px}
.specimen-dock .exposure-playback output{font-size:20px;min-width:39px}
.specimen-dock .age-labels{margin:3px -3px -2px}
.specimen-dock .age-labels button{font-size:7px;padding:2px 3px}
.specimen-dock .material-picker{padding:5px 6px;gap:4px;border-radius:8px;background:#20261fea}
.specimen-dock .picker-row{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:4px}
.specimen-dock .shape-row{grid-template-columns:repeat(6,minmax(0,1fr));padding-top:4px}
.specimen-dock .material-swatch{min-width:0;padding:2px;gap:2px;font-size:7px;border-radius:5px}
.specimen-dock .metal-sample,.specimen-dock .paint-bucket svg{width:20px;height:20px}
.specimen-dock .shape-swatch svg{width:17px;height:17px}
.specimen-dock .paint-bucket{margin-left:0}
.specimen-dock .paint-bucket:before{left:-3px;top:4px;bottom:4px}
.canvas-wrap{inset:0 0 120px}
.stage-tools{bottom:116px}
@media(min-width:901px) and (max-width:1150px){.specimen-dock .phase{display:none}}
@media(max-width:640px){
  .specimen-dock{left:18px;right:18px;bottom:16px;grid-template-columns:minmax(0,1fr);gap:8px}
  .specimen-dock .material-picker{grid-row:1}
  .specimen-dock .exposure-dock{grid-row:2}
  .specimen-dock .exposure-top{gap:6px}
  .specimen-dock .exposure-top label{font-size:7px;letter-spacing:.6px}
  .specimen-dock .phase{font-size:7px;gap:4px}
  .specimen-dock .age-labels button{font-size:6px}
  .canvas-wrap{inset:0 0 210px}
  .stage-tools{bottom:180px}
}
@media(max-width:360px){.specimen-dock .phase{display:none}}
@media(min-width:641px) and (max-width:760px){.specimen-dock .phase{display:none}}
.specimen-dock input.age-range{margin:4px 0 3px}

/* Full-screen scene; settings remain available without reserving a sidebar. */
html,body{width:100%;height:100%;overflow:hidden}
.workspace{display:block;width:100%;max-width:none;height:100dvh;min-height:0}
.workspace .stage{width:100%;height:100dvh;min-height:0;max-height:none;border:0}
.workspace .canvas-wrap{inset:0}
.loading{inset:0}
.settings-toggle{position:absolute;top:34px;left:24px;z-index:5;padding:10px 14px;border:1px solid var(--line);border-radius:7px;background:#171b16e8;font-size:11px}
.workspace .control-panel{position:fixed;left:24px;top:84px;bottom:24px;z-index:8;width:330px;max-width:calc(100vw - 48px);height:auto;display:block;overflow-y:auto;overscroll-behavior:contain;padding:18px 22px;border:1px solid var(--line);border-radius:12px;background:#1b1e1af5;box-shadow:0 12px 48px #0006}
.settings-close{display:block;margin:0 0 16px auto;padding:6px 8px;font-size:11px;color:var(--muted)}
.workspace .individual-colors{grid-template-columns:1fr 1fr}
.specimen-dock{grid-template-columns:minmax(0,1fr) minmax(280px,35%)}
@media(max-width:640px){
  .specimen-dock{grid-template-columns:minmax(0,1fr)}
  .settings-toggle{top:29px;left:19px;padding:9px 12px;font-size:10px}
  .workspace .control-panel{top:74px;left:18px;bottom:18px;max-width:calc(100vw - 36px)}
}

/* Project attribution stays clear of the scene controls. */
.project-credits{position:absolute;top:44px;left:50%;transform:translateX(-50%);z-index:5;display:flex;align-items:center;gap:18px;white-space:nowrap;font:10px var(--mono);color:var(--muted)}
.project-credits a:hover{color:var(--text);text-decoration:underline;text-underline-offset:4px}
@media(max-width:640px){.project-credits{top:79px;gap:16px;font-size:9px}}
