/*
 * 钱包 H5 的样式表。
 *
 * 内边距与行高只从 tokens.css 取（P3 · 2026-11-01）。P1 抽出了 --s-* / --lh-* 但没人强制
 * 用，于是卡片类内边距长到 8 个字面量（12/14/15/17/18/22/24/25px）、行高长到 9 个取值。
 * 现在它们一律写成 var(--s-*) / var(--lh-*)：
 *   - 字面量按 4px 栅格就近归并到最近的槽位（居中的 6/10/14/22/30 向上取；18 和 26 向下取，
 *     为的是让相邻规则的左右内边距继续对齐）。归并会改外观，这是预期的。
 *   - 页面级底部留白没有自己的槽位，写成 calc(var(--s-*)*2)，数值来源仍然是槽位。
 *   - env() / max() 里的值是设备边衬和页面水槽的几何量，不走间距标尺。
 * 这条约束由 test/visual-tokens.test.mjs 守着——新加的规则别再写裸 px 内边距。
 */
:root{font-family:var(--font-sans);color:var(--c-text);background:var(--c-canvas);letter-spacing:0}*{box-sizing:border-box}body{margin:0;min-width:320px}button,input,select{font:inherit}button{cursor:pointer}button:disabled{cursor:not-allowed;opacity:.46}h1,h2,h3,p{margin-top:0}h1{font-size:var(--fs-3xl);font-weight:700;margin-bottom:0}h2{font-size:var(--fs-lg);margin-bottom:0}h3{font-size:var(--fs-base);margin-bottom:var(--s-2)}p{line-height:var(--lh-base)}.topbar{height:66px;background:var(--c-surface);border-bottom:1px solid var(--c-border);display:flex;align-items:center;gap:40px;padding:0 max(var(--s-7),calc((100vw - 1320px)/2));position:sticky;top:0;z-index:10}.brand{display:flex;align-items:center;gap:11px;white-space:nowrap;font-weight:700;color:var(--c-brand-ink-strong)}.brand strong{color:var(--c-text)}.brand-mark{display:grid;place-items:center;background:var(--c-brand);color:var(--c-on-brand);width:31px;height:31px;border-radius:var(--r-md);font-size:17px}.topbar nav{display:flex;height:100%;align-items:stretch;gap:24px}.nav{background:none;border:0;border-bottom:2px solid transparent;padding:0 var(--s-1);color:var(--c-text-muted);font-size:14px}.nav.active{border-color:var(--c-brand);color:var(--c-brand-ink-strong);font-weight:650}.account-button{margin-left:auto;border:1px solid var(--c-border);background:var(--c-surface);padding:var(--s-2) var(--s-4);border-radius:var(--r-sm);color:var(--c-brand-ink-strong);font-size:13px;max-width:210px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}main{max-width:1320px;padding:var(--s-8) var(--s-7) calc(var(--s-8)*2);margin:0 auto}.page-heading{display:flex;justify-content:space-between;align-items:end;gap:18px;margin-bottom:29px}.eyebrow{font-size:var(--fs-2xs);font-weight:750;color:var(--c-eyebrow);letter-spacing:1px;margin-bottom:8px}.heading-meta{color:var(--c-text-muted);font-size:var(--fs-body)}.explore-layout{display:grid;grid-template-columns:315px minmax(0,1fr);gap:34px;align-items:start}.search-panel{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-md);padding:var(--s-6);display:grid;gap:17px}.search-panel h2{margin-bottom:3px}.field-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}label{font-size:var(--fs-xs);font-weight:630;color:var(--c-text-muted);display:grid;gap:7px}input,select{width:100%;border:1px solid var(--c-field-border);border-radius:var(--r-sm);padding:var(--s-3);background:var(--c-surface);color:var(--c-text);min-width:0;font-size:var(--fs-body)}input:focus,select:focus{outline:2px solid var(--c-brand-focus);outline-offset:1px;border-color:var(--c-brand)}.primary,.secondary,.quiet{border-radius:var(--r-sm);padding:var(--s-3) var(--s-4);font-size:var(--fs-body);font-weight:680;min-height:40px}.primary{background:var(--c-brand);color:var(--c-on-brand);border:1px solid var(--c-brand)}.primary:hover:not(:disabled){background:var(--c-brand-hover)}.secondary{background:var(--c-surface);color:var(--c-brand-ink);border:1px solid var(--c-brand-border)}.secondary:hover{background:var(--c-brand-surface)}.quiet{background:transparent;color:var(--c-text-muted);border:0}.full{width:100%}.results-area{min-width:0}.empty-state{min-height:425px;display:flex;flex-direction:column;align-items:center;justify-content:center;border:1px dashed var(--c-brand-border);border-radius:var(--r-md);text-align:center;color:var(--c-text-muted)}.empty-state h2{color:var(--c-brand-ink-strong);margin:8px 0}.empty-state p{font-size:13px}.empty-glyph{font-size:35px;color:var(--c-brand)}.section-heading{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:12px}.section-heading span{font-size:12px;color:var(--c-text-faint)}.hotel-heading{margin-top:26px}.offer-list{display:grid;gap:9px}.offer{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-md);padding:var(--s-4) var(--s-5);display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:17px;cursor:pointer;min-height:91px}.offer.selected{border-color:var(--c-brand);box-shadow:var(--ring-selected)}.offer input{width:16px;height:16px;accent-color:var(--c-brand)}.offer-main{min-width:0}.offer-title{font-size:15px;font-weight:690;color:var(--c-text)}.offer-sub{font-size:12px;color:var(--c-text-muted);margin-top:6px;line-height:var(--lh-snug)}.offer-price{font-size:16px;font-weight:740;white-space:nowrap;color:var(--c-brand-ink-strong)}.offer-price small{font-size:11px;font-weight:500;color:var(--c-text-faint);margin-right:3px}.selection-bar{display:flex;justify-content:space-between;align-items:center;gap:15px;border-top:1px solid var(--c-border);margin-top:24px;padding-top:var(--s-5)}.selection-bar small{display:block;color:var(--c-text-faint);font-size:11px;margin-bottom:3px}.selection-bar strong{font-size:19px;color:var(--c-brand-ink-strong)}.checkout-layout{display:grid;grid-template-columns:minmax(0,1fr) 345px;gap:34px;align-items:start}.trip-summary{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-md);padding:var(--s-6)}.trip-summary h2{font-size:19px;margin-bottom:16px}.summary-top{display:flex;justify-content:space-between;gap:15px;align-items:start;border-bottom:1px solid var(--c-border-subtle);padding-bottom:var(--s-5)}.summary-destination{font-size:23px;font-weight:750;color:var(--c-brand-ink-strong)}.summary-dates{font-size:12px;color:var(--c-text-muted);margin-top:8px}.summary-line{display:flex;justify-content:space-between;gap:20px;padding:var(--s-4) 0;border-bottom:1px solid var(--c-border-subtle);font-size:13px}.summary-line:last-child{border:0}.summary-line strong{font-size:14px;white-space:nowrap}.summary-line span{color:var(--c-text-muted)}.checkout-aside{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-md);padding:var(--s-6);position:sticky;top:88px}.aside-heading{display:flex;justify-content:space-between;align-items:center}.sandbox-tag{background:var(--c-brand-surface);color:var(--c-brand-ink);font-size:10px;padding:var(--s-1) var(--s-2);border-radius:var(--r-sm)}.amount-line,.balance-line{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:var(--s-5) 0;border-bottom:1px solid var(--c-border-subtle);font-size:13px;color:var(--c-text-muted)}.amount-line strong{font-size:21px;color:var(--c-brand-ink-strong)}.balance-line strong{font-size:15px;color:var(--c-brand-ink-strong)}.checkout-step{padding:var(--s-5) 0;border-bottom:1px solid var(--c-border-subtle)}.checkout-step p{font-size:12px;color:var(--c-text-muted);margin:0 0 14px}.checkout-step form{display:grid;gap:12px}.approval-box{padding:var(--s-4);margin:17px 0;background:var(--c-brand-surface);border-left:3px solid var(--c-brand);display:grid;gap:4px;font-size:12px;color:var(--c-text-muted)}.approval-box strong{font-size:16px;color:var(--c-brand-ink-strong)}.approval-box small{font-size:11px}.confirm-line{display:flex;align-items:start;gap:8px;margin:20px 0;font-size:12px;line-height:var(--lh-base);font-weight:500}.confirm-line input{width:16px;height:16px;flex:none;margin:1px 0;accent-color:var(--c-brand)}.status-panel{border:1px solid var(--c-border);background:var(--c-surface);border-left:4px solid var(--c-warn);border-radius:var(--r-sm);padding:var(--s-6);margin-top:20px}.status-panel h2{margin-bottom:7px}.status-panel p{margin:0;color:var(--c-text-muted);font-size:13px}.status-panel.success{border-left-color:var(--c-brand)}.order-list,.mandate-list{display:grid;gap:9px}.order-row,.mandate-row{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-md);padding:var(--s-5);display:flex;justify-content:space-between;align-items:center;gap:15px}.order-row h3{margin-bottom:6px}.order-row p,.mandate-row p{margin:0;color:var(--c-text-muted);font-size:12px}.order-state{font-size:12px;font-weight:700;color:var(--c-state-pending)}.order-row button{border:1px solid var(--c-brand-border);background:var(--c-surface);border-radius:var(--r-sm);padding:var(--s-2) var(--s-3);color:var(--c-brand-ink)}.wallet-layout{display:grid;grid-template-columns:320px minmax(0,1fr);gap:35px}.notice{background:var(--c-warn-surface);border-left:4px solid var(--c-warn);color:var(--c-warn-ink);padding:var(--s-3) var(--s-4);margin-bottom:22px;border-radius:var(--r-sm);font-size:13px}.notice.error{background:var(--c-danger-surface);border-color:var(--c-danger);color:var(--c-danger-ink)}.auth-dialog{border:1px solid var(--c-border);border-radius:var(--r-lg);padding:var(--s-7);width:min(420px,calc(100vw - 36px))}.auth-dialog::backdrop{background:var(--c-overlay)}.auth-dialog h2{font-size:21px;margin-bottom:24px}.dialog-close{position:absolute;right:17px;top:12px;border:0;background:none;font-size:25px;color:var(--c-text-muted)}.auth-tabs{display:flex;border-bottom:1px solid var(--c-border);margin-bottom:20px;gap:20px}.auth-tabs button{border:0;border-bottom:2px solid transparent;background:none;padding:0 var(--s-1) var(--s-3);color:var(--c-text-muted)}.auth-tabs button.active{border-color:var(--c-brand);color:var(--c-brand-ink);font-weight:700}#auth-form{display:grid;gap:16px}#auth-form button{margin-top:7px}[hidden]{display:none!important}@media(max-width:900px){.topbar{gap:20px;padding:0 var(--s-5)}.topbar nav{gap:12px}.explore-layout{grid-template-columns:280px minmax(0,1fr);gap:22px}.checkout-layout{grid-template-columns:minmax(0,1fr) 300px;gap:20px}}@media(max-width:700px){.topbar{height:auto;min-height:58px;flex-wrap:wrap;gap:0;padding:var(--s-3) var(--s-4)}.brand{font-size:14px}.account-button{padding:var(--s-2)}.topbar nav{order:3;width:100%;justify-content:space-between;margin-top:10px;height:36px}.nav{font-size:12px}.topbar nav .nav{padding:0 var(--s-1)}main{padding:var(--s-6) var(--s-4) calc(var(--s-7)*2)}.page-heading{align-items:start;flex-direction:column;margin-bottom:18px}h1{font-size:23px}.explore-layout,.checkout-layout,.wallet-layout{display:block}.search-panel{margin-bottom:24px;padding:var(--s-4)}.checkout-aside{position:static;margin-top:20px}.heading-meta{font-size:12px}.offer{padding:var(--s-4);gap:10px;grid-template-columns:auto minmax(0,1fr) auto}.offer-title{font-size:13px}.offer-price{font-size:13px}.selection-bar{position:sticky;bottom:0;background:var(--c-canvas);padding:var(--s-3) 0}.order-row{align-items:start}.order-row button{white-space:nowrap}}
.agent-connect{border-top:1px solid var(--c-border);margin-top:26px;padding-top:var(--s-5)}.agent-connect h2{margin-bottom:13px}.agent-connect #token-output{margin-top:13px;display:flex;align-items:end;gap:9px}.agent-connect #token-output label{flex:1;min-width:0}.agent-connect #token-output input{font-family:ui-monospace,monospace}.agent-connect #token-output button{white-space:nowrap}@media(max-width:700px){.agent-connect #token-output{display:block}.agent-connect #token-output button{margin-top:9px}}
.eyebrow{letter-spacing:0}@media(max-width:700px){.selection-bar{position:static}}
.summary-top .sandbox-tag{white-space:nowrap}
.wallet-subheading{margin-top:29px}.mandate-row strong{font-size:14px;color:var(--c-brand-ink);white-space:nowrap}
.balance-band{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));background:var(--c-brand-dark);color:var(--c-on-brand);border-radius:var(--r-md);padding:var(--s-6) var(--s-7);gap:24px}.balance-band>div{display:grid;gap:10px;border-right:1px solid var(--c-border-on-dark)}.balance-band>div:last-child{border:0}.balance-band span{color:var(--c-text-on-dark-muted);font-size:13px}.balance-band strong{font-size:28px;line-height:var(--lh-tight)}.wallet-actions{display:flex;gap:10px;margin:20px 0 35px;flex-wrap:wrap}.dashboard-grid{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(280px,.8fr);gap:36px}.dashboard-grid .section-heading{align-items:center}.dashboard-grid .section-heading button{padding:var(--s-1) 0}.business-links{border-top:1px solid var(--c-border);margin-top:24px;padding-top:var(--s-6)}.business-links p,.muted{color:var(--c-text-muted);font-size:var(--fs-body)}.business-links button{margin:0 8px 8px 0}.management-layout{display:grid;grid-template-columns:320px minmax(0,1fr);gap:35px;align-items:start}.mandate-item{align-items:start}.mandate-item>div:first-child{min-width:0}.mandate-item p{margin-top:5px}.mandate-actions{display:flex;flex-wrap:wrap;justify-content:end;gap:2px}.mandate-actions button{padding:var(--s-2);min-height:30px}.segmented{display:flex;gap:3px;padding:var(--s-1);background:var(--c-surface-sunken);width:max-content;max-width:100%;margin-bottom:20px;border-radius:var(--r-sm)}.segmented button{border:0;background:transparent;padding:var(--s-2) var(--s-3);border-radius:var(--r-sm);font-size:13px;color:var(--c-text-muted)}.segmented button.active{background:var(--c-surface);color:var(--c-brand-ink-strong)}.settings-list{max-width:800px}.settings-row{display:flex;justify-content:space-between;gap:18px;border-bottom:1px solid var(--c-border);padding:var(--s-5) 0;font-size:14px}.settings-row span{color:var(--c-text-muted)}.settings-row strong{font-size:13px;text-align:right;overflow-wrap:anywhere}.settings-list .agent-connect{margin-top:12px}@media(max-width:700px){.topbar nav{gap:0}.topbar nav .nav{font-size:12px;padding:0 var(--s-2)}.balance-band{padding:var(--s-5);gap:12px}.balance-band strong{font-size:19px}.balance-band span{font-size:11px}.dashboard-grid,.management-layout{display:block}.dashboard-grid>div+div{margin-top:32px}.management-layout .search-panel{margin-bottom:30px}.mandate-item{display:block}.mandate-actions{justify-content:start;margin-top:8px}.segmented{width:100%;overflow-x:auto}.segmented button{white-space:nowrap;padding:var(--s-2) var(--s-3)}.settings-row{display:block}.settings-row strong{display:block;text-align:left;margin-top:8px}}

