/* Revision 2: grounded scenery, precise artwork, and a single message field. */
.composer{padding-left:19px;gap:13px;min-height:56px;background:linear-gradient(115deg,#a68bad38,#43334466);box-shadow:0 0 0 1px #ffdcf415,inset 0 0 12px #e3c6e111,0 0 12px #d09dec32,0 5px 28px #12071c2e}
.composer-feather{width:25px;height:25px;flex:0 0 25px;fill:none;stroke:#ffecdc;stroke-width:1.3;stroke-linecap:round;stroke-linejoin:round}
.wish-input{font-size:16px;letter-spacing:.045em}
.composer-divider,.sender-name{display:none}
.composer-wrap{left:7%;right:7%}
.send-wish{filter:none}
.prayer-card,.prayer-card:hover,.dialog-symbol,.flying-card,.flying-lantern{filter:none}
.prayer-slot.is-decorative{filter:none;opacity:.84}
.lantern-button::after{opacity:.38;filter:blur(7px);height:20%;bottom:7%;left:20%;right:20%}
.lantern-name,.prayer-label{color:#653119;text-shadow:none;-webkit-font-smoothing:antialiased}
.lantern-button:hover{filter:brightness(1.055)}
.fairy-light{box-shadow:0 0 3px 1px #ffd783,0 0 8px 3px #ffb4544d}
.dialog-symbol img.is-card-symbol{height:100%;width:auto;max-width:90px;object-fit:contain}
.flying-lantern::after{filter:blur(6px);opacity:.55}
.capture-toggle{box-shadow:0 0 10px #fbd79432,inset 0 0 6px #ffdfab12}
@media(max-width:360px){.composer{gap:10px;padding-left:15px}.composer-wrap{left:5%;right:5%}.composer-feather{width:22px;height:22px;flex-basis:22px}}

/* Tree, its contact shadow, and the meadow share the same coordinate plane. */
.experience{max-width:calc(100svh * .5625)}
.scene-background{inset:0;transform:none;transition:none;background-size:100% 100%}
.tree-frame{inset:0;left:0;bottom:0;width:100%;height:100%;z-index:0;transform:none;transition:none}
.tree-frame .tree-art{inset:0;left:0;bottom:0;width:100%;height:100%;object-fit:fill;object-position:center;filter:none;transform:translate(var(--root-dx,0%),var(--root-dy,0%));animation:none!important;transition:opacity 1.55s ease}
.tree-touch{bottom:20%;height:46%}
.root-aura{display:none}
.canopy-motion{position:absolute;inset:0;z-index:3;pointer-events:none}
.canopy-art{position:absolute;inset:0;width:100%;height:100%;object-fit:fill;opacity:0;transition:opacity 1.55s;transform-origin:var(--root-origin-x,50%) var(--root-origin-y,79%);animation:grounded-canopy 13s ease-in-out infinite alternate}
.canopy-art.is-current{opacity:1}
.canopy-art.stage-2{mask-image:radial-gradient(ellipse 23% 9% at 50% 65%,#000 55%,transparent 100%)}
.canopy-art.stage-3{mask-image:radial-gradient(ellipse 37% 14% at 50% 56%,#000 58%,transparent 100%)}
.canopy-art.stage-4{mask-image:radial-gradient(ellipse 58% 17% at 50% 48%,#000 58%,transparent 100%)}
@keyframes grounded-canopy{from{transform:translate(var(--root-dx,0%),var(--root-dy,0%)) rotate(-.11deg)}to{transform:translate(var(--root-dx,0%),var(--root-dy,0%)) rotate(.11deg)}}

/* Authored calligraphy supplies the original's brush rhythm, with no synthetic text blur. */
.dedication{top:16.3%;left:2%;right:2%;filter:none;mix-blend-mode:screen;animation:none}
.title-artwork{position:relative;width:100%;height:10.2cqh;margin:0;overflow:hidden;font-size:0;line-height:0;text-shadow:none}
.title-artwork img{position:absolute;left:0;top:50%;width:100%;height:auto;transform:translateY(-50%);filter:none}
.subtitle{margin:1cqh 0 0;font-size:clamp(14px,4.5cqw,24px);letter-spacing:.17em;color:#ffefc9}
.verse{line-height:1.75;margin-top:.8cqh;font-size:clamp(12px,3.15cqw,17px);letter-spacing:.2em}
.verse span{font-size:.94em}
.century-mark{top:-12.6cqh;opacity:.8}
.side-verse{top:34.7%;font-size:clamp(12px,3cqw,17px)}

/* Small textures keep their natural proportions, and light stays at their edges. */
.lantern-slot,.decor-lantern,.flying-lantern{aspect-ratio:.67}
.lantern-button img,.decor-lantern img,.flying-lantern img{width:100%;height:100%;object-fit:contain;filter:none}
.lantern-name,.flying-lantern span{top:24%;height:49%;line-height:1.1;font-size:clamp(12px,3.7cqw,20px);text-overflow:ellipsis}
.prayer-slot{aspect-ratio:.4}
.prayer-card img,.flying-card img{inset:0;left:0;top:0;width:100%;height:100%;object-fit:fill;filter:none}
.prayer-label,.flying-card span{top:38%;height:45%;font-size:clamp(12px,3.8cqw,20px);letter-spacing:.1em;color:#684018;text-shadow:none}
.dialog-symbol img{filter:none}
.tree-hint{bottom:17.7%}
@media(max-width:600px){.experience{max-width:none}}
@media(max-height:660px){.tree-frame{inset:0;width:100%;height:100%}.dedication{top:15.5%}.tree-hint{bottom:19.3%}.composer{min-height:46px}.title-artwork{height:10.2cqh}.verse{font-size:12px;line-height:1.5}.subtitle{font-size:14px}.century-mark{top:-12cqh}}
@media(min-aspect-ratio:3/4) and (max-width:600px){.experience{max-width:calc(100svh * .5625)}}
@media(max-height:520px){.experience{height:660px;max-width:371px;min-height:660px}}
@media(prefers-reduced-motion:reduce){.canopy-art{animation:none!important;transform:translate(var(--root-dx,0%),var(--root-dy,0%))!important}}

/* A shared 5–100% scene frame leaves the original title's breathing room. */
.tree-frame,.canopy-motion{inset:5% 0 0;height:95%;width:100%}
.tree-frame{mask-image:linear-gradient(to bottom,transparent,#000 5%,#000)}
.tree-frame .tree-art{mask-image:none}
.title-artwork{width:84%;height:21cqw;margin:0 auto}
.subtitle{margin-top:.5cqh;font-size:clamp(14px,4cqw,22px);line-height:1.1}
.verse{margin-top:.4cqh;font-size:clamp(12px,3cqw,16px);line-height:1.3}
.prayer-card img,.flying-card img{width:135%;left:-17.5%;height:100%;object-fit:fill;filter:none}
.prayer-label,.flying-card span{top:37%;height:48%}
.canopy-art.stage-2{mask-image:radial-gradient(ellipse 28% 11% at 50% 58%,#000 55%,transparent 100%)}
.canopy-art.stage-3{mask-image:radial-gradient(ellipse 48% 15% at 50% 53%,#000 58%,transparent 100%)}
@media(max-height:660px){.tree-frame,.canopy-motion{inset:5% 0 0;height:95%;width:100%}.title-artwork{height:21cqw}.verse{font-size:12px;line-height:1.3}}

/* Revision 3: each original trunk/soil contact maps to one shared ground point. */
.tree-frame::before{content:"";position:absolute;inset:0;background:url('assets/background.webp') center/100% 100% no-repeat}
.tree-frame .tree-art{mask-image:linear-gradient(to bottom,transparent 25%,#000 30%,#000 78%,transparent 86%)}
.tree-frame .tree-art.stage-2{mask-image:radial-gradient(ellipse 34% 24% at 51% 63%,#000 87%,transparent 100%),radial-gradient(ellipse 12% 5% at 51% 77%,#000 60%,transparent 100%)}

/* Three-character names have a reserved, readable vertical column on every lamp. */
.lantern-slot{min-width:48px}
.lantern-name,.flying-lantern .lantern-name{top:21%;height:53%;width:60%;max-width:none;left:50%;transform:translateX(-50%);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.04em;writing-mode:horizontal-tb;white-space:normal;overflow:visible;line-height:1;letter-spacing:0;text-overflow:clip;font-size:var(--name-font-size,14px)}
.lantern-name .name-glyph,.flying-lantern .name-glyph{position:static;display:block;flex:0 0 1em;width:1em;height:1em;max-width:none;transform:none;writing-mode:horizontal-tb;font:inherit;color:inherit;letter-spacing:0;text-align:center}
.lantern-name.name-long,.flying-lantern .lantern-name.name-long{display:block;writing-mode:vertical-rl;text-orientation:upright;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:1.2em;line-height:1.2}

/* The can is a scene object; its label stays still while the can tips and pours. */
.watering-control{position:absolute;left:68%;top:calc(var(--root-y,78.3%) - 23cqw);width:clamp(70px,23cqw,116px);opacity:0;visibility:hidden;transform:translateY(8px);transition:opacity .6s,transform .6s,visibility .6s;pointer-events:none}
.experience:not([data-stage="4"]) .tree-hint{left:4%;right:29%}
.experience:not([data-stage="4"]) .watering-control{opacity:1;visibility:visible;transform:none;pointer-events:auto}
.water-tree{position:relative;width:100%;padding:0;background:transparent;color:#fff0cf;touch-action:manipulation;isolation:isolate}
.watering-can-art{position:relative;display:block;width:100%;aspect-ratio:1;transform-origin:62% 55%;transition:filter .3s;will-change:transform}
.watering-can-art img{display:block;width:100%;height:100%;object-fit:contain;pointer-events:none}
.water-tree::before{content:"";position:absolute;left:28%;right:10%;top:72%;height:12%;z-index:-1;border-radius:50%;background:radial-gradient(ellipse,#e8b95f65,transparent 72%);transform:scaleX(1.15)}
.watering-label{position:relative;display:block;width:max-content;margin:-3px auto 0;padding:4px 10px;border:1px solid #eac4825c;border-radius:20px;background:#2e253052;font-family:var(--serif);font-size:12px;letter-spacing:.1em;line-height:1.4;text-shadow:0 1px 3px #24152e;white-space:nowrap;box-shadow:0 0 12px #ffd88b18}
.water-tree:hover .watering-can-art{filter:brightness(1.1)}
.water-tree:focus-visible{border-radius:15px;outline-offset:5px}
.water-tree:disabled{cursor:default;opacity:1}
.is-watering .watering-label{color:#dafaff;border-color:#b6eaf582;box-shadow:0 0 15px #91dce82e}
.experience.is-clean .watering-control{opacity:0;visibility:hidden;pointer-events:none}
.experience.is-watering .growth-control button:disabled{cursor:wait;opacity:.7}
@media(prefers-reduced-motion:reduce){.watering-control,.watering-can-art{transition:none}}

/* Revision 4: the seedling carries no sky or meadow pixels that can drift out of place. */
.tree-frame .tree-art.seedling-layer{mask-image:none;transform:none}
.seedling-root{position:absolute;left:var(--art-root-x,50%);top:var(--art-root-y,77.1531%);width:17%;aspect-ratio:2/3;transform:translate(-50.6836%,-92.1875%);transform-origin:50.6836% 92.1875%;animation:seedling-sway 8s ease-in-out infinite alternate}
.seedling-sprite{display:block;width:100%;height:100%;object-fit:contain;clip-path:url(#seedling-outline);mask-image:linear-gradient(to bottom,#000 91%,transparent 92.4%)}
.seedling-contact{position:absolute;left:var(--art-root-x,50%);top:var(--art-root-y,77.1531%);width:4%;height:.5%;transform:translate(-50%,-40%);border-radius:50%;background:radial-gradient(ellipse,#32281265,transparent 72%);mix-blend-mode:multiply}
@keyframes seedling-sway{from{transform:translate(-50.6836%,-92.1875%) rotate(-.8deg)}to{transform:translate(-50.6836%,-92.1875%) rotate(.8deg)}}

/* The source logo remains a separate, unaltered high-resolution image on the stone face. */
.commemorative-stone{position:absolute;z-index:14;right:1%;top:77.8%;width:35%;aspect-ratio:3/2;pointer-events:none;isolation:isolate;user-select:none}
.stone-art{display:block;width:100%;height:100%;object-fit:contain;clip-path:url(#stone-outline);mask-image:linear-gradient(to bottom,#000 86%,transparent 90.5%)}
.stone-inscription{position:absolute;left:22%;right:14%;top:28%;bottom:21%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.2cqw;transform:rotate(-5deg);mix-blend-mode:multiply}
.stone-logo{width:32%;aspect-ratio:1;display:block;object-fit:contain}
.stone-name{font-family:'Suhua Brush',var(--serif);font-size:clamp(14px,4.3cqw,23px);font-weight:400;letter-spacing:.08em;line-height:1.15;color:#3c303d;white-space:nowrap;text-shadow:0 1px 0 #fff4da4d}

/* Give the permanent stone its own space; the can now waters from the left foreground. */
.watering-control{left:8%}
.watering-can-art{transform-origin:38% 55%}
.watering-can-art img{transform:scaleX(-1)}
.water-tree::before{left:10%;right:28%}
.experience:not([data-stage="4"]) .tree-hint{left:0;right:0}
.growth-control{left:38%;padding-left:6px;padding-right:6px}
.growth-control button{padding-left:7px;padding-right:7px}
.asset-clips{position:absolute;overflow:hidden;pointer-events:none}
@media(prefers-reduced-motion:reduce){.seedling-root{animation:none}}

/* 登录弹层：沿用祝福弹窗的气质，登录前不可关闭。 */
.login-dialog .dialog-input{margin-bottom:2px}
.login-dialog .dialog-primary{margin-top:22px}
.login-note{font-size:12px;line-height:1.7;letter-spacing:.04em;color:#c8aec4;margin:14px 0 0}

/* 浇灌进度条：替代原四个阶段切换按钮，展示全员累计浇灌进度。 */
.growth-progress{position:absolute;bottom:12.2%;left:50%;transform:translateX(-50%);width:min(62%,270px);padding:7px 13px 8px;border:1px solid #ffdbaa30;border-radius:30px; /*background:linear-gradient(110deg,#3f284955,#20132866);backdrop-filter:blur(12px);box-shadow:0 3px 16px #1d112626;pointer-events:auto*/}
.growth-progress-info{display:flex;align-items:baseline;justify-content:space-between;gap:10px;font-size:13px;letter-spacing:.08em;color:#f7e5d4;margin-bottom:5px;white-space:nowrap}
.growth-progress-info .growth-progress-count, .growth-progress-info #progress-count{color:#ffdc97;font-size:12px;letter-spacing:.05em}
.growth-progress-track{height:6px;border-radius:6px;background:#170d2466;box-shadow:inset 0 0 0 1px #ffe5a01f;overflow:hidden}
.growth-progress-fill{height:100%;width:0;border-radius:6px;background:linear-gradient(90deg,#7fd8a0,#ffe08e);box-shadow:0 0 8px #ffd88b66;transition:width .9s cubic-bezier(.2,.7,.2,1)}
@media (max-height:660px){.growth-progress{bottom:14%;padding:5px 11px 6px}.growth-progress-track{height:5px}}
@media(prefers-reduced-motion:reduce){.growth-progress-fill{transition:none}}

/* 入场加载层：关键素材、字体与首屏数据就绪后再进入场景。 */
.loader{position:fixed;inset:0;z-index:200;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:18px;background:radial-gradient(ellipse at 50% 32%,#3a2347,#160e25 74%);transition:opacity .8s ease,visibility .8s}
.loader.is-hidden{opacity:0;visibility:hidden;pointer-events:none}
.loader-symbol{height:96px;filter:drop-shadow(0 0 24px #ffbc6163)}
.loader-symbol img{height:100%;object-fit:contain;animation:lantern-drift 4s ease-in-out infinite alternate}
.loader-title{font-family:'Suhua Brush',var(--serif);font-size:clamp(24px,6vw,34px);letter-spacing:.12em;color:#ffe3ad;margin:0}
.loader-track{width:min(56%,240px);height:5px;border-radius:6px;background:#ffffff14;overflow:hidden}
.loader-fill{height:100%;width:0;border-radius:6px;background:linear-gradient(90deg,#7fd8a0,#ffe08e);box-shadow:0 0 8px #ffd88b66;transition:width .4s ease}
.loader-text{font-size:12px;letter-spacing:.2em;color:#c8aec4;margin:0}
@media(max-height:660px){.loader{gap:13px}.loader-symbol{height:74px}}
@media(prefers-reduced-motion:reduce){.loader{transition:none}.loader-symbol img{animation:none}}
