/* ==========================================================================
   Shack Stack · Lo-fi classroom studio (final visual layer, loads after menu.css)
   Warm paper, muted colour, soft light, quiet furniture, bright student cards.
   Presentation only: no geometry, data or storage is touched here.
   1 tokens · 2 paper and chrome · 3 controls · 4 panels · 5 canvas floor
   6 desks · 7 teacher desk · 8 decorations · 9 student cards · 10 dialogs
   11 motion · 12 print
   ========================================================================== */

/* ---------- 1. Tokens ---------- */
:root {
  --font-display: ui-rounded, "SF Pro Rounded", "Hiragino Maru Gothic ProN", "Arial Rounded MT Bold", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
  /* corners */
  --r-xs: 7px; --r-sm: 9px; --r-md: 13px; --r-lg: 18px; --r-xl: 24px;
  /* motion: short, ease-out, transform and opacity only */
  --dur-quick: .12s; --dur: .18s; --dur-slow: .22s; --ease-out: cubic-bezier(.2, .7, .2, 1);
  /* stroke and icon weights */
  --icon-s: 16px; --icon-m: 22px; --stroke: 1.5px;
  interpolate-size: allow-keywords;
}
body[data-room-theme] {
  --shadow-warm: 70 52 30;
  --grain: 96 70 42; --grain-a: .04;
  --bg: #ebe3d4;           /* app surround: oatmeal */
  --surface: #f7f2e8;      /* panels: paper */
  --raised: #fffdf8;       /* controls, cards */
  --sunken: #e3dac8;       /* wells, segmented tracks */
  --line: #dbd0bb;
  --line-strong: #c1b49c;
  --ink: #2b2722;
  --muted: #6a6155;
  --warn-bg: #f8ecc9; --warn-ink: #6b4a10; --warn-line: #dfc57e;
  --bad: #a43f2e; --bad-bg: #f8e5de; --ok: #4a7a50;
  --sage: #8aa08a; --clay: #c07f60; --butter: #e5c46a; --sky: #8fa9bb;
  --shadow-1: 0 1px 2px rgb(var(--shadow-warm) / .13), 0 1px 1px rgb(var(--shadow-warm) / .07);
  --shadow-2: 0 3px 10px rgb(var(--shadow-warm) / .14), 0 1px 2px rgb(var(--shadow-warm) / .09);
  --shadow-3: 0 26px 64px rgb(var(--shadow-warm) / .28), 0 4px 14px rgb(var(--shadow-warm) / .13);
  --scrim: rgb(42 33 22 / .38);
  --seat-bg: #fffdf8; --seat-ink: #26221d;
  --paper: url(assets/paper.svg);
}
body[data-mode=dark] {
  --shadow-warm: 0 0 0;
  --grain: 255 245 230; --grain-a: .035;
  --bg: #111113;
  --surface: #1b1a1d;
  --raised: #272529;
  --sunken: #0e0e10;
  --line: #34313a;
  --line-strong: #4b4753;
  --ink: #f2eee7;
  --muted: #aaa4ae;
  --warn-bg: #3b3220; --warn-ink: #efd08e; --warn-line: #6a5731;
  --bad: #ff9d90; --bad-bg: #3a2220; --ok: #86d29f;
  --shadow-1: 0 1px 2px rgb(0 0 0 / .5);
  --shadow-2: 0 3px 12px rgb(0 0 0 / .5), 0 1px 2px rgb(0 0 0 / .5);
  --shadow-3: 0 28px 70px rgb(0 0 0 / .65), 0 4px 16px rgb(0 0 0 / .5);
  --scrim: rgb(0 0 0 / .62);
  --seat-bg: #38363c; --seat-ink: #f7f3ed;
  --paper: none;
}