/* Embedded H5 app shell: desktop previews the same single-column mobile surface. */
html{background:var(--c-canvas-shell)}body{max-width:430px;min-height:100dvh;margin:auto;background:var(--c-canvas);color:var(--c-text)}.topbar{height:54px;min-height:54px;padding:0 var(--s-4);max-width:430px;gap:10px;background:var(--c-surface);position:sticky;top:0;z-index:12}.brand{font-size:15px}.brand-mark{width:28px;height:28px}.brand strong{color:var(--c-brand-ink-strong)}.account-button{font-size:12px;padding:var(--s-2);max-width:135px}.topbar nav{position:fixed;top:auto;bottom:0;left:50%;transform:translateX(-50%);width:min(100%,430px);height:calc(60px + env(safe-area-inset-bottom));padding:0 var(--s-1) env(safe-area-inset-bottom);margin:0;background:var(--c-surface);border-top:1px solid var(--c-border);display:flex;justify-content:space-around;gap:0;z-index:20}.topbar nav .nav{display:flex;flex:1;flex-direction:column;align-items:center;justify-content:center;gap:3px;border:0;padding:var(--s-1) 0;color:var(--c-text-faint);font-size:10px;min-width:0}.topbar nav .nav.active{color:var(--c-brand-ink)}.nav svg{width:21px;height:21px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;flex:none}.topbar nav .nav.active svg{stroke-width:2.1}main{max-width:none;min-height:calc(100dvh - 54px);padding:var(--s-4) var(--s-4) calc(var(--s-8)*2 + env(safe-area-inset-bottom));margin:0}.page-heading{margin-bottom:14px;align-items:center}.page-heading h1{font-size:var(--fs-lg)}.eyebrow{display:none}.heading-meta{font-size:11px}.balance-band{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0;padding:var(--s-4);background:var(--c-surface);color:var(--c-text);border:1px solid var(--c-border);border-radius:var(--r-md)}.balance-band>div{border:0;display:grid;gap:5px;padding:var(--s-3) 0 0}.balance-band>div:first-child{grid-column:1/-1;padding:0 0 var(--s-4);border-bottom:1px solid var(--c-border-subtle)}.balance-band>div:last-child{text-align:right}.balance-band span{font-size:12px;color:var(--c-text-faint)}.balance-band strong{font-size:17px;line-height:var(--lh-tight);color:var(--c-text)}.balance-band>div:first-child strong{font-size:35px;color:var(--c-text-strong)}.wallet-actions{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin:12px 0 20px}.wallet-actions button{width:100%;min-height:40px;padding:var(--s-2)}.wallet-actions button:last-child{grid-column:1/-1}.dashboard-grid,.management-layout,.explore-layout,.checkout-layout,.wallet-layout{display:block}.dashboard-grid{border:0}.dashboard-grid>div+div{margin-top:14px}.dashboard-grid>div{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-md);padding:var(--s-4)}.dashboard-grid .section-heading{margin-bottom:10px}.dashboard-grid .section-heading h2,.business-links h2{font-size:14px}.dashboard-grid .mandate-list{gap:0}.dashboard-grid .mandate-row{border:0;border-radius:0;border-top:1px solid var(--c-border-subtle);padding:var(--s-3) 0;font-size:13px}.dashboard-grid .mandate-row:first-child{border-top:0}.dashboard-grid .mandate-list p{font-size:12px;color:var(--c-text-faint);margin:4px 0}.business-links{margin-top:10px;padding-top:var(--s-3)}.business-links p{font-size:12px;margin:7px 0 12px}.business-links button{font-size:12px}.search-panel,.trip-summary,.checkout-aside{padding:var(--s-4);border-radius:var(--r-md)}.management-layout .search-panel{margin-bottom:14px}.management-layout>div{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-md);padding:var(--s-4)}.management-layout>div .mandate-row{padding:var(--s-3) 0;border:0;border-top:1px solid var(--c-border-subtle);border-radius:0}.management-layout>div .mandate-row:first-child{border-top:0}.mandate-item{display:block}.mandate-actions{justify-content:start;margin-top:8px}.mandate-actions button{font-size:12px}.order-row,.mandate-row{min-width:0}.mandate-row>div:first-child{min-width:0;overflow-wrap:anywhere}.mandate-row button{flex:none}.segmented{width:100%;overflow-x:auto;max-width:none}.segmented button{white-space:nowrap;font-size:11px;padding:var(--s-2)}#bill-list .mandate-row{padding:var(--s-4);align-items:start}#bill-list .mandate-row h3{font-size:13px}#bill-list .mandate-row p{overflow-wrap:anywhere}.settings-list{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-md);padding:0 var(--s-4)}.settings-row{display:block}.settings-row strong{display:block;text-align:left;margin-top:6px}.settings-list .agent-connect{margin:0;padding:var(--s-5) 0}.selection-bar{position:static}.search-panel{margin-bottom:15px}.checkout-aside{position:static;margin-top:15px}.offer{padding:var(--s-3);gap:8px}.offer-price{font-size:12px}.notice{font-size:12px}.auth-dialog{padding:var(--s-6)}@media(max-width:430px){html{background:var(--c-canvas)}.topbar{width:100%;flex-wrap:nowrap}.topbar nav{margin:0;height:calc(60px + env(safe-area-inset-bottom))}.balance-band strong{font-size:17px}.balance-band>div:first-child strong{font-size:35px}}
.page-heading{flex-direction:row;align-items:center}
.funding-switch{margin-bottom:14px}.funding-switch button{flex:1;font-size:13px}.surface-section{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-md);padding:var(--s-4);margin:14px 0}.surface-section h2{font-size:14px;margin-bottom:12px}.surface-section form{display:grid;gap:12px}.surface-section .mandate-row{border:0;border-top:1px solid var(--c-border-subtle);border-radius:0;padding:var(--s-3) 0}.surface-section .mandate-row:first-child{border-top:0}.surface-section .mandate-list{gap:0}.surface-section .mandate-list>p{font-size:12px;color:var(--c-text-faint)}.surface-section .muted{margin-bottom:12px}.demo-code{font-variant-numeric:tabular-nums;font-size:28px;font-weight:750;letter-spacing:4px;text-align:center;background:var(--c-brand-surface);color:var(--c-brand-ink);border-radius:var(--r-md);padding:var(--s-4);margin:15px 0}.auth-dialog #verification-form{display:grid;gap:15px}.auth-dialog #verification-form input{text-align:center;font-size:20px;letter-spacing:4px}.funding-status{font-size:11px;color:var(--c-text-muted)}.funding-method{font-weight:650;font-size:13px}.surface-section .mandate-row button{font-size:12px;padding:var(--s-2)}.surface-section .mandate-row>div{min-width:0;overflow-wrap:anywhere}
.connect-layout{max-width:640px;padding:var(--s-5) 0}.connect-layout h2{font-size:20px;margin:0 0 14px}.connect-layout p{margin:0 0 16px;line-height:var(--lh-base)}.connect-layout button{margin-right:10px}
.wallet-orders{margin:0 0 24px}.wallet-orders .section-heading{align-items:center}.wallet-orders .order-row{padding:var(--s-4)}.wallet-orders .order-row>div:first-child{min-width:0}.wallet-orders .order-row p{overflow-wrap:anywhere}.wallet-orders .order-row button{white-space:nowrap}.wallet-orders .order-state{margin-bottom:7px}
.policy-check{display:flex;align-items:flex-start;gap:9px;line-height:var(--lh-base)}.policy-check input{width:16px;height:16px;flex:none;margin:1px 0;accent-color:var(--c-brand)}.policy-check span{font-weight:500}
.authorization-switch{margin:12px 0}.authorization-switch button{flex:1}#checkout-rule-fields,#approval-rule-fields{display:grid;gap:11px;margin:12px 0}#checkout-rule-fields label,#approval-rule-fields label{font-size:12px}
/* 批准页上的支付授权那一块（批准与付款合并为一次交互，2026-10-31）。 */
.approval-pay{border-top:1px solid var(--c-border-subtle);margin:var(--s-3) 0;padding-top:var(--s-3)}.approval-pay h3{font-size:var(--fs-sm);margin-bottom:var(--s-2)}.approval-pay p{font-size:var(--fs-xs);line-height:var(--lh-base);color:var(--c-text-muted);margin:0}
#insufficient-dialog{max-width:min(420px,calc(100vw - 32px))}#insufficient-dialog h2{margin-bottom:12px}#insufficient-dialog .full+.full{margin-top:10px}
/* 长列表折叠 + 列表视觉收敛（2026-10-26） */
#bill-list,#order-list{display:grid;gap:0;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-md);padding:0 var(--s-4)}#bill-list .mandate-row,#order-list .order-row{background:transparent;border:0;border-top:1px solid var(--c-border-subtle);border-radius:0;padding:var(--s-4) 0;align-items:start}#bill-list .mandate-row:first-child,#order-list .order-row:first-child{border-top:0}#bill-list>p,#order-list>p{font-size:12px;color:var(--c-text-faint);margin:14px 0}.mandate-row strong,.order-row strong,.offer-price{font-variant-numeric:tabular-nums}.state-PENDING{color:var(--c-state-pending)}.state-SUCCEEDED{color:var(--c-brand-ink)}.state-FAILED{color:var(--c-text-faint)}.state-UNKNOWN{color:var(--c-danger)}#mandate-list{gap:0}.more-row{display:block;width:100%;background:transparent;border:0;border-top:1px solid var(--c-border-subtle);border-radius:0;padding:var(--s-3) 0;text-align:center;font-size:13px;font-weight:650;color:var(--c-brand-ink)}
#reprice-button:not([hidden]){margin-top:12px}
/* Agent 接入令牌（设计 §7 / §9.7） */
.legacy-tip{background:var(--c-warn-surface);border-left:3px solid var(--c-warn);color:var(--c-warn-ink);padding:var(--s-3);border-radius:var(--r-sm);font-size:12px;margin-bottom:12px}.legacy-tip code{font-family:ui-monospace,monospace;font-size:11px}#agent-audit-list .mandate-row{display:block}#agent-audit-list p{overflow-wrap:anywhere;margin-top:4px}#agent-audit-list h3{font-size:13px;margin-bottom:5px}
/* 统一的「已连接的 Agent」列表（设计 §9.8）：最高权限凭证的撤销入口 */
#connected-clients .mandate-row{display:block}#connected-clients h3{font-size:13px;margin-bottom:6px}#connected-clients p{overflow-wrap:anywhere;margin-top:4px}#connected-clients .mandate-actions{justify-content:start;margin-top:7px}.client-badge{display:inline-block;margin-left:7px;padding:var(--s-1) var(--s-2);border-radius:var(--r-sm);font-size:10px;font-weight:650;vertical-align:1px}.client-badge.verified{background:var(--c-brand-surface);color:var(--c-brand-ink)}.client-badge.unverified{background:var(--c-danger-surface);color:var(--c-danger-ink)}.scope-privileged{color:var(--c-danger-ink);font-weight:700}.copy-id{cursor:pointer;border-bottom:1px dotted var(--c-text-faint);font-family:ui-monospace,monospace;font-size:11px;white-space:nowrap}
.agent-connect-heading{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:13px}.agent-connect-heading h2{margin:0}.agent-connect-heading a{font-size:12px;font-weight:650;color:var(--c-brand-ink);text-decoration:none;white-space:nowrap}.agent-connect-heading a:hover{text-decoration:underline}
/* 就近的中文校验提示 + 不自动消失的资金类失败提示（2026-10-28） */
.field-error{margin:0;font-size:12px;line-height:var(--lh-base);color:var(--c-danger-ink);background:var(--c-danger-surface);border-left:3px solid var(--c-danger);padding:var(--s-2) var(--s-3);border-radius:var(--r-sm)}.auth-dialog .field-error{margin:-6px 0 2px}.notice.sticky{display:flex;align-items:start;gap:10px;justify-content:space-between}.notice-dismiss{border:0;background:none;color:inherit;font-size:19px;line-height:var(--lh-flat);padding:0 var(--s-1);flex:none}
/* 单一「已连接的 Agent」列表：凭证类型降为角标，内部标识收进「详情」（2026-10-28） */
#agent-credential-section #credential-load-error:not([hidden]){margin-bottom:12px}.client-badge.kind{background:var(--c-chip-bg);color:var(--c-chip-ink)}.credential-inactive h3,.credential-inactive p{color:var(--c-text-faint)}.credential-inactive .client-badge{opacity:.65}.credential-detail{margin-top:8px}.credential-detail>summary{cursor:pointer;font-size:12px;color:var(--c-brand-ink);width:max-content}.credential-detail>p{color:var(--c-text-faint);font-size:11px;margin-top:6px}.credential-detail .copy-id{color:var(--c-chip-ink)}.token-issue{border-top:1px solid var(--c-border-subtle);margin-top:14px;padding-top:var(--s-4)}.token-issue>summary{cursor:pointer;font-size:13px;font-weight:650;color:var(--c-brand-ink)}.token-issue>.muted{margin:12px 0}.token-issue #token-output{margin-top:12px;display:grid;gap:9px}.token-issue #token-output input{font-family:ui-monospace,monospace;font-size:12px}
/* 凭证行收敛为「名称 + 断开连接」，其余（含调用记录入口）进详情；审计移到独立视图（2026-10-28） */
.agent-connect-heading .heading-links{display:flex;align-items:center;gap:12px;flex:none}.agent-connect-heading .heading-links button{padding:0;min-height:0;font-size:12px;font-weight:650;color:var(--c-brand-ink)}#connected-clients .mandate-row{display:flex;flex-wrap:wrap;align-items:center;gap:0 12px;padding:var(--s-3) 0}#connected-clients .credential-name{flex:1;min-width:0;margin:0;overflow-wrap:anywhere}#connected-clients .mandate-actions{justify-content:end;flex:none}#connected-clients .mandate-actions button{padding:0;min-height:0}#connected-clients .credential-detail{flex:none;margin:0}#connected-clients .credential-detail[open]{order:3;flex-basis:100%;margin-top:6px}.credential-detail .detail-link{display:block;padding:var(--s-2) 0 var(--s-1);font-size:12px;font-weight:650;color:var(--c-brand-ink);min-height:0}
/* OAuth 同意页：权限只读陈列 + 自动支付规则单选（2026-10-28） */
.connect-layout .scope-list{list-style:none;margin:0 0 20px;padding:0;display:grid;gap:11px}.connect-layout .scope-list li{display:grid;gap:4px;font-size:13px}.scope-list strong{font-weight:650;color:var(--c-text)}.scope-list span{font-size:12px;color:var(--c-text-muted);line-height:var(--lh-base)}.autopay-options{display:grid;gap:9px;margin-bottom:14px}.autopay-option{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-md);padding:var(--s-3);cursor:pointer}.autopay-option:has(input:checked){border-color:var(--c-brand);box-shadow:var(--ring-selected)}.autopay-option-body{display:grid;gap:4px;min-width:0}.autopay-option strong{font-size:13px;font-weight:650;color:var(--c-text);overflow-wrap:anywhere}.autopay-option-line{font-size:12px;color:var(--c-text-muted);line-height:var(--lh-base);font-variant-numeric:tabular-nums;overflow-wrap:anywhere}.connect-layout #authorize-autopay-choice p,.connect-layout #authorize-autopay-none{margin:0 0 12px}
#audit-view .page-heading{align-items:center}#audit-view #audit-back{padding:var(--s-2) 0;flex:none}#audit-view #audit-subject{margin-bottom:6px}#audit-view #audit-subject-meta{margin-bottom:12px}#audit-view #audit-load-error:not([hidden]){margin-bottom:12px}#agent-audit-list .mandate-row{display:block;padding:var(--s-3) 0}#agent-audit-list .audit-failed{border-left:3px solid var(--c-danger);padding-left:var(--s-3)}#agent-audit-list .audit-reason{color:var(--c-danger-ink)}#agent-audit-list .credential-detail{margin-top:6px}.audit-ok{color:var(--c-brand-ink);font-weight:650}.audit-bad{color:var(--c-danger);font-weight:700}
/* 视图合并（P2 · 2026-10-31）：充值并入钱包、账单并入订单，页内分区切换代替一级 tab */
.pane-switch{margin-bottom:var(--s-4)}.pane-switch button{flex:1}.pane-heading{display:flex;align-items:center;justify-content:space-between;gap:var(--s-3);margin:0 0 var(--s-3)}.pane-heading h2{margin:0;font-size:var(--fs-sm)}.pane-heading button{flex:none;padding:0;min-height:0}
/* Agent 待审批订单：批准一个价格上限 / 拒绝，以及批准后的价差（B3 §5.2 · flow D §6.4）。
 * 这是一个资金授权界面：上限那个数字是整页最大的字号（--fs-3xl），批准按钮在勾选
 * 「我明白这是上限」之前是 disabled，拒绝收在 details 里——两个动作都不该随手点到。 */
