/* 志仝道合共用样式表。企业家端 index.html 与管理端 admin.html 共用同一份，
   两端令牌、控件与暗色语义色必须一致，不允许各自复制一份后各改各的。
   颜色一律 hex/rgba，禁用 oklch 与 color-mix：微信安卓 XWeb 内核不支持，会整页掉色。 */
/* 蓝灰主题令牌 —— 明亮。颜色一律 hex/rgba，禁用 oklch 与 color-mix：微信安卓 XWeb 内核不支持，会整页掉色 */
[data-theme=light]{color-scheme:light;--nav:#192532;--nav-fg:#e7ecf0;--nav-mut:#9ea5ad;--nav-hover:rgba(255,255,255,.07);--nav-active:rgba(255,255,255,.13);--nav-line:rgba(255,255,255,.1);--bg:#f5f7fa;--surface:#fff;--sunken:#edf0f3;--fg:#181e24;--muted:#636a71;--border:#dee2e5;--accent:#245f8c;--accent-d:#064e7c;--on-accent:#fcfcfc;--accent-soft:rgba(36,95,140,.1);--scrim:rgba(15,23,31,.45);--ring:rgba(36,95,140,.18);--sh-1:0 1px 2px rgba(15,23,31,.07);--sh-2:0 2px 6px rgba(15,23,31,.08),0 8px 24px rgba(15,23,31,.06);--danger:#b24039;--danger-soft:rgba(178,64,57,.1);--danger-line:rgba(178,64,57,.32);--ok:#349d62;--ok-t:#0b703f;--ok-soft:rgba(52,157,98,.13);--warn:#c0851f;--warn-t:#805300;--warn-soft:rgba(192,133,31,.14)}
/* 暗色。语义色不能与明亮共用：设计稿的 #b24039 在暗色卡片上对比度仅 2.25:1，正文不可读，故整体提亮 */
[data-theme=dark]{color-scheme:dark;--nav:#0a0f14;--nav-fg:#e1e5ea;--nav-mut:#8d9399;--nav-hover:rgba(255,255,255,.07);--nav-active:rgba(255,255,255,.13);--nav-line:rgba(255,255,255,.1);--bg:#12171c;--surface:#1a2026;--sunken:#232a30;--fg:#e4e8ed;--muted:#969ca3;--border:rgba(255,255,255,.11);--accent:#4f8dcc;--accent-d:#357bbe;--on-accent:#050c13;--accent-soft:rgba(79,141,204,.14);--scrim:rgba(0,0,0,.58);--ring:rgba(79,141,204,.22);--sh-1:0 1px 2px rgba(0,0,0,.32);--sh-2:0 2px 6px rgba(0,0,0,.34),0 10px 28px rgba(0,0,0,.3);--danger:#eb776c;--danger-soft:rgba(235,119,108,.13);--danger-line:rgba(235,119,108,.34);--ok:#59c886;--ok-t:#59c886;--ok-soft:rgba(89,200,134,.15);--warn:#e4b750;--warn-t:#e4b750;--warn-soft:rgba(228,183,80,.15)}
/* 圆角谱系：9 小控件 / 12 卡片 / 16 输入区。字体为单一无衬线家族，靠字重分层 */
:root{--r:12px;--r-sm:9px;--r-lg:16px;--font:"PingFang SC","Hiragino Sans GB","Microsoft YaHei",-apple-system,BlinkMacSystemFont,"Segoe UI",system-ui,sans-serif}
/* 局部间距层级。只描述「相邻元素之间」，不改卡片内边距与视觉语言，两端共用同一套刻度：
   1 同一语义单元内的两行文字（标题—副文本）/ 2 说明与控件 / 3 控件组与内容块 / 4 面板内的分区 */
:root{--sp-1:5px;--sp-2:9px;--sp-3:13px;--sp-4:18px}
/* 字阶 7 档：1 极小标注 / 2 辅助说明 / 3 界面正文 / 4 强调正文与分节标题 / 5 页面与弹窗标题 / 6 场景主标题 / 7 品牌与指标数字。
   容器内字形（.brand-mark/.side-mark/.expert-avatar/.expert-photo/.mini-avatar/.welcome .seal）按容器等比取值，不是文本层级，不纳入字阶。 */
:root{--fs-1:11px;--fs-2:12px;--fs-3:13px;--fs-4:15px;--fs-5:18px;--fs-6:22px;--fs-7:26px}
/* 控件高度 4 档：sm 次级与筛选按钮 / 默认表单控件 / tap 恒定触控热区 / lg 主按钮与侧栏主入口。
   手机端把 sm 与默认档整体抬到 44，取代此前散落在断点里的逐条 min-height 覆盖。 */
:root{--ctl-sm:36px;--ctl:40px;--tap:44px;--ctl-lg:48px}
/* 顶栏高度：设置页签的吸顶 top 必须等于它，用同一个令牌保证两处不会各改各的 */
:root{--header-h:64px}
/* 圆角谱系补齐两端：xs 徽标与进度条 / sm 小控件 / 默认卡片 / lg 输入区、弹窗与登录卡 / pill 胶囊。50% 是正圆，不属于本谱系 */
:root{--r-xs:6px;--r-xl:22px;--r-2xl:26px;--r-pill:999px}
/* 行高 3 档：紧凑（单行标题与表格）/ 默认 / 宽松（长正文与对话气泡） */
:root{--lh-tight:1.5;--lh:1.65;--lh-loose:1.75}
/* 动效 2 档：1 控件微交互 / 2 层进出（侧栏、遮罩、底部抽屉）。reduce-motion 仍整体压到 .01ms */
:root{--dur-1:.18s;--dur-2:.22s}
/* 层叠顺序：吸顶子层 < 吸顶头 < 遮罩 < 侧栏 < 安装条 < 弹窗 < 提示。数值本身不重要，相对顺序是契约 */
:root{--z-sticky-sub:4;--z-sticky:5;--z-backdrop:11;--z-drawer:12;--z-banner:25;--z-modal:30;--z-toast:40}
/* 同类容器内边距：card 用于资料/名单/邀请/洞察/事件/指标等并列卡片，panel 用于设置面板与快捷分享。手机端整体收紧一档 */
:root{--pad-card:14px;--pad-panel:18px}
/* 禁用态透明度，此前 .55 与 .62 两个值并存 */
:root{--op-disabled:.55}
@media(max-width:700px){:root{--ctl-sm:44px;--ctl:44px;--pad-card:12px;--pad-panel:13px}}
*{box-sizing:border-box}
/* 图标：24 网格 / 1.75 描边 / 圆角端点，颜色随文字。sprite 内嵌，不引入外部图标依赖 */
.sprite{position:absolute;width:0;height:0;overflow:hidden}
.ic{width:18px;height:18px;flex:none;stroke:currentColor;fill:none;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}
.ic-sm{width:15px;height:15px}.ic-lg{width:20px;height:20px}
/* 带图标的按钮统一为横向排布；纯图标按钮居中 */
.about-nav,.invite-nav,.install-nav,.settings-nav,.voice-toggle,.action,.small-btn,.share-filter,.settings-tabs .settings-tab,.primary,.secondary,.panel-head-actions a,.panel-head-actions button{display:inline-flex;align-items:center;gap:6px}
.settings-tabs .settings-tab,.primary,.secondary{justify-content:center}
/* 侧栏各辅助入口统一「图标 + 文字」左对齐：漏掉任何一项都会出现该项图标与文字不齐的错位（about 曾漏掉） */
.about-nav,.invite-nav,.install-nav,.settings-nav{justify-content:flex-start}
.menu,.send,.close{display:grid;place-items:center}
html,body{height:100%;margin:0;font-family:var(--font);color:var(--fg);background:var(--bg);-webkit-text-size-adjust:100%}button,input,textarea,select{font:inherit;color:inherit}button{cursor:pointer}button,summary,label{-webkit-tap-highlight-color:transparent}.hidden{display:none!important}
/* 登录卡两端都垂直居中。用 margin:auto 而不是 align-items:center：后者在内容高于视口时会裁掉顶部，
   小屏、软键盘顶起视口和横屏都会踩到。父级自身滚动并避让上下安全区。 */
.auth{min-height:100%;display:flex;overflow:auto;-webkit-overflow-scrolling:touch;padding:calc(28px + env(safe-area-inset-top)) 20px calc(28px + env(safe-area-inset-bottom));background:var(--bg)}
.theme-toggle{min-height:var(--tap);display:inline-flex;align-items:center;justify-content:center;gap:6px;border:1px solid var(--border);border-radius:var(--r-pill);background:var(--surface);color:var(--muted);padding:0 13px;font-size:var(--fs-2)}.theme-toggle[aria-checked=true]{border-color:var(--accent);background:var(--accent-soft);color:var(--accent)}.auth-card .theme-toggle{position:absolute;top:14px;right:14px}
.auth-card{position:relative;width:min(100%,440px);margin:auto;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg);padding:28px 24px;box-shadow:var(--sh-2)}.brand-mark{width:52px;height:52px;border-radius:var(--r-lg);background:var(--accent);color:var(--on-accent);display:grid;place-items:center;font-size:26px;font-weight:600;margin-bottom:18px}
h1{font-size:var(--fs-7);font-weight:600;letter-spacing:-.01em;margin:0 0 8px}.lead{color:var(--muted);line-height:var(--lh-loose);margin:0 0 20px;font-size:var(--fs-4)}.event-banner{padding:11px 13px;border-radius:var(--r);background:var(--accent-soft);color:var(--accent);font-size:var(--fs-3);margin-bottom:15px}
.tabs{display:flex;gap:3px;padding:3px;margin-bottom:16px;border-radius:var(--r);background:var(--sunken)}.tab{flex:1;min-height:var(--ctl);border:0;border-radius:var(--r-sm);background:none;padding:0 10px;color:var(--muted)}.tab.active{background:var(--surface);color:var(--fg);font-weight:600;box-shadow:var(--sh-1)}
.field{margin:12px 0}.field label{font-size:var(--fs-3);color:var(--muted);display:block;margin-bottom:6px}.field input,.field select{width:100%;min-height:var(--ctl-lg);padding:12px 13px;border:1px solid var(--border);border-radius:var(--r-sm);background:var(--surface);color:var(--fg);outline:none}.field input:focus,.field select:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--ring)}.field input[readonly]{background:var(--sunken);color:var(--muted)}
.code-row{display:grid;grid-template-columns:1fr 118px;gap:8px}.region{display:grid;grid-template-columns:1fr 1fr;gap:10px}.primary,.secondary{min-height:var(--ctl-lg);border-radius:var(--r);padding:12px;font-weight:600}.primary{width:100%;border:0;background:var(--accent);color:var(--on-accent);box-shadow:var(--sh-1)}.primary:active{transform:translateY(1px)}.secondary{border:1px solid var(--border);background:var(--surface);color:var(--accent)}button:disabled{opacity:var(--op-disabled)}.form-error{color:var(--danger);font-size:var(--fs-3);min-height:20px;margin:8px 0 0}.hint{font-size:var(--fs-2);color:var(--muted);line-height:var(--lh)}
/* 骨架固定视口：网格项与弹性项必须显式 min-height:0，否则内部 overflow 容器失效、长对话会把侧栏撑到整页高 */
.app{height:100%;display:grid;grid-template-columns:260px minmax(0,1fr);overflow:hidden;background:var(--bg)}.sidebar{min-width:0;min-height:0;padding:16px 12px;display:flex;flex-direction:column;background:var(--nav);color:var(--nav-fg)}.sidebar-backdrop{display:none}.side-brand{display:flex;align-items:center;gap:11px;padding:0 6px 16px}.side-mark{width:40px;height:40px;flex:none;border-radius:var(--r);background:var(--accent);color:var(--on-accent);display:grid;place-items:center;font-size:20px;font-weight:600}.side-brand strong{font-size:var(--fs-4);font-weight:600}.side-brand small{display:block;color:var(--nav-mut);margin-top:2px;font-size:var(--fs-2)}.about-nav,.invite-nav,.install-nav,.settings-nav{width:100%;min-height:var(--tap);border:0;border-top:1px solid var(--nav-line);background:transparent;color:var(--nav-fg);padding:11px 7px;text-align:left;font-weight:600;font-size:var(--fs-3)}/* 「关于」常驻且永远排在第一位，其后各项的分隔线一律去掉，避免出现多条横线 */.about-nav~.invite-nav,.about-nav~.install-nav,.about-nav~.settings-nav{border-top:0}.settings-nav.active{background:var(--nav-active);border-radius:var(--r-sm);border-top-color:transparent}
/* 品牌置顶、辅助功能置底：中间这块弹性占位把两组推到侧栏两端，企业家日常只用对话，辅助入口不抢注意力 */
.side-gap{flex:1;min-height:var(--sp-4)}
/* 辅助功能组只在组顶部留一条分隔线，组内各项不再各自画线，避免出现多条横线 */
.side-aux{flex:none;display:flex;flex-direction:column;border-top:1px solid var(--nav-line)}
.side-aux>.about-nav,.side-aux>.invite-nav,.side-aux>.install-nav,.side-aux>.settings-nav{border-top:0}.nav-theme{width:100%;min-height:var(--tap);display:flex;align-items:center;gap:10px;margin-top:6px;border:0;border-radius:var(--r-sm);background:transparent;color:var(--nav-fg);padding:0 7px;font-size:var(--fs-3);font-weight:400;text-align:left}.nav-theme .theme-label{flex:1}
/* 标准设置行：整行不加粗、不加选中底色，状态只由右侧独立开关表达 */
.switch-track{flex:none;position:relative;width:40px;height:22px;border-radius:var(--r-pill);background:rgba(255,255,255,.18);transition:background var(--dur-1)}.switch-dot{position:absolute;top:3px;left:3px;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.3);transition:transform var(--dur-1)}[aria-checked=true]>.switch-track{background:var(--accent)}[aria-checked=true]>.switch-track>.switch-dot{transform:translateX(18px)}.profile{border-top:1px solid var(--nav-line);padding:12px 6px 0;margin-top:4px;font-size:var(--fs-3)}.profile-name{font-weight:600}.profile-meta{color:var(--nav-mut);margin-top:3px;font-size:var(--fs-2)}.logout{width:100%;min-height:var(--tap);touch-action:manipulation;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none;display:flex;align-items:center;border:0;border-radius:var(--r-sm);background:none;color:var(--nav-mut);padding:7px 0;text-align:left;-webkit-tap-highlight-color:transparent}.logout:disabled{opacity:var(--op-disabled)}
.main{min-width:0;min-height:0;height:100%}.workspace{height:100%;min-height:0;min-width:0}.chat-workspace{display:flex;flex-direction:column}.header{height:var(--header-h);flex:none;padding:10px 18px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:11px;background:var(--surface)}.menu{display:none;border:0;background:none;color:var(--muted)}.expert-avatar{width:38px;height:38px;flex:none;border-radius:50%;background:var(--accent);color:var(--on-accent);display:grid;place-items:center;font-size:17px;font-weight:600}.expert-info{flex:1;min-width:0}.expert-info strong{font-size:var(--fs-4);font-weight:600}.expert-info small{display:block;color:var(--muted);margin-top:2px;font-size:var(--fs-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.voice-toggle{min-height:var(--ctl);flex:none;border:1px solid var(--border);background:var(--surface);border-radius:var(--r-sm);padding:0 11px;color:var(--muted);font-size:var(--fs-3)}
.messages{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;position:relative;padding:24px clamp(14px,5vw,56px);background:var(--bg)}.welcome{max-width:560px;margin:8vh auto 0;text-align:center}.welcome .seal{width:66px;height:66px;margin:auto;border:1px solid var(--border);background:var(--surface);color:var(--accent);border-radius:50%;display:grid;place-items:center;font-size:30px;font-weight:600;box-shadow:var(--sh-1)}.welcome h2{font-size:var(--fs-6);font-weight:600;letter-spacing:-.01em}.welcome p{color:var(--muted);line-height:var(--lh-loose)}.tips{display:grid;gap:9px;margin-top:24px}.tip{min-height:var(--ctl-lg);text-align:left;border:1px solid var(--border);background:var(--surface);border-radius:var(--r);padding:12px 14px;color:var(--fg);box-shadow:var(--sh-1)}.message{display:flex;gap:9px;margin:0 auto 20px;max-width:680px}.message.user{flex-direction:row-reverse}.mini-avatar{width:32px;height:32px;border-radius:50%;display:grid;place-items:center;flex:0 0 auto;background:var(--accent);color:var(--on-accent);font-size:14px;font-weight:600}.message.user .mini-avatar{background:var(--sunken);color:var(--muted)}.bubble-wrap{max-width:82%;min-width:0}.bubble{padding:12px 15px;border-radius:4px var(--r-lg) var(--r-lg);background:var(--surface);border:1px solid var(--border);box-shadow:var(--sh-1);line-height:var(--lh-loose);white-space:pre-wrap;word-break:break-word}.message.user .bubble{border:0;border-radius:var(--r-lg) 4px var(--r-lg) var(--r-lg);background:var(--accent);color:var(--on-accent)}.stream-status{min-height:18px;margin-top:5px;color:var(--accent);font-size:var(--fs-2)}
/* 回答完成后状态清空，:empty 收掉整行，否则气泡下方留一条 18px 空白。
   .actions 的负外边距抵掉 44px 触控框的大部分视觉留白，让「听回答」贴近气泡：
框高 44px、内容行高 15px（.ic-sm 图标），align-items:center 上下各留 14.5px，
上移 12px 后可见间距约 2.5px，图标与文字仍在气泡外、不遮挡内容，热区保持 44px */
.stream-status:empty{display:none}.actions{display:flex;gap:4px;margin:-12px 0 -4px -8px}.action{min-height:var(--tap);display:inline-flex;align-items:center;border:0;background:none;padding:0 8px;color:var(--muted);font-size:var(--fs-2)}.composer{flex:none;padding:12px clamp(14px,5vw,56px) calc(12px + env(safe-area-inset-bottom));border-top:1px solid var(--border);background:var(--surface)}.composer-box{max-width:680px;margin:auto;border:1px solid var(--border);border-radius:var(--r-lg);display:flex;align-items:flex-end;gap:6px;padding:6px 7px;background:var(--surface);box-shadow:var(--sh-2)}.composer-box:focus-within{border-color:var(--accent)}.composer textarea{flex:1;min-width:0;resize:none;border:0;outline:0;min-height:var(--ctl);max-height:120px;padding:10px 7px;background:transparent;line-height:var(--lh-tight)}.send{width:var(--ctl);height:var(--ctl);flex:0 0 auto;border:0;border-radius:var(--r-sm);background:var(--accent);color:var(--on-accent)}.send:disabled{background:var(--sunken);color:var(--muted)}.notice{max-width:680px;margin:5px auto 0;color:var(--muted);font-size:var(--fs-1);text-align:center}
.asr-retry{display:block;margin:8px auto 0;border:1px solid var(--border);border-radius:var(--r-sm);background:var(--surface);color:var(--accent);padding:8px 13px;font-size:var(--fs-2)}.asr-retry:disabled{opacity:var(--op-disabled)}.modal{position:fixed;inset:0;background:var(--scrim);z-index:var(--z-modal);display:grid;place-items:center;padding:18px}.modal-card{width:min(100%,520px);max-height:88vh;overflow:auto;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg);padding:22px;box-shadow:var(--sh-2)}.modal-head{display:flex;align-items:center;justify-content:space-between}.modal-head h2{margin:0;font-size:var(--fs-5);font-weight:600}.close{border:0;background:none;color:var(--muted)}.install-steps{padding-left:22px;color:var(--muted);line-height:var(--lh-loose)}.install-note{padding:11px 13px;border-radius:var(--r-sm);background:var(--accent-soft);color:var(--accent);font-size:var(--fs-3);line-height:var(--lh)}.about-intro{margin:var(--sp-3) 0 0;color:var(--fg);font-size:var(--fs-3);line-height:var(--lh-loose)}.about-list{margin:var(--sp-3) 0 0}.about-list dt{margin-top:var(--sp-3);color:var(--accent);font-size:var(--fs-2);font-weight:600}.about-list dt:first-child{margin-top:0}.about-list dd{margin:var(--sp-1) 0 0;color:var(--muted);font-size:var(--fs-3);line-height:var(--lh-loose)}.auth-about{margin:var(--sp-3) 0 0;color:var(--muted);font-size:var(--fs-1);line-height:var(--lh-loose);text-align:center}.install-banner{display:none}.quick-share{margin-top:16px;border:1px solid var(--border);border-radius:var(--r);padding:var(--pad-panel);text-align:center;background:var(--surface)}.quick-state{padding:28px 8px;color:var(--muted)}.quick-state button{display:block;margin:12px auto 0}.share-qr{display:block;width:min(72vw,260px);height:auto;margin:0 auto 12px;border-radius:var(--r-sm);background:#fff}.share-expiry{font-size:var(--fs-2);color:var(--muted);margin:6px 0 0;line-height:var(--lh-loose)}.panel-head-actions{display:flex;gap:6px;flex-wrap:wrap;flex:none}.panel-head-actions a,.panel-head-actions button{min-height:var(--ctl);border:1px solid var(--border);background:var(--surface);color:var(--accent);border-radius:var(--r-sm);padding:8px 12px;text-decoration:none;font-size:var(--fs-3);font-weight:600}.share-form{display:grid;gap:10px;margin-top:0;padding-bottom:0}.share-form label{font-size:var(--fs-2);color:var(--muted)}.share-form select,.share-form input{width:100%;min-height:var(--tap);margin-top:6px;padding:10px 12px;border:1px solid var(--border);border-radius:var(--r-sm);background:var(--surface);color:var(--fg)}.active-shares{margin-top:18px}.active-shares h3{font-size:var(--fs-4);margin:0 0 10px}.event-list{display:grid;gap:10px}.event-item{border:1px solid var(--border);border-radius:var(--r);padding:var(--pad-card)}.event-meta{font-size:var(--fs-2);color:var(--muted);margin-bottom:9px}.event-actions{display:flex;gap:6px;flex-wrap:wrap}.danger{color:var(--danger)!important}.toast{position:fixed;left:50%;bottom:90px;transform:translateX(-50%);background:var(--fg);color:var(--bg);padding:9px 15px;border-radius:var(--r-sm);font-size:var(--fs-3);z-index:var(--z-toast);box-shadow:var(--sh-2)}
/* ---- 管理后台独立顶栏：不依赖聊天侧栏，桌面端横向页签，手机端折叠成抽屉 ---- */
.admin-app{height:100%;display:flex;flex-direction:column;overflow:hidden;background:var(--bg)}
.admin-topbar{flex:none;display:flex;align-items:center;gap:14px;min-height:var(--header-h);padding:8px 18px;border-bottom:1px solid var(--border);background:var(--surface)}
.admin-topbar-brand{flex:none;display:flex;align-items:center;gap:10px}.admin-topbar-brand strong{font-size:var(--fs-4);font-weight:600;white-space:nowrap}
.admin-topbar-tabs{flex:1;min-width:0;display:flex;gap:3px;padding:3px;border-radius:var(--r);background:var(--sunken)}
.admin-tab{flex:1;min-width:0;display:inline-flex;align-items:center;justify-content:center;gap:6px;border:0;background:none;padding:8px 12px;border-radius:var(--r-sm);color:var(--muted);font-size:var(--fs-3);white-space:nowrap}
.admin-tab.active{background:var(--surface);color:var(--fg);font-weight:600;box-shadow:var(--sh-1)}
.admin-tab span{overflow:hidden;text-overflow:ellipsis}
.admin-topbar-actions{flex:none;display:flex;align-items:center;gap:6px}
.admin-topbar-btn{min-height:var(--ctl-sm);display:inline-flex;align-items:center;gap:6px;border:1px solid var(--border);border-radius:var(--r-sm);background:var(--surface);color:var(--fg);padding:6px 10px;font-size:var(--fs-2);white-space:nowrap}
/* 主题按钮复用 .nav-theme 的行为，但侧栏那套满宽深色底不适用于顶栏，这里整体覆盖 */
.admin-topbar-btn.nav-theme{width:auto;margin-top:0;padding:6px 9px;border:1px solid var(--border);background:var(--surface);color:var(--fg)}
.admin-topbar-profile{display:flex;align-items:center;gap:8px;padding-left:8px;border-left:1px solid var(--border)}
.admin-profile-name{max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--fs-2);font-weight:600}
.admin-logout{color:var(--danger)}
.admin-menu-toggle{display:none;min-width:var(--tap);min-height:var(--tap);place-items:center;border:0;background:transparent;color:var(--fg);padding:0}
.admin-nav-drawer{display:none}
.admin-main{flex:1;min-height:0;display:flex;flex-direction:column}
/* 后台工作区在顶栏下自己滚动；企业家端的 .settings-workspace 不受影响 */
.admin-main>.settings-workspace{flex:1;min-height:0}
/* 品牌 + 4 页签 + 4 组操作在 1000px 上下就会互相挤压，先把操作按钮压成纯图标，页签保持完整 */
@media(min-width:701px) and (max-width:1080px){
.admin-topbar{gap:10px;padding:8px 12px}
.admin-topbar-actions .admin-topbar-btn span{display:none}
.admin-profile-name{max-width:72px}
}
/* 实测 844px 以下页签文字开始截断，再逐级让位：收掉品牌文字、用户名与页签图标，
   共让出约 186px，够撑到手机断点 701px，四个页签文字全程完整 */
@media(min-width:701px) and (max-width:880px){
.admin-topbar-brand strong,.admin-profile-name{display:none}
.admin-topbar-profile{padding-left:0;border-left:0}
.admin-topbar-tabs .admin-tab svg{display:none}
}
/* 手机端顶栏只留品牌与图标操作，页签收进抽屉，由 #adminMenuToggle 展开 */
@media(max-width:700px){
.admin-topbar{gap:8px;padding:8px 12px}
.admin-topbar-tabs,.admin-profile-name{display:none}
.admin-topbar-actions .admin-topbar-btn span{display:none}
.admin-topbar-profile{padding-left:0;border-left:0}
.admin-menu-toggle{display:grid}
.admin-nav-drawer{display:grid;gap:10px;padding:12px;border-bottom:1px solid var(--border);background:var(--surface);box-shadow:var(--sh-1)}
.admin-drawer-tabs{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px}
.admin-drawer-tabs .admin-tab{min-height:var(--tap);border:1px solid var(--border);background:var(--bg)}
.admin-drawer-tabs .admin-tab.active{background:var(--accent);color:var(--on-accent);border-color:var(--accent);box-shadow:none}
.admin-drawer-meta{color:var(--muted);font-size:var(--fs-2);line-height:var(--lh-loose)}
}
/* 实测 390px 顶栏已零余量、360px 溢出 4px：小屏收掉品牌文字，只留「宋」标 */
@media(max-width:400px){
.admin-topbar-brand strong{display:none}
}
.settings-workspace{overflow:auto;overscroll-behavior:contain;background:var(--bg)}.settings-header{position:sticky;top:0;z-index:var(--z-sticky);height:var(--header-h);padding:10px 18px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:11px;background:var(--surface)}.settings-header h2{margin:0;font-size:var(--fs-5);font-weight:600}.settings-shell{max-width:960px;margin:auto;padding:22px}
/* 桌面端概览压成一行轻量文本，不再是三张厚重卡片；手机端整行隐藏，数量回到各自标题旁 */
.metrics{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 20px;padding:11px 14px;border:1px solid var(--border);border-radius:var(--r);background:var(--surface);color:var(--muted);font-size:var(--fs-2)}.metric-item{display:inline-flex;align-items:baseline;gap:6px}.metric-item strong{font-size:var(--fs-4);font-weight:600;color:var(--fg);font-variant-numeric:tabular-nums}.head-count{display:none;color:var(--muted);font-size:var(--fs-2)}
.metric{background:var(--surface);border:1px solid var(--border);padding:var(--pad-card);border-radius:var(--r);color:var(--muted);font-size:var(--fs-2);box-shadow:var(--sh-1)}.metric strong{display:block;font-size:var(--fs-7);font-weight:600;letter-spacing:-.02em;font-variant-numeric:tabular-nums;color:var(--fg);margin-top:6px}.settings-tabs{display:flex;gap:3px;padding:3px;margin:20px 0 12px;border-radius:var(--r);background:var(--sunken)}.settings-tab{flex:1;border:0;background:none;padding:9px 14px;border-radius:var(--r-sm);color:var(--muted)}.settings-tab.active{background:var(--surface);color:var(--fg);font-weight:600;box-shadow:var(--sh-1)}.settings-panel{background:var(--surface);border:1px solid var(--border);border-radius:var(--r);padding:var(--pad-panel);box-shadow:var(--sh-1)}.panel-head{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:15px}.panel-head h3,.subsection h3{margin:0;font-size:var(--fs-4);font-weight:600}.subsection{padding-top:18px;border-top:1px solid var(--border);margin-top:18px}.management-form{display:flex;gap:9px;flex-wrap:wrap;align-items:center}.management-form input,.management-form select{min-height:var(--ctl);padding:10px;border:1px solid var(--border);border-radius:var(--r-sm);min-width:180px;background:var(--bg);color:var(--fg)}.management-form input:focus,.management-form select:focus{outline:0;border-color:var(--accent);background:var(--surface)}.management-form .primary{width:auto}.upload-note{margin-top:var(--sp-2)}.ai-warning{margin:0 0 12px;padding:11px 13px;border:1px solid var(--danger-line);border-radius:var(--r-sm);background:var(--danger-soft);color:var(--danger);font-size:var(--fs-3);font-weight:600;line-height:var(--lh)}.upload-progress{margin:10px 0;padding:11px 13px;border:1px solid var(--border);border-radius:var(--r-sm);background:var(--sunken)}.upload-progress strong{display:block;color:var(--accent);margin-bottom:3px}.batch-items{display:grid;gap:6px;margin-top:9px}.batch-item{display:grid;gap:4px;padding:7px 9px;border-radius:var(--r-xs);background:var(--surface);font-size:var(--fs-2)}.batch-item-head{display:flex;justify-content:space-between;gap:12px}.batch-item-error{color:var(--danger);line-height:var(--lh-tight)}.batch-item span:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.batch-item-state{flex:none;color:var(--muted)}.batch-item-state.failed{color:var(--danger)}.batch-action{margin-top:9px}.table-wrap{overflow:auto;-webkit-overflow-scrolling:touch}table{width:100%;border-collapse:collapse;font-size:var(--fs-3)}th,td{text-align:left;padding:11px 9px;border-bottom:1px solid var(--border);vertical-align:top}th{color:var(--muted);font-weight:600;font-size:var(--fs-2);white-space:nowrap}.small-btn{min-height:var(--ctl-sm);border:1px solid var(--border);background:var(--surface);border-radius:var(--r-sm);padding:6px 10px;margin:2px;color:var(--fg)}.status{display:inline-block;flex:none;white-space:nowrap;font-size:var(--fs-2);padding:3px 9px;border-radius:var(--r-pill);background:var(--sunken);color:var(--muted)}.status.processing{background:var(--warn-soft);color:var(--warn-t)}.status.enabled,.status.activated,.status.active,.status.created,.status.existing{background:var(--ok-soft);color:var(--ok-t)}.status.revoked,.status.failed,.status.disabled,.status.conflict,.status.invalid{background:var(--danger-soft);color:var(--danger)}.management-error{color:var(--danger);font-size:var(--fs-2);margin-top:5px}.empty{padding:28px;text-align:center;color:var(--muted)}.code-box{margin-top:14px;padding:13px;background:var(--sunken);border:1px solid var(--border);border-radius:var(--r-sm)}.code-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:6px;margin:10px 0}.code-item{background:var(--surface);padding:9px;border-radius:var(--r-xs);border:1px solid var(--border)}.code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:var(--fs-5);font-weight:700;letter-spacing:1px}.preview-card{width:min(800px,100%)}.preview-meta{margin:10px 0;color:var(--muted);font-size:var(--fs-3)}.topic-list{display:flex;gap:6px;flex-wrap:wrap;margin:12px 0}.topic-chip{padding:5px 10px;border-radius:var(--r-pill);background:var(--accent-soft);color:var(--accent);font-size:var(--fs-2)}.chunk{padding:12px 0;border-top:1px solid var(--border);white-space:pre-wrap;line-height:var(--lh)}.chunk-label{color:var(--muted);font-size:var(--fs-2);margin-bottom:5px}.result-warning{padding:9px 11px;border-radius:var(--r-sm);background:var(--danger-soft);color:var(--danger);font-size:var(--fs-3)}.managed-shares{display:grid;gap:12px}.managed-share{border:1px solid var(--border);border-radius:var(--r);padding:var(--pad-card)}.managed-share-head{display:flex;justify-content:space-between;gap:12px;align-items:flex-start}.managed-share-title{font-weight:600}.managed-share-meta{margin-top:var(--sp-1);color:var(--muted);font-size:var(--fs-2);line-height:var(--lh-loose)}.managed-share-actions{display:flex;gap:6px;flex-wrap:wrap;margin-top:var(--sp-3)}.registration-detail{margin-top:12px;padding-top:10px;border-top:1px solid var(--border)}
/* 系统状态默认不占位，只在 diagnosticsAlerts() 非空时由 loadMetrics() 取消 hidden */
.voice-metrics{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:10px}.system-diagnostics{margin:12px 0 0;padding:8px 12px;border:1px solid var(--warn-soft);border-radius:var(--r-sm);background:var(--warn-soft);font-size:var(--fs-2)}.system-diagnostics summary{min-height:var(--ctl-sm);display:flex;align-items:center;cursor:pointer;color:var(--warn-t);font-weight:600}.system-diagnostics.alert summary{color:var(--danger)}.voice-metric{padding:11px 13px;border:1px solid var(--border);border-radius:var(--r);background:var(--surface);color:var(--muted);font-size:var(--fs-2);line-height:var(--lh-loose)}.voice-metric b{color:var(--fg);font-variant-numeric:tabular-nums}.insight-overview{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin:16px 0}.insight-overview .metric{display:flex;flex-direction:column;justify-content:center;padding:var(--pad-card)}.insight-grid{display:grid;grid-template-columns:1.2fr .8fr;gap:16px}.insight-box{border:1px solid var(--border);border-radius:var(--r);padding:var(--pad-card)}.insight-box h4{margin:0 0 11px;font-size:var(--fs-3);font-weight:600}.timeline-list,.region-list,.insight-topics{display:grid;gap:8px}.timeline-row{display:grid;grid-template-columns:86px 1fr auto;gap:9px;align-items:center;font-size:var(--fs-2)}.timeline-track{height:9px;border-radius:var(--r-xs);background:var(--sunken);overflow:hidden}.timeline-bar{height:100%;border-radius:var(--r-xs);background:var(--accent)}.region-row{display:flex;justify-content:space-between;border-bottom:1px solid var(--border);padding:6px 0}.insight-topic{border:1px solid var(--border);border-radius:var(--r-sm);padding:12px;background:var(--sunken)}.insight-topic-head{display:flex;justify-content:space-between;gap:10px;font-weight:600}.insight-topic p{margin:6px 0 0;color:var(--muted);line-height:var(--lh)}.insight-notice{margin:12px 0;padding:10px 12px;border-radius:var(--r-sm);background:var(--warn-soft);color:var(--warn-t);font-size:var(--fs-3)}
.file-input{position:absolute;width:1px;height:1px;opacity:0;overflow:hidden;clip:rect(0 0 0 0)}.file-picker{min-height:var(--tap);display:flex;align-items:center;gap:9px;max-width:100%;padding:8px 10px;border:1px dashed var(--border);border-radius:var(--r-sm);background:var(--bg);cursor:pointer}.file-picker strong{flex:none;color:var(--accent)}.file-picker span:last-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted);font-size:var(--fs-3)}.document-card-list{display:none}.document-card{border:1px solid var(--border);border-radius:var(--r);padding:var(--pad-card)}.document-card+.document-card{margin-top:10px}.document-card-head{display:flex;justify-content:space-between;gap:10px;align-items:flex-start}.document-card-title{font-weight:600;line-height:var(--lh-tight)}.document-card-meta{margin-top:var(--sp-2)}.document-card-actions{display:flex;flex-wrap:wrap;gap:6px;margin-top:var(--sp-3)}.document-card-actions .small-btn{margin:0}.topic-details{margin:12px 0}.topic-details summary,.chunk-sample summary{min-height:var(--tap);display:flex;align-items:center;cursor:pointer;color:var(--accent);font-weight:600}.chunk-sample{padding:4px 0;border-top:1px solid var(--border)}.chunk-sample-content{margin-top:8px;padding-bottom:12px;white-space:pre-wrap;line-height:var(--lh)}.management-filter{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 14px}.share-filter{min-height:var(--ctl-sm);border:1px solid var(--border);border-radius:var(--r-sm);background:var(--surface);color:var(--accent);padding:7px 10px}.share-filter.active{border-color:var(--accent);background:var(--accent);color:var(--on-accent)}.share-history{margin-top:14px;border-top:1px solid var(--border);padding-top:4px}.share-history summary{min-height:var(--tap);display:flex;align-items:center;cursor:pointer;color:var(--accent);font-weight:600}.user-filter{display:grid;grid-template-columns:minmax(0,1fr) 130px;gap:9px;margin:0 0 12px}.user-filter input,.user-filter select{min-width:0;min-height:var(--ctl);padding:10px;border:1px solid var(--border);border-radius:var(--r-sm);background:var(--bg);color:var(--fg)}.user-filter-count{margin:-2px 0 10px}
/* 按需展开入口：桌面端 .mobile-toggle 不出现、面板恒显；手机端由 JS 切 .collapsed。
   不用 <details> 是因为桌面端需要强制展开，覆盖 UA 的折叠样式不稳定，失败方向是表单直接消失 */