/* ---------- 2. Paper and chrome ---------- */
body[data-room-theme] { background-color: var(--bg); background-image: var(--paper); background-size: 240px 240px; }
header, .app-nav, aside { background-image: var(--paper); background-size: 240px 240px; }
header { box-shadow: inset 0 -1px 0 var(--line), 0 8px 16px -14px rgb(var(--shadow-warm) / .45); position: relative; z-index: 3; }
.app-nav { box-shadow: 0 8px 16px -14px rgb(var(--shadow-warm) / .35); position: relative; z-index: 2; }
body .brand, body #panelTitle, body h1, body .dialog-heading h2 { font-family: var(--font-display) !important; letter-spacing: -.01em !important; }
body .brand { font-weight: 700; }
body #panelTitle { font-size: 21px; font-weight: 700; }
.brand .brand-mark { border-radius: 13px; box-shadow: var(--shadow-2); border-color: color-mix(in srgb, var(--line) 70%, transparent); }
.menu-h { font-family: var(--font); }
.class-icon-tile { border-radius: 12px; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--icon-tint, var(--ui-accent)) 18%, transparent); background: linear-gradient(160deg, color-mix(in srgb, var(--icon-tint, var(--ui-accent)) 18%, var(--raised)), color-mix(in srgb, var(--icon-tint, var(--ui-accent)) 8%, var(--raised))); }
.nav-tabs { background: var(--sunken); box-shadow: inset 0 1px 2px rgb(var(--shadow-warm) / .12); border-radius: 12px; }
.app-nav .nav-tabs button[aria-pressed=true] { box-shadow: var(--shadow-2); border-radius: 9px; }
.tag.ack { animation: saved-ack .9s var(--ease-out); }

/* ---------- 3. Controls ---------- */
button { box-shadow: var(--shadow-1); border-radius: var(--r-sm); }
header button:hover:not(:disabled), .app-nav button:hover:not(:disabled), aside button:hover:not(:disabled), dialog button:hover:not(:disabled), .canvas-controls button:hover:not(:disabled) { translate: 0 -.5px; }
header button:active:not(:disabled), .app-nav button:active:not(:disabled), aside button:active:not(:disabled), dialog button:active:not(:disabled), .canvas-controls button:active:not(:disabled) { translate: 0 .5px; }
button:disabled { box-shadow: none; }
.segmented button, .zoom-group button, .nav-tabs button, .header-actions #darkMode, .saved-room-card, .theme-choice, .icon-choice, .colour-swatches button { box-shadow: none; }
.segmented button[aria-pressed=true] { box-shadow: var(--shadow-2); }
button.primary { background-image: linear-gradient(180deg, rgb(255 255 255 / .16), rgb(255 255 255 / 0) 60%) !important; box-shadow: var(--shadow-1), inset 0 1px 0 rgb(255 255 255 / .22); }
input, select, textarea { box-shadow: inset 0 1px 2px rgb(var(--shadow-warm) / .07); border-radius: var(--r-sm); }
select { box-shadow: inset 0 1px 2px rgb(var(--shadow-warm) / .05), var(--shadow-1); }
.saved-room-card { background: var(--raised); box-shadow: var(--shadow-1); border-radius: var(--r-md); }
.saved-room-card[aria-pressed=true], .theme-choice[aria-pressed=true], .icon-choice[aria-pressed=true] { box-shadow: var(--shadow-1), 0 0 0 3px color-mix(in srgb, var(--ui-accent) 16%, transparent); }
.theme-choice, .icon-choice { box-shadow: var(--shadow-1); border-radius: var(--r-md); }
.theme-preview { border-radius: 10px; box-shadow: 0 0 0 1px rgb(var(--shadow-warm) / .1); }
fieldset.menu-group { background: color-mix(in srgb, var(--raised) 60%, transparent); box-shadow: inset 0 1px 0 rgb(255 255 255 / .35); }
body[data-mode=dark] fieldset.menu-group { box-shadow: none; }
#selectionHint, .selected-note, .theme-decision { border-radius: var(--r-md); }
.quiet-danger { color: var(--muted); background: transparent; box-shadow: none; }
.quiet-danger:hover:not(:disabled) { color: var(--bad); background: var(--bad-bg); }
#decorRemove { background: transparent; border-color: var(--line); color: var(--bad) !important; box-shadow: none; }
#decorRemove:hover:not(:disabled) { background: var(--bad-bg); border-color: color-mix(in srgb, var(--bad) 40%, var(--line)); }