.approval-panel{background:var(--c-surface);border:1px solid var(--c-border);border-left:4px solid var(--c-brand);border-radius:var(--r-md);padding:var(--s-4);margin-top:var(--s-4)}.approval-panel h2{font-size:var(--fs-md);line-height:var(--lh-snug);margin-bottom:var(--s-2);color:var(--c-brand-ink-strong)}.approval-panel>p{font-size:var(--fs-xs);line-height:var(--lh-base);margin:0 0 var(--s-3)}.approval-ceiling{background:var(--c-brand-surface);border:1px solid var(--c-brand-border);border-radius:var(--r-md);padding:var(--s-4);margin-bottom:var(--s-3)}.approval-ceiling label{gap:var(--s-2)}.approval-ceiling label>span{font-size:var(--fs-xs);font-weight:630;color:var(--c-brand-ink)}.approval-ceiling input{font-size:var(--fs-3xl);font-weight:750;line-height:var(--lh-tight);color:var(--c-brand-ink-strong);font-variant-numeric:tabular-nums;padding:var(--s-2) var(--s-3);border-color:var(--c-brand-border)}.approval-ceiling-note{font-size:var(--fs-xs);line-height:var(--lh-base);color:var(--c-text-muted);margin:var(--s-3) 0 0}.approval-ceiling-note strong{color:var(--c-brand-ink-strong);font-weight:700}.approval-deadline{font-size:var(--fs-xs);line-height:var(--lh-base);color:var(--c-state-pending);margin:0 0 var(--s-3)}.approval-panel .confirm-line{margin:var(--s-3) 0}.approval-reject{margin-top:var(--s-4);border-top:1px solid var(--c-border-subtle);padding-top:var(--s-3)}.approval-reject>summary{cursor:pointer;font-size:var(--fs-xs);color:var(--c-text-muted);width:max-content}.approval-reject label{margin:var(--s-3) 0;font-size:var(--fs-xs)}.approval-headline{font-size:var(--fs-lg);font-weight:740;line-height:var(--lh-snug);color:var(--c-brand-ink-strong);font-variant-numeric:tabular-nums;margin:0 0 var(--s-3)}.approval-lines{display:grid;gap:var(--s-2);margin-bottom:var(--s-3)}.approval-lines>div{display:flex;justify-content:space-between;align-items:baseline;gap:var(--s-3);font-size:var(--fs-xs);color:var(--c-text-muted);line-height:var(--lh-base)}.approval-lines strong{font-size:var(--fs-sm);color:var(--c-text);font-variant-numeric:tabular-nums;white-space:nowrap}.approval-current{background:var(--c-surface-sunken);border-radius:var(--r-sm);padding:var(--s-3);margin-bottom:var(--s-3)}.approval-current .approval-lines{margin-bottom:var(--s-2)}.approval-current-note{font-size:var(--fs-xs);line-height:var(--lh-base);color:var(--c-text-muted);margin:0}.approval-current-note.warn{color:var(--c-warn-ink)}.approval-current-warning{background:var(--c-warn-surface);border-left:3px solid var(--c-warn);color:var(--c-warn-ink);border-radius:var(--r-sm);padding:var(--s-3);margin:var(--s-3) 0 0;font-size:var(--fs-xs);line-height:var(--lh-base);font-weight:600}#approval-outcome-reason{color:var(--c-text)}#approval-outcome.terminal{border-left-color:var(--c-danger)}#approval-outcome.terminal h2,#approval-outcome.terminal .approval-headline{color:var(--c-danger-ink)}#approval-outcome-action:not([hidden]){margin-top:var(--s-1)}
/* 不可恢复操作的确认弹窗（撤销 / 断开）与它的破坏性按钮。只用 tokens.css 的既有槽位：
 * 危险按钮用 --c-danger-surface / --c-danger-ink / --c-danger 这一组，和普通按钮一眼能分开，
 * 又不是整块实心红——它在弹窗里不是默认焦点，视觉上也不该抢走「取消」。
 * <dialog> 自身 padding:0，内边距由 .confirm-body 负责，这样点到遮罩时事件目标正好是
 * dialog（见 public/dom.js 的点遮罩取消）。 */
