@suveren/gateway 0.37.0 → 0.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/content/integrations/erp.json +360 -19
- package/dist/mcp-server/http.mjs +576 -29
- package/dist/ui/assets/index-DNNXeRpZ.js +123 -0
- package/dist/ui/assets/index-Osk4E49r.css +1 -0
- package/dist/ui/index.html +2 -2
- package/node_modules/@modelcontextprotocol/sdk/node_modules/body-parser/README.md +17 -13
- package/node_modules/@modelcontextprotocol/sdk/node_modules/body-parser/lib/read.js +74 -57
- package/node_modules/@modelcontextprotocol/sdk/node_modules/body-parser/lib/types/json.js +11 -11
- package/node_modules/@modelcontextprotocol/sdk/node_modules/body-parser/lib/types/urlencoded.js +5 -5
- package/node_modules/@modelcontextprotocol/sdk/node_modules/body-parser/lib/utils.js +0 -15
- package/node_modules/@modelcontextprotocol/sdk/node_modules/body-parser/package.json +7 -12
- package/node_modules/body-parser/HISTORY.md +7 -2
- package/node_modules/body-parser/README.md +3 -3
- package/node_modules/body-parser/lib/read.js +26 -8
- package/node_modules/body-parser/package.json +1 -1
- package/node_modules/on-finished/index.js +14 -2
- package/node_modules/on-finished/package.json +11 -7
- package/package.json +1 -1
- package/profiles/index.json +2 -1
- package/profiles/master-data/0.1.profile.json +311 -0
- package/dist/ui/assets/index-BC2bXeCQ.js +0 -123
- package/dist/ui/assets/index-XiOgY6b5.css +0 -1
- package/node_modules/on-finished/HISTORY.md +0 -98
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--text-primary: #111111;--text-secondary: #111111;--text-tertiary: #111111;--text-muted: #888888;--text-on-accent: #ffffff;--bg-main: #fafafa;--bg-elevated: #ffffff;--bg-input: #ffffff;--border: #e5e5e5;--border-strong: #c7c7c7;--bg-sunken: #f0f0f0;--accent: #888888;--accent-subtle: #f0f0f0;--accent-hover: #555555;--neutral: #111111;--neutral-subtle: #f0f0f0;--check-failed: #cd291d;--check-failed-subtle: #fef2f2;--prov-sealed: var(--text-primary);--prov-system: #1d4ed8;--prov-system-subtle: #eff6ff;--prov-ai: #b45309;--prov-ai-subtle: #fffbeb;--btn-primary-bg: #111111;--btn-primary-fg: #ffffff;--btn-primary-bg-hover: #000000;--btn-primary-bg-active: #2a2a2a;--btn-secondary-border: var(--border);--btn-outline-border-strong: var(--text-primary);--focus-ring: rgba(17, 17, 17, .35);--bg-field: #111111;--text-field: #ffffff;--border-field: #111111;--placeholder-field: rgba(255, 255, 255, .55);--field-focus-ring: rgba(0, 0, 0, .18);--elevation-0: none;--elevation-1: 0 1px 2px rgba(0, 0, 0, .06);--elevation-2: 0 4px 12px rgba(0, 0, 0, .1);--elevation-3: 0 20px 60px rgba(0, 0, 0, .25);--radius-xs: .25rem;--radius-sm: .375rem;--radius-md: .5rem;--radius-lg: .75rem;--radius-xl: 1rem;--radius-pill: 9999px;--radius-circle: 50%;--space-1: .25rem;--space-2: .5rem;--space-3: .75rem;--space-4: 1rem;--space-5: 1.25rem;--space-6: 1.5rem;--space-8: 2rem;--space-10: 2.5rem;--space-12: 3rem;--text-micro: .7rem;--text-caption: .78rem;--text-body-sm: .85rem;--text-body: .95rem;--text-lead: 1.1rem;--text-h3: 1.25rem;--text-h2: 1.5rem;--text-h1: 2rem;--text-display-page: clamp(2rem, 2.4vw, 2.5rem);--text-display-hero: clamp(2.5rem, 3.8vw, 4rem);--font-sans: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", sans-serif;--font-mono: "SF Mono", Monaco, "Cascadia Code", ui-monospace, Menlo, monospace;--line-tight: 1.3;--line-normal: 1.5;--line-relaxed: 1.6;--nav-height: 3.5rem;--sidebar-width: 15rem;--content-width: 75rem;--content-padding: 2rem}@media(prefers-color-scheme:dark){:root{--text-primary: #ffffff;--text-secondary: #ffffff;--text-tertiary: #ffffff;--text-muted: #9a9a9a;--text-on-accent: #000000;--bg-main: #0a0a0a;--bg-elevated: #1a1a1a;--bg-input: #141414;--bg-sunken: #0a0a0a;--border: #2a2a2a;--border-strong: #4a4a4a;--accent: #9a9a9a;--accent-subtle: #1f1f1f;--accent-hover: #bbbbbb;--neutral: #ffffff;--neutral-subtle: #1f1f1f;--check-failed: #f87171;--check-failed-subtle: #2a0a0a;--prov-system: #60a5fa;--prov-system-subtle: #0f1d33;--prov-ai: #f59e0b;--prov-ai-subtle: #2a1d06;--btn-primary-bg: #ffffff;--btn-primary-fg: #000000;--btn-primary-bg-hover: #e5e5e5;--btn-primary-bg-active: #c4c4c4;--focus-ring: rgba(255, 255, 255, .4);--bg-field: #ffffff;--text-field: #111111;--border-field: #ffffff;--placeholder-field: rgba(0, 0, 0, .5);--field-focus-ring: rgba(255, 255, 255, .25);--elevation-1: 0 1px 2px rgba(0, 0, 0, .4);--elevation-2: 0 4px 16px rgba(0, 0, 0, .5);--elevation-3: 0 20px 60px rgba(0, 0, 0, .6)}}[data-theme=dark]{--text-primary: #ffffff;--text-secondary: #ffffff;--text-tertiary: #ffffff;--text-muted: #9a9a9a;--text-on-accent: #000000;--bg-main: #0a0a0a;--bg-elevated: #1a1a1a;--bg-input: #141414;--bg-sunken: #0a0a0a;--border: #2a2a2a;--border-strong: #4a4a4a;--accent: #9a9a9a;--accent-subtle: #1f1f1f;--accent-hover: #bbbbbb;--neutral: #ffffff;--neutral-subtle: #1f1f1f;--check-failed: #f87171;--check-failed-subtle: #2a0a0a;--prov-system: #60a5fa;--prov-system-subtle: #0f1d33;--prov-ai: #f59e0b;--prov-ai-subtle: #2a1d06;--btn-primary-bg: #ffffff;--btn-primary-fg: #000000;--btn-primary-bg-hover: #e5e5e5;--btn-primary-bg-active: #c4c4c4;--focus-ring: rgba(255, 255, 255, .4);--bg-field: #ffffff;--text-field: #111111;--border-field: #ffffff;--placeholder-field: rgba(0, 0, 0, .5);--field-focus-ring: rgba(255, 255, 255, .25);--elevation-1: 0 1px 2px rgba(0, 0, 0, .4);--elevation-2: 0 4px 16px rgba(0, 0, 0, .5);--elevation-3: 0 20px 60px rgba(0, 0, 0, .6)}[data-theme=light]{--text-primary: #111111;--text-secondary: #111111;--text-tertiary: #111111;--text-muted: #888888;--text-on-accent: #ffffff;--bg-main: #fafafa;--bg-elevated: #ffffff;--bg-input: #ffffff;--bg-sunken: #f0f0f0;--border: #e5e5e5;--border-strong: #c7c7c7;--accent: #888888;--accent-subtle: #f0f0f0;--accent-hover: #555555;--neutral: #111111;--neutral-subtle: #f0f0f0;--check-failed: #cd291d;--check-failed-subtle: #fef2f2;--prov-system: #1d4ed8;--prov-system-subtle: #eff6ff;--prov-ai: #b45309;--prov-ai-subtle: #fffbeb;--btn-primary-bg: #111111;--btn-primary-fg: #ffffff;--btn-primary-bg-hover: #000000;--btn-primary-bg-active: #2a2a2a;--focus-ring: rgba(17, 17, 17, .35);--bg-field: #111111;--text-field: #ffffff;--border-field: #111111;--placeholder-field: rgba(255, 255, 255, .55);--field-focus-ring: rgba(0, 0, 0, .18);--elevation-1: 0 1px 2px rgba(0, 0, 0, .06);--elevation-2: 0 4px 12px rgba(0, 0, 0, .1);--elevation-3: 0 20px 60px rgba(0, 0, 0, .25)}@font-face{font-family:Inter;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/Inter-Regular.woff2) format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/Inter-Medium.woff2) format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/Inter-SemiBold.woff2) format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/Inter-Bold.woff2) format("woff2")}*,*:before,*:after{margin:0;padding:0;box-sizing:border-box}html{scroll-behavior:smooth}body{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-feature-settings:"cv11","ss01","ss03";font-size:16px;line-height:1.6;color:var(--text-primary);background:var(--bg-main);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media(min-width:1900px){body{font-size:17.5px}}@media(min-width:2800px){body{font-size:19px}}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}h1,h2,h3,h4{font-weight:700;letter-spacing:-.02em;line-height:1.2;color:var(--text-primary)}code{background:var(--bg-elevated);border:1px solid var(--border);padding:.15rem .4rem;border-radius:.25rem;font-size:.875em;font-family:SF Mono,Monaco,Cascadia Code,Courier New,monospace}.top-nav{position:fixed;top:0;width:100%;height:var(--nav-height);background:color-mix(in srgb,var(--bg-main) 92%,transparent);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border-bottom:1px solid var(--border);z-index:1000}.top-nav-inner{max-width:100%;margin:0 auto;padding:0 1.5rem;height:100%;display:flex;align-items:center;gap:1rem}.logo-group{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.logo-group svg{flex-shrink:0}.logo{font-weight:700;font-size:.95rem;color:var(--text-primary);text-decoration:none}.logo:hover{text-decoration:none}.version-badge{font-size:.65rem;font-weight:600;padding:.15rem .4rem;background:var(--btn-primary-bg);color:var(--btn-primary-fg);border-radius:.25rem}.gw-version{font-size:.7rem;padding:.15rem .4rem;border-radius:.25rem;color:var(--text-muted);background:var(--accent-subtle);font-variant-numeric:tabular-nums;white-space:nowrap}.gw-version[data-stale=true]{color:var(--text-primary);background:transparent;border:1px dashed var(--text-primary)}.nav-spacer{flex:1}.nav-actions{display:flex;align-items:center;gap:.75rem}.workspace-pill{display:inline-flex;align-items:center;font-size:.75rem;font-weight:600;padding:.2rem .65rem;border-radius:9999px;border:1px solid var(--text-primary);color:var(--text-primary);white-space:nowrap}.workspace-pill[data-managed=true]{border-color:var(--accent);color:var(--accent)}.workspace-pill-it{font-weight:400}.user-chip{display:flex;align-items:center;gap:.5rem;font-size:.8rem;color:var(--text-secondary)}.user-chip strong{color:var(--text-primary)}.user-chip .dot{width:3px;height:3px;border-radius:50%;background:var(--text-tertiary)}.theme-toggle{width:2rem;height:2rem;background:none;border:1px solid var(--border);border-radius:.375rem;cursor:pointer;color:var(--text-secondary);font-size:1rem;display:flex;align-items:center;justify-content:center}.theme-toggle:hover{color:var(--accent);border-color:var(--accent)}.nav-logout{font-size:.8rem;color:var(--text-tertiary);cursor:pointer;background:none;border:none;font-family:inherit}.nav-logout:hover{color:var(--text-primary)}.domain-switcher{position:relative}.domain-switcher-btn{background:none;border:none;font-family:inherit;font-size:.8rem;color:var(--text-secondary);cursor:pointer;display:flex;align-items:center;gap:.25rem;padding:.125rem .25rem;border-radius:.25rem}.domain-switcher-btn:hover{color:var(--accent)}.domain-switcher-arrow{font-size:.6rem;color:var(--text-tertiary)}.domain-switcher-menu{position:absolute;top:calc(100% + .375rem);right:0;min-width:10rem;background:var(--bg-elevated);border:1px solid var(--border);border-radius:.5rem;box-shadow:var(--elevation-2);z-index:200;padding:.25rem}.domain-switcher-item{display:block;width:100%;text-align:left;background:none;border:none;font-family:inherit;font-size:.8rem;color:var(--text-secondary);padding:.5rem .75rem;border-radius:.375rem;cursor:pointer;white-space:nowrap}.domain-switcher-item:hover{background:var(--accent-subtle);color:var(--text-primary)}.domain-switcher-item.active{color:var(--accent);font-weight:600}.sidebar{position:fixed;top:calc(var(--nav-height) + var(--update-banner-h, 0px) + var(--sim-banner-h, 0px));left:0;width:var(--sidebar-width);height:calc(100vh - var(--nav-height) - var(--update-banner-h, 0px) - var(--sim-banner-h, 0px));background:var(--bg-elevated);border-right:1px solid var(--border);padding:1rem 0;z-index:900;display:flex;flex-direction:column}.sidebar-nav{list-style:none;padding:0 .5rem;flex:1}.sidebar-item{display:flex;align-items:center;gap:.625rem;padding:.5rem .75rem;margin-bottom:.125rem;border-radius:.5rem;font-size:.85rem;font-weight:500;color:var(--text-secondary);cursor:pointer;transition:background .15s,color .15s;text-decoration:none}.sidebar-item:hover{background:var(--accent-subtle);color:var(--text-primary);text-decoration:none}.sidebar-item.active{background:var(--accent-subtle);color:var(--accent);font-weight:600}.sidebar-item .icon{width:1.125rem;text-align:center;font-size:.9rem;flex-shrink:0}.sidebar-section-label{font-size:.65rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-tertiary);padding:1rem .75rem .375rem}.sidebar-context{padding:.75rem 1rem;border-top:1px solid var(--border);font-size:.75rem;color:var(--text-tertiary)}.sidebar-context .ctx-label{font-weight:600;color:var(--text-secondary);margin-bottom:.125rem}.sidebar-context .ctx-value{color:var(--text-primary);font-weight:500}.main-content{margin-left:var(--sidebar-width);margin-top:calc(var(--nav-height) + var(--update-banner-h, 0px) + var(--sim-banner-h, 0px));padding:2rem;min-height:calc(100vh - var(--nav-height))}.main-content.no-sidebar{margin-left:0}.page-inner{max-width:56rem;margin:0 auto}.page-inner:has(.intent-layout){max-width:none}.page-header{margin-bottom:1.5rem}.page-title{font-size:1.5rem;margin-bottom:.25rem}.page-subtitle{font-size:.9rem;color:var(--text-secondary)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;padding:.625rem 1.25rem;font-size:.9rem;font-weight:500;font-family:inherit;border-radius:.5rem;border:none;cursor:pointer;transition:all .2s;text-decoration:none;line-height:1.4}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-primary{background:var(--btn-primary-bg);color:var(--btn-primary-fg);border:2px solid var(--btn-primary-bg)}.btn-primary:hover:not(:disabled){background:var(--btn-primary-bg-hover);border-color:var(--btn-primary-bg-hover);color:var(--btn-primary-fg);transform:translateY(-1px);box-shadow:var(--elevation-2)}.btn-primary:active:not(:disabled){background:var(--btn-primary-bg-active);border-color:var(--btn-primary-bg-active)}.btn-secondary{background:transparent;color:var(--text-primary);border:1px solid var(--border)}.btn-secondary:hover:not(:disabled){border-color:var(--btn-primary-bg);color:var(--text-primary);background:var(--accent-subtle)}.btn-ghost{background:transparent;color:var(--text-secondary);border:none;padding:.5rem .75rem}.btn-ghost:hover:not(:disabled){color:var(--text-primary);background:var(--accent-subtle)}.btn-full{width:100%}.btn-sm{padding:.375rem .75rem;font-size:.8rem}.btn-lg{padding:.875rem 2rem;font-size:1rem;font-weight:600}.form-group{margin-bottom:1.25rem}.form-label{display:block;font-size:.875rem;font-weight:600;color:var(--text-primary);margin-bottom:.375rem}.form-input,.form-select,.form-textarea{width:100%;padding:.625rem .75rem;font-size:.9rem;font-family:inherit;color:var(--text-field);background:var(--bg-field);border:1px solid var(--border-field);border-radius:.5rem;outline:none;transition:box-shadow .2s,border-color .2s}.form-input::placeholder,.form-textarea::placeholder{color:var(--placeholder-field);opacity:1}.form-input:focus,.form-textarea:focus,.form-select:focus{box-shadow:0 0 0 3px var(--field-focus-ring)}.form-input:disabled,.form-textarea:disabled,.form-select:disabled{opacity:.55;cursor:not-allowed}.form-input-invalid,.form-input-invalid:focus{border-color:var(--border-field);box-shadow:0 0 0 2px var(--bg-elevated),0 0 0 4px var(--text-primary)}.form-textarea{resize:vertical;min-height:120px;line-height:1.5}.form-hint{font-size:.8rem;color:var(--text-tertiary);margin-top:.375rem}.form-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23ffffff' d='M6 8L1 3h10z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .75rem center;padding-right:2.25rem}[data-theme=dark] .form-select{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23111111' d='M6 8L1 3h10z'/%3E%3C/svg%3E")}.card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:1.5rem}.card+.card{margin-top:1rem}.card-highlight{animation:hap-card-highlight 2.4s ease-out 1}@keyframes hap-card-highlight{0%{box-shadow:0 0 0 2px var(--accent),0 0 24px var(--accent-subtle);border-color:var(--accent)}60%{box-shadow:0 0 0 2px var(--accent),0 0 24px var(--accent-subtle);border-color:var(--accent)}to{box-shadow:0 0 0 0 transparent,0 0 0 transparent;border-color:var(--border)}}@media(prefers-reduced-motion:reduce){.card-highlight{animation:none;border-color:var(--accent)}}.card-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1rem}.card-title{font-size:1rem;font-weight:600;margin:0}.auth-card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:1.25rem;transition:opacity .2s,border-color .2s;cursor:pointer}.auth-card:hover{border-color:var(--accent)}.auth-card+.auth-card{margin-top:.75rem}.auth-card.expired{opacity:.5}.auth-card-header{display:flex;align-items:center;gap:.75rem;margin-bottom:.5rem;flex-wrap:wrap}.auth-card-path{font-weight:600;font-size:.95rem}.auth-card-time{font-size:.8rem;color:var(--text-tertiary);margin-left:auto}.success-card{background:var(--accent-subtle);border:1px solid var(--accent);border-radius:.75rem;padding:1.5rem;text-align:center}.success-card-title{font-size:1.1rem;font-weight:700;color:var(--accent);margin-bottom:.5rem}.success-card-hash{font-family:SF Mono,Monaco,monospace;font-size:.8rem;color:var(--text-secondary);word-break:break-all;margin-bottom:.5rem}.status-badge{display:inline-block;padding:.2rem .6rem;border-radius:9999px;font-size:.7rem;font-weight:600;letter-spacing:.03em;text-transform:uppercase}.status-badge{border:1px solid transparent}.status-active{background:var(--neutral-subtle);color:var(--text-primary);border-color:var(--border)}.status-pending{background:var(--neutral);color:var(--bg-elevated);border-color:var(--neutral)}.status-pending:before{content:"○ "}.status-expired,.status-revoked,.status-refused,.status-failed{background:transparent;color:var(--text-primary);border:2px solid var(--text-primary)}.status-expired{color:var(--text-muted)}.status-expired:before,.status-revoked:before,.status-refused:before,.status-failed:before{content:"✕ "}.status-change-needed{background:transparent;color:var(--text-primary);border:1px dashed var(--text-primary)}.status-change-needed:before{content:"! "}.status-replaced,.status-passed{background:transparent;color:var(--text-primary);border-color:var(--border)}.status-replaced:before,.status-passed:before{content:"✓ "}.int-chip{display:inline-flex;align-items:center;gap:.4rem;padding:.2rem .6rem;border-radius:9999px;font-size:.7rem;font-weight:600;letter-spacing:.03em;text-transform:uppercase}.int-chip .int-dot{width:6px;height:6px;border-radius:50%;flex:none}.int-chip-ok{background:var(--neutral-subtle);color:var(--text-primary)}.int-chip-ok .int-dot{background:var(--text-primary)}.int-chip-bad{background:transparent;color:var(--text-primary);border:2px solid var(--text-primary)}.int-chip-bad .int-dot{display:none}.int-chip-bad:before{content:"✕"}.int-chip-idle{background:var(--accent-subtle);color:var(--text-muted)}.int-chip-idle .int-dot{background:var(--text-muted)}.int-chip-sim{background:transparent;color:var(--text-primary);border:1px dashed var(--text-primary)}.int-chip-sim .int-dot{background:transparent;border:1px dashed var(--text-primary)}.int-chip-paused{background:var(--bg-main);color:var(--text-muted);border:1px solid var(--border)}.int-chip-paused .int-dot{background:var(--text-muted)}.int-details{border-top:1px solid var(--border);padding-top:.7rem;margin-top:.25rem}.int-details>summary{cursor:pointer;font-size:.78rem;color:var(--text-muted);list-style:none;display:flex;align-items:center;gap:.35rem;-webkit-user-select:none;user-select:none}.int-details>summary::-webkit-details-marker{display:none}.int-details>summary:before{content:"▸";font-size:.7rem;transition:transform .15s}.int-details[open]>summary:before{transform:rotate(90deg)}.int-meta{display:grid;grid-template-columns:auto 1fr;gap:.4rem 1rem;font-size:.8rem;margin-top:.7rem}.int-meta .int-k{color:var(--text-muted)}.int-account{font-size:.85rem;display:flex;align-items:center;gap:.5rem}.int-account .int-none{color:var(--text-muted);font-style:italic}.domain-badge{display:inline-block;padding:.2rem .5rem;font-size:.8rem;font-family:SF Mono,Monaco,monospace;background:var(--bg-main);border:1px solid var(--border);border-radius:.25rem;color:var(--text-secondary)}.domain-attested{color:var(--accent);border-color:var(--accent)}.domain-missing{color:var(--text-tertiary)}.profile-badge{display:inline-block;padding:.15rem .5rem;font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.03em;background:var(--accent-subtle);color:var(--accent);border-radius:.25rem}.id-card{display:flex;align-items:stretch;padding:0;overflow:hidden}.id-rail{flex:0 0 5.5rem;width:5.5rem;box-sizing:border-box;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.4rem;padding:1rem .4rem;text-align:center}.id-rail-icon{width:1.6rem;height:1.6rem;color:var(--text-secondary);flex:none}.id-rail-name{max-width:100%;overflow-wrap:normal;word-break:keep-all;-webkit-hyphens:manual;hyphens:manual;font-size:.65rem;font-weight:700;color:var(--text-muted);line-height:1.25;text-transform:uppercase;letter-spacing:.02em}.id-sep{flex:0 0 1px;background:var(--border)}.id-body{flex:1 1 auto;min-width:0;padding:1rem 1.25rem}.id-body .auth-card-header,.id-body .receipt-head{margin-bottom:.25rem}@media(max-width:460px){.id-rail{flex-basis:4.25rem;width:4.25rem;padding:.75rem .25rem;gap:.2rem}.id-rail-icon{width:1.2rem;height:1.2rem}.id-rail-name{font-size:.5rem;letter-spacing:0}.id-body{padding:.85rem .9rem}}.profile-chip{display:inline-flex;align-items:center;gap:.45rem}.profile-chip-icon{width:1.15rem;height:1.15rem;flex:none;color:var(--text-secondary)}.sim-mark{display:inline-flex;align-items:center;gap:.3rem;font-size:.65rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:.15rem .45rem;border-radius:.25rem;background:transparent;color:var(--text-primary);border:1px dashed var(--text-primary)}.wizard-progress{display:flex;align-items:flex-start;gap:.75rem;margin-bottom:2.5rem}.wizard-steps{list-style:none;margin:0;padding:0;display:flex;flex:1;max-width:28rem}.wizard-step{flex:1;display:flex;flex-direction:column;align-items:center;position:relative;min-width:0}.wizard-step:not(:first-child):before{content:"";position:absolute;top:calc(1rem - 1px);height:2px;left:calc(-50% + 1.4rem);right:calc(50% + 1.4rem);background:var(--border)}.wizard-step.reached:before{background:var(--accent)}.step-circle{width:2rem;height:2rem;border-radius:50%;display:flex;align-items:center;justify-content:center;padding:0;font-family:inherit;font-size:.75rem;font-weight:600;border:2px solid var(--border);color:var(--text-tertiary);background:var(--bg-main);flex-shrink:0;transition:all .2s;cursor:default}.step-circle.completed{background:var(--accent);border-color:var(--accent);color:var(--text-on-accent);cursor:pointer}.step-circle:disabled{cursor:default}.step-circle.current{border-color:var(--accent);color:var(--accent);box-shadow:0 0 0 3px var(--focus-ring)}.step-label-text{margin-top:.4rem;font-size:.65rem;line-height:1.2;text-align:center;color:var(--text-tertiary)}.step-label-text.completed{color:var(--text-secondary)}.step-label-text.current{color:var(--accent);font-weight:600}.wizard-cancel{flex-shrink:0;font-size:.8rem;margin-top:.15rem;margin-left:auto}.alert{padding:.75rem 1rem;border-radius:.5rem;font-size:.875rem;margin-bottom:1rem;background:var(--bg-elevated);color:var(--text-primary);border:1px solid var(--border)}.alert-error{border:2px solid var(--border-strong);font-weight:600}.alert-error:before{content:"✕ "}.alert-success:before{content:"✓ "}.nav-tabs{display:flex;gap:0;border-bottom:1px solid var(--border);margin-bottom:1.5rem}.nav-tab{padding:.75rem 1.25rem;font-size:.9rem;font-weight:500;color:var(--text-tertiary);background:none;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:color .2s;margin-bottom:-1px;font-family:inherit}.nav-tab:hover{color:var(--text-primary)}.nav-tab.active{color:var(--accent);border-bottom-color:var(--accent);font-weight:600}.review-grid{display:grid;grid-template-columns:auto 1fr;gap:.5rem 1rem;font-size:.9rem;margin-bottom:1.5rem}.review-grid dt{font-weight:600;color:var(--text-secondary);padding:.25rem 0}.review-grid dd{color:var(--text-primary);padding:.25rem 0}.gate-content-block{background:var(--bg-main);border:1px solid var(--border);border-radius:.5rem;padding:1rem;font-size:.875rem;margin-bottom:1.5rem}.gate-content-item{margin-bottom:.5rem}.gate-content-item:last-child{margin-bottom:0}.gate-content-label{font-weight:600;color:var(--text-secondary);font-size:.75rem;text-transform:uppercase;letter-spacing:.04em;margin-bottom:.125rem}.gate-content-text{color:var(--text-primary);line-height:1.5}.empty-state{text-align:center;padding:3rem 1.5rem;color:var(--text-tertiary)}.empty-state-icon{font-size:2.5rem;margin-bottom:.75rem;opacity:.5}.empty-state-title{font-size:1rem;font-weight:600;color:var(--text-secondary);margin-bottom:.25rem}.empty-state-text{font-size:.875rem;color:var(--text-tertiary);margin-bottom:1rem;max-width:28rem;margin-left:auto;margin-right:auto}.login-split{margin-top:var(--nav-height);display:flex;min-height:calc(100vh - var(--nav-height))}.login-split-left{flex:1;background:var(--bg-main);display:flex;align-items:center;justify-content:center;padding:4rem 3rem}.login-split-right{flex:1;background:var(--bg-elevated);border-left:1px solid var(--border);display:flex;align-items:center;justify-content:center;padding:4rem 3rem}.login-page{display:flex;align-items:center;justify-content:center;min-height:calc(100vh - var(--nav-height));padding:2rem}.login-card{width:100%;max-width:420px}.login-header{text-align:center;margin-bottom:2rem}.login-title{font-size:1.5rem;font-weight:700;margin-bottom:.5rem}.login-subtitle{font-size:.9rem;color:var(--text-secondary);line-height:1.5}.login-divider{display:flex;align-items:center;gap:.75rem;margin:1.5rem 0;font-size:.8rem;color:var(--text-tertiary)}.login-divider:before,.login-divider:after{content:"";flex:1;height:1px;background:var(--border)}.onboarding-card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:2rem;max-width:32rem;margin:0 auto}.onboarding-step{display:flex;gap:1rem;margin-bottom:1.25rem}.onboarding-step:last-child{margin-bottom:0}.onboarding-num{width:1.75rem;height:1.75rem;border-radius:50%;background:var(--accent);color:var(--text-on-accent);display:flex;align-items:center;justify-content:center;font-size:.75rem;font-weight:700;flex-shrink:0;margin-top:.1rem}.onboarding-num.done{background:var(--accent)}.onboarding-text h4{font-size:.9rem;margin-bottom:.125rem}.onboarding-text p{font-size:.825rem;color:var(--text-secondary);line-height:1.5}.selection-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(14rem,1fr));gap:.75rem;margin-bottom:1.5rem}.selection-card{background:var(--bg-elevated);border:2px solid var(--border);border-radius:.75rem;padding:1.25rem;cursor:pointer;transition:all .15s}.selection-card:hover{border-color:var(--accent);transform:translateY(-1px);box-shadow:var(--elevation-2)}.selection-card.selected{border-color:var(--accent);background:var(--accent-subtle)}.selection-card-title{font-size:1rem;font-weight:600;margin-bottom:.25rem}.selection-card-subtitle{font-size:.8rem;color:var(--text-secondary);margin-bottom:.5rem}.selection-card-id{font-size:.7rem;color:var(--text-tertiary);margin-bottom:.375rem;word-break:break-all}.selection-card-meta{display:flex;gap:.375rem;flex-wrap:wrap}.dashboard-section{margin-bottom:2rem}.section-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem}.section-title{font-size:1rem;font-weight:600}.section-count{font-size:.8rem;color:var(--text-tertiary)}.ttl-badge{display:inline-flex;align-items:center;gap:.25rem;font-size:.75rem;font-weight:600;padding:.2rem .5rem;border-radius:.25rem;font-family:SF Mono,Monaco,monospace}.ttl-ok{background:var(--accent-subtle);color:var(--accent)}.ttl-warn{background:transparent;color:var(--text-primary);border:1px dashed var(--text-primary)}.quick-actions{display:grid;grid-template-columns:repeat(auto-fill,minmax(16rem,1fr));gap:.75rem;margin-bottom:2rem}.quick-action-card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:1.25rem;cursor:pointer;transition:all .15s;display:flex;align-items:flex-start;gap:.875rem;text-decoration:none;color:inherit}.quick-action-card:hover{border-color:var(--accent);transform:translateY(-1px);box-shadow:var(--elevation-2);text-decoration:none}.quick-action-icon{width:2.5rem;height:2.5rem;border-radius:.5rem;background:var(--accent-subtle);color:var(--accent);display:flex;align-items:center;justify-content:center;font-size:1.25rem;flex-shrink:0}.quick-action-title{font-size:.9rem;font-weight:600;margin-bottom:.125rem}.quick-action-desc{font-size:.8rem;color:var(--text-secondary)}.pr-card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:1.25rem;cursor:pointer;transition:border-color .15s}.pr-card:hover{border-color:var(--accent)}.pr-card+.pr-card{margin-top:.75rem}.pr-card-header{display:flex;align-items:center;gap:.5rem;margin-bottom:.375rem}.pr-card-repo{font-size:.75rem;color:var(--text-tertiary);font-family:SF Mono,Monaco,monospace}.pr-card-title{font-weight:600;font-size:.95rem}.pr-card-footer{display:flex;align-items:center;gap:.75rem;margin-top:.5rem;flex-wrap:wrap}.member-row{display:flex;align-items:center;gap:.75rem;padding:.75rem 0;border-bottom:1px solid var(--border)}.member-row:last-child{border-bottom:none}.member-avatar{width:2rem;height:2rem;border-radius:50%;background:var(--accent-subtle);color:var(--accent);display:flex;align-items:center;justify-content:center;font-size:.75rem;font-weight:700;flex-shrink:0}.member-info{flex:1}.member-name{font-size:.9rem;font-weight:600}.member-email{font-size:.75rem;color:var(--text-tertiary)}.member-domains{display:flex;gap:.25rem;flex-wrap:wrap}.char-counter{text-align:right;font-size:.75rem;color:var(--text-tertiary);margin-top:.25rem}.invite-input-row{display:flex;gap:.5rem}.invite-input-row .form-input{flex:1}.service-card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:1.25rem;display:flex;align-items:center;gap:1rem;transition:border-color .15s}.service-card:hover{border-color:var(--accent)}.service-card+.service-card{margin-top:.75rem}.service-icon{width:2.75rem;height:2.75rem;border-radius:.625rem;display:flex;align-items:center;justify-content:center;font-size:1.25rem;flex-shrink:0}.service-icon-configured{background:var(--neutral-subtle);color:var(--text-primary)}.service-icon-missing{background:var(--bg-main);color:var(--text-tertiary);border:1px dashed var(--border)}.service-icon-error{background:transparent;color:var(--text-primary);border:2px solid var(--text-primary)}.service-info{flex:1}.service-name{font-size:.95rem;font-weight:600;margin-bottom:.125rem}.service-desc{font-size:.8rem;color:var(--text-secondary);margin-bottom:.375rem}.service-status{display:inline-flex;align-items:center;gap:.375rem;font-size:.75rem;font-weight:600}.service-status-dot{width:6px;height:6px;border-radius:50%}.service-status-connected .service-status-dot{background:var(--text-primary)}.service-status-connected{color:var(--text-primary)}.service-status-missing .service-status-dot{background:var(--text-tertiary)}.service-status-missing{color:var(--text-tertiary)}.service-status-error .service-status-dot{background:transparent;border:2px solid var(--text-primary)}.service-status-error{color:var(--text-primary)}.service-tools{display:flex;gap:.25rem;flex-wrap:wrap;margin-top:.25rem}.service-tool-badge{display:inline-block;padding:.1rem .4rem;font-size:.65rem;font-family:SF Mono,Monaco,monospace;background:var(--bg-main);border:1px solid var(--border);border-radius:.25rem;color:var(--text-tertiary)}.modal-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;background:color-mix(in srgb,var(--bg-main) 70%,transparent);z-index:1500;display:flex;align-items:center;justify-content:center}.modal{background:var(--bg-elevated);border-radius:.75rem;width:100%;max-width:32rem;max-height:calc(100vh - 4rem);overflow-y:auto;box-shadow:var(--elevation-3)}.modal-header{padding:1.5rem 1.5rem 0;display:flex;justify-content:space-between;align-items:flex-start}.modal-title{font-size:1.125rem;font-weight:700}.modal-close{width:2rem;height:2rem;background:none;border:none;cursor:pointer;color:var(--text-tertiary);font-size:1.25rem;display:flex;align-items:center;justify-content:center;border-radius:.375rem}.modal-close:hover{background:var(--bg-main);color:var(--text-primary)}.modal-body{padding:1.25rem 1.5rem}.modal-footer{padding:0 1.5rem 1.5rem;display:flex;gap:.5rem;justify-content:flex-end}.status-banner{padding:.625rem 1rem;font-size:.8rem;display:flex;align-items:center;gap:.5rem;border-radius:.5rem;margin-bottom:1rem}.status-banner-warn{background:var(--accent-subtle);color:var(--accent-hover);border:1px solid var(--accent)}.status-banner-error{background:var(--bg-elevated);color:var(--text-primary);border:2px solid var(--border-strong);font-weight:600}.status-banner-success{background:var(--bg-elevated);color:var(--text-primary);border:1px solid var(--border)}.status-banner-icon{font-size:1rem;flex-shrink:0}.status-banner-text{flex:1}.status-banner a{font-weight:600}.vault-progress{display:flex;flex-direction:column;align-items:center;gap:.75rem;padding:1.5rem 0}.vault-spinner{width:2rem;height:2rem;border:3px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.vault-progress-text{font-size:.875rem;color:var(--text-secondary)}.service-health-row{display:flex;align-items:center;gap:.75rem;padding:.625rem 0;border-bottom:1px solid var(--border);font-size:.85rem}.service-health-row:last-child{border-bottom:none}.service-health-indicator{width:8px;height:8px;border-radius:50%;flex-shrink:0}.service-health-indicator.connected{background:var(--text-primary)}.service-health-indicator.missing{background:var(--text-tertiary)}.service-health-indicator.error{background:transparent;border:2px solid var(--text-primary)}.service-health-name{font-weight:600;flex:1}.service-health-detail{font-size:.75rem;color:var(--text-tertiary)}.cred-field{position:relative}.cred-field .form-input{padding-right:3rem}.cred-toggle{position:absolute;right:.5rem;top:50%;transform:translateY(-50%);background:none;border:none;font-size:.75rem;color:var(--text-tertiary);cursor:pointer;padding:.25rem}.cred-toggle:hover{color:var(--accent)}.context-strip{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.5rem;padding:.625rem 1rem;margin-bottom:1.5rem;display:flex;align-items:center;gap:.75rem;font-size:.8rem}.context-strip-label{font-weight:600;color:var(--text-secondary)}.timeline{position:relative;padding-left:2rem}.timeline:before{content:"";position:absolute;left:.5rem;top:0;bottom:0;width:2px;background:var(--border)}.timeline-event{position:relative;margin-bottom:1.5rem}.timeline-event:before{content:"";position:absolute;left:-1.625rem;top:.5rem;width:10px;height:10px;border-radius:50%;background:var(--accent);border:2px solid var(--bg-main)}.timeline-event.expired:before{background:var(--text-tertiary)}.error-message{padding:.75rem 1rem;background:var(--bg-elevated);border:2px solid var(--border-strong);border-radius:.5rem;color:var(--text-primary);font-weight:600;font-size:.875rem;margin-bottom:1rem}.mobile-menu-btn{display:none;width:2.25rem;height:2.25rem;background:none;border:1px solid var(--border);border-radius:.375rem;cursor:pointer;color:var(--text-secondary);font-size:1.1rem;align-items:center;justify-content:center;font-family:inherit}.mobile-menu-btn:hover{color:var(--accent);border-color:var(--accent)}.mobile-menu-backdrop{display:none;position:fixed;top:0;right:0;bottom:0;left:0;background:color-mix(in srgb,var(--bg-main) 70%,transparent);z-index:2000}.mobile-menu-panel{display:none;position:fixed;top:0;right:0;bottom:0;width:16rem;background:var(--bg-elevated);border-left:1px solid var(--border);z-index:2001;flex-direction:column;overflow-y:auto}.mobile-menu-header{padding:1.25rem 1rem;border-bottom:1px solid var(--border);display:flex;flex-direction:column;gap:.25rem}.mobile-menu-nav{flex:1;padding:.5rem;display:flex;flex-direction:column}.mobile-menu-item{display:flex;align-items:center;gap:.625rem;padding:.5rem .75rem;margin-bottom:.125rem;border-radius:.375rem;font-size:.85rem;color:var(--text-secondary);text-decoration:none;transition:background .15s,color .15s}.mobile-menu-item:hover{background:var(--accent-subtle);color:var(--text-primary)}.mobile-menu-item.active{background:var(--accent-subtle);color:var(--accent);font-weight:600}.mobile-menu-item .icon{width:1.125rem;text-align:center;font-size:.9rem;flex-shrink:0}.mobile-menu-footer{padding:.75rem 1rem;border-top:1px solid var(--border);display:flex;flex-direction:column;gap:.25rem}.mobile-menu-action{display:flex;align-items:center;gap:.625rem;padding:.5rem .75rem;border-radius:.375rem;font-size:.85rem;color:var(--text-secondary);background:none;border:none;cursor:pointer;font-family:inherit;text-align:left}.mobile-menu-action:hover{background:var(--accent-subtle);color:var(--text-primary)}.mobile-menu-action .icon{width:1.125rem;text-align:center;font-size:.9rem;flex-shrink:0}@media(max-width:768px){.sidebar{display:none}.main-content{margin-left:0}.quick-actions,.selection-grid{grid-template-columns:1fr}.nav-actions-desktop,.step-label-text{display:none}.mobile-menu-btn{display:flex}.mobile-menu-backdrop{display:block}.mobile-menu-panel{display:flex}.login-split{flex-direction:column;min-height:auto}.login-split-left{padding:3rem 1.5rem;align-items:flex-start}.login-split-right{max-width:none;border-left:none;border-top:1px solid var(--border);padding:2.5rem 1.5rem}}.update-banner{position:fixed;top:var(--nav-height);left:0;right:0;z-index:900;background:var(--bg-elevated);color:var(--text-primary);border-top:2px dashed var(--text-primary);border-bottom:2px dashed var(--text-primary);padding:.6rem 1.25rem;display:flex;flex-direction:column;gap:.6rem}.update-banner-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;min-width:0}.update-banner-cmd-row{flex-wrap:wrap}.update-banner-text{font-size:.9rem;font-weight:600;color:var(--text-primary)}.update-banner-text:before{content:"! "}.update-banner-cmd{display:block;flex:1;min-width:0;font-size:.78rem;padding:.5rem .75rem;word-break:break-all;white-space:pre-wrap;background:var(--bg-main);border:1px solid var(--border-strong);border-radius:.375rem;font-family:var(--font-mono);color:var(--text-primary);-webkit-user-select:all;user-select:all}.update-banner-hint{margin:0;font-size:.8rem;color:var(--text-muted)}.update-banner-x{background:transparent;border:none;color:var(--text-muted);cursor:pointer;font-size:1.15rem;line-height:1;padding:0 .25rem}.update-banner-x:hover{color:var(--text-primary)}.update-banner.is-managed{border-top:1px solid var(--border);border-bottom:1px solid var(--border)}.update-banner.is-managed .update-banner-text:before{content:none}.update-banner.is-live{border-top:1px solid var(--border);border-bottom:1px solid var(--border)}.update-banner.is-live .update-banner-text:before{content:"✓ "}.simulation-banner{position:fixed;top:calc(var(--nav-height) + var(--update-banner-h, 0px));left:0;right:0;z-index:899;background:var(--bg-elevated);color:var(--text-primary);border-top:2px dashed var(--text-primary);border-bottom:2px dashed var(--text-primary);padding:.6rem 1.25rem;text-align:center}.simulation-banner-text{font-size:.9rem;font-weight:600}.it-locked-badge{display:inline-flex;align-items:center;gap:.3rem;font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--text-secondary);background:var(--accent-subtle);border:1px solid var(--border);border-radius:999px;padding:.2rem .55rem;white-space:nowrap}.it-locked-badge .lock-icon{font-size:.75rem}body.is-updating .top-nav,body.is-updating .sidebar,body.is-updating .main-content,body.is-updating .update-banner,body.is-updating .simulation-banner{filter:blur(5px);pointer-events:none;-webkit-user-select:none;user-select:none}.update-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:2000;display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--bg-main) 70%,transparent);padding:1rem}.update-overlay-card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:1rem;padding:2rem 2.25rem;max-width:460px;width:100%;text-align:center;box-shadow:var(--elevation-3)}.update-overlay-card h2{margin:0 0 .6rem;font-size:1.15rem}.update-overlay-card p{margin:0 0 .5rem;font-size:.88rem;color:var(--text-muted);line-height:1.55}.update-spinner{width:2.25rem;height:2.25rem;border:3px solid var(--border);border-top-color:var(--text-primary);border-radius:50%;margin:0 auto 1.1rem;animation:update-spin 1s linear infinite}@keyframes update-spin{to{transform:rotate(360deg)}}.update-cmd-row{display:flex;gap:.5rem;align-items:flex-start;margin:.9rem 0;text-align:left}.update-cmd{flex:1;min-width:0;font-size:.78rem;padding:.6rem .75rem;background:var(--bg-field);color:var(--text-field);border-radius:.45rem;font-family:SF Mono,Fira Code,Fira Mono,Menlo,Consolas,monospace;word-break:break-all;white-space:pre-wrap}.update-status{font-size:.8rem;color:var(--text-muted);margin:.4rem 0 1.1rem;display:flex;align-items:center;justify-content:center;gap:.4rem}.update-pulse{width:.55rem;height:.55rem;border-radius:50%;background:var(--text-primary);animation:update-pulse 1.2s ease infinite}@keyframes update-pulse{0%,to{opacity:.3}50%{opacity:1}}.update-overlay-actions{display:flex;gap:.6rem;justify-content:center}.search-filter-bar{display:flex;justify-content:flex-end;align-items:center;gap:.5rem;margin-bottom:.75rem}.search-input-wrap{flex:0 1 15rem;position:relative}.search-filter-bar .form-input.search-input{background:transparent;color:var(--text-primary);border:1px solid var(--border);height:2rem;font-size:var(--text-body-sm)}.search-filter-bar .form-input.search-input:focus{border-color:var(--text-primary);box-shadow:none}.search-filter-bar .form-input.search-input::placeholder{color:var(--text-muted)}.tickets-toolbar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--space-2) var(--space-4);margin:var(--space-4) 0 var(--space-3);padding-bottom:var(--space-3);border-bottom:1px solid var(--border)}.tickets-toolbar .ftabs{margin:0;padding-bottom:0;border-bottom:none}.tickets-toolbar .search-filter-bar{margin-bottom:0;flex:0 1 20rem}.tickets-toolbar .search-input-wrap{flex:1 1 auto}.search-icon{position:absolute;left:.6rem;top:50%;transform:translateY(-50%);color:var(--text-tertiary);font-size:1rem;pointer-events:none}.search-input{padding-left:1.9rem!important;padding-right:2rem!important}.search-clear{position:absolute;right:.5rem;top:50%;transform:translateY(-50%);background:none;border:none;color:var(--text-tertiary);font-size:1.1rem;cursor:pointer;padding:.25rem;line-height:1}.search-clear:hover{color:var(--text-primary)}.filter-panel{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.5rem;padding:1rem;margin-bottom:.75rem;display:flex;flex-direction:column;gap:.75rem}.filter-section{display:flex;align-items:baseline;gap:.75rem}.filter-label{font-size:.75rem;font-weight:600;color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.04em;min-width:5rem;flex-shrink:0}.filter-chips{display:flex;flex-wrap:wrap;gap:.375rem}.filter-chip{font-family:inherit;font-size:.8rem;padding:.3rem .625rem;border-radius:1rem;border:1px solid var(--border);background:var(--bg-main);color:var(--text-secondary);cursor:pointer;transition:all .15s}.filter-chip:hover{border-color:var(--accent);color:var(--text-primary)}.filter-chip.selected{background:var(--accent-subtle);border-color:var(--accent);color:var(--accent);font-weight:600}.active-filters{display:flex;flex-wrap:wrap;align-items:center;gap:.375rem;margin-bottom:.75rem}.active-chip{display:inline-flex;align-items:center;gap:.25rem;font-size:.75rem;padding:.2rem .5rem;border-radius:1rem;background:var(--accent-subtle);color:var(--accent);cursor:pointer;transition:background .15s}.active-chip:hover{background:var(--accent);color:var(--bg-elevated)}.chip-remove{font-size:.85rem;line-height:1}.clear-filters{font-family:inherit;font-size:.75rem;color:var(--text-tertiary);background:none;border:none;cursor:pointer;padding:.2rem 0}.clear-filters:hover{color:var(--text-primary)}.receipt-action{display:inline-block;font-size:.75rem;font-weight:600;padding:.15rem .5rem;border-radius:1rem;background:var(--bg-main);border:1px solid var(--border);color:var(--text-secondary);font-family:SF Mono,Monaco,monospace}.bounds-section,.context-section{background:var(--bg-elevated);border:2px solid var(--border-strong);border-radius:.75rem;padding:1.25rem;margin-bottom:1.25rem;transition:border-color .15s}.bounds-section:hover,.bounds-section:focus-within,.context-section:hover,.context-section:focus-within{border-color:var(--accent-hover)}.bounds-section-header{display:flex;align-items:flex-start;gap:.625rem;margin-bottom:1rem}.bounds-section-icon{font-size:1.1rem;flex-shrink:0;margin-top:.1rem}.bounds-section-title{font-size:.9rem;font-weight:700;color:var(--text-primary)}.bounds-section-subtitle{font-size:.75rem;color:var(--text-tertiary)}.bounds-fields-grid{display:flex;flex-direction:column;gap:.75rem}.bounds-field-row{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:1rem;width:100%}.bounds-field-label{flex:1;min-width:0}.bounds-field-label .form-label{display:inline;margin-bottom:0}.bounds-field-input{flex-shrink:0;display:flex;flex-direction:column;align-items:flex-end}.bounds-field-input .bounded-input{align-items:flex-end}.bounds-field-input .bounded-input-presets{justify-content:flex-end}.bounds-field-label-inline{display:flex;align-items:center;gap:.375rem;margin-bottom:.375rem}.bounds-field-label-inline .form-label{margin-bottom:0}.field-info-toggle{display:inline-flex;align-items:center;justify-content:center;width:1.125rem;height:1.125rem;border-radius:50%;border:1px solid var(--border);background:var(--bg-main);color:var(--text-tertiary);font-size:.65rem;font-weight:700;cursor:pointer;flex-shrink:0;transition:color .15s,border-color .15s;font-family:inherit;line-height:1;padding:0}.field-info-toggle:hover{color:var(--accent);border-color:var(--accent)}.field-description{margin-top:.25rem;margin-bottom:.25rem}@media(max-width:768px){.bounds-field-row{flex-direction:column;gap:.375rem}}.cap-note{display:block;font-size:.72rem;line-height:1.4}.cap-note.hard{color:var(--text-primary);font-weight:700}.cap-note.soft{color:var(--text-primary)}.cap-note.soft:before{content:"! ";font-weight:700}.bounded-input{display:flex;flex-direction:column;align-items:flex-start;gap:.375rem}.bounded-input-field{display:inline-flex;align-items:stretch;border:1px solid var(--border-field);border-radius:.5rem;overflow:hidden;background:var(--bg-field);color:var(--text-field)}.stepper-btn{display:flex;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;background:transparent;border:none;cursor:pointer;font-size:1.1rem;font-weight:600;color:var(--text-field);font-family:inherit;flex-shrink:0;transition:background .15s}.stepper-btn:hover:not(:disabled){background:var(--placeholder-field)}.stepper-btn:disabled{opacity:.35;cursor:not-allowed}.stepper-input{width:4.5rem;text-align:center;border:none;border-left:1px solid var(--placeholder-field);border-right:1px solid var(--placeholder-field);padding:.5rem .25rem;font-size:.9rem;font-family:inherit;color:var(--text-field);background:var(--bg-field);outline:none;-moz-appearance:textfield}.stepper-input::-webkit-outer-spin-button,.stepper-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.stepper-input:focus{box-shadow:inset 0 0 0 2px var(--field-focus-ring)}.bounded-input-unit{display:inline-flex;align-items:center;padding:0 .75rem;font-size:.8rem;color:var(--text-field);opacity:.7;white-space:nowrap;-webkit-user-select:none;user-select:none;background:transparent}.bounded-input-presets{display:flex;flex-wrap:wrap;gap:.25rem}.preset-chip{font-family:inherit;font-size:.75rem;padding:.2rem .625rem;border:1px solid var(--border);border-radius:999px;background:transparent;color:var(--text-secondary);cursor:pointer;transition:background .15s,color .15s,border-color .15s}.preset-chip:hover{background:var(--accent-subtle);color:var(--accent);border-color:var(--accent)}.preset-chip-selected{background:var(--accent);color:var(--bg-main);border-color:var(--accent)}.bounded-input-echo{font-size:.75rem;color:var(--text-secondary);font-style:italic}.field-label-with-tip{display:inline-flex;align-items:center;gap:.375rem;position:relative}.field-tip-trigger{display:inline-flex;align-items:center;justify-content:center;width:1.125rem;height:1.125rem;border-radius:999px;border:1px solid var(--border);background:transparent;color:var(--text-secondary);font-size:.7rem;font-style:italic;font-family:serif;font-weight:600;line-height:1;cursor:help;padding:0}.field-tip-trigger:hover,.field-tip-trigger[aria-expanded=true]{border-color:var(--accent);color:var(--accent)}.field-tip-bubble{position:absolute;top:calc(100% + .375rem);left:0;z-index:10;width:max-content;max-width:22rem;padding:.5rem .75rem;background:var(--bg-elevated);border:1px solid var(--border);border-radius:.375rem;font-size:.8rem;color:var(--text-primary);line-height:1.45;box-shadow:var(--elevation-2);pointer-events:none}.tag-input{display:flex;flex-wrap:wrap;align-items:center;gap:.375rem;padding:.375rem .5rem;background:var(--bg-field);border:1px solid var(--border-field);border-radius:.5rem;cursor:text;min-height:2.5rem;transition:box-shadow .2s,border-color .2s;color:var(--text-field)}.tag-input:focus-within{box-shadow:0 0 0 3px var(--field-focus-ring)}.tag-input-invalid,.tag-input-invalid:focus-within{box-shadow:0 0 0 2px var(--bg-elevated),0 0 0 4px var(--text-primary)}.tag-pill{display:inline-flex;align-items:center;gap:.25rem;font-size:.8rem;padding:.2rem .5rem;border-radius:1rem;background:var(--placeholder-field);color:var(--text-field);font-weight:500;white-space:nowrap}.tag-remove{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;font-size:.9rem;line-height:1;color:var(--text-field);cursor:pointer;padding:0;margin-left:.125rem;opacity:.7;transition:opacity .15s}.tag-remove:hover{opacity:1}.tag-input-field{flex:1;min-width:8rem;border:none;outline:none;background:transparent;font-size:.875rem;font-family:inherit;color:var(--text-field);padding:.2rem 0}.tag-input-field::placeholder{color:var(--placeholder-field);opacity:1}.checkbox-group{display:flex;flex-wrap:wrap;gap:.5rem}.checkbox-pill{display:inline-flex;align-items:center;gap:.35rem;font-size:.85rem;padding:.35rem .75rem;border-radius:1rem;border:1px solid var(--border);background:var(--bg-main);color:var(--text-secondary);cursor:pointer;transition:all .15s;-webkit-user-select:none;user-select:none}.checkbox-pill input[type=checkbox]{display:none}.checkbox-pill:hover{border-color:var(--accent);color:var(--text-primary)}.checkbox-pill-selected{background:var(--btn-primary-bg);border-color:var(--btn-primary-bg);color:var(--btn-primary-fg);font-weight:500}.checkbox-pill-selected:hover{background:var(--btn-primary-bg-hover);border-color:var(--btn-primary-bg-hover);color:var(--btn-primary-fg)}@keyframes hap-skeleton-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton{display:block;position:relative;border-radius:.375rem;background-color:var(--bg-main);background-image:linear-gradient(90deg,transparent 0%,color-mix(in srgb,var(--text-primary) 3%,transparent) 20%,color-mix(in srgb,var(--text-primary) 8%,transparent) 50%,color-mix(in srgb,var(--text-primary) 3%,transparent) 80%,transparent 100%);background-size:200% 100%;background-repeat:no-repeat;animation:hap-skeleton-shimmer 1.6s ease-in-out infinite;will-change:background-position}.skeleton-title{height:1.5rem;width:3rem;margin:0 auto}.skeleton-line{height:.75rem;width:100%}.skeleton-line-sm{height:.65rem;width:60%}.skeleton-card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.5rem;padding:.75rem 1rem;box-shadow:var(--elevation-1);display:flex;align-items:center;gap:.75rem}.skeleton-dot{width:.5rem;height:.5rem;border-radius:50%;flex-shrink:0}@media(prefers-reduced-motion:reduce){.skeleton{animation:none;background-image:none}}.intent-layout{display:grid;grid-template-columns:minmax(320px,1fr) minmax(420px,1.4fr);gap:1.25rem;align-items:start}.intent-layout.no-chat{grid-template-columns:minmax(0,1fr);max-width:56rem}.intent-ai-hint{margin:.5rem 0 0;font-size:.8rem;color:var(--text-tertiary)}.intent-pane.chat{display:flex;flex-direction:column;gap:.75rem;position:sticky;top:1rem;align-self:start;max-height:calc(100vh - 4rem)}.intent-pane.document{display:flex;flex-direction:column;gap:.875rem}.intent-pane .card-title{font-size:1.25rem;margin:0 0 1rem}.intent-textarea{width:100%;background:var(--bg-field);border:1px solid var(--border-field);border-radius:.5rem;padding:.625rem .75rem;color:var(--text-field);font-size:.9rem;line-height:1.5;resize:vertical;min-height:22rem;outline:none;font-family:inherit;transition:box-shadow .15s}.intent-textarea:focus{box-shadow:0 0 0 3px var(--field-focus-ring)}.intent-textarea::placeholder{color:var(--placeholder-field);opacity:1}.intent-footer{display:flex;align-items:center;gap:.625rem;margin-top:.5rem}.intent-continue-btn{flex:1}.intent-chat{display:flex;flex-direction:column;gap:.75rem;flex:1;min-height:0}.intent-chat .chat-header{font-size:.72rem;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--text-muted)}.intent-chat .chat-messages{flex:1;overflow-y:auto;position:relative;display:flex;flex-direction:column;gap:1rem;padding:.25rem 0;min-height:14rem;max-height:32rem}.intent-chat .chat-msg{display:flex;max-width:100%}.intent-chat .chat-msg.assistant{justify-content:flex-start}.intent-chat .chat-msg.assistant .chat-msg-body{max-width:100%;color:var(--text-primary);font-size:.9rem;line-height:1.65;white-space:pre-wrap;word-break:break-word}.intent-chat .chat-msg.user{justify-content:flex-end}.intent-chat .chat-msg.user .chat-msg-body{max-width:85%;background:var(--bg-main);border:1px solid var(--border);border-radius:1.125rem;padding:.55rem .875rem;color:var(--text-primary);font-size:.9rem;line-height:1.55;white-space:pre-wrap;word-break:break-word}.intent-chat .chat-msg-prose{white-space:pre-wrap;word-break:break-word}.intent-chat .chat-msg-thinking{color:var(--text-muted);font-style:italic}.intent-chat .chat-fenced-block{display:block;background:var(--bg-elevated);border:1px solid var(--border);border-radius:.5rem;padding:.625rem .75rem;margin:.5rem 0;font-family:SF Mono,Monaco,Cascadia Code,monospace;font-size:.8rem;white-space:pre-wrap;color:var(--text-primary);line-height:1.55}.intent-chat .chat-apply-btn{margin-top:.5rem}.intent-chat .chat-composer{display:flex;flex-direction:column;gap:.375rem}.intent-chat .chat-composer-pill{display:flex;align-items:center;gap:.5rem;background:var(--bg-field);border:1px solid var(--border-field);border-radius:1.5rem;padding:.25rem .25rem .25rem 1rem;transition:box-shadow .15s;color:var(--text-field)}.intent-chat .chat-composer-pill:focus-within{box-shadow:0 0 0 3px var(--field-focus-ring)}.intent-chat .chat-input{flex:1;resize:none;background:transparent;border:none;padding:.5rem 0;color:var(--text-field);font-size:.9rem;line-height:1.4;outline:none;font-family:inherit;max-height:8rem;align-self:stretch}.intent-chat .chat-input::placeholder{color:var(--placeholder-field);opacity:1}.intent-chat .chat-send-btn{flex-shrink:0;width:2rem;height:2rem;border-radius:999px;background:var(--text-field);color:var(--bg-field);border:none;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font-size:1rem;font-weight:700;line-height:1;align-self:center;transition:opacity .15s,transform .1s}.intent-chat .chat-send-btn:hover:not(:disabled){opacity:.85}.intent-chat .chat-send-btn:active:not(:disabled){transform:scale(.95)}.intent-chat .chat-send-btn:disabled{opacity:.35;cursor:not-allowed}.intent-chat .chat-composer-hint{font-size:.72rem;color:var(--text-muted);padding-left:.5rem}.hint-box{display:flex;gap:.625rem;padding:.75rem .875rem;background:var(--bg-main);border:1px solid var(--border);border-left:3px solid var(--accent);border-radius:.5rem;font-size:.85rem;color:var(--text-primary);line-height:1.55;margin-top:.25rem}.hint-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:1.125rem;height:1.125rem;border-radius:999px;border:1px solid var(--accent);color:var(--accent);font-size:.7rem;font-style:italic;font-family:serif;font-weight:700;line-height:1;margin-top:.125rem}.hint-body{flex:1;min-width:0}.hint-head{font-weight:600;margin-bottom:.25rem}@media(max-width:1024px){.intent-layout{grid-template-columns:1fr}.intent-pane.chat{position:static;max-height:none}}@media(max-width:768px){.intent-layout>.intent-pane.chat{display:none}.floating-help{display:inline-flex}}.floating-help{display:none;align-items:center;gap:.5rem;position:fixed;bottom:1rem;right:1rem;z-index:5;background:var(--btn-primary-bg);color:var(--btn-primary-fg);border:2px solid var(--btn-primary-bg);border-radius:999px;padding:.625rem 1.125rem;font-weight:700;font-size:.85rem;cursor:pointer;font-family:inherit;box-shadow:var(--elevation-2)}.floating-help:hover{background:var(--btn-primary-bg-hover);border-color:var(--btn-primary-bg-hover)}.bottom-sheet{position:fixed;left:0;right:0;bottom:0;height:88vh;background:var(--bg-elevated);border-top:1px solid var(--border);border-radius:.75rem .75rem 0 0;z-index:11;padding:1rem 1rem 1.25rem;overflow-y:auto;display:flex;flex-direction:column;gap:.75rem;transform:translateY(100%);transition:transform .25s ease-out;box-shadow:var(--elevation-3);outline:none}.bottom-sheet.is-open{transform:translateY(0)}.bottom-sheet-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:color-mix(in srgb,var(--bg-main) 70%,transparent);z-index:10;opacity:0;pointer-events:none;transition:opacity .2s}.bottom-sheet-backdrop.is-open{opacity:1;pointer-events:auto}.bottom-sheet-handle{width:2.5rem;height:.25rem;background:var(--text-muted);border-radius:999px;margin:0 auto .5rem;flex-shrink:0}.bottom-sheet-close{position:absolute;top:.5rem;right:.875rem;background:transparent;border:none;color:var(--text-primary);cursor:pointer;font-size:1.5rem;line-height:1;font-family:inherit}@media(prefers-reduced-motion:reduce){.bottom-sheet,.bottom-sheet-backdrop{transition:none}}.field-editable{background:var(--bg-elevated);border:2px solid var(--border-strong);border-radius:.5rem;padding:.875rem 1rem;margin-bottom:1rem;transition:border-color .15s}.field-editable:hover,.field-editable:focus-within{border-color:var(--accent-hover)}.field-label{font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--text-tertiary);margin-bottom:.5rem;display:flex;align-items:center;gap:.35rem}.field-label .pen{opacity:.7;font-size:.75rem}.info-block{background:var(--bg-main);border-left:3px solid var(--border);border-radius:0 .375rem .375rem 0;padding:.75rem 1rem;margin-bottom:.75rem;font-size:.85rem;color:var(--text-secondary)}.info-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:.4rem}.info-title{font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--text-tertiary)}.info-edit{font-size:.72rem;color:var(--text-tertiary);text-decoration:underline;cursor:pointer;background:none;border:none;font-family:inherit;padding:0}.info-edit:hover{color:var(--accent-hover)}.info-kv{display:grid;grid-template-columns:max-content 1fr;gap:.15rem 1rem;margin:0}.info-kv dt{color:var(--text-tertiary)}.info-kv dd{margin:0;color:var(--text-secondary);word-break:break-word}.info-section-label{margin:1.25rem 0 .5rem;font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--text-tertiary)}.intent-pane.chat.tool{background:var(--bg-main);border:1px dashed var(--border)}.recent-blocks .card-header{margin-bottom:.35rem}.recent-blocks .rb-sub{color:var(--text-muted);font-size:.8rem;margin:0 0 1.1rem;line-height:1.45;max-width:36ch}.recent-blocks .rb-count,.attention .rb-count{flex:none;min-width:1.6rem;height:1.6rem;padding:0 .45rem;display:inline-flex;align-items:center;justify-content:center;font-size:.8rem;font-weight:600;font-variant-numeric:tabular-nums;background:var(--neutral);color:var(--bg-elevated);border-radius:var(--radius-pill)}.recent-blocks .rb-rows{display:flex;flex-direction:column}.recent-blocks .rb-row{display:grid;grid-template-columns:auto 1fr auto;gap:.75rem .85rem;align-items:start;padding:.85rem 0;border-top:1px solid var(--border)}.recent-blocks .rb-row:first-child{border-top:none}.recent-blocks .rb-dot{width:.5rem;height:.5rem;border-radius:var(--radius-circle);margin-top:.35rem;background:var(--text-primary)}.recent-blocks .rb-dot.info{background:var(--text-muted)}.recent-blocks .rb-body{min-width:0}.recent-blocks .rb-line{font-size:.86rem;line-height:1.4;color:var(--text-primary)}.recent-blocks .rb-line b{font-weight:600}.recent-blocks .rb-meta{display:flex;align-items:center;gap:.5rem;margin-top:.3rem;flex-wrap:wrap}.recent-blocks .rb-chip{font-size:.64rem;letter-spacing:.06em;text-transform:uppercase;font-weight:600;padding:.12rem .44rem;border-radius:.35rem;background:var(--accent-subtle);color:var(--text-muted)}.recent-blocks .rb-chip.warn{background:transparent;color:var(--text-primary);border:1px dashed var(--text-primary)}.recent-blocks .rb-chip.act{background:transparent;color:var(--text-primary);border:2px solid var(--text-primary)}.recent-blocks .rb-via{font-size:.72rem;color:var(--text-muted)}.recent-blocks .rb-when{font-size:.74rem;color:var(--text-muted);font-variant-numeric:tabular-nums;white-space:nowrap;text-align:right}.recent-blocks .rb-fix{display:inline-block;margin-top:.4rem;font-size:.76rem;color:var(--text-primary);text-underline-offset:2px}.recent-blocks .rb-foot{margin-top:1rem;padding-top:.9rem;border-top:1px solid var(--border)}.recent-blocks .rb-viewall{font:inherit;font-size:.8rem;color:var(--text-primary);background:none;border:none;padding:0;cursor:pointer;text-decoration:underline;text-underline-offset:3px}.recent-blocks .rb-empty,.all-clear{text-align:center;padding:1.25rem 1rem .25rem}.blocked-header{display:flex;align-items:baseline;justify-content:space-between;gap:1rem}.blocked-today{font-size:.85rem;color:var(--text-muted);white-space:nowrap}.blocked-list{display:flex;flex-direction:column}.blocked-row-head{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;margin-bottom:.2rem}.blocked-dot{width:.5rem;height:.5rem;border-radius:var(--radius-circle);flex:none;background:var(--text-primary)}.blocked-dot-simulation{background:var(--text-muted)}.blocked-item[data-seen=true] .blocked-dot{background:transparent;border:1.5px solid var(--text-primary)}.blocked-item[data-seen=true] .blocked-dot-simulation{border-color:var(--text-muted)}.blocked-title{font-weight:600;font-size:.92rem}.new-pill{font-size:.6rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:.1rem .4rem;border-radius:.25rem;background:var(--accent-subtle);color:var(--accent);flex:none}.blocked-when{margin-left:auto;font-size:.74rem;color:var(--text-muted);white-space:nowrap}.blocked-sentence{font-size:.86rem;color:var(--text-primary);line-height:1.4;margin-bottom:.3rem}.blocked-source{font-size:.74rem;color:var(--text-muted);line-height:1.5}.mandate-id{color:var(--text-muted);opacity:.65;font-size:.95em}.blocked-item details{margin-top:.4rem;font-size:.8rem}.blocked-item summary{cursor:pointer;color:var(--text-muted)}.blocked-advice{margin-top:.3rem;color:var(--text-secondary)}@media(max-width:460px){.blocked-when{margin-left:0;flex-basis:100%;order:3}}.attention .card-header{margin-bottom:.5rem}.attention-rows{display:flex;flex-direction:column}.attention-row{display:flex;align-items:center;gap:.75rem;padding:.7rem 0;border-top:1px solid var(--border);text-decoration:none;color:inherit}.attention-row:first-child{border-top:none}.attention-row:hover{background:var(--accent-subtle)}.attention-row:focus-visible{outline:2px solid var(--focus-ring);outline-offset:2px}.attention-dot{width:.5rem;height:.5rem;border-radius:50%;flex-shrink:0}.recent-blocks .rb-mark,.all-clear .rb-mark{width:2.25rem;height:2.25rem;border-radius:var(--radius-circle);background:var(--neutral-subtle);color:var(--text-primary);display:inline-flex;align-items:center;justify-content:center;margin-bottom:.75rem}.recent-blocks .rb-empty h3,.all-clear h3{font-size:.9rem;margin:0 0 .3rem}.recent-blocks .rb-empty p,.all-clear p{font-size:.8rem;color:var(--text-muted);margin:0 auto;max-width:30ch;line-height:1.45}.sim-paused-summary{display:flex;align-items:flex-start;gap:.6rem;color:var(--text-secondary);background:var(--bg-elevated);border:1px dashed var(--border);border-radius:.625rem;padding:.75rem 1rem;font-size:.82rem;line-height:1.5;margin-bottom:1.5rem}.sim-paused-summary-icon{flex-shrink:0}.sim-paused-summary b{color:var(--text-primary)}.int-group-label{font-size:.7rem;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--text-muted);margin:1.5rem 0 .6rem}.int-group-label:first-child{margin-top:0}.int-paused-group{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:.85rem 1rem 1rem;margin-bottom:1rem}.int-paused-group>summary{cursor:pointer;font-weight:600;font-size:.85rem;color:var(--text-primary);list-style:none;display:flex;align-items:center;gap:.35rem;-webkit-user-select:none;user-select:none}.int-paused-group>summary::-webkit-details-marker{display:none}.int-paused-group>summary:before{content:"▸";color:var(--text-muted)}.int-paused-group[open]>summary:before{content:"▾"}.int-paused-group-note{color:var(--text-muted);font-size:.78rem;margin:.55rem 0 .2rem;line-height:1.55}.int-paused-group-note code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.76rem}.int-paused-row{display:flex;align-items:center;gap:.7rem;padding:.55rem 0;border-top:1px solid var(--border)}.int-paused-row:first-of-type{border-top:0;margin-top:.3rem}.int-paused-row .int-paused-name{font-weight:500;flex:1;font-size:.85rem;min-width:0}.receipt-head{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.receipt-what{font-size:.95rem;font-weight:600;letter-spacing:-.01em;color:var(--text-primary)}.receipt-tag{font-size:.68rem;padding:.12rem .4rem;border-radius:4px;border:1px solid var(--border);color:var(--text-muted);white-space:nowrap}.receipt-tag-bound{color:var(--prov-sealed);border-color:var(--prov-sealed);font-weight:600}.receipt-scope{font-size:.82rem;color:var(--text-muted);margin-top:.2rem}.receipt-foot{display:flex;align-items:center;gap:.75rem;flex-wrap:wrap;margin-top:.55rem;padding-top:.55rem;border-top:1px solid var(--border)}.receipt-link{font-size:.78rem;color:var(--text-secondary);text-decoration:none;border-bottom:1px solid var(--border)}.receipt-link:hover{color:var(--accent-hover);border-color:var(--accent-hover)}.receipt-id{font-family:SF Mono,Monaco,monospace;font-size:.7rem;color:var(--text-muted)}.receipt-more{margin-top:.5rem}.receipt-more summary{cursor:pointer;font-size:.75rem;color:var(--text-muted);list-style:none}.receipt-more summary::-webkit-details-marker{display:none}.receipt-more summary:before{content:"▸"}.receipt-more[open] summary:before{content:"▾"}.receipt-kv{font-size:.72rem;color:var(--text-muted);margin-top:.4rem;line-height:1.7;font-family:SF Mono,Monaco,monospace;word-break:break-all}.receipt-rows{display:grid;grid-template-columns:7.5rem 1fr;row-gap:.35rem;column-gap:1rem;font-size:.8rem;margin:.8rem 0 0;padding-top:.7rem;border-top:1px solid var(--border)}.receipt-row-label{color:var(--text-muted);margin:0}.receipt-row-value{margin:0;overflow-wrap:anywhere}.receipt-num{font-variant-numeric:tabular-nums}.receipt-intent{font-style:italic;line-height:1.55}.receipt-absent{color:var(--text-muted)}@media(max-width:480px){.receipt-rows{grid-template-columns:1fr;row-gap:.15rem}.receipt-row-label{margin-top:.35rem}}.receipt-evidence-link{font-size:.78rem;font-weight:500;color:var(--text-primary);background:none;border:none;border-bottom:1px solid var(--border);padding:0;cursor:pointer;font-family:inherit}.receipt-evidence-link:hover{border-color:var(--text-primary)}.receipt-public{margin-left:auto;font-size:.76rem;color:var(--text-muted)}.receipt-verified{font-size:.76rem;font-weight:600;color:var(--text-primary)}.receipt-tamper{font-size:.76rem;font-weight:700;color:var(--text-primary);border:2px solid var(--text-primary);border-radius:var(--radius-xs);padding:0 .3rem}.page-inner:has(.reports-layout){max-width:none}.reports-bar{display:flex;justify-content:space-between;align-items:flex-start;gap:1rem;flex-wrap:wrap;margin-bottom:1rem}.reports-bar-actions{display:flex;gap:.5rem;align-items:center;flex-shrink:0}.reports-grid{display:grid;grid-template-columns:1fr 320px;gap:1.5rem;align-items:start}.reports-side>*+*{margin-top:.75rem}.reports-row{display:flex;justify-content:space-between;gap:.75rem;padding:.3rem 0;border-bottom:1px solid var(--border);font-size:.85rem}.reports-row:last-child{border-bottom:none}.reports-missing{margin-top:.5rem;padding:.5rem .75rem;background:var(--accent-subtle);border-radius:.5rem;font-size:.8rem;color:var(--text-primary)}.reports-error{margin:.3rem 0;padding:.5rem .75rem;background:var(--bg-elevated);border:2px solid var(--border-strong);border-radius:.5rem;font-size:.8rem;color:var(--text-primary);font-weight:600}.reports-note{margin-top:.4rem;font-size:.78rem;color:var(--text-muted)}.reports-checked-values .reports-row{font-size:.78rem}.reports-row-button{width:100%;background:none;border:none;border-bottom:1px solid var(--border);text-align:left;color:inherit;font:inherit;cursor:pointer;border-radius:0;align-items:center}.reports-checked-values .reports-row-button{font-size:.78rem}.reports-row-button:hover,.reports-row-button:focus-visible{text-decoration:underline}.reports-row-button.reports-row-selected{box-shadow:inset 3px 0 0 var(--text-primary);padding-left:.5rem;font-weight:600}.reports-row-bad{color:var(--text-primary);font-weight:700;font-size:.78rem}.reports-row-bad:before{content:"✕ "}.reports-detail .reports-case-steps{display:flex;flex-wrap:wrap;gap:.35rem;margin:.25rem 0 .5rem}.reports-legend{margin-bottom:.5rem;padding:.5rem .75rem;background:var(--bg-elevated);border:1px solid var(--border);border-left:4px solid var(--text-muted);border-radius:.5rem;font-size:.8rem;color:var(--text-primary)}.reports-legend{display:flex;flex-wrap:wrap;gap:.25rem 1rem;align-items:center}.reports-legend-chip{display:inline-flex;align-items:center;gap:.4rem}.reports-sw{width:11px;height:11px;border-radius:3px;display:inline-block;flex:none}.reports-sw-v{background:#ecfdf3;border:2px solid #15803d}.reports-sw-a{border:2px dashed #9a9a9a}.reports-gloss-swatch{color:var(--text-muted);border-bottom:1px dotted var(--text-muted)}.reports-gloss-switch{display:inline-flex;align-items:center;gap:.6rem;margin:0 0 .5rem;font-size:.82rem;font-weight:600;cursor:pointer;-webkit-user-select:none;user-select:none}.reports-gloss-switch input{position:absolute;opacity:0;width:1px;height:1px}.reports-gloss-track{width:34px;height:18px;border-radius:999px;background:var(--border);position:relative;flex:none;transition:background .15s ease}.reports-gloss-thumb{position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;background:var(--bg-elevated);box-shadow:var(--elevation-1);transition:transform .15s ease}.reports-gloss-switch input:checked+.reports-gloss-track{background:var(--text-primary)}.reports-gloss-switch input:checked+.reports-gloss-track .reports-gloss-thumb{transform:translate(16px)}.reports-gloss-switch input:focus-visible+.reports-gloss-track{outline:2px solid var(--text-primary);outline-offset:2px}.reports-iframe{width:100%;height:70vh;min-height:420px;border:1px solid var(--border);border-radius:.75rem;background:#fff}.reports-summary-chip{display:none}@media(max-width:480px){.reports-grid{grid-template-columns:1fr}.reports-summary-chip{display:flex;justify-content:space-between;align-items:center;gap:.75rem;background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:.5rem .75rem;font-size:.8rem;margin-bottom:.75rem}.reports-side{display:none}.reports-side.reports-side-open{display:block}}.mcp-endpoint{font-family:SF Mono,Monaco,monospace;font-size:.85rem;padding:.5rem .75rem;background:var(--bg-elevated);border:1px solid var(--border);border-radius:.375rem;margin-bottom:.75rem;word-break:break-all}.mcp-tabs{display:flex;gap:.25rem;margin-bottom:.75rem;flex-wrap:wrap}.mcp-tab{padding:.375rem .75rem;font-size:.75rem;font-weight:500;font-family:inherit;background:transparent;color:var(--text-secondary);border:1px solid var(--border);border-radius:.375rem;cursor:pointer}.mcp-tab.active{font-weight:600;background:var(--accent-subtle);color:var(--accent);border-color:var(--accent)}.mcp-snippet{font-family:SF Mono,Monaco,monospace;font-size:.78rem;line-height:1.6;padding:.75rem;background:var(--bg-elevated);border:1px solid var(--border);border-radius:.375rem;overflow:auto;white-space:pre-wrap;margin:0 0 .75rem}.setup-card{border:2px solid var(--accent);border-radius:.75rem;padding:1.5rem 1.75rem}.setup-intro{font-size:.88rem;color:var(--text-secondary);line-height:1.6;max-width:40rem;margin-bottom:1.5rem}.flow-step{border-top:1px solid var(--border);padding:1.125rem 0}.flow-step:first-of-type{border-top:none;padding-top:0}.flow-step-head{display:flex;align-items:flex-start;gap:.75rem}.flow-step-marker{width:1.625rem;height:1.625rem;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:.75rem;font-weight:700;flex-shrink:0;margin-top:.05rem}.flow-step-marker.flow-open{border:2px solid var(--accent);color:var(--accent);background:var(--bg-main)}.flow-step-marker.flow-todo{border:2px solid var(--border);color:var(--text-tertiary);background:var(--bg-main)}.flow-step-marker.flow-done{background:var(--neutral);color:var(--bg-elevated);border:2px solid var(--neutral);font-size:.85rem}.flow-step-title{font-size:.95rem;font-weight:700;color:var(--text-primary);margin-top:.1rem}.flow-step-title.flow-todo-title{font-weight:500;color:var(--text-tertiary)}.flow-step-open-btn{background:none;border:0;padding:0;font:inherit;text-align:left;cursor:pointer}.flow-step-open-btn:hover{color:var(--text-primary);text-decoration:underline;text-underline-offset:3px}.flow-step-title.flow-done-title{font-weight:500;color:var(--text-secondary)}.flow-step-title.flow-done-title a{color:var(--text-secondary)}.flow-step-title.flow-done-title a:hover{color:var(--accent)}.flow-step-body{margin:.875rem 0 0 2.375rem;max-width:36rem}.flow-step-body p{font-size:.85rem;color:var(--text-secondary);line-height:1.6;margin-bottom:.75rem}.flow-step-body p:last-child{margin-bottom:0}.bound-list{list-style:none;margin:0 0 .875rem;padding:0;display:flex;flex-direction:column;gap:.375rem}.bound-list li{font-size:.83rem;color:var(--text-secondary);padding-left:1.1rem;position:relative;line-height:1.5}.bound-list li:before{content:"–";position:absolute;left:0;color:var(--text-muted)}.cta-helper{font-size:.76rem;color:var(--text-tertiary);margin-top:.5rem}.managed-note{font-size:.78rem;color:var(--text-tertiary);margin-top:.75rem}.quote-box{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}.quote-text{font-size:.95rem;font-weight:600;font-style:italic;color:var(--text-primary)}@media(max-width:768px){.setup-card{padding:1.25rem}.flow-step-body{margin-left:0;margin-top:.75rem}.quote-box{flex-direction:column;align-items:stretch}}.human-only-note{margin:.75rem 0 1rem;padding:.6rem .8rem;border-left:3px solid var(--text-primary);background:var(--bg-elevated);font-size:.85rem;line-height:1.45;color:var(--text-secondary)}.human-only-note strong{color:var(--text-primary)}.approval-headline{font-size:1.05rem;font-weight:600;color:var(--text-primary);margin-bottom:.6rem}.preview-box{background:var(--bg-main);border:1px solid var(--border);border-left:3px solid var(--accent);border-radius:.5rem;padding:.75rem .875rem;margin-bottom:.75rem;font-size:.85rem}.preview-box h4{font-size:.72rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-tertiary);margin-bottom:.3rem}.preview-box-loading{color:var(--text-tertiary);font-size:.82rem}.preview-box-unavailable,.preview-box-not_found{border-left-color:var(--text-muted)}.preview-box-stale{border:2px solid var(--check-failed);border-left-width:3px;background:var(--check-failed-subtle)}.preview-box-stale h5{color:var(--check-failed);font-weight:700}.preview-note{font-size:.78rem;color:var(--text-tertiary);margin-top:.4rem;line-height:1.45}.preview-stale{margin-top:.6rem;padding-top:.6rem;border-top:1px solid var(--border)}.preview-stale h5{font-size:.85rem;font-weight:600;margin-bottom:.3rem}.limit-checks{background:var(--bg-main);border:1px solid var(--border);border-radius:.5rem;padding:.75rem .875rem;margin-bottom:.75rem}.limit-checks h4{font-size:.72rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-tertiary);margin-bottom:.35rem}.limit-check-list{list-style:none;margin:0;padding:0;font-size:.85rem;display:flex;flex-direction:column;gap:.2rem}.limit-check-list li{display:flex;gap:.45rem}.limit-check-icon{font-weight:700;flex-shrink:0}.limit-check-list li.ok .limit-check-icon{color:var(--text-primary)}.limit-check-list li.bad{color:var(--check-failed);font-weight:700}.limit-check-list li.bad .limit-check-icon{color:var(--check-failed)}.outcome-box{border:2px solid var(--border-strong);background:var(--bg-elevated);border-radius:.5rem;padding:.75rem .875rem;margin:.5rem 0 .75rem}.outcome-box h4{font-size:.85rem;font-weight:600;color:var(--text-primary);margin-bottom:.3rem}.outcome-note{font-size:.83rem;color:var(--text-secondary);line-height:1.45;margin:0}.mandate-intent{margin-bottom:.75rem;font-size:.85rem}.mandate-intent dl{display:grid;grid-template-columns:max-content 1fr;gap:.35rem .75rem;margin:0 0 .5rem}.mandate-intent dt{color:var(--text-tertiary);white-space:nowrap;align-self:start}.mandate-intent dd{margin:0}.src-tag{font-size:.65rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;border-radius:.25rem;padding:.05rem .3rem;margin-left:.35rem}.src-tag-local{color:var(--text-muted);border:1px solid var(--border)}.src-tag-sealed{color:var(--prov-sealed);border:1px solid var(--prov-sealed);font-weight:700}.src-tag-system{color:var(--prov-system);border:1px solid var(--prov-system)}.src-tag-value.src-tag-sealed-cell{font-weight:600;color:var(--text-primary)}.src-tag-value.src-tag-system-cell{color:var(--prov-system)}.id-raw{font:.78rem ui-monospace,Menlo,monospace;color:var(--text-muted)}.creation-context{color:var(--text-tertiary);font-size:.82rem}.creation-own-section{margin-top:.75rem;padding-top:.6rem;border-top:1px solid var(--border)}.creation-own-section h5{font-size:.8rem;font-weight:600;margin-bottom:.3rem}.preview-table{width:100%;border-collapse:collapse;font-size:.85rem;margin:.3rem 0}.preview-table th{text-align:left;font-size:.68rem;letter-spacing:.04em;text-transform:uppercase;color:var(--text-tertiary);font-weight:600;border-bottom:1px solid var(--border);padding:.3rem .45rem}.preview-table td{padding:.35rem .45rem;border-bottom:1px solid var(--accent-subtle);vertical-align:top}.creation-legend{display:flex;gap:1.1rem;flex-wrap:wrap;font-size:.72rem;color:var(--text-tertiary);margin:.6rem 0 0}.creation-legend-dot{display:inline-block;width:.5rem;height:.5rem;border-radius:.12rem;margin-right:.3rem;vertical-align:1px}.creation-legend-dot-sealed{background:var(--text-primary)}.creation-legend-dot-system{background:var(--prov-system)}.intent-text{font-style:italic;color:var(--text-secondary);margin:0}.intent-text.intent-clamped{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.intent-toggle{margin-top:.3rem}.preview-box-ai{border-left-color:var(--prov-ai)}.preview-box-sys{border-left-color:var(--prov-system)}.preview-box-unreachable{border-left-color:var(--text-muted)}.src-tag-ai{color:var(--prov-ai);border:1px solid var(--prov-ai)}.au10-req-meta{font-size:.78rem;color:var(--text-tertiary);margin:.1rem 0 .4rem}.au10-req-meta b{color:var(--text-primary);font-weight:600}.au10-req-quote{font-style:italic;color:var(--text-secondary);margin:.1rem 0 .25rem;white-space:pre-wrap}.au10-req-attrib{font-size:.74rem;color:var(--text-tertiary)}.au10-req-state{color:var(--text-tertiary);font-size:.85rem;margin:0}.au10-chain{margin-top:.55rem;padding-top:.5rem;border-top:1px solid var(--border)}.au10-chain summary{cursor:pointer;color:var(--prov-system);font-size:.78rem}.au10-chain-item{margin-top:.4rem;font-size:.78rem}.au10-hist-list{list-style:none;margin:.3rem 0 0;padding:0;display:flex;flex-direction:column;gap:.55rem}.au10-hist-item{padding-top:.5rem;border-top:1px solid var(--border)}.au10-hist-item:first-child{padding-top:0;border-top:none}.au10-hist-head{display:flex;justify-content:space-between;gap:.5rem;font-size:.72rem;color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.02em}.au10-hist-title{font-size:.85rem;font-weight:600;margin:.15rem 0 .1rem}.au10-hist-body{font-style:italic;color:var(--text-secondary);font-size:.82rem;margin:0 0 .2rem}.au10-hist-attrib{font-size:.74rem;color:var(--text-tertiary)}.au10-hist-state{color:var(--text-tertiary);font-size:.85rem;margin:0}.au10-dot{display:inline-block;width:.5rem;height:.5rem;border-radius:.12rem;margin-right:.3rem;vertical-align:1px}.au10-dot-ai{background:var(--prov-ai)}.au10-dot-sys{background:var(--prov-system)}.ticket-sent-box{background:var(--bg-elevated);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-3) var(--space-4);margin-bottom:var(--space-3);font-size:var(--text-body-sm)}.ticket-sent-box.is-sealed{border-left:3px solid var(--prov-sealed)}.ticket-sent-box h4{font-size:var(--text-micro);font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--text-primary);margin:0 0 var(--space-2)}.ticket-sent-box h4 .ticket-sent-q{font-weight:500;letter-spacing:0;text-transform:none;color:var(--text-muted);margin-left:.4rem}.ticket-sent-fields{display:grid;grid-template-columns:minmax(6rem,max-content) 1fr;gap:.25rem var(--space-4);margin:0}.ticket-sent-fields dt{color:var(--text-muted);align-self:start}.ticket-sent-fields dd{margin:0;word-break:break-word;white-space:pre-wrap}.ticket-sent-box.is-sealed .ticket-sent-fields dd.is-sealed{font-weight:700}.ticket-sent-fields dd.is-system{color:var(--prov-system)}.ticket-sent-text{margin:0;white-space:pre-wrap;word-break:break-word}.ticket-sent-box.is-sealed .ticket-sent-text.is-sealed{font-weight:700}.ticket-sent-text.is-system{color:var(--prov-system)}.ticket-sent-tag{display:inline-block;font-size:.65rem;font-weight:700;border:1px solid var(--text-primary);border-radius:var(--radius-sm);padding:0 .4rem;margin-left:.4rem;color:var(--text-primary);white-space:nowrap;vertical-align:1px}.ticket-sent-sub{font-size:var(--text-caption);color:var(--text-muted);margin:var(--space-3) 0 var(--space-2);padding-top:var(--space-2);border-top:1px dashed var(--border-strong)}.ticket-sent-check{font-size:var(--text-caption);color:var(--text-primary);margin:var(--space-2) 0 0}.ticket-sent-check.is-failed{color:var(--check-failed);font-weight:700}.ticket-sent-check.is-neutral{color:var(--text-muted)}.ticket-sent-empty{color:var(--text-muted);font-style:italic;margin:0}.ticket-sent-loading{color:var(--text-muted)}.ticket-done-note{font-size:.78rem;color:var(--text-tertiary);margin:.4rem 0 0;line-height:1.45}.ticket-done-note-ok{color:var(--text-primary);font-weight:600}.ticket-done-note-bad{color:var(--text-primary);font-weight:700}.ticket-done-note-neutral{color:var(--text-tertiary)}@media(max-width:40rem){.ticket-sent-fields{grid-template-columns:1fr}.ticket-sent-fields dd{margin-bottom:var(--space-1)}}.ticket-box{background:var(--bg-elevated);border:1px solid var(--border);border-left:3px solid var(--prov-sealed);border-radius:.5rem;padding:.75rem .875rem;margin-bottom:.75rem;font-size:.85rem}.ticket-box h4{font-size:.72rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-tertiary);margin-bottom:.3rem}.ticket-shown-off-device,.ticket-shown-unchecked{border-color:var(--border);background:var(--bg-main)}.ticket-shown-mismatch{border:2px solid var(--text-primary);background:var(--bg-elevated)}.ticket-sub-head{font-size:.65rem;font-weight:700;text-transform:uppercase;letter-spacing:.03em;color:var(--text-tertiary);margin:.65rem 0 .3rem}.ticket-sub-head:first-of-type{margin-top:0}.src-tag-danger{color:var(--text-primary);border:2px solid var(--text-primary);font-weight:700}.src-tag-danger:before{content:"✕ "}.document-preview-box{background:var(--bg-elevated);border:1px solid var(--border);border-left:3px solid var(--prov-sealed);border-radius:.5rem;padding:.75rem .875rem;margin-bottom:.75rem;font-size:.85rem}.document-preview-box h4{font-size:.72rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-tertiary);margin-bottom:.5rem}.document-preview-body{display:flex;gap:var(--space-4);align-items:flex-start}.document-preview-frame{width:9.5rem;height:12.5rem;flex-shrink:0;border:1px solid var(--border-strong);border-radius:.25rem;box-shadow:var(--elevation-1);background:var(--bg-elevated)}.document-preview-meta{font-size:var(--text-body-sm);min-width:0}.document-preview-filename{font-weight:600;color:var(--text-primary);margin-bottom:.2rem}.document-preview-meta .preview-note{margin:.15rem 0}.document-preview-meta a{color:var(--text-primary)}@media(max-width:400px){.document-preview-body{flex-direction:column}.document-preview-frame{width:100%;height:16rem}}.msg-error{color:var(--text-primary);font-weight:600}.msg-error:before{content:"✕ "}.msg-ok{color:var(--text-primary)}.msg-ok:before{content:"✓ "}.msg-attention{color:var(--text-primary)}.msg-attention:before{content:"! ";font-weight:700}.note-attention{background:var(--bg-elevated);color:var(--text-primary);border:1px dashed var(--border-strong);border-radius:var(--radius-sm)}.note-stopped{background:var(--bg-elevated);color:var(--text-primary);border:2px solid var(--border-strong);border-radius:var(--radius-sm)}.btn-outline-strong{background:transparent;color:var(--text-primary);border:2px solid var(--btn-outline-border-strong)}.btn-outline-strong:hover:not(:disabled){background:var(--accent-subtle)}.pill-count{display:inline-flex;align-items:center;justify-content:center;min-width:1.15rem;height:1.15rem;padding:0 .35rem;border-radius:var(--radius-pill);background:var(--neutral);color:var(--bg-elevated);font-size:var(--text-micro);font-weight:700;line-height:1}.obj-line{display:flex;align-items:center;gap:.4rem;font-size:var(--text-caption);color:var(--text-muted);white-space:nowrap;overflow:hidden;min-width:0}.obj-line svg{width:1rem;height:1rem;flex:none;color:var(--text-primary)}.obj-line b{color:var(--text-primary);font-weight:700;overflow:hidden;text-overflow:ellipsis}.obj-line .obj-line-sp{flex:1}.obj-due{font-size:var(--text-caption);font-weight:600;color:var(--text-primary);margin-top:.2rem}.appr-item{display:flex;flex-direction:column;background:var(--bg-elevated);border:1px solid var(--border-strong);border-left:6px solid var(--neutral);border-radius:var(--radius-md);margin-bottom:var(--space-2)}.appr-item-head{display:flex;align-items:center;width:100%;background:none;border:none;text-align:left;font:inherit;color:inherit;cursor:pointer;padding:0}.appr-item-head:focus-visible{outline:2px solid var(--text-primary);outline-offset:2px}.appr-item:hover{border-color:var(--text-primary);border-left-color:var(--neutral)}.appr-item-main{flex:1;min-width:0;padding:var(--space-3) var(--space-4)}.appr-item-sum{font-weight:700;color:var(--text-primary)}.appr-item-who{font-size:var(--text-caption);margin-top:.2rem;border-left:2px dashed var(--text-primary);padding-left:.5rem}.appr-item-chev{padding:0 var(--space-4);font-size:1.2rem;color:var(--text-muted)}.appr-item-body{padding:0 var(--space-5) var(--space-4) var(--space-4)}.appr-item.is-open{border:2px solid var(--text-primary);border-left:6px solid var(--neutral);box-shadow:var(--elevation-2);margin:var(--space-3) 0}.appr-item.is-open .appr-item-sum{font-size:var(--text-lead)}.appr-item.is-open .appr-item-chev{transform:rotate(90deg);color:var(--text-primary)}.appr-item-body .card{border:none;box-shadow:none;padding:0;margin:0;background:transparent}.mandate-obj{position:relative;background:var(--bg-elevated);border:1px solid var(--border);border-left:6px solid var(--text-primary);border-radius:var(--radius-lg);padding:var(--space-3) var(--space-4);margin-bottom:var(--space-2)}.mandate-obj-title{font-weight:700;color:var(--text-primary);margin-top:.15rem}.usage{display:flex;align-items:center;gap:var(--space-2);font-size:var(--text-caption);margin-top:var(--space-2);white-space:nowrap}.usage-bar{flex:1;min-width:3rem;height:.35rem;border-radius:var(--radius-pill);background:var(--neutral-subtle);border:1px solid var(--border);overflow:hidden}.usage-bar>i{display:block;height:100%;background:var(--text-primary)}.usage.is-near b{font-weight:800}.ticket-obj{display:flex;background:var(--bg-elevated);border:1px solid var(--border-strong);border-radius:var(--radius-md);margin-bottom:var(--space-2)}.ticket-obj.is-new{border-color:var(--text-primary)}.ticket-obj-main{flex:1;min-width:0;padding:var(--space-3) var(--space-4)}.ticket-obj-what{font-weight:700;font-size:var(--text-body-sm);color:var(--text-primary)}.ticket-obj-stub{flex:0 0 6rem;border-left:2px dashed var(--border-strong);display:flex;flex-direction:column;justify-content:center;align-items:flex-end;gap:.1rem;padding:var(--space-2) var(--space-3)}.ticket-obj-no{font-family:var(--font-mono);font-size:var(--text-caption);font-weight:700;letter-spacing:.03em}.ticket-obj-time{font-size:var(--text-micro);color:var(--text-muted)}.seen-dot{flex:none;width:.55rem;height:.55rem;border-radius:var(--radius-circle);border:1.5px solid var(--text-primary)}.seen-dot.is-new{background:var(--text-primary)}.auto-grp{background:var(--bg-elevated);border:1px solid var(--border-strong);border-radius:var(--radius-md);margin-bottom:var(--space-2)}.auto-grp.is-seen{border-color:var(--border)}.auto-grp>summary{list-style:none;display:flex;gap:var(--space-3);align-items:flex-start;padding:var(--space-3) var(--space-4);cursor:pointer}.auto-grp>summary::-webkit-details-marker{display:none}.auto-grp>summary .seen-dot{margin-top:.35rem}.auto-grp-txt{display:flex;flex-direction:column;min-width:0;font-size:var(--text-body-sm)}.auto-grp-txt>b{color:var(--text-primary)}.auto-grp.is-seen .auto-grp-txt>b{font-weight:600}.auto-grp-list{border-top:1px dashed var(--border-strong);padding:var(--space-2) var(--space-4) var(--space-3)}.auto-grp-row{display:flex;gap:var(--space-2);align-items:baseline;font-size:var(--text-caption);padding:.2rem 0}.auto-grp-row .seen-dot{width:.45rem;height:.45rem}.auto-grp-row .t{margin-left:auto;color:var(--text-muted);white-space:nowrap;font-family:var(--font-mono);font-size:var(--text-micro)}.core-cols{display:grid;grid-template-columns:minmax(0,1.35fr) minmax(0,1.1fr) minmax(0,.85fr);gap:var(--space-5);margin-bottom:var(--space-6);align-items:start}.core-col-h{display:flex;align-items:baseline;gap:var(--space-2);margin-bottom:var(--space-3)}.core-col-h h2{font-size:var(--text-body);font-weight:700;margin:0}.core-col-h.is-main h2{font-size:var(--text-lead)}.core-col-h .meta{margin-left:auto;font-size:var(--text-caption);color:var(--text-muted)}.core-col-empty{font-size:var(--text-body-sm);color:var(--text-muted);padding:var(--space-3) 0}.col-btn{display:block;width:100%;text-align:center;margin-top:var(--space-2);padding:.45rem .8rem;border:1px solid var(--text-primary);border-radius:var(--radius-md);font-size:var(--text-body-sm);font-weight:600;color:var(--text-primary);background:var(--bg-elevated);text-decoration:none;cursor:pointer;font-family:inherit}.col-btn:hover{background:var(--accent-subtle);text-decoration:none}.core-quiet-line{font-size:var(--text-caption);color:var(--text-muted);margin-top:var(--space-3);padding-top:var(--space-2);border-top:1px solid var(--border)}.core-quiet-line a{color:var(--text-primary);text-decoration:underline;text-underline-offset:3px}@media(max-width:1100px){.core-cols{grid-template-columns:1fr}}.ftabs{display:flex;gap:var(--space-2);flex-wrap:wrap;align-items:center;margin:var(--space-4) 0 var(--space-3);padding-bottom:var(--space-3);border-bottom:1px solid var(--border)}.ftab{display:inline-flex;align-items:center;gap:.4rem;border:1px solid var(--border);background:transparent;color:var(--text-primary);border-radius:var(--radius-pill);padding:.3rem .8rem;font-size:var(--text-body-sm);font-family:inherit;cursor:pointer}.ftab[aria-selected=true]{border:2px solid var(--text-primary);font-weight:700}.ftab .n{font-size:var(--text-micro);color:var(--text-muted)}.sidebar-core .sidebar-item{font-weight:600}.sidebar-group-label{font-size:.62rem;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--text-muted);padding:var(--space-3) var(--space-3) var(--space-1)}.sidebar-divider{height:1px;background:var(--border);margin:var(--space-3) var(--space-3)}.sidebar-setup .sidebar-item{color:var(--text-muted);font-size:var(--text-caption)}.nav-ic{display:inline-flex;align-items:center;justify-content:center;width:1.1rem;height:1.1rem;flex:none}.nav-ic-approval{width:.35rem;height:.9rem;background:var(--text-primary);border-radius:2px}.nav-ic-mandate{width:.7rem;height:.9rem;border:1.5px solid var(--text-primary);border-left-width:4px;border-radius:2px}.nav-ic-ticket{width:.95rem;height:.6rem;border:1.5px solid var(--text-primary);border-right-style:dashed;border-radius:2px}.nav-ic-blocked{position:relative;width:.85rem;height:.85rem;border:1.5px solid var(--text-primary);border-radius:var(--radius-circle)}.nav-ic-blocked:after{content:"";position:absolute;left:50%;top:-1px;bottom:-1px;width:1.5px;background:var(--text-primary);transform:translate(-50%) rotate(45deg)}.ticket-obj-head{display:block;width:100%;background:none;border:none;padding:0;text-align:left;font:inherit;color:inherit;cursor:pointer}.ticket-obj-head:focus-visible{outline:2px solid var(--text-primary);outline-offset:2px}.ticket-obj-head .receipt-head{margin-top:.15rem}.ticket-obj-card.is-open{border:2px solid var(--text-primary);box-shadow:var(--elevation-2)}.ticket-obj-card .ticket-obj-stub{flex-basis:7rem}.ticket-obj-sig{font-size:var(--text-micro);font-weight:700}.receipt-when{font-size:var(--text-caption);color:var(--text-muted);margin:var(--space-2) 0}.appr-item-link{flex-direction:row;align-items:center;text-decoration:none;color:inherit}.appr-item-link:hover{text-decoration:none}.attention-quiet{box-shadow:none}.attention-quiet .card-title{font-size:var(--text-body-sm);color:var(--text-muted);font-weight:600}.mandate-card{border-left:6px solid var(--text-primary);padding:0}.mandate-card .id-body{padding:var(--space-3) var(--space-4)}.mandate-card .obj-line{margin-bottom:.15rem}.card-in-row{border:none;box-shadow:none;padding:0;background:transparent;margin:0}.obj-mandate-line{font-size:var(--text-caption);color:var(--text-muted);border-left:3px solid var(--text-primary);padding-left:.5rem;margin-top:.25rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.area-group-h{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-2)}.area-group-h svg{width:1.1rem;height:1.1rem;flex:none;color:var(--text-primary)}.area-group-h b{font-size:var(--text-body);color:var(--text-primary)}.area-group-h .meta{font-size:var(--text-caption);color:var(--text-muted)}.area-group{margin-bottom:var(--space-5)}.ftab svg{width:.9rem;height:.9rem;flex:none}.card-in-row .id-body{padding:0}.creation-legend-fold{margin:.4rem 0 0}.creation-legend-fold>summary{list-style:none;display:inline-flex;align-items:center;justify-content:center;width:1.1rem;height:1.1rem;border:1px solid var(--border-strong);border-radius:var(--radius-circle);font-size:var(--text-micro);font-weight:700;color:var(--text-muted);cursor:pointer}.creation-legend-fold>summary::-webkit-details-marker{display:none}.creation-legend-fold[open]>summary{color:var(--text-primary);border-color:var(--text-primary)}.card-in-row .approval-headline{font-size:var(--text-caption);font-weight:400;color:var(--text-muted);margin-bottom:var(--space-2)}.approval-summary{font-size:var(--text-lead);font-weight:700;color:var(--text-primary);margin-bottom:.15rem}.card-in-row .approval-summary{display:none}.blocked-card{padding:0}.blocked-card .id-body{padding:var(--space-3) var(--space-4)}.blocked-card .obj-line{margin-bottom:.2rem}.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}.core-cols .obj-line>span,.core-cols .obj-line b{overflow:hidden;text-overflow:ellipsis}.core-cols .auto-grp-txt>b,.core-cols .appr-item-sum{overflow-wrap:anywhere}.nav-count-quiet{background:transparent!important;color:var(--text-muted)!important;font-weight:500!important}.nav-new{margin-left:auto;display:inline-flex;align-items:center;background:var(--neutral);color:var(--bg-elevated);border-radius:var(--radius-pill);padding:.08rem .45rem;font-size:.62rem;font-weight:800;letter-spacing:.06em;text-transform:uppercase}.report-line{display:flex;align-items:center;gap:var(--space-4);flex-wrap:wrap;background:var(--bg-elevated);border:1px solid var(--border-strong);border-radius:var(--radius-md);padding:var(--space-3) var(--space-4);margin-bottom:var(--space-6)}.report-line-text{flex:1;min-width:16rem;font-size:var(--text-body-sm)}.report-line .col-btn{width:auto;margin:0;white-space:nowrap}.reports-period{font-size:var(--text-body-sm);color:var(--text-primary);margin:.15rem 0 .1rem}.mandate-obj-title{font-weight:700;font-size:var(--text-body-sm);margin:.1rem 0 .25rem}.mandate-filters{display:flex;flex-wrap:wrap;gap:var(--space-2) var(--space-5);align-items:center;margin:-.25rem 0 var(--space-4)}.mandate-filters .ftabs{margin:0;border-bottom:none;padding-bottom:0}.ticket-sent-more{margin-top:var(--space-2);background:none;border:none;padding:0;font:inherit;font-size:var(--text-caption);color:var(--text-primary);text-decoration:underline;text-underline-offset:3px;cursor:pointer}.card-mode-note{display:block;font-weight:400;font-size:var(--text-caption);color:var(--text-muted);margin-top:.15rem}.card-checks{display:flex;flex-direction:column;gap:.15rem;margin:0 0 var(--space-3);font-size:var(--text-body-sm)}.card-checks-top{margin:0 0 var(--space-2)}.check-line{display:flex;gap:.4rem;align-items:baseline}.check-mark{width:1.1rem;flex-shrink:0;text-align:center;font-weight:700}.check-pass{color:var(--text-primary)}.check-not-checked{font-weight:700;border:1px dashed var(--text-primary);border-radius:var(--radius-md);padding:var(--space-2) var(--space-3);margin:.2rem 0}.check-notice{border-left:2px solid var(--border-strong);padding:.1rem 0 .1rem .6rem;margin:.15rem 0}.check-notice strong{font-weight:600}.check-fail{color:var(--check-failed);background:var(--check-failed-subtle);border:2px solid var(--check-failed);border-radius:var(--radius-md);padding:var(--space-2) var(--space-3);font-weight:700}.compare-table{width:100%;border-collapse:collapse;font-size:var(--text-body-sm);margin:.4rem 0 .6rem}.compare-table th{text-align:left;font-size:var(--text-caption);font-weight:600;color:var(--text-tertiary);padding:.15rem var(--space-3) .15rem 0}.compare-table td{padding:.15rem var(--space-3) .15rem 0;vertical-align:top;word-break:break-word}.compare-table .compare-label{color:var(--text-tertiary);white-space:nowrap}.compare-table .compare-now{color:var(--prov-system);font-weight:600}.compare-table .compare-new{color:var(--text-primary);font-weight:700}.system-box{border:1px solid var(--border);border-left:3px solid var(--prov-system);background:var(--prov-system-subtle);border-radius:var(--radius-md);padding:var(--space-3) var(--space-3);margin:.5rem 0;font-size:var(--text-body-sm)}.system-box-heading{font-size:.62rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--prov-system);margin-bottom:var(--space-2)}.system-box dl{display:grid;grid-template-columns:max-content 1fr;gap:.2rem var(--space-3);margin:0}.system-box dt{color:var(--text-tertiary)}.system-box dd{margin:0;color:var(--prov-system);font-weight:600;word-break:break-word}.system-box-note{margin:var(--space-2) 0 0;font-size:var(--text-caption);color:var(--text-tertiary)}@media(max-width:36rem){.system-box dl{grid-template-columns:1fr}}.preview-table-wrap{max-width:100%;overflow-x:auto}.main-content:has(.av3-page){padding:0;background:var(--bg-sunken)}.page-inner:has(.av3-page){max-width:none;margin:0}.av3-page{height:calc(100vh - var(--nav-height) - var(--update-banner-h, 0px) - var(--sim-banner-h, 0px));display:flex;flex-direction:column;min-height:0;background:var(--bg-sunken)}.av3-pane{flex:1;min-height:0;display:flex;flex-direction:column;width:100%;max-width:680px;margin:0 auto}.av3-pane-scroll{flex:1;min-height:0;overflow:auto;padding:0 var(--space-3) var(--space-4)}.av3-sp{flex:1}.av3-empty{padding:var(--space-8) var(--space-4);color:var(--text-muted);font-size:var(--text-body-sm)}.av3-stack{display:flex;flex-direction:column;gap:var(--space-3)}.av3-ph{flex:none;min-height:3.25rem;display:flex;align-items:center;gap:var(--space-1);padding:0 var(--space-3)}.av3-ph-title{font-size:var(--text-body);font-weight:600;letter-spacing:0;padding-left:var(--space-2);margin:0;border:0}.av3-back,.av3-ib{display:inline-flex;align-items:center;justify-content:center;gap:.25rem;height:44px;min-width:44px;padding:0 var(--space-2);border:0;background:none;border-radius:var(--radius-md);font:inherit;font-size:var(--text-body-sm);font-weight:500;color:var(--text-primary);cursor:pointer}.av3-back:hover,.av3-ib:hover:not(:disabled){background:var(--bg-elevated)}.av3-back .n{color:var(--text-muted);font-weight:400}.av3-ib:disabled{color:var(--border-strong);cursor:default}.av3-back:focus-visible,.av3-ib:focus-visible,.av3-btn:focus-visible,.av3-row-head:focus-visible,.av3-select select:focus-visible,.av3-fold summary:focus-visible,.av3-link:focus-visible{outline:2px solid var(--text-primary);outline-offset:2px}.av3-pos{font-size:var(--text-caption);color:var(--text-muted);font-variant-numeric:tabular-nums;margin-right:var(--space-1)}.av3 svg.i,.av3-page svg.i,.av3-card svg.i{width:1rem;height:1rem;flex:none;stroke:currentColor;fill:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}.av3-show{display:inline-flex;align-items:center;gap:.3rem;font-size:var(--text-body-sm);color:var(--text-muted)}.av3-select{position:relative;display:inline-flex;align-items:center}.av3-select select{-moz-appearance:none;appearance:none;-webkit-appearance:none;height:44px;padding:0 1.6rem 0 var(--space-2);border:0;border-radius:var(--radius-md);background:none;color:var(--text-primary);font:inherit;font-size:var(--text-body-sm);font-weight:500;cursor:pointer}.av3-select select:hover{background:var(--bg-elevated)}.av3-select svg{position:absolute;right:.5rem;pointer-events:none;color:var(--text-muted)}.av3-rows{display:flex;flex-direction:column;gap:var(--space-2)}.av3-lh{display:flex;justify-content:space-between;padding:0 var(--space-2) var(--space-1);font-size:var(--text-caption);color:var(--text-muted)}.av3-row{background:var(--bg-elevated);border-radius:var(--radius-lg);box-shadow:var(--elevation-1)}.av3-row:hover{box-shadow:var(--elevation-2)}.av3-row.is-selected{box-shadow:inset 3px 0 0 var(--text-primary),var(--elevation-2)}.av3-row .av3-row-head{display:block;width:100%;text-align:left;padding:var(--space-3) var(--space-5) var(--space-4);background:none;border:0;font:inherit;color:inherit;cursor:pointer;border-radius:inherit;min-height:44px}.av3-row-title{display:block;margin-top:.2rem;font-weight:600;font-size:var(--text-body);line-height:1.35;letter-spacing:-.005em;overflow-wrap:anywhere}.av3-row-meta{display:flex;flex-wrap:wrap;gap:0 var(--space-2);margin-top:.2rem;font-size:var(--text-body-sm);color:var(--text-muted)}.av3-row-meta b{color:var(--text-primary);font-weight:600}.av3-row-meta b.av3-flag-fail{color:var(--check-failed);font-weight:700}.av3-cbox{flex:1;min-height:0;display:flex;flex-direction:column;padding:0 var(--space-3) var(--space-3)}.av3-stage{flex:1;min-height:0;display:flex;flex-direction:column;transition:transform .32s ease,opacity .32s ease}.av3-stage.av3-out{transform:translate(-60px);opacity:0}.av3-stage.av3-in{animation:av3-in .34s ease}@keyframes av3-in{0%{transform:translate(60px);opacity:0}}.card.av3-card{position:relative;flex:1;min-height:0;display:flex;flex-direction:column;padding:0;margin:0;background:var(--bg-elevated);border:0;border-radius:var(--radius-xl);box-shadow:var(--elevation-2);overflow:hidden;container-type:inline-size}.av3-scroll{flex:1;min-height:0;overflow:auto;padding:var(--space-5) var(--space-5) var(--space-4)}.av3-body{display:flex;flex-direction:column}.av3-next{align-self:flex-start;display:inline-flex;align-items:center;height:22px;padding:0 var(--space-2);margin-bottom:var(--space-2);border-radius:var(--radius-xs);background:var(--neutral-subtle);font-size:var(--text-caption);font-weight:600;animation:av3-chip 2.4s ease forwards}@keyframes av3-chip{0%,70%{opacity:1}to{opacity:0;height:0;margin:0}}.av3-type{display:flex;align-items:center;flex-wrap:wrap;gap:.15rem var(--space-2);font-size:var(--text-caption);color:var(--text-muted);margin-bottom:var(--space-2)}.av3-type b{color:var(--text-primary);font-weight:600}.av3-type>span+span:before{content:"·";margin-right:var(--space-2)}.av3-type>.av3-mtag+span:before{content:none}.av3-type>.av3-mtag:before{content:none}.av3-mtag{display:inline-flex;align-items:center;height:20px;padding:0 6px;border-radius:var(--radius-xs);background:var(--neutral);color:var(--bg-elevated);font-size:var(--text-micro);font-weight:700;letter-spacing:.06em;text-transform:uppercase}.av3-title{font-size:1.2rem;font-weight:600;line-height:1.3;letter-spacing:-.012em;margin:0 0 var(--space-4);border:0;padding:0;text-wrap:pretty;overflow-wrap:anywhere}.av3-body .card-checks-top{margin:0 0 var(--space-4)}.av3-extras{display:flex;flex-direction:column;gap:var(--space-2);margin-bottom:var(--space-4);font-size:var(--text-body-sm)}.av3-extras p{margin:0}.over-limit-box{border:2px dashed var(--text-primary);border-radius:var(--radius-md);padding:var(--space-2) var(--space-3)}.av3-quiet{font-size:var(--text-caption);color:var(--text-muted);margin:0}.av3-bold{font-weight:700}.card-checks-body{display:contents}.av3-attention{display:flex;flex-direction:column;gap:var(--space-2);margin-bottom:var(--space-4)}.av3-attention .check-line{margin:0}.av3-body .check-notice{display:flex;gap:var(--space-2);align-items:flex-start;border:0;padding:0;margin:0;font-size:var(--text-body)}.av3-body .check-notice svg{width:1.1rem;height:1.1rem;margin-top:.15rem}.av3-body .check-notice strong{font-weight:700}.av3-note{margin-bottom:var(--space-4);font-size:var(--text-body-sm)}.av3-note p{margin:.3rem 0 0;color:var(--text-muted)}.av3-sealed{background:var(--bg-sunken);border-radius:var(--radius-md);padding:var(--space-4);margin-bottom:var(--space-5);font-size:var(--text-body-sm);min-width:0}.av3-sealed-h{display:flex;align-items:center;gap:.4rem;margin:0 0 var(--space-3);font-size:var(--text-body-sm);font-weight:600;letter-spacing:0;line-height:1.3}.av3-sealed .preview-box{background:none;border:0;border-radius:0;padding:0;margin:0 0 var(--space-3)}.av3-sealed .preview-box:last-child{margin-bottom:0}.av3-sealed [data-testid=bound-values-open]>h4,.av3-sealed [data-testid=approval-preview]:not(.preview-box-stale)>h4{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.av3-image{display:block;max-width:100%;max-height:240px;border-radius:var(--radius-md);margin:0 0 var(--space-3)}.av3-sealed .preview-box-ai{color:var(--prov-ai)}.av3-sealed .preview-box-ai>h4{color:var(--prov-ai)}.av3-sealed .preview-box-ai p{color:var(--prov-ai);font-weight:500}.av3-sealed .preview-box-stale{border:2px solid var(--check-failed);border-radius:var(--radius-md);background:var(--check-failed-subtle);padding:var(--space-3)}.av3-sealed dl{margin:0}.av3-sealed dl{grid-template-columns:minmax(5.5rem,8rem) minmax(0,1fr)!important}.av3-sealed dt{white-space:normal!important;overflow-wrap:anywhere}.av3-sealed dd{min-width:0;overflow-wrap:anywhere}.av3-sealed dd{font-weight:600}.av3-sealed dt{color:var(--text-muted)!important}.av3-sealed .src-tag-sealed{display:none}.av3-sealed .preview-table th,.av3-sealed .preview-table td{border-bottom:0;word-break:normal;overflow-wrap:normal}.av3-sealed .preview-table td{font-variant-numeric:tabular-nums}.av3-sealed .creation-own-section{border-top:0;padding-top:0}.av3-sealed .compare-table th{font-weight:500}.av3-sealed .system-box{margin:0}.av3-sealed .doc-preview,.av3-sealed .document-preview{border:0}.av3-sealed .markdown-body{background:none}.av3-intent{margin-bottom:var(--space-4)}.av3-intent-l{font-size:var(--text-caption);color:var(--prov-ai);margin-bottom:.2rem}.av3-intent p{margin:0;color:var(--prov-ai);font-size:var(--text-lead);font-weight:500;line-height:1.4;overflow-wrap:anywhere}.av3-sealed dl.av3-mandate-rows{display:grid;column-gap:var(--space-3);row-gap:.35rem;margin:0 0 .35rem}.av3-sealed dl.av3-mandate-rows:last-child{margin:.35rem 0 0}.av3-due{margin:calc(-1 * var(--space-2)) 0 var(--space-3)}.av3-plain{list-style:none;margin:0 0 var(--space-2);padding:0;display:grid;gap:.3rem}.av3-edit{margin:calc(-1 * var(--space-2)) 0 var(--space-4)}.av3-edit p{margin:var(--space-1) 0 0;font-size:var(--text-caption)}.av3-link{background:none;border:0;padding:0 var(--space-1);margin:0 calc(-1 * var(--space-1));min-height:44px;font:inherit;font-size:var(--text-body-sm);font-weight:500;color:var(--text-primary);text-decoration:underline;text-underline-offset:3px;cursor:pointer;border-radius:var(--radius-xs)}.av3-link:disabled{color:var(--text-muted);cursor:default}.av3-links{display:flex;flex-wrap:wrap;gap:var(--space-2);margin-bottom:var(--space-4)}.av3-link-btn{display:inline-flex;align-items:center;min-height:44px;padding:0 var(--space-3);border-radius:var(--radius-md);background:var(--neutral-subtle);color:var(--text-primary);font-size:var(--text-body-sm);font-weight:500;text-decoration:none}.av3-link-btn:hover{background:var(--border);text-decoration:none}.av3-link-strong{color:var(--text-primary);font-weight:600;text-decoration:none}.av3-link-strong:hover{text-decoration:underline}.av3-fold{font-size:var(--text-body-sm);margin:0 calc(-1 * var(--space-3));border-radius:var(--radius-md)}.av3-fold[open]{background:var(--bg-sunken)}.av3-fold>summary{list-style:none;display:flex;align-items:center;gap:var(--space-2);min-height:44px;padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);cursor:pointer}.av3-fold>summary::-webkit-details-marker{display:none}.av3-fold>summary:hover{background:var(--accent-subtle)}.av3-fold>summary .h{font-weight:500;white-space:nowrap}.av3-fold>summary .one{flex:1;min-width:0;color:var(--text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.av3-fold>summary .chev{flex:none;margin-left:auto;color:var(--text-muted);transition:transform .15s}.av3-fold[open]>summary .chev{transform:rotate(90deg)}.av3-fold[open]>summary .one{visibility:hidden}.av3-fold-body{padding:var(--space-3) var(--space-3) var(--space-4)}.av3-fold[open]>summary{font-weight:600}.av3-fold[open]>summary .h{font-weight:600}.av3-fold[open]>.av3-fold-body{border-top:1px solid var(--border-strong);margin:0 var(--space-3);padding-left:0;padding-right:0}.av3-fold-body>p,.av3-fold-body .check-line{margin:0 0 var(--space-2)}.av3-fold-body .card-checks{margin:0}.av3-fold .preview-note{margin-top:0}.av3-fold .au10-chain{border-top:0;margin-top:var(--space-2);padding-top:0}.av3-usage{display:grid;grid-template-columns:max-content 1fr;gap:.2rem var(--space-3);margin:0 0 var(--space-2);font-variant-numeric:tabular-nums}.av3-usage dt{color:var(--text-muted)}.av3-usage dd{margin:0;font-weight:600}.av3-mintent{margin-top:var(--space-2)}.av3-bound{color:var(--text-muted);margin-bottom:var(--space-2)}.av3-fold .creation-legend{margin-top:var(--space-3)}.av3-foot{flex:none;padding:var(--space-3) var(--space-5) var(--space-4);background:var(--bg-elevated)}.av3-error{margin:0 0 var(--space-2);font-size:var(--text-body-sm)}.av3-btns{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--space-2)}.av3-btns-two{grid-template-columns:repeat(2,minmax(0,1fr))}.av3-btn{height:44px;padding:0 var(--space-2);border:0;border-radius:var(--radius-md);background:var(--neutral-subtle);color:var(--text-primary);font:inherit;font-size:var(--text-body-sm);font-weight:500;white-space:nowrap;cursor:pointer}.av3-btn:hover{background:var(--border)}.av3-btn-primary{background:var(--btn-primary-bg);color:var(--btn-primary-fg);font-weight:600}.av3-btn-primary:hover{background:var(--btn-primary-bg-hover)}.av3-btn .short{display:none}.av3-chg-l{display:block;font-size:var(--text-caption);color:var(--text-muted);margin-bottom:var(--space-1)}.av3-chg textarea{display:block;width:100%;min-height:76px;resize:vertical;margin-bottom:var(--space-2);padding:var(--space-2) var(--space-3);border:0;border-radius:var(--radius-md);background:var(--bg-sunken);color:var(--text-primary);font:inherit;font-size:var(--text-body-sm)}.av3-chg textarea:focus-visible{outline:2px solid var(--text-primary);outline-offset:2px}@container (max-width: 420px){.av3-scroll{padding:var(--space-4) var(--space-4) var(--space-5)}.av3-foot{padding:var(--space-3) var(--space-4) var(--space-4)}.av3-title{font-size:1.1rem}.av3-btn .long{display:none}.av3-btn .short{display:inline}.av3-fold>summary .one{display:none}.av3-sealed{padding:var(--space-3)}.av3-sealed dl{grid-template-columns:1fr!important;gap:0!important}.av3-sealed dt{margin-top:var(--space-2);font-size:var(--text-caption)}.av3-sealed dt:first-child{margin-top:0}}.av3-busy .av3-scroll{opacity:.05;visibility:hidden;transition:opacity .2s,visibility 0s .2s;pointer-events:none}.av3-stamp{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-1);padding:var(--space-6);text-align:center;animation:av3-fade .2s ease}@keyframes av3-fade{0%{opacity:0}}.av3-stamp-wait{flex-direction:row;gap:var(--space-2);font-size:var(--text-body);color:var(--text-muted);font-weight:500}.av3-spin{width:16px;height:16px;border:2px solid var(--border-strong);border-top-color:var(--text-primary);border-radius:var(--radius-circle);animation:av3-spin .7s linear infinite}@keyframes av3-spin{to{transform:rotate(360deg)}}.av3-check{width:56px;height:56px;stroke:var(--text-primary);stroke-width:2.2;fill:none;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:24;stroke-dashoffset:24;animation:av3-draw .35s ease forwards}@keyframes av3-draw{to{stroke-dashoffset:0}}.av3-stamp-w{font-size:var(--text-h2);font-weight:700;letter-spacing:-.015em}.av3-stamp-t{font-size:var(--text-body-sm);color:var(--text-muted);font-family:var(--font-mono)}@media(prefers-reduced-motion:reduce){.av3-stage,.av3-stage.av3-in,.av3-stage.av3-out{transition:none;animation:none;transform:none}.av3-check{animation:none;stroke-dashoffset:0}.av3-stamp,.av3-next{animation:none}.av3-spin{animation-duration:3s}}.card.av3-other{border:0;border-radius:var(--radius-xl);box-shadow:var(--elevation-1)}.av3-inline .card.av3-card{flex:none;overflow:visible}.av3-inline .av3-scroll{overflow:visible}.av3-split{flex:1;min-height:0;display:grid;grid-template-columns:minmax(0,24rem) minmax(0,680px);gap:var(--space-6);justify-content:center;padding:0 var(--space-6)}.av3-split .av3-pane{max-width:none;margin:0}@media(min-width:480px)and (max-width:1099px){:root{--sidebar-width: 3.5rem}.sidebar{display:flex}.main-content{margin-left:var(--sidebar-width)}.sidebar{overflow:hidden;padding-left:0;padding-right:0;transition:width .15s ease,box-shadow .15s ease}.sidebar:hover,.sidebar:has(:focus-visible){width:15rem;box-shadow:var(--elevation-3)}.sidebar:not(:hover):not(:has(:focus-visible)) .sidebar-label,.sidebar:not(:hover):not(:has(:focus-visible)) .sidebar-group-label{opacity:0}.sidebar-label{white-space:nowrap;transition:opacity .1s}.sidebar-item{position:relative;padding-left:.75rem;padding-right:.5rem}.sidebar:not(:hover):not(:has(:focus-visible)) .sidebar-item>span[class*=nav-],.sidebar:not(:hover):not(:has(:focus-visible)) .sidebar-item>span:not(.icon):not(.sidebar-label){position:absolute!important;top:.15rem;right:.2rem;margin:0!important;min-width:.9rem!important;height:.9rem!important;padding:0 .2rem!important;font-size:.55rem!important}}.main-content:has(.ob-page){background:var(--bg-sunken)}.ob-page{max-width:760px;margin:0 auto}.ob-i{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:1.6;flex:none}.ob-list{display:flex;flex-direction:column;gap:var(--space-3)}.ob-list-item{min-width:0}.ob-page .blocked-list{gap:var(--space-3)}.ob-card,.ob-card.mandate-card,.ob-card.ticket-obj-card,.ob-card.ticket-obj-card.is-open,.ob-card.blocked-card{display:block;background:var(--bg-elevated);border:0;border-left:0;border-radius:var(--radius-xl);box-shadow:var(--elevation-1);padding:var(--space-4) var(--space-5);margin:0;min-width:0}.ob-card.is-open,.ob-card.blocked-card{box-shadow:var(--elevation-2);padding:var(--space-5)}.ob-card:not(.is-open):not(.blocked-card):hover{box-shadow:var(--elevation-2)}.ob-head{display:block;width:100%;text-align:left;background:none;border:0;padding:0;margin:0;font:inherit;color:inherit;cursor:pointer;border-radius:var(--radius-md)}.ob-head:focus-visible,.ob-link:focus-visible,.ob-btn:focus-visible,.ob-fold>summary:focus-visible{outline:2px solid var(--text-primary);outline-offset:2px}.ob-type,.ob-type.obj-line{display:flex;flex-wrap:wrap;align-items:center;gap:.15rem var(--space-2);font-size:var(--text-caption);color:var(--text-muted);margin:0 0 var(--space-1);white-space:normal;overflow:visible}.ob-type>span+span:before{content:"·";margin-right:var(--space-2)}.ob-type>.ob-tag+span:before{content:none}.ob-tag{display:inline-flex;align-items:center;height:20px;padding:0 6px;border-radius:var(--radius-xs);background:var(--neutral);color:var(--bg-elevated);font-size:var(--text-micro);font-weight:700;letter-spacing:.06em;text-transform:uppercase}.ob-st{color:var(--text-primary);font-weight:600}.ob-type .new-pill{background:none;color:var(--text-primary);font-size:inherit;text-transform:none;letter-spacing:0;padding:0;border-radius:0;font-weight:600}.ob-title{display:block;font-size:var(--text-lead);font-weight:600;line-height:1.3;letter-spacing:-.012em;margin:0;padding:0;border:0;text-wrap:pretty;overflow-wrap:anywhere;color:var(--text-primary)}.ob-card.is-open .ob-title,.ob-card.blocked-card .ob-title{font-size:var(--text-h3)}.ob-one{display:block;font-size:var(--text-body-sm);color:var(--text-muted);margin-top:.2rem;overflow-wrap:anywhere}.ob-quiet{font-size:var(--text-caption);color:var(--text-muted);margin:var(--space-1) 0 0}.ob-quiet-inline{color:var(--text-muted);font-weight:400}.ob-bold{font-weight:700;color:var(--text-primary)}.ob-check{display:flex;gap:.4rem;align-items:baseline;font-size:var(--text-body-sm);color:var(--text-primary);margin:var(--space-2) 0 0}.ob-check-x,.ob-check-x b{font-weight:700}.ob-badges{display:flex;flex-wrap:wrap;gap:var(--space-2);margin-top:var(--space-2)}.ob-open{margin-top:var(--space-4)}.ob-tile{background:var(--bg-sunken);border-radius:var(--radius-lg);padding:var(--space-4);margin-top:var(--space-4);font-size:var(--text-body-sm);min-width:0}.ob-tile-h{display:flex;gap:.45rem;align-items:center;font-weight:600;font-size:var(--text-body-sm);letter-spacing:0;text-transform:none;margin:0 0 var(--space-3);padding:0;border:0;color:var(--text-primary)}.ob-part+.ob-part{margin-top:var(--space-4)}.ob-lbl{font-size:var(--text-caption);color:var(--text-muted);margin:0}.ob-intent{font-size:var(--text-lead);line-height:var(--line-normal);margin:.15rem 0 0;color:var(--text-primary);overflow-wrap:anywhere;white-space:pre-wrap}.ob-sent{margin-top:var(--space-4);font-size:var(--text-body-sm)}.ob-sent-h{font-size:var(--text-body-sm);font-weight:600;letter-spacing:0;text-transform:none;margin:0 0 .15rem;padding:0;border:0;color:var(--text-primary)}.ob-after-h{margin-bottom:var(--space-3)}.ob-gap{margin:var(--space-3) 0 var(--space-2)}.ob-text{margin:0;white-space:pre-wrap;overflow-wrap:anywhere}.ob-text.is-sealed{font-weight:600}.ob-text.is-system,.ob-kv dd.is-system{color:var(--prov-system);font-weight:400}.ob-kv{display:grid;grid-template-columns:7.5rem minmax(0,1fr);gap:.35rem var(--space-3);font-size:var(--text-body-sm);margin:0}.ob-kv dt{color:var(--text-muted);font-weight:400;margin:0}.ob-kv dd{margin:0;font-weight:600;min-width:0;overflow-wrap:anywhere;white-space:normal}.ob-kv dd.ob-plain{font-weight:400}.ob-kv.ob-sub{grid-template-columns:minmax(0,1fr) auto auto;gap:.25rem var(--space-3)}.ob-kv.ob-sub dd.ob-use{font-weight:400;color:var(--text-muted);text-align:right}.ob-sealed .ob-kv dd.is-sealed{font-weight:700}.ob-mono{font-family:var(--font-mono);font-size:var(--text-caption);font-weight:400;overflow-wrap:anywhere}.ob-kv dd.ob-mono{font-weight:400}.ob-raw{margin-top:var(--space-2)}.ob-raw>summary{cursor:pointer;color:var(--text-muted);font-size:var(--text-caption)}.ob-raw .ob-mono>div{margin-top:.15rem}.ob-fold{font-size:var(--text-body-sm);margin:var(--space-2) calc(-1 * var(--space-3)) 0;border-radius:var(--radius-md)}.ob-fold[open]{background:var(--bg-sunken)}.ob-fold>summary{list-style:none;display:flex;align-items:center;gap:var(--space-2);min-height:44px;padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);cursor:pointer}.ob-fold>summary::-webkit-details-marker{display:none}.ob-fold>summary:hover{background:var(--accent-subtle)}.ob-fold>summary .h{font-weight:500;white-space:nowrap}.ob-fold>summary .one{flex:1;min-width:0;color:var(--text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ob-fold>summary .ob-chev{flex:none;margin-left:auto;color:var(--text-muted);transition:transform .15s}.ob-fold[open]>summary{font-weight:600}.ob-fold[open]>summary .h{font-weight:600}.ob-fold[open]>summary .one{visibility:hidden}.ob-fold[open]>summary .ob-chev{transform:rotate(90deg)}.ob-fold-body{padding:var(--space-3) var(--space-3) var(--space-4)}.ob-fold[open]>.ob-fold-body{border-top:1px solid var(--border-strong);margin:0 var(--space-3);padding-left:0;padding-right:0}.ob-fold-body>p{margin:0 0 var(--space-2)}.ob-fold-body>.ob-lbl{margin-bottom:var(--space-2)}.ob-fold-body>.ob-kv+.ob-lbl,.ob-fold-body>.ob-kv+p{margin-top:var(--space-2)}.blocked-item .ob-fold{margin-top:var(--space-2);font-size:var(--text-body-sm)}.blocked-item .ob-fold>summary{color:var(--text-primary)}.ob-ticket-row{display:flex;flex-wrap:wrap;gap:0 var(--space-1)}.ob-btns{display:flex;flex-wrap:wrap;gap:var(--space-2);margin-top:var(--space-5)}.ob-btn{flex:1 1 7rem;display:inline-flex;align-items:center;justify-content:center;min-height:44px;padding:0 var(--space-3);border:0;border-radius:var(--radius-md);background:var(--neutral-subtle);color:var(--text-primary);font:inherit;font-size:var(--text-body-sm);font-weight:500;text-decoration:none;cursor:pointer;white-space:nowrap}.ob-btn:hover:not(:disabled){background:var(--border);text-decoration:none}.ob-btn:disabled{color:var(--text-muted);cursor:default}.ob-btn-q{color:var(--text-muted);font-weight:400;white-space:pre}.ob-link{background:none;border:0;padding:0;font:inherit;color:var(--text-primary);text-decoration:underline;text-underline-offset:3px;cursor:pointer;border-radius:var(--radius-xs)}.ob-link:disabled{color:var(--text-muted);cursor:default}.ob-link-strong{color:var(--text-primary);font-weight:600;text-decoration:none}.ob-link-strong:hover{text-decoration:underline}@media(max-width:520px){.ob-card,.ob-card.mandate-card,.ob-card.ticket-obj-card,.ob-card.ticket-obj-card.is-open,.ob-card.blocked-card{padding:var(--space-4)}.ob-kv{grid-template-columns:1fr;gap:0}.ob-kv dd{margin-bottom:.4rem}.ob-kv.ob-sub{grid-template-columns:minmax(0,1fr) auto}.ob-kv.ob-sub dd.ob-use{grid-column:1 / -1;text-align:left;margin-bottom:.3rem}.ob-fold>summary .one{display:none}.ob-btn{flex-basis:45%}}.ob-btns.receipt-foot{border-top:0;padding-top:0}.ob-kv.receipt-rows{border-top:0;padding-top:0;margin-top:var(--space-2)}.ob-kv .receipt-intent{font-style:normal}.ob-type>.ob-area,.av3-type>.av3-area{display:inline-flex;align-items:center;gap:.3rem}.ob-type>.ob-area svg,.av3-type>.av3-area svg{width:1rem;height:1rem;flex:none;color:var(--text-primary)}.main-content:has(.dash-page){background:var(--bg-sunken)}.dash-page .card,.dash-page .setup-card{border:0;border-left:0;border-radius:var(--radius-xl);box-shadow:var(--elevation-2);background:var(--bg-elevated)}.dash-page .flow-step{border-top:0}.dash-cols{grid-template-columns:repeat(3,minmax(0,1fr));margin-top:var(--space-6)}.dash-cols .core-col-h h2,.dash-sec .core-col-h h2{font-size:var(--text-body);font-weight:600;text-transform:none;letter-spacing:0;color:var(--text-primary)}.dash-rows{display:flex;flex-direction:column;gap:var(--space-3);min-width:0}.dash-row{color:inherit;text-decoration:none;cursor:pointer}.dash-row:hover{text-decoration:none}a.dash-row:hover,.dash-row:not([open]):hover{box-shadow:var(--elevation-2)}.dash-row>summary{list-style:none;cursor:pointer;display:block}.dash-row>summary::-webkit-details-marker{display:none}.dash-row .ob-one{display:flex;flex-wrap:wrap;gap:0 var(--space-2)}.dash-row .ob-one>span+span:before{content:"·";margin-right:var(--space-2)}.dash-row.auto-grp .auto-grp-list{margin-top:var(--space-3);padding-top:0;border-top:0}.dash-row .ob-check-x{color:var(--text-primary);display:block}.dash-row .ob-check-x b{font-weight:700}.dash-btn{display:flex;width:100%;margin-top:var(--space-3)}.dash-cols .core-quiet-line{font-size:var(--text-body-sm);color:var(--text-muted);margin:var(--space-3) 0 0}.dash-cols .core-col-empty{font-size:var(--text-body-sm);color:var(--text-muted)}.dash-sec{margin-top:var(--space-8)}.dash-att{padding:var(--space-3)}.dash-att-row{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);font-size:var(--text-body-sm);color:var(--text-primary);text-decoration:none}.dash-att-row:hover{background:var(--bg-sunken);text-decoration:none}.dash-att-row b{font-weight:600;min-width:10rem}.dash-att-row span{flex:1;min-width:0;color:var(--text-muted)}.dash-att-row i{font-style:normal;color:var(--text-muted)}@media(max-width:1100px){.dash-cols{grid-template-columns:1fr;gap:var(--space-6)}}@media(max-width:640px){.dash-att-row{flex-wrap:wrap;gap:0 var(--space-3)}.dash-att-row b{min-width:0;width:100%}}.dash-page .dash-btn{background:var(--border)}.dash-page .dash-btn:hover{background:var(--border-strong)}.dash-cols .core-quiet-line{border-top:0;padding-top:0}.ob-card.mandate-card{scroll-margin-top:calc(var(--nav-height) + var(--update-banner-h, 0px) + var(--sim-banner-h, 0px) + var(--space-4))}.dash-row .ob-type{flex-wrap:nowrap;white-space:nowrap;overflow:hidden}.dash-row .ob-type>span{flex:none}.dash-row .ob-type>.ob-area{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis}
|
package/dist/ui/index.html
CHANGED
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
<meta name="apple-mobile-web-app-title" content="Suveren" />
|
|
15
15
|
<meta name="theme-color" content="#111111" />
|
|
16
16
|
<title>Suveren</title>
|
|
17
|
-
<script type="module" crossorigin src="/assets/index-
|
|
18
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
17
|
+
<script type="module" crossorigin src="/assets/index-DNNXeRpZ.js"></script>
|
|
18
|
+
<link rel="stylesheet" crossorigin href="/assets/index-Osk4E49r.css">
|
|
19
19
|
</head>
|
|
20
20
|
<body>
|
|
21
21
|
<div id="root"></div>
|
|
@@ -37,6 +37,10 @@ This module provides the following parsers:
|
|
|
37
37
|
* [Text body parser](#bodyparsertextoptions)
|
|
38
38
|
* [URL-encoded form body parser](#bodyparserurlencodedoptions)
|
|
39
39
|
|
|
40
|
+
All parsers support automatic inflation of `gzip`, `br` (brotli), `deflate`
|
|
41
|
+
and `zstd` encodings. `zstd` is available in Node.js `^22.15.0` and
|
|
42
|
+
`>=23.8.0`.
|
|
43
|
+
|
|
40
44
|
Other body parsers you might be interested in:
|
|
41
45
|
|
|
42
46
|
- [body](https://www.npmjs.com/package/body#readme)
|
|
@@ -65,6 +69,12 @@ The `bodyParser` object exposes various factories to create middlewares. All
|
|
|
65
69
|
middlewares will populate the `req.body` property with the parsed body when
|
|
66
70
|
the `Content-Type` request header matches the `type` option.
|
|
67
71
|
|
|
72
|
+
**Note** As of v2, `req.body` is left `undefined` when no body is parsed (for
|
|
73
|
+
example when the request has neither `Content-Length` nor `Transfer-Encoding`,
|
|
74
|
+
or when `Content-Type` does not match). In v1, `req.body` was always initialized
|
|
75
|
+
to `{}`. Code that assumes `req.body` is always an object should use optional
|
|
76
|
+
chaining (for example `req.body?.username`) or set a default.
|
|
77
|
+
|
|
68
78
|
The various errors returned by this module are described in the
|
|
69
79
|
[errors section](#errors).
|
|
70
80
|
|
|
@@ -72,8 +82,7 @@ The various errors returned by this module are described in the
|
|
|
72
82
|
|
|
73
83
|
Returns middleware that only parses `json` and only looks at requests where
|
|
74
84
|
the `Content-Type` header matches the `type` option. This parser accepts any
|
|
75
|
-
Unicode encoding of the body
|
|
76
|
-
`br` (brotli) and `deflate` encodings.
|
|
85
|
+
Unicode encoding of the body.
|
|
77
86
|
|
|
78
87
|
A new `body` object containing the parsed data is populated on the `request`
|
|
79
88
|
object after the middleware (i.e. `req.body`).
|
|
@@ -110,7 +119,7 @@ argument. You can find more information on this argument
|
|
|
110
119
|
|
|
111
120
|
##### strict
|
|
112
121
|
|
|
113
|
-
When set to `true`, will only accept arrays and objects; when `false
|
|
122
|
+
When set to `true`, it will only accept arrays and objects; when `false`, it will
|
|
114
123
|
accept anything `JSON.parse` accepts. Defaults to `true`.
|
|
115
124
|
|
|
116
125
|
##### type
|
|
@@ -133,9 +142,7 @@ encoding of the request. The parsing can be aborted by throwing an error.
|
|
|
133
142
|
### bodyParser.raw([options])
|
|
134
143
|
|
|
135
144
|
Returns middleware that parses all bodies as a `Buffer` and only looks at
|
|
136
|
-
requests where the `Content-Type` header matches the `type` option.
|
|
137
|
-
parser supports automatic inflation of `gzip`, `br` (brotli) and `deflate`
|
|
138
|
-
encodings.
|
|
145
|
+
requests where the `Content-Type` header matches the `type` option.
|
|
139
146
|
|
|
140
147
|
A new `body` object containing the parsed data is populated on the `request`
|
|
141
148
|
object after the middleware (i.e. `req.body`). This will be a `Buffer` object
|
|
@@ -181,9 +188,7 @@ encoding of the request. The parsing can be aborted by throwing an error.
|
|
|
181
188
|
### bodyParser.text([options])
|
|
182
189
|
|
|
183
190
|
Returns middleware that parses all bodies as a string and only looks at
|
|
184
|
-
requests where the `Content-Type` header matches the `type` option.
|
|
185
|
-
parser supports automatic inflation of `gzip`, `br` (brotli) and `deflate`
|
|
186
|
-
encodings.
|
|
191
|
+
requests where the `Content-Type` header matches the `type` option.
|
|
187
192
|
|
|
188
193
|
A new `body` string containing the parsed data is populated on the `request`
|
|
189
194
|
object after the middleware (i.e. `req.body`). This will be a string of the
|
|
@@ -234,8 +239,7 @@ encoding of the request. The parsing can be aborted by throwing an error.
|
|
|
234
239
|
|
|
235
240
|
Returns middleware that only parses `urlencoded` bodies and only looks at
|
|
236
241
|
requests where the `Content-Type` header matches the `type` option. This
|
|
237
|
-
parser accepts only UTF-8 and ISO-8859-1 encodings of the body
|
|
238
|
-
automatic inflation of `gzip`, `br` (brotli) and `deflate` encodings.
|
|
242
|
+
parser accepts only UTF-8 and ISO-8859-1 encodings of the body.
|
|
239
243
|
|
|
240
244
|
A new `body` object containing the parsed data is populated on the `request`
|
|
241
245
|
object after the middleware (i.e. `req.body`). This object will contain
|
|
@@ -346,7 +350,7 @@ the entity value that failed parsing.
|
|
|
346
350
|
### entity verify failed
|
|
347
351
|
|
|
348
352
|
This error will occur when the request contained an entity that could not be
|
|
349
|
-
|
|
353
|
+
verified by the defined `verify` option. The `status` property is
|
|
350
354
|
set to `403`, the `type` property is set to `'entity.verify.failed'`, and the
|
|
351
355
|
`body` property is set to the entity value that failed verification.
|
|
352
356
|
|
|
@@ -413,7 +417,7 @@ property is set to the encoding that is unsupported.
|
|
|
413
417
|
|
|
414
418
|
### The input exceeded the depth
|
|
415
419
|
|
|
416
|
-
This error occurs when using `bodyParser.urlencoded` with the `extended` property set to `true` and the input exceeds the configured `depth` option. The `status` property is set to `400`. It is recommended to review the `depth` option and evaluate if it requires a higher value.
|
|
420
|
+
This error occurs when using `bodyParser.urlencoded` with the `extended` property set to `true` and the input exceeds the configured `depth` option. The `status` property is set to `400`. It is recommended to review the `depth` option and evaluate if it requires a higher value. With the default `depth` of `32`, an input with 33 or more levels of nesting gets this error.
|
|
417
421
|
|
|
418
422
|
## Examples
|
|
419
423
|
|
|
@@ -17,7 +17,7 @@ const iconv = require('iconv-lite')
|
|
|
17
17
|
const onFinished = require('on-finished')
|
|
18
18
|
const zlib = require('node:zlib')
|
|
19
19
|
const hasBody = require('type-is').hasBody
|
|
20
|
-
const
|
|
20
|
+
const contentType = require('content-type')
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Module exports.
|
|
@@ -25,6 +25,12 @@ const { getCharset } = require('./utils')
|
|
|
25
25
|
|
|
26
26
|
module.exports = read
|
|
27
27
|
|
|
28
|
+
/**
|
|
29
|
+
* @const
|
|
30
|
+
* whether current node version has zstandard support
|
|
31
|
+
*/
|
|
32
|
+
const hasZstandardSupport = 'createZstdDecompress' in zlib
|
|
33
|
+
|
|
28
34
|
/**
|
|
29
35
|
* Read a request into a buffer and parse.
|
|
30
36
|
*
|
|
@@ -79,38 +85,53 @@ function read (req, res, next, parse, debug, options) {
|
|
|
79
85
|
}
|
|
80
86
|
|
|
81
87
|
let length
|
|
82
|
-
const opts = options
|
|
83
88
|
let stream
|
|
84
89
|
|
|
85
|
-
|
|
86
|
-
|
|
90
|
+
const verify = options.verify
|
|
91
|
+
|
|
92
|
+
// assert charset is supported before creating the decompression stream, so an
|
|
93
|
+
// unsupported charset cannot leave a decoder piped with no error listener
|
|
94
|
+
if (verify && encoding !== null && !iconv.encodingExists(encoding)) {
|
|
95
|
+
return next(createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', {
|
|
96
|
+
charset: encoding.toLowerCase(),
|
|
97
|
+
type: 'charset.unsupported'
|
|
98
|
+
}))
|
|
99
|
+
}
|
|
87
100
|
|
|
88
101
|
try {
|
|
102
|
+
const contentEncoding = (req.headers['content-encoding'] || 'identity').toLowerCase()
|
|
103
|
+
|
|
104
|
+
debug('content-encoding "%s"', contentEncoding)
|
|
105
|
+
|
|
106
|
+
if (options.inflate === false && contentEncoding !== 'identity') {
|
|
107
|
+
throw createError(415, 'content encoding unsupported', {
|
|
108
|
+
encoding: contentEncoding,
|
|
109
|
+
type: 'encoding.unsupported'
|
|
110
|
+
})
|
|
111
|
+
}
|
|
112
|
+
|
|
89
113
|
// get the content stream
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
114
|
+
if (contentEncoding === 'identity') {
|
|
115
|
+
length = req.headers['content-length']
|
|
116
|
+
stream = req
|
|
117
|
+
} else {
|
|
118
|
+
stream = createDecompressionStream(contentEncoding, debug)
|
|
119
|
+
req.pipe(stream)
|
|
120
|
+
}
|
|
93
121
|
} catch (err) {
|
|
94
122
|
return next(err)
|
|
95
123
|
}
|
|
96
124
|
|
|
97
125
|
// set raw-body options
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
? null
|
|
101
|
-
:
|
|
102
|
-
|
|
103
|
-
// assert charset is supported
|
|
104
|
-
if (opts.encoding === null && encoding !== null && !iconv.encodingExists(encoding)) {
|
|
105
|
-
return next(createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', {
|
|
106
|
-
charset: encoding.toLowerCase(),
|
|
107
|
-
type: 'charset.unsupported'
|
|
108
|
-
}))
|
|
126
|
+
const rawBodyOptions = {
|
|
127
|
+
length,
|
|
128
|
+
encoding: verify ? null : encoding,
|
|
129
|
+
limit: options.limit
|
|
109
130
|
}
|
|
110
131
|
|
|
111
132
|
// read body
|
|
112
133
|
debug('read body')
|
|
113
|
-
getBody(stream,
|
|
134
|
+
getBody(stream, rawBodyOptions, function (error, body) {
|
|
114
135
|
if (error) {
|
|
115
136
|
let _error
|
|
116
137
|
|
|
@@ -138,6 +159,17 @@ function read (req, res, next, parse, debug, options) {
|
|
|
138
159
|
return
|
|
139
160
|
}
|
|
140
161
|
|
|
162
|
+
// detach and destroy the decompression stream to
|
|
163
|
+
// avoid decompression errors on the finished stream
|
|
164
|
+
if (stream !== req) {
|
|
165
|
+
req.unpipe(stream)
|
|
166
|
+
stream.on('error', () => {})
|
|
167
|
+
stream.destroy()
|
|
168
|
+
|
|
169
|
+
// consume any remaining bytes so the HTTP request can finish
|
|
170
|
+
req.resume()
|
|
171
|
+
}
|
|
172
|
+
|
|
141
173
|
// verify
|
|
142
174
|
if (verify) {
|
|
143
175
|
try {
|
|
@@ -145,7 +177,7 @@ function read (req, res, next, parse, debug, options) {
|
|
|
145
177
|
verify(req, res, body, encoding)
|
|
146
178
|
} catch (err) {
|
|
147
179
|
next(createError(403, err, {
|
|
148
|
-
body
|
|
180
|
+
body,
|
|
149
181
|
type: err.type || 'entity.verify.failed'
|
|
150
182
|
}))
|
|
151
183
|
return
|
|
@@ -172,38 +204,6 @@ function read (req, res, next, parse, debug, options) {
|
|
|
172
204
|
})
|
|
173
205
|
}
|
|
174
206
|
|
|
175
|
-
/**
|
|
176
|
-
* Get the content stream of the request.
|
|
177
|
-
*
|
|
178
|
-
* @param {Object} req
|
|
179
|
-
* @param {Function} debug
|
|
180
|
-
* @param {boolean} inflate
|
|
181
|
-
* @returns {Object}
|
|
182
|
-
* @private
|
|
183
|
-
*/
|
|
184
|
-
function contentstream (req, debug, inflate) {
|
|
185
|
-
const encoding = (req.headers['content-encoding'] || 'identity').toLowerCase()
|
|
186
|
-
const length = req.headers['content-length']
|
|
187
|
-
|
|
188
|
-
debug('content-encoding "%s"', encoding)
|
|
189
|
-
|
|
190
|
-
if (inflate === false && encoding !== 'identity') {
|
|
191
|
-
throw createError(415, 'content encoding unsupported', {
|
|
192
|
-
encoding: encoding,
|
|
193
|
-
type: 'encoding.unsupported'
|
|
194
|
-
})
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
if (encoding === 'identity') {
|
|
198
|
-
req.length = length
|
|
199
|
-
return req
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
const stream = createDecompressionStream(encoding, debug)
|
|
203
|
-
req.pipe(stream)
|
|
204
|
-
return stream
|
|
205
|
-
}
|
|
206
|
-
|
|
207
207
|
/**
|
|
208
208
|
* Create a decompression stream for the given encoding.
|
|
209
209
|
* @param {string} encoding
|
|
@@ -222,12 +222,16 @@ function createDecompressionStream (encoding, debug) {
|
|
|
222
222
|
case 'br':
|
|
223
223
|
debug('brotli decompress body')
|
|
224
224
|
return zlib.createBrotliDecompress()
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
}
|
|
225
|
+
case 'zstd':
|
|
226
|
+
if (hasZstandardSupport) {
|
|
227
|
+
debug('zstd decompress body')
|
|
228
|
+
return zlib.createZstdDecompress()
|
|
229
|
+
}
|
|
230
230
|
}
|
|
231
|
+
throw createError(415, 'unsupported content encoding "' + encoding + '"', {
|
|
232
|
+
encoding,
|
|
233
|
+
type: 'encoding.unsupported'
|
|
234
|
+
})
|
|
231
235
|
}
|
|
232
236
|
|
|
233
237
|
/**
|
|
@@ -245,3 +249,16 @@ function dump (req, callback) {
|
|
|
245
249
|
req.resume()
|
|
246
250
|
}
|
|
247
251
|
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Get the charset of a request.
|
|
255
|
+
*
|
|
256
|
+
* @param {Object} req
|
|
257
|
+
* @returns {string | undefined}
|
|
258
|
+
* @private
|
|
259
|
+
*/
|
|
260
|
+
function getCharset (req) {
|
|
261
|
+
const header = req.headers['content-type']
|
|
262
|
+
if (!header) return undefined
|
|
263
|
+
return contentType.parse(header).parameters.charset?.toLowerCase()
|
|
264
|
+
}
|