:root{font-family:system-ui,sans-serif;color:#294a3a;background:#e9ede3;font-synthesis:none}*{box-sizing:border-box}body{margin:0;height:100dvh;display:flex;flex-direction:column;overflow:hidden}button,a,input{font:inherit}button{color:inherit;cursor:pointer;border:0;background:#fffdf7;border-radius:12px;min-height:44px;padding:8px 12px}button:focus-visible,a:focus-visible,input:focus-visible{outline:3px solid #c1812c;outline-offset:2px}button:disabled{opacity:.4;cursor:default}button[aria-pressed=true],button.active,.primary{background:#2f5541;color:#fff}header{min-height:62px;background:#fffdf7;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 18px;border-bottom:1px solid #d7decf;flex:none}.brand{font:25px Georgia,serif}.brand small{display:block;font:12px system-ui;color:#73816d;margin-top:2px}.top-controls{display:flex;gap:5px;align-items:center}.top-controls button{font-size:22px;width:44px;padding:3px}.top-controls #saved{font-size:12px;color:#5c735f;margin-right:8px}#rooms{display:flex;gap:4px;overflow:auto;background:#fffdf7;padding:5px 10px;flex:none;scrollbar-width:thin}#rooms button{white-space:nowrap;font-size:14px;border-radius:22px;padding:7px 13px}#stage{position:relative;flex:1;min-height:0;overflow:hidden;touch-action:none;background:#e4e8dc}#world{position:absolute;left:50%;top:50%;transform-origin:50% 50%;isolation:isolate;user-select:none;visibility:hidden}#world.ready{visibility:visible}#house{width:100%;height:100%;display:block;pointer-events:none}#night{position:absolute;inset:0;background:#152640;opacity:0;pointer-events:none;transition:opacity .8s;z-index:1}#world.evening #night{opacity:.3}#fixtures,#toys,#bedding,#front{position:absolute;inset:0;pointer-events:none}#fixtures{z-index:2}#bedding{z-index:3}#toys{z-index:4}#front{z-index:5}#fixtures button{position:absolute;min-height:0;padding:0;background:transparent;border-radius:3px;pointer-events:auto;border:1px solid transparent}#fixtures button:hover,#fixtures button:focus-visible{border-color:#fff8c9;background:#fff6bb10}#fixtures button span{position:absolute;left:50%;top:0;transform:translate(-50%,-110%);white-space:nowrap;background:#fffdf4;color:#294a3a;padding:4px 8px;border-radius:8px;font-size:12px;opacity:0}#world:not(.detail) #fixtures button:hover span{opacity:1}.toy,.cover,.bath-foam{position:absolute;padding:0;min-height:0;background:transparent;border-radius:0;transform:translate(-50%,-100%);border:0}.toy{pointer-events:auto;touch-action:none;overflow:visible}.sprite{position:absolute;inset:0;display:block;background-repeat:no-repeat;pointer-events:none;transform:scaleX(var(--flip,1));filter:drop-shadow(0 1px 1px #342d2330)}.toy.newly-added:after{content:'';position:absolute;inset:-5px;border:4px solid #ffd52a;border-radius:10px;box-shadow:0 0 0 1px #694a1f99,0 0 0 3px #fff8dccc,0 0 12px #ffd52a66;pointer-events:none}.toy:focus-visible{outline-offset:4px}.toy.dragging{z-index:9000!important}.toy .mood{position:absolute;bottom:102%;left:50%;transform:translateX(-50%);padding:2px 5px;border-radius:10px;background:#fffdf4ed;font-size:13px;white-space:nowrap}.toy.in-pool .sprite{clip-path:inset(0 0 48% 0)}.toy-picture{position:absolute;inset:0;background:#fff8e8;border:2px solid #8c6746;object-fit:contain}.held{outline:none}.cover .sprite{filter:none}.bath-foam{pointer-events:none}.bath-foam .sprite{filter:none}.light-beam{position:absolute;inset:-200% -180%;background:radial-gradient(ellipse,#fff9ce80,transparent 62%);pointer-events:none;z-index:-1}#scene-title{position:absolute;left:12px;top:12px;padding:9px 14px;background:#fffdf5ed;border-radius:16px;font:20px Georgia,serif;pointer-events:none}.camera{position:absolute;right:12px;bottom:12px;display:flex;padding:4px;gap:3px;background:#fffdf5ed;border-radius:30px;box-shadow:0 4px 18px #25352b20}.camera button{font-size:24px;width:44px;border-radius:50%;padding:0;background:transparent}#loading{position:absolute;inset:0;display:grid;place-items:center;background:#eff1e9}#loading[hidden]{display:none}#notice{position:absolute;bottom:18px;left:14px;max-width:min(68%,470px);padding:10px 14px;background:#284f3feb;color:#fff;border-radius:14px;pointer-events:none;opacity:0;transition:opacity .15s;font-size:14px}#notice.show{opacity:1}#actions{position:absolute;max-width:calc(100% - 20px);max-height:75%;overflow:auto;background:#fffdf5f5;border:1px solid #cbd4c3;box-shadow:0 8px 25px #192d2728;border-radius:18px;padding:8px;z-index:12;display:flex;flex-wrap:wrap;gap:5px;width:max-content;touch-action:pan-y}#actions[hidden]{display:none}#actions .action{width:82px;min-height:72px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;font-size:12px;padding:6px;background:#eef1e6;border:1px solid transparent}#actions .action:hover{border-color:#acbc9c}#actions .thumb{width:42px;height:40px;position:relative;display:block;background-repeat:no-repeat}#actions .glyph{font-size:28px;line-height:38px}.menu-title{width:100%;font:17px Georgia,serif;padding:2px 7px}.menu-empty{font-size:14px;margin:8px}.menu-close{margin-left:auto;width:36px;min-height:36px;padding:3px;font-size:22px}.contents{width:100%;display:flex;gap:5px;flex-wrap:wrap;border-top:1px solid #d8dece;padding-top:5px}#toybox{flex:none;background:#fffdf7;border-top:1px solid #d5ddce}.tray-head{display:flex;align-items:center;justify-content:space-between;padding:7px 12px;gap:8px}#categories{display:flex;overflow:auto;gap:4px;scrollbar-width:thin}#categories button{white-space:nowrap;font-size:14px;border-radius:20px;padding:9px 13px}#toggle{font-size:14px;border:1px solid #bccab7;flex:none}#drawer{height:min(35dvh,310px);overflow:hidden;display:flex;flex-direction:column;padding:0 12px 12px}#drawer[hidden]{display:none}#filters{display:flex;gap:5px;overflow:auto;min-height:45px;flex:none;margin-bottom:5px;scrollbar-width:thin}#filters button{white-space:nowrap;font-size:14px;min-height:40px;border-radius:20px;padding:6px 13px}#collection{display:grid;grid-template-columns:repeat(8,minmax(0,1fr));gap:8px;overflow-y:auto;align-content:start;padding:4px 3px 8px;touch-action:pan-y}.card{background:#f1f1e8;display:flex;flex-direction:column;align-items:center;justify-content:space-between;min-width:0;min-height:144px;padding:9px 5px;border-radius:14px;border:1px solid #d8decd;font-size:14px;gap:5px}.card-picture{height:110px;width:100%;display:flex;align-items:center;justify-content:center}.card-art{display:block;background-repeat:no-repeat;max-width:100%;height:100px;width:75px}.card-glyph{font-size:44px}.card-label{text-align:center}.card.present{border-color:#7c9c75;background:#e7efdf}dialog{background:#fffdf7;border:1px solid #cad3bf;border-radius:20px;color:#294a3a;padding:20px;width:min(620px,calc(100% - 24px));max-height:90dvh;box-shadow:0 20px 80px #17342750}dialog::backdrop{background:#19392766}dialog h2{font:27px Georgia,serif;margin:0}dialog p{font-size:16px;line-height:1.5}dialog .note{font-size:14px;color:#536950}dialog a{color:#315d45}.dialog-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.dialog-head button{font-size:24px}.dialog-foot{display:flex;justify-content:flex-end;gap:8px;margin-top:12px}.drawing-tools{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:10px}.drawing-tools label{display:flex;align-items:center;gap:5px;font-size:14px}#paper{display:block;width:100%;aspect-ratio:1.5;background:#fff;border:1px solid #b6c3ad;touch-action:none}.picture-words{display:flex;gap:10px;align-items:center;margin-top:10px;font-size:14px}.picture-words input{min-width:0;flex:1;padding:10px;border:1px solid #bdcbb4;border-radius:8px;font-size:16px}.primary{margin-top:10px}.party-pulse{animation:happy .55s ease-in-out}.baking .sprite{animation:bake 1.3s infinite}.pet-fun{animation:happy .7s ease-in-out 2}@keyframes happy{50%{transform:translate(-50%,-120%) rotate(5deg)}}@keyframes bake{50%{filter:drop-shadow(0 0 5px #edb746)}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;transition:none!important}}@media(max-width:1100px){#collection{grid-template-columns:repeat(6,minmax(0,1fr))}}@media(max-width:650px){header{padding:7px 10px;min-height:60px}.brand{font-size:21px}.top-controls #saved{display:none}#rooms{padding:4px 6px}#rooms button{font-size:13px;padding:6px 12px}.tray-head{flex-wrap:wrap;padding:6px}.tray-head #categories{order:2;width:100%}#toggle{margin-left:auto;min-height:38px}#drawer{height:31dvh;padding:0 7px 8px}#collection{grid-template-columns:repeat(3,minmax(0,1fr));gap:6px}.card{min-height:135px;font-size:13px}.card-picture{height:95px}.card-art{max-height:92px}#actions .action{width:72px;min-height:68px}#scene-title{font-size:17px;padding:7px 10px}.camera{bottom:8px;right:7px}.picture-words{display:block}.picture-words input{width:100%;margin-top:5px}}

#stage{overflow:clip}#filters:empty{display:none}.menu-title{width:calc(100% - 44px);align-self:center}.menu-close{align-self:flex-start}#actions .action{font-size:14px}#actions .contents{font-size:14px}

.renovation-water{position:absolute;left:24.3%;top:76.9%;width:51.7%;height:13.8%;clip-path:polygon(8.85% 0,90.25% 0,98.85% 100%,.96% 100%);z-index:2;pointer-events:none}.toy.in-pool .sprite{clip-path:inset(0 0 40% 0)}.bed-action{position:absolute;pointer-events:auto;min-height:36px;padding:5px 9px;border-radius:15px;background:#fffdf4e8;font-size:14px;transform:translate(-50%,0)}

.renovation-detail{position:absolute;z-index:0;pointer-events:none}.fabric-layer{position:absolute;pointer-events:none}.bed-action{display:none}.detail .bed-action{display:block}
.bath-occupant{position:absolute;inset:0;display:block;clip-path:inset(0 0 52% 0);pointer-events:none}
.sprite{width:100%;height:100%;aspect-ratio:auto!important}

#world.evening{--scene-light:.7}.photo-front{filter:brightness(var(--scene-light,1))}

#renovation-fridge{position:absolute;pointer-events:none;z-index:2;perspective:450px;filter:brightness(var(--scene-light,1))}.fridge-inside{position:absolute;inset:0;background-repeat:no-repeat;opacity:0;transition:opacity .1s .4s}.fridge-food{position:absolute;display:block;transform:translate(-50%,-100%);background-repeat:no-repeat;filter:drop-shadow(0 1px 1px #342d2330)}.fridge-door{position:absolute;top:0;width:50%;height:100%;background-repeat:no-repeat;transition:transform .45s ease;backface-visibility:visible}.fridge-door-left{left:0;transform-origin:left center}.fridge-door-right{right:0;transform-origin:right center}.open .fridge-inside{opacity:1;transition-delay:0s}.open .fridge-door-left{transform:rotateY(-112deg)}.open .fridge-door-right{transform:rotateY(112deg)}

#notice.at-fixture{bottom:auto;max-width:calc(100% - 16px);white-space:nowrap;transform:translate(-50%,-100%);z-index:13}

.card-art{position:relative}.wardrobe-recipient{grid-column:1/-1;display:flex;align-items:center;gap:8px;margin:0 0 3px;font-size:14px}.wardrobe-recipient select{font:inherit;color:inherit;background:#fffdf7;border:1px solid #bccab7;border-radius:10px;padding:8px;min-height:40px}
/* Feather adjoining photographs at shared wall, paving and lawn boundaries. */

.renovation-detail[data-room-art="pool-center"]{mask-image:linear-gradient(to right,transparent,#000 2%,#000 98%,transparent),linear-gradient(to bottom,transparent,#000 5%,#000 97%,transparent);mask-composite:intersect}
.renovation-detail[data-room-art="patio-left"],.renovation-detail[data-room-art="patio-right"]{mask-image:linear-gradient(to bottom,transparent,#000 4%,#000 96%,transparent)}

.wardrobe-recipient{min-height:44px;flex-wrap:wrap}.wardrobe-recipient strong{font-weight:600}.recipient-portrait{position:relative;display:inline-block;height:42px;width:25px;margin-left:auto}.wardrobe-recipient button{border:1px solid #b7c7b1;background:#fffdf7}

/* Open door liners are photographed on their inward-facing surfaces. */
#renovation-fridge .fridge-open-photo{opacity:0;transition:opacity .22s ease}
#renovation-fridge.open .fridge-open-photo{opacity:1}
.renovation-water{left:22.69%;top:75.83%;width:53.77%;height:15.2%;clip-path:polygon(9.75% 0,89.65% 0,100% 100%,0 100%)}
.renovation-detail[data-room-art="movie-right"]{mask-image:linear-gradient(to right,transparent,#000 2%,#000)}
.renovation-detail[data-room-art="ground-edge"]{z-index:1}

.renovation-detail[data-room-art="movie-right"]{mask-image:none}
.renovation-water{clip-path:polygon(10.2% .5%,89.2% .5%,99.3% 99.4%,.7% 99.4%)}

.renovation-water{left:22.83%;top:76.17%;width:53.53%;height:14.46%}

/* Drawings follow the saved toy dimensions at every zoom and resize step. */
.toy-picture{display:block;width:100%;height:100%;object-fit:contain;pointer-events:none}

/* One registered photographic frame above room photos, below night and play layers. */
.renovation-detail[data-room-art="ground-edge"]{z-index:0}
.renovation-structure{position:absolute;inset:0;z-index:0;pointer-events:none}

/* One consistent local sound control; phone layout keeps its accessible icon. */
.top-controls #sound{display:flex;align-items:center;justify-content:center;gap:5px;width:auto;padding:5px 10px;font-size:13px;white-space:nowrap}.sound-icon{font-size:23px}.top-controls #sound[aria-pressed="true"]{background:#2f5541;color:#fff}@media(max-width:650px){#sound .sound-label{display:none}.top-controls #sound{width:38px;padding:3px}.top-controls{gap:1px}.top-controls button{width:38px}.brand{font-size:20px}}


/* Object-level mixer stays outside the zoomed dollhouse. */
#sound-panel{position:fixed;right:12px;top:58px;width:min(360px,calc(100vw - 24px));max-height:calc(100dvh - 76px);overflow:auto;z-index:40;background:#fffdf7;color:#294a3a;border:1px solid #c3cdbd;border-radius:18px;box-shadow:0 12px 45px #18342538;padding:16px;touch-action:pan-y}#sound-panel[hidden]{display:none}.sound-heading{display:flex;align-items:center;justify-content:space-between;gap:10px}.sound-heading strong{font:22px Georgia,serif}.sound-close{font-size:25px;width:38px;min-height:38px;padding:0;background:#eef1e6}#sound-panel p{font-size:13px;line-height:1.5;margin:8px 0 12px;color:#64775c}#sound-master{width:100%;border:1px solid #bcccb0;margin-bottom:7px}.sound-channel{display:grid;grid-template-columns:28px 1fr 50px;gap:4px 8px;align-items:center;padding:6px 0;border-top:1px solid #e1e5db}.channel-icon{font-size:22px;text-align:center}.channel-name{font-size:15px;font-weight:600}.channel-toggle{font-size:13px;padding:5px;min-height:36px;background:#eef1e6}.sound-channel input{grid-column:2;width:100%;margin:3px 0;accent-color:#3b6a4b;min-height:24px}.sound-channel output{font-size:12px;color:#6b7b64;text-align:center}.sound-channel[data-audible="false"] .channel-icon{opacity:.5}

/* Theater lighting follows the room photograph and never touches other floors. */
#media-dim{position:absolute;left:3.1077348066298343%;top:6.445672191528545%;width:93.40469613259668%;height:16.804788213627994%;background:#111b34;opacity:0;z-index:1;pointer-events:none;mask-image:url("assets/theater-detail-v23.webp");mask-size:100% 100%;mask-repeat:no-repeat;transition:opacity .65s}#world.movie-playing #media-dim{opacity:.32}

/* v27: registered estate scenery fills the viewport while original play coordinates stay fixed. */
#estate-surround{position:absolute;inset:0;pointer-events:none;overflow:hidden}#estate-surround::after{content:'';position:absolute;inset:0;background:#152640;opacity:0;transition:opacity .8s}#stage.evening #estate-surround::after{opacity:.3}.estate-ambient{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}.estate-wing{position:absolute;max-width:none}#world{z-index:1}#estate-original{position:absolute;inset:0;mask-image:url('assets/estate-interior-mask-v27.webp');mask-size:100% 100%;mask-repeat:no-repeat;pointer-events:none}.estate-center,.estate-frame,.estate-roof{z-index:0}#night{top:-14.732965009208103%;bottom:auto;height:116.02209944751381%}#loading{z-index:4}#scene-title,.camera{z-index:3}#notice{z-index:6}

.estate-center,.estate-wing{mask-image:linear-gradient(to bottom,transparent,#000 var(--estate-top-feather,0%),#000 calc(100% - var(--estate-bottom-feather,0%)),transparent)}

/* v28: keep the playable street registered to dolls; feather only its far outer edge. */
.estate-ground{z-index:0;mask-image:linear-gradient(to bottom,transparent,#000 var(--estate-top-feather,0%),#000 calc(100% - var(--estate-bottom-feather,0%)),transparent),linear-gradient(to right,transparent,#000 4%,#000);mask-composite:intersect}.estate-ground-right{mask-image:linear-gradient(to bottom,transparent,#000 var(--estate-top-feather,0%),#000 calc(100% - var(--estate-bottom-feather,0%)),transparent),linear-gradient(to left,transparent,#000 4%,#000)}
#night{left:-49.447513812154696%;right:-49.447513812154696%}

/* The roof occupies y=140..147 of the theater opening. Stars start below its cornice. */
.theater-stars{clip-path:inset(19.4444444444% 0 0)}

.diaper-play-cloth{position:absolute;left:20%;top:57%;width:60%;height:23%;border-radius:25% 25% 40% 40%;background:linear-gradient(105deg,#fffdf6,#ece6db 48%,#fffdf9);box-shadow:0 1px 3px #67574b33;pointer-events:none;z-index:2}

/* V73: controls retain their screen size during transient zoom; native layout at rest. */
.bed-action{font-size:14px;min-height:36px;padding:5px 9px;transform:translate(-50%,0) scale(var(--camera-ui-scale,1));transform-origin:50% 0}
/* Retain the actual structural post; remove old nursery wall/plant/floor ghosts. */
[data-cohesion="nursery-divider"]{clip-path:polygon(0 0,84.7% 0,84.7% 89%,86.2% 89%,86.2% 98%,0 98%)}

/* Real padded diaper for pretend changing; outfit state stays intact. */
.changing-diaper,.diaper-play-cloth{position:absolute;left:24%;top:59%;width:52%;height:23%;background:url('assets/diaper-realistic-v73.webp') center/contain no-repeat;border-radius:0;box-shadow:none;pointer-events:none;z-index:2}

/* V75: the floor lip is integrated into the photographic frame. */

/* V83: the new patio replaces its old furniture/canopy in every season. */
#world[data-pool="resort-v83"] .garden-canopy,
#world[data-pool="resort-v83"] .winter-canopy{display:none!important}
.resort-pool-v83{z-index:1;mask-image:linear-gradient(to right,transparent,#000 1.2%,#000 98.8%,transparent),linear-gradient(to bottom,#000 87%,transparent 100%);mask-composite:intersect}
.renovation-water.resort-water-v83{clip-path:none;pointer-events:none}
.resort-jets-v83{pointer-events:none}
/* Only the visible upper body can catch a drag; submerged transparent pixels
   must never prevent grabbing a neighbouring doll or moving the camera. */
.toy.in-pool{clip-path:inset(0 0 40% 0)}
.toy.in-pool .sprite{clip-path:none;filter:none}

.toy.riding-slide{clip-path:none;pointer-events:none;z-index:9000!important}

/* V84: one full-width grounds image owns the garden below the house. */
#world[data-pool="resort-v84"] .landscape-pool-v84{mask-image:none;z-index:1}
#world[data-pool="resort-v84"] .estate-foreground,
#world[data-pool="resort-v84"] .estate-season-garden,
#world[data-pool="resort-v84"] .garden-canopy,
#world[data-pool="resort-v84"] .winter-canopy,
#world[data-pool="resort-v84"] [data-landscape^="garden-"]{display:none!important}

/* Keep the house-to-deck edge crisp while interleaving the outer shrub canopy. */
#world[data-pool="resort-v84"] .landscape-pool-v84{mask-image:linear-gradient(to bottom,transparent,#000 2.6%,#000),linear-gradient(#000,#000);mask-size:100% 100%,50.3% 100%;mask-position:center;mask-repeat:no-repeat;mask-composite:add}

#world[data-pool="resort-v84"] .landscape-pool-v84{clip-path:inset(0 0 64.14342629482071% 0)}

/* V85: solid landscape edge, repaired in registered street transition artwork. */
#world[data-pool="resort-v84"] .landscape-pool-v84{mask-image:none}

/* V87: overlap the registered lawn boundary to prevent fractional-pixel hairlines. */
#world[data-pool=resort-v84] .landscape-pool-v84{clip-path:inset(0 0 calc(64.14342629482071% - 2px) 0)}

.toy.in-pool{clip-path:inset(0 0 var(--pool-submersion,40%) 0)}

/* V90: current indoor artwork replaces historical room/decor stacks. The
   outdoor region belongs entirely to the accepted seasonal estate/pool layers. */
#estate-original{clip-path:inset(6.767955801104973% 0 30.662983425414364% 0)}

/* The native-detail indoor plane is stable during zoom; its mask moves with it. */
#estate-original{mask-image:none;clip-path:none}

.toy.dragging[data-downstairs-depth]{z-index:var(--downstairs-depth)!important}
/* Safari's tap overlay fills the transparent doll button's rectangular bounds. */
#toys .toy{-webkit-tap-highlight-color:transparent}

/* Diaper fastening: one piece. It appears flat and wide, the left side stretches across and fastens, then the right side. */
.changing-diaper.fastening{transform-origin:0 50%;animation:diaper-fasten 1.8s both}
@keyframes diaper-fasten{
0%{opacity:0;transform:translateX(-25%) scaleX(1.5);animation-timing-function:ease-out}
15%{opacity:1;transform:translateX(-25%) scaleX(1.5);animation-timing-function:ease-in-out}
25%{transform:translateX(-25%) scaleX(1.5);animation-timing-function:cubic-bezier(.4,0,.2,1)}
50%{transform:translateX(0) scaleX(1.25) scaleY(.98);animation-timing-function:ease-in-out}
60%{transform:translateX(0) scaleX(1.25) scaleY(.98);animation-timing-function:cubic-bezier(.4,0,.2,1)}
85%{transform:translateX(0) scaleX(1) scaleY(1);animation-timing-function:ease-out}
92%{transform:scale(1.04,.97)}
100%{transform:none}}
@media (prefers-reduced-motion:reduce){.changing-diaper.fastening{animation-duration:.01s}}
/* Shared ambience groups use the same quiet, compact controls as indoor sounds. */
.sound-channels h3{font-size:14px;letter-spacing:.03em;margin:18px 0 0;color:#365744}.sound-channels section>p{font-size:12px!important;margin:5px 0 8px!important}.sound-status:empty{display:none}.sound-credits{display:inline-block;font-size:12px;color:#64775c;margin-top:14px}.sound-channel button[aria-pressed="true"]{background:#dce9da;color:#254f36}.sound-channels section+section{margin-top:20px}