.mobile-toggle{display:none}.entry-row{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:14px}.entry-panel{padding:var(--pad-card);border:1px solid var(--border);border-radius:var(--r);background:var(--bg);margin-bottom:14px}.entry-panel h4{margin:0 0 11px;font-size:var(--fs-3);font-weight:600}.entry-toggle[aria-expanded=true]{border-color:var(--accent);color:var(--accent)}
/* 资料卡：预览为主操作，停用/删除压平但保留 .danger 语义色 */
.user-card-list{display:none}.user-card{border:1px solid var(--border);border-radius:var(--r);padding:var(--pad-card)}.user-card+.user-card{margin-top:10px}.user-card-head{display:flex;justify-content:space-between;gap:10px;align-items:flex-start}.user-card-title{font-weight:600;line-height:var(--lh-tight)}.user-card-meta{margin-top:var(--sp-2)}.user-card-actions{display:flex;flex-wrap:wrap;gap:6px;margin-top:var(--sp-3)}.user-card-actions .small-btn{margin:0}
/* 洞察日期：预设优先，只有自定义才露出起止日期 */
.range-presets{display:flex;flex-wrap:wrap;gap:6px}.range-preset{min-height:var(--ctl-sm);border:1px solid var(--border);border-radius:var(--r-sm);background:var(--surface);color:var(--accent);padding:7px 12px}.range-preset.active{border-color:var(--accent);background:var(--accent);color:var(--on-accent)}.range-custom{display:flex;flex-wrap:wrap;gap:9px;align-items:center;margin-top:11px}
.insight-ai{padding-top:18px;border-top:1px solid var(--border);margin-top:18px}.insight-ai-head{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px;margin-bottom:12px}.insight-ai-head h3{margin:0;font-size:var(--fs-4);font-weight:600;outline:none}.insight-ai-head .primary{width:auto;min-height:var(--ctl)}.insight-ai-status{margin:0 0 12px;padding:10px 12px;border-radius:var(--r-sm);background:var(--accent-soft);color:var(--accent);font-size:var(--fs-3);line-height:var(--lh)}.insight-ai-status:empty{display:none}.insight-ai-status.failed{background:var(--danger-soft);color:var(--danger)}
/* 邀请记录：手机端只留一个主操作，其余收进「更多」 */
.more-toggle{display:none}.managed-share-rest{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}.managed-share-rest .small-btn{margin:0}
/* 相邻元素间距。.hint 自身没有外边距，过去全靠上下文偶然决定，标题、表单和列表旁常常贴死；
   这里按上面的层级统一补齐。用相邻兄弟选择器而不是给 .hint 加通用外边距：后者会连带覆盖
   已有 .document-card-meta / .user-filter-count 等同名单类规则，反而制造新的不一致 */