/* ---------- 4. Panels: teacher details, decoration picker ---------- */
.teacher-photo-row { display: flex; gap: var(--s3); align-items: center; margin-top: var(--s3); }
.teacher-photo-preview { flex: none; width: 54px; aspect-ratio: 3 / 4; border-radius: 10px; overflow: hidden; border: 1px dashed var(--line-strong); display: grid; place-items: center; text-align: center; font-size: 11px; line-height: 1.2; color: var(--muted); background: var(--sunken); }
.teacher-photo-preview:not(.empty) { border-style: solid; border-color: var(--line); box-shadow: var(--shadow-1); }
.teacher-photo-preview img { width: 100%; height: 100%; object-fit: cover; display: block; }
.teacher-photo-actions { flex: 1; display: grid; gap: var(--s2); min-width: 0; }
#teacherPhotoStatus:empty { display: none; }
#teacherPhotoStatus { margin: var(--s2) 0 0; }
.decor-group h4 { margin: var(--s3) 0 var(--s2); font-size: var(--t-cap); font-weight: 650; color: var(--muted); letter-spacing: .02em; }
.decor-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--s2); }
.decor-choice { flex-direction: column; gap: 6px; min-height: 96px; padding: 8px 4px 7px; border-radius: var(--r-md); text-align: center; font-size: var(--t-cap); line-height: 1.2; white-space: normal; font-weight: 550; }
.decor-thumb { display: grid; place-items: center; width: 100%; height: 54px; border-radius: 9px; background: color-mix(in srgb, var(--sunken) 55%, var(--raised)); }
.decor-thumb img { max-width: 88%; max-height: 88%; object-fit: contain; display: block; pointer-events: none; }
body[data-mode=dark] .decor-thumb img, body[data-mode=dark] .decor-art img { filter: brightness(.84) saturate(.9); }
#decorPicker + .check-label { margin-top: var(--s3); }
details.nested > .decor-group:first-of-type h4 { margin-top: var(--s2); }

/* ---------- 5. Canvas floor: quiet by default, guides while editing ---------- */
.room { border-radius: var(--r-lg); box-shadow: var(--shadow-2); }
.room-heading-bar, .canvas-controls { background-image: var(--paper); background-size: 240px 240px; }
#canvasWrap { background-color: color-mix(in srgb, var(--room) 70%, var(--surface)); background-image: linear-gradient(165deg, rgb(255 255 255 / .28), rgb(255 255 255 / 0) 38%), var(--paper); background-size: auto, 240px 240px; box-shadow: inset 0 0 70px rgb(var(--shadow-warm) / .07); }
body[data-mode=dark] #canvasWrap { background-image: linear-gradient(165deg, rgb(255 255 255 / .03), rgb(255 255 255 / 0) 40%); box-shadow: inset 0 0 70px rgb(0 0 0 / .35); }
.grid { background-color: transparent; background-image: none; }
.arranging .grid { background-image: radial-gradient(color-mix(in srgb, var(--ink) 20%, transparent) .9px, transparent 1px); background-size: 24px 24px; }
.mode-badge { box-shadow: var(--shadow-1); }
.mode-badge[data-mode=layout] { background: color-mix(in srgb, var(--ui-accent) 14%, var(--raised)); }
.room-watermark { opacity: .05; font-family: var(--font-display); }

