@charset "UTF-8";
:root{font-family:Inter,"Segoe UI","Microsoft YaHei",sans-serif;color:#182b29;background:#f6f7f3;font-synthesis:none;--green:#155c49;--muted:#65736c;--line:#dfe5de;--soft:#e9efe7}*{box-sizing:border-box}body{margin:0}button,input,select,textarea{font:inherit}button,a,input,select,textarea{touch-action:manipulation}button{cursor:pointer}button:disabled{cursor:wait;opacity:.6}a{color:inherit}button{border:0}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,summary:focus-visible{outline:3px solid #d98225;outline-offset:3px}[hidden]{display:none!important}.skip-link{position:fixed;top:-100px;left:16px;padding:12px;background:white;z-index:100}.skip-link:focus{top:12px}.wordmark{font-size:45px;font-weight:800;letter-spacing:-3px;text-decoration:none}.brand-dot{color:#d7b357}.eyebrow{font-size:11px;font-weight:700;letter-spacing:2px;color:var(--green);margin:0 0 14px}.muted{color:var(--muted);font-size:14px;line-height:1.7}h1,h2,h3,p{margin-top:0}h1{font-size:32px;letter-spacing:-1px;margin-bottom:10px}h2{font-size:22px;letter-spacing:-.4px}h3{font-size:17px}label{display:block;font-size:13px;font-weight:600;margin:18px 0 8px}input,select,textarea{width:100%;padding:11px 12px;border:1px solid #aebbb2;border-radius:8px;background:white;color:inherit}textarea{min-height:80px;resize:vertical}.primary,.secondary{padding:11px 17px;border-radius:8px;font-size:13px;font-weight:600;white-space:nowrap}.primary{background:var(--green);color:white}.primary:hover{background:#104a3a}.secondary{background:white;border:1px solid var(--line);color:#26473c}.secondary:hover{background:#edf2eb}.text-button{padding:8px;background:none;color:var(--green);font-size:13px;text-decoration:underline;text-underline-offset:4px}.error{color:#a52f2b;font-size:13px;line-height:1.6;margin-top:12px}.error:empty,#page-message:empty{display:none}.login-view{min-height:100vh;display:grid;grid-template-columns:1fr 1fr}.login-intro{padding:54px 9vw;background:#153e32;color:#fff;display:flex;flex-direction:column;align-items:flex-start}.login-intro .wordmark{margin-bottom:90px}.login-intro .eyebrow{color:#c2d5be}.login-intro h1{font-size:clamp(32px,3.5vw,54px);line-height:1.4;margin-bottom:28px}.login-intro>p:not(.eyebrow){color:#ccdbd0;line-height:1.8}.intro-foot{margin-top:auto;padding-top:80px;font-size:10px;letter-spacing:2px;width:100%;display:flex;justify-content:space-between;color:#bacdbd}.login-panel{display:grid;place-items:center;padding:48px}.login-panel form{width:min(100%,360px)}.login-panel h2{font-size:28px;margin-bottom:12px}.login-panel .primary{width:100%;margin-top:16px;display:flex;justify-content:space-between}.login-note{font-size:12px;color:var(--muted);margin-top:26px}.app{display:flex;min-height:100vh}.sidebar{background:#f0f3eb;width:220px;flex-shrink:0;border-right:1px solid var(--line);padding:28px 20px;display:flex;flex-direction:column;position:sticky;top:0;height:100vh}.sidebar .wordmark{padding-left:16px}.sidebar-caption{padding-left:18px;font-size:12px;color:var(--muted);margin:4px 0 44px}.sidebar nav{display:flex;flex-direction:column;gap:5px}.sidebar nav button{display:flex;align-items:center;gap:13px;text-align:left;background:none;color:#4d6259;padding:12px 16px;border-radius:7px;font-size:14px}.sidebar nav button span{width:18px;font-size:19px}.sidebar nav button:hover{background:#e6ecdf}.sidebar nav button[aria-current=page]{background:#dce7d6;color:#204732;font-weight:700}.nav-label{font-size:10px;letter-spacing:1px;color:#637665;margin:26px 16px 8px}.sidebar-bottom{margin-top:auto;padding:25px 16px 0;font-size:11px;color:#53664f}.sidebar-bottom p{font-size:9px;letter-spacing:1.3px;color:#66755f;margin:14px 0 0}.live-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--green);margin-right:6px}.workspace{flex:1;min-width:0}.topbar{height:76px;padding:0 42px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--line);font-size:12px;color:var(--muted);gap:16px}.identity{display:flex;gap:12px;align-items:center}.badge{font-size:11px;padding:4px 8px;border-radius:5px;background:#e6ece4;color:#3e5747;white-space:nowrap}main{max-width:1500px;margin:auto;padding:42px;min-height:calc(100vh - 143px)}.page-heading{display:flex;justify-content:space-between;align-items:center;gap:20px;margin-bottom:24px}.page-heading .muted{margin-bottom:0}#page-message{font-size:13px;padding:12px 16px;border-radius:7px;background:#e7eee3;color:#244333}#page-message.is-error{background:#fbe9e4;color:#972f28}.launch-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-bottom:34px}.launch-card{display:flex;flex-direction:column;min-height:170px;text-decoration:none;padding:24px;border:1px solid var(--line);border-radius:12px;background:white;position:relative}.launch-card:hover{border-color:#87a388;background:#f9fcf6}.launch-card.featured{background:#173e32;color:white;border-color:#173e32}.launch-card.featured:hover{background:#20533f}.launch-icon{font-size:25px;margin-bottom:21px;color:#647c61}.featured .launch-icon{color:#dfbe76}.launch-card h3{margin:0 0 7px}.launch-card p{font-size:12px;line-height:1.6;color:var(--muted);margin:0}.featured p{color:#c5d6c5}.arrow{position:absolute;right:24px;top:25px;font-size:22px}.section-heading{display:flex;align-items:center;justify-content:space-between;margin:28px 0 14px}.section-heading h2{font-size:16px;margin:0}.section-heading span{font-size:11px;color:var(--muted)}.stat-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}.stat-card{border:1px solid var(--line);border-radius:10px;padding:22px;background:white;text-align:left;display:block;text-decoration:none}.stat-card:hover{border-color:#8ba080}.stat-card span{display:block;font-size:12px;color:var(--muted)}.stat-card strong{display:block;font-size:32px;font-weight:600;margin:12px 0 8px;letter-spacing:-1px}.stat-card small{font-size:11px;color:var(--muted)}.note-panel{border:1px solid var(--line);border-radius:10px;padding:21px 24px;background:#edf2e8;margin-top:24px;font-size:13px;line-height:1.8;color:#415a43}.note-panel p{margin:0}.toolbar{display:flex;gap:12px;align-items:center;margin-bottom:18px;flex-wrap:wrap}.toolbar input{max-width:360px;background:white}.toolbar .grow{flex:1}.toolbar label{margin:0;font-size:12px}.table-panel{background:white;border:1px solid var(--line);border-radius:11px;overflow:hidden}.table-scroll{overflow:auto}table{width:100%;border-collapse:collapse;text-align:left;font-size:12px}caption{text-align:left;font-size:13px;font-weight:600;padding:18px 20px}th{padding:13px 18px;background:#f4f6f1;color:#53634f;font-size:11px;font-weight:600;white-space:nowrap;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}td{padding:16px 18px;border-bottom:1px solid #edf0e9;vertical-align:middle}tbody tr:last-child td{border-bottom:0}.cell-main{font-weight:600;white-space:nowrap}.cell-sub{display:block;margin-top:5px;font-size:10px;color:var(--muted);word-break:break-all}.row-actions{display:flex;gap:7px;white-space:nowrap}.row-actions button{padding:6px 8px;background:#edf2e8;color:#2d533d;border-radius:5px;font-size:11px}.status{display:inline-block;padding:4px 7px;border-radius:5px;font-size:11px;white-space:nowrap;background:#eef0ec;color:#53614f}.status.good{background:#e3efdf;color:#2c6339}.status.warn{background:#fbefda;color:#7d5616}.status.bad{background:#fae8e5;color:#a23a2e}.empty{padding:56px 24px;text-align:center;color:var(--muted);font-size:13px}.empty strong{display:block;color:#3c5446;font-size:17px;margin-bottom:12px}.permission-note{font-size:12px;color:var(--muted);margin-bottom:18px}.node-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:18px}.node-card{padding:24px;border:1px solid var(--line);border-radius:11px;background:white}.node-heading{display:flex;align-items:center;justify-content:space-between;gap:15px}.node-card h2{font-size:18px;margin:0}.node-card dl{display:grid;grid-template-columns:100px 1fr;font-size:12px;line-height:1.8;gap:14px 10px;margin:25px 0}.node-card dt{color:var(--muted)}.node-card dd{margin:0;overflow-wrap:anywhere}.node-card .secondary{margin-top:8px}.node-card .muted{font-size:12px}.quota-summary{display:flex;gap:22px;flex-wrap:wrap;padding:19px 22px;background:#edf2e8;border-radius:9px;font-size:12px;margin-bottom:18px}.quota-summary strong{font-size:18px;margin-left:8px}footer{padding:23px 42px;border-top:1px solid var(--line);font-size:10px;color:var(--muted);display:flex;justify-content:space-between;gap:12px}footer span{letter-spacing:1.5px}dialog{width:min(510px,calc(100% - 32px));border:1px solid var(--line);border-radius:14px;padding:28px;background:#fcfdf9;color:#182b29;max-height:90vh}dialog::backdrop{background:#11291eb3}.dialog-heading{display:flex;align-items:center;justify-content:space-between;gap:12px}.dialog-heading h2{font-size:21px;margin:0}.icon-button{background:none;font-size:26px;color:var(--muted);width:36px;height:36px}.dialog-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:28px}.field-help{font-size:12px;color:var(--muted);line-height:1.6;margin-top:8px}.secret-code{font-size:19px;letter-spacing:1px;background:#e8efdf;padding:18px;border:1px dashed #8ba080;border-radius:8px;word-break:break-all;user-select:all;margin:20px 0}.secret-actions{display:flex;gap:10px}.boot-status{min-height:100vh;display:grid;place-items:center;color:var(--muted)}.loading{padding:56px 24px;text-align:center;color:var(--muted)}
.launch-card h2{font-size:17px;margin:0 0 7px}.checkbox-label{display:flex;gap:10px;align-items:flex-start;font-weight:400;line-height:1.7}.checkbox-label input{width:18px;height:18px;flex-shrink:0;margin-top:3px}#dialog-error{overflow-wrap:anywhere}
.sidebar{overflow-y:auto}.sidebar nav details summary{padding:13px 15px 8px;font-size:11px;color:#53664f;cursor:pointer}.sidebar nav details button{width:100%;padding-top:9px;padding-bottom:9px}.sidebar nav details+details{margin-top:10px}.subnav{display:flex;gap:7px;margin-bottom:20px;flex-wrap:wrap}.subnav button{padding:10px 15px;border-radius:7px;background:#e9eee4;color:#405b43;font-size:13px}.subnav button[aria-pressed=true]{background:#1b523d;color:white}.line-editor{margin-top:24px}.line-editor h3{font-size:15px}.supply-line{border:1px solid var(--line);border-radius:8px;margin:0 0 14px;padding:13px}.supply-line legend{font-size:11px;color:var(--muted)}.line-fields{display:grid;grid-template-columns:2fr 1fr 1.3fr auto;gap:10px;align-items:end}.line-fields label{margin-top:0;font-size:12px}.line-fields input,.line-fields select{min-width:0}.line-fields>div{min-width:0}dialog:has(.line-editor),dialog:has(.table-panel){width:min(860px,calc(100% - 32px))}.supply-line .text-button{margin-bottom:3px}
@media(max-width:720px){.sidebar nav{align-items:flex-start}.sidebar nav details{flex-shrink:0;min-width:150px}.sidebar nav details+details{margin-top:0}.sidebar nav details summary{padding-top:9px}.sidebar nav details button{padding-left:15px;text-align:left}.line-fields{grid-template-columns:1fr 1fr}.line-fields>div:first-child{grid-column:1/-1}}
@media(min-width:1600px){main{padding-top:54px}.launch-card{min-height:190px}.stat-card{padding:26px}}
@media(max-width:1000px){.sidebar{width:190px;padding:25px 12px}.topbar{padding:0 26px}main{padding:30px 26px}.identity{gap:6px}.launch-grid{gap:10px}.launch-card{padding:20px}.arrow{right:18px}.node-grid{grid-template-columns:1fr}footer{padding:23px 26px}}
@media(max-width:720px){.app{display:block}.sidebar{position:static;width:100%;height:auto;padding:15px 16px;display:block}.sidebar .wordmark{font-size:32px;padding:0}.sidebar-caption,.sidebar-bottom,.nav-label{display:none}.sidebar nav{flex-direction:row;overflow-x:auto;margin-top:14px;gap:4px}.sidebar nav button{padding:9px 10px;white-space:nowrap;font-size:12px}.sidebar nav button span{display:none}.topbar{height:auto;min-height:64px;padding:12px 18px;align-items:flex-start}.topbar>span{display:none}.identity{width:100%;justify-content:flex-end;flex-wrap:wrap}main{padding:28px 18px}.page-heading{align-items:flex-start}h1{font-size:27px}.page-heading .secondary{padding:9px 12px}.launch-grid{grid-template-columns:1fr}.launch-card{min-height:115px;padding:20px 20px 20px 66px}.launch-icon{position:absolute;left:23px;top:23px}.launch-card p{padding-right:12px}.stat-grid{grid-template-columns:repeat(2,1fr);gap:10px}.stat-card{padding:18px}.stat-card strong{font-size:28px}.section-heading span{display:none}footer{padding:20px 18px}footer span{display:none}.login-view{grid-template-columns:1fr}.login-intro{padding:28px}.login-intro .wordmark{margin-bottom:32px}.login-intro h1{font-size:31px}.login-intro>p:not(.eyebrow),.intro-foot{display:none}.login-panel{padding:38px 28px}.login-intro h1{margin-bottom:0}.toolbar input{max-width:none;flex:1;min-width:160px}.toolbar .grow{display:none}.table-panel{border-radius:8px}}
.studio-wordmark{font-size:29px;letter-spacing:1px;font-weight:750;line-height:1.5}.sidebar .studio-wordmark{font-size:22px;padding-left:12px}.login-intro .studio-wordmark{font-size:34px}.auth-switch{display:block;margin-top:18px;padding-left:0;text-align:left}.login-panel form[hidden]{display:none}.login-panel:has(#staff-register-form:not([hidden])){padding-top:32px;padding-bottom:32px}@media(max-width:720px){.sidebar .studio-wordmark{padding:0;font-size:24px}.login-intro .studio-wordmark{font-size:29px}.login-panel:has(#staff-register-form:not([hidden])){padding:30px 28px}.page-heading h1{overflow-wrap:anywhere}}
.studio-wordmark{display:inline-flex;align-items:center;gap:12px;white-space:nowrap}.studio-mark{display:block;flex-shrink:0;image-rendering:pixelated;image-rendering:crisp-edges}.login-intro .studio-mark{width:44px;height:52px;filter:brightness(0) invert(1)}.sidebar .studio-mark{width:22px;height:26px}.page-title-row{display:flex;align-items:center;gap:16px}.page-title-row h1{margin-bottom:0}.page-title-row+.muted{margin-top:14px}.sidebar nav #sudo-navigation>summary,.sidebar nav #system-navigation>summary{font-size:12px;font-weight:650}.sidebar nav details details{padding-left:9px}.login-note a{color:var(--green);text-underline-offset:3px}@media(max-width:720px){.page-title-row{gap:12px;align-items:flex-start}.page-title-row .studio-mark{width:22px;height:26px;margin-top:5px}.login-intro .studio-mark{width:22px;height:26px}.sidebar nav details details{padding-left:5px}}
@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important}}

/* Compact supply workflow and forms. */
.workspace{min-width:0}.sidebar{overflow-y:auto}.sidebar nav details>details{margin-left:0}.sidebar nav summary{font-size:12px;letter-spacing:.03em}.sidebar nav button{padding:10px 12px;font-size:13px}.sidebar-caption{margin-bottom:24px}.toolbar{display:flex;gap:12px;align-items:flex-end;flex-wrap:wrap}.toolbar>label{margin:0 0 10px}.toolbar>input,.toolbar>select{width:auto;max-width:280px}.supply-toolbar{padding:16px;background:#eef2eb;border:1px solid var(--line);border-radius:12px;margin-bottom:12px}.supply-toolbar .filter-field{flex:1 1 170px;min-width:140px;max-width:260px}.supply-toolbar .filter-search{flex:2 1 220px;max-width:none}.supply-toolbar label{font-size:11px;color:var(--muted);margin:0 0 6px}.supply-toolbar input,.supply-toolbar select{width:100%;padding:9px 10px;min-height:38px;font-size:13px}.supply-toolbar>.primary{min-height:38px;margin-left:auto;padding:10px 14px}.catalog-guide{font-size:14px;color:var(--muted);line-height:1.7;max-width:850px}.supply-records .table-scroll{overflow-x:auto}.supply-records table{min-width:800px;width:100%;table-layout:auto}.supply-records td{vertical-align:middle;padding:14px 16px;max-width:280px;overflow-wrap:normal}.supply-records th{white-space:nowrap;font-size:12px;padding:12px 16px}.supply-records td:first-child{min-width:210px;max-width:280px}.supply-records .cell-main,.supply-records .cell-sub{display:block;max-width:270px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.supply-records .cell-main{font-size:13px}.supply-records .cell-sub{font-size:11px;line-height:1.7}.compact-text{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-width:130px;max-width:220px;line-height:1.6}.supply-records td:last-child{min-width:135px}.row-actions{display:flex;gap:6px;flex-wrap:wrap;align-items:center}.row-actions button.action-link{padding:5px 7px;border-radius:5px;background:#edf2eb;color:var(--green);font-size:12px;white-space:nowrap}.row-actions button.action-danger{padding:5px 7px;color:#9b4337;background:transparent;font-size:12px;white-space:nowrap}.row-actions button.action-danger:hover{background:#fff0eb}.detail-spec{white-space:pre-wrap;overflow-wrap:anywhere;font-size:14px;line-height:1.8}.workflow-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px;margin:8px 0 24px}.workflow-card{position:relative;text-decoration:none;background:#fff;border:1px solid var(--line);border-radius:14px;padding:24px;min-height:205px;transition:border-color .15s}.workflow-card:hover{border-color:var(--green)}.workflow-card h2{font-size:19px;margin:18px 0 10px}.workflow-card p{color:var(--muted);font-size:13px;line-height:1.6;min-height:40px;margin-bottom:18px}.workflow-card strong{font-size:13px;color:var(--green)}.workflow-step{font-size:12px;letter-spacing:2px;color:#789078}.workflow-arrow{position:absolute;right:22px;top:22px;color:var(--green)}.attribute-row{display:grid;grid-template-columns:1fr 1fr auto;gap:12px;align-items:end;margin-bottom:14px}.attribute-row label{margin-top:0}.sku-attributes{margin-top:22px;border:1px solid var(--line);border-radius:10px;padding:16px}.sku-attributes legend{font-weight:600;font-size:14px}.subnav{flex-wrap:wrap}#editor{max-height:90vh;overflow-y:auto}#editor .table-scroll{overflow-x:auto}#editor textarea{line-height:1.7}#editor .dialog-actions{position:sticky;bottom:-24px;background:#fff;padding-top:14px}.sidebar details>summary{margin-top:10px}.sidebar details{flex-shrink:0}
@media(max-width:1100px){.workflow-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.supply-toolbar .filter-field{max-width:none}.supply-toolbar>.primary{margin-left:0}.supply-records table{min-width:850px}}
@media(max-width:650px){.workflow-grid{grid-template-columns:1fr}.workflow-card{min-height:auto}.workflow-card p{min-height:0}.supply-toolbar{gap:10px;padding:12px}.supply-toolbar .filter-field{flex-basis:calc(50% - 10px);min-width:120px}.supply-toolbar .filter-search{flex-basis:100%}.supply-toolbar>.primary{width:100%}.attribute-row{grid-template-columns:1fr 1fr}.attribute-row button{justify-self:start}.toolbar>input,.toolbar>select{max-width:100%}}

.supply-records.catalog-records table{min-width:0;table-layout:fixed}.supply-records.catalog-records td{min-width:0!important;max-width:none;overflow-wrap:anywhere}.supply-records.catalog-records th{white-space:normal}.supply-records.catalog-records td:first-child{width:28%;min-width:0}.supply-records.catalog-records .cell-main,.supply-records.catalog-records .cell-sub{max-width:100%}.supply-records.catalog-records .row-actions{gap:2px}.material-title{display:block;max-width:270px;padding:0;background:transparent;text-align:left;color:var(--green);font-weight:600;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.material-title:hover{text-decoration:underline}

.rejection-note{display:block;color:#a34c1b;font-size:12px;line-height:1.5;max-width:170px;margin-top:6px;font-weight:600}

/* Purchase lines retain readable per-material suppliers on small screens. */
.purchase-line .line-fields{grid-template-columns:minmax(180px,2fr) minmax(160px,1.6fr) minmax(90px,1fr) minmax(100px,1fr) auto}.purchase-line select:disabled{opacity:1;color:var(--ink);background:#f0f3ee}.purchase-line input[readonly]{background:#f0f3ee}@media(max-width:720px){.purchase-line .line-fields{grid-template-columns:1fr 1fr}.purchase-line .line-fields>div:nth-child(2){grid-column:1/-1}}

.purchase-source{display:block;color:var(--muted);font-size:11px;margin-top:5px}.purchase-filters{display:flex;gap:12px;align-items:end;flex-wrap:wrap;margin:12px 0 22px}.purchase-filters label{font-size:12px;margin-top:0}.purchase-filters input,.purchase-filters select{width:auto;min-width:150px}.purchase-order-summary{background:#f0f4ee;border-radius:8px;padding:12px 18px}.purchase-order-summary p{margin:8px 0}

.purchase-purpose{display:block;color:var(--muted);font-size:12px;margin-top:3px}.purchase-form-total{font-weight:650;margin:12px 0 16px;padding:12px;background:#f0f4ee;border-radius:8px}

.purchase-header-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);column-gap:18px}.purchase-header-grid>div{min-width:0}@media(max-width:650px){.purchase-header-grid{grid-template-columns:1fr}}

/* Optional material photography: the identifier remains readable with or without an image. */
.material-identity{display:flex;align-items:center;gap:10px}.material-identity>div{min-width:0}
.material-thumbnail{flex:0 0 44px;width:44px;height:44px;padding:0;overflow:hidden;border:1px solid var(--border,#d5dfda);border-radius:7px;background:transparent;color:inherit}
.material-thumbnail img{display:block;width:44px;height:44px;object-fit:cover}.material-image-unavailable{font-size:10px;line-height:1.2}
.material-image-preview img{display:block;max-width:100%;width:auto;max-height:180px;border-radius:8px;object-fit:contain}.material-image-actions{display:flex;gap:16px;flex-wrap:wrap}
.material-detail-image{display:flex;align-items:flex-start;flex-direction:column;gap:8px;margin-bottom:20px}.material-detail-image img{display:block;max-width:100%;max-height:440px;object-fit:contain;border-radius:10px}
.material-image-editor input[type=file]{height:auto;padding:10px;max-width:100%}.material-image-editor input[type=file]::file-selector-button{margin-right:12px;padding:7px 12px;border:1px solid #b4c9bf;border-radius:6px;background:#f1f6f3;color:#164d3d;cursor:pointer}
.material-thumbnail:focus-visible,.material-detail-image:focus-visible{outline:3px solid #e89328;outline-offset:3px}

.material-image-tabs{display:flex;gap:4px;padding:4px;background:#edf3ef;border-radius:9px;margin-bottom:14px;width:fit-content}.material-image-tabs button{border:0;border-radius:6px;padding:7px 16px;background:transparent;color:#536a60}.material-image-tabs button[aria-pressed=true]{background:white;color:#164d3d;box-shadow:0 1px 3px #19392a18}
.material-image-drop{display:flex;flex-direction:column;align-items:center;text-align:center;border:1.5px dashed #afc5b8;border-radius:12px;padding:20px 16px;background:#f8fbf9;transition:background .12s,border-color .12s}.material-image-drop.is-dragging{background:#e4f0e9;border-color:#17634a}.material-drop-icon{font-size:25px;line-height:1;color:#688d7b;margin-bottom:8px}.material-image-drop label{margin:0 0 6px}.material-image-drop input[type=file]{width:auto;border:0;background:transparent;font-size:12px;padding:6px;box-shadow:none}.material-image-drop .field-help{font-size:12px;line-height:1.6;margin:4px 0 0}.material-image-preview{margin-top:14px}.material-image-editor .material-image-unavailable{font-size:13px;color:#8c432d}.material-image-tabs button:focus-visible{outline:3px solid #e89328;outline-offset:2px}

.material-thumbnail img[hidden],.material-image-preview[hidden],.material-image-preview img[hidden],.material-detail-image img[hidden],.material-image-editor [hidden]{display:none!important}

.material-image-drop{position:relative;cursor:pointer}.material-image-drop input[type=file]{position:absolute;inset:0;width:100%;height:100%;opacity:0;margin:0;padding:0;cursor:pointer}.material-image-drop:focus-within{outline:3px solid #e89328;outline-offset:3px;border-color:#17634a}.material-drop-choice{display:block;font-size:13px;font-weight:400;color:#537465;margin-top:5px}.material-image-drop:hover{background:#f0f7f3;border-color:#719b85}


.material-image-editor{border:0;padding:0;margin:20px 0}.material-image-editor>legend{padding:0;margin-bottom:12px;font-weight:600;color:#203e31}
/* Material catalog: one compact action row, lightweight product and version context. */
.material-context{display:flex;flex-direction:column;align-items:flex-start;gap:10px;margin:16px 0}.material-product-tabs,.material-version-tabs{display:flex;gap:5px;flex-wrap:wrap;max-width:100%}.material-product-tabs button,.material-version-tabs button{border:0;background:transparent;color:#61736a;padding:6px 10px;border-radius:6px;font-size:13px;white-space:normal}.material-product-tabs button{font-weight:600}.material-product-tabs button[aria-pressed=true]{color:#174f3c;background:#e9f2ec}.material-version-tabs button{font-size:12px;padding:5px 10px}.material-version-tabs button[aria-pressed=true]{background:#174f3c;color:white}
.material-toolbar{display:flex;align-items:center;gap:10px;margin:14px 0 12px;min-width:0}.material-search{flex:1;min-width:130px}.material-search input{width:100%;margin:0;min-width:0}.material-tools{display:flex;gap:3px;flex-shrink:0}.material-tool-button{display:flex;gap:9px;align-items:center;border:0;background:transparent;padding:9px 10px;color:#496054;font-size:13px;white-space:nowrap}.material-tool-button[aria-expanded=true]{background:#edf4ef;border-radius:6px}.material-toolbar>.primary{white-space:nowrap;flex-shrink:0;margin:0}.material-menu{position:relative}.material-popover{position:absolute;top:calc(100% + 7px);right:0;z-index:20;min-width:190px;max-width:min(320px,calc(100vw - 40px));max-height:370px;overflow:auto;background:white;border:1px solid #dce6df;border-radius:10px;padding:12px;box-shadow:0 10px 30px #18362720}.material-popover[hidden]{display:none}.material-context .material-popover{left:0;right:auto}.material-popover>button{display:block;text-align:left;width:100%;padding:8px;border:0;background:transparent;color:#274b3a;border-radius:5px}.material-popover>button[aria-pressed=true]{background:#e9f2ec}.material-popover>button[hidden]{display:none}.material-radio-group{border:0;padding:0;margin:0 0 12px}.material-radio-group:last-child{margin-bottom:0}.material-radio-group legend{font-size:11px;color:#7b8c81;margin-bottom:5px;padding:0}.material-radio-group label{display:flex;gap:8px;align-items:center;font-weight:400;font-size:13px;padding:5px 2px;margin:0;cursor:pointer}.material-radio-group input[type=radio]{width:14px;height:14px;margin:0;accent-color:#19583f}.material-active-filters{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:0 0 12px}.material-active-filters[hidden]{display:none}.material-filter-chip{display:inline-flex;align-items:center;gap:8px;background:#edf3ef;color:#41614d;font-size:12px;border:0;border-radius:5px;padding:5px 8px;max-width:100%;overflow-wrap:anywhere;text-align:left}.material-active-filters>.text-button{font-size:12px;padding:5px 6px}.material-version-tabs button:focus-visible,.material-product-tabs button:focus-visible,.material-tool-button:focus-visible,.material-filter-chip:focus-visible{outline:3px solid #e89328;outline-offset:2px}
@media(max-width:700px){.material-toolbar{flex-wrap:wrap;gap:8px}.material-search{flex-basis:calc(100% - 135px);order:0}.material-toolbar>.primary{order:1}.material-tools{order:2}.material-popover{left:0;right:auto;min-width:180px;max-width:calc(100vw - 65px)}.material-tools>.material-menu:last-child .material-popover{left:auto;right:0}.material-version-tabs{gap:3px}}

.sr-only{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.material-context{margin-bottom:12px}.material-toolbar{margin-top:12px}
.form-extra{margin:20px 0;border-top:1px solid #dce6df;padding-top:16px}.form-extra>summary{cursor:pointer;color:#245340;font-weight:600;padding:8px 0}.form-extra>summary span{font-size:12px;font-weight:400;color:#718278;margin-left:10px}.purchase-source-card{padding:14px 18px;border-radius:12px;background:#f0f5f1;margin:16px 0}.purchase-source-card[hidden]{display:none}.purchase-source-card .table-wrap{max-height:260px}.line-material-picker{min-width:0}.line-material-picker>summary{padding:12px;border:1px solid #b8c9c0;border-radius:8px;background:white;cursor:pointer;color:#204b37;overflow-wrap:anywhere}.line-material-picker[open]{grid-column:1/-1}.line-material-picker[open]>summary{border-color:#1b684b;background:#f2f8f4}.material-picker-panel{padding:12px;margin-top:6px;border:1px solid #c4d7ca;background:#f9fcfa;border-radius:10px}.material-picker-panel input,.material-picker-panel select{margin:0 0 8px;font-size:13px;padding:9px}.material-picker-results{max-height:260px;overflow-y:auto;overscroll-behavior:contain}.material-picker-results>button{display:flex;gap:10px;align-items:center;width:100%;text-align:left;border:0;border-radius:7px;background:transparent;color:#243e31;padding:10px 8px}.material-picker-results>button:hover,.material-picker-results>button[aria-pressed=true]{background:#e5f0e8}.material-picker-results img{width:34px;height:34px;border-radius:5px;object-fit:cover}.material-picker-results span{flex:1;min-width:0}.material-picker-results small,.picked-material small{display:block;font-size:11px;color:#718278;overflow-wrap:anywhere}.material-picker-results strong{font-size:13px}.material-picker-results button:focus-visible,.line-material-picker summary:focus-visible,.form-extra summary:focus-visible{outline:3px solid #e89328;outline-offset:1px}.supply-line:has(.line-material-picker[open]) .line-fields{grid-template-columns:1fr 1fr}.supply-line:has(.line-material-picker[open]) .line-fields>div:first-child{grid-column:1/-1}.picked-material{padding:12px 0;font-size:14px}.purchase-line{padding:12px 14px;margin:10px 0;border-radius:10px}.purchase-line legend{font-size:11px;color:#718278}.purchase-line .line-fields label{font-size:12px;margin:4px 0 8px}.purchase-line .line-fields{grid-template-columns:minmax(160px,2fr) minmax(125px,1.4fr) minmax(80px,1fr) minmax(85px,1fr) auto}.purchase-line input,.purchase-line select{padding:10px;font-size:13px}@media(max-width:720px){.purchase-line .line-fields{grid-template-columns:1fr 1fr}.purchase-line .line-fields>div:first-child,.purchase-line .line-fields>div:nth-child(2){grid-column:1/-1}.material-picker-results>button{flex-wrap:wrap}.form-extra>summary span{display:block;margin:6px 0 0}}
.consumables-toolbar{display:flex;align-items:center;gap:12px;margin:16px 0 20px}.consumables-toolbar input{flex:1;min-width:0;margin:0}.consumables-toolbar>.primary{white-space:nowrap;margin:0}.consumable-quantity{font-weight:650;font-variant-numeric:tabular-nums}.consumable-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.consumable-stepper{display:flex;gap:1px;background:#ecf3ee;padding:3px;border-radius:7px}.consumable-stepper button{padding:6px 9px;min-width:36px;border:0;border-radius:5px;background:transparent;color:#1d5a40;font-weight:600}.consumable-stepper button:hover:not(:disabled){background:white}.consumable-stepper button:disabled{opacity:.4;cursor:not-allowed}.consumable-stepper button:focus-visible{outline:3px solid #e89328;outline-offset:2px}

/* One-unit steppers retain manual decimals without microscopic native increments. */
.number-control{display:flex;align-items:stretch;min-width:0;width:100%;border:1px solid #b8c9c0;border-radius:8px;background:white;overflow:visible;margin:0 0 12px}.number-control input[type=number]{flex:1;min-width:0;width:0;margin:0!important;border:0;border-radius:8px 0 0 8px;appearance:textfield;-moz-appearance:textfield;box-shadow:none}.number-control input::-webkit-inner-spin-button,.number-control input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.number-control button{flex:0 0 32px;min-width:32px;padding:4px;border:0;border-left:1px solid #e0e8e2;border-radius:0;background:#f0f6f2;color:#19583f;font-size:17px;line-height:1}.number-control button:last-child{border-radius:0 8px 8px 0}.number-control button:hover:not(:disabled){background:#deeee3}.number-control button:disabled{opacity:.4;cursor:default}.number-control:focus-within{outline:2px solid #e89328;outline-offset:2px}.number-control input:focus{outline:0}.number-control button:focus-visible{outline:2px solid #19583f;outline-offset:-3px}.purchase-line .line-fields{grid-template-columns:minmax(145px,2fr) minmax(125px,1.4fr) minmax(115px,1fr) minmax(115px,1fr) auto}@media(max-width:720px){.purchase-line .line-fields{grid-template-columns:1fr 1fr}}


/* --- 2026-09-09 层级与可读性调整 --- */
.nav-label{font-size:14px;font-weight:600;letter-spacing:.01em;color:#1f2a22;margin:26px 16px 10px}
.material-title{color:inherit;font-weight:400}
.material-title:hover{color:#17634a}
.ver-stack{display:block}
.ver-stack .ver{display:block;width:fit-content;font-size:12px;line-height:1.5;color:#4a5159;background:#eef0ec;border-radius:5px;padding:3px 8px;margin-bottom:4px}
.ver-stack .ver:last-child{margin-bottom:0}


/* --- 参考单价 --- */
.ref-price{font-weight:600;font-size:13px;white-space:nowrap}
.ref-empty{padding:4px 9px;border-radius:5px;background:#fbefda;color:#7d5616;font-size:11px;white-space:nowrap}
.ref-empty:hover{background:#f6e3bf}
.ref-summary{margin-left:14px;font-size:11px;font-weight:400;color:var(--muted)}
.ref-summary b{color:#2d533d}


/* --- 商品与订单 --- */
.due-soon{color:#a52f2b;font-weight:600}
#commerce-navigation>summary{font-size:12px;font-weight:650}

/* ══ 设计稿基线：中性白底 · 墨黑标题 · 钢蓝强调 ══ */
:root{--green:#3d6e8c;--muted:#6b747f;--line:#ebedf0;--soft:#eff5f9;color:#14181d;background:#fff}
body{background:#fff}
.sidebar{background:#fafafa;border-right:1px solid #ebedf0}
.sidebar nav button{color:#4a5159;font-size:14px;padding:9px 12px;border-radius:6px}
.sidebar nav button:hover{background:#f0f2f5}
.sidebar nav button[aria-current=page]{background:#eff5f9;color:#14181d;font-weight:500}
.sidebar nav details>summary,.sidebar nav #sudo-navigation>summary,.sidebar nav #system-navigation>summary,.sidebar nav #commerce-navigation>summary{font-size:14px;font-weight:600;color:#14181d;letter-spacing:.01em;padding:20px 12px 8px}
.nav-new{display:inline-block;margin-left:8px;font-size:11px;font-weight:500;padding:2px 8px;border-radius:999px;background:#eff5f9;color:#3d6e8c;vertical-align:1px}
.sidebar-caption{color:#98a0aa}
.sidebar-bottom{color:#6b747f}
.sidebar-bottom p{color:#98a0aa}
.live-dot{background:#3d6e8c}
.topbar{border-bottom:1px solid #ebedf0;color:#6b747f}
.badge{background:#eff5f9;color:#3d6e8c}
h1{font-size:28px;font-weight:600;letter-spacing:-.02em;color:#14181d}
h2{color:#14181d}
.page-heading .muted,#page-description{color:#5b636d;font-size:14px;line-height:1.6}
.primary{background:#14181d;color:#fff;font-weight:500;border-radius:8px;padding:11px 19px;min-height:42px}
.primary:hover{background:#2b323b}
.secondary{background:#fff;border:1px solid #dde0e5;color:#14181d;font-weight:400;border-radius:8px;min-height:42px}
.secondary:hover{background:#f5f7f9}
.text-button,.link-inline{background:none;color:#3d6e8c;font-size:14px;padding:0;text-decoration:none}
.link-inline:hover,.text-button:hover{text-decoration:underline;text-underline-offset:3px}
input,select,textarea{border:1px solid #dde0e5;border-radius:8px;color:#14181d}
label{color:#14181d}
.table-panel{border:1px solid #ebedf0;border-radius:10px;background:#fff}
caption{font-size:14px;font-weight:600;color:#14181d;padding:18px 20px}
th{background:#fafafa;color:#6b747f;font-size:13px;font-weight:400;border-top:0;border-bottom:1px solid #ebedf0;padding:13px 20px}
td{border-bottom:1px solid #ebedf0;font-size:14px;padding:16px 20px;color:#14181d}
table,.supply-records table{font-size:14px}
.cell-main,.supply-records .cell-main{font-size:14px;font-weight:500;color:#14181d}
.cell-sub,.supply-records .cell-sub{font-size:12px;color:#98a0aa}
.muted{color:#98a0aa}
.status{font-size:13px;padding:4px 11px;border-radius:6px;background:#eef0f3;color:#5b636d}
.status.good{background:#eff5f9;color:#3d6e8c}
.status.warn{background:#f3eee2;color:#8a6d1f}
.status.bad{background:#fbf1ef;color:#b23a2b}
.note-panel{background:#fff;border:1px solid #ebedf0;color:#5b636d;font-size:14px;line-height:1.7;border-radius:10px}
.supply-toolbar{background:#fff;border:1px solid #ebedf0;border-radius:10px}
.supply-toolbar label{color:#6b747f}
.subnav button{background:#f3f5f7;color:#4a5159;border-radius:7px;font-size:14px}
.subnav button[aria-pressed=true]{background:#14181d;color:#fff}
.row-actions{gap:16px}
.row-actions button.action-link{background:transparent;color:#3d6e8c;font-size:14px;padding:0}
.row-actions button.action-link:hover{text-decoration:underline;text-underline-offset:3px}
.row-actions button.action-danger{background:transparent;color:#b23a2b;font-size:14px;padding:0}
.row-actions button.action-danger:hover{background:transparent;text-decoration:underline;text-underline-offset:3px}
.empty strong{color:#14181d;font-size:16px}
.workflow-card,.launch-card,.stat-card,.node-card{border-color:#ebedf0;border-radius:10px}
.workflow-card:hover,.launch-card:hover,.stat-card:hover{border-color:#a7c1d9;background:#fff}
.workflow-card strong,.workflow-arrow{color:#3d6e8c}
.workflow-step{color:#98a0aa}
.launch-card.featured{background:#14181d;border-color:#14181d}
.launch-card.featured:hover{background:#2b323b}
.featured .launch-icon{color:#a7c1d9}
.featured p{color:#98a0aa}
.launch-icon{color:#98a0aa}
.stat-card strong{color:#14181d}
.quota-summary{background:#fafafa;border:1px solid #ebedf0}
dialog{background:#fff;border:1px solid #ebedf0;border-radius:14px}
dialog::backdrop{background:#14181dad}
.secret-code{background:#fafafa;border:1px dashed #a7c1d9;color:#14181d}
.field-help{color:#6b747f;font-size:13px}
.permission-note{color:#6b747f;font-size:13px}
#page-message{background:#eff5f9;color:#2b5570}
#page-message.is-error{background:#fbf1ef;color:#b23a2b}
button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,summary:focus-visible{outline:2px solid #3d6e8c;outline-offset:2px}

/* ══ 商品与订单 ══ */
.commerce-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:28px}
.stat-tile{border:1px solid #ebedf0;border-radius:10px;padding:18px 20px;background:#fff}
.stat-tile span{display:block;font-size:13px;color:#6b747f}
.stat-tile strong{display:block;margin-top:10px;font-size:28px;font-weight:600;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.stat-tile.accent strong{color:#3d6e8c}
.stat-tile.alert{border-color:#e8c9c4;background:#fbf1ef}
.stat-tile.alert span,.stat-tile.alert strong{color:#b23a2b}
.status-tabs{display:flex;gap:28px;border-bottom:1px solid #ebedf0;margin-bottom:22px;flex-wrap:wrap}
.status-tabs button{background:none;padding:0 0 12px;font-size:14px;color:#5b636d;border-bottom:2px solid transparent;margin-bottom:-1px;border-radius:0}
.status-tabs button span{margin-left:7px;color:#98a0aa;font-variant-numeric:tabular-nums}
.status-tabs button[aria-pressed=true]{color:#14181d;font-weight:500;border-bottom-color:#3d6e8c}
.commerce-bar{display:flex;gap:12px;align-items:center;margin-bottom:20px}
.commerce-bar input{flex:1;max-width:none;min-height:42px}
.commerce-note{margin-top:20px;display:flex;gap:11px;align-items:flex-start;border:1px solid #ebedf0;border-radius:10px;padding:16px 18px;font-size:14px;color:#5b636d;line-height:1.7;background:#fff}
.commerce-note::before{content:"i";flex:none;width:18px;height:18px;border:1.4px solid #98a0aa;border-radius:50%;font-size:11px;line-height:15px;text-align:center;color:#98a0aa;margin-top:2px;font-style:italic}
.pill{display:inline-block;font-size:13px;padding:4px 11px;border-radius:6px}
.pill.spot{background:#eff5f9;color:#3d6e8c}
.pill.pre{background:#f3eee2;color:#8a6d1f}
.due-soon{color:#b23a2b;font-weight:600}
.ship-go{background:#a7c1d9;color:#14181d;font-size:13px;font-weight:500;padding:8px 15px;border-radius:7px;white-space:nowrap}
.ship-go:hover{background:#93b3cf}
.wait-prod{font-size:14px;color:#98a0aa;white-space:nowrap}
.link-button.wait-prod{color:#3d6e8c;font-size:13px;margin-left:0;white-space:normal;text-align:left}
.ship-crumb{font-size:13px;color:#98a0aa;margin-bottom:12px}
.ship-crumb button{background:none;color:#3d6e8c;font-size:13px;padding:0}
.ship-crumb button:hover{text-decoration:underline;text-underline-offset:3px}
.ship-head{display:flex;align-items:center;justify-content:space-between;gap:24px;margin-bottom:28px;flex-wrap:wrap}
.ship-title{display:flex;align-items:center;gap:14px;font-size:26px;font-weight:600;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.ship-due{font-size:14px;border-radius:8px;padding:9px 15px;border:1px solid #ebedf0;color:#5b636d;white-space:nowrap}
.ship-due.soon{color:#b23a2b;background:#fbf1ef;border-color:#e8c9c4}
.ship-layout{display:grid;grid-template-columns:336px minmax(0,1fr);gap:20px;align-items:start}
.ship-card{border:1px solid #ebedf0;border-radius:10px;padding:22px;background:#fff}
.ship-card h3{font-size:15px;font-weight:600;margin:0;color:#14181d}
.ship-facts{display:flex;flex-direction:column;gap:15px;margin:18px 0 0}
.ship-facts>div{display:flex;justify-content:space-between;gap:16px;font-size:14px;align-items:baseline}
.ship-facts dt{color:#6b747f;flex:none}
.ship-facts dd{margin:0;text-align:right;overflow-wrap:anywhere}
.ship-steps{display:flex;flex-direction:column;gap:20px;min-width:0}
.step-head{display:flex;align-items:baseline;justify-content:space-between;gap:16px;flex-wrap:wrap}
.step-head small{font-size:13px;color:#6b747f}
/* 预售单发货页第一步（设计稿 presale-alloc 第 3 节）：已配对那条信息框、还在排队那条等待框 */
.ship-paired{display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-top:14px;padding:12px 15px;border:1px solid #c9d9e4;border-radius:9px;background:#eff5f9;font-size:14px}
.ship-waiting{margin-top:14px;padding:12px 15px;border:1px solid #e4dcc4;border-radius:9px;background:#f3eee2;color:#8a6d1f;font-size:14px}
.unit-list{display:flex;flex-direction:column;gap:10px;margin-top:16px}
.unit{display:flex;align-items:center;gap:14px;border:1px solid #dde0e5;border-radius:8px;padding:14px 17px;cursor:pointer;margin:0;font-weight:400}
.unit input{width:16px;height:16px;flex:none;margin:0;accent-color:#3d6e8c}
.unit b{font-size:15px;font-weight:600;width:auto;white-space:nowrap;font-variant-numeric:tabular-nums;flex:none}
.unit em{font-style:normal;flex:1;font-size:14px;color:#5b636d;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.unit:has(input:checked){border-color:#3d6e8c;background:#eff5f9}
.unit.locked{background:#fafafa;border-color:#ebedf0;color:#98a0aa;cursor:not-allowed}
/* 不能选的那一项（售后保修三段：超过 7 天的换新 / 退货退款）灰掉，悬停看 title 原因 */
.unit:has(input:disabled){background:#fafafa;border-color:#ebedf0;color:#98a0aa;cursor:not-allowed}.unit:has(input:disabled) em{color:#a8afb8}
.code-box{margin-top:16px;display:flex;align-items:center;gap:18px;background:#fafafa;border:1px solid #ebedf0;border-radius:8px;padding:18px 20px;flex-wrap:wrap}
.code-box b{font-size:19px;font-weight:600;letter-spacing:.05em;user-select:all;overflow-wrap:anywhere}
.code-box span{font-size:14px;color:#6b747f}
.ship-logistics{display:flex;gap:12px;margin-top:16px}
.ship-logistics input{flex:1;min-height:42px}
.ship-logistics select{width:150px;flex:none;min-height:42px}
.ship-submit{display:flex;align-items:center;gap:16px;flex-wrap:wrap}
.ship-submit p{margin:0;font-size:13px;color:#6b747f;line-height:1.7}
@media(max-width:1200px){.commerce-stats{grid-template-columns:repeat(2,1fr)}.ship-layout{grid-template-columns:1fr}}
@media(max-width:720px){.commerce-stats{gap:10px}.status-tabs{gap:18px}.commerce-bar{flex-wrap:wrap}.ship-logistics{flex-wrap:wrap}.ship-logistics select{width:100%}}

/* 登录页跟着设计稿走 */
.login-intro{background:#14181d}
.login-intro .eyebrow{color:#98a0aa}
.login-intro>p:not(.eyebrow){color:#c6ccd4}
.intro-foot{color:#6b747f}
.login-note{color:#6b747f}
.login-note a{color:#3d6e8c}
.eyebrow{color:#6b747f}

/* ══ 深色底上的字要留白 ══ */
.launch-card.featured h2,.launch-card.featured h3,.launch-card.featured .arrow{color:#fff}
.launch-card.featured p{color:#98a0aa}
.login-intro h1,.login-intro h2,.login-intro .wordmark,.login-intro .studio-wordmark{color:#fff}
.login-intro a{color:#a7c1d9}
.subnav button[aria-pressed=true]{color:#fff}
.primary,.primary:hover,.primary:focus-visible{color:#fff}
.ship-go{color:#14181d}

/* ══ 底部说明框里的品牌水印 ══ */
.note-panel,.commerce-note{position:relative;isolation:isolate;overflow:hidden}
.note-panel{min-height:104px;display:flex;align-items:center}
.note-panel::after,.commerce-note::after{
  content:"";position:absolute;z-index:-1;right:26px;top:50%;transform:translateY(-50%);width:64px;height:76px;
  background:#14181d;opacity:.085;pointer-events:none;
  -webkit-mask:url(/internal/brand/gy-mark-mono.svg) no-repeat center/contain;
  mask:url(/internal/brand/gy-mark-mono.svg) no-repeat center/contain}
.note-panel p,.commerce-note{padding-right:104px}
@media(max-width:720px){.note-panel::after,.commerce-note::after{display:none}.note-panel p,.commerce-note{padding-right:18px}.note-panel{min-height:0;display:block}}

/* ══ 把剩下的墨绿全部换成设计稿配色 ══ */
/* 行内操作按钮（产品档案 / 客户账号 / 工作人员 这些老页面） */
.row-actions button{background:transparent;color:#3d6e8c;font-size:14px;padding:0}
.row-actions button:hover{background:transparent;text-decoration:underline;text-underline-offset:3px}

/* 物料页：产品 / 版本筛选 chip */
.material-product-tabs button,.material-version-tabs button{color:#5b636d}
.material-product-tabs button:hover,.material-version-tabs button:hover{background:#f3f5f7}
.material-product-tabs button[aria-pressed=true]{color:#fff;background:#14181d}
.material-version-tabs button[aria-pressed=true]{background:#14181d;color:#fff}
.material-filter-chip{background:#eff5f9;color:#3d6e8c}
.material-tool-button{color:#4a5159}
.material-tool-button[aria-expanded=true]{background:#eff5f9;color:#3d6e8c}
.material-popover{border-color:#ebedf0;box-shadow:0 10px 30px #14181d1a}
.material-popover>button{color:#4a5159}
.material-popover>button:hover{background:#f3f5f7}
.material-popover>button[aria-pressed=true]{background:#eff5f9;color:#3d6e8c}
.material-radio-group legend{color:#6b747f}
.material-radio-group input[type=radio]{accent-color:#3d6e8c}
.material-thumbnail{border-color:#e3e6ea}
.material-title:hover{color:#3d6e8c}
.ref-summary b{color:#3d6e8c}
.ref-empty{background:#f3eee2;color:#8a6d1f}
.ref-empty:hover{background:#ece5d3}

/* 物料图片上传区 */
.material-image-tabs{background:#f3f5f7}
.material-image-tabs button{color:#5b636d}
.material-image-tabs button[aria-pressed=true]{background:#fff;color:#14181d;box-shadow:0 1px 3px #14181d1a}
.material-image-drop{border-color:#c6ccd4;background:#fafafa}
.material-image-drop:hover{background:#f3f5f7;border-color:#a7c1d9}
.material-image-drop.is-dragging{background:#eff5f9;border-color:#3d6e8c}
.material-image-drop:focus-within{border-color:#3d6e8c}
.material-drop-icon{color:#98a0aa}
.material-drop-choice{color:#6b747f}
.material-image-editor>legend{color:#14181d}
.material-image-editor input[type=file]::file-selector-button{border-color:#dde0e5;background:#f3f5f7;color:#14181d}
.material-image-unavailable{color:#98a0aa}

/* 弹层里的「更多信息」与物料选择器 */
.form-extra{border-color:#ebedf0}
.form-extra>summary{color:#14181d}
.form-extra>summary span{color:#98a0aa}
.line-material-picker>summary{color:#14181d;border-color:#dde0e5}
.line-material-picker[open]>summary{color:#3d6e8c;background:#eff5f9}
.material-picker-panel{border-color:#dde0e5}
.material-picker-results>button{color:#14181d}
.material-picker-results>button:hover,.material-picker-results>button[aria-pressed=true]{background:#eff5f9}
.material-picker-results small,.picked-material small,.purchase-line legend{color:#98a0aa}

/* 数量加减与耗材步进器 */
.number-control{border-color:#dde0e5}
.number-control button{color:#3d6e8c;background:#f3f5f7;border-color:#e3e6ea}
.number-control button:hover:not(:disabled){background:#eff5f9}
.number-control button:focus-visible{color:#3d6e8c}
.consumable-stepper{background:#f3f5f7}
.consumable-stepper button{color:#3d6e8c}

/* 兜底：焦点框统一钢蓝，别再出现橙色描边 */
.material-thumbnail:focus-visible,.material-detail-image:focus-visible,
.material-image-tabs button:focus-visible,.material-image-drop:focus-within,
.material-version-tabs button:focus-visible,.material-product-tabs button:focus-visible,
.material-tool-button:focus-visible,.material-filter-chip:focus-visible{outline:2px solid #3d6e8c;outline-offset:2px}
dialog{color:#14181d}

/* ══ 建立/编辑物料弹层（照设计稿 1 · 新建物料） ══ */
dialog:has(.mat-cols),dialog:has(.pick-list){width:min(700px,calc(100% - 32px))}
#dialog-fields .seg{display:flex;background:#ebedf0;border-radius:8px;padding:3px;gap:3px;margin-bottom:22px}
#dialog-fields .seg button{flex:0 0 auto;font-size:13px;padding:7px 14px;border-radius:6px;color:#5b636d;background:transparent}
#dialog-fields .seg button.on{background:#fff;color:#14181d;font-weight:500}
.f-lab{display:block;font-size:13px;color:#5b636d;margin-bottom:7px;font-weight:400}
.f-lab i{color:#b23a2b;margin-left:3px;font-style:normal}
.f-lab em{color:#98a0aa;font-style:normal;margin-left:6px}
.f-hint{font-size:12px;color:#98a0aa;margin:6px 0 0}
.f-cell{margin:0 0 16px}
.f-cell label{margin:0}
.f-cell input,.f-cell select,.f-cell textarea{min-height:42px;font-size:14px;border:1px solid #dde0e5;border-radius:8px;padding:0 13px;background:#fff}
.f-cell textarea{padding:11px 13px;min-height:132px;resize:vertical}
.f-row{display:flex;gap:12px}
.f-row>.f-cell{flex:1;min-width:0}
.f-row>.f-cell.narrow{flex:0 0 104px}
.mat-cols{display:flex;gap:22px;align-items:flex-start}
.mat-cols>div:first-child{flex:1;min-width:0}
.mat-cols>.img-cell{flex:0 0 200px;margin-bottom:16px}
.img-cell .material-image-editor{margin:0}
.img-cell .material-image-editor>legend{display:none}
.img-cell .material-image-tabs{width:100%;margin-bottom:10px}
.img-cell .material-image-tabs button{flex:1;padding:7px 6px;font-size:12px}
.img-cell .material-image-drop{padding:22px 12px;min-height:172px;justify-content:center;border-radius:10px}
.img-cell .material-image-drop .field-help{font-size:11px}
.img-cell .material-image-actions{gap:12px;margin-top:8px}
.img-cell .text-button{font-size:12px;padding:4px 0}
.carry-img{border:1px solid #dde0e5;border-radius:10px;background:#fafafa;min-height:172px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:9px;text-align:center;padding:14px}
.carry-img img{width:76px;height:76px;object-fit:cover;border-radius:8px;border:1px solid #dde0e5}
.carry-img-blank{width:76px;height:76px;border-radius:8px;background:#e8eaee;border:1px solid #dde0e5}
.carry-img span{font-size:12px;color:#6b747f}
.carry-img .text-button{font-size:12px;color:#3d6e8c;padding:0}
.picked-row{display:flex;align-items:center;gap:12px;border:1px solid #3d6e8c;background:#eff5f9;border-radius:8px;padding:11px 13px}
.picked-row>span{flex:1;min-width:0}
.picked-row b,.pick-row b{display:block;font-size:14px;font-weight:500;color:#14181d;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.picked-row i,.pick-row i{display:block;font-size:12px;color:#98a0aa;font-style:normal;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pick-thumb{width:40px;height:40px;flex:none;border-radius:7px;background:#ebedf0;border:1px solid #ebedf0;object-fit:cover}
.pick-list{margin-top:10px;max-height:300px;overflow:auto;border:1px solid #ebedf0;border-radius:10px}
.pick-row{display:flex;width:100%;align-items:center;gap:12px;padding:10px 13px;background:#fff;text-align:left;border-bottom:1px solid #f1f3f5}
.pick-row:last-child{border-bottom:0}
.pick-row:hover{background:#eff5f9}
.pick-row>span{flex:1;min-width:0}
.carry-box{border:1px solid #ebedf0;border-radius:10px;overflow:hidden;margin-top:16px}
.carry-head{padding:10px 13px;background:#fafafa;border-bottom:1px solid #ebedf0;font-size:12px;color:#6b747f}
.carry-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:6px 13px;border-bottom:1px solid #ebedf0;min-height:42px}
.carry-row:last-child{border-bottom:0}
.carry-row>span:first-child{font-size:13px;color:#6b747f;flex:none}
.carry-row em{font-size:13px;font-style:normal;color:#14181d;text-align:right}
.carry-row input{width:130px;min-height:32px;text-align:right;font-size:13px;border:1px solid transparent;border-radius:6px;padding:0 8px;background:transparent}
.carry-row input:hover{border-color:#e3e6ea}
.carry-row input:focus{border-color:#3d6e8c;background:#fff;outline:none}
.carry-price{display:flex;align-items:center;gap:2px}
.carry-price i{font-style:normal;font-size:12px;color:#98a0aa}
.carry-price input{width:74px}
.material-more{border:1px solid #ebedf0;border-radius:10px;border-top:1px solid #ebedf0;padding:0;margin:20px 0 0}
.material-more>summary{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:13px 16px;cursor:pointer;list-style:none}
.material-more>summary::-webkit-details-marker{display:none}
.material-more .more-text b{display:block;font-size:14px;font-weight:500;color:#14181d}
.material-more .more-text i{display:block;font-size:12px;color:#98a0aa;font-style:normal;margin-top:3px}
.material-more .more-toggle{font-size:13px;color:#3d6e8c;flex:none}
.material-more[open] .more-toggle::after{content:" ⌃"}
.material-more:not([open]) .more-toggle::after{content:" ⌄"}
.more-grid{display:flex;gap:20px;flex-wrap:wrap;padding:4px 16px 18px;border-top:1px solid #ebedf0}
.more-grid>div{flex:1;min-width:240px}
/* 适用硬件版本：主区可点标签 */
.ver-chips{display:flex;gap:8px;flex-wrap:wrap}
.ver-chip{display:inline-flex;align-items:center;gap:7px;margin:0;font-size:13px;font-weight:400;color:#4a5159;background:#fff;border:1px solid #dde0e5;border-radius:999px;padding:7px 14px;cursor:pointer;white-space:nowrap;line-height:1.2}
.ver-chip:hover{border-color:#a7c1d9;background:#f7fafc}
.ver-chip input{width:15px;height:15px;min-height:0;flex:none;margin:0;accent-color:#3d6e8c;padding:0}
.ver-chip:has(input:checked){background:#eff5f9;border-color:#3d6e8c;color:#14181d;font-weight:500}
#save-dialog{background:#a7c1d9;color:#14181d}
#save-dialog:hover{background:#93b3cf;color:#14181d}
@media(max-width:640px){.mat-cols{flex-direction:column}.mat-cols>.img-cell{flex:1 1 auto;width:100%}.more-grid>div,.more-grid>div:last-child{flex:1 1 100%}}

/* ══ 新建物料 · 从截图填（设计稿 workbench-final-1008 · matShotDialog） ══ */
.shot-drop{display:flex;flex-direction:column;align-items:center;gap:6px;text-align:center;border:2px dashed #c4ccd3;border-radius:12px;padding:20px 16px;background:#f8fafb;margin:14px 0 16px;transition:background .12s,border-color .12s}
.shot-drop b{font-size:15px;font-weight:600;color:#14181d}
.shot-drop>span{font-size:13px;color:#6b7580}
.shot-drop.is-dragging{background:#eff5f9;border-color:#3d6e8c}
.shot-drop.is-busy{border-style:solid;border-color:#a7c1d9;background:#f3f7fa}
.shot-drop .field-help,.shot-drop .error{margin:2px 0 0}
.shot-drop .field-help:empty{display:none}
.shot-pick{position:relative;display:inline-block;margin:4px 0 0;padding:6px 14px;border:1px solid #dde0e5;border-radius:8px;background:#fff;font-size:13px;font-weight:400;color:#3d6e8c;cursor:pointer}
.shot-pick:hover{border-color:#a7c1d9}
.shot-pick:focus-within{outline:3px solid #e89328;outline-offset:2px}
.shot-pick input{position:absolute;inset:0;width:100%;height:100%;opacity:0;margin:0;padding:0;cursor:pointer}
.shot-done{margin:14px 0 16px}
.shot-done>.field-help{margin:8px 0 0}
.shot-done .link-button{margin-left:8px}
.shot-card{display:flex;gap:12px;align-items:center;border:1px solid #e3e6e9;border-radius:10px;padding:10px;background:#fff}
.shot-thumb{width:72px;height:72px;flex:none;border-radius:8px;object-fit:cover;background:#eef1f3}
.shot-txt{display:flex;flex-direction:column;gap:2px;min-width:0}
.shot-txt b{font-size:13px;line-height:1.4;font-weight:600;overflow-wrap:anywhere}
.shot-price{color:#c2410c;font-weight:700;font-size:14px}
.shot-txt small{font-size:12px;color:#6b7580}
.f-head{display:flex;align-items:baseline;flex-wrap:wrap;gap:0 8px}
.f-head>label,.f-head>.f-lab{margin:0}
.f-head .f-lab{margin-bottom:7px}
.ai-tag{display:inline-block;font-size:11px;line-height:18px;padding:0 7px;border-radius:5px;background:#e8f0f7;color:#2f5d80;font-weight:500;white-space:nowrap;margin-bottom:7px}
.ai-tag.is-missing{background:#f6f0e4;color:#7d5a16}
.shot-place-hint{margin:-8px 0 14px}
/* 供应商一栏（物料表单、照着建、仓库填参考单价共用，Tim 10-11）：输入框下方一句「已有供应商」/「保存时新建供应商（资质待审核）」 */
.sup-hint:empty{display:none}
.sup-state{font-size:12.5px;line-height:1.5}
.sup-state.is-matched{color:#2c6339}
.sup-state.is-new{color:#7d5a16}
.carry-row.carry-sup{align-items:flex-start;padding-top:8px;padding-bottom:8px}
.carry-sup-field{display:flex;flex-direction:column;align-items:flex-end;flex:1;min-width:0}
.carry-row .carry-sup-field input{width:100%;max-width:220px}
.carry-sup-field .sup-hint{margin:4px 8px 0;text-align:right}
/* 拆包件：选已有耗材 /「＋ 新建这包耗材」在表单里展开（Tim 10-11） */
.unit-note{margin:-8px 0 14px}
.carry-note{margin:0;padding:0 13px 8px;text-align:right;border-bottom:1px solid #ebedf0}
.pack-pick{display:flex;gap:8px;align-items:stretch}
.pack-pick select{flex:1;min-width:0}
.pack-pick .pack-new-btn{flex:none;white-space:nowrap;min-height:40px;padding:0 12px;font-size:13px}
.pack-picked{margin:0;font-size:13px;line-height:1.6;color:#4a5159}
.pack-picked .link-button{margin-left:8px}
.new-pack{margin:0 0 16px;padding:12px 14px 4px;border:1px solid #e3e6ea;border-radius:10px;background:#fafbfc;min-width:0}
.new-pack legend{padding:0 6px;font-size:13px;font-weight:600;color:#14181d}
.new-pack .f-row{gap:12px}
.new-pack .new-pack-image{margin:2px 0 6px;font-size:13px;align-items:center}
.new-pack .new-pack-image input{width:18px;height:18px;min-height:0;padding:0;margin:0;flex:none}
@media (max-width:560px){.pack-pick{flex-direction:column}.pack-pick .pack-new-btn{min-height:44px}}

/* ══ 参考价条与内联填价（设计稿 2 · 物料档案） ══ */
.material-ref-bar{display:flex;gap:9px;align-items:center;flex-wrap:wrap;margin:14px 0 16px}
.ref-bar-label{font-size:13px;color:#98a0aa}
.ref-bar-grow{flex:1}
.ref-chip{font-size:13px;padding:5px 13px;border-radius:999px;border:1px solid #dde0e5;background:#fff;color:#5b636d;white-space:nowrap}
.ref-chip:hover{border-color:#a7c1d9}
.ref-chip.warn{border-color:#ddd2b8;background:#f3eee2;color:#8a6d1f}
.ref-chip.on{background:#a7c1d9;border-color:#a7c1d9;color:#14181d;font-weight:500}
.ref-chip.warn.on{background:#e6cf9a;border-color:#e6cf9a;color:#5c4713}
.ref-cost{font-size:13px;color:#6b747f;white-space:nowrap}
.ref-cost b{color:#14181d;font-weight:500;font-variant-numeric:tabular-nums}

.supply-records th .ref-th{color:#3d6e8c}
.supply-records th .ref-th em{color:#98a0aa;font-style:normal}
.supply-records th:has(.ref-th){background:#eff5f9}
.supply-records td.ref-col{background:#eff5f9;vertical-align:middle}
.supply-records td.ref-col:has(.ref-editor){background:#fff;border-left:1px solid #c3d6e5;border-right:1px solid #c3d6e5}
.ref-filled{display:block;width:100%;text-align:left;background:transparent;padding:2px 0}
.ref-filled:hover .ref-price{text-decoration:underline;text-underline-offset:3px}
.ref-price{font-weight:500;font-size:15px;white-space:nowrap;font-variant-numeric:tabular-nums;color:#14181d}
.ref-col .cell-sub{color:#98a0aa}
.ref-col .cell-sub.stale{color:#b23a2b}
.ref-off{font-size:13px;color:#98a0aa;white-space:nowrap}
.ref-empty{padding:4px 10px;border-radius:6px;background:#f3eee2;color:#8a6d1f;font-size:13px;white-space:nowrap}
.ref-empty:hover{background:#ece5d3}

.ref-editor{border:1px solid #3d6e8c;border-radius:8px;padding:12px 13px;background:#fff;min-width:186px}
.ref-line{display:flex;align-items:center;gap:8px}
.ref-line i{font-style:normal;font-size:15px;color:#6b747f}
.ref-line input{width:100%;min-height:32px;font-size:15px;font-weight:500;border:1px solid #dde0e5;border-radius:6px;padding:0 9px;font-variant-numeric:tabular-nums}
.ref-line.small{margin-top:8px;gap:7px}
.ref-line.small span{font-size:12px;color:#6b747f;flex:none;width:30px}
.ref-line.small em{font-size:12px;color:#98a0aa;font-style:normal;flex:none}
.ref-line.small input{min-height:29px;font-size:13px;font-weight:400;padding:0 8px}
.ref-actions{display:flex;gap:8px;margin-top:11px}
.ref-save{font-size:13px;font-weight:500;color:#fff;background:#14181d;border-radius:6px;padding:6px 14px}
.ref-save:hover{background:#2b323b}
.ref-cancel{font-size:13px;color:#14181d;background:#fff;border:1px solid #dde0e5;border-radius:6px;padding:6px 12px}
.ref-cancel:hover{background:#f5f7f9}
.material-thumbnail.is-blank{display:inline-block;flex:0 0 44px;width:44px;height:44px;border-radius:7px;background:#ebedf0;border:1px solid #ebedf0}
@media(max-width:900px){.ref-bar-grow{flex:1 0 100%}.ref-cost{margin-top:6px}}

/* ══ 工作室首页 = 纯选择页：不挂侧边栏，点进产品管理才有 ══ */
.app.is-launcher .sidebar{display:none}
.app.is-launcher .topbar{padding:0 42px}
.app.is-launcher .topbar>span:first-child{visibility:hidden}
.app.is-launcher #refresh{display:none}
.app.is-launcher main{max-width:1120px;padding:88px 42px 42px}
.app.is-launcher .page-heading{margin-bottom:44px}
.app.is-launcher .page-title-row h1{font-size:34px}
.app.is-launcher #page-description{font-size:15px;margin-top:14px}
.app.is-launcher .launch-grid{gap:20px;margin-bottom:0}
.app.is-launcher .launch-card{min-height:210px;padding:28px}
.app.is-launcher footer{padding:23px 42px}
@media(max-width:1000px){.app.is-launcher main{padding:56px 26px 32px}.app.is-launcher .topbar{padding:0 26px}}
@media(max-width:720px){.app.is-launcher main{padding:36px 18px 26px}.app.is-launcher .page-title-row h1{font-size:27px}.app.is-launcher .launch-card{min-height:130px}}

/* 参考单价：算出来的那一行 */
.ref-editor .ref-line>span{font-size:12px;color:#6b747f;flex:none;width:30px}
.ref-derived{margin-top:11px;padding:9px 10px;border-radius:6px;background:#eff5f9;font-size:12px;color:#3d6e8c;display:flex;align-items:baseline;gap:6px;flex-wrap:wrap}
.ref-derived b{font-size:16px;font-weight:600;color:#14181d;font-variant-numeric:tabular-nums}
.ref-derived b.none{color:#98a0aa;font-weight:400}
.ref-derived span{font-size:12px;color:#98a0aa}

/* 参考单价卡：单位统一排在框右边 */
.ref-editor .ref-line.small{gap:8px}
.ref-editor .ref-line>span{flex:none;width:30px;font-size:12px;color:#6b747f}
.ref-editor .ref-line>input{flex:1;min-width:0}
.ref-editor .ref-line>em{flex:none;width:26px;text-align:left;font-style:normal;font-size:12px;color:#98a0aa}

/* 参考单价单元格：厂家单独一行 */
.ref-col .cell-sub{display:block;margin-top:3px;line-height:1.5}
.ref-col .ref-src{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* 物料属性：三选一 + 算出来的单价 */
#dialog-fields .kind-seg{margin-bottom:0}
#dialog-fields .kind-seg button{flex:1}
.f-cell #mat-derived{margin:0 0 16px}
.ref-derived .calc{flex-basis:100%;font-size:12px;color:#98a0aa;font-variant-numeric:tabular-nums;margin-top:2px}
.ref-how{color:#98a0aa}
.ref-empty-plain{font-size:13px;color:#98a0aa}

/* BOM 弹层：系列与配置并排 */
.bom-ident{gap:12px;align-items:flex-start}
.bom-ident>.f-cell{flex:1;min-width:0;margin-bottom:16px}
.bom-ident label{margin-top:0}
#dialog-fields .material-more+.line-editor{margin-top:4px}

/* BOM 一键添加：下拉与按钮同排 */
.bom-bulk-materials{margin:0 0 16px}
.bom-bulk-materials>label{display:block;margin:0 0 7px;font-size:13px;font-weight:400;color:#5b636d}
.bom-bulk-row{display:flex;gap:10px;align-items:stretch}
.bom-bulk-row>select{flex:1;min-width:0;min-height:40px;margin:0}
.bom-bulk-row>button{flex:none;min-height:40px;padding:0 16px;white-space:nowrap;margin:0}
.bom-bulk-materials>.field-help{margin:8px 0 0}
.line-editor>h3{font-size:15px;font-weight:600;margin:0 0 14px}

/* BOM 明细：单价 / 小计 / 单台料本 */
.bom-num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
.bom-num .cell-sub{text-align:right;white-space:normal}
.th-num{display:block;text-align:right}
.bom-pend{display:inline-block;background:#f3eee2;color:#8a6d1f;font-size:12px;padding:2px 8px;border-radius:5px;white-space:nowrap}
.bom-gone{color:#b23a2b;font-size:12px}
tr.bom-total td{background:#fafafa;font-weight:600;border-top:1px solid #dde0e5;font-size:13px}
tr.bom-total .ref-price{font-size:16px}
.bom-note{color:#5b636d;white-space:normal;word-break:normal;line-height:1.7}
dialog#editor.is-wide{width:min(780px,calc(100% - 32px))}

/* BOM 列表：SKU 代码与发布时间竖排，不截断 */
.supply-records .cell-sub.bom-sku-code{max-width:none;white-space:normal;word-break:break-all;font-variant-numeric:tabular-nums;margin-top:4px}
.supply-records .cell-sub.bom-meta{max-width:none;white-space:normal;margin-top:6px}

/* 副行文字加深：对比度 2.64:1 -> 4.74:1，字号行高不动 */
.cell-sub,.supply-records .cell-sub{color:#6b747f}
.muted{color:#6b747f}

/* 物料页瘦身：搜索上移、工具跟着新建按钮 */
.page-heading{align-items:flex-start}
.page-tools{display:flex;align-items:center;gap:10px;margin-left:auto}
.page-tools .material-search{margin:0}
.page-tools input[type=search]{width:min(330px,38vw);min-height:40px;margin:0}
.material-product-row{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.material-product-row>.material-product-tabs,.material-product-row>.material-menu{flex:0 1 auto}
.material-row-end{margin-left:auto;display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.material-row-end .material-tools{display:flex;align-items:center;gap:14px;margin:0}
.usage-warn{border:1px solid #ddd2b8;background:#f3eee2;border-radius:9px;padding:13px 15px;margin-bottom:14px;color:#5c4713;font-size:13px;line-height:1.9}
.usage-warn b{color:#14181d;display:block;margin-bottom:7px}
.usage-warn ul{margin:0;padding-left:19px}
.usage-warn li{margin-bottom:4px}
.usage-warn li b{display:inline;margin:0}
.usage-warn.blocking{border-color:#e8c9c4;background:#fbf1ef;color:#b23a2b}
.usage-warn.blocking b{color:#b23a2b}
.usage-clean{font-size:13px;color:#5b636d;background:#fafafa;border-radius:9px;padding:13px 15px;margin-bottom:14px}
@media(max-width:860px){.page-tools{width:100%;margin:12px 0 0}.page-tools input[type=search]{width:100%}}

/* 产品行撑满，分类/筛选/排序/新建物料 才推得到最右 */
.material-context>.material-product-row{align-self:stretch;width:100%}
.material-product-row>.material-row-end{margin-left:auto}

/* 仓库：三个页签 */
.warehouse-bar{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin:14px 0 12px}
.warehouse-bar-end{margin-left:auto;display:flex;align-items:center;gap:12px}
.warehouse-hint{font-size:13px;color:#6b747f}
.move-in{color:#2f6b46}
.move-out{color:#b23a2b}
.pill-kind{display:inline-block;font-size:12px;padding:2px 9px;border-radius:5px;white-space:nowrap;background:#eef0f3;color:#6b747f}
.pill-kind.in{background:#eaf2ec;color:#2f6b46}
.pill-kind.out{background:#fbf1ef;color:#b23a2b}

/* 物料库存：缩略图与可点的价格 */
.material-thumbnail.is-empty{display:inline-block;width:40px;height:40px;border-radius:7px;background:#f2f3f5;border:1px solid #ebedf0;flex:none}
.stock-price{background:none;padding:0;font:inherit;color:inherit;text-align:right;font-variant-numeric:tabular-nums}
.stock-price:hover{text-decoration:underline;text-underline-offset:3px}

/* 仓库状态 chips 与分类排序 */
.wh-lab{font-size:13px;color:#6b747f}
.wh-chip{padding:5px 13px;border-radius:999px;font-size:13px;background:#f2f3f5;color:#5b636d;border:0}
.wh-chip.on{background:#dbe6f0;color:#14181d;font-weight:600}
.wh-chip.ghost{color:#98a0aa}
.wh-chip.ghost.on{background:#f3eee2;color:#8a6d1f}
.wh-sel{display:inline-flex;align-items:center;gap:7px}
.wh-sel label{margin:0;font-size:12px;color:#6b747f;font-weight:400}
.wh-sel select{width:auto;min-height:34px;padding:5px 9px;font-size:13px}
.consumable-stepper{display:inline-flex;gap:4px;margin-right:7px}

/* 仓库填价：单位与实时单价 */
.wh-qty-row{display:flex;gap:10px}
.wh-qty-row>input{flex:1;min-width:0}
.wh-qty-row>select{width:118px;flex:none}
.wh-derived{background:#eff5f9;border:1px solid #c3d6e5;border-radius:9px;padding:11px 13px;margin:12px 0 4px;font-size:13px;color:#3d6e8c}
.wh-derived b{font-size:17px;color:#14181d;font-variant-numeric:tabular-nums}
.wh-derived-how{display:block;font-size:12px;opacity:.75;margin-top:3px;font-variant-numeric:tabular-nums}
.link-inline{background:none;padding:0;font:inherit;font-size:12px;color:#3d6e8c;border-bottom:1px solid #c3d6e5}
.service-facts b{font-weight:600;color:#14181d}
.service-steps-row{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-top:22px}
.service-steps-row button.ship-go{padding:9px 17px}
.service-steps-row button.action-danger{background:#fff;border:1px solid #dde0e5;color:#b23a2b;padding:9px 17px;border-radius:7px;font-size:13px}
.service-steps-row button.action-danger:hover{background:#fbf1ef}
.service-timeline-title{font-size:15px;font-weight:600;margin:24px 0 0}
.service-timeline{list-style:none;margin:14px 0 0;padding:0;display:flex;flex-direction:column;gap:14px}
.service-timeline li{border-left:2px solid #dde0e5;padding:0 0 0 14px;font-size:14px}
.service-timeline li b{display:block;font-weight:600}
.service-timeline li span{display:block;font-size:12px;color:#6b747f;margin-top:3px}
.service-timeline li em{display:block;font-style:normal;color:#5b636d;margin-top:5px}
button.status.warn{cursor:pointer;font:inherit;font-size:11px;padding:3px 9px}
/* 成本与定价 + 月度盈亏（设计稿 qa/audit/cost-pricing.html）：系统算的行灰底只读，你填的行是输入框。 */
.cost-auto td{background:#fafafa}
.cost-warn td{background:#f8f3e6}
.cost-big td{background:#eff5f9;font-weight:700;font-size:14px}
.cost-input{width:120px;padding:6px 9px;text-align:right;font-variant-numeric:tabular-nums}/* 成本卡对话框里 ⑥⑦ 的比例框被挤扁，placeholder「待补」只剩一个「待」。− ＋ 是 number-inputs.js 包上去的，.number-control 那条把里面输入框的 min-width 压成了 0，这里用更高的优先级把下限顶回来， 「待补」和四位数都放得下。 */.number-control input.cost-input{min-width:76px}
.cost-floor{color:#8a6d1f;font-weight:600}
.cost-blocked{font-size:12.5px;color:#8a6d1f;background:#f3eee2;border-left:3px solid #8a6d1f;border-radius:8px;padding:10px 13px;margin:12px 0}
.cost-actions{display:flex;align-items:center;gap:12px;margin:12px 0 20px;flex-wrap:wrap}
.cost-actions .field-help{margin-top:0}
/* 「怎么来的」是口径说明，整句读得全才有用：不省略、可换行（验收 #6）。 */
.cost-how{display:block;min-width:150px;max-width:280px;line-height:1.6;white-space:normal;overflow-wrap:break-word}
/* 四张卡：累计投入 · 累计产品毛利 · 已卖 ·「几个月回本」（任务 11 起按当前定价算）。 */
.cost-kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin:16px 0}
.cost-kpi{border:1px solid #ebedf0;border-radius:10px;padding:12px 14px;background:#fff}
.cost-kpi span{display:block;font-size:11px;color:#6b747f}
.cost-kpi strong{display:block;font-size:22px;font-weight:600;margin-top:4px;letter-spacing:-.02em}
.cost-kpi small{display:block;font-size:11px;color:#6b747f;margin-top:4px;line-height:1.5}
.studio-manual{display:flex;align-items:flex-end;gap:12px;margin:14px 0 20px;flex-wrap:wrap}
.studio-manual label{margin:0 0 6px}
.studio-manual input{width:min(420px,100%)}
/* 固定费用页「其他固定费用（手填）」就在那一行填完：原因框 + 保存挤在「来源」那一格里（验收 #7）。 */
.studio-manual.is-inline{margin:0;gap:8px}
.studio-manual.is-inline input{width:min(190px,100%)}
.studio-manual.is-inline label{font-size:11px;color:#6b747f}
.studio-manual.is-inline button{padding:8px 14px}
/* ── 定价页 v9（样机 qa/audit/pricing-mock-v9.html，Tim 09-21）────────────────────
   只看实际利润和回本：底数一行 · 定价卡（三个输入 + 三个大数）· 表卡（台数 × 四行）。
   排版死规矩（Tim）：数字一律右对齐 + tabular-nums、台数各列等宽、行高 44px、
   表格 15px / 大数 30px / 标签 12px、三块间距一致。 */
.pricing-base{margin:10px 0 14px;font-size:13px;color:#5b636d;line-height:1.9}
.pricing-panel{display:block;border:1px solid #ebedf0;border-radius:12px;background:#fff;padding:18px 20px;margin:0 0 16px}
/* 三个输入一行：定价 · 每月销量（你估的）· 目标回本。 */
.pricing-ctl{display:flex;gap:36px;align-items:flex-end;flex-wrap:wrap}
.pricing-field{display:flex;flex-direction:column;gap:6px}
.pricing-field>.l{font-size:12px;color:#8a919b}
.pricing-inp{display:inline-flex;align-items:center;gap:6px;border:1px solid #d5d9df;border-radius:8px;padding:4px 10px;background:#fff}
.pricing-inp .u{flex:none;color:#8a919b;font-size:12px}
.pricing-inp input{width:110px;border:0;outline:0;background:transparent;padding:2px 0;font-size:20px;font-weight:600;text-align:right;font-variant-numeric:tabular-nums}
/* number-inputs.js 会把每个 <input type=number> 包进一对 −＋ 按钮里，而 .number-control 那条
   把里面的输入框压成 width:0（它原本是撑满一整行的表单控件）。这里用更高的优先级把宽度顶回来，
   不然定价这一格看得见 −＋ 却看不见数。 */
.pricing-inp .number-control{display:inline-flex;align-items:center;width:auto;margin:0;border:0;background:transparent}
.pricing-inp .number-control input[type="number"]{flex:0 0 112px;width:112px;min-width:112px;border-radius:0}
.pricing-inp.is-sm .number-control input[type="number"]{flex:0 0 72px;width:72px;min-width:72px}
.pricing-inp .number-control button{flex:0 0 26px;min-width:26px;font-size:15px;border-radius:6px;margin-left:4px;border-left:0}
/* 「目标回本」那排 pill：选中黑底白字，跟月度盈亏那排页签一个样。全页只有这一个月数。 */
.pricing-pills{display:inline-flex;gap:4px}
.pricing-pills button{padding:8px 12px;font-size:14px;border-radius:8px;border:1px solid #d5d9df;background:#fff;color:#4a5159;cursor:pointer;font-variant-numeric:tabular-nums}
.pricing-pills button[aria-pressed="true"]{background:#14181d;color:#fff;border-color:#14181d}
/* 三个大数：实际利润率 · 每台实际赚 · 几个月回本（绿 = 赚 / 回得了本，红 = 亏 / 回不了本）。 */
.pricing-kpi{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:22px}
.pricing-kpi .k{border-top:2px solid #ebedf0;padding-top:10px}
.pricing-kpi .l{display:block;font-size:12px;color:#8a919b}
.pricing-kpi .v{display:block;margin-top:4px;font-size:30px;font-weight:600;line-height:1.2;font-variant-numeric:tabular-nums}
.pricing-kpi .v.ok{color:#2f6b46}
.pricing-kpi .v.bad{color:#b23a2b}
.pricing-row{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-top:18px}
.pricing-reason{flex:1;min-width:220px;padding:9px 12px;border:1px solid #d5d9df;border-radius:8px;font-size:13px}
.pricing-last{margin:10px 0 0;font-size:12px;color:#8a919b}
/* 表卡：台数各列等宽（table-layout:fixed），行高 44px，窄屏横向滚动（.table-scroll 已经管了）。 */
.pricing-grid{margin:0}
.pricing-grid table{table-layout:fixed;min-width:660px}
.pricing-grid th,.pricing-grid td{height:44px;padding:8px 10px;font-size:15px;font-variant-numeric:tabular-nums}
.pricing-grid th{font-size:12px;color:#8a919b;font-weight:600}
.pricing-grid th:first-child,.pricing-grid td:first-child{width:200px;text-align:left;font-size:13px;color:#5b636d}
.pricing-grid th.num,.pricing-grid td.num{text-align:right}
.pricing-grid td.b{font-weight:600}
.pricing-grid td.bad{color:#b23a2b}
.pricing-grid th.me,.pricing-grid td.me{background:#fff8e6}
.pricing-grid th.me{color:#14181d}
/* 「M 个月回本价」那一行每个数都点得动：点一下 = 填进定价、台数切到那一列。 */
.pricing-pick{border:0;background:none;padding:0;font:inherit;color:#3d6e8c;cursor:pointer;text-decoration:underline dotted;font-variant-numeric:tabular-nums}
.pricing-pick:hover{background:#eff5f9}
.pricing-foot{margin:8px 0 0;font-size:12px;color:#8a919b}
/* 「怎么算的」和「假设」两个折叠：同一样式、同一间距，展开后缩进一档、带一条浅色左边线。 */
.pricing-fold>summary{cursor:pointer;font-size:13px;font-weight:600;padding:10px 0;color:#3d6e8c}
.pricing-fold>:not(summary){margin:0 0 10px 12px;padding-left:12px;border-left:2px solid #ebedf0}
.pricing-explain{margin:0;font-family:inherit;font-size:12.5px;line-height:1.9;white-space:pre-wrap}
.pricing-assume{display:flex;gap:16px;align-items:flex-end;flex-wrap:wrap}
.pricing-assume-item{display:flex;flex-direction:column;gap:6px}
.pricing-assume-item .l{font-size:12px;color:#8a919b}
.pricing-assume .pricing-inp input{width:86px;font-size:14px}
.pricing-assume .pricing-inp .number-control input[type="number"]{min-width:86px;font-size:14px}
.pricing-assume input[type="month"]{width:140px;font-size:14px;font-weight:400;text-align:left}
.pricing-assume-why{flex:1;min-width:200px}
.pricing-assume-why input{padding:9px 12px;border:1px solid #d5d9df;border-radius:8px;font-size:13px}
@media(max-width:900px){.pricing-kpi{grid-template-columns:1fr}.pricing-ctl{gap:18px}}
/* ── 定价滑杆 ↔ 同价位月销 + 市场参考（样机 pricing-mock-slider.html / pricing-mock-market.html，任务 16）──
   只搬调研数：这两块一个数都不算、不进任何公式，只是把同价位查到的月销和价格带摆在定价卡手边。 */
.pricing-slider .track{position:relative;height:46px;margin:26px 0 6px}
.pricing-slider .seg{position:absolute;top:14px;height:18px;border-radius:4px;background:#e4e9ee;border-right:2px solid #fff;pointer-events:none}
.pricing-slider .seg.has{background:#c6d5e1}
.pricing-slider .seg.me{background:#f0c860}
.pricing-slider .seg small{position:absolute;top:22px;left:0;right:0;text-align:center;font-size:11px;color:#8a919b;white-space:nowrap}
/* 红竖线就是定价：轨道分段不吃鼠标，滑杆压在上面才拖得动。 */
.pricing-slider input[type="range"]{position:absolute;top:8px;left:0;width:100%;margin:0;-webkit-appearance:none;appearance:none;background:transparent;height:30px}
.pricing-slider input[type="range"]::-webkit-slider-runnable-track{height:30px;background:transparent}
.pricing-slider input[type="range"]::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:4px;height:30px;background:#b23a2b;border-radius:2px;cursor:ew-resize;border:0}
.pricing-slider .read{display:block;margin-top:14px;padding:14px 16px;background:#fafafa;border:1px solid #ebedf0;border-radius:10px}
.pricing-slider .read .t{font-size:14px;color:#14181d;font-variant-numeric:tabular-nums}
.pricing-slider .read .t b{color:#14181d;font-variant-numeric:tabular-nums}
.pricing-band-table{width:100%;border-collapse:collapse;margin-top:12px;font-size:13px}
.pricing-band-table th{font-size:12px;color:#8a919b;font-weight:600;text-align:left;padding:6px 8px;border-bottom:1px solid #ebedf0}
.pricing-band-table td{padding:6px 8px;border-bottom:1px solid #f3f4f6;font-variant-numeric:tabular-nums}
.pricing-band-table th.num,.pricing-band-table td.num{text-align:right}
.pricing-band-table a{color:#3d6e8c}
.pricing-slider .foot{margin:10px 0 0;font-size:12px;color:#8a919b}
/* 市场参考：A / B 两条带子（低 / 中 / 高 / 顶），红线是你的定价。 */
.pricing-market h3{margin:0;font-size:15px}
.pricing-market .meta{font-size:12px;color:#8a919b;margin:2px 0 4px}
.pricing-market .sep{border-top:1px solid #ebedf0;margin:22px 0 26px}
.pricing-market .band{display:grid;grid-template-columns:150px 1fr;gap:16px;align-items:center;margin:0 0 30px}
.pricing-market .band+.band{margin-top:34px}
.pricing-market .band .n{font-size:13px;color:#5b636d}
.pricing-market .band .n b{display:block;color:#14181d}
.pricing-market .bar{position:relative;height:34px;margin-top:18px;border-radius:8px;background:linear-gradient(90deg,#e9eef2 0 25%,#d3dde5 25% 50%,#bccbd7 50% 75%,#a5b9c9 75%)}
.pricing-market .bar i{position:absolute;top:0;bottom:0;width:2px;background:#b23a2b}
.pricing-market .bar em{position:absolute;top:-20px;font-size:12px;font-style:normal;font-weight:600;color:#b23a2b;transform:translateX(-50%);white-space:nowrap}
.pricing-market .bar span{position:absolute;top:40px;font-size:12px;color:#5b636d;transform:translateX(-50%);white-space:nowrap;font-variant-numeric:tabular-nums}
.pricing-market .bar b{position:absolute;top:8px;font-size:12px;color:#fff;font-weight:600;transform:translateX(-50%)}
/* 四段（低 / 中 / 高 / 顶）和它们的刻度位置是死的：CSP 不许写 style 属性，摆在这儿。 */
.pricing-market .bar b:nth-of-type(1){left:12.5%}
.pricing-market .bar b:nth-of-type(2){left:37.5%}
.pricing-market .bar b:nth-of-type(3){left:62.5%}
.pricing-market .bar b:nth-of-type(4){left:87.5%}
.pricing-market .bar span:nth-of-type(1){left:25%}
.pricing-market .bar span:nth-of-type(2){left:50%}
.pricing-market .bar span:nth-of-type(3){left:75%}
.pricing-market .bar span:nth-of-type(4){left:99%}
.pricing-market .sales{font-size:13px;color:#5b636d;border-top:1px solid #ebedf0;padding-top:12px;margin:34px 0 0}
.pricing-market .sales b{color:#14181d;font-variant-numeric:tabular-nums}
/* 窄屏：轨道刻度每隔一档才写，带子说明摞到带子上面（Tim：窄了也别挤成一团）。 */
@media(max-width:900px){.pricing-slider .seg[data-odd="1"] small{display:none}
  .pricing-market .band{grid-template-columns:1fr;gap:6px}}
/* 从成本卡的缺价物料跳过来时，落地的那一行高亮一下，省得自己在一屏里找（验收 #2）。 */
.wh-hit>td{background:#fff6e2}
@media(max-width:900px){.cost-kpis{grid-template-columns:repeat(2,1fr)}}
/* BOM 的「按适用硬件版本添加」：版本锁死成这份 BOM 自己的，只读显示不给选。 */
.bom-bulk-label{display:block;font-size:13px;font-weight:600;margin:18px 0 8px}
.bom-bulk-locked{flex:1;display:flex;align-items:center;padding:11px 12px;border:1px solid #ebedf0;border-radius:8px;background:#fafafa;color:#5b636d;font-size:13px}

/* 售后页（2026-09-15 简化稿 mock ① 售后）：推进按钮直接在行上，黑底那颗就是下一步该干的事。 */
.row-actions button.rowbtn{background:#14181d;color:#fff;border-radius:7px;padding:6px 12px;font-size:12px;font-weight:500;white-space:nowrap}
.row-actions button.rowbtn:hover{background:#2a3038;color:#fff;text-decoration:none}
/* 建售后单：订单那一格从 81 项下拉换成搜索框 + 候选列表 */
.service-pick-list{margin-top:8px;border:1px solid #ebedf0;border-radius:10px;overflow:hidden;max-height:230px;overflow-y:auto}
.service-pick{padding:9px 12px;border-bottom:1px solid #f1f3f5;font-size:13px;cursor:pointer}
.service-pick:last-child{border-bottom:0}
button.service-pick{display:block;width:100%;text-align:left;background:transparent;border:0;border-bottom:1px solid #f1f3f5;border-radius:0;font:inherit;color:inherit;min-height:0}
button.service-pick:last-child{border-bottom:0}
.service-pick:hover{background:#f6f8fa}
.service-pick.on{background:#eff5f9}
.service-pick i{font-style:normal;color:#6b747f;font-size:12px;margin-left:8px}
.service-pick-empty{padding:12px;font-size:12.5px;color:#6b747f}
.service-locked{margin:0;padding:11px 12px;border:1px solid #ebedf0;border-radius:8px;background:#fafafa;color:#14181d;font-size:13px}

/* 激活码窗：三颗按钮（复制 / 打印卡片 / 下载）窄屏要能换行（简化稿第 3 节） */
.secret-actions{flex-wrap:wrap}

/* ── 一台机的档案页（简化稿第 2 节 / mock ③）── */
.serial-link{color:#3d6e8c;text-decoration:none;border-bottom:1px solid #c9d9e4}
.serial-link:hover,.serial-link:focus-visible{border-bottom-color:#3d6e8c;text-decoration:none}
.unit-facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;margin:0 0 18px}
.unit-facts div{border:1px solid #ebedf0;border-radius:10px;padding:12px 14px;background:#fff}
.unit-facts span{display:block;font-size:11px;color:#6b747f}
.unit-facts b{display:block;font-size:15px;margin-top:3px;font-weight:600}
.unit-panel{padding:22px 26px}
.unit-panel h2{margin:0;font-size:15px}
.unit-timeline{border-left:2px solid #c9d9e4;margin:18px 0 0 10px;padding-left:18px;font-size:13px}
.unit-timeline>div{position:relative;margin-bottom:14px}
.unit-timeline>div:last-child{margin-bottom:0}
.unit-timeline>div::before{content:"";position:absolute;left:-24px;top:7px;width:9px;height:9px;border-radius:50%;background:#3d6e8c}
.unit-timeline>div.now::before{background:#8a6d1f}
.unit-timeline small{display:block;color:#6b747f;font-size:12px;margin-top:2px}

/* ── 订单行就地快照：发货 → 激活 → 售后（Tim 2026-09-15）── */
.row-toggle{background:none;padding:0 6px 0 0;color:#6b747f;font-size:12px;line-height:1;border-radius:0}
.row-toggle:hover{color:#14181d}
tr.order-snap>td{background:#fafafa;padding:0}
.order-snap-box{display:flex;flex-wrap:wrap;gap:8px 26px;padding:12px 14px}
.order-snap-step{font-size:12.5px;display:flex;gap:8px;align-items:baseline}
.order-snap-step span{color:#6b747f;font-size:11px;white-space:nowrap}
.order-snap-step b{font-weight:500;color:#14181d}
.order-snap-step i{font-style:normal;color:#98a0aa}

/* ── 订单表瘦身到 7 列（Tim 2026-09-15：1440 宽下「操作」列被挤出屏）── */
.order-table .table-scroll{overflow-x:auto}
.order-table th:last-child,.order-table td:last-child:not([colspan]){position:sticky;right:0;background:#fff;box-shadow:-6px 0 8px -6px rgba(0,0,0,.08)}
.order-table th:last-child{background:#f4f6f1;z-index:2}
.order-table td:last-child:not([colspan]){z-index:1}
.order-table .buyer-name{display:inline-block;max-width:140px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}
.fulfil-due{white-space:nowrap}
.order-table .cell-sub.due-soon{color:#b23a2b;font-weight:600}
.fulfil-due.pre{color:#8a6d1f}

/* ── 工单页顶上「还欠几台」（设计稿 presale-alloc 第 1 节）── */
.demand-panel{margin:0 0 18px}
.demand-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}
.demand-grid>div{border:1px solid var(--line);border-radius:10px;padding:11px 13px;background:#fff}
.demand-grid>div span{display:block;font-size:11px;color:var(--muted)}
.demand-grid>div b{display:block;font-size:20px;font-weight:600;margin-top:2px}
.demand-grid.is-flat>div{background:#f5f6f7;color:var(--muted)}
.demand-grid.is-flat>div b{color:var(--muted)}
.demand-grid>div.demand-gap b{color:#b23a2b}
.demand-gap-cell{color:#b23a2b;font-weight:600}
.demand-grid>div.demand-covered{border-color:#e0b25a;background:#fff8ea}.demand-grid>div.demand-covered b{color:#9a6a12}
.demand-covered-cell{color:#9a6a12;font-weight:600}.demand-auto{margin-top:8px}.demand-auto .link-inline{margin-left:6px}
.demand-panel .field-help{margin-top:8px}
@media(max-width:720px){.demand-grid{grid-template-columns:repeat(2,1fr)}}
.factory-layout{display:grid;gap:20px;max-width:1100px}.factory-card{padding:24px;border:1px solid #dce4df;border-radius:16px;background:#fff}.factory-card label{display:block;margin:16px 0 6px}.factory-card button{margin:12px 8px 0 0}.factory-steps{display:flex;flex-wrap:wrap;gap:28px;padding-left:24px;color:#486057}.factory-checks{list-style:none;padding:0}.factory-checks li{padding:14px 0;border-bottom:1px solid #e6ece8;display:flex;gap:16px;align-items:center;flex-wrap:wrap}.factory-checks li>span{flex:1;min-width:180px}.factory-checks strong{font-size:14px}.factory-card input,.factory-card select{max-width:100%}

.factory-card>summary{cursor:pointer;list-style:disclosure-closed}.factory-card[open]>summary{list-style:disclosure-open}.factory-card>summary h2{display:inline;font-size:20px;margin:0}.factory-card>summary small{font-size:13px;font-weight:400;color:#68756e;margin-left:12px}.factory-card:not([open]){padding:20px 24px}.factory-card[open]>summary{margin-bottom:18px}.factory-checks{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 28px}.factory-checks li{align-content:start}.factory-checks li>span{min-width:130px}.factory-checks li>div{width:100%}.factory-test-actions{position:sticky;bottom:0;background:#fff;border-top:1px solid #e6ece8;padding:8px 0 14px;z-index:1}@media(max-width:700px){.factory-checks{grid-template-columns:1fr}.factory-card>summary small{display:block;margin:8px 0 0}}
/* 实机验收 09-23：灰按钮写原因、刷写要人动手时的大字提示、「下一步」行、第 3 步三连 */
.factory-why{display:inline-block;margin:12px 16px 0 0;font-size:12px;color:#8a5a14;vertical-align:middle}.factory-done{display:inline-block;margin:12px 16px 0 0;font-size:13px;color:var(--green);font-weight:600;vertical-align:middle}.factory-callout{position:sticky;top:8px;z-index:5;display:grid;gap:6px;padding:18px 22px;border:2px solid #d9912b;border-radius:14px;background:#fff4df;color:#5c3a07;box-shadow:0 6px 18px rgba(92,58,7,.12)}.factory-callout[hidden]{display:none}.factory-callout strong{font-size:24px;line-height:1.3}.factory-callout span{font-size:14px;line-height:1.6}.factory-callout em{font-style:normal;font-size:13px;font-weight:600;color:#8a5a14}.factory-callout button{justify-self:start;margin:6px 0 0;font-size:13px}.factory-callout.is-inline{position:static;box-shadow:none;margin:0 0 12px;padding:14px 18px}.factory-callout.is-inline strong{font-size:18px}.factory-next{margin:0;padding:14px 18px;border-radius:12px;background:#eaf3ee;color:#1d4a3a;font-size:14px;line-height:1.7}.factory-next a{font-weight:600;color:var(--green);white-space:nowrap}.factory-sequence{margin:8px 0 0;padding-left:22px}.factory-sequence li{padding:2px 0 8px}.factory-sequence li.is-done button{opacity:.75}.factory-status-line{margin:14px 0 0;font-size:14px;font-weight:600;color:#1d4a3a}.factory-resume{margin:12px 0 0;padding:12px 14px;border-radius:10px;background:#fff4df;color:#5c3a07;font-size:13px;line-height:1.6}.factory-layout.is-busy button[data-factory]{cursor:progress;opacity:.55}
/* 检修 1007：「放弃这条记录」靠右放在「下一步」下面；「下一步」行里的按钮（插错板「新建验收记录」）不另起一行 */
.factory-run-tools{margin:-10px 0 0;text-align:right}.factory-run-tools button{margin:0}.factory-run-tools .factory-why{margin:0 0 0 12px}.factory-next button{margin:0 4px;padding:4px 12px}

/* 账本流水对话框（Tim 09-17 线上反馈 1）：真账本里摘要是淘宝长标题，表被撑出对话框、左边几列看不见。
   所以固定列宽 + 摘要最多两行省略（全文在 title 里），金额和日期不换行，核算类型允许换行。 */
.ledger-flow table{table-layout:fixed;width:100%}
.ledger-flow th,.ledger-flow td{overflow-wrap:anywhere}
.ledger-flow th:nth-child(1),.ledger-flow td:nth-child(1){width:74px;white-space:nowrap}
.ledger-flow th:nth-child(3),.ledger-flow td:nth-child(3){width:68px}
.ledger-flow th:nth-child(4),.ledger-flow td:nth-child(4){width:100px;white-space:nowrap}
.ledger-flow th:nth-child(5),.ledger-flow td:nth-child(5){width:148px;white-space:normal}
.ledger-flow th:nth-child(6),.ledger-flow td:nth-child(6){width:132px}
.ledger-flow td .status{white-space:normal;display:inline-block}
.ledger-flow .lf-sum{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-all;line-height:1.5}
.ledger-flow .lf-tags{display:block;margin-top:4px}
.ledger-flow .row-actions{flex-wrap:wrap}
.ledger-flow-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 10px}

/* ── 硬件版本详情（画面 A）+「添加物料到 rXX」对话框（画面 B）· 设计稿 qa/audit/mock/version-materials.html（Tim 2026-09-23）── */
.vm-page{margin-top:22px}
.vm-back{display:inline-flex;align-items:center;gap:6px;background:none;color:#3d6e8c;font-size:14px;padding:0;margin-bottom:16px}
.vm-back:hover{text-decoration:underline;text-underline-offset:3px}
.vm-head{display:flex;justify-content:space-between;align-items:flex-start;gap:32px}
.vm-head-main{min-width:0}
.vm-eyebrow{font-size:12px;font-weight:700;letter-spacing:1.5px;color:#3d6e8c;margin:0 0 10px}
.vm-title{display:flex;align-items:center;flex-wrap:wrap;gap:14px;margin:0 0 10px;font-size:30px;font-weight:650;letter-spacing:-.02em;color:#14181d}
.vm-title:focus{outline:none}
.vm-code{font-family:"Cascadia Mono",Consolas,monospace;font-weight:700;letter-spacing:-.5px}
.vm-pill{display:inline-block;font-size:13px;font-weight:500;padding:4px 11px;border-radius:6px;background:#eef0ec;color:#2f6b46;letter-spacing:0}
.vm-pill.is-off{background:#fbf1ef;color:#b23a2b}
.vm-notes{margin:0;max-width:720px;color:#5b636d;font-size:14px;line-height:1.7;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.vm-actions{display:flex;gap:10px;flex:none;padding-top:28px}
.vm-actions .primary,.vm-actions .secondary,.vm-empty-row .primary,.vm-empty-row .secondary,.vm-btns .primary,.vm-btns .secondary{min-height:44px;font-size:15px;padding:0 19px;white-space:nowrap}
.vm-stats{display:flex;margin:28px 0 26px;border:1px solid #ebedf0;border-radius:12px;background:#fff}
.vm-stat{flex:1;display:flex;align-items:baseline;gap:10px;padding:18px 26px;border-left:1px solid #ebedf0;min-width:0;font-size:15px;color:#4a5159}
.vm-stat:first-child{border-left:0}
.vm-stat b{font-size:30px;font-weight:650;letter-spacing:-.5px;color:#14181d;font-variant-numeric:tabular-nums}
.vm-stat.is-warn b{color:#8a6d1f}
.vm-more{margin-left:auto;align-self:center;background:none;padding:4px 0;font-size:14px;color:#3d6e8c;white-space:nowrap}
.vm-more:hover{text-decoration:underline;text-underline-offset:3px}
.vm-names{margin-left:auto;align-self:center;font-size:13px;color:#6b747f;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:45%}
.vm-card{border:1px solid #ebedf0;border-radius:12px;overflow:hidden;background:#fff}
.vm-card-head{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:18px 22px;border-bottom:1px solid #ebedf0}
.vm-card-head h3{margin:0;font-size:17px;font-weight:650;color:#14181d}
.vm-card-head h3 span{color:#6b747f;font-weight:500}
.vm-hint{font-size:13px;color:#6b747f}
.vm-scroll{overflow-x:auto}
.vm-card-foot{margin:0;padding:14px 22px;border-top:1px solid #ebedf0;font-size:13px;color:#6b747f;background:#fcfcfd}
table.vm-table{width:100%;min-width:900px;border-collapse:collapse;table-layout:fixed;font-size:15px;text-align:left}
.vm-table thead th{position:sticky;top:0;z-index:2;background:#f7f8fa;font-size:13px;font-weight:700;color:#4a5159;padding:12px 16px;border-top:0;border-bottom:1px solid #ebedf0;white-space:nowrap}
.vm-table tbody td{background:#fff;padding:10px 16px;font-size:15px;color:#14181d;border-bottom:1px solid #ebedf0;vertical-align:middle}
.vm-card .vm-table tbody tr{height:68px}
/* 列宽写在这里：页面 CSP 不让用行内 style（col 上的 style="width" 会被吞掉） */
.vm-card .vm-table col:nth-child(1){width:76px}
.vm-card .vm-table col:nth-child(3){width:112px}
.vm-card .vm-table col:nth-child(4){width:104px}
.vm-card .vm-table col:nth-child(5){width:230px}
.vm-card .vm-table col:nth-child(6){width:88px}
/* 硬件版本页：按「物料大类 › 装配位置」分组的组头 + 选配 / 标配 / 未设定 */
.vm-card .vm-table tbody tr.vm-grow{height:46px}
.vm-card .vm-table tbody tr.vm-grow td{background:#f3f5f7;padding:0 16px;border-bottom:1px solid #ebedf0}
.vm-grow-in{display:flex;align-items:center;gap:14px}
.vm-grow-in b{font-size:15px;font-weight:700}
.vm-gn{font-size:13px;color:#6b747f}
.vm-mode{display:inline-block;font-size:13px;font-weight:500;padding:3px 11px;border-radius:999px;border:1px solid #cfd4da;background:#fff;color:#4a5159;white-space:nowrap}
button.vm-mode{cursor:pointer}
button.vm-mode:hover{text-decoration:underline;text-underline-offset:3px}
.vm-mode.is-option{background:#eff5f9;border-color:#cfe0ec;color:#3d6e8c}
.vm-mode.is-standard{background:#eaf2ec;border-color:#b9d6c3;color:#2f6b46}
.vm-mode.is-unset{background:#fdf3e4;border-color:#efd6b2;color:#b86e12}
.vm-banner{border:1px solid #efd6b2;background:#fdf3e4;border-radius:12px;padding:12px 18px;margin:0 0 16px;color:#6b4a14;font-size:14px}
.vm-banner p{margin:0 0 8px;font-weight:600}
.vm-banner-row{display:flex;align-items:center;gap:14px;padding:6px 0;border-top:1px dashed #efd6b2}
.vm-banner-row:first-of-type{border-top:0}
.vm-banner-btns{margin-left:auto;display:flex;gap:8px}
.vm-mode-list,.vm-mode-group{border:0;padding:0;margin:0 0 12px}
.vm-mode-group legend{font-weight:600;padding:0;margin-bottom:4px}
.vm-mode-group legend small{display:block;font-weight:400;color:#6b747f}
.vm-mode-opt{display:flex;align-items:flex-start;gap:8px;margin:6px 0;cursor:pointer}
.vm-mode-opt small{display:block;color:#6b747f}
.vm-pick col:nth-child(1){width:64px}
.vm-pick col:nth-child(2){width:68px}
.vm-pick col:nth-child(4){width:140px}
.vm-pick col:nth-child(5){width:104px}
.vm-pick col:nth-child(6){width:96px}
.vm-pick col:nth-child(7){width:200px}
.vm-pick col:nth-child(8){width:150px}
.vm-card .vm-table tbody tr:nth-child(even) td{background:#fafafa}
.vm-card .vm-table tbody tr:hover td{background:#f3f7fa}
.vm-card .vm-table tbody tr:last-child td{border-bottom:0}
.vm-num{text-align:right!important;font-variant-numeric:tabular-nums}
.vm-thumb{display:block;width:44px;height:44px;border-radius:8px;object-fit:cover;background:#ebedf0;border:1px solid #ebedf0}
.vm-thumb.is-blank{display:grid;place-items:center;color:#98a0aa;font-size:12px}
.vm-pick .vm-thumb{width:40px;height:40px}
.vm-name-line{display:flex;align-items:center;gap:8px;min-width:0}
.vm-name{display:block;min-width:0;background:none;padding:0;text-align:left;font-weight:650;font-size:15px;color:#14181d;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
button.vm-name:hover{color:#3d6e8c;text-decoration:underline;text-underline-offset:3px}
.vm-sub{display:block;margin-top:3px;font-size:13px;color:#6b747f;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.vm-tag{flex:none;display:inline-block;font-size:12px;font-weight:600;padding:1px 7px;border-radius:5px;background:#eef0f3;color:#5b636d}
.vm-tag.is-here{background:#e3e6ea}
.vm-kind{display:inline-block;font-size:13px;padding:3px 10px;border-radius:6px;background:#f1f3f5;color:#4a5159;white-space:nowrap}
.vm-kind.is-make{background:#eff5f9;color:#3d6e8c}
.vm-kind.is-pack{background:#f3eee2;color:#8a6d1f}
.vm-zero,.vm-muted{color:#98a0aa}
.vm-muted{font-size:13px}
.vm-price b{font-size:15px;font-weight:650;font-variant-numeric:tabular-nums}
.vm-price i{font-style:normal;color:#6b747f;font-size:13px;margin-left:2px}
.vm-price small{display:block;margin-top:3px;font-size:13px;color:#6b747f;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.vm-need{display:inline-block;padding:4px 10px;border-radius:6px;background:#f3eee2;color:#8a6d1f;font-size:13px;font-weight:500}
.vm-remove{background:none;color:#b23a2b;font-size:15px;padding:6px 0}
.vm-remove:hover{text-decoration:underline;text-underline-offset:3px}
.vm-empty{padding:72px 24px 80px;text-align:center}
.vm-empty h4{margin:0 0 10px;font-size:20px;font-weight:650;color:#14181d}
.vm-empty p{margin:0 0 26px;color:#5b636d;font-size:15px}
.vm-empty-row{display:flex;gap:12px;justify-content:center;flex-wrap:wrap}
.material-row-end .vm-join{min-height:42px;padding:0 16px;white-space:nowrap}
dialog.vm-dialog{width:min(1240px,92vw);max-width:none;height:86vh;min-height:min(640px,94vh);max-height:none;padding:0;border:0;border-radius:14px;background:#fff;color:#14181d;box-shadow:0 30px 80px #0005;overflow:hidden}
dialog.vm-dialog[open]{display:flex;flex-direction:column}
.vm-d-head{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;padding:24px 28px 18px;border-bottom:1px solid #ebedf0}
.vm-d-head h2{margin:0 0 6px;font-size:23px;font-weight:650;letter-spacing:-.01em}
.vm-d-head p{margin:0;font-size:14px;color:#5b636d}
.vm-x{flex:none;width:40px;height:40px;border-radius:8px;background:none;font-size:24px;line-height:1;color:#6b747f}
.vm-x:hover{background:#f3f5f7}
.vm-d-tools{display:flex;align-items:center;gap:14px;padding:16px 28px;border-bottom:1px solid #ebedf0;background:#fcfcfd}
.vm-search{position:relative;flex:0 1 440px;min-width:220px;margin:0}
.vm-search svg{position:absolute;left:14px;top:14px;pointer-events:none}
.vm-search input{width:100%;height:46px;margin:0;border:1px solid #dde0e5;border-radius:9px;padding:0 14px 0 42px;font-size:15px;background:#fff}
.vm-search input:focus{outline:none;border-color:#3d6e8c;box-shadow:0 0 0 3px #3d6e8c22}
.vm-sel{width:auto;min-width:200px;height:46px;margin:0;border:1px solid #dde0e5;border-radius:9px;padding:0 14px;font-size:15px;background:#fff}
.vm-switch{display:inline-flex;align-items:center;gap:10px;background:none;font-size:15px;color:#14181d;padding:6px 4px;white-space:nowrap}
.vm-track{width:44px;height:24px;border-radius:12px;background:#c9ced4;position:relative;transition:background .15s}
.vm-track::after{content:"";position:absolute;top:3px;left:3px;width:18px;height:18px;border-radius:50%;background:#fff;box-shadow:0 1px 2px #0003;transition:left .15s}
.vm-switch[aria-checked=true] .vm-track{background:#3d6e8c}
.vm-switch[aria-checked=true] .vm-track::after{left:23px}
.vm-picked{margin-left:auto;font-size:15px;color:#4a5159;background:#eff5f9;padding:10px 16px;border-radius:9px;white-space:nowrap}
.vm-picked b,.vm-count b{font-size:17px;font-variant-numeric:tabular-nums}
.vm-picked b{color:#3d6e8c}
.vm-d-body{flex:1;min-height:0;overflow:auto}
.vm-pick tbody tr.vm-it{height:64px;cursor:pointer}
.vm-pick tbody tr.vm-it:hover td{background:#f5f8fa}
.vm-pick tbody tr.vm-it:focus{outline:none}
.vm-pick tbody tr.vm-it:focus td{background:#f3f7fa;box-shadow:inset 0 2px 0 #d98225,inset 0 -2px 0 #d98225}
.vm-pick tbody tr.vm-it.is-on td{background:#eff5f9}
.vm-pick tbody tr.vm-it.is-on td:first-child{box-shadow:inset 4px 0 0 #3d6e8c}
.vm-pick tbody tr.vm-it.is-in,.vm-pick tbody tr.vm-it.is-off{cursor:default}
.vm-pick tbody tr.vm-it.is-in td,.vm-pick tbody tr.vm-it.is-off td{background:#fafafa;color:#98a0aa}
.vm-pick tbody tr.is-in .vm-name,.vm-pick tbody tr.is-off .vm-name,.vm-pick tbody tr.is-in .vm-price b,.vm-pick tbody tr.is-off .vm-price b{color:#98a0aa}
.vm-pick tbody tr.is-in .vm-thumb,.vm-pick tbody tr.is-off .vm-thumb{opacity:.45;filter:grayscale(1)}
.vm-pick tbody tr.is-in .vm-kind,.vm-pick tbody tr.is-off .vm-kind{opacity:.6}
.vm-pick tbody tr.vm-gh td{background:#f3f5f7;padding:0 16px;height:46px}
.vm-gh-in{display:flex;align-items:center;gap:14px}
.vm-gname{font-size:15px;font-weight:700}
.vm-gcount{font-size:13px;color:#6b747f}
.vm-gall{margin-left:auto;background:none;font-size:14px;color:#3d6e8c;padding:6px 4px}
.vm-gall:hover{text-decoration:underline;text-underline-offset:3px}
.vm-gall:disabled{color:#98a0aa;cursor:default;text-decoration:none;opacity:1}
.vm-cb{width:22px;height:22px;padding:0;border-radius:6px;border:2px solid #b7bec6;background:#fff;display:inline-grid;place-items:center;vertical-align:middle;flex:none}
.vm-cb svg{display:none}
.vm-cb.on,.vm-cb.some{background:#3d6e8c;border-color:#3d6e8c}
.vm-cb.on svg,.vm-cb.lock svg{display:block}
.vm-cb.some::after{content:"";width:10px;height:2px;background:#fff;border-radius:1px}
.vm-cb.lock{background:#c9ced4;border-color:#c9ced4}
.vm-cb.dim{background:#f1f3f5;border-color:#dde0e5}
button.vm-cb:disabled{cursor:default;opacity:1}
.vm-vtags{display:flex;flex-wrap:wrap;gap:6px}
.vm-vt{font-size:12px;line-height:1.5;padding:2px 8px;border-radius:5px;background:#eef0ec;color:#4a5159;font-family:"Cascadia Mono",Consolas,monospace}
.vm-vt.is-cur{background:#14181d;color:#fff}
.vm-nohit{padding:60px 20px;text-align:center;color:#5b636d;font-size:15px}
.vm-nohit b{display:block;font-size:17px;color:#14181d;margin-bottom:8px}
.vm-d-foot{display:flex;align-items:center;gap:16px;padding:16px 28px;border-top:1px solid #ebedf0;background:#fff}
.vm-count{font-size:15px;color:#4a5159;white-space:nowrap}
.vm-keys{font-size:13px;color:#98a0aa;white-space:nowrap}
.vm-keys kbd{font-family:inherit;font-size:12px;padding:1px 6px;border:1px solid #dde0e5;border-bottom-width:2px;border-radius:4px;color:#4a5159;background:#fff}
.vm-error{flex:1;margin:0;color:#a52f2b;font-size:14px;line-height:1.5;min-width:0}
.vm-btns{margin-left:auto;display:flex;gap:10px}
.vm-btns .primary:disabled{background:#c9ced4;color:#fff;cursor:not-allowed;opacity:1}
/* 添加物料对话框的页签：「从物料库选择」/「新建物料」（设计稿 version-new-material-0930） */
.vm-tabs{display:flex;gap:26px;padding:0 28px;border-bottom:1px solid #ebedf0;background:#fff}
.vm-tab{background:none;border-radius:0;padding:13px 2px 11px;border-bottom:3px solid transparent;font-size:15px;font-weight:600;color:#6b747f}
.vm-tab:hover{color:#14181d}
.vm-tab[aria-selected=true]{color:#14181d;border-bottom-color:#3d6e8c}
.vm-pane{display:flex;flex-direction:column;flex:1;min-height:0}
.vm-new-body{flex:1;min-height:0;overflow:auto;padding:24px 28px}
.vm-n-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px 24px;max-width:720px}
.vm-n-wide{grid-column:1/-1}
.vm-n-f{min-width:0}
.vm-n-f label,.vm-n-lab{display:block;font-size:13px;font-weight:600;color:#14181d;margin:12px 0 6px}
.vm-n-f label i{font-style:normal;color:#b23a2b;margin-left:3px}
.vm-n-f input,.vm-n-f select{height:44px;margin:0;font-size:15px;border:1px solid #dde0e5;border-radius:9px;padding:0 12px;background:#fff}
.vm-n-f input:focus,.vm-n-f select:focus{outline:none;border-color:#3d6e8c;box-shadow:0 0 0 3px #3d6e8c22}
.vm-n-msg{display:block;min-height:0;margin-top:4px;font-size:13px;color:#a52f2b}
.vm-seg{display:flex;width:max-content;padding:3px;gap:3px;border-radius:9px;background:#ebedf0}
.vm-seg button{background:transparent;border-radius:7px;padding:0 22px;height:38px;font-size:14px;color:#5b636d}
.vm-seg button[aria-pressed=true]{background:#fff;color:#14181d;font-weight:600;box-shadow:0 1px 2px #0002}
.vm-n-make{display:grid;grid-template-columns:1fr 1fr;gap:6px 24px}
.vm-n-details{margin-top:14px;border-top:1px solid #ebedf0;padding-top:6px}
.vm-n-details>summary{cursor:pointer;padding:10px 0;font-size:14px;font-weight:600;color:#3d6e8c}
.vm-dup{border:1px solid #efd6b2;background:#fdf3e4;border-radius:10px;padding:10px 16px;margin:2px 0 8px;color:#6b4a14;font-size:14px}
.vm-dup-t{margin:0 0 4px;font-weight:600}
.vm-dup-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:6px 0;border-top:1px dashed #efd6b2}
.vm-dup-n{min-width:0;color:#14181d;font-weight:600}
.vm-dup-n small{font-weight:400;color:#6b747f}
.vm-dup-add{min-height:34px;padding:0 14px;font-size:13px;flex:none}
.vm-dup-f{margin:6px 0 0;font-size:13px;color:#8a6d1f}
.vm-n-note{max-width:720px;margin:22px 0 0;padding:11px 16px;border:1px solid #b9d6c3;background:#eaf2ec;border-radius:10px;color:#2f6b46;font-size:14px;line-height:1.6}
@media (max-width:1100px){.vm-head{flex-direction:column;gap:12px}.vm-actions{padding-top:0}.vm-keys{display:none}.vm-d-tools{flex-wrap:wrap}}
.vm-copy-list{border:0;padding:0;margin:0 0 6px}
.vm-copy-list legend{font-size:14px;font-weight:600;margin-bottom:10px;padding:0}
.vm-copy-opt{display:flex!important;align-items:center;gap:12px;padding:12px 14px;margin:0 0 8px;border:1px solid #dde0e5;border-radius:9px;font-size:15px;cursor:pointer;background:#fff}
.vm-copy-opt:hover{background:#f5f8fa}
.vm-copy-opt:has(input:checked){border-color:#3d6e8c;background:#eff5f9}
.vm-copy-opt input{width:18px;height:18px;margin:0;flex:none}
.vm-copy-opt .vm-copy-name{flex:1;min-width:0}
.vm-copy-opt em{font-style:normal;font-size:13px;color:#6b747f;white-space:nowrap}
/* ── 「项目投入」页签（样机 qa/audit/rd-tab-mock.html，Tim 09-22 任务 19）──
   三个数一张卡（等宽三栏、大数 28px）· 月份 chips · 全期流水表（14px、行高 44px、
   金额右对齐 tabular-nums）。不计入研发的那一行金额划线标灰。 */
.rd-kpi{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.rd-kpi .k{border-top:2px solid #ebedf0;padding-top:10px}
.rd-kpi .l{display:block;font-size:12px;color:#8a919b}
.rd-kpi .v{display:block;margin-top:4px;font-size:28px;font-weight:600;line-height:1.2;font-variant-numeric:tabular-nums}
.rd-kpi .s{display:block;margin-top:4px;font-size:12px;color:#8a919b;line-height:1.6}
.rd-chips{display:flex;gap:6px;flex-wrap:wrap;margin:0 0 12px}
.rd-chips button{padding:6px 12px;font-size:13px;border-radius:8px;border:1px solid #d5d9df;background:#fff;color:#4a5159;cursor:pointer;font-variant-numeric:tabular-nums}
.rd-chips button[aria-pressed="true"]{background:#14181d;color:#fff;border-color:#14181d}
.rd-flow table{table-layout:fixed;width:100%;min-width:720px}
.rd-flow th,.rd-flow td{height:44px;padding:8px 10px;font-size:14px;overflow-wrap:anywhere}
.rd-flow th{font-size:12px;color:#8a919b;font-weight:600}
.rd-flow th:nth-child(1),.rd-flow td:nth-child(1){width:92px;white-space:nowrap}
.rd-flow th:nth-child(3),.rd-flow td:nth-child(3){width:108px}
.rd-flow th:nth-child(4),.rd-flow td:nth-child(4){width:132px}
.rd-flow th:nth-child(5),.rd-flow td:nth-child(5){width:82px}
.rd-flow th:nth-child(6),.rd-flow td:nth-child(6){width:118px}
.rd-flow tr.rd-m td{background:#fafafa;font-weight:600;color:#5b636d;font-size:12px;height:32px}
.rd-flow tr.rd-tot td{font-weight:600;border-top:1px solid #ebedf0}
.rd-flow td.rd-x{color:#8a919b;text-decoration:line-through}
.rd-flow select{font-size:12px;padding:3px 6px;border:1px solid #d5d9df;border-radius:6px;background:#fff;color:#5b636d;width:100%;min-height:0}
.rd-pill{display:inline-block;padding:2px 8px;border-radius:6px;font-size:12px;background:#eef2f5;color:#5b636d;white-space:nowrap}
.rd-pill.rd{background:#eaf2ec;color:#2f6b46}
.rd-pill.inv{background:#f3eee2;color:#8a6d1f}
.rd-fixed{display:block;margin-top:3px;font-size:11px;color:#8a919b}
@media(max-width:900px){.rd-kpi{grid-template-columns:1fr}}
/* 项目投入 v2（Tim 09-23，设计稿 qa/audit/invest-pool-mock.html）：黄条 · 投入池 · 时间线 · 上市前固定开销按月 · 研发截止灰行 */
.rd-alert{background:#fdf6e3;border:1px solid #efd9a0;border-radius:12px;padding:14px 18px;margin:0 0 14px;max-width:1060px}
.rd-alert .t{font-size:14px;line-height:1.7}
.rd-alert b{color:#8a6d1f}
.rd-alert.done{background:#eaf2ec;border-color:#cfe3d5}
.rd-alert.done b{color:#2f6b46}
.rd-alert-row{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-top:6px}
.rd-alert-row>span:first-child{flex:1;min-width:280px}
.rd-alert-ops{display:flex;gap:8px;flex-wrap:wrap}
.rd-alert-ops button{padding:7px 14px;font-size:13px}
.rd-kpi .k.pool .v{color:#3d6e8c}
.rd-tl{margin:14px 0 0;font-size:13px;color:#5b636d}
.rd-tl b{color:#14181d;font-variant-numeric:tabular-nums}
.rd-card h3{margin:0 0 10px;font-size:15px}
.rd-fx{width:100%;border-collapse:collapse;min-width:640px}
.rd-fx th{font-size:12px;color:#8a919b;font-weight:600;text-align:right;padding:8px 10px;border-bottom:1px solid #ebedf0}
.rd-fx td{padding:10px;border-bottom:1px solid #f3f4f6;text-align:right;font-size:14px;font-variant-numeric:tabular-nums}
.rd-fx th:first-child,.rd-fx td:first-child{text-align:left}
.rd-fx tr.rd-fx-row{cursor:pointer}
.rd-fx tr.rd-fx-row:hover td{background:#fafbfc}
.rd-fx tr.rd-fx-row td:first-child::before{content:'▸ ';color:#8a919b}
.rd-fx tr.rd-fx-row.open td:first-child::before{content:'▾ '}
.rd-fx tr.rd-fx-sub td{background:#fafafa;font-size:13px;color:#5b636d;border-bottom:0;padding:6px 10px 6px 34px;text-align:left}
.rd-fx tr.rd-fx-tot td{font-weight:600;border-top:1px solid #ebedf0}
.rd-fx tr.rd-fx-after td{color:#8a919b;font-size:13px}
.rd-flow tr.rd-next td{color:#8a919b}
.red-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:#b23a2b;vertical-align:middle;margin-left:4px}
/* 账本流水对话框 09-22 多了一列「账本类型」（6 → 7 列）：对话框只有 780px 宽，多一列就得
   把每一列都收一点，不然摘要那一列被挤没、黄标一个字一行。 */
.ledger-flow th:nth-child(1),.ledger-flow td:nth-child(1){width:72px}
.ledger-flow th:nth-child(3),.ledger-flow td:nth-child(3){width:68px}
.ledger-flow th:nth-child(4),.ledger-flow td:nth-child(4){width:86px}
.ledger-flow th:nth-child(5),.ledger-flow td:nth-child(5){width:72px;white-space:normal}
.ledger-flow th:nth-child(6),.ledger-flow td:nth-child(6){width:112px;white-space:normal}
.ledger-flow th:nth-child(7),.ledger-flow td:nth-child(7){width:110px}
.ledger-flow .lf-tags{margin-left:0}
.ledger-flow .lf-tags .status{display:inline-block;white-space:normal}
/* 成品档案页「归属」卡 + 灰按钮旁边写为什么（报告 6-1 / 6-4，夜间施工 A） */
.owner-card{margin:0 0 18px}
.owner-rows{display:grid;grid-template-columns:72px 1fr;gap:10px 16px;margin:16px 0 0;font-size:13px}
.owner-rows dt{color:#6b747f}
.owner-rows dd{margin:0;overflow-wrap:anywhere}
.owner-actions{display:flex;flex-wrap:wrap;gap:10px 18px;align-items:center;margin-top:18px}
.gated{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
.gated button:disabled{cursor:not-allowed}
.gated .why{font-size:12px;color:#8a5a14}
.link-button{background:none;padding:0;color:#3d6e8c;font-size:13px;text-decoration:underline;text-underline-offset:3px}
.own-link{color:#3d6e8c;font-size:14px;text-decoration:none;white-space:nowrap}
.own-link:hover{text-decoration:underline;text-underline-offset:3px}
/* 夜间施工 B：提示条里的「下一步 →」、工单行主按钮（链接版）、缺料核对全表、物料编辑里只读的版本名 */
#page-message .next-step{margin-left:10px;font-weight:600;font-size:14px;color:#155c49}
.row-actions a.rowbtn{background:#14181d;color:#fff;border-radius:7px;padding:6px 12px;font-size:12px;font-weight:500;white-space:nowrap;text-decoration:none}
.row-actions a.rowbtn:hover{background:#2a3038;color:#fff}
.short-ok{color:#155c49;font-weight:600}
.short-bad{color:#b23a2b;font-weight:600}
tr.short-row td{background:#fbf1ef}
.short-verdict{font-size:14px;margin:0 0 10px}
.dialog-next{display:flex;justify-content:flex-end;gap:8px;margin-top:12px}
.ver-chip-link{background:#eff5f9;color:#3d6e8c;border:1px solid #cfe0ec;border-radius:999px;padding:4px 10px;font-size:13px}
.ver-chip-link:hover{text-decoration:underline;text-underline-offset:3px}
/* 夜测第 1 轮修复 */
.supply-records .cell-sub.bom-meta{white-space:nowrap;word-break:keep-all}
.tab-next{display:flex;flex-wrap:wrap;align-items:center;gap:6px 16px;margin:0 0 12px;font-size:13px;color:var(--muted)}
.invite-howto{background:#f4f6f8;border:1px solid #dfe4ea;border-radius:8px;padding:10px 12px;font-size:13px;line-height:1.7;margin:4px 0 10px;word-break:break-all}
/* BOM 选配面板：同一装配位置有多种物料时，逐位置「选用」一种 */
.bom-option-panel{border:1px solid #efd6b2;background:#fdf3e4;border-radius:10px;padding:8px 12px;margin:0 0 12px}
.bom-option-panel[hidden]{display:none}
.bom-option-group+.bom-option-group{margin-top:8px;padding-top:8px;border-top:1px dashed #efd6b2}
.bom-option-head{margin:0 0 4px;font-size:13px;color:#6b4a14}
.bom-option-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:3px 0 3px 14px;font-size:13px}
fieldset.supply-line.is-option{border-color:#e2c66e;background:#fbf6e6}
.line-option{margin:6px 0 0;font-size:12px;color:#8a5a14}
.unit-tag{display:inline-block;margin-right:4px;padding:0 6px;border-radius:4px;background:#f3eee2;color:#8a5a14;font-size:11px;font-style:normal;font-weight:600}
.fill-works{border:1px solid #e3e7ec;border-radius:8px;padding:8px 12px;margin:0 0 12px}
.fill-works legend{font-size:12px;color:var(--muted);padding:0 4px}
.fill-works .checkbox-label{display:flex;margin:4px 0;font-size:13px}
input.fill-qty{width:96px}
.fill-works .checkbox-label.is-disabled{color:var(--muted)}.fill-units{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 10px}.fill-units input{width:88px}.fill-units small{flex-basis:100%}tr.fill-enough td{color:var(--muted)}
.gated .why .link-button{font-size:12px;margin-left:4px}
.factory-closed{border:1px solid #ddd2b8;background:#f3eee2;border-radius:9px;padding:12px 14px;color:#5c4713;font-size:13px}
.picker-create{border-top:1px dashed #e3e7ec;margin-top:8px;padding-top:8px}.picker-create-form{display:grid;gap:6px;margin-top:6px}.picker-create-form label{font-size:12px;color:var(--muted)}.picker-create-form .secondary{justify-self:start}
/* 详情页（Tim 09-24）：左上「← 返回」；机器身份和归属并排两张卡，窄屏上下叠 */
.back-link{display:inline-block;margin:0 0 10px;font-size:13px}
.unit-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:16px;margin:0 0 18px}
.unit-cards .owner-card{margin:0}
.unit-cards .owner-rows{margin-top:14px}
/* 工单 / BOM：从上一层带出来的配置、版本，只显示不能改（Tim 09-28）——要一眼看得到 */
.bom-anchor,.work-derived{margin:4px 0 12px;padding:10px 12px;border-left:3px solid var(--ink);background:#f0f3ee;color:var(--ink);font-size:14px}
/* Agent 接入页「连上你自己的 AI」：三步，命令一行一个复制按钮 */
.note-panel.connect-panel{display:block;min-height:0;background:#fff;padding:22px 24px;margin-bottom:16px}
.note-panel.stack-panel{display:block;min-height:0}.note-panel.stack-panel::before,.note-panel.stack-panel::after{display:none}.note-panel.stack-panel p{padding-right:0}.note-panel.stack-panel .secondary{margin-top:10px}
.note-panel.connect-panel::before,.note-panel.connect-panel::after{display:none}.note-panel.connect-panel p{padding-right:0}
.connect-panel h2{font-size:17px;color:#14181d;margin:0 0 4px}.connect-panel>p{margin:0 0 16px}
.connect-switch{margin-bottom:18px}
.connect-steps{margin:0;padding:0;list-style:none;counter-reset:step}
.connect-steps li{counter-increment:step;position:relative;padding:0 0 16px 36px}.connect-steps li:last-child{padding-bottom:0}
.connect-steps li::before{content:counter(step);position:absolute;left:0;top:1px;width:22px;height:22px;border-radius:50%;background:#14181d;color:#fff;font-size:12px;font-weight:600;display:grid;place-items:center}
.connect-steps b{color:#14181d;font-weight:600}
.connect-cmd{display:flex;gap:10px;align-items:center;margin-top:8px}
.connect-cmd code{flex:1;min-width:0;margin:0;padding:10px 12px;font:13px/1.5 Consolas,"SFMono-Regular",monospace;letter-spacing:0;background:#f5f6f7;border:1px solid #ebedf0;border-radius:8px;color:#14181d;white-space:normal;word-break:break-all;user-select:all}
.connect-cmd .primary{width:auto;margin:0;padding:10px 18px;flex:none}
@media (max-width:640px){.connect-cmd{flex-direction:column;align-items:stretch}}
/* 开发测试机（Tim 09-28）：成品列表 / 详情页编号旁的小标签 */
.dev-test-tag{font-size:12px;padding:2px 8px;margin-left:6px;background:#fff4e5;color:#8a4b00;vertical-align:middle}
/* 硬件版本独立菜单（Tim 09-29）：删除弹窗里「不影响删除」的说明、版本列表「待设定位置」、SKU 对话框就地新建版本 */
.usage-note{border:1px solid #ddd2b8;background:#f3eee2;border-radius:9px;padding:11px 15px;margin-bottom:14px;color:#5c4713;font-size:13px;line-height:1.8}
.usage-note p{margin:0 0 4px}.usage-note p:last-child{margin-bottom:0}
.vm-pill-warn{display:inline-block;font-size:12px;padding:2px 9px;border-radius:999px;background:#fdf3e4;border:1px solid #efd6b2;color:#b86e12;white-space:nowrap}
.sku-newver{margin:6px 0 4px}
.sku-newver .link-button{font-size:13px}
.sku-newver-box{margin-top:8px;padding:2px 14px 14px;border:1px solid #dfe5de;border-radius:10px;background:#f7f8f6}
.sku-newver-box .secondary{margin-top:14px}
.field-help.is-error{color:#a52f2b}
/* 成本按配置（任务 22，设计稿 sku-cost-mock-v2.html）：配置切换条 · 缺价指引 / 待选黄条 · 明细卡 · 配置对比 */
.cost-switch{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:0 0 16px}
.cost-switch .lab{font-size:12px;color:#8a919b;margin-right:4px}
.cost-switch button{padding:8px 14px;border-radius:10px;border:1px solid #d5d9df;background:#fff;color:#14181d;text-align:left;font-size:14px;line-height:1.3;cursor:pointer}
.cost-switch button small{display:block;font-size:11px;color:#8a919b}
.cost-switch button[aria-pressed="true"]{border-color:#14181d;box-shadow:inset 0 0 0 1px #14181d}
.cost-switch .dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:#e0b64a;margin-left:6px;vertical-align:middle}
.cost-guide{background:#fdf6e3;border:1px solid #efd9a0;border-radius:12px;padding:14px 18px;margin:0 0 14px}
.cost-guide>b{color:#8a6d1f}
.cost-guide>p{margin:6px 0 0;font-size:13px;color:#5b636d}
.cost-guide table{margin-top:8px}
.cost-guide td{padding:9px 10px;border-bottom:1px solid #f1e4c2;background:transparent;font-size:13px}
.cost-guide td.sub{color:#5b636d}
.cost-guide td.go-cell{text-align:right;white-space:nowrap}
.cost-guide .go{padding:5px 10px;border-radius:7px;border:1px solid #d5d9df;background:#fff;color:#14181d;font-size:12px;margin-left:6px;cursor:pointer}
.cost-guide .go.p{background:#14181d;color:#fff;border-color:#14181d}
.cost-panel{border:1px solid #ebedf0;border-radius:12px;background:#fff;padding:18px 22px;margin:0 0 14px}
.cost-head{display:flex;gap:28px;align-items:flex-end;flex-wrap:wrap;margin-bottom:14px}
.cost-head .l{font-size:12px;color:#8a919b}
.cost-head .v{font-size:28px;font-weight:600;font-variant-numeric:tabular-nums}
.cost-head select{min-width:240px;width:auto;padding:6px 8px;font-size:13px;border:1px solid #d5d9df;border-radius:8px}
.cost-bom-name{font-size:15px}
.cost-rows th,.cost-rows td{font-size:13px}
.cost-rows th.num{text-align:right}
.cost-rows td.from{color:#5b636d}
.cost-rows tr.tot td{font-weight:600;border-top:1px solid #ebedf0}
tr.is-current td{background:#fff8e6}
tr.bom-hit td{background:#fff3cd}
.pricing-title{margin:0 0 12px;font-size:15px}
.pricing-cost{font-size:28px;font-weight:600;line-height:1.2;font-variant-numeric:tabular-nums}
.pricing-compare th,.pricing-compare td{font-size:13px;font-variant-numeric:tabular-nums}
.pricing-compare th.num,.pricing-compare td.num{text-align:right}
.pricing-compare td.bad{color:#b23a2b}
.pricing-compare tr.me td{background:#fff8e6}
/* 检修 1007：操作记录「再显示 100 条」 */
.load-more{margin:12px 0;text-align:center}
/* 检修 1007 采购：缺料核对「等到货」（已下单在途，现货还不够） */
.short-wait{color:#9a6a12;font-weight:600}
tr.wait-row td{background:#fbf6ea}
/* 检修 1007 采购：登记来料时「参考单价 ¥旧 → ¥新（这次采购价）」 */
.receive-ref-price{border:1px solid #cfe0ec;background:#eff5f9;border-radius:9px;padding:10px 14px;margin:10px 0 4px;display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
.receive-ref-price p{margin:0;font-size:13px;line-height:1.6;color:#2b3b47}
/* 检修 1007 采购：缺料核对里自制件的标签 */
.kind-tag{display:inline-block;border:1px solid #d8c9a6;background:#f6efdf;color:#6b5420;border-radius:999px;padding:0 8px;font-size:11px;line-height:18px}

.feedback-description{white-space:pre-wrap;overflow-wrap:anywhere;font:inherit;}
/* 激活码库（Tim 10-09）：顶上两张卡（实体卡 / 线上码）、实体卡页签选中的批次、生成线上码对话框里的用途说明不截断 */
.lib-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;margin:0 0 22px}
.lib-card{border:1px solid #ebedf0;border-radius:10px;padding:16px 20px;background:#fff;min-width:0}
.lib-card span{display:block;font-size:13px;color:#6b747f}
.lib-card b{display:block;margin:8px 0 6px;font-size:24px;font-weight:600;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.lib-card small{display:block;font-size:12px;color:#5b636d;line-height:1.6}
@media(max-width:720px){.lib-row{grid-template-columns:1fr}}
tr.is-picked td{background:#f3f7fa}
.card-batches{margin-bottom:20px}
/* 激活码库第二层：状态筛选，比来源页签小一号、靠近下面的表 */
.status-tabs.status-filter{gap:22px;margin:-8px 0 16px;border-bottom:0}
.status-tabs.status-filter button{font-size:13px;padding-bottom:8px}
/* 激活码库的小字（原因、买家、批次）折行写全，不截断，也不把表撑出横向滚动 */
.supply-records .code-lib .cell-sub{white-space:normal;overflow:visible;text-overflow:clip;max-width:240px;word-break:normal;overflow-wrap:anywhere}
.batch-pick{font-size:14px;font-weight:600;text-decoration:none;text-align:left}
.batch-pick[aria-pressed=true]{color:#14181d}
.field-list{margin:0 0 8px;padding-left:18px;line-height:1.8}
dialog .unit em{white-space:normal}
/* 售后流程（售后稿 10-09）：待处理报修页签小红点、保修窗口标、官网来源标、扫码对单结果、寄回说明、保外收费三格 */
.status-tabs button .tab-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:#d97757;margin-left:6px;vertical-align:2px}
.window-tag{display:inline-block;margin-left:4px;font-size:12px;padding:1px 8px;border-radius:5px;background:#eff5f9;color:#3d6e8c;white-space:nowrap}
.window-tag.out{background:#fbf1ef;color:#b23a2b}
.src-tag{display:inline-block;font-size:11px;padding:1px 7px;border-radius:5px;background:#fbeee8;color:#a8492a;margin-left:4px;vertical-align:1px;font-weight:400}
.scan-hit{margin:8px 0 4px;padding:9px 12px;border-radius:7px;background:#eff5f9;color:#3d6e8c;font-size:14px}
.scan-hit.miss{background:#fbf1ef;color:#b23a2b}
.copy-box{white-space:pre-wrap;background:#fafafa;border:1px solid #ebedf0;border-radius:8px;padding:12px 14px;font-size:14px;line-height:1.8;font-family:inherit;margin:8px 0}
.fee-row{display:flex;gap:10px}.fee-row input{flex:1;min-width:0}
/* 扫码收码条 / 标签（扫码 SN 设计稿，10-10）：发货页、实机验收页顶上那一条；刚扫到的那台描边 + 小标签 */
.scan-bar{margin:0 0 14px;padding:9px 13px;border-radius:8px;background:#eff5f9;color:#3d6e8c;font-size:13.5px;display:flex;flex-wrap:wrap;gap:4px 14px;align-items:center;overflow-wrap:anywhere}
.scan-bar.is-idle{background:#f6f7f9;color:#5b636d}
.scan-bar.is-off{background:#f3eee2;color:#8a6d1f}
.scan-last.ok{color:#2c6339}.scan-last.bad{color:#b42318}
/* 收码条上的扫码页二维码（scan-sn-task-3 补充）：约 120 px，手机相机扫它打开扫码页 */
.scan-qr{display:inline-flex;align-items:center;gap:10px}
.scan-qr-code{display:block;flex:none;width:120px;height:120px;border-radius:6px;overflow:hidden;background:#fff}
.scan-qr-code svg{display:block;width:100%;height:100%}
.scan-check{display:inline-block;margin:6px 0 0;font-size:13px}.scan-check.ok{color:#2c6339}.scan-check.bad{color:#b42318}
.scan-tag{font-size:12px;padding:2px 8px;border-radius:99px;background:#e3efdf;color:#2c6339;flex:none;white-space:nowrap}
.unit.is-scanned,.ship-paired.is-scanned{border:2px solid #3d6e8c;background:#f7fbfd}
.label-line{display:flex;flex-wrap:wrap;gap:6px 12px;align-items:center}
/* 成品 › SN 标签（scan-sn-task-2，10-10）：工具条、粘贴选中、留号批次（收起一行对账 / 展开每号一行）、还没打过标签的成品、底部操作条 */
.sn-tools{display:flex;align-items:center;gap:10px 16px;flex-wrap:wrap;margin:0 0 18px}
.sn-next{margin-left:auto;color:#6b747f;font-size:13px;font-variant-numeric:tabular-nums}
.sn-pick{margin:0 0 24px}
.sn-pick>label{margin:0 0 6px}
.sn-pick-row{display:flex;gap:10px;align-items:flex-start;flex-wrap:wrap}
.sn-pick-row textarea{flex:1;min-width:240px;max-width:640px;min-height:46px;font-family:ui-monospace,Consolas,monospace;font-size:13px}
.sn-pick-row .secondary{min-height:46px}
.sn-pick-note{margin:8px 0 0;font-size:13px;color:#2c6339;overflow-wrap:anywhere}
.sn-pick-note.is-warn{color:#8a6d1f}
.sn-pick-note:empty{display:none}
.sn-section{margin:0 0 26px}
.sn-section>h2{font-size:15px;margin:0 0 10px}
.sn-section>h2 small{font-size:13px;font-weight:400;color:#6b747f;margin-left:8px}
.sn-batch{border:1px solid #ebedf0;border-radius:10px;background:#fff;margin:0 0 8px;overflow:hidden}
.sn-batch-head{display:flex;width:100%;justify-content:space-between;align-items:center;gap:6px 16px;flex-wrap:wrap;background:none;border:0;border-radius:0;padding:13px 18px;text-align:left;font-size:14px;color:#14181d;min-height:0}
.sn-batch-head span::before{content:'▸';display:inline-block;width:16px;color:#98a0aa}
.sn-batch.is-open .sn-batch-head span::before{content:'▾'}
.sn-batch-head b{font-weight:500;font-variant-numeric:tabular-nums;white-space:nowrap}
.sn-batch.is-open .sn-batch-head{border-bottom:1px solid #ebedf0}
.sn-table{width:100%;border-collapse:collapse}
.sn-table th,.sn-table td{padding:9px 16px;font-size:13.5px;text-align:left}
.sn-table tbody tr:last-child td{border-bottom:0}
.sn-table .sn-check{width:1%;white-space:nowrap}
.sn-table th.sn-check label{display:flex;align-items:center;gap:7px;margin:0;font-size:13px;font-weight:400;color:#6b747f;letter-spacing:0;cursor:pointer}
.sn-board input[type=checkbox]{width:16px;height:16px;margin:0;flex:none;accent-color:#3d6e8c}
.sn-serial{font-variant-numeric:tabular-nums;white-space:nowrap}
.sn-row.is-voided td{color:#98a0aa}
.sn-row.is-picked td{background:#f3f8fb}
.sn-actionbar{position:sticky;bottom:0;z-index:5;display:flex;align-items:center;gap:10px 14px;flex-wrap:wrap;margin:14px 0 0;padding:12px 18px;background:#14181d;color:#fff;border-radius:10px 10px 0 0;box-shadow:0 -6px 18px rgba(0,0,0,.14)}
.sn-actionbar[hidden]{display:none}
.sn-actionbar .sn-grow{flex:1}
.sn-actionbar .link-button{color:#cfe0ea}
.sn-actionbar .secondary,.sn-actionbar .primary{min-height:36px;padding:7px 16px}
.sn-actionbar .primary{background:#fff;color:#14181d}
.sn-actionbar .sn-danger{color:#b42318}
.factory-scan{display:flex;flex-direction:column;gap:8px;padding:10px 12px;border:2px solid #3d6e8c;border-radius:8px;background:#f7fbfd}
.factory-scan .factory-scan-row{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.factory-scan input{max-width:220px}
/* 售后「问题反馈」诊断（Tim 10-10）：字段两列；日志逐条一行，超长折叠 */
.feedback-diag{display:grid;grid-template-columns:130px 1fr;gap:6px 14px;font-size:13px;margin:12px 0}.feedback-diag dt{color:var(--muted)}.feedback-diag dd{margin:0;overflow-wrap:anywhere}
.feedback-json{white-space:pre-wrap;overflow-wrap:anywhere;font-size:12px;margin:0}
.feedback-log{border-top:1px solid var(--line);margin-top:12px;padding-top:10px;font-size:12px}.feedback-log-head{margin:0 0 8px;font-size:13px}.feedback-log-none{color:var(--muted);margin:6px 0}
.feedback-log-cols,.feedback-log-lines li{display:grid;grid-template-columns:190px 230px 1fr;gap:12px}.feedback-log-cols{color:var(--muted);font-size:11px;padding:0 0 4px 28px}
.feedback-log-lines,.feedback-frames{margin:0;padding-left:28px}.feedback-log-lines li{padding:3px 0;border-bottom:1px solid #f0f2ee}.feedback-log-lines time,.feedback-crash time{font-variant-numeric:tabular-nums}
.feedback-log-src{overflow-wrap:anywhere}.feedback-log-detail{overflow-wrap:anywhere;font-family:ui-monospace,Consolas,monospace}
.feedback-more>summary{cursor:pointer;color:var(--green);margin:6px 0;font-size:12px}
.feedback-crash{margin-top:10px}.feedback-crash p{margin:0 0 6px}.feedback-frames li{font-family:ui-monospace,Consolas,monospace;overflow-wrap:anywhere}
/* SN 标签页「核对带回的标签」（scan-sn-task-4）：「扫到」一列，没扫到的待用号标黄，下方汇总与操作 */
.sn-hit{display:inline-flex;align-items:center;justify-content:center;margin:0;padding:0;cursor:pointer}
.sn-batch.is-checking{border-color:#c58a12}
.sn-row.is-missing td{background:#fdf6e3}
.sn-row.is-hit td{background:#eef6ec}
.sn-scanned{white-space:nowrap;color:#2c6339;font-weight:600}
.sn-check-panel{display:flex;flex-wrap:wrap;align-items:center;gap:10px 16px;padding:12px 16px;border-top:1px solid #ebedf0;background:#fbf8ef}
.sn-check-sum{margin:0;flex:1 1 280px;font-size:14px;overflow-wrap:anywhere}
.sn-check-actions{display:flex;gap:10px;flex-wrap:wrap}
.sn-check-actions .sn-danger{color:#b42318}
/* 手机排版（scan-sn-task-4 F，按 390 × 844 检查）：只改成品 › SN 标签、发货与激活码（打开一单）、送样 / 线下出库对话框三处，
   宽度 ≤ 720 px 才生效，电脑排版不变。要求：没有横向滚动，底部操作条和扫码键不遮挡内容，按钮触控区 ≥ 44 px，字号 ≥ 14 px。 */
@media (max-width:720px){
  /* 成品页（各页签都要能点到「SN 标签」）和发货页的标题区：标题和说明占一整行，右边的按钮换到下一行，不再把页面撑宽 */
  #main:has([data-product-tab]) .page-heading,#main:has(.ship-layout) .page-heading{flex-wrap:wrap;gap:12px;margin-bottom:20px}
  #main:has([data-product-tab]) .page-heading>div:first-child,#main:has(.ship-layout) .page-heading>div:first-child{flex:1 1 100%;min-width:0}
  #main:has([data-product-tab]) .page-heading .eyebrow,#main:has(.ship-layout) .page-heading .eyebrow{display:none}
  #main:has([data-product-tab]) .page-tools{width:auto;margin:0;flex-wrap:wrap}
  #main:has([data-product-tab]) .page-heading button,#main:has(.ship-layout) .page-heading button{min-height:44px;padding:0 14px;font-size:14px}
  #main:has([data-product-tab]) .status-tabs{gap:0 18px}
  #main:has([data-product-tab]) .status-tabs button{min-height:44px;min-width:44px;padding:0 0 4px;font-size:14px}
  /* 成品 › SN 标签 */
  .sn-tools{gap:10px}
  .sn-tools .primary,.sn-tools .secondary{min-height:44px;font-size:14px}
  .sn-next{flex:1 1 100%;margin-left:0;font-size:14px}
  .sn-pick>label,.sn-pick-note,.sn-section>h2 small{font-size:14px}
  .sn-pick-row textarea{min-width:0;font-size:14px}
  .sn-pick-row .secondary{min-width:64px;font-size:14px}
  .sn-batch-head{min-height:44px;padding:12px 14px;font-size:14px}
  .sn-table th,.sn-table td{padding:8px 6px;font-size:14px}
  .sn-table .sn-last,.sn-batch.is-checking .sn-copies{display:none}
  .sn-table td.sn-check{padding:0}
  .sn-table th.sn-check label{min-height:44px;font-size:14px;gap:6px}
  .sn-board input[type=checkbox]{width:22px;height:22px}
  .sn-hit{width:44px;height:44px}
  .sn-scanned{white-space:normal}
  .sn-board .status{font-size:14px}
  .sn-actionbar{gap:8px;padding:10px 12px}
  .sn-actionbar .sn-count{font-size:14px}
  .sn-actionbar .link-button,.sn-actionbar .secondary,.sn-actionbar .primary{min-height:44px;padding:0 12px;font-size:14px}
  .sn-check-panel{padding:12px}
  .sn-check-sum{flex-basis:100%}
  .sn-check-actions{width:100%}
  .sn-check-actions button{flex:1;min-height:44px;font-size:14px}
  /* 发货与激活码（打开一单）：小字一律 14 px，按钮、输入框触控区 44 px（iPhone 输入框 16 px，点进去不会自动放大） */
  #page-content:has(.ship-layout) :is(.ship-crumb,.ship-head,.ship-layout) :not(h1,h2,h3,.ship-title,.ship-title *){font-size:14px}
  #page-content:has(.ship-layout) :is(.ship-crumb,.ship-title .pill){font-size:14px}
  #page-content:has(.ship-layout) .ship-crumb button{min-height:44px;padding:0 2px}
  #page-content:has(.ship-layout) .ship-layout :is(.ship-submit button,.action-link){min-height:44px;padding:0 16px}
  #page-content:has(.ship-layout) .ship-layout :is(input:not([type=radio]):not([type=checkbox]),select){min-height:44px;font-size:16px}
  /* 这三页上的对话框（SN 标签页的留号 / 补打 / 作废 / 核对，发货页的码窗，送样 / 线下出库）：顶上对齐，底边让开扫码键 */
  :is(body:has(#sn-board) #editor,body:has(.ship-layout) #editor,#editor:has(#offline-ship-unit)){width:calc(100% - 24px);padding:20px 16px;margin:12px auto auto;max-height:calc(100vh - 110px - env(safe-area-inset-bottom));max-height:calc(100dvh - 110px - env(safe-area-inset-bottom))}
  :is(body:has(#sn-board) #editor,body:has(.ship-layout) #editor,#editor:has(#offline-ship-unit)) :is(label,.field-help,p,li,dt,dd,em,.scan-hit,.error){font-size:14px}
  :is(body:has(#sn-board) #editor,body:has(.ship-layout) #editor,#editor:has(#offline-ship-unit)) :is(input:not([type=checkbox]):not([type=radio]),select,textarea){min-height:44px;font-size:16px}
  :is(body:has(#sn-board) #editor,body:has(.ship-layout) #editor,#editor:has(#offline-ship-unit)) :is(.dialog-actions button,.secret-actions button){min-height:44px;padding:0 16px;font-size:14px}
  :is(body:has(#sn-board) #editor,body:has(.ship-layout) #editor,#editor:has(#offline-ship-unit)) #close-dialog{min-width:44px;min-height:44px}
  :is(body:has(#sn-board) #editor,body:has(.ship-layout) #editor,#editor:has(#offline-ship-unit)) .checkbox-label{display:flex;align-items:center;gap:8px;min-height:44px}
}
/* ══ 扫码流程 · 手机排版与动效（scan-sn-task-5，设计稿「扫码流程 · 手机网页版」① – ⑦，2026-10-11）══════════════════════════════
   只在手机上生效：扫码键、扫码层、结果弹层、发货三步卡片、对话框扫码按钮都由 scan-key.js 只在手机上画（电脑上没有这些元素）；
   改动工作台已有元素（SN 标签、发货单、送样 / 线下出库对话框）的规则一律挂在 html.has-scan-key 下（跟扫码键同一个判断：触屏手机、能开相机）。
   电脑排版不变。动效一律用全站变量（曲线 --ease-standard，时长 --dur-in-fast / --dur-in / --dur-in-slow / --dur-out）；设计稿的特殊时长
   （扫描线 1.6 s、成功光圈 600 ms、勾 / 叉 900 ms、呼吸 1.8 s、抖动 320 ms）保留原值，曲线照样用变量。系统开「减少动态效果」时只保留颜色和淡入（本段最后）。
   按钮按下、对话框、通知、新增行、步骤完成、卡片首次进入这些全站通用动效归主线程 motion.css，本段不写（扫码键按下属于扫码键，保留）。
   字号：设计稿里 12–13 px 的小字按 scan-sn-task-4「手机上字号 ≥ 14 px」做成 14 px。 */
/* 动效变量兜底：与 motion.css 同值，合入后可删 */
:root{--ease-standard:cubic-bezier(.2,.8,.2,1);--dur-in-fast:120ms;--dur-in:200ms;--dur-in-slow:300ms;--dur-out:150ms}
html.has-scan-key .workspace{padding-bottom:calc(96px + env(safe-area-inset-bottom))}
/* ① 扫码键：药丸形 56 px，底部正中避开安全区；按下 96 %、松开 102 % 回弹；电脑在实机验收第 3 步时外圈钢蓝呼吸 */
.scan-key{position:fixed;left:50%;bottom:max(16px,env(safe-area-inset-bottom));z-index:60;transform:translateX(-50%);display:flex;margin:0;padding:0;border:0;border-radius:999px;background:none;min-height:0;-webkit-tap-highlight-color:transparent;touch-action:manipulation}
.scan-key-face{position:relative;display:inline-flex;align-items:center;justify-content:center;gap:8px;height:56px;padding:0 26px;border-radius:999px;background:#14181d;color:#fff;font-size:17px;font-weight:600;white-space:nowrap;box-shadow:0 0 0 4px #fff;transition:transform var(--dur-in-fast) var(--ease-standard);animation:scanKeyIn var(--dur-in-slow) var(--ease-standard) backwards}
.scan-key-face svg{flex:none}
.scan-key-ring{position:absolute;inset:0;border-radius:999px;background:#3d6e8c;opacity:0;pointer-events:none}
.scan-key.is-waiting .scan-key-ring{animation:scanKeyRing 1.8s var(--ease-standard) infinite}
.scan-key.is-pressed .scan-key-face{transform:scale(.96)}
.scan-key.is-released .scan-key-face{animation:scanKeyIn var(--dur-in-slow) var(--ease-standard) backwards,scanKeyRelease var(--dur-out) var(--ease-standard)}
.scan-key:focus-visible{outline:none}
.scan-key:focus-visible .scan-key-face{outline:3px solid #d98225;outline-offset:3px}
@keyframes scanKeyIn{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:none}}
@keyframes scanKeyRing{0%{transform:scale(1);opacity:.55}100%{transform:scale(1.5);opacity:0}}
@keyframes scanKeyRelease{0%{transform:scale(.96)}60%{transform:scale(1.02)}100%{transform:scale(1)}}
@keyframes scanFade{from{opacity:0}to{opacity:1}}
@keyframes scanFadeOut{to{opacity:0}}
.scan-notice{position:fixed;left:16px;right:16px;top:calc(12px + env(safe-area-inset-top));z-index:61;pointer-events:none;margin:0 auto;max-width:420px;padding:12px 16px;border-radius:10px;background:#14181d;color:#fff;font-size:15px;line-height:1.5;text-align:center}
/* ① 电脑在等扫码：页面顶部提示条 */
.scan-wait{display:flex;gap:10px;align-items:flex-start;margin:0 0 14px;padding:12px 14px;border-radius:12px;background:#eff5f9;color:#3d6e8c}
.scan-wait svg{flex:none;margin-top:1px}
.scan-wait div{display:flex;flex-direction:column;gap:2px;min-width:0}
.scan-wait b{font-size:15px;font-weight:600;color:#14181d}
.scan-wait span{font-size:14px;line-height:1.5}
/* ② 扫码层：深色顶栏、取景框 + 扫描线、成功 / 失败反馈、补光灯；浅色结果区（新结果从上滑入）；底部「完成」 */
dialog.scan-layer{position:fixed;inset:0;width:100%;height:100%;max-width:none;max-height:none;margin:0;padding:0;border:0;border-radius:0;background:#0f1317;color:#fff;overflow:hidden}
dialog.scan-layer[open]{display:flex;flex-direction:column;animation:scanFade var(--dur-in) var(--ease-standard)}
dialog.scan-layer::backdrop{background:#0f1317}
dialog.scan-layer.is-closing{animation:scanFadeOut var(--dur-out) var(--ease-standard) forwards}
dialog.scan-layer.is-closing .scan-layer-sheet{animation:scanSheetDown var(--dur-out) var(--ease-standard) forwards}
.scan-layer-top{flex:none;display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:calc(56px + env(safe-area-inset-top));padding:env(safe-area-inset-top) 8px 0 16px}
.scan-layer-heading{margin:0;display:flex;flex-direction:column;min-width:0;font-size:16px;font-weight:600;line-height:1.3;color:#fff}
.scan-layer-heading small{font-size:14px;font-weight:400;color:#98a0aa}
#scan-layer-page{overflow-wrap:anywhere}
.scan-layer-close{flex:none;min-height:44px;min-width:44px;padding:0 14px;border:0;border-radius:10px;background:#22282f;color:#fff;font-size:15px;font-weight:400}
.scan-layer-cam{position:relative;flex:none;height:clamp(240px,39dvh,360px);background:#1b2026;overflow:hidden}
.scan-layer-cam video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.scan-layer-box{position:absolute;left:24px;right:24px;top:calc(50% - 90px);height:150px;border:3px solid #fff;border-radius:14px;transition:border-color var(--dur-in) var(--ease-standard);pointer-events:none}
.scan-layer-line{display:none;position:absolute;left:8px;right:8px;top:10%;height:2px;border-radius:2px;background:#ff7a5c}
.scan-layer-cam.is-live .scan-layer-line{display:block;animation:scanSweep 1.6s var(--ease-standard) infinite}
.scan-layer-box.fx-ok{animation:scanOk .6s var(--ease-standard)}
.scan-layer-box.fx-bad{border-color:#f08a80;animation:scanShake .32s var(--ease-standard)}
.scan-layer-box.fx-gray{border-color:#c9d1d9}
.scan-layer-pop{position:absolute;left:calc(50% - 32px);top:calc(50% - 47px);width:64px;height:64px;border-radius:999px;display:flex;align-items:center;justify-content:center;color:#fff;opacity:0;pointer-events:none}
.scan-layer-pop.fx-ok{background:#3d6e8c;animation:scanPop .9s var(--ease-standard) forwards}
.scan-layer-pop.fx-bad{background:#b23a2b;animation:scanPop .9s var(--ease-standard) forwards}
.scan-layer-hint{position:absolute;left:16px;right:16px;top:calc(50% + 76px);text-align:center;color:#c9d1d9;font-size:14px;line-height:1.45;pointer-events:none}
.scan-layer-start{display:none;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);min-height:44px;padding:0 24px;border:0;border-radius:10px;background:#fff;color:#14181d;font-size:15px;font-weight:600}
.scan-layer-cam.is-failed .scan-layer-start{display:block}
.scan-layer-cam.is-failed :is(.scan-layer-box,.scan-layer-pop){display:none}
.scan-layer-cam.is-failed .scan-layer-hint{top:20px}
.scan-layer-torch{position:absolute;left:16px;bottom:16px;display:flex;align-items:center;justify-content:center;width:44px;height:44px;min-height:44px;padding:0;border:0;border-radius:999px;background:#22282f;color:#fff}
.scan-layer-torch.is-on{background:#fff;color:#14181d}
.scan-layer-sheet{flex:1;min-height:0;display:flex;flex-direction:column;background:#f6f7f9;color:#14181d;border-radius:18px 18px 0 0;animation:scanSheetUp var(--dur-in-slow) var(--ease-standard) both}
.scan-layer-sum{flex:none;display:flex;align-items:baseline;justify-content:space-between;gap:12px;padding:14px 16px 8px}
.scan-layer-sum h3{margin:0;font-size:15px;font-weight:600}
#scan-layer-count{font-size:14px;color:#6b747f;text-align:right}
.scan-layer-list{flex:1;min-height:0;overflow-y:auto;margin:0;padding:0 16px 4px;list-style:none;display:flex;flex-direction:column;gap:8px}
.scan-layer-empty{margin:18px 0 0;text-align:center;font-size:14px;color:#98a0aa}
.scan-layer-item{flex:none;display:flex;align-items:center;gap:10px;min-height:52px;margin:0;padding:8px 12px;border:1px solid #ebedf0;border-radius:10px;background:#fff;font-size:14px;line-height:1.35}
.scan-layer-item:first-child.r-ok{border-color:#a7c1d9}
.scan-layer-item:first-child.r-bad{border-color:#f0c9c2}
.scan-layer-item:first-child.r-gray{border-color:#dde0e5}
.scan-layer-dot{flex:none;display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:999px;background:#eef0f3;color:#5b636d;font-size:14px}
.scan-layer-item.r-ok .scan-layer-dot{background:#eff5f9;color:#3d6e8c}
.scan-layer-item.r-bad .scan-layer-dot{background:#fbf1ef;color:#b23a2b}
.scan-layer-text{flex:1;min-width:0;overflow-wrap:anywhere}
.scan-layer-item.r-gray .scan-layer-text{color:#5b636d}
.scan-layer-item small{flex:none;font-size:14px;color:#98a0aa}
.scan-layer-item.is-new{animation:scanEnter var(--dur-in) var(--ease-standard)}
.scan-layer-foot{flex:none;padding:12px 16px max(16px,env(safe-area-inset-bottom))}
.scan-layer .scan-layer-done{width:100%;min-height:52px;border-radius:12px;font-size:16px;font-weight:600}
@keyframes scanSweep{0%{top:10%}50%{top:86%}100%{top:10%}}
@keyframes scanOk{0%{border-color:#fff;box-shadow:0 0 0 0 rgba(61,110,140,0)}30%{border-color:#a7c1d9;box-shadow:0 0 0 6px rgba(61,110,140,.45)}100%{border-color:#fff;box-shadow:0 0 0 0 rgba(61,110,140,0)}}
@keyframes scanShake{0%,100%{transform:translateX(0)}20%{transform:translateX(-8px)}40%{transform:translateX(7px)}60%{transform:translateX(-5px)}80%{transform:translateX(3px)}}
@keyframes scanPop{0%{opacity:0;transform:scale(.6)}25%{opacity:1;transform:scale(1.06)}45%{transform:scale(1)}80%{opacity:1}100%{opacity:0;transform:scale(1)}}
@keyframes scanEnter{from{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:none}}
@keyframes scanSheetUp{from{opacity:0;transform:translateY(24px)}to{opacity:1;transform:none}}
@keyframes scanSheetDown{to{opacity:0;transform:translateY(24px)}}
/* ③ 查设备结果：底部弹层（编号等宽大字、状态标签、字段列表、看详情 / 去发货、送样 / 继续扫码） */
.scan-sheet-dim{position:absolute;inset:0;z-index:2;background:rgba(15,19,23,.55);animation:scanFade var(--dur-in-slow) var(--ease-standard)}
.scan-sheet-dim.is-leaving{animation:scanFadeOut var(--dur-out) var(--ease-standard) forwards}
.scan-sheet{position:absolute;left:0;right:0;bottom:0;z-index:3;display:flex;flex-direction:column;gap:14px;max-height:calc(100% - 56px - env(safe-area-inset-top));overflow-y:auto;padding:10px 16px max(16px,env(safe-area-inset-bottom));border-radius:20px 20px 0 0;background:#fff;color:#14181d}
.scan-sheet.is-in{animation:scanSheetIn var(--dur-in-slow) var(--ease-standard) both}
.scan-sheet.is-leaving{animation:scanSheetOut var(--dur-out) var(--ease-standard) forwards}
.scan-sheet-grip{flex:none;align-self:center;width:40px;height:5px;border-radius:999px;background:#dde0e5}
.scan-sheet-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
.scan-sheet-id{display:flex;flex-direction:column;gap:4px;min-width:0}
.scan-sheet-sn{font:700 22px/1.25 ui-monospace,"SF Mono","Cascadia Mono",Consolas,monospace;letter-spacing:.01em;overflow-wrap:anywhere}
.scan-sheet-sub{font-size:14px;color:#5b636d;overflow-wrap:anywhere}
.scan-chip{flex:none;padding:4px 10px;border-radius:6px;background:#eef0f3;color:#5b636d;font-size:14px;white-space:nowrap}
.scan-chip.c-accent{background:#eff5f9;color:#3d6e8c}
.scan-chip.c-done{background:#eaf2ec;color:#2f6b46}
.scan-chip.c-warn{background:#f3eee2;color:#8a6d1f}
.scan-chip.c-bad{background:#fbf1ef;color:#b23a2b}
.scan-sheet-dl{margin:0;border:1px solid #ebedf0;border-radius:12px;overflow:hidden}
.scan-sheet-dl div{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:46px;padding:8px 14px;border-bottom:1px solid #ebedf0}
.scan-sheet-dl div:last-child{border-bottom:0}
.scan-sheet-dl dt{flex:none;font-size:14px;color:#6b747f}
.scan-sheet-dl dd{margin:0;min-width:0;font-size:14px;text-align:right;overflow-wrap:anywhere}
.scan-sheet-note{margin:0;font-size:14px;color:#3d6e8c}
.scan-sheet-actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.scan-sheet-actions.is-single{grid-template-columns:minmax(0,1fr)}
.scan-sheet-actions button{min-height:50px;border-radius:12px;font-size:16px}
.scan-sheet-actions .primary{font-weight:600}
.scan-sheet-links{display:flex;align-items:center;justify-content:space-between;gap:12px}
.scan-sheet-links .link-button{min-height:44px;font-size:15px;text-decoration:none}
@keyframes scanSheetIn{from{opacity:0;transform:translateY(40px)}to{opacity:1;transform:none}}
@keyframes scanSheetOut{to{opacity:0;transform:translateY(40px)}}
/* ④ 成品 › SN 标签（手机）：批次卡头三段进度条、每行 52 px、自定义勾选框（勾画线）、选中行钢蓝浅底、操作条浮在扫码键上方 */
html.has-scan-key #sn-board .sn-tools{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:0 0 14px}
html.has-scan-key #sn-board .sn-tools .secondary{min-height:44px;padding:0 14px;font-size:15px}
.sn-print-hint{display:inline-flex;align-items:center;gap:6px;font-size:14px;color:#6b747f}
.sn-print-hint svg{flex:none}
html.has-scan-key #sn-board .sn-batch{margin:0 0 12px;border-radius:12px}
html.has-scan-key #sn-board .sn-batch-head{display:flex;flex-direction:column;align-items:stretch;flex-wrap:nowrap;gap:8px;min-height:44px;padding:12px 14px;background:#fafafa;color:#14181d}
html.has-scan-key #sn-board .sn-batch:not(.is-open) .sn-batch-head{background:#fff}
html.has-scan-key #sn-board .sn-batch-head span::before{content:none;display:none}
html.has-scan-key #sn-board .sn-bh-top{display:flex;align-items:baseline;justify-content:space-between;gap:10px}
html.has-scan-key #sn-board .sn-bh-top b{font-size:15px;font-weight:600;white-space:normal}
html.has-scan-key #sn-board .sn-bh-top small{flex:none;font-size:14px;color:#6b747f}
.sn-mono{font-family:ui-monospace,"SF Mono","Cascadia Mono",Consolas,monospace}
html.has-scan-key #sn-board .sn-bar{display:flex;gap:2px;height:8px;border-radius:999px;overflow:hidden}
html.has-scan-key #sn-board .sn-batch:not(.is-open) .sn-bar{display:none}
html.has-scan-key #sn-board .sn-bar i{display:block;flex:1 1 0;min-width:2px}
html.has-scan-key #sn-board .sn-bar-used{background:#3d6e8c}
html.has-scan-key #sn-board .sn-bar-voided{background:#e3a59b}
html.has-scan-key #sn-board .sn-bar-left{background:#dde0e5}
html.has-scan-key #sn-board .sn-bh-legend{display:flex;flex-wrap:wrap;align-items:center;gap:4px 14px;font-size:14px;color:#5b636d}
html.has-scan-key #sn-board .sn-bh-legend b{font-weight:600}
html.has-scan-key #sn-board .sn-n-used{color:#3d6e8c}
html.has-scan-key #sn-board .sn-n-voided{color:#b23a2b}
html.has-scan-key #sn-board .sn-n-left{color:#14181d}
html.has-scan-key #sn-board .sn-even{margin-left:auto;padding:3px 8px;border-radius:6px;background:#eaf2ec;color:#2f6b46;font-size:14px}
html.has-scan-key #sn-board .sn-table,html.has-scan-key #sn-board .sn-table :is(thead,tbody){display:block;width:100%}
html.has-scan-key #sn-board .sn-table tr{position:relative;display:flex;align-items:center;gap:12px;min-height:52px;padding:0 14px;border-bottom:1px solid #ebedf0;background:#fff;transition:background-color var(--dur-in) var(--ease-standard)}
html.has-scan-key #sn-board .sn-table thead tr{min-height:44px;background:#fff}
html.has-scan-key #sn-board .sn-table tbody tr:last-child{border-bottom:0}
html.has-scan-key #sn-board .sn-table :is(th,td){display:block;padding:0;border:0;background:transparent;font-size:14px}
html.has-scan-key #sn-board .sn-table th:not(.sn-check),html.has-scan-key #sn-board .sn-table :is(.sn-copies,.sn-last){display:none}
html.has-scan-key #sn-board .sn-table td.sn-serial{flex:1;min-width:0;font-family:ui-monospace,"SF Mono","Cascadia Mono",Consolas,monospace;font-size:15px;color:#14181d}
html.has-scan-key #sn-board .sn-row.is-voided td.sn-serial{color:#98a0aa}
html.has-scan-key #sn-board .sn-table .sn-row.is-picked{background:#eff5f9}
html.has-scan-key #sn-board .sn-table .sn-row.is-missing{background:#fdf6e3}
html.has-scan-key #sn-board .sn-table .sn-row.is-hit{background:#eef6ec}
html.has-scan-key #sn-board .sn-table td.sn-state{flex:none;max-width:55%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:3px 8px;border-radius:6px;background:#eef0f3;color:#5b636d}
html.has-scan-key #sn-board .sn-table td.s-used{background:#eff5f9;color:#3d6e8c}
html.has-scan-key #sn-board .sn-table td.s-voided{background:#fbf1ef;color:#b23a2b}
html.has-scan-key #sn-board .sn-table td.sn-state a{position:relative;z-index:1;border:0;color:inherit;text-decoration:none}
html.has-scan-key #sn-board .sn-table td.sn-scanned{flex:none;color:#2f6b46}
html.has-scan-key #sn-board .sn-table thead:not(:has(.sn-check)){display:none}
html.has-scan-key #sn-board .sn-table .sn-check{flex:none;width:auto}
html.has-scan-key #sn-board .sn-table th.sn-check label{gap:12px;min-height:44px;margin:0;color:#5b636d;font-size:14px}
html.has-scan-key #sn-board .sn-table td.sn-check .sn-hit{display:flex;align-items:center;justify-content:center;width:44px;height:44px;margin:0 -10px;cursor:pointer}
html.has-scan-key #sn-board .sn-table td.sn-check .sn-hit::after{content:'';position:absolute;inset:0}
html.has-scan-key #sn-board .sn-table .sn-check input{position:absolute;width:1px;height:1px;margin:0;opacity:0;pointer-events:none}
.sn-box{position:relative;flex:none;display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:1.5px solid #c3c9d0;border-radius:7px;background:#fff;color:#fff;transition:background-color var(--dur-in) var(--ease-standard),border-color var(--dur-in) var(--ease-standard)}
.sn-box svg{opacity:0}
.sn-box path{stroke-dasharray:20;stroke-dashoffset:20}
#sn-board input:is(:checked,:indeterminate)+.sn-box{border-color:#14181d;background:#14181d}
#sn-board input:checked+.sn-box svg{opacity:1}
#sn-board input:checked+.sn-box path{stroke-dashoffset:0;transition:stroke-dashoffset var(--dur-in) var(--ease-standard)}
#sn-board input:indeterminate+.sn-box::after{content:'';position:absolute;left:6px;right:6px;top:calc(50% - 1px);height:2px;border-radius:1px;background:#fff}
#sn-board input:focus-visible+.sn-box{outline:3px solid #d98225;outline-offset:2px}
html.has-scan-key #sn-board .sn-actionbar{position:fixed;left:12px;right:12px;bottom:calc(max(16px,env(safe-area-inset-bottom)) + 70px);z-index:59;display:flex;flex-wrap:nowrap;align-items:center;gap:4px;min-height:60px;margin:0;padding:0 8px 0 16px;border-radius:14px;background:#14181d;color:#fff;box-shadow:none;animation:scanBarUp var(--dur-in) var(--ease-standard) both}
html.has-scan-key #sn-board .sn-actionbar .sn-count{font-size:15px;font-weight:600}
html.has-scan-key #sn-board .sn-actionbar .link-button{min-height:44px;padding:0 12px;color:#c9d1d9;font-size:15px;text-decoration:none}
html.has-scan-key #sn-board .sn-actionbar .sn-danger{min-height:44px;padding:0 14px;border:0;border-radius:10px;background:#fff;color:#b23a2b;font-size:15px;font-weight:600}
html.has-scan-key body:has(#sn-actionbar:not([hidden])) .workspace{padding-bottom:calc(170px + env(safe-area-inset-bottom))}
@keyframes scanBarUp{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:none}}
/* ⑤ 发货单（打开一单，手机）：三张步骤卡 + 「已完成 N / 3」进度条；原来的三块表单收进「手动输入」；底部圆形扫码键 + 「确认发货」 */
.scan-steps{margin:0 0 20px}
.scan-steps-head{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin:0 0 8px}
.scan-steps-head h2{margin:0;font-size:15px;font-weight:600}
#scan-steps-count{font-size:14px;color:#6b747f}
.scan-steps-bar{height:6px;margin:0 0 12px;border-radius:999px;background:#ebedf0;overflow:hidden}
.scan-steps-bar i{display:block;width:0;height:6px;border-radius:999px;background:#3d6e8c;transition:width var(--dur-in-slow) var(--ease-standard)}
.scan-steps-list{display:flex;flex-direction:column;gap:10px}
.scan-step{display:flex;align-items:center;gap:12px;width:100%;min-height:74px;margin:0;padding:12px 14px;border:1px dashed #a7c1d9;border-radius:12px;background:#fff;color:#14181d;font-weight:400;text-align:left}
.scan-step.is-done{border-style:solid;border-color:#ebedf0}
.scan-step-mark{flex:none;display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:1.5px solid #c3c9d0;border-radius:999px;color:#6b747f;font-size:14px;font-weight:600}
.scan-step-mark.is-done{border:0;background:#2f6b46;color:#fff}
.scan-step-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.scan-step-title{font-size:14px;color:#6b747f}
.scan-step-value{font-size:15px;color:#3d6e8c;overflow-wrap:anywhere}
.scan-step-value.is-mono{font:16px ui-monospace,"SF Mono","Cascadia Mono",Consolas,monospace;color:#14181d}
.scan-steps-manual{min-height:44px;margin-top:4px;font-size:15px;text-decoration:none}
html.has-scan-key #page-content:has(#scan-steps:not(.is-manual)) .ship-steps>.ship-card{display:none}
html.has-scan-key #page-content:has(#scan-steps) .ship-submit{position:fixed;left:0;right:0;bottom:0;z-index:55;display:flex;gap:12px;margin:0;padding:12px 16px max(16px,env(safe-area-inset-bottom)) 84px;border-top:1px solid #ebedf0;background:#fff}
html.has-scan-key #page-content:has(#scan-steps) .ship-submit :is(.secondary,p){display:none}
html.has-scan-key #page-content:has(#scan-steps) .ship-layout .ship-submit .primary{flex:1;height:56px;min-height:56px;padding:0 16px;border-radius:12px;font-size:17px;font-weight:600}
html.has-scan-key #page-content:has(#scan-steps) .ship-layout .ship-submit .primary.is-ready{animation:scanReady var(--dur-in-slow) var(--ease-standard)}
html.has-scan-key body:has(#scan-steps) .workspace{padding-bottom:calc(110px + env(safe-area-inset-bottom))}
html.has-scan-key body:has(#scan-steps) .scan-key{left:16px;transform:none}
html.has-scan-key body:has(#scan-steps) .scan-key-face{width:56px;padding:0;box-shadow:none}
html.has-scan-key body:has(#scan-steps) .scan-key-face svg{width:26px;height:26px}
html.has-scan-key body:has(#scan-steps) .scan-key-label{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
@keyframes scanReady{0%{transform:scale(1)}40%{transform:scale(1.02)}100%{transform:scale(1)}}
/* ⑥ 送样 / 线下出库（手机）：全屏对话框，顶部「取消」+ 标题，设备编号、实体卡输入框右侧各一个扫码按钮，预检绿字 / 红字，底部「确认出库」 */
.scan-field{display:flex;align-items:stretch;gap:8px}
.scan-field>input{flex:1;min-width:0;margin:0}
.scan-inline{flex:none;display:flex;align-items:center;justify-content:center;width:48px;height:48px;min-height:48px;padding:0;border:0;border-radius:10px;background:#14181d;color:#fff}
.scan-inline:focus-visible{outline:3px solid #d98225;outline-offset:2px}
html.has-scan-key #editor:has(#offline-ship-unit){position:fixed;inset:0;width:100%;max-width:none;height:100%;max-height:none;margin:0;padding:0;border:0;border-radius:0;overflow:hidden}
html.has-scan-key #editor:has(#offline-ship-unit) #editor-form{display:flex;flex-direction:column;width:100%;height:100%}
html.has-scan-key #editor:has(#offline-ship-unit) .dialog-heading{flex:none;justify-content:center;min-height:calc(56px + env(safe-area-inset-top));padding:env(safe-area-inset-top) 88px 0;border-bottom:1px solid #ebedf0}
html.has-scan-key #editor:has(#offline-ship-unit) #dialog-title{margin:0;font-size:17px;font-weight:600;text-align:center}
html.has-scan-key #editor:has(#offline-ship-unit) #close-dialog{display:none}
html.has-scan-key #editor:has(#offline-ship-unit) #dialog-fields{flex:1;min-height:0;overflow-y:auto;padding:0 16px 16px}
html.has-scan-key #editor:has(#offline-ship-unit) #dialog-fields label{margin:16px 0 6px;color:#6b747f;font-weight:400}
html.has-scan-key #editor:has(#offline-ship-unit) #dialog-fields :is(input:not([type=checkbox]):not([type=radio]),select){height:48px;min-height:48px;padding:0 14px;border:1px solid #dde0e5;border-radius:10px;font-size:16px}
html.has-scan-key #editor:has(#offline-ship-unit) #dialog-fields :is(#offline-ship-unit,#offline-ship-card){font-family:ui-monospace,"SF Mono","Cascadia Mono",Consolas,monospace}
html.has-scan-key #editor:has(#offline-ship-unit) :is(#offline-ship-unit-result,#offline-ship-card-result){margin:6px 0 0;padding:0;border-radius:0;background:none;color:#2f6b46}
html.has-scan-key #editor:has(#offline-ship-unit) :is(#offline-ship-unit-result,#offline-ship-card-result).miss{color:#b23a2b}
html.has-scan-key #editor:has(#offline-ship-unit) #offline-ship-purpose{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:4px;margin:0;padding:4px;border-radius:12px;background:#f3f5f7}
html.has-scan-key #editor:has(#offline-ship-unit) #offline-ship-purpose .unit{position:relative;justify-content:center;gap:0;min-height:44px;margin:0;padding:0 8px;border:0;border-radius:9px;background:transparent;color:#4a5159;font-size:15px}
html.has-scan-key #editor:has(#offline-ship-unit) #offline-ship-purpose .unit input{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
html.has-scan-key #editor:has(#offline-ship-unit) #offline-ship-purpose .unit b{font-size:15px;font-weight:inherit}
html.has-scan-key #editor:has(#offline-ship-unit) #offline-ship-purpose .unit em{display:none}
html.has-scan-key #editor:has(#offline-ship-unit) #offline-ship-purpose .unit:has(input:checked){background:#fff;color:#14181d;font-weight:600}
html.has-scan-key #editor:has(#offline-ship-unit) #offline-ship-purpose .unit:has(input:focus-visible){outline:3px solid #d98225;outline-offset:1px}
html.has-scan-key #editor:has(#offline-ship-unit) #dialog-error{flex:none;margin:0;padding:0 16px}
html.has-scan-key #editor:has(#offline-ship-unit) .dialog-actions{position:static;flex:none;display:block;margin:0;padding:12px 16px max(16px,env(safe-area-inset-bottom));border-top:1px solid #ebedf0}
html.has-scan-key #editor:has(#offline-ship-unit) .dialog-actions #save-dialog{width:100%;min-height:52px;border-radius:12px;background:#14181d;color:#fff;font-size:17px;font-weight:600}
html.has-scan-key #editor:has(#offline-ship-unit) .dialog-actions #cancel-dialog{position:absolute;top:calc(6px + env(safe-area-inset-top));left:8px;z-index:1;min-height:44px;padding:0 8px;border:0;background:none;color:#3d6e8c;font-size:16px;font-weight:400}
/* ⑦ ⑩ 减少动态效果：只保留颜色和淡入；扫描线、抖动、弹出、位移一律关闭。提示音、震动照常（scanner.js） */
@media (prefers-reduced-motion:reduce){
  .scan-key-face,.scan-key.is-released .scan-key-face{animation:scanFade var(--dur-in) var(--ease-standard) backwards;transition:none}
  .scan-key.is-pressed .scan-key-face{transform:none}
  .scan-key.is-waiting .scan-key-ring{animation:none}
  .scan-key.is-waiting .scan-key-face{box-shadow:0 0 0 4px #fff,0 0 0 7px #3d6e8c}
  dialog.scan-layer.is-closing,dialog.scan-layer.is-closing .scan-layer-sheet{animation:none}
  .scan-layer-sheet{animation:scanFade var(--dur-in-slow) var(--ease-standard) both}
  .scan-layer-cam.is-live .scan-layer-line{animation:none;top:calc(50% - 1px)}
  .scan-layer-box.fx-ok{animation:none;border-color:#a7c1d9}
  .scan-layer-box.fx-bad{animation:none}
  .scan-layer-pop{display:none}
  .scan-layer-item.is-new{animation:scanFade var(--dur-in) var(--ease-standard)}
  .scan-sheet.is-in{animation:scanFade var(--dur-in) var(--ease-standard) both}
  .sn-box,#sn-board input:checked+.sn-box path{transition:none}
  html.has-scan-key #sn-board .sn-actionbar{animation:scanFade var(--dur-in) var(--ease-standard) both}
  .scan-steps-bar i{transition:none}
  html.has-scan-key #page-content:has(#scan-steps) .ship-layout .ship-submit .primary.is-ready{animation:none}
}