h3+.hint,.document-card-title+.hint,.upload-progress strong+.hint,.management-error+.hint,td>.hint{margin-top:var(--sp-1)}
.modal-head+.hint,.hint+.management-form,.management-form+.hint,.share-form+.hint,.hint+.insight-topics{margin-top:var(--sp-2)}
.subsection h3+.user-filter{margin-top:var(--sp-3)}
/* 整理预览里的分节标题是全站唯一没被接管的标题，会退到浏览器默认字号与 1em 外边距。
   套用与面板标题相同的 15px/600，间距按上面的层级给，不引入新的标题层级 */
.preview-card h3{margin:var(--sp-4) 0 var(--sp-2);font-size:var(--fs-4);font-weight:600}
/* 面板内相邻分区：资料表紧跟上传说明、洞察结果紧跟日期表单，原来都是 0 */
.panel-block{margin-top:var(--sp-4)}
/* hover 一律锁在精确指针下，触屏点完不会粘住背景 */
@media(hover:hover) and (pointer:fine){.install-nav:hover,.settings-nav:hover,.invite-nav:hover,.about-nav:hover{background:var(--nav-hover)}.logout:hover{background:var(--nav-hover);color:var(--nav-fg)}.tip:hover{border-color:var(--accent);color:var(--accent);box-shadow:var(--sh-2)}.primary:hover{background:var(--accent-d)}.secondary:hover,.small-btn:hover,.share-filter:hover,.range-preset:hover{border-color:var(--accent)}.share-filter.active:hover,.range-preset.active:hover{background:var(--accent-d)}.voice-toggle:hover,.menu:hover{background:var(--sunken)}.settings-tab:hover,.tab:hover,.close:hover{color:var(--fg)}.action:hover{color:var(--accent)}tbody tr:hover{background:var(--bg)}.theme-toggle:hover{border-color:var(--accent);color:var(--accent)}.nav-theme:hover{background:var(--nav-hover);color:var(--nav-fg)}.send:not(:disabled):hover{background:var(--accent-d)}.back-to-latest:hover{border-color:var(--accent);color:var(--accent)}.voice-room-action:hover{border-color:var(--accent);color:var(--accent)}.voice-room-cancel:hover{border-color:var(--danger);color:var(--danger)}.voice-room-talk:not(.recording):hover .voice-room-talk-label{background:var(--accent-d)}}
/* 键盘焦点可见。输入框已有自己的边框+光环焦点样式，这里只补按钮、链接、页签与折叠头。
   :focus-visible 不在鼠标与触摸下触发，触屏端不会留下残留描边；侧栏是深底，描边改用前景色并内缩，以免被滚动容器裁掉 */