/* ---------- 6. Desks: quiet furniture with soft light ---------- */
.desk .desk-surface, .desk.teacher .desk-surface {
  background:
    linear-gradient(180deg, rgb(255 255 255 / .36), rgb(255 255 255 / 0) 46%),
    repeating-linear-gradient(1.5deg, rgb(var(--grain) / var(--grain-a)) 0 1px, transparent 1px 8px),
    color-mix(in srgb, var(--desk-bottom) 64%, var(--surface)) !important;
  border-color: color-mix(in srgb, var(--desk-rim) 58%, transparent);
  border-width: 1px;
  box-shadow: inset 0 1.5px 0 rgb(255 255 255 / .55), inset 0 -2px 0 rgb(var(--shadow-warm) / .09) !important;
}
body[data-mode=dark] .desk .desk-surface, body[data-mode=dark] .desk.teacher .desk-surface {
  background:
    linear-gradient(180deg, rgb(255 255 255 / .05), rgb(255 255 255 / 0) 50%),
    repeating-linear-gradient(1.5deg, rgb(var(--grain) / var(--grain-a)) 0 1px, transparent 1px 8px),
    color-mix(in srgb, var(--desk-bottom) 30%, var(--surface)) !important;
  box-shadow: inset 0 1px 0 rgb(255 255 255 / .09), inset 0 -2px 0 rgb(0 0 0 / .3) !important;
}
.desk.teacher .desk-surface { background-color: color-mix(in srgb, var(--sky) 12%, color-mix(in srgb, var(--desk-bottom) 56%, var(--surface))) !important; }
.desk.active .desk-surface, .desk.teacher.active .desk-surface {
  background:
    linear-gradient(180deg, rgb(255 255 255 / .3), rgb(255 255 255 / 0) 46%),
    repeating-linear-gradient(1.5deg, rgb(var(--grain) / var(--grain-a)) 0 1px, transparent 1px 8px),
    color-mix(in srgb, var(--ui-accent) 11%, color-mix(in srgb, var(--desk-bottom) 60%, var(--surface))) !important;
  border-color: color-mix(in srgb, var(--ui-accent) 55%, var(--line));
}
.desk-shadow { position: absolute; inset: 0; pointer-events: none; filter: blur(4.5px); translate: 0 5px; opacity: .9; transition: translate var(--dur) var(--ease-out), filter var(--dur) var(--ease-out), opacity var(--dur) var(--ease-out); }
.desk-shadow > i { position: absolute; inset: 0; display: block; background: rgb(var(--shadow-warm) / .2); border-radius: 12px; }
body[data-mode=dark] .desk-shadow > i { background: rgb(0 0 0 / .45); }
.desk.oval .desk-shadow > i, .desk.round .desk-shadow > i { border-radius: 50%; }
.desk.l .desk-shadow > i { border-radius: 0; clip-path: polygon(0 0, 48% 0, 48% 52%, 100% 52%, 100% 100%, 0 100%); }
.desk.dragging .desk-shadow, .desk.resizing .desk-shadow { translate: 0 10px; filter: blur(9px); opacity: 1; }
.desk.dragging .desk-surface { border-color: color-mix(in srgb, var(--ui-accent) 70%, var(--line)); }
/* Desk number badges: one readable pill everywhere. */
.desk .desk-handle, .arranging .desk-handle, .room:not(.arranging) .desk-handle { border-radius: 8px; background: var(--raised); box-shadow: var(--shadow-1); font-weight: 650; font-variant-numeric: tabular-nums; color: color-mix(in srgb, var(--ink) 72%, var(--muted)) !important; }
.desk.active .desk-handle { box-shadow: var(--shadow-1), 0 0 0 3px color-mix(in srgb, var(--ui-accent) 20%, transparent); }
.desk.active .desk-hit { box-shadow: 0 0 0 4px color-mix(in srgb, var(--ui-accent) 16%, transparent) !important; }
.desk-marquee { border-radius: 8px; }
/* Grips: soft, accent-filled, 36px (44px touch) hit areas, shared with decorations. */
.arranging .desk .desk-resize::after, .arranging .decor .decor-grip::after { box-shadow: 0 1px 3px rgb(var(--shadow-warm) / .38), 0 0 0 1px color-mix(in srgb, var(--ui-accent) 40%, transparent); }