#confirm-dialog{border:1px solid var(--c-border);border-radius:var(--r-lg);padding:0;width:min(420px,calc(100vw - 36px));background:var(--c-surface);color:var(--c-text)}#confirm-dialog::backdrop{background:var(--c-overlay)}.confirm-body{padding:var(--s-6);display:grid;gap:var(--s-3)}.confirm-body h2{margin:0;font-size:var(--fs-lg);line-height:var(--lh-snug)}.confirm-body p{margin:0;font-size:var(--fs-body);line-height:var(--lh-base);color:var(--c-text-muted)}.confirm-actions{display:flex;gap:var(--s-2);margin-top:var(--s-1)}.confirm-actions button{flex:1}.danger{background:var(--c-danger-surface);color:var(--c-danger-ink);border:1px solid var(--c-danger);border-radius:var(--r-sm);padding:var(--s-3) var(--s-4);font-size:var(--fs-body);font-weight:680;min-height:40px}.danger:hover{background:var(--c-danger);color:var(--c-on-brand)}.danger:focus-visible{outline:2px solid var(--c-danger);outline-offset:2px}#confirm-cancel:focus-visible{outline:2px solid var(--c-brand-focus);outline-offset:2px}

/* 订单行右列被挤扁：左侧的订单号是不可断的长 token，而右列没有 flex:none，
   于是被压到按钮文字折行（「查看订」/「单」）。左列允许收缩并让长 id 自己换行，
   右列固定不收缩，按钮不折行。这里不放在 @media 里：`#order-list` 原来只在
   max-width:700px 的那组规则里拿到 nowrap，而 body 本身被钉在 430px，宽窗口下
   媒体查询不命中、行却还是 430px 宽，折行正是在那个尺寸下出现的。 */