a:focus-visible,button:focus-visible,summary:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.sidebar a:focus-visible,.sidebar button:focus-visible{outline-color:var(--nav-fg);outline-offset:-2px}
@keyframes sheet-up{from{transform:translateY(100%)}to{transform:none}}
@media(max-width:700px){body.sidebar-open{overflow:hidden}.app{display:block}.sidebar{position:fixed;z-index:var(--z-drawer);inset:0 auto 0 0;width:280px;transform:translateX(-100%);transition:var(--dur-2);box-shadow:8px 0 32px rgba(0,0,0,.28)}.sidebar.open{transform:none}.sidebar-backdrop{display:block;position:fixed;z-index:var(--z-backdrop);inset:0;background:var(--scrim);opacity:0;visibility:hidden;transition:opacity var(--dur-2),visibility var(--dur-2)}.sidebar-backdrop.open{opacity:1;visibility:visible}.main{height:100%}.menu{display:grid;place-items:center;min-width:var(--tap);min-height:var(--tap);padding:0}.header,.settings-header{height:var(--header-h);padding:9px 13px}.expert-avatar{width:40px;height:40px}.messages{padding-top:18px}.bubble-wrap{max-width:86%}.voice-toggle{display:flex;align-items:center;font-size:var(--fs-2);padding:6px 8px}.welcome{margin-top:3vh}.about-nav,.invite-nav,.install-nav,.settings-nav,.nav-theme{min-height:var(--ctl-lg)}.modal{place-items:end center;padding:0}.modal-card{width:100%;max-width:none;max-height:88vh;border-radius:var(--r-lg) var(--r-lg) 0 0;padding:18px 16px calc(18px + env(safe-area-inset-bottom));animation:sheet-up var(--dur-2) cubic-bezier(.32,.72,0,1)}.preview-card{width:100%}.close{min-width:var(--tap);min-height:var(--tap);display:grid;place-items:center}.install-banner{position:fixed;z-index:var(--z-banner);left:12px;right:12px;bottom:calc(12px + env(safe-area-inset-bottom));display:flex;align-items:center;gap:10px;padding:12px;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--sh-2)}.install-banner-text{flex:1;font-size:var(--fs-3);line-height:var(--lh-tight)}.install-banner-action{min-height:var(--tap);border:0;background:var(--accent);color:var(--on-accent);border-radius:var(--r-sm);padding:8px 12px;white-space:nowrap}.install-banner-close{min-width:var(--tap);min-height:var(--tap);border:0;background:transparent;color:var(--muted);padding:2px}.settings-shell{padding:14px 10px 28px}.metrics{display:none}.head-count{display:inline}
/* 四个页签排成 2 列等宽 2 行，首屏全部可见，不做横向滚动，避免最右侧入口被裁切且难以触及。
   吸顶 top 必须等于 .settings-header 的 64px，否则会盖住设置顶栏 */
.settings-tabs{position:sticky;top:var(--header-h);z-index:var(--z-sticky-sub);display:grid;grid-template-columns:repeat(2,minmax(0,1fr));overflow:visible;gap:6px;margin:0 -10px 12px;padding:8px 10px;border-radius:0;background:var(--bg)}.settings-tab{min-width:0;min-height:var(--tap);white-space:nowrap;text-align:center;border:1px solid var(--border);background:var(--surface);padding:0 10px}.settings-tab.active{background:var(--accent);color:var(--on-accent);border-color:var(--accent);box-shadow:none}
.management-form input:not(.file-input),.management-form select,.management-form button{width:100%;min-width:0}.management-form .primary{width:100%}.file-picker{width:100%}.document-table{display:none}.document-card-list{display:grid}.user-filter{grid-template-columns:1fr}
/* 手机端统一间距并减少卡套卡：面板内的分区、洞察分栏和邀请卡都去掉同权重边框 */
.mobile-toggle{display:inline-flex}.mobile-panel.collapsed{display:none}.entry-panel{margin-bottom:12px}.entry-row .small-btn{flex:1}.subsection{padding-top:14px;margin-top:14px}.insight-box{border:0;border-radius:0;padding:0}.insight-grid{gap:20px}.insight-overview{gap:8px;margin:12px 0}.insight-overview .metric strong{font-size:var(--fs-6);margin-top:4px}.insight-ai{padding-top:14px;margin-top:14px}.insight-ai-head .primary{width:100%}.document-card+.document-card{margin-top:12px}.document-card-actions .small-btn{border-color:transparent;background:var(--sunken)}.document-card-actions .doc-preview{border-color:var(--accent);background:var(--surface);color:var(--accent);font-weight:600}.user-table{display:none}.user-card-list{display:grid}.more-toggle{display:inline-flex}.managed-share-rest{display:none}.managed-share-rest.open{display:flex}}
@media(max-width:700px){.voice-metrics,.insight-grid{grid-template-columns:1fr}.insight-overview{grid-template-columns:1fr 1fr}.timeline-row{grid-template-columns:72px 1fr auto}}
/* 手机专属：顶栏预算按 390px 排，砍掉专家副标题；表格出血滚动提示可横滑 */
@media(max-width:480px){.header,.settings-header{padding:9px 10px;gap:8px}.expert-avatar{width:34px;height:34px;font-size:15px}.expert-info strong{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.expert-info small{display:none}.voice-toggle{font-size:var(--fs-1);padding:6px}.settings-header h2{font-size:var(--fs-4)}.messages{padding:16px 12px}.bubble-wrap{max-width:100%}.welcome{margin-top:2vh}.welcome .seal{width:56px;height:56px;font-size:26px}.tips{gap:8px}.composer{padding:10px 12px calc(10px + env(safe-area-inset-bottom))}.auth-card{padding:24px 18px}.auth-card .theme-toggle{top:10px;right:10px}.settings-shell{padding:12px 10px 28px}th,td{padding:9px 8px}.table-wrap{margin:0 -13px;padding:0 13px}}
@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}