/* ---------- 7. Teacher desk ---------- */
.teacher-card { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; gap: 12px; padding: 6px 14px; pointer-events: none; min-width: 0; z-index: 1; }
.teacher-portrait { flex: none; height: min(64px, calc(100% - 4px)); aspect-ratio: 3 / 4; border-radius: 10px; overflow: hidden; display: grid; place-items: center; color: var(--ui-accent); background: linear-gradient(160deg, color-mix(in srgb, var(--ui-accent) 20%, var(--seat-bg)), color-mix(in srgb, var(--ui-accent) 9%, var(--seat-bg))); box-shadow: 0 0 0 2px var(--seat-bg), 0 3px 9px rgb(var(--shadow-warm) / .22); font: 650 clamp(12px, 1.4vw, 19px) var(--font); }
.teacher-portrait img { width: 100%; height: 100%; object-fit: cover; display: block; }
.teacher-portrait b { font: inherit; }
.teacher-portrait.neutral::before { content: ""; width: 58%; height: 58%; background: currentColor; opacity: .5; mask: url(assets/ui-person.svg?v=90) center / contain no-repeat; -webkit-mask: url(assets/ui-person.svg?v=90) center / contain no-repeat; }
.teacher-name { min-width: 0; max-width: 58%; font-size: 15px; font-weight: 650; line-height: 1.2; color: var(--ink); overflow-wrap: anywhere; text-wrap: balance; }

/* ---------- 8. Decorations: behind desks, never in the way ---------- */
.decor { position: absolute; pointer-events: none; }
/* Art and hit area sit behind every desk and card; only the selected decoration's grips rise above, so they stay usable even when it overlaps furniture. */
.decor-art { position: absolute; inset: 0; pointer-events: none; z-index: -1; }
.decor-art img { width: 100%; height: 100%; object-fit: contain; display: block; filter: drop-shadow(0 2px 3px rgb(var(--shadow-warm) / .12)); user-select: none; }
.arranging .decor-hit { position: absolute; inset: 0; width: 100%; height: 100%; min-width: 0; min-height: 0; padding: 0; z-index: -1; pointer-events: auto; background: transparent !important; border: 1.5px solid transparent; border-radius: 10px; box-shadow: none; cursor: grab; touch-action: none; }
.arranging .decor-hit:hover { border-color: color-mix(in srgb, var(--ui-accent) 40%, transparent); translate: 0 0; }
.decor.active .decor-hit { border-color: var(--ui-accent); box-shadow: 0 0 0 4px color-mix(in srgb, var(--ui-accent) 15%, transparent); }
.decor.dragging .decor-art img { filter: drop-shadow(0 8px 10px rgb(var(--shadow-warm) / .22)); }
.decor.dragging .decor-hit { cursor: grabbing; }
.decor-hit:focus-visible { outline: 3px solid var(--ui-accent); outline-offset: 3px; }
.arranging .decor .decor-grip { position: absolute; z-index: 12; width: var(--resize-size, 36px); height: var(--resize-size, 36px); min-width: 0; min-height: 0; padding: 0; border: 0 !important; border-radius: 0; background: transparent !important; box-shadow: none !important; transform: translate(-50%, -50%); touch-action: none; translate: 0 0; pointer-events: auto; }
.arranging .decor .decor-grip::after { content: ""; position: absolute; inset: 29%; border: 2.5px solid var(--raised); border-radius: 50%; background: var(--ui-accent); transition: transform var(--dur) var(--ease-out); }
.arranging .decor .resize-e::after { inset: 22% 36%; border-radius: 999px; }
.arranging .decor .resize-s::after { inset: 36% 22%; border-radius: 999px; }
.arranging .decor .decor-grip:hover::after, .arranging .decor .decor-grip:focus-visible::after, .decor.resizing .decor-grip::after { transform: scale(1.15); }
.arranging .decor .decor-grip:focus-visible { outline: 0; }

