/* Semantic values live in tokens.css. Wallpaper stays crisp; surfaces carry glass. */
html{background:transparent} /* 根画布不再写纯色：壁纸载入后由下面的规则铺同一张图 */
body{background:transparent;color:var(--ink)}
.ambient{opacity:var(--home-ambient-opacity)}
.glass{box-shadow:var(--surface-shadow);border-color:var(--surface-border)}
.glass::before{border-radius:inherit}
.section-heading h1,.welcome h1{font-family:var(--ui-serif);font-size:var(--page-title-size);font-weight:var(--ui-weight-medium)}
.topbar .brand{font-family:var(--ui-serif);font-weight:var(--ui-weight-medium)}
.topbar .brand small{font-family:var(--ui-sans);letter-spacing:var(--brand-tracking)}
.home .together{background:var(--home-card-fill);border-radius:var(--home-card-radius);padding:var(--home-card-padding)}
.home .today,.home .memorial{border-radius:var(--home-card-radius)}
.home .card-label{font-size:var(--ui-font-12);letter-spacing:var(--ui-tracking-_04)}
.home .anniversaries strong{font-weight:var(--ui-weight-medium)}
.home .welcome{margin-block:var(--ui-space-12) var(--ui-space-24)}
nav.glass{box-shadow:var(--nav-shadow);border:var(--ui-size-1) solid var(--surface-border)}
nav.glass button.active{background:var(--selected-fill);box-shadow:var(--selected-shadow)}
.record-card,.moment-post,.memory-entry,.log-entry{box-shadow:var(--surface-shadow)}
.memory-entry,.log-entry{background:var(--entrance-fill)}
.memory-entry-icon{background:var(--selected-fill)}
.memory-entry-link,.log-entry-link{letter-spacing:var(--ui-tracking-_04)}
.record-tabs,.records-empty{border-radius:var(--ui-radius-24)}
#logs .record-card,#memory .record-card{border-color:var(--surface-border)}
dialog{border-color:var(--surface-border);box-shadow:var(--dialog-shadow);border-radius:var(--dialog-radius)}
dialog .dialog-heading h2{font-family:var(--ui-serif);font-weight:var(--ui-weight-medium)}
#settings{padding:var(--dialog-padding);scroll-padding:var(--dialog-padding)}
#settings fieldset{padding-block:var(--ui-space-12);margin-block:var(--ui-space-12)}
#settings legend{font-family:var(--ui-serif);font-weight:var(--ui-weight-medium)}
.appearance-options{border-block:var(--ui-size-1) solid var(--border)}
.thought-toggle{display:flex;align-items:center;gap:var(--ui-space-8);margin:0;line-height:var(--ui-leading-1_8);font-size:var(--ui-font-11);color:var(--muted)}
.thought-toggle input{width:var(--ui-size-16);height:var(--ui-size-16);padding:0;flex:none;accent-color:var(--accent)}
.chat-view-options{display:flex;justify-content:space-between;align-items:center;gap:var(--ui-space-8);flex-wrap:wrap;padding:0 var(--ui-space-4) var(--ui-space-8);flex:none}
.chat-view-options>span{font-size:var(--ui-font-9);color:var(--muted)}
html:not([data-thoughts=true]) :is(#chat,#work) [data-kind=summary],html:not([data-thoughts=true]) :is(#chat,#work) [data-kind=commentary],html:not([data-thoughts=true]) #chatWork{display:none}
:is(#chat,#work) [data-kind=summary] .message-bubble,:is(#chat,#work) [data-kind=commentary] .message-bubble{border-left:var(--ui-size-2) solid var(--accent);background:var(--summary-fill)}
:is(#chat,#work) .message{gap:var(--chat-avatar-gap);margin-block:var(--chat-message-gap)}
:is(#chat,#work) .message-body{max-width:var(--chat-body-width)}
:is(#chat,#work) .message-label{font-size:var(--chat-meta-size);color:var(--muted);margin:0 var(--ui-space-4) var(--ui-space-6)}
:is(#chat,#work) .message-bubble{padding:var(--chat-bubble-padding-block) var(--chat-bubble-padding-inline);border-radius:var(--chat-bubble-radius);border-start-start-radius:var(--chat-bubble-corner);box-shadow:var(--bubble-shadow);background:var(--assistant-bubble-fill);border-color:var(--bubble-border)}
:is(#chat,#work) .message.user .message-bubble{background:var(--user-bubble-fill);border-start-start-radius:var(--chat-bubble-radius);border-start-end-radius:var(--chat-bubble-corner)}
:is(#chat,#work) .message-content{font-size:var(--chat-font-size);line-height:var(--chat-reading-leading);color:var(--ink);white-space:pre-wrap;overflow-wrap:anywhere}
:is(#chat,#work) .message-actions{display:flex;flex-wrap:wrap;gap:var(--ui-space-10);padding-top:var(--ui-space-6);opacity:var(--chat-actions-opacity)}
:is(#chat,#work) .message-actions button{font-size:var(--chat-meta-size);color:var(--muted)}
:is(#chat,#work) .message-actions button:hover{color:var(--accent)}
:is(#chat,#work) .message-avatar{box-shadow:var(--avatar-shadow);border:var(--ui-size-1) solid var(--surface-border)}
:is(#chatForm,#workForm){border-color:var(--surface-border);border-radius:var(--composer-radius);box-shadow:var(--composer-shadow)}
:is(#chatForm,#workForm) textarea{line-height:var(--ui-leading-1_8)}
:is(#chat,#work) .compose-icon{background:var(--selected-fill);color:var(--accent)}
:is(#chat,#work) #chatSend{background:var(--accent);color:var(--bg)}
:is(#chat,#work) .file-card{border-radius:var(--file-card-radius);padding:var(--ui-space-14);background:var(--file-card-fill)}
.file-card-download{font-size:var(--ui-font-11)}
.chat-code{white-space:normal;max-width:100%;min-width:0;background:var(--code-fill);border-radius:var(--code-radius);margin-block:var(--ui-space-10);padding:var(--ui-space-12)}
.chat-code>small{font-size:var(--ui-font-10);color:var(--muted)}
.chat-code>button{float:right;font-size:var(--ui-font-10);border:0;background:transparent;color:var(--accent)}
.chat-code pre{white-space:pre;overflow-x:auto;max-width:100%;font:var(--code-font-size)/var(--chat-reading-leading) ui-monospace,SFMono-Regular,Consolas,monospace;margin:var(--ui-space-10) 0 0}
dialog.file-viewer{position:fixed;inset:0;width:100%;max-width:var(--file-viewer-max-width);height:100dvh;max-height:100dvh;margin:auto;padding:calc(var(--dialog-padding) + env(safe-area-inset-top,0px)) var(--dialog-padding) calc(var(--dialog-padding) + env(safe-area-inset-bottom,0px));border-radius:0;background:var(--bg)!important;overflow:hidden}
dialog.file-viewer[open]{display:flex;flex-direction:column;gap:var(--ui-space-14)}
.file-viewer-heading{display:flex;justify-content:space-between;gap:var(--ui-space-14);align-items:start;flex:none}
.file-viewer-heading>div{min-width:0}.file-viewer-heading h2{font-size:var(--ui-font-18);line-height:var(--ui-leading-1_8);overflow-wrap:anywhere;margin-top:var(--ui-space-8)}
.file-viewer-heading .icon-button{flex:none;min-width:var(--ui-size-40);min-height:var(--ui-size-40)}
.file-preview{overflow:auto;flex:1;min-height:0;border-block:var(--ui-size-1) solid var(--border);padding-block:var(--ui-space-14);overscroll-behavior:contain}
.file-text-preview{white-space:pre-wrap;overflow-wrap:anywhere;margin:0;font:var(--file-preview-size)/var(--chat-reading-leading) var(--ui-sans);color:var(--ink)}
.file-viewer-actions{display:flex;gap:var(--ui-space-12);flex:none}
.file-viewer-actions button{margin:0;flex:1}
html[data-reduce-glass=true]{--glass-opacity:1!important;--glass:var(--bg);--assistant-bubble-fill:var(--bg);--user-bubble-fill:var(--accent-soft)}
html[data-reduce-glass=true] .glass::before{backdrop-filter:none!important;-webkit-backdrop-filter:none!important;background:var(--bg)!important}
@media(prefers-reduced-transparency:reduce){.glass::before{backdrop-filter:none!important;-webkit-backdrop-filter:none!important;background:var(--bg)!important}}
@media(min-width:375px){.chat-header-title::before,.chat-header-title::after{content:"";position:absolute;top:var(--ecg-top);width:var(--ecg-width);height:var(--ecg-height);background:var(--accent);opacity:var(--ecg-opacity);clip-path:polygon(0 48%,25% 48%,35% 20%,45% 80%,58% 8%,70% 48%,100% 48%,100% 55%,67% 55%,59% 28%,45% 100%,35% 42%,28% 55%,0 55%)}.chat-header-title::before{right:calc(100% + var(--ui-space-8))}.chat-header-title::after{left:calc(100% + var(--ui-space-8));transform:scaleX(-1)}}

:root:not([data-theme=dark]){--glass:rgb(255 250 252 / var(--glass-opacity))}
:root[data-theme=dark]{--glass:rgb(48 37 50 / var(--glass-opacity))}

.file-image-preview{display:block;max-width:100%;height:auto;margin:auto;border-radius:var(--ui-radius-14)}

:is(#chat,#work) .message-arrival{animation:message-arrival var(--bubble-arrival-duration) ease-out backwards;animation-delay:calc(var(--bubble-arrival-index,0) * var(--bubble-arrival-stagger))}
@keyframes message-arrival{from{opacity:0;transform:translateY(var(--bubble-arrival-distance))}to{opacity:1;transform:translateY(0)}}
.thought-toggle{font-size:var(--ui-font-12);padding-block:var(--ui-space-4)}

.shell{z-index:1}
.space-wallpaper{position:fixed;inset:0;z-index:0;pointer-events:none;background:transparent}
/* 2026-10-19 根背景重构：全站唯一壁纸层。固定铺满、内容在其上滚动。 */
#chatWallpaper{display:none!important}
#app,.shell{position:relative;z-index:2}
.space-wallpaper img{width:100%;height:100%;object-fit:cover;display:block;filter:none}
body.has-space-wallpaper .ambient{display:none}
/* 聊天/Work 不再用独立壁纸覆盖全站根壁纸（旧缓存保留，不参与合成） */

/* Paper, quiet rules and an editorial hierarchy, following the supplied references. */
:root:not([data-theme=dark]),:root[data-theme=dark]{--bg:var(--paper-background);--ink:var(--paper-ink);--muted:var(--paper-muted)}
:root:not([data-background=sage]):not([data-background=sky]){--accent:var(--paper-rose);--accent-soft:var(--paper-blush)}
:root:not([data-theme=dark]){--glass:rgb(255 252 248 / var(--glass-opacity));--input:var(--paper-cream)}
body::before{content:"";position:fixed;inset:0;z-index:0;pointer-events:none;background-image:none;opacity:0} /* 纸纹层停用 */
body.has-space-wallpaper::before,body.chat-has-wallpaper::before{display:none}
.ambient{display:none} /* 第二套环境光停用，底光统一由 flow-glow 管理 */
.glass::before{box-shadow:var(--paper-shadow);border-color:var(--paper-rule)}
.topbar .brand-icon{font-weight:var(--ui-weight-medium)}
.topbar .brand{font-size:var(--ui-font-17)}
.topbar .icon-button,.chat-top-actions .chat-icon-button{border-color:transparent;background:transparent}
.home .welcome{position:relative;margin:var(--ui-space-8) 0 var(--paper-section-gap)}
.home .welcome .eyebrow{font-family:Georgia,var(--ui-serif);font-size:var(--ui-font-10);letter-spacing:var(--brand-tracking)}
.home-script{font-family:var(--paper-script-font);font-style:italic;font-size:var(--paper-script-size);font-weight:normal;letter-spacing:-.04em;line-height:var(--ui-leading-1_5);color:var(--accent);margin-top:var(--ui-space-8)}
.home .welcome h1{font-size:var(--ui-font-18);letter-spacing:var(--ui-tracking-_08);margin:0;font-weight:var(--ui-weight-medium)}
.welcome-note{font-family:var(--ui-serif);font-size:var(--ui-font-12);margin-top:var(--ui-space-10);line-height:var(--ui-leading-1_9)}
.home .home-badge{position:absolute;right:0;top:0;border:0;padding:0;font-size:var(--ui-font-9)}
.home .together{border:0;border-block:var(--ui-size-1) solid var(--paper-rule);padding:var(--ui-space-16) 0 var(--ui-space-12);border-radius:0;box-shadow:none}
.home .together::before{display:none}
.home .card-label{font-family:var(--ui-serif);font-size:var(--ui-font-11)}
.home .small-label{font-family:Georgia,var(--ui-serif);font-size:var(--ui-font-9);letter-spacing:var(--brand-tracking)}
.home .pair{margin:var(--ui-space-20) 0;gap:var(--ui-space-18)}
.home .avatar{width:var(--ui-size-64);height:var(--ui-size-64);font-size:var(--ui-font-25);box-shadow:0 0 0 var(--ui-size-3) var(--glass),0 0 0 var(--ui-size-5) var(--paper-rule)}
.home .person h2{font-family:var(--ui-serif);font-weight:var(--ui-weight-medium);font-size:var(--ui-font-14);margin:var(--ui-space-10) 0 var(--ui-space-2)}
.home .person p{font-size:var(--ui-font-10)}
.home .heartbeat .pulse{animation:none;stroke-dasharray:none}
.home .heartbeat{width:var(--ui-size-80)}
.home .heartbeat svg{height:var(--ui-size-34)}
.home .anniversaries{grid-template-columns:1fr 1fr;text-align:left;gap:var(--ui-space-12);padding:0;border:0}
.home .anniversaries>div{padding-block:var(--ui-space-8)}
.home .anniversaries>div+div{border:0}
.home .anniversaries>div:first-child{grid-column:1/-1;display:flex;align-items:baseline;gap:var(--ui-space-18);border-bottom:var(--ui-size-1) solid var(--paper-rule);padding-bottom:var(--ui-space-16)}
.home .anniversaries>div:first-child small{order:2;letter-spacing:var(--ui-tracking-_08);font-size:var(--ui-font-11)}
.home .anniversaries>div:first-child strong{font-family:Georgia,var(--ui-serif);font-style:italic;font-size:var(--ui-font-32);color:var(--accent);font-weight:normal}
.home .anniversaries small{font-size:var(--ui-font-10);margin:0}
.home .anniversaries .date-value{font-family:Georgia,var(--ui-serif);font-size:var(--ui-font-14);line-height:var(--ui-leading-1_9);letter-spacing:var(--ui-tracking-_04)}
.home .footnote{text-align:left;font-size:var(--ui-font-9);margin-top:var(--ui-space-8)}
.home .today{margin-top:0;padding:var(--ui-space-18) 0;border-radius:0;box-shadow:none;border-bottom:var(--ui-size-1) solid var(--paper-rule);gap:var(--ui-space-12)}
.home .today::before{display:none}
.home .status-orbit{width:var(--ui-size-34);height:var(--ui-size-34);border-radius:var(--ui-radius-round);border:var(--ui-size-1) solid var(--paper-rule);background:transparent;font-size:var(--ui-font-20)}
.home .today h2{font-family:var(--ui-serif);font-size:var(--ui-font-13);font-weight:var(--ui-weight-medium)}
.home-paper-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--paper-gap);margin-block:var(--paper-section-gap);align-items:stretch}
.paper-calendar{padding:var(--ui-space-16) var(--ui-space-12);border:var(--ui-size-1) solid var(--paper-rule);border-radius:var(--ui-radius-18);background:var(--paper-fill);box-shadow:var(--paper-shadow);min-width:0}
.paper-heading{display:flex;align-items:center;justify-content:space-between;gap:var(--ui-space-4);color:var(--accent);margin-bottom:var(--ui-space-12)}
.paper-heading h2{font:var(--ui-font-12) Georgia,var(--ui-serif);letter-spacing:var(--ui-tracking-_08)}
.calendar-week,.calendar-days{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:var(--ui-space-3);text-align:center;font:var(--paper-calendar-font)/var(--ui-leading-1_8) Georgia,var(--ui-serif)}
.calendar-week{color:var(--muted);font-size:var(--ui-font-9);margin-bottom:var(--ui-space-4)}
.calendar-days>*{display:grid;place-items:center;min-width:0;min-height:var(--paper-day-size);font-variant-numeric:tabular-nums}
.calendar-days [aria-current=date]{outline:var(--ui-size-1) dashed var(--accent);outline-offset:calc(var(--ui-size-1) * -1);border-radius:var(--ui-radius-round);color:var(--accent);background:var(--selected-fill)}
.calendar-caption{font-size:var(--ui-font-9);text-align:center;margin-top:var(--ui-space-10)}
.paper-note{position:relative;display:flex;flex-direction:column;align-items:flex-start;gap:var(--ui-space-12);text-align:left;padding:var(--ui-space-24) var(--ui-space-16) var(--ui-space-18);color:var(--ink);background:var(--paper-fill);border:var(--ui-size-1) solid var(--paper-rule);border-radius:var(--ui-radius-3);box-shadow:var(--paper-shadow-stack);transform:rotate(1deg);min-width:0}
.paper-tape{position:absolute;top:calc(var(--paper-tape-height) * -.45);left:50%;transform:translateX(-50%) rotate(-4deg);width:var(--paper-tape-width);height:var(--paper-tape-height);background:var(--paper-tape-fill);border-inline:var(--ui-size-1) dashed var(--paper-rule)}
.paper-script{font:italic var(--ui-font-32)/1 var(--paper-script-font);color:var(--accent)}
.paper-note strong{font:var(--ui-font-14)/var(--ui-leading-1_8) var(--ui-serif)}
.paper-note-copy{font:var(--ui-font-12)/var(--ui-leading-2_05) var(--ui-serif);color:var(--muted)}
.paper-note-link{font-size:var(--ui-font-10);color:var(--accent);margin-top:auto;padding-top:var(--ui-space-8);border-top:var(--ui-size-1) solid var(--paper-rule);width:100%;display:flex;justify-content:space-between}
.home .memorial{border-radius:var(--ui-radius-3);padding:var(--ui-space-24);margin-top:var(--ui-space-37);border-block:var(--ui-size-1) dashed var(--paper-rule);background:var(--paper-fill);box-shadow:var(--paper-shadow-stack)}
.home .memorial::before{display:none}
.home .memorial blockquote{background:repeating-linear-gradient(transparent 0 calc(2.15em - var(--ui-size-1)),var(--paper-rule) calc(2.15em - var(--ui-size-1)) 2.15em);line-height:var(--ui-leading-2_15);font-size:var(--ui-font-15);margin:var(--ui-space-18) 0}
.home .home-footer{font-family:var(--ui-serif);font-size:var(--ui-font-10);margin-top:var(--ui-space-37)}
nav.glass{box-shadow:var(--nav-shadow)!important;border-color:var(--paper-rule)!important}
nav.glass::before{box-shadow:none}
nav.glass button{font-family:var(--ui-serif);letter-spacing:var(--ui-tracking-_08)}
nav.glass button.active{background:var(--selected-fill);color:var(--accent)}
nav.glass button svg{filter:none}
:is(#chat,#work) .message-bubble{font-family:var(--ui-serif)}
:is(#chat,#work) .message-bubble::before{background:transparent;box-shadow:inset 0 var(--ui-size-1) 0 color-mix(in srgb,var(--bg) 65%,transparent);border-color:var(--paper-rule)}
:is(#chat,#work) .message-content{font-family:var(--ui-serif);letter-spacing:var(--ui-tracking-_015)}
:is(#chat,#work) .message-label{font-family:Georgia,var(--ui-sans);font-size:var(--chat-meta-size);line-height:var(--ui-leading-1_8);margin-bottom:var(--ui-space-6)}
:is(#chat,#work) .message-actions{gap:0;padding:var(--ui-space-2) 0 0;align-items:center}
:is(#chat,#work) .message-actions .message-action-icon{display:grid;place-items:center;min-width:var(--message-action-size);min-height:var(--message-action-size);padding:0;border-radius:var(--ui-radius-round);color:var(--muted)}
:is(#chat,#work) .message-action-icon svg{width:var(--message-action-icon-size);height:var(--message-action-icon-size);fill:none;stroke:currentColor;stroke-width:1.25;stroke-linecap:round;stroke-linejoin:round}
:is(#chat,#work) .message-action-icon:hover,:is(#chat,#work) .message-action-icon:focus-visible{background:var(--selected-fill);color:var(--accent)}
:is(#chat,#work) .message-action-icon[aria-pressed=true]{color:var(--accent);background:var(--selected-fill)}
:is(#chat,#work) .message-action-icon[aria-pressed=true] svg{fill:var(--accent-soft)}
:is(#chat,#work) .message.user .message-actions{justify-content:flex-end}
:is(#chat,#work) .file-card{background:var(--file-card-fill);border:var(--ui-size-1) solid var(--paper-rule);box-shadow:none}
:is(#chat,#work) .chat-compose::before{box-shadow:var(--composer-shadow)}
:is(#chat,#work) .chat-compose textarea::placeholder{font-family:var(--ui-serif);font-style:italic;color:var(--muted)}
:is(#chat,#work) .chat-view-options{border-bottom:var(--ui-size-1) solid var(--paper-rule);padding-bottom:var(--ui-space-8)}
.log-entry,.memory-entry{border:var(--ui-size-1) solid var(--paper-rule);background:var(--entrance-fill)}
.log-entry strong,.memory-entry strong,.record-title{font-family:var(--ui-serif);font-weight:var(--ui-weight-medium)}
#logs .record-card,#memory .record-card,.moment-post{border:var(--ui-size-1) solid var(--paper-rule);box-shadow:var(--paper-shadow)}
@media(max-width:360px){.paper-note{padding-inline:var(--ui-space-12)}.paper-calendar{padding-inline:var(--ui-space-8)}.home .small-label{font-size:var(--ui-font-9);letter-spacing:var(--ui-tracking-_04)}}
/* Keep the journal doors near the first screen on a phone. */
@media(max-width:550px){
 .home .welcome{margin-bottom:var(--ui-space-18)}
 .home .home-script{font-size:var(--ui-font-32);margin-top:var(--ui-space-4)}
 .home .welcome h1{font-size:var(--ui-font-16)}
 .home .welcome-note{margin-top:var(--ui-space-6)}
 .home .together{padding-top:var(--ui-space-12)}
 .home .pair{margin:var(--ui-space-14) 0}
 .home .person p{display:none}
 .home .avatar{width:var(--ui-size-40);height:var(--ui-size-40);font-size:var(--ui-font-20)}
 .home .person h2{font-size:var(--ui-font-12);margin-top:var(--ui-space-6)}
 .home .anniversaries>div:first-child{padding:var(--ui-space-4) 0 var(--ui-space-10)}
 .home .anniversaries>div:first-child strong[data-confirmed=false]{font-size:var(--ui-font-25)}
 .home .today{padding-block:var(--ui-space-12)}
 .home .home-paper-grid{margin-block:var(--ui-space-24)}
}

/* Voice content is a message, with native audio decoding behind a custom control. */
:is(#chat,#work) .voice-message{display:block;min-width:0;width:fit-content;max-width:100%;-webkit-touch-callout:none;user-select:none;-webkit-user-select:none}
:is(#chat,#work) .voice-message .voice-audio{display:none}
:is(#chat,#work) .voice-play{display:inline-flex;align-items:center;justify-content:flex-start;gap:var(--ui-space-9);width:calc(var(--voice-bubble-min) + var(--voice-seconds,0)*var(--voice-bubble-step));max-width:100%;min-height:var(--ui-size-26);border:0;background:transparent;color:var(--ink);padding:1px 0;font-size:var(--chat-font-size);touch-action:pan-y;border-radius:var(--voice-bubble-radius)}
:is(#chat,#work) .voice-time{font:var(--voice-time-size)/1 var(--ui-sans);font-variant-numeric:tabular-nums;color:var(--ink);opacity:.78;white-space:nowrap;min-width:var(--ui-size-30);text-align:right}
.voice-play-icon{width:var(--voice-play-icon);height:var(--voice-play-icon);flex:none;background:currentColor;clip-path:polygon(18% 0,100% 50%,18% 100%)}
.is-playing .voice-play-icon{clip-path:polygon(10% 0,40% 0,40% 100%,10% 100%,10% 0,60% 0,90% 0,90% 100%,60% 100%,60% 0)}
.voice-play-wave{display:flex;align-items:center;justify-content:flex-start;gap:var(--ui-space-3);width:var(--voice-play-wave-width);height:var(--ui-size-16)}
.voice-play-wave i{width:var(--voice-wave-width);height:36%;background:currentColor;opacity:.75;border-radius:var(--ui-radius-3)}.voice-play-wave::after{content:'';width:var(--voice-wave-width);height:54%;background:currentColor;opacity:.75;border-radius:var(--ui-radius-3)}
.voice-play-wave i:nth-child(2){height:62%}.voice-play-wave i:nth-child(3){height:100%}
.is-playing .voice-play-wave i{animation:voice-play var(--voice-wave-duration) ease-in-out infinite alternate}.is-playing .voice-play-wave i:nth-child(2){animation-delay:-.2s}.is-playing .voice-play-wave i:nth-child(3){animation-delay:-.4s}
@keyframes voice-play{from{transform:scaleY(.4)}to{transform:scaleY(1)}}
.voice-error:empty{display:none}.voice-error{display:block;font-size:var(--ui-font-11);color:var(--muted);max-width:var(--ui-size-230);line-height:var(--ui-leading-1_8);user-select:text}
#chatVoice{touch-action:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}
:is(#chat,#work) .voice-recorder{position:absolute;bottom:calc(100% + var(--ui-space-12));left:0;width:100%;padding:var(--voice-recorder-padding);border:var(--ui-size-1) solid var(--surface-border);border-radius:var(--ui-radius-24);background:var(--bg);color:var(--accent);box-shadow:var(--voice-recorder-shadow);text-align:center;z-index:4;pointer-events:none}
.voice-recorder strong{font:var(--ui-font-20)/var(--ui-leading-1_8) Georgia,var(--ui-sans);font-variant-numeric:tabular-nums}.voice-recorder p{font-size:var(--ui-font-12);margin-top:var(--ui-space-6)}
.voice-record-wave{display:flex;align-items:center;justify-content:center;gap:var(--ui-space-4);height:var(--voice-wave-height);margin:var(--voice-recorder-gap) auto}
.voice-record-wave i{display:block;width:var(--voice-wave-width);height:calc(var(--voice-wave-min) + var(--voice-amplitude,0)*(var(--voice-wave-height) - var(--voice-wave-min)));border-radius:var(--ui-radius-3);background:currentColor;flex:none}
.voice-recorder[data-cancel=true]{color:var(--voice-cancel-color)}.voice-menu h2{font-size:var(--ui-font-18)}
@media(prefers-reduced-motion:reduce){.is-playing .voice-play-wave i{animation:none}}

/* A single adjustable material layer, so high transparency reveals the wallpaper. */
.log-entry.glass{background:transparent}
.log-entry.glass::before{background:var(--entrance-fill)}
html[data-reduce-glass=true]{--paper-fill:var(--bg);--record-card-fill:var(--bg);--record-tool-fill:var(--bg)}
@media(prefers-reduced-transparency:reduce){:root{--glass-opacity:1!important;--paper-fill:var(--bg);--record-card-fill:var(--bg);--record-tool-fill:var(--bg)}}

/* 只有在没有任何空间壁纸时，才用纯色兜底；一旦选了壁纸，全站只剩那一张图。
   这样既满足「唯一根壁纸」，也不会在首次打开时白屏。 */
body:not(.has-space-wallpaper){background:var(--bg)}
body.has-space-wallpaper,body.has-space-wallpaper html{background:transparent}


/* ===== 2026-10-19 修正 A：底部导航不再是实心奶白块，改成透壁纸的玻璃 ===== */
nav{
  background:rgba(255,255,255,.26);
  border:1px solid rgba(255,255,255,.42);
  -webkit-backdrop-filter:blur(20px) saturate(165%);
  backdrop-filter:blur(20px) saturate(165%);
  box-shadow:0 10px 28px rgba(20,12,18,.14);
}
:root[data-theme=dark] nav{
  background:rgba(22,17,24,.34);
  border-color:rgba(255,255,255,.16);
  box-shadow:0 10px 28px rgba(0,0,0,.32);
}
nav button{text-shadow:0 1px 2px rgba(20,12,18,.30)}
:root[data-theme=dark] nav button{text-shadow:0 1px 3px rgba(0,0,0,.55)}

/* ===== 根画布与壁纸同源：解决「上方白底、下方图片」的分区 =====
   iOS PWA 里状态栏/安全区那一条属于根画布，只有把同一张图铺到 html 上，
   才不会在壁纸上方露出一条浏览器默认白底。
   仍然只有一个壁纸来源：chat-render.js 把同一份 dataURL 同时写给 #spaceWallpaper 与 html。 */
html[data-space-wallpaper="1"]{
  background-image:var(--space-wallpaper-image);
  background-size:cover;
  background-position:center center;
  background-repeat:no-repeat;
  /* 不用 /* 去掉：iOS 上失效 */ —— iOS 上会失效且掉帧。
     根画布本身不滚动（滚动发生在面板内部），所以这张图天然固定。 */
}
/* 顶部栏与各面板背景统一透明，让壁纸连续 */
.topbar,.shell,.panel,#app,.chat-heading,.section-heading{background:transparent}

/* ===== iOS 沉浸式：防回弹露底 + 动态视口高度 ===== */
html,body{overscroll-behavior:none}
.space-wallpaper{
  height:100vh;
  height:100dvh;   /* 地址栏/工具栏伸缩时不留断层 */
  width:100vw;
}
.space-wallpaper img{
  width:100%;
  height:100%;
  object-fit:cover;
  object-position:center center;
}
/* 顶部与底部系统区：内容让开，壁纸透进去 */
.topbar{padding-top:calc(20px + env(safe-area-inset-top,0px))}

/* ===== 输入控件统一 16px：iOS 聚焦时不再自动放大页面 ===== */
input,textarea,select,.chat-toolbar input,.chat-toolbar select{font-size:16px!important}

/* 页面固定：不可缩放（配合 theme-init.js 的事件拦截，Safari 才真正生效） */
html,body{touch-action:manipulation;-webkit-text-size-adjust:100%;text-size-adjust:100%}

/* 日志 / 记忆页与其它四页对齐：容器透明，壁纸与底光同源 */
#logs,#memory,#logs .panel,#memory .panel,#logs .shell,#memory .shell{background:transparent}

/* ===== 底部黑边修正（2026-10-19）=====
   原因：壁纸层只铺到 100dvh，iPhone 底部 Home 指示条那一条安全区在层外，
   露出的是画布默认色（深色主题下就是黑）。把壁纸层向四边各扩一个安全区即可盖住。 */
.space-wallpaper{
  inset:calc(-1 * env(safe-area-inset-top,0px))
        calc(-1 * env(safe-area-inset-right,0px))
        calc(-1 * env(safe-area-inset-bottom,0px))
        calc(-1 * env(safe-area-inset-left,0px));
  height:auto;
  min-height:100dvh;
}

/* ===== iOS 26 PWA 已知缺陷的兜底（按用户提供的社区经验）=====
   WebKit bug 301108：standalone 下 viewport-fit=cover 失效，
   height:100% 会算成“可视高度减安全区”，于是底部/顶部露出画布色。
   对策：普通浏览用 100%，安装到主屏（standalone）时改用 100vh 绕过。 */
/* 曾经把页面高度锁死成 100%，结果页面自己变成滚动容器，Work 的吸顶标题被顶到安全区。
   改回「至少一屏」：滚动仍由各页自己的面板负责，六页规则一致，不给 Work 开例外。 */
html,body{min-height:100%}
@media (display-mode: standalone){
  html,body{min-height:100vh}   /* standalone 下用 vh 绕开 iOS 的减法算法，但仍不锁死高度 */
}
/* 底部安全区：iOS 26 有时把 env() 报成 0，给 20px 兜底，避免贴死 Home 条 */
nav{bottom:max(20px, env(safe-area-inset-bottom, 0px))}
.panel{padding-bottom:calc(var(--nav-h) + var(--nav-offset) + max(24px, env(safe-area-inset-bottom, 0px)))}