.order-row>div:first-child{min-width:0}
.order-row p{overflow-wrap:anywhere}
.order-row>div:last-child{flex:none;display:flex;flex-direction:column;align-items:flex-end;gap:8px}
/* 右列现在自己有 gap，上面那条 `.wallet-orders .order-state{margin-bottom:7px}`
   会和它叠加（钱包首页 15px / 订单页 8px），两处同一个组件的间距统一走 gap。 */
.order-row .order-state{margin:0}
.order-row button{white-space:nowrap}

/* 对账清单（2026-10-31）。一张订单一张卡片，卡片里按判据分块。
   🔴 这里没有任何动作按钮的样式，因为这一屏没有动作：唯一的写操作是「标记为需要人工
   核查」，它复用既有的 .secondary。 */
.reconcile-row{display:block;padding:var(--s-4) 0}
.reconcile-row h3{font-size:13px;margin-bottom:6px;overflow-wrap:anywhere}
.reconcile-row p{margin-top:4px;overflow-wrap:anywhere}
.reconcile-funds{font-size:13px;color:var(--c-text)}
.reconcile-finding{margin-top:11px;border-left:3px solid var(--c-warn);padding-left:var(--s-3)}
.reconcile-finding h4{margin:0;font-size:13px;font-weight:650;color:var(--c-warn-ink)}
.reconcile-next{font-size:12px;color:var(--c-text-muted);line-height:var(--lh-base)}
.reconcile-empty{font-size:13px;color:var(--c-brand-ink);line-height:var(--lh-base)}
.reconcile-flag{margin-top:12px;border-top:1px solid var(--c-border-subtle);padding-top:var(--s-3)}
.reconcile-flag>details>summary{cursor:pointer;font-size:12px;font-weight:650;color:var(--c-brand-ink);width:max-content}
.reconcile-flag label{display:grid;gap:5px;font-size:12px;color:var(--c-text-muted);margin:9px 0}
.reconcile-statement{font:inherit;font-size:12px;padding:var(--s-2) var(--s-3);border:1px solid var(--c-border);border-radius:var(--r-sm);background:var(--c-surface);color:var(--c-text);resize:vertical}
.reconcile-flagged{font-size:12px;font-weight:650;color:var(--c-brand-ink)}
#reconcile-coverage{margin-bottom:12px}

