/* Divine Memorial · 天宇纪念园 - Family hall (final 01, under /family/). Same palette and type as the main hall. */
:root{--ink:#14110B;--ink-2:#1F1A10;--panel:rgba(24,19,11,.88);--line:rgba(201,162,74,.40);--gold:#C9A24A;--gold-btn:#B9954C;--gold-btn-hover:#C7A35A;--gold-text:#E2C67E;--text:#F3E6C4;--text-soft:#D8CBA8;--focus:#F1D58C;--radius:12px;
--serif:"Iowan Old Style","Palatino Linotype",Palatino,"Book Antiqua","Noto Serif",Georgia,"Noto Serif SC","Songti SC",serif;
--sans:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"PingFang SC","Microsoft YaHei","Noto Sans SC","Noto Sans CJK SC",sans-serif;
--safe-t:env(safe-area-inset-top,0px);--safe-b:env(safe-area-inset-bottom,0px);--safe-l:env(safe-area-inset-left,0px);--safe-r:env(safe-area-inset-right,0px)}
*{box-sizing:border-box}
html,body{margin:0;height:100%;background:var(--ink);color:var(--text);font-family:var(--sans);font-size:16px;line-height:1.5;-webkit-text-size-adjust:100%;overflow:hidden}
button,input,select,textarea{font:inherit;color:inherit}
[hidden]{display:none!important}
.skip{position:absolute;left:8px;top:-60px;z-index:100;background:var(--ink-2);color:var(--text);padding:10px 14px;border-radius:8px;border:1px solid var(--gold)}
.skip:focus{top:8px}
:focus-visible{outline:3px solid var(--focus);outline-offset:2px}
.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:44px;padding:8px 16px;border-radius:10px;border:1px solid transparent;cursor:pointer;font-size:15px;line-height:1.25;transition:background-color .2s,border-color .2s}
.btn-primary{background:var(--gold-btn);color:#1A140A;font-weight:600;border-color:#D2B26A}.btn-primary:hover{background:var(--gold-btn-hover)}
.btn-outline{background:rgba(20,16,9,.35);color:var(--text);border-color:rgba(201,162,74,.65)}.btn-outline:hover{border-color:var(--gold-text);background:rgba(201,162,74,.12)}
.btn-quiet{background:var(--panel);color:var(--text);border-color:rgba(201,162,74,.45)}.btn-quiet:hover{border-color:rgba(226,198,126,.8)}
.btn-wide{width:100%;margin-top:8px}
.icon-btn{width:44px;height:44px;display:inline-flex;align-items:center;justify-content:center;border-radius:50%;border:1px solid rgba(201,162,74,.55);background:var(--panel);color:var(--text);font-size:22px;line-height:1;cursor:pointer;padding:0}
.badge{display:inline-block;font-size:12.5px;line-height:1.3;padding:4px 10px;border-radius:999px;background:rgba(20,16,9,.78);border:1px solid rgba(201,162,74,.45);color:var(--text);white-space:nowrap}

/* Scene: the stage is ALWAYS exactly 16:9 (set in JS), so the picture fills it 1:1 with no stretch.
   The viewport crops/pans it ("cover"). The overlay is the same box, so x,y fractions map exactly. */
.viewport{position:fixed;inset:0;overflow:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch;cursor:grab;background:var(--ink)}
.viewport::-webkit-scrollbar{display:none}
.viewport.panning{cursor:grabbing}
.stage{position:relative;margin:0}
.pic{position:absolute;inset:0;width:100%;height:100%;display:block;user-select:none;-webkit-user-select:none;opacity:0;z-index:0;transition:opacity 1s ease-in-out}
.pic.front{opacity:1;z-index:1}
.pic.hold{opacity:1;z-index:1}
.pic.in{z-index:2}
.pic.noanim{transition:none}
.pic:not([src]){visibility:hidden}
.overlay{position:absolute;inset:0;z-index:3}

/* Markers. --u = (stage width / 1280) x perspective scale x selected scale, in px. */
.mk{position:absolute;padding:0;margin:0;border:0;background:none;cursor:pointer;transform:translate(-50%,-100%);touch-action:manipulation;-webkit-tap-highlight-color:transparent}
.mk:focus-visible{outline:none}
.mk:focus-visible::after{content:"";position:absolute;inset:-4px;border:2px solid var(--focus);border-radius:10px}
.mk span{position:absolute;pointer-events:none;left:50%;border-radius:50%}
/* Fairy lights (default) */
.mk.fairy{width:max(44px,calc(var(--u)*48px));height:max(44px,calc(var(--u)*44px))}
.mk.fairy .pool{width:calc(var(--u)*68px);height:calc(var(--u)*16px);bottom:calc(var(--u)*-8px);transform:translateX(-50%);background:rgba(255,214,140,calc(.47*var(--b)));filter:blur(calc(var(--u)*8px));mix-blend-mode:screen}
.mk.fairy .halo{width:calc(var(--u)*44px);height:calc(var(--u)*44px);bottom:calc(var(--u)*(7px - 22px));transform:translateX(-50%);background:rgba(255,226,160,calc(.59*var(--b)));filter:blur(calc(var(--u)*9px))}
.mk.fairy .core{width:calc(var(--u)*14px);height:calc(var(--u)*14px);bottom:calc(var(--u)*0px);transform:translateX(-50%);background:rgba(242,213,138,calc(.92*var(--b)));filter:blur(calc(var(--u)*2px))}
.mk.fairy .ctr{width:calc(var(--u)*6px);height:calc(var(--u)*6px);bottom:calc(var(--u)*4px);transform:translateX(-50%);background:#FFFAE8}
.mk.fairy .spk{width:calc(var(--u)*30px);height:calc(var(--u)*30px);bottom:calc(var(--u)*(7px - 15px));transform:translateX(-50%);border-radius:0;opacity:0;
  background:linear-gradient(90deg,transparent 0 46%,rgba(255,250,232,.85) 50%,transparent 54%),linear-gradient(0deg,transparent 0 46%,rgba(255,250,232,.85) 50%,transparent 54%);
  -webkit-mask:radial-gradient(circle,#000 0 20%,transparent 70%);mask:radial-gradient(circle,#000 0 20%,transparent 70%)}
.mk.fairy.tw .spk{animation:twinkle 4.2s ease-in-out infinite;animation-delay:var(--d)}
@keyframes twinkle{0%,70%,100%{opacity:0}82%{opacity:.9}}
/* Memorial stones */
.mk.stone{width:max(44px,var(--w));height:max(44px,var(--h))}
.mk.stone .gglow{width:calc(var(--w)*2.2);height:calc(var(--w)*.42);bottom:calc(var(--w)*-.21);transform:translateX(-50%);background:radial-gradient(closest-side,rgba(255,214,140,calc(.43*var(--b))),transparent)}
.mk.stone .bglow{width:calc(var(--h)*2.1);height:calc(var(--h)*2.1);bottom:calc(var(--h)*.5 - var(--h)*1.05);transform:translateX(-50%);
  background:radial-gradient(closest-side,rgba(255,226,150,calc(.78*var(--g))),rgba(255,226,150,calc(.38*var(--g))) 38%,rgba(255,226,150,0) 70%)}
.mk.stone img{position:absolute;left:50%;bottom:0;width:var(--w);height:var(--h);transform:translateX(-50%);pointer-events:none;user-select:none}
.mk.sel{z-index:5}
/* Adjust mode */
.adjusting .mk{cursor:grab;touch-action:none}
.adjusting .mk.dragging{cursor:grabbing;z-index:10}
.adjusting .mk::before{content:"";position:absolute;left:50%;bottom:-3px;width:10px;height:10px;margin-left:-5px;border-radius:50%;border:1.5px solid rgba(255,250,232,.9);box-shadow:0 0 0 2px rgba(20,16,9,.45)}
.ghost{position:absolute;width:22px;height:8px;border-radius:50%;transform:translate(-50%,-50%);border:1.5px dashed rgba(255,250,232,.85);background:rgba(20,16,9,.25);pointer-events:none}

/* Chrome */
.topbar{position:fixed;top:calc(12px + var(--safe-t));left:calc(12px + var(--safe-l));right:calc(12px + var(--safe-r));display:flex;align-items:center;justify-content:space-between;gap:10px;pointer-events:none}
.topbar>*{pointer-events:auto}
.title{background:var(--panel);border:1px solid var(--line);border-radius:999px;padding:6px 16px;font-family:var(--serif);font-size:17px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.t-zh{color:var(--text-soft);font-size:15px}
.bottombar{position:fixed;right:calc(12px + var(--safe-r));top:calc(66px + var(--safe-t));display:flex;gap:8px;align-items:center}
.mainhall-link{text-decoration:none;white-space:nowrap}
.panel{position:fixed;z-index:20;background:var(--panel);border:1px solid var(--line);border-radius:16px;padding:14px 16px 16px;box-shadow:0 10px 40px rgba(0,0,0,.45);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}
.panel-head{display:flex;align-items:center;justify-content:space-between;gap:8px}
.panel h2{font-family:var(--serif);font-weight:400;font-size:20px;margin:4px 0}
.settings{right:calc(12px + var(--safe-r));top:calc(108px + var(--safe-t));width:min(460px,calc(100vw - 24px));max-height:calc(100vh - 150px);overflow:auto}
.field{margin-top:12px}
.label{font-size:13px;color:var(--text-soft);margin-bottom:6px;display:block}
.temp{color:#BFB291}
.figure-row{display:flex;gap:12px;align-items:flex-end;flex-wrap:wrap}
.style-box .label{margin-bottom:6px}
.seg{display:flex;flex-wrap:wrap;gap:6px}
.seg button{min-height:44px;padding:6px 12px;border-radius:10px;border:1px solid rgba(201,162,74,.4);background:rgba(20,16,9,.4);cursor:pointer;font-size:14px;line-height:1.2;text-align:center}
.seg button small{display:block;color:var(--text-soft);font-size:12px}
.seg button[aria-checked="true"]{border-color:var(--gold-text);background:rgba(201,162,74,.22);box-shadow:inset 0 0 0 1px var(--gold-text)}
.seg-fig{flex:1 1 220px}
.seg-fig button{flex:1 1 40%}
.select{width:100%;min-height:44px;border-radius:10px;border:1px solid rgba(201,162,74,.5);background:#1D1912;padding:8px 10px}
.note{margin:10px 0 0;font-size:12.5px;color:#BFB291}
.card{right:calc(16px + var(--safe-r));top:calc(70px + var(--safe-t));width:min(320px,calc(100vw - 32px))}
.card h2{font-size:22px;margin-top:8px}
.card p{margin:2px 0;color:var(--text-soft)}
.card .zh{font-size:18px;color:var(--text)}
.adjustbar{position:fixed;z-index:15;left:50%;transform:translateX(-50%);top:calc(12px + var(--safe-t));background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:10px 14px;display:flex;align-items:center;gap:14px;flex-wrap:wrap;justify-content:center;max-width:calc(100vw - 24px)}
.adjustbar .hint{margin:0;font-size:14px}
.adjustbar .row{display:flex;gap:8px}
.adjustbar .btn{white-space:nowrap}
.adjusting~.bottombar,.adjusting-on .bottombar{display:none}
.toast{position:fixed;left:50%;top:calc(70px + var(--safe-t));transform:translateX(-50%);background:var(--panel);border:1px solid var(--line);border-radius:999px;padding:6px 16px;font-size:14px;opacity:0;transition:opacity .3s;pointer-events:none}
.toast.show{opacity:1}
@media (max-width:600px){
  .title{font-size:15px;padding:6px 12px}.t-zh{display:none}
  .card{left:16px;right:16px;top:auto;bottom:calc(72px + var(--safe-b));width:auto}
  .settings{top:calc(104px + var(--safe-t))}
  .kbd-hint{display:none}
  .adjustbar{top:calc(64px + var(--safe-t));padding:8px 10px;gap:8px}
}
@media (prefers-reduced-motion:reduce){.mk.fairy.tw .spk{animation:none;opacity:.5}.pic{transition:none!important}}

/* fh01d name tags (Iris spec, Oct 15) */
.mk span.tag{left:auto;right:auto;bottom:50%;border-radius:999px;padding:3px 9px;white-space:nowrap;background:rgba(250,244,230,.82);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);border:1px solid rgba(217,185,104,.55);box-shadow:0 1px 6px rgba(60,40,10,.18);font-family:var(--serif);font-size:12px;font-weight:500;line-height:1.3;color:#4A3A22;opacity:.9;transform:translateY(calc(50% + var(--dy,0px)));filter:none}
.mk span.tag.right{left:calc(100% + 8px)}
.mk span.tag.left{right:calc(100% + 8px)}
.mk span.tag.res{color:#7A6A4E}
.mk.sel span.tag,.mk.dragging span.tag{opacity:1;border-color:#D9B968}
@media (max-width:600px){.mk span.tag{font-size:11px}}
.dragging-on .mk:not(.dragging) span.tag{opacity:.4;transition:opacity .15s}

/* ===== Divine Memorial top-left lockup (Iris, design/brand-divine-01/logo.css, pasted as-is). Mark = /brand/logo-mark.svg ===== */
.brand{display:inline-flex;align-items:center;gap:10px;background:none;border:0;border-radius:0;padding:4px 2px;text-decoration:none;text-shadow:0 1px 2px rgba(10,8,5,.75),0 0 10px rgba(10,8,5,.55)}
.brand-mark{width:30px;height:30px;flex:none;display:block;filter:drop-shadow(0 1px 2px rgba(10,8,5,.7))}
.brand-text{display:flex;flex-direction:column;align-items:flex-start;gap:1px;line-height:1.15}
.brand-en{font-family:"Iowan Old Style",Palatino,"Palatino Linotype","Noto Serif",Georgia,serif;font-size:18px;color:var(--gold-text,#E2C67E);letter-spacing:.02em;white-space:nowrap}
.brand-zh{font-family:"Noto Serif SC","Noto Serif CJK SC","Songti SC",serif;font-size:12px;color:var(--text-soft,#D8CBA8);letter-spacing:.18em;white-space:nowrap}
@media (max-width:600px){.brand{padding:3px 2px;gap:8px}.brand-mark{width:26px;height:26px}.brand-en{font-size:16px}.brand-zh{font-size:11px}}

.foot-note{position:fixed;right:calc(12px + var(--safe-r));text-align:right;bottom:calc(8px + var(--safe-b));margin:0;font-size:12px;color:var(--text-soft);text-shadow:0 1px 3px rgba(0,0,0,.7);pointer-events:none;z-index:4}

/* ===== Person card (Iris final screens 11-14 desktop, 21-24 phone) ===== */
.pcard{right:calc(16px + var(--safe-r));top:calc(122px + var(--safe-t));width:580px;max-width:calc(100vw - 32px);max-height:calc(100vh - 150px - var(--safe-t));overflow:auto;padding:14px 18px 16px;z-index:22;overscroll-behavior:contain}
.pcard.v-journey{right:auto;left:50%;transform:translateX(-50%);width:880px}
.pcard.v-add{right:auto;left:50%;transform:translateX(-50%);width:640px}
.pcard-dim{position:fixed;inset:0;background:rgba(10,8,4,.45);z-index:21}
.pcard h2{font-family:var(--serif);font-weight:400;font-size:22px;margin:0}
.pc-soft{color:var(--text-soft)}
.pc-badge-s{font-size:11px;padding:2px 8px}
.pc-top{display:flex;gap:20px;align-items:center;margin-top:8px}
.pc-photo{position:relative;flex:none;width:170px;height:212px;border:1px solid var(--line);border-radius:12px;overflow:hidden;background:linear-gradient(160deg,#3A3122,#221C12);box-shadow:0 0 24px rgba(201,162,74,.18)}
.pc-photo img{width:100%;height:100%;object-fit:cover;display:block}
.pc-photo .badge,.pc-big .badge{position:absolute;top:8px;left:8px;font-size:11px;padding:2px 8px}
.pcard .pc-zh{font-family:var(--serif);font-size:28px;line-height:1.3;margin:6px 0 0}
.pc-en{font-family:var(--serif);font-size:19px;margin:0}
.pc-years{color:var(--text-soft);margin:0}
.trib{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-top:14px}
.tb{position:relative;overflow:hidden;border:1px solid rgba(201,162,74,.4);background:rgba(20,16,9,.4);border-radius:10px;padding:10px 4px;text-align:center;color:var(--gold-text);cursor:pointer;font:inherit;min-height:44px;transition:border-color .3s,background-color .3s,box-shadow .6s}
.tb svg{display:block;margin:0 auto}
.tb b{display:block;color:var(--text);font-size:14px;font-weight:600;margin-top:4px;line-height:1.25}
.tb i{display:block;font-style:normal;font-size:12px;color:var(--text-soft);line-height:1.35}
.tb i.zhn{color:var(--text)}
.tb:hover{border-color:rgba(226,198,126,.75)}
.tb.on{border-color:var(--gold-text);background:rgba(201,162,74,.22);box-shadow:inset 0 0 0 1px var(--gold-text),0 0 18px rgba(226,198,126,.25)}
.trib-sum{text-align:center;font-size:14px;color:var(--text-soft);margin:10px 0 0;min-height:21px}
.pc-sec{display:flex;justify-content:space-between;align-items:baseline;gap:10px;margin:18px 0 4px}
.pc-sec h3{font-family:var(--serif);font-weight:400;font-size:19px;margin:0}
.pc-sec em{font-style:normal;font-size:12.5px;color:var(--text-soft);text-align:right}
.pc-sub{display:none;font-size:12.5px;color:var(--text-soft);margin:-2px 0 0}
.tl{position:relative;display:flex;justify-content:space-between;padding:12px 2px 26px;margin:0 6px}
.tl:before{content:"";position:absolute;left:8px;right:8px;top:19px;height:2px;background:linear-gradient(90deg,rgba(201,162,74,.5),var(--gold))}
.dot{position:relative;width:22px;height:22px;margin-top:-4px;padding:0;border:0;background:none;cursor:pointer}
.dot i{display:block;width:14px;height:14px;border-radius:50%;background:var(--ink-2);border:2px solid var(--gold);margin:4px auto 0}
.dot.sel i{background:var(--gold-text);box-shadow:0 0 0 4px rgba(226,198,126,.3),0 0 12px rgba(255,226,160,.7)}
.dot.und i{border-style:dashed;border-color:#8F8160}
.dot small{position:absolute;top:22px;left:50%;transform:translateX(-50%);white-space:nowrap;font-size:11.5px;color:var(--text-soft)}
.dot:first-child small{left:0;transform:none}.dot:last-child small{left:auto;right:0;transform:none}
.thumbs{display:flex;gap:8px}
.th{flex:1;min-width:0;height:56px;border-radius:8px;border:1px solid rgba(201,162,74,.25);padding:0;cursor:pointer;overflow:hidden;background:#2a2318}
.th img{width:100%;height:100%;object-fit:cover;display:block}
.th.sel{border-color:var(--gold-text);box-shadow:0 0 0 1px var(--gold-text)}
.pc-actions{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:16px}
.pc-actions .btn{width:100%}
/* Journey */
.pj-head{display:flex;justify-content:space-between;align-items:baseline;gap:10px;margin-top:4px}
.pj-head h2{font-size:24px}
.pj-body{display:flex;gap:22px;margin-top:10px}
.pc-big{position:relative;flex:none;width:520px;height:350px;border:1px solid var(--line);border-radius:12px;overflow:hidden;background:linear-gradient(160deg,#7A5A4C,#3E2D26)}
.pc-big img{width:100%;height:100%;object-fit:cover;display:block}
.pj-info{flex:1;min-width:0}
.pj-info h2{font-size:22px;line-height:1.3}
.pj-info p{margin:2px 0;font-size:14px}
.pj-nav{display:flex;gap:8px;margin-top:20px}
.pj-nav .btn{flex:1}
.pj-foot{display:flex;justify-content:flex-end;margin-top:14px}
/* Forms */
.pv-badge{font-size:11.5px;padding:2px 9px;border-color:rgba(226,198,126,.7);color:var(--gold-text);white-space:normal}
.flabel{display:flex;justify-content:space-between;align-items:center;gap:8px;font-size:13px;color:var(--text-soft);margin:12px 0 6px}
.drop{position:relative;height:120px;border:1.5px dashed rgba(201,162,74,.65);border-radius:12px;display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--gold-text);background:rgba(20,16,9,.4);cursor:pointer;overflow:hidden}
.drop b{font-size:26px;font-weight:400;line-height:1.1}.drop span{font-size:14px}
.drop img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;background:#14110B}
.drop input{position:absolute;inset:0;opacity:0;cursor:pointer}
.inp{width:100%;background:#1D1912;border:1px solid rgba(201,162,74,.5);border-radius:10px;padding:10px 12px;font-size:14.5px;min-height:44px;color:var(--text)}
.inp::placeholder{color:#9C8F70}
textarea.inp{height:96px;resize:vertical;line-height:1.45}
.count{font-size:12px;color:var(--text-soft);text-align:right;margin:3px 0 0}
.segd{display:flex;gap:6px}
.segd button{flex:1;min-height:44px;border-radius:10px;border:1px solid rgba(201,162,74,.4);background:rgba(20,16,9,.4);font-size:14px;cursor:pointer}
.segd button[aria-checked="true"]{border-color:var(--gold-text);background:rgba(201,162,74,.22);box-shadow:inset 0 0 0 1px var(--gold-text)}
.dsel{display:grid;grid-template-columns:repeat(var(--n,2),1fr);gap:8px;margin-top:8px}
.dsel select{appearance:auto}
.hintp{font-size:12.5px;color:var(--text-soft);margin:4px 0 0}
.who{font-size:13.5px;line-height:1.6}
.form-err{color:#F1B7A0;font-size:13.5px;margin:8px 0 0}
.form-actions{display:grid;grid-template-columns:1fr 2fr;gap:10px;margin-top:16px}
/* Messages */
.pm-for{font-size:13.5px;color:var(--text-soft);margin:2px 0 12px}
.msg{border:1px solid rgba(201,162,74,.3);background:rgba(20,16,9,.4);border-radius:12px;padding:12px 14px;margin-bottom:10px;display:flex;gap:12px}
.msg.hiding{opacity:.55}
.av{width:42px;height:42px;border-radius:50%;border:1px solid var(--line);background:#2A2318;flex:none;display:flex;align-items:flex-end;justify-content:center;color:#6E6047;overflow:hidden}
.msg-b{flex:1;min-width:0}
.msg-h{display:flex;justify-content:space-between;align-items:center;gap:8px}
.msg-h b{font-weight:600}
.msg-h .rel{font-size:13px;color:var(--text-soft)}
.msg-h .badge{font-size:10.5px;padding:1px 7px;margin-left:4px}
.msg-d{font-size:12.5px;color:var(--text-soft);white-space:nowrap}
.msg p{font-size:15px;line-height:1.5;margin:4px 0 0;overflow-wrap:anywhere}
.msg-x{margin-top:6px;background:none;border:0;padding:4px 0;color:var(--text-soft);font-size:12.5px;cursor:pointer;text-decoration:underline;text-underline-offset:3px;min-height:32px}
.undo{display:flex;justify-content:space-between;align-items:center;gap:10px;border:1px dashed rgba(201,162,74,.5);border-radius:12px;padding:8px 12px;margin-bottom:10px;font-size:14px;color:var(--text-soft)}
.undo .btn{min-height:36px;padding:4px 14px}
.pm-empty{color:var(--text-soft);font-size:14px;margin:6px 0 12px}

/* Gentle tribute animations (no motion when reduced motion is set) */
.petal{position:absolute;top:-10px;width:9px;height:12px;border-radius:60% 0 60% 0;background:#F2C7CF;opacity:0;pointer-events:none;animation:petal 2.6s ease-in forwards}
@keyframes petal{0%{opacity:0;transform:translate(0,0) rotate(0)}15%{opacity:.95}100%{opacity:0;transform:translate(var(--dx,20px),150px) rotate(220deg)}}
.tb.glow{animation:lampglow 2.4s ease-out}
@keyframes lampglow{0%{box-shadow:0 0 0 rgba(255,214,140,0)}35%{box-shadow:0 0 28px 6px rgba(255,214,140,.55),inset 0 0 18px rgba(255,214,140,.35)}100%{box-shadow:inset 0 0 0 1px var(--gold-text),0 0 18px rgba(226,198,126,.25)}}
.tb.bow svg{animation:bow 1.6s ease-in-out}
@keyframes bow{0%,100%{transform:none}40%{transform:translateY(3px) scale(.94)}}
@media (prefers-reduced-motion:reduce){.petal{display:none}.tb.glow,.tb.bow svg{animation:none}.tb{transition:none}}

@media (max-width:600px){
  .bottombar{top:calc(66px + var(--safe-t))}
  .pcard,.pcard.v-journey,.pcard.v-add{left:calc(8px + var(--safe-l));right:calc(8px + var(--safe-r));transform:none;width:auto;max-width:none;top:calc(118px + var(--safe-t));max-height:calc(100% - 118px - 44px - var(--safe-t) - var(--safe-b));padding:14px 14px 16px}
  .pc-top{gap:14px}
  .pc-photo{width:118px;height:148px}
  .pcard .pc-zh{font-size:24px}.pc-en{font-size:17px}.pc-years{font-size:15px}
  .trib{gap:6px}
  .tb{padding:9px 2px}.tb b{font-size:13px}.tb i{font-size:11.5px}
  .pc-sec{margin-top:16px}.pc-sec h3{font-size:18px}
  .pc-sec.card-sec em{display:inline}
  .pc-sub{display:block}
  .pc-sec.card-sec .tl-label{display:none}
  .th{height:44px}
  .tl{margin:0 2px}
  .dot small{font-size:10.5px}
  .pj-head h2{font-size:21px}
  .pj-body{flex-direction:column;gap:10px}
  .pc-big{width:100%;height:auto;aspect-ratio:3/2}
  .pj-info h2{font-size:21px}
  .pj-nav{display:none}
  .pj-nav-phone{display:flex!important;gap:8px;margin-top:12px}
  .pj-foot .btn{width:100%}
  .pcard h2.ph-title{font-size:22px}
  .msg{padding:10px 12px}
  .msg-h{align-items:flex-start}
  .foot-note{font-size:11px;right:12px;text-align:center}
}
.pj-nav-phone{display:none}
@media (max-width:600px){.hide-ph{display:none}}
/* Hall Chants · 梵音 (hidden while DM_CONFIG.hallChants is false; music.js adds nothing then) */
.chants-btn{color:var(--gold-text)}
.chants{right:calc(12px + var(--safe-r));top:calc(122px + var(--safe-t));width:min(380px,calc(100vw - 24px));max-height:calc(100vh - 150px);overflow:auto}
.chants h3{font-family:var(--serif);font-weight:400;font-size:16px;margin:12px 0 6px;color:var(--gold-text)}
.chants ul{list-style:none;margin:0;padding:0}
.chants li button{width:100%;text-align:left;min-height:44px;border-radius:10px;border:1px solid rgba(201,162,74,.3);background:rgba(20,16,9,.4);margin-bottom:6px;padding:8px 12px;cursor:pointer}
.chants li button[aria-pressed="true"]{border-color:var(--gold-text);background:rgba(201,162,74,.22)}

/* final-01 QC fixes (layout vs Iris 11-14 / 21-24) */
.v-card .th{filter:saturate(.55) brightness(.72)}
.pj-who{font-style:normal;font-size:12.5px;white-space:nowrap}
.pj-nav .btn{flex:none}
.msg-r{display:flex;align-items:center;gap:10px;flex:none}
.msg-x{margin:0;min-height:28px;padding:2px 0;font-size:12px}
.add-sub{display:flex;justify-content:space-between;align-items:center;gap:8px;flex-wrap:wrap;margin-top:2px}
.add-sub .pc-soft{font-size:14px}
.who-i{display:inline}.who-i+.who-i{margin-left:8px}.who-n{display:block}
@media (max-width:600px){
  .pcard.v-add{top:calc(110px + var(--safe-t))}
  .pj-head h2{font-size:20px}
  .pc-big{aspect-ratio:2/1}
  .pj-info h2{font-size:21px}
  .pj-info p{font-size:13px}
  .pc-sec.j-sec em{display:none}
  .pc-sec.j-sec h3{font-size:17px}
  .msg-r{flex-direction:column;align-items:flex-end;gap:0}
  .msg p{font-size:14px;line-height:1.45}
  .msg{margin-bottom:8px}
  .pm-for{font-size:12.5px;margin-bottom:10px}
  .drop{height:84px}.drop b{font-size:22px}.drop span{font-size:13.5px}
  .add-sub .pc-soft{font-size:12.5px}
  .pv-badge{font-size:11px}
  .segd button{font-size:13px}
  .hintp{font-size:12px;line-height:1.4}
  .who{font-size:13px}.who-i{display:block}.who-i+.who-i{margin-left:0}
  .flabel{margin:10px 0 5px}
  textarea.inp{height:76px;font-size:14px}
  .foot-note{left:8px;right:8px;text-align:center;font-size:10px;bottom:calc(6px + var(--safe-b))}
}
.pj-nav-phone .btn{flex:1}
.form-actions .btn{white-space:nowrap;padding-left:8px;padding-right:8px}
.flabel label{white-space:nowrap}
/* toast above the person card, clear of the top controls; simple card below the hall controls */
.toast{top:auto;bottom:calc(52px + var(--safe-b));z-index:30}
.card{top:calc(122px + var(--safe-t))}
@media (max-width:600px){.card{top:auto}}
.undo .btn{white-space:nowrap;flex:none}
.toast{max-width:calc(100vw - 32px);text-align:center;border-radius:14px}
/* Hall Chants player (01d) */
.chants .track{display:flex;align-items:center;gap:10px;color:var(--gold-text)}
.chants .tk-icon{flex:none;width:30px;height:30px;border-radius:50%;border:1px solid rgba(201,162,74,.5);display:grid;place-items:center;font-size:11px;letter-spacing:-1px}
.chants .tk-name{flex:1;min-width:0;line-height:1.3}
.chants .tk-time{flex:none;font-size:12px;opacity:.75}
.chants .vol{display:flex;align-items:center;gap:12px;margin:12px 2px 4px;font-size:13px;opacity:.9}
.chants .vol input{flex:1;accent-color:#C9A24A;min-height:32px}
.chants .note{font-size:12px;opacity:.75;margin:8px 2px 2px;line-height:1.5}
.chants-btn.is-playing{box-shadow:0 0 0 1px rgba(226,198,126,.7),0 0 14px rgba(226,198,126,.45)}
@media (prefers-reduced-motion:no-preference){.chants-btn.is-playing svg{animation:chantPulse 3.2s ease-in-out infinite}}
@keyframes chantPulse{0%,100%{opacity:1}50%{opacity:.55}}
.chants .tk-name [lang]{display:block;font-size:.88em;opacity:.85;margin-top:1px}