/* ================== 动态球 · 语音舞台 · Live 面板 · 时间线分页 ==================
   动态球的缩放与辉光完全由 JS 每帧写入的 --orb-level（0~1 实时响度）驱动：
   录音期来自麦克风，播放期来自 TTS 输出，都是真实音频，不是固定循环动画。
   只有「正在思考」这一档确实没有音频可读，才允许用一次极慢呼吸表示在想。
   颜色一律 hex/rgba：禁用 oklch 与 color-mix，微信安卓 XWeb 内核不支持。 */
[data-theme=light]{--orb-1:#7fb6e8;--orb-2:#2f6fa8;--orb-3:#1b4568;--orb-glow:rgba(47,111,168,.30);--orb-line:rgba(47,111,168,.42)}
[data-theme=dark]{--orb-1:#8fc3f0;--orb-2:#3f7fbd;--orb-3:#1d3f5e;--orb-glow:rgba(120,178,232,.26);--orb-line:rgba(120,178,232,.38)}
.orb{--orb-level:0;--orb-size:56px;position:relative;width:var(--orb-size);height:var(--orb-size);flex:none}
.orb>span{position:absolute;display:block;border-radius:50%}
.orb-core{inset:16%;background:radial-gradient(circle at 34% 28%,var(--orb-1) 0%,var(--orb-2) 52%,var(--orb-3) 100%);box-shadow:0 6px 18px var(--orb-glow),inset 0 -6px 14px rgba(0,0,0,.24);transform:scale(var(--orb-core-scale,1));transition:transform .07s linear}
.orb-halo{inset:0;background:radial-gradient(circle,var(--orb-glow) 0%,rgba(0,0,0,0) 68%);transform:scale(var(--orb-halo-scale,.86));opacity:var(--orb-halo-opacity,.4);transition:transform .1s ease-out,opacity .1s ease-out}
.orb-ring{inset:7%;border:1px solid var(--orb-line);opacity:var(--orb-ring-opacity,.2);transform:scale(var(--orb-ring-scale,1));transition:transform .12s ease-out,opacity .12s ease-out}
.orb[data-orb-state=thinking] .orb-core{animation:orb-breathe 2.6s ease-in-out infinite}
.orb[data-orb-state=thinking] .orb-halo{opacity:.5}
@keyframes orb-breathe{0%,100%{transform:scale(1)}50%{transform:scale(1.07)}}
.orb[data-orb-state=idle] .orb-halo,.orb[data-orb-state=blocked] .orb-halo{opacity:.22}
/* 「不可用」必须一眼可辨，不允许看起来像待机：整颗球脱色下沉、外环改虚线 */
.orb[data-orb-state=blocked] .orb-core{background:radial-gradient(circle at 34% 28%,#9aa3ab 0%,#6d757c 52%,#454b51 100%);box-shadow:none}
.orb[data-orb-state=blocked] .orb-ring{border-style:dashed;border-color:rgba(140,148,156,.6);opacity:.7}
@media (prefers-reduced-motion:reduce){.orb *{transition:none!important;animation:none!important}}


.live-toggle{gap:6px}
.live-dot{width:7px;height:7px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 3px var(--ok-soft)}
.live-toggle.live-blocked .live-dot{background:var(--muted);box-shadow:0 0 0 3px rgba(120,128,136,.16)}
.live-card{max-width:460px}
.live-orb-wrap{display:flex;justify-content:center;padding:var(--sp-3) 0}
.live-orb{--orb-size:104px}
.live-verdict{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border-radius:var(--r-pill);font-size:var(--fs-2);font-weight:600}
.live-verdict::before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor;opacity:.7}
.live-verdict.ok{background:var(--ok-soft);color:var(--ok-t)}
/* 未开通用中性的强调色而不是警示色：这是「还没到」，不是「出错了」 */
.live-verdict.preparing{background:var(--accent-soft);color:var(--accent)}
.live-status{text-align:center}
.live-status p{margin:var(--sp-2) auto 0;max-width:26em;font-size:var(--fs-3);color:var(--muted);line-height:var(--lh)}
/* 未开通时讲「现在可以怎么用」，不讲阻塞原因；诊断信息不进企业家端 */
.live-fallback{margin-top:var(--sp-4);padding:var(--pad-card);border:1px solid var(--border);border-radius:var(--r);background:var(--sunken)}
.live-fallback-title{margin:0;font-size:var(--fs-3);font-weight:600;color:var(--fg)}
.live-fallback ul{list-style:none;margin:var(--sp-2) 0 0;padding:0;display:grid;gap:var(--sp-2)}
.live-fallback li{display:flex;gap:8px;font-size:var(--fs-2);color:var(--muted);line-height:var(--lh-tight)}
.live-fallback li::before{content:"";flex:none;width:5px;height:5px;margin-top:6px;border-radius:50%;background:var(--accent);opacity:.55}
.live-actions{display:flex;justify-content:flex-end;margin-top:var(--sp-3)}

/* 向前分页提示条：只在真的在取更早问答时出现，取完即收，不常驻占位 */
.timeline-top{flex:none;padding:var(--sp-2);text-align:center;font-size:var(--fs-2);color:var(--muted);background:var(--bg)}

/* 时间线时间锚点与导航。滚动仍然只发生在 .messages，这层只提供「回到最新」的定位上下文。
   .messages 自身设 position:relative 是为了让日期分隔条的 offsetTop 直接就是内容坐标，
   与 scrollTop 同一原点，滚动时判断「现在看的是哪天」不必再逐个读元素位置。 */
.timeline-area{flex:1;min-width:0;min-height:0;position:relative;display:flex;flex-direction:column}
/* 当前日期带。它是 .messages 的兄弟节点、占自己一条带，不是浮在内容上的吸顶层，
   因此正文永远不会被日期压住。只在载入的时间线跨两天以上时出现：单日没有歧义，不必白占高度 */
.timeline-day-bar{flex:none;padding:var(--sp-1) 0;border-bottom:1px solid var(--border);background:var(--bg);text-align:center;color:var(--muted);font-size:var(--fs-1);line-height:var(--lh-tight);letter-spacing:.02em;transition:opacity var(--dur-1)}
/* 那一天的分隔条还露在视口里时日期带留空：同屏两个「7月23日」很伤精致感。
   淡掉而不是收起——收起会改变 .messages 高度，正文在滚动中跟着上下缩，比重复更难看。
   全局 prefers-reduced-motion 规则已把过渡时长压到 0.01ms，这里不必单独处理。 */
.timeline-day-bar.empty{opacity:0}
/* 日期分隔条随内容一起滚动，只标日界；「当前在看哪天」由上面的日期带常驻回答。
   两侧发丝线穿过居中日期，宽度与气泡列对齐，读起来是一条分节线而不是压在正文上的标签 */
.day-divider{display:flex;align-items:center;gap:var(--sp-3);max-width:680px;margin:0 auto 20px}
.day-divider::before,.day-divider::after{content:"";flex:1;height:1px;background:var(--border)}
.day-divider span{flex:none;color:var(--muted);font-size:var(--fs-1);line-height:var(--lh-tight);letter-spacing:.02em}
/* 已经翻到最早一条的终点提示，随内容一起滚动；与顶部载入条（不滚动、只表示正在取）是两件事 */
.timeline-start{margin:0 auto 20px;text-align:center;color:var(--muted);font-size:var(--fs-1);line-height:var(--lh-tight)}
.msg-time{margin-left:auto;align-self:center;padding-left:8px;color:var(--muted);font-size:var(--fs-1);line-height:var(--lh-tight);font-variant-numeric:tabular-nums;white-space:nowrap}
.msg-time-row{display:flex;justify-content:flex-end;margin-top:4px}
.back-to-latest{position:absolute;left:50%;bottom:14px;transform:translateX(-50%);display:flex;align-items:center;gap:5px;min-height:var(--ctl-sm);padding:0 13px;border:1px solid var(--border);border-radius:var(--r-pill);background:var(--surface);box-shadow:var(--sh-2);color:var(--fg);font-size:var(--fs-2)}

/* ================== 沉浸式语音对话台 ==================
   产品语言：明亮、轻盈、一颗会呼吸的光球居中，其余元素退到画面边缘。
   它承载的既可以是一问一答链路，也可以是 Live 全双工，界面只表达「当前状态 + 一个主按钮 + 本轮文字」。
   文字不再挤在球下面硬撑，而是一张浮起的白卡（最新一问一答）+ 底部文字抽屉（完整连续历史）。
   自己占满视口并走 --z-modal（与弹窗同层，高于侧栏与遮罩，低于 --z-toast 的提示条）。
   明亮氛围由一组 --imm-* 令牌表达、两套主题各自给值，颜色一律 hex/rgba：
   禁用 oklch 与 color-mix，微信安卓 XWeb 内核不支持；渐变里的 rgba(0,0,0,0) 只是透明停靠点，不是颜色字面量。 */
[data-theme=light]{--imm-1:#fbfdff;--imm-2:#e9f2fb;--imm-3:#d9e8f6;--imm-halo:rgba(126,180,232,.40);--imm-card:#fff;--imm-line:rgba(24,54,84,.10);--imm-fg:#16222e;--imm-mut:#5b6a79;--imm-pill:rgba(255,255,255,.88);--imm-wave:rgba(47,111,168,.34);--imm-sh:0 8px 26px rgba(24,54,84,.10)}
[data-theme=dark]{--imm-1:#141d26;--imm-2:#16232f;--imm-3:#0d151d;--imm-halo:rgba(96,154,210,.26);--imm-card:#1b232b;--imm-line:rgba(255,255,255,.10);--imm-fg:#e5eaf0;--imm-mut:#97a2ad;--imm-pill:rgba(255,255,255,.08);--imm-wave:rgba(143,195,240,.30);--imm-sh:0 8px 26px rgba(0,0,0,.38)}
.voice-room{position:fixed;inset:0;z-index:var(--z-modal);display:flex;flex-direction:column;padding:calc(var(--sp-3) + env(safe-area-inset-top)) var(--sp-4) calc(var(--sp-3) + env(safe-area-inset-bottom));color:var(--imm-fg);background:radial-gradient(120% 76% at 50% 30%,var(--imm-halo) 0%,rgba(0,0,0,0) 58%),linear-gradient(180deg,var(--imm-1) 0%,var(--imm-2) 48%,var(--imm-3) 100%)}
/* 桌面端不铺满整幅宽度：各行共用与气泡列同一档的阅读宽度并居中收拢 */
.voice-room>*{width:min(100%,680px);margin-left:auto;margin-right:auto}
.voice-room-head{flex:none;display:flex;align-items:center;gap:var(--sp-2)}
/* 企业家端统一使用用户提供并裁切的宋老师头像；原图只做居中裁切和缩放，不生成或改写人物。 */
.expert-photo{--expert-photo:url('/song-zhiping-avatar.jpg');width:38px;height:38px;flex:none;display:grid;place-items:center;border-radius:50%;border:1px solid var(--imm-line);background-color:var(--imm-pill);background-image:var(--expert-photo);background-size:cover;background-position:center;color:var(--imm-mut);font-size:17px;font-weight:600}
.voice-room-who{flex:1;min-width:0}
.voice-room-who strong{display:block;font-size:var(--fs-4);font-weight:600}
/* 通话页只保留固定模式说明，不再承担模式切换。 */
.voice-room-mode{display:inline-flex;align-items:center;gap:5px;margin-top:2px;border:0;background:none;padding:0;color:var(--imm-mut);font-size:var(--fs-2)}
/* 退出按钮做成白色圆钮：明亮场景下方角图标按钮会显得像未完成的控件 */
.voice-room-close{width:var(--ctl);height:var(--ctl);flex:none;display:grid;place-items:center;border:1px solid var(--imm-line);border-radius:50%;background:var(--imm-pill);color:var(--imm-mut)}
/* 球与状态文字占据视觉重心。上下两个 auto 外边距把「状态 + 球 + 文案」当成一组居中，
   底部操作行贴在下沿：1440×900 实测过，让球独占 flex:1 会把文案甩到屏幕最下面，两者看起来毫不相干 */
.voice-room-stage{flex:none;margin-top:auto;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp-4);padding:var(--sp-4) 0}
.voice-room-state{text-align:center}
.voice-room-state strong{display:block;font-size:var(--fs-5);font-weight:600}
.voice-room-state span{display:block;margin-top:var(--sp-1);color:var(--imm-mut);font-size:var(--fs-3);line-height:var(--lh)}
/* 左右声波与球同一水平线。声波是纯装饰、排在按钮外面，避免热区外扩造成误触；
   --orb-level 由 JS 每帧写在这一层上（自定义属性只向下继承），球与声波因此是同一个真实响度 */
.voice-room-orbit{--orb-level:0;width:100%;display:flex;align-items:center;justify-content:center;gap:var(--sp-3)}
.voice-room-wave{flex:1;min-width:0;height:60px;display:flex;align-items:center;justify-content:flex-end;gap:4px;overflow:hidden}
.voice-room-wave.wave-right{justify-content:flex-start}
.voice-room-wave i{flex:none;width:3px;height:calc(8px + var(--orb-wave-main,0px));border-radius:var(--r-pill);background:var(--imm-wave);transition:height .09s linear}
.voice-room-wave i:nth-child(2n){height:calc(5px + var(--orb-wave-even,0px))}
.voice-room-wave i:nth-child(3n){height:calc(12px + var(--orb-wave-third,0px))}
/* 主按钮只包住光球本身：点球即说话，是这一层唯一的主操作 */
.voice-room-talk{display:flex;align-items:center;justify-content:center;border:0;background:none;padding:0;color:inherit}
/* 尺寸走 width/height 而不是自定义属性动画：自定义属性不可过渡，宽高可以，切换尺寸因此是平滑的 */
.voice-room-orb{--orb-size:clamp(132px,38vw,196px);transition:width var(--dur-2),height var(--dur-2)}
.voice-room-talk-label{min-height:var(--ctl-lg);display:inline-flex;align-items:center;padding:0 var(--sp-4);border-radius:var(--r-pill);background:var(--accent);color:var(--on-accent);font-size:var(--fs-4);font-weight:600;font-variant-numeric:tabular-nums;box-shadow:var(--sh-1)}
.voice-room-stage.recording .voice-room-talk-label{background:var(--danger)}
/* 本轮文字做成一张浮起的白卡：只呈现当前这一问一答并始终盯住最新一句，
   完整历史交给底部文字抽屉，这一层不再承担「翻记录」的职责，所以高度上限可以压得很低 */
.voice-room-text{flex:none;max-height:26vh;margin-top:var(--sp-4);padding:var(--pad-card);border:1px solid var(--imm-line);border-radius:var(--r);background:var(--imm-card);box-shadow:var(--imm-sh);overflow:auto;overscroll-behavior:contain;text-align:left;scrollbar-width:none}
.voice-room-text::-webkit-scrollbar{display:none}
.voice-room-card-head{display:flex;align-items:center;gap:7px;margin-bottom:var(--sp-2)}
.voice-room-card-head strong{flex:1;min-width:0;font-size:var(--fs-2);font-weight:600;color:var(--imm-mut)}
/* 卡头的星芒印记：用两条渐变十字构成一颗轻微的光点，作为「这是宋老师在说」的固定标识 */
.voice-room-seal{width:16px;height:16px;flex:none;border-radius:50%;background:radial-gradient(circle at 38% 32%,var(--orb-1) 0%,var(--orb-2) 62%,var(--orb-3) 100%);box-shadow:0 0 8px var(--orb-glow)}
/* 播放中的小音柱：只有真的读到 TTS 输出音量时 JS 才加 .active，没声音就不动 */
.voice-room-bars{--orb-level:0;flex:none;display:flex;align-items:flex-end;gap:2px;height:12px;opacity:0;transition:opacity var(--dur-1)}
.voice-room-bars.active{opacity:1}
.voice-room-bars i{width:2px;height:4px;border-radius:var(--r-pill);background:var(--accent)}
.voice-room-bars.active i{height:calc(3px + var(--orb-bars-main,0px));transition:height .09s linear}
.voice-room-bars.active i:nth-child(2n){height:calc(5px + var(--orb-bars-even,0px))}
.voice-room-ask{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;margin-bottom:var(--sp-2);color:var(--imm-mut);font-size:var(--fs-2);line-height:var(--lh)}
.voice-room-ask::before{content:"你说："}
/* Live 的实时转写还没定稿：用浅一档的呈现表明「这是刚听到的，可能还会变」，不假装已经确定 */
.voice-room-ask.partial{opacity:.72;font-style:italic}
.voice-room-answer{color:var(--imm-fg);font-size:var(--fs-4);line-height:var(--lh-loose);white-space:pre-wrap;word-break:break-word}
.voice-room-answer.placeholder{color:var(--imm-mut);font-size:var(--fs-3)}
/* 底部操作行：一条贴下沿的白色胶囊条，图标 + 文字并排。企业家端读文字比认图标快，图标只作辅助 */
.voice-room-controls{flex:none;display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:var(--sp-2);margin-top:auto;padding-top:var(--sp-4)}
.voice-room-action{min-height:var(--tap);border:1px solid var(--imm-line);border-radius:var(--r-pill);background:var(--imm-pill);color:var(--imm-mut);padding:0 var(--sp-4);font-size:var(--fs-3)}
.voice-room-cancel{border-color:var(--danger-line);color:var(--danger)}
/* 企业家首页只呈现通话状态与中央光球；文字与工具全部回到对话模式。 */
.user-page .voice-room-text,.user-page .voice-room-controls{display:none}
/* ================== 文字抽屉 ==================
   文字优先的入口，与对话台同一套明亮语言。默认（peek）只露最新一问一答的高度，
   展开（.full）接近满屏、由用户自己滚，向上分页、日期带、回到最新、复制、听回答、来源全都还是原来那条时间线：
   .timeline-area 是被「搬家」过来的同一个节点，DOM 移动不影响已绑定的事件，所以没有任何重复实现。
   它盖在对话台之上、比对话台高一层，退出抽屉后对话台仍在原位。 */
.text-drawer{position:fixed;inset:0;z-index:calc(var(--z-modal) + 1);display:flex;flex-direction:column;justify-content:flex-end}
.text-drawer-scrim{position:absolute;inset:0;background:var(--scrim)}
.text-drawer-sheet{position:relative;display:flex;flex-direction:column;width:min(100%,680px);margin:0 auto;height:52vh;max-height:calc(100% - var(--sp-4) * 3);border-radius:var(--r-lg) var(--r-lg) 0 0;border:1px solid var(--imm-line);border-bottom:0;background:var(--imm-card);box-shadow:var(--imm-sh);color:var(--imm-fg);transition:height var(--dur-2);overflow:hidden}
.text-drawer.full .text-drawer-sheet{height:calc(100% - var(--sp-4) * 3)}
.text-drawer-head{flex:none;display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-2) var(--sp-3);border-bottom:1px solid var(--imm-line)}
/* 顶部把手：只是「这是一张可以拉的纸」的视觉暗示，展开收起统一由右侧文字按钮承担，不做手势 */
.text-drawer-grip{width:34px;height:4px;flex:none;border-radius:var(--r-pill);background:var(--imm-line)}
.text-drawer-head strong{flex:1;min-width:0;font-size:var(--fs-3);font-weight:600}
.text-drawer-toggle{flex:none;min-height:var(--ctl-sm);border:1px solid var(--imm-line);border-radius:var(--r-pill);background:var(--imm-pill);color:var(--imm-mut);padding:0 12px;font-size:var(--fs-2)}
/* 时间线搬进来后由这里给出滚动容器：高度全部来自抽屉，抽屉在两档之间过渡，正文跟着走 */
.text-drawer-host{flex:1;min-height:0;display:flex;flex-direction:column;background:var(--bg)}
/* 对话页里时间线的原位插槽。抽屉关闭时节点搬回这里，聊天页仍然完整可用 */
.timeline-slot{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column}
/* ================== 首次选择对话方式 ==================
   只在首次点光球时问一次，选完记住；之后在对话台标题下那行随时能换，不再打断 */
@media (max-width:700px){
  .voice-room{padding:calc(var(--sp-2) + env(safe-area-inset-top)) var(--sp-3) calc(var(--sp-3) + env(safe-area-inset-bottom))}
}
/* 矮屏桌面与横屏平板优先保证底部操作可见，避免大球和长字幕把操作行挤出视口。 */
@media (max-height:720px) and (min-width:701px){
  .voice-room{padding-top:var(--sp-2);padding-bottom:var(--sp-2)}
  .voice-room-stage{gap:var(--sp-2);padding:var(--sp-2) 0}
  .voice-room-orb{--orb-size:124px}
  .voice-room-text{max-height:22vh;margin-top:var(--sp-2)}
  .voice-room-controls{padding-top:var(--sp-2)}
}

/* ================== 企业家端明亮沉浸视觉 ==================
   用户端固定采用参考首页的浅蓝白语言；管理后台仍使用上方通用主题令牌。
   这里以 .user-page 隔离，避免共享样式表让后台跟着改变。 */
.user-page{
  --bg:#f3f7fd;--surface:#fff;--sunken:#eaf2fc;--fg:#172130;--muted:#738095;
  --border:rgba(82,119,158,.14);--accent:#438fd6;--accent-d:#2878bd;--on-accent:#fff;
  --accent-soft:rgba(67,143,214,.11);--ring:rgba(67,143,214,.17);
  --nav:#f8fbff;--nav-fg:#202c3a;--nav-mut:#76859a;
  --nav-hover:rgba(67,143,214,.08);--nav-active:rgba(67,143,214,.13);--nav-line:rgba(82,119,158,.12);
  background:#f3f7fd;
}
.user-page .auth{
  background:
    radial-gradient(70% 48% at 50% 14%,rgba(172,210,248,.34),rgba(0,0,0,0) 72%),
    linear-gradient(180deg,#f9fbff 0%,#eef5fd 100%);
}
.user-page .auth-card{border-color:rgba(104,145,187,.14);box-shadow:0 24px 70px rgba(74,112,151,.13)}
.user-page .brand-mark,.user-page .side-mark{
  background:radial-gradient(circle at 32% 25%,#a9d7ff 0%,#66a9e8 48%,#397fc0 100%);
  box-shadow:0 8px 22px rgba(65,135,199,.22);
}
.user-page .sidebar{background:var(--nav);color:var(--nav-fg);border-right:1px solid var(--nav-line);box-shadow:8px 0 32px rgba(66,105,146,.08)}
.user-page .side-brand small,.user-page .profile-meta,.user-page .logout{color:var(--nav-mut)}
.user-page .switch-track{background:rgba(67,143,214,.18)}
.user-page .header{
  border-bottom:1px solid rgba(82,119,158,.10);
  background:rgba(248,251,255,.88);
  -webkit-backdrop-filter:blur(16px);
  backdrop-filter:blur(16px);
}
.user-page .expert-avatar{
  background-color:#e9f3fd;
  background-image:url('/song-zhiping-avatar.jpg');
  background-size:cover;
  background-position:center;
  box-shadow:0 6px 18px rgba(65,135,199,.20);
}
.user-page .voice-toggle{border-color:rgba(82,119,158,.12);border-radius:var(--r-pill);background:rgba(255,255,255,.76);color:#4d79a6}
.user-page .messages{
  display:flex;
  flex-direction:column;
  background:
    radial-gradient(62% 38% at 50% 8%,rgba(179,215,249,.27),rgba(0,0,0,0) 72%),
    linear-gradient(180deg,#f7faff 0%,#eff5fc 100%);
}
/* 最近对话不足一屏时靠近输入区，而不是全部悬在页面上半部；内容超过一屏后 auto margin
   自动归零，既有滚动、向上分页和日期 offsetTop 语义不变。欢迎页仍使用自己的顶部布局。 */
.user-page .messages>.message:first-child,
.user-page .messages>.timeline-start:first-child,
.user-page .messages>.day-divider:first-child{margin-top:auto}
.user-page .welcome{max-width:620px}
.user-page .welcome .seal{border:0;background:radial-gradient(circle at 30% 24%,#c4e4ff,#79b5eb 52%,#3f83c0);color:#fff;box-shadow:0 12px 34px rgba(69,137,200,.22)}
.user-page .tip{border-color:rgba(82,119,158,.12);border-radius:var(--r-xl);background:rgba(255,255,255,.82);box-shadow:0 10px 30px rgba(79,117,156,.08)}
.user-page .message{--chat-pad-x:16px;width:100%;max-width:720px;gap:0;margin-bottom:18px}
.user-page .message>.mini-avatar{display:none}
.user-page .bubble-wrap{max-width:82%;min-width:0;display:flex;flex-direction:column}
/* 桌面端回答卡、操作行和时间统一占满 720px 内容列；提问保持靠右且不过宽。
   两种消息的右边界因此落在同一条线上，不再出现时间戳单独向右凸出的视觉断层。 */
.user-page .message.bot .bubble-wrap{width:100%;max-width:100%}
.user-page .message.user .bubble-wrap{align-items:flex-end}
.user-page .bubble{
  border:1px solid rgba(95,135,177,.13);
  border-radius:var(--r-lg);
  background:rgba(255,255,255,.91);
  box-shadow:0 8px 24px rgba(72,111,152,.075);
  padding:14px var(--chat-pad-x);
  line-height:var(--lh);
}
.user-page .message.user .bubble{
  border:1px solid rgba(82,145,206,.12);
  border-radius:var(--r-lg) var(--r-lg) var(--r-xs) var(--r-lg);
  background:rgba(214,233,251,.78);
  color:var(--fg);
  box-shadow:none;
}
.user-page .message{margin-bottom:12px}
.user-page .msg-time-row{width:100%;margin-top:3px}
.user-page .actions{width:100%;margin:-9px 0 -10px}
.user-page .actions .action:first-child{padding-left:var(--chat-pad-x)}
.user-page .action{color:#718197}
.user-page .msg-time{padding-left:6px}
.user-page .messages{padding-bottom:8px}
.user-page .composer{
  border-top:0;
  padding:6px clamp(14px,5vw,56px) calc(10px + env(safe-area-inset-bottom));
  background:linear-gradient(180deg,rgba(239,245,252,0),rgba(239,245,252,.96) 22%);
}
.user-page .composer-box{
  width:100%;
  max-width:720px;
  border-color:rgba(91,132,174,.14);
  border-radius:var(--r-lg);
  background:rgba(255,255,255,.94);
  box-shadow:0 10px 30px rgba(72,111,152,.11);
}
.user-page .composer textarea{padding-left:10px}

.user-page .notice{max-width:720px;color:#8390a1}
.user-page .text-drawer-host{background:#f2f7fd}
.user-page .text-drawer-sheet{border-color:rgba(82,119,158,.14);background:#f7faff;box-shadow:0 -20px 60px rgba(61,97,136,.18)}

/* Live 按参考图重新定标：顶部身份、居中光球、独立回答卡和整块底栏。 */
.user-page .voice-room{
  --imm-1:#fafcff;--imm-2:#f2f7fd;--imm-3:#edf4fc;--imm-fg:#162130;--imm-mut:#7d8899;
  --imm-pill:rgba(255,255,255,.80);--imm-line:rgba(83,125,168,.13);--imm-wave:rgba(81,155,224,.34);
  --imm-card:rgba(255,255,255,.88);--imm-sh:0 18px 50px rgba(75,113,153,.11);
  --call-orb-size:clamp(190px,50vw,260px);--call-orb-radius:clamp(95px,25vw,130px);
  padding:calc(18px + env(safe-area-inset-top)) clamp(16px,4vw,34px) calc(18px + env(safe-area-inset-bottom));
  background:
    radial-gradient(68% 38% at 50% 35%,rgba(176,214,251,.38),rgba(0,0,0,0) 73%),
    radial-gradient(50% 28% at 50% 60%,rgba(211,230,251,.32),rgba(0,0,0,0) 76%),
    linear-gradient(180deg,#fafcff 0%,#f2f7fd 52%,#edf4fc 100%);
  overflow:hidden;
}
.user-page .voice-room>*{width:min(100%,720px)}
/* 260ms 与 VOICE_ROOM_TRANSITION_MS 同步：进入从下向上展开，收起整页向下离场。 */
@keyframes voice-room-rise-in{from{transform:translateY(100%);opacity:.72}to{transform:translateY(0);opacity:1}}
@keyframes voice-room-fold-down{from{transform:translateY(0);opacity:1}to{transform:translateY(100%);opacity:.72}}
.user-page .voice-room.voice-room-entering{animation:voice-room-rise-in .26s cubic-bezier(.22,.78,.3,1) both}
.user-page .voice-room.voice-room-leaving{pointer-events:none;animation:voice-room-fold-down .26s cubic-bezier(.55,.05,.72,.32) both}
.user-page .voice-room-head{position:relative;z-index:var(--z-sticky-sub);gap:12px}
.user-page .expert-photo{
  width:52px;height:52px;border:0;
  background-color:#e9f3fd;
  background-image:var(--expert-photo),radial-gradient(circle at 32% 24%,#c2e3ff 0%,#82bceb 56%,#4e8ec8 100%);
  color:#fff;font-size:20px;box-shadow:0 8px 24px rgba(65,134,198,.18);
}
.user-page .voice-room-who strong{font-size:var(--fs-5);letter-spacing:-.01em}
.user-page .voice-room-mode{margin-top:3px;color:#8a93a0;font-size:var(--fs-3)}
.user-page .voice-room-mode::after{display:none}
.user-page .voice-room-head-actions{position:relative;display:flex;align-items:center;gap:8px;flex:none}
.user-page .voice-room-close,.user-page .voice-room-menu-button{
  width:48px;height:48px;border:0;border-radius:50%;background:rgba(255,255,255,.90);
  color:#657080;box-shadow:0 8px 24px rgba(77,110,145,.10);
}
.user-page .voice-room-close svg{width:26px;height:26px}
.user-page .voice-room-menu-button[aria-expanded=true]{background:#eaf4fe;color:#3e83c3}
.user-page .voice-room-stage{
  position:absolute;inset:0;width:100%;max-width:none;margin:0;padding:0;pointer-events:none;
}
.user-page .voice-room-state{
  position:absolute;left:50%;top:calc(50% - var(--call-orb-radius) - 34px);
  width:min(calc(100% - 32px),720px);transform:translate(-50%,-100%);text-align:center;
}
.user-page .voice-room-state strong{font-size:clamp(24px,5vw,34px);font-weight:600;letter-spacing:-.02em}
.user-page .voice-room-state span{margin-top:7px;color:#8a94a3;font-size:clamp(14px,3.4vw,17px)}
.user-page .voice-room-state{transition:opacity .16s ease}
.user-page .voice-room.settings-open .voice-room-state{opacity:0}
.user-page .voice-room-orbit{
  position:absolute;left:50%;top:50%;width:min(100%,720px);margin:0;
  transform:translate(-50%,-50%);gap:0;
}
.user-page .voice-room-wave{height:78px;gap:4px;opacity:.82}
.user-page .voice-room-wave i{width:2px;height:calc(7px + var(--orb-wave-main,0px));background:linear-gradient(180deg,rgba(94,165,229,.08),var(--imm-wave),rgba(94,165,229,.08))}
.user-page .voice-room-wave i:nth-child(2n){height:calc(4px + var(--orb-wave-even,0px))}
.user-page .voice-room-wave i:nth-child(3n){height:calc(10px + var(--orb-wave-third,0px))}
.user-page .voice-room-talk{position:relative;z-index:var(--z-sticky-sub);pointer-events:auto;border-radius:50%;filter:drop-shadow(0 18px 24px rgba(68,125,184,.20));will-change:transform}
/* Demo 的 canvas 在球外画四层细环；这里用按钮伪元素实现同一层次，不额外引入持续 canvas 绘制。 */
.user-page .voice-room-talk::before{
  content:"";position:absolute;inset:-26%;border-radius:50%;
  background:
    radial-gradient(circle,transparent 68%,rgba(91,151,216,.17) 68.4%,transparent 68.9%),
    radial-gradient(circle,transparent 77%,rgba(91,151,216,.14) 77.4%,transparent 77.9%),
    radial-gradient(circle,transparent 86%,rgba(91,151,216,.11) 86.4%,transparent 86.9%),
    radial-gradient(circle,transparent 95%,rgba(91,151,216,.08) 95.4%,transparent 95.9%);
  pointer-events:none;animation:voice-orb-rings 3.2s ease-in-out infinite;
}
@keyframes voice-orb-rings{0%,100%{transform:scale(.985);opacity:.66}50%{transform:scale(1.015);opacity:1}}
/* Demo 通过注册角度变量让多层锥形渐变各自转动；不支持 @property 的旧内核仍保留整层慢速旋转。 */
@property --voice-orb-angle{
  syntax:"<angle>";
  inherits:false;
  initial-value:0deg;
}
.user-page .voice-room-orb{
  --orb-size:var(--call-orb-size);--voice-orb-duration:20s;z-index:var(--z-sticky-sub);will-change:transform;isolation:isolate;overflow:hidden;
  background:#eef6ff;border:1px solid rgba(255,255,255,.95);border-radius:50%;
  box-shadow:0 18px 38px rgba(87,132,185,.16),0 0 28px rgba(161,207,251,.22),inset 0 0 0 1px rgba(142,188,239,.12);
  /* 真实音频能量额外推动整球上浮和放大；数值由 JS 直接算成 px/标量，避免旧 WebView 的 calc 乘法问题。 */
  transform:translateY(var(--orb-audio-y,0px)) scale(var(--orb-audio-scale,1));
  transition:transform .06s linear;
}
/* 参考用户提供的 Demo：多层蓝青渐变缓慢旋转，中心白色云团独立漂移。
   不使用 Demo 中的 oklch，继续遵守目标微信 XWeb 只使用 hex/rgba 的兼容约束。 */
.user-page .voice-room-orb::before,.user-page .voice-room-orb::after{content:"";position:absolute;display:block;border-radius:50%;pointer-events:none}
.user-page .voice-room-orb::before{
  --voice-orb-angle:0deg;inset:-9%;
  background:
    conic-gradient(from calc(var(--voice-orb-angle) * 2) at 25% 70%,#729fde,transparent 20% 80%,#729fde),
    conic-gradient(from calc(var(--voice-orb-angle) * 2) at 45% 75%,#62a6c8,transparent 30% 60%,#62a6c8),
    conic-gradient(from calc(var(--voice-orb-angle) * -3) at 80% 20%,#85b7e6,transparent 40% 60%,#85b7e6),
    conic-gradient(from calc(var(--voice-orb-angle) * 2) at 15% 5%,#5e97c4,transparent 10% 90%,#5e97c4),
    conic-gradient(from var(--voice-orb-angle) at 20% 80%,#a4d7f2,transparent 10% 90%,#a4d7f2),
    conic-gradient(from calc(var(--voice-orb-angle) * -2) at 85% 10%,#748fe0,transparent 20% 80%,#748fe0);
  filter:blur(4px) contrast(1.45);
  animation:
    voice-orb-color-turn var(--voice-orb-duration) linear infinite,
    voice-orb-surface-turn 28s linear infinite;
}
.user-page .voice-room-orb::after{
  z-index:var(--z-sticky-sub);inset:0;
  background-image:radial-gradient(circle at center,rgba(235,248,255,.72) 1.3px,transparent 1.5px);
  background-size:3.2px 3.2px;mix-blend-mode:overlay;
  -webkit-mask-image:radial-gradient(#000 25%,transparent 75%);mask-image:radial-gradient(#000 25%,transparent 75%);
}
@keyframes voice-orb-color-turn{to{--voice-orb-angle:360deg}}
@keyframes voice-orb-surface-turn{to{transform:rotate(360deg) scale(1.03)}}
.user-page .voice-room-orb[data-orb-state=listening]{--voice-orb-duration:8s}
.user-page .voice-room-orb[data-orb-state=thinking]{--voice-orb-duration:11s}
.user-page .voice-room-orb[data-orb-state=speaking]{--voice-orb-duration:6s}
.user-page .voice-room-orb .orb-core{
  z-index:var(--z-sticky);inset:16%;pointer-events:none;background:rgba(252,254,255,.94);border:0;
  border-radius:42% 58% 54% 46% / 52% 43% 57% 48%;
  box-shadow:0 0 20px 18px rgba(249,253,255,.68),0 0 34px 23px rgba(237,247,255,.28);
  filter:blur(5px);animation:voice-orb-core-drift 14s ease-in-out infinite alternate;
}
@keyframes voice-orb-core-drift{
  0%{border-radius:42% 58% 54% 46% / 52% 43% 57% 48%;transform:rotate(0deg) scale(1,.96)}
  50%{border-radius:56% 44% 47% 53% / 44% 58% 42% 56%;transform:rotate(105deg) scale(1.05,.93)}
  100%{border-radius:48% 52% 60% 40% / 58% 46% 54% 42%;transform:rotate(225deg) scale(.94,1.06)}
}
.user-page .voice-room-orb[data-orb-state=blocked]{filter:grayscale(.82);opacity:.72}
.user-page .voice-room-sound-bars{
  z-index:var(--z-backdrop);inset:0;height:30px;margin:auto;display:flex;align-items:center;justify-content:center;gap:4px;
  border-radius:0;opacity:.42;filter:drop-shadow(0 1px 8px rgba(255,255,255,.8));transition:opacity .3s ease;
}
.user-page .voice-room-sound-bars i{
  width:3px;height:7px;border-radius:var(--r-xs);background:linear-gradient(180deg,#89b9e8,#527eaf);
  animation:voice-orb-center-bar .68s ease-in-out infinite alternate;animation-play-state:paused;
}
.user-page .voice-room-sound-bars i:nth-child(2),.user-page .voice-room-sound-bars i:nth-child(6){height:13px;animation-delay:-.32s}
.user-page .voice-room-sound-bars i:nth-child(3),.user-page .voice-room-sound-bars i:nth-child(5){height:20px;animation-delay:-.56s}
.user-page .voice-room-sound-bars i:nth-child(4){height:26px;animation-delay:-.18s}
.user-page .voice-room-orb[data-orb-state=listening] .voice-room-sound-bars,
.user-page .voice-room-orb[data-orb-state=thinking] .voice-room-sound-bars,
.user-page .voice-room-orb[data-orb-state=speaking] .voice-room-sound-bars{opacity:.92}
.user-page .voice-room-orb[data-orb-state=listening] .voice-room-sound-bars i,
.user-page .voice-room-orb[data-orb-state=thinking] .voice-room-sound-bars i,
.user-page .voice-room-orb[data-orb-state=speaking] .voice-room-sound-bars i{animation-play-state:running}
@keyframes voice-orb-center-bar{to{height:28px}}
/* 状态只做克制的微波动；真实声音再叠加上面的 0~3px 音频位移，避免整球大幅蹦跳。 */
@keyframes voice-orb-listening-pulse{
  0%,100%{transform:translateY(.5px) scale(.999)}
  48%{transform:translateY(-1.5px) scale(1.006)}
}
@keyframes voice-orb-speaking-pulse{
  0%,100%{transform:translateY(.5px) scale(.998)}
  34%{transform:translateY(-2px) scale(1.008)}
  68%{transform:translateY(-.5px) scale(1.003)}
}
.user-page .voice-room-talk[data-orb-state=listening]{animation:voice-orb-listening-pulse 1.15s ease-in-out infinite}
.user-page .voice-room-talk[data-orb-state=speaking]{animation:voice-orb-speaking-pulse .82s ease-in-out infinite}
/* 宋老师播报时，球后的左右音波按错峰节奏轻微起伏；真实 analyser 写入的条高仍保留，
   CSS 只做 scaleY 动态，让无声字间也不会突然凝固。 */
@keyframes voice-wave-speaking{0%,100%{transform:scaleY(.58);opacity:.46}45%{transform:scaleY(1.12);opacity:1}72%{transform:scaleY(.78);opacity:.68}}
.user-page .voice-room-wave i{transform-origin:center;will-change:transform,opacity}
.user-page .voice-room-stage[data-orb-state=speaking] .voice-room-wave i{animation:voice-wave-speaking .72s ease-in-out infinite}
.user-page .voice-room-stage[data-orb-state=speaking] .voice-room-wave i{height:calc(12px + var(--orb-wave-main,0px))}
.user-page .voice-room-stage[data-orb-state=speaking] .voice-room-wave i:nth-child(2n){height:calc(18px + var(--orb-wave-even,0px))}
.user-page .voice-room-stage[data-orb-state=speaking] .voice-room-wave i:nth-child(3n){height:calc(26px + var(--orb-wave-third,0px))}
.user-page .voice-room-stage[data-orb-state=speaking] .voice-room-wave i:nth-child(2n){animation-delay:-.18s}
.user-page .voice-room-stage[data-orb-state=speaking] .voice-room-wave i:nth-child(3n){animation-delay:-.36s}
.user-page .voice-room-talk-label{
  position:absolute;width:1px;height:1px;min-height:0;margin:-1px;padding:0;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap;border:0;
}
.user-page .voice-room-settings{
  position:absolute;right:0;top:calc(100% + 10px);z-index:calc(var(--z-modal) + 1);
  width:248px;display:flex;flex-direction:column;gap:7px;padding:10px;
  border:1px solid rgba(83,125,168,.14);border-radius:var(--r-xl);background:rgba(255,255,255,.96);
  box-shadow:0 22px 55px rgba(63,97,133,.20);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);
}
.user-page .voice-room-settings.hidden{display:none}
.user-page .voice-room-settings-title{padding:4px 8px 7px;color:#84909e;font-size:var(--fs-2);font-weight:600}
.user-page .voice-room-setting{
  width:100%;min-height:58px;display:flex;align-items:center;justify-content:space-between;gap:16px;
  padding:8px 9px 8px 12px;border:0;border-radius:var(--r-lg);
  background:#f4f8fc;color:#263749;box-shadow:none;
  transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease;
}
.user-page .voice-room-setting-copy{display:flex;flex-direction:column;align-items:flex-start;line-height:var(--lh-tight)}
.user-page .voice-room-setting-copy strong{font-size:var(--fs-3);font-weight:600}
.user-page .voice-room-setting-copy small{margin-top:4px;color:#8995a5;font-size:var(--fs-1)}
.user-page .voice-room-switch{
  width:46px;height:28px;flex:none;position:relative;border-radius:var(--r-pill);
  background:#d7e0e9;box-shadow:inset 0 0 0 1px rgba(67,92,119,.08);
  transition:background .2s ease,box-shadow .2s ease;
}
.user-page .voice-room-switch i{
  position:absolute;left:3px;top:3px;width:22px;height:22px;border-radius:50%;background:#fff;
  box-shadow:0 2px 7px rgba(43,70,97,.22);transition:transform .2s ease;
}
.user-page .voice-room-setting.on .voice-room-switch{background:linear-gradient(135deg,#65b3f0,#3f8ed9);box-shadow:0 5px 14px rgba(61,142,217,.22)}
.user-page .voice-room-setting.on .voice-room-switch i{transform:translateX(18px)}
.user-page .voice-room-setting:focus-visible{outline:3px solid rgba(66,145,218,.28);outline-offset:3px}
@media(hover:hover) and (pointer:fine){.user-page .voice-room-setting:hover{transform:none;background:#edf5fd;box-shadow:none}.user-page .voice-room-close:hover,.user-page .voice-room-menu-button:hover{background:#edf5fd;color:#3e83c3}}
.user-page .voice-room-text{
  flex:0 1 auto;width:min(100%,700px);height:clamp(154px,21vh,218px);max-height:none;
  margin-top:clamp(22px,4vh,36px);padding:20px 22px;
  border-color:rgba(83,125,168,.13);border-radius:var(--r-2xl);background:rgba(255,255,255,.88);
  box-shadow:0 18px 50px rgba(75,113,153,.10);overflow:auto;
}
.user-page .voice-room-card-head{gap:10px;margin-bottom:15px}
.user-page .voice-room-card-head strong{font-size:var(--fs-4);color:#253548}
.user-page .voice-room-seal{
  width:34px;height:34px;position:relative;background:radial-gradient(circle at 30% 24%,#d9efff 0%,#8fc4f3 52%,#5698d5 100%);
  box-shadow:0 5px 14px rgba(69,140,205,.22);
}
.user-page .voice-room-seal::before{content:"✦";position:absolute;inset:0;display:grid;place-items:center;color:#fff;font-size:var(--fs-5)}
.user-page .voice-room-bars{height:18px;gap:3px;opacity:.42}
.user-page .voice-room-bars.active{opacity:1}
.user-page .voice-room-bars i{width:3px;background:#4c9bdd}
.user-page .voice-room-ask:not(.partial){display:none!important}
.user-page .voice-room-ask.partial{
  margin:-5px 0 10px;padding:7px 10px;border-radius:var(--r-sm);background:#eef6fe;color:#678099;
  font-size:var(--fs-2);font-style:normal;
}
.user-page .voice-room-answer{font-size:clamp(var(--fs-4),3.7vw,var(--fs-5));line-height:var(--lh-loose);letter-spacing:.01em}
.user-page .voice-room-answer.placeholder{font-size:var(--fs-3);color:#909aaa}
.user-page .voice-room-controls{
  width:min(100%,700px);min-height:64px;flex-wrap:nowrap;gap:0;margin-top:auto;padding:7px 10px;
  border:1px solid rgba(83,125,168,.11);border-radius:var(--r-2xl);background:rgba(255,255,255,.94);
  box-shadow:0 16px 42px rgba(72,111,152,.12);
}
.user-page .voice-room-action{
  min-width:0;min-height:50px;flex:1;border:0;border-radius:0;background:none;color:#263749;
  padding:0 12px;font-size:var(--fs-4);font-weight:600;
}
.user-page .voice-room-action+ .voice-room-action:not(.hidden){border-left:1px solid rgba(83,125,168,.13)}
.user-page .voice-room-cancel{color:#b5524b}

@media(max-width:700px){
  .user-page .voice-room{padding:calc(12px + env(safe-area-inset-top)) 14px calc(12px + env(safe-area-inset-bottom))}
  .user-page .voice-room-head{gap:9px}
  .user-page .expert-photo{width:48px;height:48px}
  .user-page .voice-room-who strong{font-size:var(--fs-5)}
  .user-page .voice-room-close,.user-page .voice-room-menu-button{width:44px;height:44px}
  .user-page .voice-room-head-actions{gap:6px}
  .user-page .voice-room-settings{right:0;width:min(248px,calc(100vw - 28px))}
  .user-page .voice-room-wave{margin:0 -4px}
  .user-page .voice-room-text{padding:16px 17px;border-radius:var(--r-xl)}
  .user-page .voice-room-controls{min-height:62px;border-radius:var(--r-xl)}
  .user-page .message{--chat-pad-x:14px;margin-bottom:10px}
  .user-page .bubble-wrap{max-width:88%}
  .user-page .message.bot .bubble-wrap{max-width:100%}
  .user-page .bubble{padding:12px 14px;border-radius:var(--r-lg);line-height:var(--lh)}
  .user-page .message.user .bubble{border-radius:var(--r-lg) var(--r-lg) var(--r-xs) var(--r-lg)}
  .user-page .actions{margin-top:-10px;margin-bottom:-11px}
  .user-page .messages{padding-bottom:5px}
  .user-page .composer{padding-top:5px}
  .user-page .expert-info small{display:block;font-size:var(--fs-1)}
  .user-page .expert-info strong{font-size:var(--fs-4)}
  .user-page .header{gap:7px;padding-left:8px;padding-right:8px}
  .user-page .voice-toggle{padding-left:8px;padding-right:8px}
}
/* 320px 级窄屏同时放姓名、自动朗读和通话入口时会把“宋志平老师”压成“宋…”。
   只在这一档把自动朗读收成仍有 44px 热区的图标按钮，语义文本保留给读屏。 */
@media(max-width:340px){
  .user-page .expert-info small{display:none}
  .user-page #voiceToggle{width:44px;padding:0;gap:0;font-size:0;justify-content:center}
}
@media(max-height:760px){
  .user-page .voice-room{--call-orb-size:clamp(144px,37vw,190px);--call-orb-radius:clamp(72px,18.5vw,95px)}
  .user-page .voice-room-state strong{font-size:var(--fs-6)}
  .user-page .voice-room-state span{font-size:var(--fs-3);margin-top:3px}
  .user-page .voice-room-text{height:132px;margin-top:14px;padding-top:14px;padding-bottom:14px}
  .user-page .voice-room-card-head{margin-bottom:8px}
  .user-page .voice-room-controls{min-height:56px;padding-top:3px;padding-bottom:3px}
  .user-page .voice-room-action{min-height:48px}
  .user-page .voice-room-setting{min-height:54px}
}
@media(max-width:480px){
  /* 与手机消息列 12px 页面边距严格对齐，输入框不再比气泡额外内缩。 */
  .user-page .composer{padding-left:12px;padding-right:12px}
}
@media(prefers-reduced-motion:reduce){
  .user-page .voice-room-talk,.user-page .voice-room-talk::before,.user-page .voice-room-orb,.user-page .voice-room-orb::before,.user-page .voice-room-orb .orb-core,.user-page .voice-room-sound-bars i,.user-page .voice-room-wave i,.user-page .voice-room.voice-room-entering,.user-page .voice-room.voice-room-leaving{animation:none}
}