/* 「未验证的客户端」这条安全提示（2026-11-01）。它原来是一行 .muted 灰字，靠开头一个
   ⚠ 字符当警示——字符不是警示：它在一部分字体里是彩色 emoji、在另一部分里直接缺字形，
   而灰字本身比旁边的普通说明还弱。这里换成 danger 槽位的实体块（浅红底 + 4px 左描边 +
   加粗深红正文），比原来更显眼，且不依赖任何字形。
   🔴 这条文案是授权前的安全判断依据，只能加强不能弱化：改它请连 role="alert" 一起改，
   那个 role 让它在 hidden 被撤掉的那一刻就被读屏软件念出来。
   作用在 .connect-layout 下是为了压过 `.connect-layout p`（同为 0,1,1，但那条在前面）。 */
.connect-layout .unverified-notice{margin:0 0 var(--s-4);padding:var(--s-3) var(--s-4);background:var(--c-danger-surface);border-left:4px solid var(--c-danger);border-radius:var(--r-sm);color:var(--c-danger-ink);font-size:var(--fs-body);font-weight:700;line-height:var(--lh-base)}

/* OTA 流程的五步进度指示（文档 §8 · 2026-11-01）。文档写 6 步，实际 5 步——理由在
   public/stepper.js 的文件头（10-31 把「批准上限」和「确认付款」合并成了一次交互）。

   三种状态只靠 tokens.css 的既有槽位区分，没有新色值、没有渐变：
     已完成  品牌实心圆点 + 两侧连接线转品牌色（连接线就是进度条本体）
     进行中  品牌实心圆点 + 焦点环（--c-brand-focus，和输入框得焦时同一个环）+ 加粗深色标签
     未到    中性角标底（--c-chip-bg 一族的 --c-surface-muted）+ 最弱的标签色
   第四种是「已终止」：danger 槽位。它必须存在——一笔 PAYMENT_FAILED 的订单如果一直把
   「付款」画成进行中，进度条就是在替一个已经死掉的订单假装它还在走。

   窄屏（< 380px）折叠：标签整行收起，只剩「第 N 步 / 共 M 步 · 当前步」那一行 + 圆点
   进度条。430px 的壳里一格约 80px，5 个字的标签（「核对与授权」）放得下；360px 的机器
   上一格只有 65px，相邻标签会挤成一片，那时折叠形态比挤在一起的全标签更可读。 */