/* ---------- 9. Student cards: faces and names lead ---------- */
.desk .student-card { border-radius: 14px; border: 1px solid color-mix(in srgb, var(--ink) 9%, var(--seat-bg)); background: var(--seat-bg) !important; box-shadow: 0 1px 1px rgb(var(--shadow-warm) / .1), 0 6px 16px rgb(var(--shadow-warm) / .13), inset 0 1px 0 rgb(255 255 255 / .75); transition: box-shadow var(--dur) var(--ease-out), scale var(--dur) var(--ease-out), border-color var(--dur) var(--ease-out); }
body[data-mode=dark] .desk .student-card { box-shadow: 0 1px 1px rgb(0 0 0 / .5), 0 6px 16px rgb(0 0 0 / .4), inset 0 1px 0 rgb(255 255 255 / .06); }
.desk .student-card:not(.empty):hover { box-shadow: 0 2px 3px rgb(var(--shadow-warm) / .14), 0 10px 22px rgb(var(--shadow-warm) / .17), inset 0 1px 0 rgb(255 255 255 / .75); }
.card-portrait, .card-initials { border-radius: 10px; box-shadow: 0 0 0 1px rgb(var(--shadow-warm) / .13), 0 2px 5px rgb(var(--shadow-warm) / .15); }
.card-portrait { background: var(--sunken); }
.card-initials { background: linear-gradient(160deg, color-mix(in srgb, var(--ui-accent) 20%, var(--seat-bg)), color-mix(in srgb, var(--ui-accent) 9%, var(--seat-bg))); color: var(--ui-accent); }
.desk .student-card .card-name { text-wrap: balance; }
.desk .student-card.selected { scale: 1.035; border-color: var(--ui-accent); }
.desk .student-card.lifted { opacity: .55; scale: .98; }
.desk .student-card.placed { animation: card-placed var(--dur-slow) var(--ease-out); }
.desk .student-card.empty { border-radius: 14px; }
.desk .seat-marker { border-radius: 50% !important; }
#crowdedOverview { box-shadow: var(--shadow-1); }

/* ---------- 10. Dialogs and tooltips ---------- */
dialog { background-image: var(--paper); background-size: 240px 240px; border-radius: var(--r-xl); }
dialog::backdrop { background: var(--scrim); }
#previewPages > svg { box-shadow: var(--shadow-2); border-radius: 3px; }
#previewPages { background: color-mix(in srgb, var(--ink) 8%, var(--bg)); }
.decor-choice:focus-visible, .saved-room-card:focus-visible { outline-offset: 2px; }

/* ---------- 11. Motion (all of it off under reduced motion via studio.css) ---------- */
@keyframes saved-ack { 0% { background: color-mix(in srgb, var(--ok) 24%, transparent); scale: 1.05; } 100% { background: transparent; scale: 1; } }
@keyframes card-placed { 0% { scale: .93; } 55% { scale: 1.03; } 100% { scale: 1; } }
@keyframes pop-in { from { opacity: 0; scale: .93; } to { opacity: 1; scale: 1; } }
@keyframes panel-in { from { opacity: 0; translate: 0 5px; } to { opacity: 1; translate: 0 0; } }
@keyframes dialog-in { from { opacity: 0; scale: .97; translate: 0 6px; } to { opacity: 1; scale: 1; translate: 0 0; } }
@keyframes fade-in { from { opacity: 0; } to { opacity: 1; } }
.desk.entering, .decor.entering { animation: pop-in var(--dur-slow) var(--ease-out); }
aside > :not([hidden]) { animation: panel-in var(--dur-slow) var(--ease-out); }
dialog[open] { animation: dialog-in var(--dur-slow) var(--ease-out); }
dialog[open]::backdrop { animation: fade-in var(--dur-slow) ease-out; }
details::details-content { block-size: 0; overflow: clip; opacity: 0; transition: block-size var(--dur-slow) var(--ease-out), opacity var(--dur) var(--ease-out), content-visibility var(--dur-slow) allow-discrete; }
details[open]::details-content { block-size: auto; opacity: 1; }
summary::after { transition: transform var(--dur) var(--ease-out); }
.desk-surface, .desk-hit, .decor-hit { transition: border-color var(--dur) var(--ease-out), box-shadow var(--dur) var(--ease-out), background-color var(--dur) var(--ease-out); }

/* ---------- 12. Print: no decoration, no motion ---------- */
@media print {
  *, *::before, *::after { animation: none !important; transition: none !important; }
  .decor, .desk-shadow { display: none !important; }
}
@media (forced-colors: active) {
  .desk-shadow, .decor-art img { filter: none; }
  .decor.active .decor-hit { outline: 2px solid Highlight; }
}
