:root{--bg:#f6f7f9;--surface:#ffffff;--border:#e2e5ea;--border-strong:#cbd1da;--text:#1a1f2b;--text-muted:#6b7280;--accent:var(--blue);--accent-hover:#233a6d;--accent-soft:#eef2fa;--on-accent:#ffffff;--hover:#f2f4f7;--row-hover:#fafbfc;--backdrop:rgba(26,31,43,0.35);--blue:#2d4a8a;--blue-soft:#eaf0fb;--purple:#6a3fb5;--purple-soft:#f1ebfb;--teal:#0b6e7f;--teal-soft:#e1f4f7;--green:#1b7a3d;--green-soft:#e4f5ea;--red:#c0392b;--red-soft:#fdecea;--amber:#8a5a00;--amber-soft:#fdf2d6;--slate:#515b6b;--slate-soft:#eef0f4;--ok:var(--green);--error:var(--red);--warn:var(--amber);--idle:var(--slate);--sp-1:0.25rem;--sp-2:0.5rem;--sp-3:0.75rem;--sp-4:1rem;--sp-5:1.5rem;--sp-6:2rem;--fs-xs:0.75rem;--fs-sm:0.8125rem;--fs-base:0.9375rem;--fs-lg:1.125rem;--fs-xl:1.5rem;--radius:6px;--shadow:0 1px 2px rgba(26,31,43,0.06);--shadow-pop:0 4px 16px rgba(26,31,43,0.14);--font-sans:system-ui,-apple-system,"Malgun Gothic",sans-serif;--font-mono:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;color-scheme:light}*{box-sizing:border-box}body{margin:0;font-family:var(--font-sans);font-size:var(--fs-base);line-height:1.55;color:var(--text);background:var(--bg)}.container{max-width:1200px;margin:0 auto;padding:var(--sp-5) var(--sp-4) var(--sp-6)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}h1{font-size:var(--fs-xl);font-weight:700;letter-spacing:-.01em;margin:0}h2{font-size:var(--fs-lg);font-weight:600;margin:0 0 var(--sp-3)}form.card>h2:not(:first-child){margin-top:var(--sp-6)}.tone-blue{--tone:var(--blue);--tone-soft:var(--blue-soft)}.tone-purple{--tone:var(--purple);--tone-soft:var(--purple-soft)}.tone-teal{--tone:var(--teal);--tone-soft:var(--teal-soft)}.tone-slate{--tone:var(--slate);--tone-soft:var(--slate-soft)}.icon{display:inline-block;flex:none;vertical-align:-.2em}h2>.icon{margin-right:var(--sp-2)}.page-title{display:flex;align-items:center;gap:var(--sp-3)}a{color:var(--tone,var(--accent));text-decoration:none}a:hover{text-decoration:underline}.docno,.num{font-family:var(--font-mono);font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.num{text-align:right}.docno,.num{white-space:nowrap}.docno{font-size:var(--fs-sm);letter-spacing:-.01em}.muted{color:var(--text-muted)}.text-sm{font-size:var(--fs-sm)}.nav{background:var(--surface);border-bottom:1px solid var(--border)}.nav-inner{max-width:1200px;margin:0 auto;padding:0 var(--sp-4);display:flex;align-items:center;gap:var(--sp-5);min-height:52px;flex-wrap:wrap}.nav-brand{display:inline-flex;align-items:center;gap:var(--sp-2);font-weight:700;font-size:var(--fs-base);color:var(--text);letter-spacing:-.02em}.nav-brand:hover{text-decoration:none}.nav-links{display:flex;flex-wrap:wrap;gap:var(--sp-1)}.nav-link{display:inline-flex;align-items:center;gap:var(--sp-2);white-space:nowrap;padding:var(--sp-2) var(--sp-3);border-radius:var(--radius);color:var(--text-muted);font-size:var(--fs-sm);font-weight:500}.nav-link:hover{text-decoration:none}.nav-link:hover,.nav-link[aria-current=page]{background:var(--tone-soft,var(--accent-soft));color:var(--tone,var(--accent))}.nav-link[aria-current=page]{font-weight:600}.nav-user{margin-left:auto;display:flex;align-items:center;gap:var(--sp-3);font-size:var(--fs-sm);color:var(--text-muted)}.back-link{display:inline-flex;align-items:center;min-height:24px}.page-head{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-4);flex-wrap:wrap;margin-bottom:var(--sp-5)}.table-wrap{position:relative;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--fs-base)}.table-wrap table{min-width:760px}thead th{text-align:left;font-size:var(--fs-xs);font-weight:600;color:var(--tone,var(--text-muted));letter-spacing:.02em;background:var(--tone-soft,transparent);border-bottom:1px solid var(--border-strong);white-space:nowrap}tbody td,thead th{padding:var(--sp-3) var(--sp-4)}tbody td{border-bottom:1px solid var(--border);vertical-align:middle;word-break:keep-all;overflow-wrap:anywhere}.cell-sub{display:block;margin-top:2px;font-size:var(--fs-xs);color:var(--text-muted)}.cell-sub,.nowrap{white-space:nowrap}.items-table{table-layout:fixed}.items-table tbody td{padding:var(--sp-2)}.items-table input{width:100%}tbody tr:last-child td{border-bottom:none}tbody tr:hover{background:var(--row-hover)}thead th.num{text-align:right}.empty-row td{color:var(--text-muted);text-align:center;padding:var(--sp-6) var(--sp-4)}.badge{display:inline-flex;align-items:center;gap:var(--sp-2);padding:2px var(--sp-3) 2px var(--sp-2);border-radius:999px;background:var(--badge-soft);color:var(--badge);font-size:var(--fs-sm);font-weight:500;white-space:nowrap}.badge:not(:has(.icon)):before{content:"";width:7px;height:7px;border-radius:50%;background:currentColor;flex:none}.badge-ok{--badge:var(--green);--badge-soft:var(--green-soft)}.badge-error{--badge:var(--red);--badge-soft:var(--red-soft)}.badge-warn{--badge:var(--amber);--badge-soft:var(--amber-soft)}.badge-idle{--badge:var(--slate);--badge-soft:var(--slate-soft)}.badge-info{--badge:var(--blue);--badge-soft:var(--blue-soft)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--sp-2);font-family:inherit;font-size:var(--fs-sm);font-weight:500;line-height:1.4;padding:var(--sp-2) var(--sp-4);border:1px solid var(--border-strong);border-radius:var(--radius);background:var(--surface);color:var(--text);cursor:pointer}.btn,.btn:hover{text-decoration:none}.btn:hover{background:var(--hover)}.btn:disabled{opacity:.55;cursor:not-allowed}.btn-primary{background:var(--tone,var(--accent));border-color:var(--tone,var(--accent));color:var(--on-accent)}.btn-primary:hover{background:color-mix(in srgb,var(--tone,var(--accent)) 82%,var(--text))}.btn-danger{background:var(--error);border-color:var(--error);color:var(--on-accent)}.btn-danger:hover{background:color-mix(in srgb,var(--error) 85%,var(--text))}.btn-primary .icon{padding:2px;box-sizing:content-box;border-radius:50%;background:var(--surface)}.btn-sm{padding:var(--sp-1) var(--sp-2);font-size:var(--fs-xs)}.field{margin-bottom:var(--sp-4)}.field>label{display:block;font-size:var(--fs-sm);font-weight:500;color:var(--text);margin-bottom:var(--sp-1)}.field-error{color:var(--error);font-size:var(--fs-sm);margin:var(--sp-1) 0 0}input,select,textarea{font-family:inherit;font-size:var(--fs-base);color:var(--text);padding:var(--sp-2) var(--sp-3);border:1px solid var(--border-strong);border-radius:var(--radius);background:var(--surface);max-width:100%}.field input,.field select,.field textarea{width:100%}.field input[type=checkbox]{width:auto}input[type=file]{padding:var(--sp-2);font-size:var(--fs-sm)}input[type=checkbox]{width:auto}input:focus,select:focus,textarea:focus{border-color:var(--accent);outline:2px solid var(--accent);outline-offset:0}.field-hint{font-size:var(--fs-sm);color:var(--text-muted);margin:var(--sp-1) 0 0}.field-hint-ok{color:var(--ok)}.field-hint-warn{color:var(--warn)}.form-row{gap:0 var(--sp-4)}.form-actions,.form-row{display:flex;flex-wrap:wrap}.form-actions{align-items:center;gap:var(--sp-2);margin-top:var(--sp-5)}.text-error{color:var(--error)}.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:var(--sp-5)}.card-narrow{max-width:560px}.card-form{max-width:880px}.form-group{margin-bottom:var(--sp-5)}.form-group+.form-group{border-top:1px solid var(--border);padding-top:var(--sp-5)}.form-group-title{margin:0 0 var(--sp-3);font-size:var(--fs-base);color:var(--tone,var(--text))}.form-grid{display:grid;grid-template-columns:minmax(0,1fr);column-gap:var(--sp-4)}@media (min-width:720px){.form-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.form-grid .field-wide{grid-column:1/-1}}.kv{display:grid;grid-template-columns:max-content 1fr;gap:var(--sp-2) var(--sp-5);margin:0}.kv dt{color:var(--text-muted);font-size:var(--fs-sm);padding-top:1px}.kv dd{margin:0;word-break:keep-all;overflow-wrap:anywhere}.section{margin-top:var(--sp-6)}.section-head{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3);margin-bottom:var(--sp-3)}.raw,.section-head h2{margin:0}.raw{font-family:var(--font-mono);font-size:var(--fs-sm);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:var(--sp-3) var(--sp-4);overflow-x:auto}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}@media (pointer:coarse){.back-link,.btn,.nav-brand,.nav-link,.th-sort,.toggle,input:not([type=checkbox]),select{min-height:44px}.nav-brand,.nav-link{display:inline-flex;align-items:center}.btn-sm{padding:var(--sp-2) var(--sp-3)}.combo-option{min-height:44px;justify-content:center}.kv dd a,.row-actions a,.table-wrap td a{display:inline-flex;align-items:center;justify-content:center;min-height:44px;min-width:44px}.th-sort{min-width:44px}.tap-link{display:inline-flex;align-items:center;min-height:44px}.field input[type=checkbox],input[type=checkbox]{width:24px;height:24px}}.login-shell{display:flex;justify-content:center;padding-top:8vh}.login-shell .card{width:100%}.toolbar{display:flex;gap:var(--sp-2);align-items:center;flex-wrap:wrap;margin-bottom:var(--sp-4)}.toolbar-search{width:320px;max-width:100%}.search-field{position:relative;display:inline-flex;align-items:center;max-width:100%}.search-field .icon{position:absolute;left:var(--sp-3);pointer-events:none}.search-field .toolbar-search{padding-left:calc(var(--sp-3) + 18px + var(--sp-2))}.combo{position:relative}.combo-list,.combo-popup{position:absolute;left:0;right:0;top:calc(100% + var(--sp-1));z-index:20;background:var(--surface);border:1px solid var(--border-strong);border-radius:var(--radius);box-shadow:var(--shadow-pop)}.combo-list{margin:0;padding:var(--sp-1);list-style:none;max-height:280px;overflow-y:auto}.combo-option{display:flex;flex-direction:column;gap:2px;padding:var(--sp-2) var(--sp-3);border-radius:var(--radius);cursor:pointer}.combo-option[aria-selected=true]{background:var(--tone-soft,var(--accent-soft))}.combo-name{display:inline-flex;align-items:center;gap:var(--sp-2);font-weight:500}.combo-sub{font-size:var(--fs-xs);color:var(--slate)}.combo-empty{margin:0;padding:var(--sp-3) var(--sp-4);font-size:var(--fs-sm);color:var(--slate)}.row-actions{text-align:right;white-space:nowrap;font-size:var(--fs-sm)}.pager{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-4);flex-wrap:wrap;margin-top:var(--sp-4)}.pager-links{display:flex;gap:var(--sp-2)}.th-sort{display:inline-flex;align-items:center;gap:var(--sp-1);background:none;border:none;padding:0;font:inherit;color:inherit;letter-spacing:inherit;cursor:pointer}.th-sort:hover{color:var(--tone,var(--accent))}.th-sort-icon{font-size:.65em;opacity:.45}.th-sort:hover .th-sort-icon{opacity:.8}.toolbar-count{margin-left:auto}.expiring{color:var(--error);font-size:var(--fs-sm);font-weight:600}.action-group{display:inline-flex;align-items:center;gap:var(--sp-3);white-space:nowrap}.status-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:var(--sp-5);margin-bottom:var(--sp-5)}.status-meta{margin:var(--sp-2) 0 0}.status-card .notice{margin:var(--sp-4) 0 0}.status-grid{display:grid;grid-template-columns:max-content 1fr;gap:var(--sp-2) var(--sp-5);margin-top:var(--sp-4)}.status-grid dt{color:var(--text-muted)}.status-grid dd{margin:0}.toggle{display:inline-flex;align-items:center;gap:var(--sp-2);border:1px solid var(--border);border-radius:999px;padding:var(--sp-2) var(--sp-4) var(--sp-2) var(--sp-2);background:var(--surface);cursor:pointer;font-size:1rem}.toggle:disabled{opacity:.6;cursor:progress}.toggle-knob{width:14px;height:14px;border-radius:50%;background:var(--text-muted)}.toggle-on .toggle-knob{background:var(--ok)}.toggle-off .toggle-knob{background:var(--error)}.toggle-confirm{margin-top:var(--sp-3);padding:var(--sp-3) var(--sp-4);border:1px solid var(--border);border-radius:var(--radius);background:var(--bg)}.toggle-confirm p{margin:0 0 var(--sp-2)}.notice{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-3) var(--sp-4);border-radius:var(--radius);margin-bottom:var(--sp-4)}.notice-warn{background:color-mix(in srgb,var(--warn) 12%,var(--surface));color:var(--warn);border:1px solid color-mix(in srgb,var(--warn) 35%,var(--surface))}.notice-ok{background:var(--green-soft);color:var(--green);border:1px solid color-mix(in srgb,var(--green) 35%,var(--surface))}.notice-ok .btn{margin-left:auto}.notice-idle{background:var(--slate-soft);color:var(--slate);border:1px solid color-mix(in srgb,var(--slate) 25%,var(--surface))}.notice-danger{background:color-mix(in srgb,var(--error) 12%,var(--surface));color:var(--error);border:1px solid color-mix(in srgb,var(--error) 35%,var(--surface))}.issue-dialog{border:1px solid var(--border);border-radius:var(--radius);padding:var(--sp-5);max-width:480px;width:calc(100% - 32px);background:var(--surface);color:var(--text)}.issue-dialog::backdrop{background:var(--backdrop)}.issue-dialog h2{font-size:var(--fs-lg);margin:0 0 var(--sp-4)}.issue-dialog-summary{display:grid;grid-template-columns:max-content 1fr;gap:var(--sp-2) var(--sp-4);margin:0 0 var(--sp-4)}.issue-dialog-summary dt{color:var(--text-muted);font-size:var(--fs-sm)}.issue-dialog-summary dd{margin:0;word-break:keep-all;overflow-wrap:anywhere}.issue-dialog-choice{border:1px solid var(--border);border-radius:var(--radius);padding:var(--sp-3) var(--sp-4);margin:0 0 var(--sp-4);display:grid;gap:var(--sp-2)}.issue-dialog-choice legend{font-size:var(--fs-sm);color:var(--warn);padding:0 var(--sp-1)}.issue-dialog-choice label{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2)}.issue-dialog-choice .cell-sub{flex-basis:100%;margin-left:22px}.issue-dialog-warn{color:var(--error);font-size:var(--fs-sm);margin:0 0 var(--sp-3)}.home-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:var(--sp-4);margin-top:var(--sp-5)}.home-card{display:flex;flex-direction:column;gap:var(--sp-2);padding:var(--sp-5);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);color:var(--text)}.home-card:hover{background:var(--tone-soft);text-decoration:none}.home-card h2{margin:var(--sp-2) 0 0;color:var(--tone)}.home-card p{margin:0;font-size:var(--fs-sm);color:var(--slate)}.col-name{min-width:11rem}.toolbar-filter{display:inline-flex;align-items:center;gap:var(--sp-2);font-size:var(--fs-sm);color:var(--slate)}.toolbar-filter select{padding:var(--sp-1) var(--sp-2);font-size:var(--fs-sm)}.badge-sub{margin-top:var(--sp-1)}.badge-sub,.row-memo{display:block;font-size:var(--fs-sm);color:var(--slate);white-space:nowrap}.row-memo{max-width:14rem;overflow:hidden;text-overflow:ellipsis}.toolbar-filter .combo{width:min(26rem,70vw)}.toolbar-filter .combo input{width:100%}@media (max-width:640px){.table-wrap:has(>.table-stack){background:transparent;border:0;box-shadow:none;overflow:visible}.table-wrap .table-stack{min-width:0}.table-stack,.table-stack tbody,.table-stack td,.table-stack tr{display:block}.table-stack thead{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}.table-stack tbody tr{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);margin-bottom:var(--sp-3);padding:var(--sp-1) var(--sp-4)}.table-stack tbody td{display:flex;justify-content:space-between;align-items:baseline;gap:var(--sp-4);padding:var(--sp-2) 0;border-bottom:1px solid var(--border);text-align:right}.table-stack tbody td:last-child{border-bottom:0}.table-stack tbody td:before{content:attr(data-label);flex:none;max-width:45%;font-size:var(--fs-xs);color:var(--slate);text-align:left}.table-stack tbody td[data-label=""]{justify-content:flex-end}.table-stack tbody td:not([data-label]):before,.table-stack tbody td[data-label=""]:before{display:none}.table-stack .empty-row td{display:block;text-align:center}.table-stack .cell-body{min-width:0}.table-stack td>input{flex:1 1;min-width:0}.items-table tbody td:before{flex:0 0 5.5rem;max-width:none}.col-name{min-width:0}}.ledger-voided td{color:var(--text-muted);text-decoration:line-through}.ledger-voided td.ledger-void-note{text-decoration:none}.quote-totals{margin:var(--sp-4) 0}.send-dialog{max-width:640px}.send-dialog textarea{font-family:inherit}.send-dialog .field-hint{margin-bottom:var(--sp-4)}.send-error-raw{display:block;font-size:var(--fs-xs);overflow-wrap:anywhere}.quote-frame{display:block;width:100%;height:min(1123px,85vh);min-height:560px;border:1px solid var(--border-strong);background:var(--surface)}.nav-settings,.quote-frame{border-radius:var(--radius)}.nav-settings{display:inline-flex;align-items:center;justify-content:center;min-width:44px;min-height:44px}.nav-settings:hover,.nav-settings[aria-current=page]{background:var(--accent-soft)}.stamp-form{display:flex;flex-direction:column;gap:var(--sp-3)}.stamp-preview{display:flex;align-items:center;justify-content:center;width:120px;height:120px;border:1px dashed var(--border-strong);border-radius:var(--radius);background:var(--surface)}.stamp-preview .muted{padding:var(--sp-2);font-size:var(--fs-sm);text-align:center}.stamp-form .action-group{flex-wrap:wrap}.stamp-form input[type=file]{max-width:100%;min-width:0}.stamp-preview img{max-width:100px;max-height:100px}.check-row{display:inline-flex;align-items:center;gap:var(--sp-2);min-height:44px;margin-bottom:var(--sp-2);cursor:pointer}.check-row input{flex-shrink:0;width:18px;height:18px}.inline-check{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-3)}.inline-check input[type=number]{max-width:12rem}.inline-check select{width:auto;min-width:6rem}.labor-totals{max-width:28rem;margin-bottom:var(--sp-4)}.labor-totals dd{text-align:right}.direct-costs{margin:var(--sp-4) 0}.direct-costs summary{cursor:pointer;font-weight:600;padding:var(--sp-2) 0}@media (pointer:coarse){.check-row input{width:24px;height:24px}.direct-costs summary{padding:var(--sp-3) 0}}.wrap-row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2) var(--sp-3)}.items-table select{width:100%}.preview-dialog{width:min(960px,calc(100% - 32px));height:calc(100vh - 48px);max-height:none;padding:0;border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);color:var(--text)}.preview-dialog[open]{display:flex;flex-direction:column}.preview-dialog::backdrop{background:var(--backdrop)}.preview-dialog-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--sp-2) var(--sp-3);padding:var(--sp-3) var(--sp-4);border-bottom:1px solid var(--border)}.preview-dialog-frame{flex:1 1;width:100%;border:0;background:var(--surface)}