.stepper{display:block;margin:0 0 var(--s-5)}
.stepper-summary{margin:0 0 var(--s-2);font-size:var(--fs-xs);font-weight:650;color:var(--c-text-muted);line-height:var(--lh-snug)}
.stepper-rail{display:flex;list-style:none;margin:0;padding:0}
.stepper-step{flex:1;min-width:0;position:relative;display:grid;justify-items:center;gap:var(--s-1);text-align:center}
/* 连接线画在每一步的左右两个半段上，这样每一段的颜色由它自己那一步的状态决定，
   不需要知道邻居是谁。首尾两个半段不画，否则进度条会伸出圆点之外。 */
.stepper-step::before,.stepper-step::after{content:"";position:absolute;top:9px;height:2px;background:var(--c-surface-muted)}
.stepper-step::before{left:0;right:50%}
.stepper-step::after{left:50%;right:0}
.stepper-step:first-child::before,.stepper-step:last-child::after{display:none}
.stepper-step[data-state=done]::before,.stepper-step[data-state=done]::after,
.stepper-step[data-state=current]::before,.stepper-step[data-state=stopped]::before{background:var(--c-brand)}
.stepper-dot{position:relative;z-index:1;width:20px;height:20px;border-radius:50%;display:grid;place-items:center;font-size:var(--fs-3xs);font-weight:700;line-height:var(--lh-flat);background:var(--c-surface-muted);color:var(--c-chip-ink);border:2px solid var(--c-canvas)}
.stepper-step[data-state=done] .stepper-dot,.stepper-step[data-state=current] .stepper-dot{background:var(--c-brand);color:var(--c-on-brand)}
.stepper-step[data-state=current] .stepper-dot{outline:2px solid var(--c-brand-focus);outline-offset:1px}
.stepper-step[data-state=stopped] .stepper-dot{background:var(--c-danger);color:var(--c-on-brand)}
.stepper-label{font-size:var(--fs-3xs);line-height:var(--lh-tight);color:var(--c-text-faint)}
.stepper-step[data-state=done] .stepper-label{color:var(--c-text-muted)}
.stepper-step[data-state=current] .stepper-label{color:var(--c-brand-ink-strong);font-weight:700}
.stepper-step[data-state=stopped] .stepper-label{color:var(--c-danger-ink);font-weight:700}
/* 状态词（已完成 / 进行中 / 未开始 / 已终止）只给读屏软件：视觉上这三件事由颜色和
   字重表达，而颜色对读屏软件不存在。 */
.stepper-state{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
@media(max-width:379px){.stepper-label{display:none}}

/* 界面语言开关（i18n 阶段 3）。钱包顶栏和两个 Link 页的页头是同一个控件，所以样式也只有
   这一份（link.css 只负责它在页头那一行里的位置）。
   `input,select` 那条通则给了 width:100%，在 flex 的顶栏里会把它撑满再被压扁，所以这里
   收回 auto 并禁止收缩；其余取值全部来自 tokens.css 的槽位，没有新色值。 */
.lang-switch{width:auto;flex:none;padding:var(--s-1) var(--s-2);font-size:var(--fs-xs);line-height:var(--lh-tight);color:var(--c-text-muted);border-color:var(--c-border)}
.lang-switch:hover{color:var(--c-brand-ink)}
