/* The illustrated room (public/room.js): shared by the app and the sign-in page. */
/* --- The illustrated desk (room.js, 2026-09-26) -------------------------------------
   Replaces the photographed room: one SVG composed for the screen. Old photo-room rules
   above (ink, pen glow, canvas, phone buttons) are unused now. */
.room-stage.is-portrait{background:none}
.room-art{position:absolute;inset:0;pointer-events:none;transition:opacity 1.6s ease}
.room-art.is-hidden{opacity:0}
.room-svg{display:block;width:100%;height:100%}
.scene-layer{transform-box:fill-box;transition:transform .45s cubic-bezier(.2,.7,.2,1)}
.scene-boats,.scene-coffee,.scene-plant,.scene-journal,.scene-microphone{transform-origin:center}
.room-mic:before,.room-mic:after{display:none!important}
.room-art .room-book,.room-art .room-mic-art,.room-plant,.room-boat,.room-cloud,.room-steam{transform-box:fill-box}
.room-art .room-book{transform-origin:50% 50%;transition:translate .35s ease,filter .35s ease}
.room-mic-render{position:absolute;z-index:1;pointer-events:none;filter:var(--prop-light) drop-shadow(0 8px 5px rgba(29,23,18,.25));transition:translate .3s ease,filter .3s ease}
.has-rendered-mic .scene-microphone{visibility:hidden}
.room-stage:has(.room-mic:hover) .room-mic-render{translate:0 -3px;filter:var(--prop-light) brightness(1.07) drop-shadow(0 11px 9px rgba(29,23,18,.3))}
.room-mic-rec-light{position:absolute;z-index:1;pointer-events:none;border-radius:50%;background:#ed6650;box-shadow:0 0 9px 3px #ed665099;opacity:0;transform:translate(-50%,-50%)}
.room-stage.has-rendered-mic.is-recording .room-mic-rec-light{opacity:1;animation:mic-rec-pulse 1.6s ease-in-out infinite}
@keyframes mic-rec-pulse{50%{opacity:.45;box-shadow:0 0 5px 1px #ed665077}}
.room-book-render{position:absolute;z-index:2;pointer-events:none;transform-origin:68.3% 51%;filter:var(--prop-light) drop-shadow(0 8px 9px rgba(35,18,8,.27));transition:translate .35s ease,filter .35s ease}
.has-rendered-book .scene-journal{visibility:hidden}
.room-stage:has(.room-book-hot:hover):not(.is-lifting) .room-book-render{translate:0 -5px;filter:var(--prop-light) brightness(1.05) drop-shadow(0 12px 13px rgba(35,18,8,.34))}
.room-book-cover{transform-box:fill-box;transform-origin:7% 50%}
.room-stage:has(.room-book-hot:hover):not(.is-lifting) .room-art .room-book{translate:0 -7px;filter:drop-shadow(0 8px 8px rgba(40,20,8,.25))}
.room-art .room-mic-art{transition:translate .3s ease}
.room-stage:has(.room-mic:hover) .room-art .room-mic-art{translate:0 -4px}
.room-hint-mic{transform:translate(-50%,-100%)}
.room-stage:has(.room-mic:hover) .room-hint-mic{opacity:1}
.room-hot{border-radius:24px}
/* Level meter and glow while recording; at rest one LED is a dim power light. */
.room-led-1{fill:#2f7a47}
.room-led{transition:opacity .12s ease}
.room-stage.is-recording .room-led-1,.room-stage.is-recording .room-led-2,.room-stage.is-recording .room-led-3{fill:#57d97c}
.room-stage.is-recording .room-led-4{fill:#f3c24f}
.room-stage.is-recording .room-led-5{fill:#f26a4f}
.room-stage.is-recording .room-mic-glow{animation:mic-glow 1.8s ease-in-out infinite}
@keyframes mic-glow{0%,100%{opacity:.15}50%{opacity:.55}}
/* The room breathes a little. */
.room-boat{animation:boat-bob 5s ease-in-out infinite alternate}
.room-boat:nth-of-type(2n){animation-duration:6.5s;animation-delay:-2s}
.room-boat:nth-of-type(3n){animation-duration:4.2s;animation-delay:-1s}
@keyframes boat-bob{from{transform:translate(0,0) rotate(-1deg)}to{transform:translate(6px,-2px) rotate(1.2deg)}}
.room-cloud{animation:cloud-drift 70s linear infinite alternate}
.room-cloud:nth-of-type(2n){animation-duration:95s}
@keyframes cloud-drift{to{transform:translateX(60px)}}
.room-shimmer{animation:shimmer 3.4s ease-in-out infinite alternate}
.room-shimmer:nth-of-type(2n){animation-duration:4.6s;animation-delay:-1.5s}
.room-shimmer:nth-of-type(3n){animation-duration:2.8s;animation-delay:-.8s}
@keyframes shimmer{from{opacity:.1}to{opacity:.7}}
.room-steam{animation:steam 4.2s ease-in-out infinite;opacity:0}
.room-steam-2{animation-delay:-2.1s}
@keyframes steam{0%{opacity:0;transform:translateY(6px)}35%{opacity:.5}100%{opacity:0;transform:translateY(-14px)}}
.room-plant{transform-origin:50% 100%;animation:plant-sway 7s ease-in-out infinite alternate}
@keyframes plant-sway{from{transform:rotate(-1.4deg)}to{transform:rotate(1.4deg)}}
.room-star{animation:twinkle 3s ease-in-out infinite alternate}
.room-star:nth-of-type(3n){animation-duration:4.4s}
@keyframes twinkle{from{opacity:.25}}
@media (prefers-reduced-motion:reduce){.room-boat,.room-cloud,.room-shimmer,.room-steam,.room-plant,.room-star,.room-stage.is-recording .room-mic-glow,.room-mic-rec-light{animation:none}.room-art,.scene-layer{transition:none}}

/* Blender props (desk set, mug). They are rendered in daylight; each time of day
   dims and warms them to match the palette of the SVG room. */
:root{--prop-light:brightness(1)}
[data-scene="honey"]{--prop-light:brightness(1.02) saturate(1.05)}
[data-scene="golden"]{--prop-light:sepia(.16) saturate(1.15)}
[data-scene="sunset"]{--prop-light:sepia(.22) saturate(1.1) brightness(.88)}
[data-scene="dusk"]{--prop-light:brightness(.7) saturate(.8)}
[data-scene="blue"]{--prop-light:brightness(.58) saturate(.7) hue-rotate(6deg)}
[data-scene="night"]{--prop-light:brightness(.5) saturate(.72)}
.room-prop{position:absolute;z-index:0;pointer-events:none;filter:var(--prop-light);transition:filter 1.6s ease}
.room-mug-render{z-index:1;filter:var(--prop-light) drop-shadow(3px 5px 4px rgba(35,18,8,.28))}
/* Coffee steam: three wisps rising and fading in turn. */
.room-steam{animation:steam 4.8s ease-in-out infinite}
.room-steam-2{animation-delay:-1.6s}
.room-steam-3{animation-delay:-3.2s}
@keyframes steam{0%{opacity:0;transform:translateY(8px) scaleY(.9)}30%{opacity:.55}70%{opacity:.25}100%{opacity:0;transform:translateY(-26px) scaleY(1.08)}}
@media (prefers-reduced-motion:reduce){.room-steam{animation:none;opacity:.35}}
/* Cast shadows for the mic and mug. The light comes through the window behind the desk,
   so shadows fall forward, toward the viewer, and a little right (matching the plant's
   baked shadow). Each time of day sets their length, shear and strength. */
:root{--shadow-len:.3;--shadow-skew:-34deg;--shadow-alpha:.2;--shadow-blur:1px}
[data-scene="honey"]{--shadow-len:.18;--shadow-skew:-22deg;--shadow-alpha:.24;--shadow-blur:.6px}
[data-scene="golden"]{--shadow-len:.44;--shadow-skew:-46deg;--shadow-alpha:.22;--shadow-blur:1.2px}
[data-scene="sunset"]{--shadow-len:.56;--shadow-skew:-54deg;--shadow-alpha:.17;--shadow-blur:2px}
[data-scene="dusk"]{--shadow-len:.4;--shadow-skew:-40deg;--shadow-alpha:.1;--shadow-blur:3px}
[data-scene="blue"]{--shadow-len:.3;--shadow-skew:-30deg;--shadow-alpha:.08;--shadow-blur:4px}
[data-scene="night"]{--shadow-len:.24;--shadow-skew:24deg;--shadow-alpha:.12;--shadow-blur:4px}
.room-casts{position:absolute;inset:0;z-index:0;pointer-events:none}
.room-cast{position:absolute;pointer-events:none;opacity:var(--shadow-alpha);filter:brightness(0) blur(var(--shadow-blur));transform:scaleY(calc(var(--shadow-len) * -1)) skewX(var(--shadow-skew));transition:transform 1.6s ease,opacity 1.6s ease,filter 1.6s ease}
/* The journal lies flat: a firmer contact shadow instead of a cast one. */
.room-book-render{filter:var(--prop-light) drop-shadow(6px 7px 4px rgba(35,18,8,.34))}
