diff --git a/.github/workflows/theme.yml b/.github/workflows/theme.yml index 1935b50..78e1b55 100644 --- a/.github/workflows/theme.yml +++ b/.github/workflows/theme.yml @@ -44,6 +44,18 @@ jobs: # #99: parent styles must load before Xore/APIARY overrides, not # replace them -- css/styles.css is keycloak.v2's own stylesheet. grep -Fxq 'styles=css/styles.css css/xore-theme.css css/login.css' themes/apiary/login/theme.properties + # #91: the account theme vendors its own copy of the identical + # upstream file (Keycloak resolves theme resources per theme + # type, login/ and account/ can't share one file on disk) -- + # nothing enforced these stay identical until now. Byte-diffing + # against login/'s already-checked copy, rather than a second + # independent hash, is deliberate: it catches the copy silently + # drifting out of sync with login/'s (and therefore with + # theme.lock's own pin) without hardcoding a second hash that + # would just be the same value duplicated. + cmp themes/apiary/login/resources/css/xore-theme.css themes/apiary/account/resources/css/xore-theme.css + grep -Fxq 'parent=keycloak.v3' themes/apiary/account/theme.properties + grep -Fxq 'styles=css/xore-theme.css css/account.css' themes/apiary/account/theme.properties - name: Verify Keycloak compatibility record (#101) shell: bash run: .github/scripts/verify-keycloak-compat.sh diff --git a/themes/apiary/account/resources/css/account.css b/themes/apiary/account/resources/css/account.css new file mode 100644 index 0000000..35bf83e --- /dev/null +++ b/themes/apiary/account/resources/css/account.css @@ -0,0 +1,146 @@ +/* APIARY Keycloak account console theme (#91). + keycloak.v3's account console is a compiled React SPA (PatternFly v5) -- + unlike the login theme, there is no FreeMarker markup to override, only + this CSS layered on top of the upstream bundle via theme.properties' + `styles=`. Component-level rules (form/button/alert) below are + deliberately the same selectors and values as ../../login/resources/css/ + login.css: both themes render the identical PatternFly v5 component + library, confirmed live against this exact pinned Keycloak version, so + there is no reason for the two to diverge. */ +/* light dark, not a forced dark-only scheme -- matches ../../login/resources/css/login.css's own convention, deferring to the browser/OS preference rather than assuming one. */ +:root { color-scheme: light dark; } + +html, body, #root { + min-height: 100%; + margin: 0; + background: var(--app-bg); + color: var(--text-primary); + font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; +} + +/* ── Masthead ────────────────────────────────────────────────────────── + Keycloak's own logo/wordmark stays in place for now -- theme.properties' + `logo=` only swaps the image asset, not the surrounding chrome, and this + repo has no APIARY logo asset yet (the login theme uses Keycloak's own + realm displayName as text branding instead; account console has no + equivalent per-page title slot in its masthead). Restyling colors only + here is a real, scoped v1; a full brand-mark swap is separate follow-up + work, not blocked on this. */ +.pf-v5-c-masthead { + background: var(--toolbar-bg); + border-bottom: 1px solid var(--border-subtle); +} +.pf-v5-c-masthead__toggle .pf-v5-c-button { color: var(--text-secondary); } + +/* ── Sidebar navigation ──────────────────────────────────────────────── */ +.pf-v5-c-page__sidebar { background: var(--sidebar-bg); } +.pf-v5-c-page__sidebar-body { background: transparent; } +.pf-v5-c-nav__section-title { color: var(--text-muted); font-size: 11px; letter-spacing: 0.02em; text-transform: uppercase; } +.pf-v5-c-nav__link { + color: var(--text-secondary); + font-size: 13px; + font-weight: 500; +} +.pf-v5-c-nav__link:hover { color: var(--text-primary); background: var(--surface-hover); } +.pf-v5-c-nav__link.pf-m-current { + color: var(--text-primary); + background: var(--accent-soft); + border-left: 3px solid var(--accent); +} +.pf-v5-c-nav__link.pf-m-current::after { border: none; } + +/* ── Main content ────────────────────────────────────────────────────── */ +.pf-v5-c-page__main { background: var(--app-bg); } +.pf-v5-c-page__main-section { background: transparent; } +.pf-v5-c-content h1, .pf-v5-c-content h2, .pf-v5-c-content h3 { + color: var(--text-primary); + font-family: var(--font-display); + font-weight: 400; +} +.pf-v5-c-content p { color: var(--text-secondary); } + +.pf-v5-c-card { + background: var(--surface-0); + border: 1px solid var(--border-subtle); + border-radius: var(--radius-panel); + box-shadow: none; +} +.pf-v5-c-card__title { color: var(--text-primary); } + +/* ── Forms and buttons ─────────────────────────────────────────────── + Identical rules to ../../login/resources/css/login.css -- see that + file's own comments for why the pf-m-secondary custom-property + indirection is required, not optional. */ +.pf-v5-c-form { gap: 16px; } +.pf-v5-c-form__group { margin: 0 0 16px; } +.pf-v5-c-form__label, .pf-v5-c-check__label { + color: var(--text-primary); + font-size: 12px; + font-weight: 600; +} + +.pf-v5-c-form-control { + min-height: 42px; + overflow: hidden; + border: 1px solid var(--border-strong); + border-radius: var(--radius-control); + background: var(--surface-1); + color: var(--text-primary); +} +.pf-v5-c-form-control input, .pf-v5-c-form-control textarea, .pf-v5-c-form-control select { + min-height: 40px; + padding: 9px 11px; + background: transparent; + color: var(--text-primary); +} +.pf-v5-c-form-control:focus-within { + border-color: var(--border-focus); + box-shadow: 0 0 0 3px color-mix(in srgb, var(--border-focus) 22%, transparent); +} +.pf-v5-c-form-control[aria-invalid="true"], .pf-v5-c-form-control:has(input[aria-invalid="true"]) { border-color: var(--danger); } + +.pf-v5-c-input-group { gap: 8px; } +.pf-v5-c-button { + min-height: 40px; + border-radius: var(--radius-control); + font-weight: 650; + transition: background-color var(--transition-fast), border-color var(--transition-fast), color var(--transition-fast), transform var(--transition-fast); +} +.pf-v5-c-button.pf-m-primary { border-color: var(--accent); background: var(--accent); color: var(--text-on-accent); } +.pf-v5-c-button.pf-m-primary:hover, .pf-v5-c-button.pf-m-primary:focus-visible { border-color: var(--accent-hover); background: var(--accent-hover); } +.pf-v5-c-button.pf-m-control { border: 1px solid var(--border-strong); background: var(--surface-1); color: var(--text-secondary); } +.pf-v5-c-button.pf-m-secondary { + --pf-v5-c-button--m-secondary--BackgroundColor: var(--surface-1); + --pf-v5-c-button--m-secondary--Color: var(--text-secondary); + --pf-v5-c-button--m-secondary--after--BorderColor: var(--border-strong); + --pf-v5-c-button--m-secondary--hover--BackgroundColor: var(--surface-2); + --pf-v5-c-button--m-secondary--hover--Color: var(--text-primary); + --pf-v5-c-button--m-secondary--hover--after--BorderColor: var(--border-strong); + --pf-v5-c-button--m-secondary--focus--BackgroundColor: var(--surface-2); + --pf-v5-c-button--m-secondary--focus--Color: var(--text-primary); + --pf-v5-c-button--m-secondary--focus--after--BorderColor: var(--border-focus); +} +.pf-v5-c-button:active { transform: translateY(1px); } + +a { color: var(--text-link); text-underline-offset: 3px; } +a:hover { color: var(--text-link-hover); } + +.pf-v5-c-alert { + margin-bottom: 16px; + border: 1px solid var(--border-subtle); + border-radius: var(--radius-control); + box-shadow: none; +} +.pf-v5-c-alert.pf-m-danger { border-color: color-mix(in srgb, var(--danger) 40%, transparent); background: var(--danger-soft); color: var(--danger-text-on-soft); } +.pf-v5-c-alert.pf-m-success { border-color: color-mix(in srgb, var(--success) 40%, transparent); background: var(--success-soft); } +.pf-v5-c-helper-text, .pf-v5-c-form__helper-text, .pf-v5-c-form__helper-text a { font-size: 11px; } +.pf-v5-c-helper-text__item.pf-m-error, .pf-v5-c-form__helper-text.pf-m-error { color: var(--danger); } + +/* ── Tables (device activity, applications) ─────────────────────────── */ +.pf-v5-c-table { color: var(--text-primary); background: transparent; } +.pf-v5-c-table thead th { color: var(--text-muted); border-bottom: 1px solid var(--border-subtle); } +.pf-v5-c-table tbody tr { border-bottom: 1px solid var(--border-subtle); } + +/* ── Data list (jump-to-section, applications list) ─────────────────── */ +.pf-v5-c-data-list { background: transparent; } +.pf-v5-c-data-list__item { background: transparent; border-bottom: 1px solid var(--border-subtle); } diff --git a/themes/apiary/account/resources/css/xore-theme.css b/themes/apiary/account/resources/css/xore-theme.css new file mode 100644 index 0000000..3e94812 --- /dev/null +++ b/themes/apiary/account/resources/css/xore-theme.css @@ -0,0 +1 @@ +:root{color-scheme:dark;--app-bg: #20201f;--sidebar-bg: #1e1e1c;--toolbar-bg: #242422;--surface-0: #242422;--surface-1: #2c2c2a;--surface-2: #343432;--surface-3: #3d3d3b;--surface-hover: #42423f;--surface-raised: #383835;--border-subtle: rgba(255, 255, 255, .075);--border-strong: rgba(255, 255, 255, .14);--border-focus: rgba(109, 167, 236, .75);--text-primary: #e9e6df;--text-secondary: #a8a49c;--text-muted: #a5a9a6;--text-disabled: #68635e;--text-on-accent: #211a17;--text-link: #6da7ec;--text-link-hover: #93bdf1;--switch-on: #2a78d6;--btn-inverted-bg: #f5f4ef;--btn-inverted-bg-hover: #ffffff;--btn-inverted-text: #161513;--control-knob: #ffffff;--text-on-status: #ffffff;--artwork-bg: #e9e3d6;--overlay-bg: rgba(0, 0, 0, .5);--accent: #d97757;--accent-hover: #e18768;--accent-pressed: #c9684b;--accent-soft: rgba(217, 119, 87, .14);--success: #79c99e;--success-soft: rgba(121, 201, 158, .2);--info: #78a9d4;--info-soft: rgba(120, 169, 212, .2);--warning: #deb36a;--warning-soft: rgba(222, 179, 106, .21);--danger: #dc7774;--danger-soft: rgba(220, 119, 116, .21);--critical: #ff5c5c;--critical-soft: rgba(255, 92, 92, .16);--accent-text-on-soft: #e38f74;--success-text-on-soft: #77cb9e;--info-text-on-soft: #8bb7dd;--warning-text-on-soft: #e1b467;--danger-text-on-soft: #e89b99;--critical-text-on-soft: #ff8080;--radius-xs: 6px;--radius-control: 9px;--radius-panel: 14px;--radius-dialog: 18px;--radius-pill: 999px;--shadow-raised: 0 1px 2px rgba(0, 0, 0, .18), 0 8px 26px rgba(0, 0, 0, .24);--shadow-dialog: 0 2px 6px rgba(0, 0, 0, .3), 0 24px 80px rgba(0, 0, 0, .52);--font-sans: "Fira Sans", "Segoe UI", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;--font-display: "Space Grotesk", "Fira Sans", "Segoe UI", system-ui, sans-serif;--font-mono: "Fira Code", "SFMono-Regular", "Cascadia Code", "Roboto Mono", ui-monospace, monospace;--ease-out: cubic-bezier(0, 0, .2, 1);--transition-fast: .12s var(--ease-out);--transition: .16s var(--ease-out);--toolbar-height: 32px;--sidebar-width: 224px;--sidebar-width-wide: 288px;--content-width: 1120px;--space-xs: 4px;--space-sm: 8px;--space-md: 12px;--space-lg: 16px;--space-xl: 24px;--space-2xl: 32px;--space-3xl: 40px;--font-size-xs: 11px;--font-size-caption: 12px;--font-size-footnote: 13px;--font-size-body: 14px;--font-size-lg: 16px;--font-size-xl: 18px;--bg: var(--app-bg);--bg-primary: var(--app-bg);--bg-secondary: var(--surface-1);--green: var(--success);--green-subtle: var(--success-soft);--blue: var(--info);--blue-subtle: var(--info-soft);--orange: var(--warning);--orange-subtle: var(--warning-soft);--red: var(--danger);--red-subtle: var(--danger-soft);--accent-subtle: var(--accent-soft);--radius-sm: var(--radius-control);--radius-md: 8px;--radius-lg: var(--radius-panel);--radius-xl: var(--radius-dialog);--shadow-card: none;--shadow-modal: var(--shadow-dialog)}[data-theme=light]{color-scheme:light;--app-bg: #f7f6f2;--sidebar-bg: #f0efeb;--toolbar-bg: #f5f4f0;--surface-0: #fbfaf7;--surface-1: #f4f2ed;--surface-2: #ebe9e3;--surface-3: #e1dfd8;--surface-hover: #e9e7e1;--surface-raised: #fffefa;--border-subtle: rgba(34, 31, 28, .09);--border-strong: rgba(34, 31, 28, .18);--text-primary: #2f2b27;--text-secondary: #68615a;--text-muted: #66615b;--text-disabled: #aaa49d;--text-on-accent: #fffaf5;--text-link: #2a78d6;--text-link-hover: #2566d0;--switch-on: #2566d0;--border-focus: #1f5fae;--btn-inverted-bg: #262421;--btn-inverted-bg-hover: #151412;--btn-inverted-text: #f5f4ef;--control-knob: #ffffff;--text-on-status: #ffffff;--artwork-bg: #e9e3d6;--overlay-bg: rgba(34, 31, 28, .36);--accent: #af593f;--accent-hover: #a34d35;--accent-pressed: #93422d;--accent-soft: rgba(199, 101, 72, .12);--success: #3f8764;--success-soft: rgba(63, 135, 100, .18);--info: #487eaa;--info-soft: rgba(72, 126, 170, .18);--warning: #9b6b25;--warning-soft: rgba(155, 107, 37, .19);--danger: #b34f4c;--danger-soft: rgba(179, 79, 76, .2);--critical: #c53030;--critical-soft: rgba(197, 48, 48, .13);--accent-text-on-soft: #a2472b;--success-text-on-soft: #317152;--info-text-on-soft: #396991;--warning-text-on-soft: #885c1c;--danger-text-on-soft: #a64441;--critical-text-on-soft: #b82929;--shadow-raised: 0 1px 2px rgba(48, 42, 36, .11), 0 8px 26px rgba(48, 42, 36, .16);--shadow-dialog: 0 2px 6px rgba(48, 42, 36, .12), 0 24px 70px rgba(48, 42, 36, .19)}@media (prefers-color-scheme: light){:root:not([data-theme]){color-scheme:light;--app-bg: #f7f6f2;--sidebar-bg: #f0efeb;--toolbar-bg: #f5f4f0;--surface-0: #fbfaf7;--surface-1: #f4f2ed;--surface-2: #ebe9e3;--surface-3: #e1dfd8;--surface-hover: #e9e7e1;--surface-raised: #fffefa;--border-subtle: rgba(34, 31, 28, .09);--border-strong: rgba(34, 31, 28, .18);--text-primary: #2f2b27;--text-secondary: #68615a;--text-muted: #66615b;--text-disabled: #aaa49d;--text-on-accent: #fffaf5;--text-link: #2a78d6;--text-link-hover: #2566d0;--switch-on: #2566d0;--border-focus: #1f5fae;--btn-inverted-bg: #262421;--btn-inverted-bg-hover: #151412;--btn-inverted-text: #f5f4ef;--control-knob: #ffffff;--text-on-status: #ffffff;--artwork-bg: #e9e3d6;--overlay-bg: rgba(34, 31, 28, .36);--accent: #af593f;--accent-hover: #a34d35;--accent-pressed: #93422d;--accent-soft: rgba(199, 101, 72, .12);--success: #3f8764;--success-soft: rgba(63, 135, 100, .18);--info: #487eaa;--info-soft: rgba(72, 126, 170, .18);--warning: #9b6b25;--warning-soft: rgba(155, 107, 37, .19);--danger: #b34f4c;--danger-soft: rgba(179, 79, 76, .2);--critical: #c53030;--critical-soft: rgba(197, 48, 48, .13);--accent-text-on-soft: #a2472b;--success-text-on-soft: #317152;--info-text-on-soft: #396991;--warning-text-on-soft: #885c1c;--danger-text-on-soft: #a64441;--critical-text-on-soft: #b82929;--shadow-raised: 0 1px 2px rgba(48, 42, 36, .11), 0 8px 26px rgba(48, 42, 36, .16);--shadow-dialog: 0 2px 6px rgba(48, 42, 36, .12), 0 24px 70px rgba(48, 42, 36, .19)}}*,*:before,*:after{box-sizing:border-box}html{min-height:100%;background:var(--app-bg);font-size:14px;scrollbar-gutter:stable}body{min-height:100%;margin:0;background:var(--app-bg);color:var(--text-primary);font-family:var(--font-sans);font-size:var(--font-size-body);line-height:1.5;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}button,input,select,textarea{font:inherit}button,a,input,select,textarea{-webkit-tap-highlight-color:transparent}a{color:var(--text-link);text-underline-offset:3px}a:hover{color:var(--text-link-hover)}img,svg{display:block}h1,h2,h3,h4,p{margin-top:0}h1,h2,h3,h4{color:var(--text-primary);font-family:var(--font-display);font-weight:600;line-height:1.2}h1{font-size:clamp(1.65rem,2.4vw,2.2rem);letter-spacing:-.025em}h2{font-size:1.25rem;letter-spacing:-.012em}h3{font-size:var(--font-size-lg)}p{color:var(--text-secondary)}.heading-serif{font-family:var(--font-display);font-weight:400;letter-spacing:-.035em}.mono,code,kbd{font-family:var(--font-mono)}.text-muted{color:var(--text-muted)}.text-secondary{color:var(--text-secondary)}.text-danger{color:var(--danger)}.label-section,.sidebar__section-label{color:var(--text-muted);font-size:var(--font-size-xs);font-weight:600;letter-spacing:.075em;text-transform:uppercase}.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}::selection{background:var(--accent-soft);color:var(--text-primary)}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes dialog-in{0%{opacity:0;transform:translateY(calc(-50% + 8px)) scale(.99)}to{opacity:1;transform:translateY(-50%) scale(1)}}@keyframes stagger-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}.stagger-in>*{animation:stagger-in .22s var(--ease-out) backwards}.stagger-in>*:nth-child(1){animation-delay:0ms}.stagger-in>*:nth-child(2){animation-delay:45ms}.stagger-in>*:nth-child(3){animation-delay:90ms}.stagger-in>*:nth-child(4){animation-delay:135ms}.stagger-in>*:nth-child(5){animation-delay:.18s}.stagger-in>*:nth-child(6){animation-delay:225ms}.stagger-in>*:nth-child(7){animation-delay:.27s}.stagger-in>*:nth-child(8){animation-delay:315ms}.stagger-in>*:nth-child(9){animation-delay:.36s}.stagger-in>*:nth-child(10){animation-delay:405ms}.stagger-in>*:nth-child(11){animation-delay:.45s}.stagger-in>*:nth-child(n+12){animation-delay:495ms}@keyframes flash-ring{0%{box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 55%,transparent),0 0 16px 2px color-mix(in srgb,var(--accent) 25%,transparent)}to{box-shadow:0 0 #0000,0 0 #0000}}.flash{animation:flash-ring .9s var(--ease-out)}.skeleton,.skeleton-line{position:relative;overflow:hidden;background:var(--surface-2);border-radius:var(--radius-control)}.skeleton:after,.skeleton-line:after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--surface-3) 60%,transparent),transparent);animation:skeleton-sweep 1.4s ease-in-out infinite}@keyframes skeleton-sweep{0%{transform:translate(-100%)}to{transform:translate(100%)}}.skeleton-line{height:12px;margin-bottom:8px;border-radius:var(--radius-xs)}.skeleton-line:last-child{margin-bottom:0}@keyframes timeline-block-in{0%{opacity:0;filter:blur(4px);transform:translateY(5px) scale(.98)}to{opacity:1;filter:blur(0);transform:none}}.timeline-block{animation:timeline-block-in .32s var(--ease-out) backwards}.btn{display:inline-flex;min-height:34px;align-items:center;justify-content:center;gap:7px;padding:7px 13px;border:1px solid transparent;border-radius:var(--radius-control);background:transparent;color:var(--text-primary);font-size:var(--font-size-footnote);font-weight:500;line-height:1;text-decoration:none;white-space:nowrap;cursor:pointer;transition:background var(--transition-fast),border-color var(--transition-fast),color var(--transition-fast),transform var(--transition-fast)}.btn:hover{text-decoration:none}.btn:active{transform:translateY(1px)}.btn:disabled{opacity:.42;cursor:not-allowed;transform:none}.btn svg{width:15px;height:15px}.btn-primary{background:var(--btn-inverted-bg);color:var(--btn-inverted-text)}.btn-primary:hover{background:var(--btn-inverted-bg-hover);color:var(--btn-inverted-text)}.btn-secondary{border-color:var(--border-strong);background:var(--surface-1)}.btn-secondary:hover{background:var(--surface-2)}.btn-ghost{color:var(--text-secondary)}.btn-ghost:hover{background:var(--surface-2);color:var(--text-primary)}.btn-danger{border-color:color-mix(in srgb,var(--danger) 32%,transparent);background:var(--danger-soft);color:var(--danger)}.btn-danger:hover{background:color-mix(in srgb,var(--danger) 20%,transparent)}.btn-sm{min-height:28px;padding:5px 9px;font-size:var(--font-size-caption)}.btn-lg{min-height:42px;padding:10px 17px;font-size:var(--font-size-body)}.btn-icon{width:32px;min-height:32px;padding:0;border-radius:var(--radius-control)}.form-group{margin-bottom:16px}.form-label{display:block;margin-bottom:6px;color:var(--text-secondary);font-size:var(--font-size-caption);font-weight:500}.form-help,.form-error{margin-top:5px;font-size:var(--font-size-xs);line-height:1.4}.form-help{color:var(--text-muted)}.form-error{color:var(--danger)}.form-input{width:100%;min-height:38px;padding:8px 11px;border:1px solid var(--border-subtle);border-radius:var(--radius-control);outline:none;background:var(--surface-1);color:var(--text-primary);font-size:var(--font-size-footnote);transition:background var(--transition-fast),border-color var(--transition-fast),box-shadow var(--transition-fast)}.form-input:hover{border-color:var(--border-strong)}.form-input:focus{border-color:var(--border-focus);box-shadow:0 0 0 3px var(--accent-soft);background:var(--surface-0)}.form-input::placeholder{color:var(--text-muted)}.form-input:disabled{color:var(--text-disabled);opacity:.62;cursor:not-allowed}textarea.form-input{min-height:92px;resize:vertical}select.form-input{cursor:pointer}.search-field,.sidebar__search{display:flex;min-height:32px;align-items:center;gap:8px;padding:5px 9px;border:1px solid transparent;border-radius:var(--radius-control);background:var(--surface-2);color:var(--text-muted)}.search-field:focus-within,.sidebar__search:focus-within{border-color:var(--border-focus);box-shadow:0 0 0 2px var(--accent-soft)}.search-field input,.sidebar__search input{width:100%;border:0;outline:0;background:transparent;color:var(--text-primary);font-size:var(--font-size-caption)}.search-field svg,.sidebar__search-icon{width:14px;height:14px;flex:none}.check{display:inline-flex;align-items:center;gap:8px;color:var(--text-secondary);font-size:var(--font-size-footnote);cursor:pointer}.check input{width:15px;height:15px;accent-color:var(--accent)}.switch{position:relative;display:inline-flex;width:34px;height:20px;flex:none}.switch input{position:absolute;opacity:0;pointer-events:none}.switch span{width:100%;border-radius:var(--radius-pill);background:var(--surface-3);transition:background var(--transition-fast)}.switch span:after{content:"";position:absolute;top:3px;left:3px;width:14px;height:14px;border-radius:50%;background:var(--text-secondary);transition:transform var(--transition-fast),background var(--transition-fast)}.switch input:checked+span{background:var(--switch-on)}.switch input:checked+span:after{transform:translate(14px);background:var(--control-knob)}.card{display:flex;flex-direction:column;margin-bottom:14px;padding:var(--space-lg) var(--space-xl);border:1px solid var(--border-subtle);border-radius:var(--radius-panel);background:var(--surface-1)}.card--raised{background:var(--surface-raised);border-color:var(--border-strong);box-shadow:var(--shadow-raised)}.card__title{margin-bottom:4px;color:var(--text-primary);font-size:var(--font-size-body);font-weight:600}.card__desc{margin-bottom:14px;color:var(--text-secondary);font-size:var(--font-size-caption)}.card__content{flex:1 1 auto;min-height:0}.card__footer{flex:0 0 auto;margin-top:auto;padding-top:12px;color:var(--text-secondary);font-size:var(--font-size-caption)}.card__row{display:flex;min-height:50px;align-items:center;justify-content:space-between;gap:18px;padding:10px 0;border-bottom:1px solid var(--border-subtle)}.card__row:last-child{border-bottom:0}.card__label{color:var(--text-primary);font-size:var(--font-size-footnote);flex:0 0 auto}.card__value{color:var(--text-secondary);font-size:var(--font-size-caption);min-width:0;word-break:break-all}.card__value--mono{padding:3px 7px;border-radius:var(--radius-xs);background:var(--surface-2);font-family:var(--font-mono);font-size:var(--font-size-xs)}.metric-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:10px}.metric{min-width:0;padding:var(--space-md) var(--space-lg);border:1px solid var(--border-subtle);border-radius:var(--radius-panel);background:var(--surface-1)}.metric__label{color:var(--text-muted);font-size:var(--font-size-xs)}.metric__value{margin-top:6px;color:var(--text-primary);font-size:24px;font-weight:600;letter-spacing:-.03em}.metric__trend{margin-top:4px;color:var(--text-secondary);font-size:var(--font-size-xs)}.metric__trend--up{color:var(--success)}.metric__trend--down{color:var(--danger)}.metric__trend--up:before{content:"\2191"}.metric__trend--down:before{content:"\2193"}.mini-chart{display:flex;align-items:flex-end;gap:4px;height:64px}.mini-chart span{--v: 0;flex:1;min-width:0;height:calc(var(--v) * 1%);min-height:2px;border-radius:3px 3px 0 0;background:var(--accent-soft);border-top:2px solid var(--accent)}.heatmap{display:flex;flex-direction:column;gap:3px}.heatmap__row{display:flex;align-items:center;gap:8px}.heatmap__label{flex:none;width:96px;overflow:hidden;color:var(--text-muted);font-size:var(--font-size-xs);text-align:right;text-overflow:ellipsis;white-space:nowrap}.heatmap__cells{display:flex;flex:1;min-width:0;gap:3px}.heatmap__cell{--v: 0;flex:1;min-width:0;aspect-ratio:1;border-radius:var(--radius-xs);background:color-mix(in srgb,var(--accent) calc(var(--v) * 1%),var(--surface-2))}.heatmap__legend{display:flex;align-items:center;gap:4px;color:var(--text-muted);font-size:var(--font-size-xs)}.heatmap__legend .heatmap__cell{flex:none;width:10px;height:10px}[data-tip]{position:relative}[data-tip]:after{content:attr(data-tip);position:absolute;bottom:calc(100% + 6px);left:50%;transform:translate(-50%) translateY(4px);padding:5px 9px;border-radius:var(--radius-control);background:var(--surface-raised);color:var(--text-primary);font-size:var(--font-size-xs);white-space:nowrap;box-shadow:var(--shadow-raised);opacity:0;pointer-events:none;transition:opacity var(--transition-fast),transform var(--transition-fast);z-index:40}[data-tip]:hover:after,[data-tip]:focus-visible:after{opacity:1;transform:translate(-50%) translateY(0)}.badge{display:inline-flex;align-items:center;gap:5px;padding:2px 7px;border-radius:var(--radius-control);background:var(--surface-2);color:var(--text-secondary);font-size:var(--font-size-xs);font-weight:500;line-height:1.45;white-space:nowrap;text-decoration:none}.badge--accent{background:var(--accent-soft);color:var(--accent-text-on-soft)}.badge--green,.badge--success{background:var(--success-soft);color:var(--success-text-on-soft)}.badge--blue,.badge--info{background:var(--info-soft);color:var(--info-text-on-soft)}.badge--orange,.badge--warning{background:var(--warning-soft);color:var(--warning-text-on-soft)}.badge--red,.badge--danger{background:var(--danger-soft);color:var(--danger-text-on-soft)}.badge--critical{border:1px solid color-mix(in srgb,var(--critical) 45%,transparent);background:var(--critical-soft);color:var(--critical-text-on-soft)}.badge--muted{border:1px solid var(--border-subtle)}.badge--current{background:var(--info-soft);color:var(--info-text-on-soft)}.badge--solid{border:0;background:var(--switch-on);color:var(--text-on-status)}.status-dot{width:7px;height:7px;border-radius:50%;background:currentColor}.alert{display:flex;gap:10px;padding:var(--space-sm) var(--space-md);border:1px solid var(--border-subtle);border-radius:var(--radius-control);background:var(--surface-1);color:var(--text-secondary);font-size:var(--font-size-caption)}.alert--info{border-color:color-mix(in srgb,var(--info) 28%,transparent);background:var(--info-soft);color:var(--info-text-on-soft)}.alert--success{border-color:color-mix(in srgb,var(--success) 28%,transparent);background:var(--success-soft);color:var(--success-text-on-soft)}.alert--warning{border-color:color-mix(in srgb,var(--warning) 28%,transparent);background:var(--warning-soft);color:var(--warning-text-on-soft)}.alert--danger{border-color:color-mix(in srgb,var(--danger) 28%,transparent);background:var(--danger-soft)}.alert--critical{border-color:color-mix(in srgb,var(--critical) 40%,transparent);background:var(--critical-soft);color:var(--critical-text-on-soft)}.tabs{display:inline-flex;gap:2px;padding:3px;border:1px solid var(--border-subtle);border-radius:calc(var(--radius-control) + 3px);background:var(--surface-1)}.tab{min-height:28px;padding:5px 10px;border:0;border-radius:var(--radius-control);background:transparent;color:var(--text-secondary);font-size:var(--font-size-caption);cursor:pointer}.tab:hover{color:var(--text-primary)}.tab.active,.tab[aria-selected=true]{background:var(--surface-3);color:var(--text-primary)}.data-table{width:100%;border-collapse:collapse;border-spacing:0}.data-table th{padding:8px 10px;border-bottom:1px solid var(--border-subtle);color:var(--text-muted);font-size:var(--font-size-xs);font-weight:500;text-align:left}.data-table td{padding:10px;border-bottom:1px solid var(--border-subtle);color:var(--text-primary);font-size:var(--font-size-caption);vertical-align:middle;overflow-wrap:break-word}.data-table tbody tr:last-child td{border-bottom:0}.data-table tbody tr:hover td{background:var(--surface-hover)}.table-scroll{width:100%;overflow-x:auto}@media (max-width: 720px){.data-table--responsive,.data-table--responsive thead,.data-table--responsive tbody,.data-table--responsive th,.data-table--responsive td,.data-table--responsive tr{display:block}.data-table--responsive thead tr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;clip:rect(0 0 0 0);overflow:hidden}.data-table--responsive tbody tr{margin-bottom:12px;border:1px solid var(--border-subtle);border-radius:var(--radius-panel);padding:4px 0;overflow:hidden}.data-table--responsive tbody tr:last-child{margin-bottom:0}.data-table--responsive td{padding:7px 14px;border-bottom:1px solid var(--border-subtle);white-space:normal;overflow-wrap:break-word}.data-table--responsive tr td:last-child{border-bottom:0}.data-table--responsive td:before{content:attr(data-label);display:block;margin-bottom:2px;color:var(--text-muted);font-size:var(--font-size-xs);font-weight:500}.data-table--responsive td:empty{display:none}.card.wide .data-table--responsive,.data-table--responsive{min-width:0}}.progress{height:6px;overflow:hidden;border-radius:var(--radius-pill);background:var(--surface-3)}.progress>span{display:block;width:calc(var(--v) * 1%);height:100%;border-radius:inherit;background:var(--accent);--v: 0}.breadcrumb{display:flex;align-items:center;gap:6px;color:var(--text-muted);font-size:var(--font-size-caption)}.breadcrumb a{color:var(--text-secondary);text-decoration:none}.breadcrumb a:hover{color:var(--text-primary)}.pagination{display:inline-flex;gap:3px}.pagination .btn{min-width:30px;padding-inline:8px}.empty-state{display:grid;min-height:220px;place-items:center;padding:var(--space-2xl);text-align:center}.empty-state__icon{display:grid;width:42px;height:42px;margin:0 auto 12px;place-items:center;border-radius:var(--radius-panel);background:var(--surface-2);color:var(--text-muted)}.empty-state h3{margin-bottom:5px;font-family:var(--font-display);font-weight:400;font-size:var(--font-size-xl)}.empty-state p{max-width:380px;margin-bottom:16px;font-size:var(--font-size-caption)}.avatar{display:inline-grid;width:30px;height:30px;place-items:center;border-radius:50%;background:var(--accent-soft);color:var(--accent);font-size:var(--font-size-xs);font-weight:700}.dropdown{min-width:190px;padding:5px;border:1px solid var(--border-strong);border-radius:var(--radius-panel);background:var(--surface-raised);box-shadow:var(--shadow-raised)}.dropdown__item{display:flex;width:100%;min-height:32px;align-items:center;gap:9px;padding:6px 9px;border:0;border-radius:var(--radius-control);background:transparent;color:var(--text-primary);font-size:var(--font-size-caption);text-align:left;cursor:pointer}.dropdown__item:hover{background:var(--surface-2)}.dropdown__divider{height:1px;margin:5px;background:var(--border-subtle)}.dropdown__shortcut{margin-left:auto;color:var(--text-muted);font-size:var(--font-size-xs);letter-spacing:.02em}.dropdown__item--accent{color:var(--text-link)}.dropdown__chevron{margin-left:auto;color:var(--text-muted)}.action-menu{position:relative;display:inline-block}.popover{position:relative;display:inline-block;--popover-width: 200px}.action-menu>summary{display:flex;width:32px;height:32px;align-items:center;justify-content:center;border:1px solid var(--border-subtle);border-radius:var(--radius-control);background:transparent;color:var(--text-secondary);font-size:20px;line-height:1;list-style:none;cursor:pointer}.action-menu>summary::-webkit-details-marker{display:none}.action-menu>summary:hover,.action-menu[open]>summary{background:var(--surface-2);color:var(--text-primary)}.action-menu__popover,.popover__panel{position:absolute;z-index:30;top:calc(100% + 6px);right:0;width:var(--popover-width, 200px);padding:6px;border:1px solid var(--border-strong);border-radius:var(--radius-panel);background:var(--surface-raised);box-shadow:var(--shadow-raised)}.action-menu__item{display:block;width:100%;padding:8px 10px;border:0;border-radius:var(--radius-control);background:transparent;color:var(--text-primary);font:inherit;font-size:var(--font-size-caption);text-align:left;white-space:nowrap;cursor:pointer}.action-menu__item:hover{background:var(--surface-hover)}.action-menu__item--danger{margin-top:4px;padding-top:10px;border-top:1px solid var(--border-subtle);border-radius:0;color:var(--danger)}@keyframes toast-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}@keyframes toast-slide-in-right{0%{opacity:0;transform:translate(16px)}to{opacity:1;transform:none}}.toast{display:flex;max-width:360px;align-items:flex-start;gap:10px;padding:11px 13px;border:1px solid var(--border-strong);border-radius:8px;background:var(--surface-raised);box-shadow:var(--shadow-raised);color:var(--text-primary);font-size:var(--font-size-caption);animation:toast-in .2s var(--ease-out) backwards}.toast--slide-in-right{animation:toast-slide-in-right .2s var(--ease-out) backwards}kbd{padding:2px 5px;border:1px solid var(--border-strong);border-bottom-width:2px;border-radius:4px;background:var(--surface-2);color:var(--text-secondary);font-size:var(--font-size-xs)}pre{overflow:auto;padding:14px;border:1px solid var(--border-subtle);border-radius:var(--radius-control);background:var(--sidebar-bg);color:var(--text-secondary);font-size:var(--font-size-caption)}.segmented{display:inline-flex;gap:2px;padding:3px;border:1px solid var(--border-subtle);border-radius:calc(var(--radius-control) + 3px);background:var(--surface-1)}.segmented button{display:inline-flex;min-height:28px;align-items:center;justify-content:center;gap:6px;padding:4px 11px;border:0;border-radius:var(--radius-control);background:transparent;color:var(--text-secondary);font-size:var(--font-size-caption);cursor:pointer}.segmented button:hover{color:var(--text-primary)}.segmented button.active,.segmented button[aria-pressed=true]{background:var(--surface-3);color:var(--text-primary)}.segmented button svg{width:14px;height:14px}.segmented--icon button{min-height:32px;padding:5px 10px}.segmented--icon button svg{width:16px;height:16px}.chip{display:inline-flex;min-height:32px;align-items:center;gap:7px;padding:6px 14px;border:1px solid var(--border-subtle);border-radius:var(--radius-pill);background:var(--surface-2);color:var(--text-primary);font-size:12.5px;cursor:pointer;transition:background var(--transition-fast),border-color var(--transition-fast)}.chip:hover{background:var(--surface-hover);border-color:var(--border-strong)}.chip svg{width:14px;height:14px;opacity:.75}.onboarding-card{padding:18px;border:1px solid var(--border-subtle);border-radius:var(--radius-panel);background:var(--surface-1)}.onboarding-card__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}.onboarding-card__title{color:var(--text-primary);font-size:var(--font-size-body);font-weight:600}.onboarding-card__count{color:var(--text-muted);font-size:var(--font-size-xs)}.onboarding-card__progress{display:flex;gap:6px;margin-bottom:16px}.onboarding-card__step{flex:1;height:3px;border-radius:var(--radius-pill);background:var(--surface-3)}.onboarding-card__step--completed{background:var(--accent)}.onboarding-card__checklist{list-style:none;padding:0;margin:0}.onboarding-card__checklist li{display:flex;align-items:center;gap:10px;padding:8px 0;color:var(--text-secondary);font-size:var(--font-size-footnote);border-bottom:1px solid var(--border-subtle)}.onboarding-card__checklist li:last-child{border-bottom:0}.onboarding-card__checklist li.completed{color:var(--text-muted);text-decoration:line-through}.message{display:flex;gap:14px;padding:18px 0}.message__avatar{flex:none}.message__content{flex:1;min-width:0}.message__meta{display:flex;align-items:center;gap:8px;margin-bottom:6px;color:var(--text-muted);font-size:var(--font-size-xs)}.message__bubble{padding:14px 18px;border-radius:var(--radius-panel);background:var(--surface-1);color:var(--text-primary);font-size:var(--font-size-body);line-height:1.6}.message--user .message__bubble{background:var(--surface-2)}.project-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:14px}.project-card{min-width:0;padding:18px;border:1px solid var(--border-subtle);border-radius:var(--radius-panel);background:var(--surface-1);transition:background var(--transition-fast),border-color var(--transition-fast);cursor:pointer}.project-card:hover{background:var(--surface-2);border-color:var(--border-strong)}.project-card__header{display:flex;align-items:center;gap:10px;margin-bottom:8px}.project-card__icon{display:grid;place-items:center;width:32px;height:32px;flex:none;border-radius:var(--radius-control);background:var(--accent-soft);color:var(--accent)}.project-card__icon svg{width:16px;height:16px}.project-card__title{flex:1;min-width:0;color:var(--text-primary);font-size:var(--font-size-body);font-weight:600}.project-card__badge{flex:none}.project-card__badges{display:flex;flex:none;flex-wrap:wrap;gap:5px}.project-card__desc{color:var(--text-secondary);font-size:var(--font-size-caption);line-height:1.5;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.project-card__meta{display:flex;align-items:center;gap:8px;margin-top:12px;color:var(--text-muted);font-size:var(--font-size-xs)}.catalog-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:14px}.catalog-card{display:flex;flex-direction:column;gap:10px;padding:16px;border:1px solid var(--border-subtle);border-radius:var(--radius-panel);background:var(--surface-1);transition:background var(--transition-fast),border-color var(--transition-fast)}.catalog-card:hover{background:var(--surface-2);border-color:var(--border-strong)}.catalog-card__header{display:flex;align-items:flex-start;gap:10px}.catalog-card__icon{display:grid;place-items:center;width:36px;height:36px;flex:none;border-radius:var(--radius-control);background:var(--accent-soft);color:var(--accent)}.catalog-card__icon svg{width:18px;height:18px}.catalog-card__title-group{flex:1;min-width:0}.catalog-card__title{color:var(--text-primary);font-size:var(--font-size-body);font-weight:600}.catalog-card__badges{display:flex;flex-wrap:wrap;gap:5px;margin-top:4px}.catalog-card__desc{flex:1;color:var(--text-secondary);font-size:var(--font-size-caption);line-height:1.5}.catalog-card__add{display:grid;place-items:center;align-self:flex-end;width:28px;height:28px;border:1px solid var(--border-strong);border-radius:50%;background:transparent;color:var(--text-secondary);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.catalog-card__add:hover{background:var(--accent);border-color:var(--accent);color:var(--text-on-accent)}.catalog-card__add svg{width:14px;height:14px}.modal__header{display:flex;align-items:center;gap:12px;padding:12px 16px;border-bottom:1px solid var(--border-subtle)}.modal__header-title{flex:1;color:var(--text-primary);font-size:var(--font-size-lg);font-weight:600}.modal__header .search-field{flex:1;max-width:320px}.app-shell{display:grid;min-height:100dvh;grid-template:var(--toolbar-height) 1fr / var(--sidebar-width) minmax(0,1fr);background:var(--app-bg)}.app-shell--wide{grid-template-columns:var(--sidebar-width-wide) minmax(0,1fr)}.app-toolbar{z-index:20;grid-column:1 / -1;display:flex;height:var(--toolbar-height);align-items:center;gap:4px;padding:0 6px;border-bottom:1px solid var(--border-subtle);background:var(--toolbar-bg)}.app-toolbar__title{flex:1;color:var(--text-muted);font-size:var(--font-size-xs);text-align:center}.app-sidebar{display:flex;min-height:0;flex-direction:column;padding:10px 8px;border-right:1px solid var(--border-subtle);background:var(--sidebar-bg)}.app-sidebar__body{flex:1;overflow-y:auto}.app-main{min-width:0;overflow:auto}.app-content{width:min(100% - 40px,var(--content-width));margin:0 auto;padding:30px 0 96px}.app-content--wide{--content-width: min(94vw, 2200px)}.sidebar__search{margin-bottom:12px}.sidebar__section-label{padding:12px 9px 5px}.sidebar__item{display:flex;width:100%;min-height:32px;align-items:center;gap:9px;padding:6px 9px;border:0;border-radius:var(--radius-control);background:transparent;color:var(--text-secondary);font-size:var(--font-size-caption);text-align:left;cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast)}.sidebar__item:hover,.sidebar__item.active{background:var(--surface-2);color:var(--text-primary)}.sidebar__item svg{width:15px;height:15px;opacity:.72}.sidebar__profile{display:flex;align-items:center;gap:9px;padding:9px;border-top:1px solid var(--border-subtle)}.command-bar{position:fixed;z-index:30;right:24px;bottom:18px;left:calc(var(--sidebar-width) + 24px);width:min(720px,calc(100vw - var(--sidebar-width) - 48px));margin:auto;padding:7px;border:1px solid var(--border-strong);border-radius:var(--radius-panel);background:var(--surface-raised);box-shadow:var(--shadow-raised)}.command-bar .form-input{border:0;background:transparent;box-shadow:none}.modal-backdrop{position:fixed;z-index:100;inset:0;visibility:hidden;background:var(--overlay-bg);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);opacity:0;pointer-events:none;transition:opacity var(--transition),visibility var(--transition)}.modal-backdrop.open{visibility:visible;opacity:1;pointer-events:auto}.modal{position:fixed;z-index:101;top:50%;left:0;right:0;margin-inline:auto;display:none;width:min(1280px,calc(100vw - 40px));height:min(840px,calc(100dvh - 40px));margin-block:0;padding:0;overflow:hidden;transform:translateY(-50%);border:1px solid var(--border-strong);border-radius:var(--radius-dialog);background:var(--surface-0);box-shadow:var(--shadow-dialog);color:var(--text-primary);opacity:0}.modal.open{display:flex;opacity:1;animation:dialog-in var(--transition)}.modal--permanent{inset:0;display:flex;width:100vw;height:100dvh;max-width:none;max-height:none;transform:none;border:0;border-radius:0;opacity:1;visibility:visible}.modal--permanent.open{transform:none}.modal--permanent::backdrop{background:var(--app-bg)}.modal__sidebar{width:220px;flex:none;padding:10px 8px;overflow-y:auto;border-right:1px solid var(--border-subtle);background:var(--sidebar-bg)}.modal__content{position:relative;flex:1;min-width:0;padding:28px 30px;overflow-y:auto}.modal__close{position:absolute;top:12px;right:12px;width:28px;height:28px;border:0;border-radius:var(--radius-control);background:transparent;color:var(--text-muted);cursor:pointer}.modal__close:hover{background:var(--surface-2);color:var(--text-primary)}.settings-layout{display:grid;min-height:100dvh;grid-template-columns:var(--sidebar-width) minmax(0,1fr)}.settings-layout__sidebar{padding:10px 8px;border-right:1px solid var(--border-subtle);background:var(--sidebar-bg)}.settings-layout__content{min-width:0;padding:28px 32px;overflow-y:auto}.modal--permanent>.settings-layout{width:100%;min-height:0}.settings-grid{display:grid;grid-template-columns:minmax(220px,1fr) minmax(260px,1.4fr);gap:14px 18px;align-items:end}.settings-field{min-width:0}.settings-field .form-label{display:flex;justify-content:space-between;gap:8px}.settings-field__meta{color:var(--text-muted);font-family:var(--font-mono);font-size:var(--font-size-xs)}.settings-field__desc{margin-top:5px;color:var(--text-muted);font-size:var(--font-size-xs);line-height:1.4}.settings-actions{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin-top:16px}.restart-note{color:var(--warning);font-size:var(--font-size-caption)}.passkey-row{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 0;border-bottom:1px solid var(--border-subtle)}.passkey-row:last-child{border-bottom:0}.passkey-row__name{color:var(--text-primary);font-family:var(--font-mono);font-size:var(--font-size-footnote);font-weight:600}.passkey-row__meta{margin-top:5px;color:var(--text-muted);font-size:var(--font-size-xs)}.edit-dialog-backdrop{position:fixed;z-index:300;inset:0;display:none;align-items:center;justify-content:center;padding:20px;background:var(--overlay-bg);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.edit-dialog-backdrop.open{display:flex}.edit-dialog{width:min(520px,100%);max-height:calc(100dvh - 32px);padding:24px;overflow-y:auto;border:1px solid var(--border-strong);border-radius:var(--radius-dialog);background:var(--surface-1);box-shadow:var(--shadow-dialog)}.edit-dialog__title{margin:0 0 6px;font-size:18px;font-weight:600}.edit-dialog__desc{margin:0 0 18px;color:var(--text-secondary);font-size:var(--font-size-caption);line-height:1.5}.edit-dialog__actions{display:flex;justify-content:flex-end;gap:8px;margin-top:18px}.danger-dialog__warning{padding:12px 14px;border:1px solid color-mix(in srgb,var(--danger) 35%,transparent);border-radius:var(--radius-control);background:var(--danger-soft);color:var(--text-primary);font-size:var(--font-size-caption);line-height:1.55}.danger-dialog__warning ul{margin:8px 0 0;padding-left:18px}.auth-page{display:grid;min-height:100dvh;place-items:center;padding:28px}.auth-wrap{width:min(100%,520px)}.auth-brand{margin-bottom:30px;text-align:center}.auth-brand h1{margin-bottom:8px;font-size:clamp(2.4rem,8vw,4rem)}.auth-brand p{margin:0;color:var(--text-secondary)}.auth-card{padding:24px;border:1px solid var(--border-subtle);border-radius:var(--radius-dialog);background:var(--surface-0);box-shadow:var(--shadow-raised)}.auth-card .btn{width:100%}.modal--promo{width:min(760px,calc(100vw - 40px));height:auto;max-height:min(620px,calc(100dvh - 40px))}.modal--promo.open{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.modal--promo .modal__body{min-width:0;padding:30px 28px;overflow-y:auto}.modal--promo .modal__media{background:var(--artwork-bg)}.modal--promo .modal__media img{width:100%;height:100%;object-fit:cover}.modal--palette{top:14dvh;transform:none;height:auto;max-height:min(72dvh,560px);flex-direction:column;width:min(680px,calc(100vw - 40px))}.command-palette__field{display:flex;flex:none;align-items:center;gap:10px;padding:14px 44px 14px 16px;border-bottom:1px solid var(--border-subtle)}.command-palette__field svg{flex:none;width:18px;height:18px;color:var(--text-muted)}.command-palette__field input{flex:1;min-width:0;border:0;background:transparent;outline:0;color:var(--text-primary);font-size:var(--font-size-lg)}.command-palette__field input::placeholder{color:var(--text-muted)}.command-palette__results{min-height:0;padding:6px;overflow-y:auto}.command-palette__row{display:flex;width:100%;align-items:center;gap:10px;padding:9px 10px;border:0;border-radius:var(--radius-control);background:transparent;color:var(--text-primary);font-size:var(--font-size-footnote);text-align:left;cursor:pointer}.command-palette__row:hover,.command-palette__row.active{background:var(--surface-2)}.command-palette__row svg{flex:none;width:15px;height:15px;color:var(--text-muted)}.command-palette__row-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.command-palette__row-meta{flex:none;color:var(--text-muted);font-size:var(--font-size-xs)}.command-palette__empty{padding:28px 16px;color:var(--text-muted);font-size:var(--font-size-caption);text-align:center}@media (max-width: 767.98px){.modal--palette{top:8dvh;width:calc(100vw - 24px)}}.btn--pill{padding-inline:18px;border-radius:var(--radius-pill)}.auth-split{display:grid;min-height:100dvh;grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.auth-split__main{position:relative;display:grid;place-items:center;padding:56px 28px}.auth-split__brand{position:absolute;top:26px;left:32px;font-family:var(--font-display);font-size:19px;letter-spacing:-.02em;color:var(--text-primary);text-decoration:none}.auth-split__aside{margin:14px;overflow:hidden;border-radius:var(--radius-dialog);background:var(--artwork-bg)}.auth-split__aside img{width:100%;height:100%;object-fit:cover}@media (max-width: 900px){.auth-split{grid-template-columns:1fr}.auth-split__aside{display:none}.auth-split__brand{position:static;justify-self:start;margin-bottom:26px}}@media (max-width: 640px){.modal--promo.open{grid-template-columns:1fr}.modal--promo .modal__media{display:none}}@media (max-width: 720px){:root{--sidebar-width: 76px}.app-sidebar .sidebar__item span,.app-sidebar .sidebar__section-label,.app-sidebar .sidebar__profile>div{display:none}.app-sidebar .sidebar__item{justify-content:center}.app-content{width:min(100% - 28px,var(--content-width));padding-top:22px}.command-bar{right:14px;left:calc(var(--sidebar-width) + 14px);width:auto}.settings-layout{grid-template-columns:1fr;grid-template-rows:auto minmax(0,1fr)}.settings-layout__sidebar{border-right:0;border-bottom:1px solid var(--border-subtle);max-height:25dvh;overflow-y:auto}.settings-grid{grid-template-columns:1fr}.modal{width:100vw;height:100dvh;border:0;border-radius:0}.modal__sidebar{width:190px}}@media (max-width: 520px){:root{--sidebar-width: 0px}.app-shell{grid-template-columns:1fr}.app-sidebar{display:none}.app-main{grid-column:1}.app-toolbar__title{text-align:left}.command-bar{left:14px}.modal{flex-direction:column}.modal__sidebar{width:100%;max-height:36dvh;border-right:0;border-bottom:1px solid var(--border-subtle)}.modal__content{padding:22px 16px}.card{padding:15px}.card__row{align-items:flex-start;flex-direction:column;gap:7px}.project-grid{grid-template-columns:1fr}}@media (prefers-reduced-motion: reduce){*,*:before,*:after{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}:root{--hp-font: var(--font-sans);--hp-mono: var(--font-mono)}body [hidden]{display:none!important}.app-shell{height:100dvh;transition:grid-template-columns var(--transition)}#hp-modal-root{display:contents}.app-sidebar{grid-column:1;grid-row:2}.app-main{grid-column:2;grid-row:2}.app-shell.hp-collapsed{--sidebar-width: 0px}.app-shell.hp-collapsed .app-sidebar{padding:0;border-right:none;overflow:hidden}@media (max-width: 520px){.app-main{grid-column:1}.app-shell.hp-nav-open .app-sidebar{display:flex;position:fixed;z-index:60;inset:0 auto 0 0;width:224px;padding:10px 8px;background:var(--sidebar-bg);border-right:1px solid var(--border-subtle);box-shadow:var(--shadow-dialog)}.app-shell__nav-scrim{position:fixed;z-index:50;inset:0;visibility:hidden;opacity:0;pointer-events:none;background:var(--overlay-bg);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);transition:opacity var(--transition),visibility var(--transition)}.app-shell.hp-nav-open .app-shell__nav-scrim{visibility:visible;opacity:1;pointer-events:auto}.app-shell.hp-nav-open .app-sidebar .sidebar__item span{display:inline}.app-shell.hp-nav-open .app-sidebar .sidebar__section-label,.app-shell.hp-nav-open .app-sidebar .sidebar__profile>div{display:block}.app-shell.hp-nav-open .app-sidebar .sidebar__item{justify-content:flex-start}.hp-live-state [data-hp-live-label]{display:none}}.hp-brand{display:flex;align-items:center;gap:9px;padding:4px 6px 10px;color:var(--text-primary);text-decoration:none}.hp-brand:hover{color:var(--text-primary)}.hp-brand-mark{display:grid;place-items:center;width:28px;height:28px;flex:none;border-radius:var(--radius-control);background:var(--accent-soft);color:var(--accent)}.hp-brand-mark picture,.hp-brand-mark img{display:block;width:100%;height:100%}.hp-brand-mark img{object-fit:contain;border-radius:inherit}.theme-art--light,[data-theme=light] .theme-art--dark{display:none}[data-theme=light] .theme-art--light{display:block}@media (prefers-color-scheme: light){:root:not([data-theme]) .theme-art--dark{display:none}:root:not([data-theme]) .theme-art--light{display:block}}.hp-brand-text{line-height:1.25}.hp-brand-text strong{display:block;font-size:13px;font-weight:700;letter-spacing:.04em}.hp-brand-accent{color:var(--accent)}.hp-brand-text small{display:block;font-size:10px;color:var(--text-muted)}.hp-profile-name{font-size:13px;color:var(--text-primary)}@media (max-width: 720px){.app-sidebar .hp-brand{justify-content:center;padding-inline:0}.app-sidebar .hp-brand-text{display:none}}.hp-toolbar-actions{display:flex;align-items:center;gap:2px}.app-toolbar__brand{display:none;width:22px;height:22px;flex:none;place-items:center;border-radius:var(--radius-xs);background:var(--accent-soft)}.app-toolbar__brand img{width:100%;height:100%;object-fit:contain}@media (max-width: 520px){.app-toolbar__brand{display:grid}}.app-toolbar__banner{position:fixed;top:calc(var(--toolbar-height) + 8px);left:50%;transform:translate(-50%);z-index:300;max-width:min(720px,calc(100vw - 32px));margin:0}.btn-icon:has(.hp-alert-badge){position:relative}.hp-alert-badge{position:absolute;top:1px;right:-4px;min-width:14px;height:14px;padding:0 3px;display:grid;place-items:center;border-radius:var(--radius-pill);background:var(--danger);color:var(--app-bg);font-size:9px;font-weight:700;line-height:1}.hp-live-state{display:inline-flex;align-items:center;gap:6px;padding:2px 6px;border:1px solid transparent;border-radius:var(--radius-control);background:transparent;font-family:inherit;font-size:10px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--success);cursor:pointer;transition:background var(--transition-fast),border-color var(--transition-fast),color var(--transition-fast)}.hp-live-state:hover{border-color:color-mix(in srgb,currentColor 35%,transparent);background:var(--surface-2)}.hp-live-state--paused{color:var(--text-muted)}.hp-live-state--stalled{color:var(--warning)}.status-dot{animation:hp-live-pulse 2s ease-in-out infinite}.hp-live-state--paused .status-dot,.hp-live-state--stalled .status-dot{animation:none}@keyframes hp-live-pulse{0%,to{box-shadow:0 0 0 3px var(--success-soft)}50%{box-shadow:0 0 0 6px color-mix(in srgb,var(--success) 4%,transparent)}}a.metric{display:block;text-decoration:none;transition:border-color var(--transition-fast),background var(--transition-fast)}a.metric:hover{border-color:var(--border-strong);background:var(--surface-2)}.metric__value--text{font-size:14px;font-weight:600;line-height:1.4}.card{grid-column:span 4;margin-bottom:0;overflow:hidden}.card.half{grid-column:span 6}.card.wide,.wide{grid-column:1 / -1}.card h2{display:flex;align-items:center;gap:8px;margin:0 0 12px;font-size:15px;font-weight:600;color:var(--text-primary)}.card h2:before{content:"";width:7px;height:7px;border-radius:2px;background:var(--accent)}.card:has(table){overflow:auto}.card table{min-width:0}.card.wide table{min-width:720px}.card__scroll{max-height:340px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--border-strong) transparent}.card__scroll::-webkit-scrollbar{width:8px}.card__scroll::-webkit-scrollbar-track{background:transparent}.card__scroll::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:4px}#payloads-table-card{overflow:visible}#payloads-table-card table{min-width:0}@media (max-width: 1180px){.card{grid-column:span 6}.card.wide,.wide{grid-column:1 / -1}}@media (max-width: 800px){.card,.card.half{grid-column:1 / -1}}.section-heading{grid-column:1 / -1;display:flex;align-items:flex-end;justify-content:space-between;gap:16px;margin-top:10px;padding:4px 2px 0}.section-heading:first-child{margin-top:0}.section-heading h2{margin:0;font-size:16px;font-weight:600;color:var(--text-primary)}.section-heading p{margin:4px 0 0;font-size:12px;color:var(--text-secondary)}.section-link{font-size:12px;font-weight:500;white-space:nowrap;color:var(--text-link);text-decoration:none}.section-link:hover{text-decoration:underline}.overview-header{grid-column:1 / -1;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:end;gap:16px;margin-bottom:20px}.label-section{margin-bottom:6px}.overview-header h1{margin:0;font-size:clamp(1.5rem,2.2vw,2rem);font-family:var(--font-display);font-weight:400;letter-spacing:-.035em;line-height:1.1;color:var(--text-primary)}.overview-header .subtitle{max-width:700px;margin:8px 0 0;font-size:13px;line-height:1.55;color:var(--text-secondary)}.live-panel{display:flex;flex-direction:column;align-items:flex-end;gap:8px}.gen{font:11px var(--hp-mono);color:var(--text-muted)}@media (max-width: 800px){.overview-header{grid-template-columns:1fr;align-items:start}.live-panel{align-items:flex-start}}.tabs{grid-column:1 / -1;display:flex;flex-wrap:wrap;margin-bottom:16px}.tabs .tab{display:flex;align-items:center;gap:8px}.tabs .tab span{display:grid;place-items:center;width:20px;height:20px;border-radius:5px;background:var(--surface-2);color:var(--text-muted);font:700 9px var(--hp-mono)}.tabs .tab.active span{background:var(--accent);color:var(--text-on-accent)}.dashboard-panel{animation:hp-panel-in .15s ease-out}@keyframes hp-panel-in{0%{opacity:.35;transform:translateY(4px)}to{opacity:1;transform:none}}.data-table tbody tr{transition:background var(--transition-fast)}td.n{color:var(--accent);font-family:var(--hp-mono);font-size:12px;text-align:right;white-space:nowrap}td.n a{color:inherit;text-decoration:none;border-bottom:1px dotted color-mix(in srgb,var(--accent) 45%,transparent)}td.n a:hover{color:var(--text-primary);border-color:var(--accent)}td.v{color:var(--text-secondary);font-family:var(--hp-mono);font-size:12px;word-break:break-all}td.v a,td a.lnk{color:inherit;text-decoration:none;border-bottom:1px dotted var(--border-strong)}td.v a:hover,td a.lnk:hover{color:var(--accent);border-color:var(--accent)}td.ago{color:var(--text-muted);font-family:var(--hp-mono);font-size:11px;text-align:right;white-space:nowrap}td.state{font-family:var(--hp-mono);font-size:11px;text-transform:uppercase;text-align:right}td.s-active{color:var(--success)}td.s-quiet{color:var(--warning)}td.s-stale{color:var(--danger)}td.s-waiting{color:var(--text-muted)}.recent td:nth-child(1){color:var(--text-muted);font-family:var(--hp-mono);font-size:11px;white-space:nowrap}.b-cowrie{background:var(--info-soft);color:var(--info)}.b-http{background:var(--success-soft);color:var(--success)}.b-multipot{background:var(--warning-soft);color:var(--warning)}.b-dionaea{background:var(--danger-soft);color:var(--danger)}.b-conpot{background:var(--surface-2);color:var(--text-secondary);border:1px solid var(--border-subtle)}.b-tanner{background:var(--accent-soft);color:var(--accent)}.b-suricata{background:var(--surface-2);color:var(--text-secondary);border:1px solid var(--border-subtle)}.filters{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-bottom:16px}.filters .chip{font-family:var(--hp-mono);font-size:11px;text-decoration:none}.hp-input,input.search{flex:1;min-width:180px;min-height:34px;background:var(--surface-1);border:1px solid var(--border-subtle);border-radius:var(--radius-control);padding:7px 11px;font-size:13px;color:var(--text-primary);font-family:inherit;outline:none;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.hp-input::placeholder,input.search::placeholder{color:var(--text-muted)}.hp-input:focus,input.search:focus{border-color:var(--border-focus);box-shadow:0 0 0 3px color-mix(in srgb,var(--border-focus) 22%,transparent)}button.copy{background:transparent;border:1px solid var(--border-strong);color:var(--text-secondary);border-radius:var(--radius-control);padding:5px 9px;font:12px var(--hp-font);cursor:pointer;transition:color var(--transition-fast),border-color var(--transition-fast),background var(--transition-fast)}button.copy:hover{color:var(--text-primary);background:var(--surface-2)}.copy-field{display:inline-flex;align-items:center;gap:6px}[data-copy].is-copied:after{content:"copied";margin-left:6px;color:var(--success);font-size:var(--font-size-xs)}.note{font-size:12px;color:var(--text-muted);margin:0 0 12px}.card .note{margin:-4px 0 12px}.empty{font:12px var(--hp-mono);color:var(--text-muted);margin:0}.cc{padding:1px 5px;border-radius:var(--radius-xs);background:var(--info-soft);color:var(--info);font:10px var(--hp-mono);text-decoration:none}.lnk.sess{color:var(--success);border-color:color-mix(in srgb,var(--success) 40%,transparent)}.eventdetail{color:var(--text-primary)}.eventmeta{display:flex;flex-direction:column;gap:3px;margin-top:7px;padding-left:9px;border-left:1px solid var(--border-subtle)}.eventmeta__group{display:flex;flex-wrap:wrap;align-items:baseline;gap:5px}.eventmeta__label{flex:none;width:66px;font-size:var(--font-size-xs);font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-muted);cursor:help}.eventmeta .lnk{display:inline-block;max-width:420px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--font-size-xs);color:var(--accent)}@media (max-width: 720px){.eventmeta__label{width:auto}}#hp-settings-confirm::backdrop{background:var(--overlay-bg);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.hp-evidence-modal{flex-direction:column;width:min(1320px,calc(100vw - 40px));max-height:calc(100dvh - 48px)}.hp-evidence-modal .modal__header{flex:none;background:var(--sidebar-bg)}.hp-evidence-modal .modal__close{position:static;flex:none}.hp-evidence-count{flex:none;color:var(--text-muted);font-size:var(--font-size-xs);white-space:nowrap}.hp-evidence-note{flex:none;margin:12px 16px 0}.hp-evidence-body{flex:1;min-height:0;padding:12px 16px 16px;overflow:auto}.hp-evidence-body pre{max-height:none;margin:0}.hp-evidence-body table{width:100%}.hp-evidence-body .card{padding:0;border:0;background:transparent}.hp-evidence-body .card>h2{display:none}@media (max-width: 720px){.hp-evidence-modal{width:100vw;max-height:100dvh;border-radius:0}.hp-evidence-modal .modal__header{flex-wrap:wrap}.hp-evidence-modal .modal__header .search-field{max-width:none}}.searchhit__detail{margin-top:2px;font-size:var(--font-size-xs);color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hp-open-in{position:relative;display:inline-flex}.hp-open-in>summary{display:inline-flex;align-items:center;gap:5px;list-style:none;cursor:pointer;font-size:11px;color:var(--accent);border-bottom:1px dotted color-mix(in srgb,var(--accent) 45%,transparent);transition:color var(--transition-fast),border-color var(--transition-fast)}.hp-open-in>summary::-webkit-details-marker{display:none}.hp-open-in>summary::marker{content:""}.hp-open-in>summary:hover,.hp-open-in[open]>summary{color:var(--text-primary);border-color:var(--accent)}.hp-open-in>summary svg{width:13px;height:13px}.hp-open-in>summary.btn{border-bottom:none}.hp-open-in-menu{position:absolute;z-index:70;top:calc(100% + 6px);left:0;min-width:240px;animation:hp-panel-in .15s ease-out}.hp-open-in-heading{padding:6px 10px 4px;font-size:var(--font-size-xs);font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--text-muted)}.hp-open-in-item{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:var(--radius-control);color:var(--text-secondary);text-decoration:none;transition:background var(--transition-fast),color var(--transition-fast)}.hp-open-in-item:hover{background:var(--surface-2);color:var(--text-primary)}.hp-open-in-item>svg{width:15px;height:15px;flex-shrink:0}.hp-open-in-item>svg:first-child{color:var(--accent)}.hp-open-in-item>svg:last-child{margin-left:auto;opacity:.45}.hp-open-in-item>span{flex:1;min-width:0;line-height:1.3}.hp-open-in-item strong{display:block;font-size:12px;font-weight:600;color:var(--text-primary)}.hp-open-in-item small{display:block;font-size:11px;color:var(--text-muted)}.hp-filterbar-menu{min-width:260px;padding:10px}.hp-filterbar-field{display:block;margin-bottom:8px}.hp-filterbar-field span{display:block;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted);margin-bottom:4px}.hp-filterbar-field input,.hp-filterbar-field select{width:100%;background:var(--surface-0);border:1px solid var(--border-subtle);border-radius:var(--radius-control);color:var(--text-primary);padding:6px 10px;font-size:12.5px}.hp-filterbar-field input:focus,.hp-filterbar-field select:focus{outline:none;border-color:var(--border-focus)}.hp-filterbar-actions{display:flex;gap:8px;margin-top:4px}.hp-filter-autocomplete{position:absolute;z-index:90;max-height:260px;overflow-y:auto}.hp-filter-autocomplete__row{display:flex;align-items:center;justify-content:space-between;gap:10px;width:100%;padding:6px 8px;margin:0;border:none;border-radius:var(--radius-control);background:none;font:inherit;text-align:left;color:var(--text-primary);cursor:pointer}.hp-filter-autocomplete__row:hover,.hp-filter-autocomplete__row.active{background:var(--surface-2)}.hp-filter-autocomplete__row span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hp-filter-autocomplete__row small{color:var(--text-muted);font-size:11px;flex-shrink:0}pre.code{white-space:pre-wrap;word-break:break-word;background:var(--sidebar-bg);border:1px solid var(--border-subtle);border-radius:var(--radius-control);padding:12px;color:var(--text-secondary);font:12px/1.5 var(--hp-mono);max-height:520px;overflow:auto}.diff-line{display:block;padding:0 6px;border-radius:2px}.diff-line--add{background:var(--success-soft);color:var(--success)}.diff-line--del{background:var(--danger-soft);color:var(--danger)}footer{margin-top:24px;padding-top:8px;font:10px var(--hp-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--text-muted);text-align:center}.heatmap__legend{margin-top:8px}a.project-card{display:block;color:inherit;text-decoration:none}#ghidra-results .project-card__title,#sandbox-results .project-card__title,#wb-select-results .project-card__title,#github-analysis-results .project-card__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--font-size-caption)}#payloads-results .project-card{cursor:default}#payloads-results .project-card__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--font-size-caption);color:inherit;text-decoration:none;border-bottom:1px dotted var(--border-strong)}#payloads-results .project-card__title:hover{color:var(--accent);border-color:var(--accent)}#payloads-results .project-card__meta{flex-wrap:wrap}#payloads-results .project-card__meta .action-menu{margin-left:auto}#workbench-results-list .project-card__meta span.mono{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#hp-rp-generated .project-card{cursor:pointer}#hp-rp-generated .project-card__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#hp-rp-generated .project-card__meta{flex-wrap:wrap}#hp-rp-generated .project-card__meta .hp-rp-row-actions{margin-left:auto}.map-shell{position:relative;overflow:hidden;border:1px solid var(--border-subtle);border-radius:var(--radius-panel);background:var(--surface-0)}.leaflet-map{display:block;width:100%;height:clamp(360px,42vw,520px);background:var(--app-bg);z-index:1}.map-status{position:absolute;z-index:500;left:10px;bottom:28px;padding:5px 8px;border:1px solid var(--border-subtle);border-radius:8px;background:color-mix(in srgb,var(--surface-0) 88%,transparent);color:var(--text-secondary);font:10px var(--hp-mono);pointer-events:none}.map-fallback[hidden],.leaflet-map[hidden]{display:none}.map-fallback{padding-top:34px}.map-fallback-note{position:absolute;z-index:2;top:8px;left:10px;color:var(--danger);font:11px var(--hp-mono)}.leaflet-container{font-family:var(--hp-font);color:var(--text-primary);background:var(--app-bg)}[data-theme=dark] .leaflet-tile-pane{filter:brightness(.62) invert(1) contrast(1.25) hue-rotate(180deg) saturate(.35)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .leaflet-tile-pane{filter:brightness(.62) invert(1) contrast(1.25) hue-rotate(180deg) saturate(.35)}}.leaflet-control-zoom a,.leaflet-control-home{background:var(--surface-1)!important;color:var(--text-primary)!important;border-color:var(--border-strong)!important}.leaflet-control-home{width:32px;height:32px;text-align:center;font:700 11px/30px var(--hp-mono);cursor:pointer}.leaflet-control-attribution{background:color-mix(in srgb,var(--surface-0) 86%,transparent)!important;color:var(--text-muted)!important}.leaflet-control-attribution a{color:var(--text-link)!important}.leaflet-tooltip.attack-tooltip{padding:8px 10px;border:1px solid var(--border-strong);border-radius:var(--radius-control);background:var(--surface-raised);color:var(--text-primary);font:11px/1.45 var(--hp-mono);box-shadow:var(--shadow-raised)}.leaflet-tooltip.attack-tooltip:before{display:none}.leaflet-interactive{transition:fill-opacity .12s,stroke-opacity .12s}.leaflet-interactive:hover{fill-opacity:.88!important;stroke-opacity:1!important}.world{display:block;width:100%;height:auto;min-height:260px;touch-action:none;cursor:grab;user-select:none}.world.dragging{cursor:grabbing}.world .ocean{fill:transparent}.world .graticule{stroke:var(--border-subtle);stroke-width:1;stroke-dasharray:3 5}.world .land{fill:var(--surface-2);stroke:var(--border-strong);stroke-width:1.2;vector-effect:non-scaling-stroke}.world .country:hover{fill:var(--accent-soft)}.world .country-label{fill:var(--text-secondary);font:600 9px var(--hp-mono);letter-spacing:.02em;text-anchor:middle;paint-order:stroke;stroke:var(--surface-1);stroke-width:2.5px;stroke-linejoin:round;pointer-events:none}.world .country-label.rank-3,.world .country-label.rank-4,.world .country-label.rank-5,.world .country-label.rank-6{display:none}.world[data-zoom-level="2"] .country-label.rank-3,.world[data-zoom-level="3"] .country-label.rank-3,.world[data-zoom-level="4"] .country-label.rank-3,.world[data-zoom-level="3"] .country-label.rank-4,.world[data-zoom-level="4"] .country-label.rank-4,.world[data-zoom-level="4"] .country-label.rank-5,.world[data-zoom-level="4"] .country-label.rank-6{display:block}.world circle{fill:var(--danger);fill-opacity:.62;stroke:var(--danger);stroke-width:1.2;filter:drop-shadow(0 0 4px color-mix(in srgb,var(--danger) 55%,transparent));transition:r .12s,fill-opacity .12s}.world circle:hover{fill-opacity:1;r:8px}.hp-lazy-controls{display:flex;align-items:center;justify-content:center;gap:10px;padding:14px 0 4px}.hp-lazy-controls>span:first-child{font-size:12px;color:var(--text-muted)}.hp-lazy-sentinel{width:1px;height:1px}.hp-toast-stack{position:fixed;top:44px;right:16px;z-index:2000;display:flex;flex-direction:column;gap:8px}.hp-toast{border-left:3px solid var(--success);text-decoration:none;animation:hp-panel-in .15s ease-out}.command-palette__field textarea{display:block;width:100%;resize:none;border:none;background:transparent;outline:none;color:var(--text-primary);font:inherit;max-height:120px;padding:0}.command-palette__field textarea::placeholder{color:var(--text-muted)}.hp-modal-status{position:fixed;z-index:350;top:44px;right:16px;max-width:min(360px,calc(100vw - 32px));animation:none;opacity:0;pointer-events:none;transform:translateY(-6px);transition:opacity var(--transition),transform var(--transition)}.hp-modal-status.open{opacity:1;transform:none}.hp-modal-status[data-state=error]{border-color:var(--danger)}@media (prefers-reduced-motion: reduce){.hp-modal-status{transition:none}}.hp-account{position:relative}button.sidebar__profile{width:100%;border:0;border-top:1px solid var(--border-subtle);border-radius:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;transition:background var(--transition-fast)}button.sidebar__profile:hover{background:var(--surface-2)}button.sidebar__profile:disabled{cursor:default}button.sidebar__profile:disabled:hover{background:transparent}.hp-account-menu{position:absolute;z-index:80;left:8px;right:8px;bottom:calc(100% + 6px);min-width:0;animation:hp-panel-in .15s ease-out}.hp-account-menu .dropdown__item svg{width:14px;height:14px;opacity:.72;flex:none}.hp-account-note{color:var(--text-muted);cursor:default}.hp-account-note:hover{background:transparent}.hp-dash-settings,.hp-settings-modal{width:min(1120px,calc(100vw - 40px));height:min(820px,calc(100dvh - 40px))}.hp-settings-modal{flex-direction:column}.hp-account-settings-head{display:flex;align-items:center;gap:14px;flex:none;padding:10px 16px;border-bottom:1px solid var(--border-subtle)}.hp-account-settings-head h2{flex:1;margin:0;font-size:14px}.hp-settings-external{font-size:12px;text-decoration:none}.hp-settings-external:hover{text-decoration:underline}.hp-settings-modal .modal__close{position:static;flex:none}.hp-settings-frame{flex:1;width:100%;min-height:0;border:0;background:var(--app-bg)}.wb-analyzer-grid,.wb-child-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.wb-analyzer,.wb-child{min-width:0;padding:14px;border:1px solid var(--border-subtle);border-radius:10px;background:var(--surface-1)}.wb-analyzer.is-disabled{opacity:.7}.wb-analyzer-head,.wb-child-head,.wb-run-head{display:flex;align-items:center;flex-wrap:wrap;gap:8px}.wb-analyzer-head label,.wb-child-head strong,.wb-run-head>:first-child{flex:1;min-width:0}.wb-options{margin-top:10px}.wb-options summary{cursor:pointer;color:var(--text-secondary);font-size:12px}.wb-option-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin-top:10px}.wb-option-grid label{color:var(--text-muted);font-size:11px}.wb-option-grid .form-input{width:100%;margin-top:5px}.wb-run{margin-bottom:14px}.wb-run-head{justify-content:space-between;margin-bottom:12px}.wb-run-head h3{margin:0}.wb-state--completed{color:var(--green)}.wb-state--failed,.wb-state--timed_out{color:var(--red)}.wb-state--running,.wb-state--claimed,.wb-state--queued{color:var(--orange)}@media (max-width: 820px){.wb-analyzer-grid,.wb-child-grid,.wb-option-grid{grid-template-columns:1fr}}.tw\:col-span-12{grid-column:span 12 / span 12}.tw\:mt-2{margin-top:8px}.tw\:mt-3{margin-top:12px}.tw\:mt-5{margin-top:20px}.tw\:mr-auto{margin-right:auto}.tw\:mb-3{margin-bottom:12px}.tw\:mb-4{margin-bottom:16px}.tw\:mb-5{margin-bottom:20px}.tw\:mb-6{margin-bottom:24px}.tw\:block{display:block}.tw\:flex{display:flex}.tw\:grid{display:grid}.tw\:inline{display:inline}.tw\:max-w-full{max-width:100%}.tw\:list-disc{list-style-type:disc}.tw\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tw\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.tw\:flex-wrap{flex-wrap:wrap}.tw\:items-center{align-items:center}.tw\:items-start{align-items:flex-start}.tw\:justify-between{justify-content:space-between}.tw\:gap-2{gap:8px}.tw\:gap-3{gap:12px}.tw\:gap-3\.5{gap:14px}.tw\:rounded-lg{border-radius:var(--radius-md)}.tw\:rounded-md{border-radius:var(--radius-xs)}.tw\:border{border-style:solid;border-width:1px}.tw\:border-b{border-bottom-style:solid;border-bottom-width:1px}.tw\:border-orange{border-color:var(--warning)}.tw\:border-red{border-color:var(--danger)}.tw\:border-subtle{border-color:var(--border-subtle)}.tw\:bg-orange-subtle{background-color:var(--warning-soft)}.tw\:bg-red-subtle{background-color:var(--danger-soft)}.tw\:bg-surface-1{background-color:var(--surface-1)}.tw\:bg-white{background-color:#fff}.tw\:px-4{padding-inline:16px}.tw\:px-6{padding-inline:24px}.tw\:py-2{padding-block:8px}.tw\:py-3{padding-block:12px}.tw\:py-4{padding-block:16px}.tw\:pt-7{padding-top:28px}.tw\:pb-24{padding-bottom:96px}.tw\:pl-5{padding-left:20px}.tw\:text-sm{font-size:.875rem;line-height:1.4286}.tw\:text-green{color:var(--success)}.tw\:text-muted{color:var(--text-muted)}.tw\:text-orange{color:var(--warning)}.tw\:text-red{color:var(--danger)}@media (min-width: 640px){.tw\:sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.tw\:sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width: 1024px){.tw\:lg\:px-8{padding-inline:32px}}@media (min-width: 1280px){.tw\:xl\:col-span-4{grid-column:span 4 / span 4}.tw\:xl\:col-span-8{grid-column:span 8 / span 8}.tw\:xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}.hp-ip-filter-menu{min-width:260px}.hp-ip-filter-list{max-height:260px;overflow-y:auto;margin-bottom:8px}.hp-ip-filter-row{display:flex;align-items:center;gap:8px;padding:6px 10px;border-radius:var(--radius-control);font-size:12.5px}.hp-ip-filter-row:hover{background:var(--surface-2)}.hp-ip-filter-row input[type=checkbox]{accent-color:var(--accent);flex:none}.hp-ip-filter-ip{flex:1;min-width:0;overflow:hidden;color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap}.hp-ip-filter-count{flex:none;color:var(--text-muted);font-size:var(--font-size-xs)}.hp-ip-filter-add{width:100%;margin:4px 0 8px;padding:6px 10px;border:1px solid var(--border-subtle);border-radius:var(--radius-control);background:var(--surface-0);color:var(--text-primary);font-size:12.5px}.hp-ip-filter-add:focus{outline:none;border-color:var(--border-focus)}.hp-ip-filter-actions{display:flex;gap:8px;padding:0 4px}.hp-rp-templates{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:10px;margin:4px 0 18px}.hp-rp-template{padding:12px 14px;border:1px solid var(--border-subtle);border-radius:var(--radius-panel);background:var(--surface-1);color:var(--text-primary);text-align:left;cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast)}.hp-rp-template:hover{border-color:var(--border-strong);background:var(--surface-hover)}.hp-rp-template[aria-pressed=true]{border-color:var(--accent);background:var(--accent-soft)}.hp-rp-template strong{display:block;margin-bottom:4px;font-size:var(--font-size-footnote)}.hp-rp-template span{display:block;color:var(--text-muted);font-size:11.5px;line-height:1.45}.hp-rp-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px 16px}.hp-rp-field label{display:block;margin-bottom:5px;color:var(--text-muted);font-size:var(--font-size-xs);letter-spacing:.06em;text-transform:uppercase}.hp-rp-field input,.hp-rp-field select{width:100%;padding:8px 10px;border:1px solid var(--border-subtle);border-radius:var(--radius-control);background:var(--surface-0);color:var(--text-primary);font-size:var(--font-size-footnote)}.hp-rp-field input:focus,.hp-rp-field select:focus{outline:none;border-color:var(--border-focus)}.hp-rp-elements{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:6px 16px}.hp-rp-elements label{display:flex;align-items:baseline;gap:8px;padding:5px 0;color:var(--text-secondary);font-size:12.5px;cursor:pointer}.hp-rp-elements input{margin-top:2px;accent-color:var(--accent)}.hp-rp-elements small{display:block;color:var(--text-muted);font-size:var(--font-size-xs)}.hp-rp-theme{display:flex;gap:10px}.hp-rp-theme button{display:flex;max-width:220px;flex:1;align-items:center;gap:10px;padding:10px 12px;border:1px solid var(--border-subtle);border-radius:var(--radius-panel);background:var(--surface-1);color:var(--text-primary);font-size:var(--font-size-footnote);cursor:pointer}.hp-rp-theme button[aria-pressed=true]{border-color:var(--accent);background:var(--accent-soft)}.hp-rp-swatch{width:30px;height:22px;flex:none;border:1px solid var(--border-strong);border-radius:var(--radius-xs)}.hp-rp-swatch--dark{background:#20201f;box-shadow:inset 0 -7px #d97757}.hp-rp-swatch--light{background:#f7f6f2;box-shadow:inset 0 -7px #c76548}.hp-rp-section{margin-top:0}.hp-rp-section[hidden]{display:none}.hp-rp-actions{position:sticky;z-index:5;bottom:0;display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin-top:14px;padding:12px 14px;border:1px solid var(--border-subtle);border-radius:var(--radius-panel);background:var(--surface-raised);box-shadow:var(--shadow-raised)}[data-hp-reports]:has([data-dashboard-panel=library]:not([hidden])) .hp-rp-actions{display:none}.dashboard-panel>.card+.card{margin-top:14px}.hp-rp-status{color:var(--text-muted);font-size:var(--font-size-caption)}.hp-rp-status[data-state=error]{color:var(--danger)}.hp-rp-status[data-state=ok]{color:var(--success)}.hp-rp-tag{display:inline-block;padding:2px 8px;border-radius:var(--radius-pill);background:var(--surface-2);color:var(--text-secondary);font-size:var(--font-size-xs)}.hp-rp-payload-results{display:flex;max-height:280px;flex-direction:column;gap:4px;overflow-y:auto;margin:10px 0}.hp-rp-payload-row{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--border-subtle);border-radius:var(--radius-control);background:var(--surface-1);color:var(--text-primary);font-size:12.5px;text-align:left;cursor:pointer}.hp-rp-payload-row:hover{border-color:var(--border-strong);background:var(--surface-hover)}.hp-rp-payload-row[aria-pressed=true]{border-color:var(--accent);background:var(--accent-soft)}.hp-rp-payload-row code{flex:none;color:var(--text-secondary);font-size:11.5px}.hp-rp-payload-row>span:nth-child(2){flex:1;color:var(--text-muted)}.hp-rp-payload-badges{display:flex;flex:none;gap:4px}.hp-rp-toggle-row{display:flex;align-items:center;gap:8px;color:var(--text-secondary);font-size:var(--font-size-footnote);letter-spacing:0;text-transform:none}.hp-rp-toggle-row input[type=checkbox]{accent-color:var(--accent)}.hp-rp-tag--light{background:var(--info-soft);color:var(--info-text-on-soft,var(--info))}.hp-rp-row-actions{display:flex;flex-wrap:wrap;gap:6px}.pdf-viewer-modal{flex-direction:column;width:min(1000px,calc(100vw - 40px));height:min(860px,calc(100dvh - 48px));padding:20px 20px 0}.pdf-viewer-title{flex:none;margin:0 40px 12px 0;font-size:var(--font-size-lg)}.pdf-viewer-frame{flex:1;width:100%;min-height:0;margin:0 -20px;border:0;background:var(--surface-0)}@media (max-width:720px){.pdf-viewer-modal{width:100vw;height:100dvh;border-radius:0}}.hp-pl-info-popover,.hp-sb-info-popover{width:300px}.hp-pl-info-row,.hp-sb-info-row{display:flex;flex-direction:column;gap:2px;padding:6px 10px;font-size:var(--font-size-caption)}.hp-pl-info-row .k,.hp-sb-info-row .k{color:var(--text-muted);font-size:10.5px;letter-spacing:.05em;text-transform:uppercase}.hp-pl-info-row .v,.hp-sb-info-row .v{color:var(--text-primary);font-family:var(--hp-mono);word-break:break-all}.hp-pl-label-trigger.action-menu>summary{width:auto;height:auto;min-height:32px;padding:6px 14px;border-radius:var(--radius-pill);font-size:12.5px}#panel-identity h2 .hp-pl-label-trigger,.hp-sb-label-trigger.action-menu{margin-left:8px;vertical-align:middle}#panel-identity h2 .hp-pl-label-trigger>summary,.hp-sb-label-trigger.action-menu>summary{width:auto;height:auto;min-height:24px;padding:3px 10px;border-radius:var(--radius-pill);font-size:var(--font-size-xs)}.hp-vnc-canvas-wrap{overflow:hidden;border:1px solid var(--border-subtle);border-radius:var(--radius-panel);background:#000}.hp-vnc-canvas-wrap canvas{display:block;width:100%;height:auto}.hp-vnc-status{margin:10px 0;color:var(--text-muted);font-size:var(--font-size-caption)}.hp-tty-term{min-height:420px;overflow-x:auto;padding:14px 16px;border:1px solid var(--border-subtle);border-radius:var(--radius-panel);background:#16181d;color:#e6e6e6;font-family:var(--font-mono);font-size:var(--font-size-footnote);line-height:1.35;white-space:pre}.hp-tty-controls{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:12px 0}.hp-tty-controls input[type=range]{min-width:160px;flex:1 1 260px}.hp-tty-status{color:var(--text-muted);font-size:var(--font-size-caption)}.hp-dash-settings>.settings-layout{width:100%;height:100%;min-height:0}.hp-dash-settings .settings-layout__sidebar{overflow-y:auto}.hp-dash-settings .settings-layout__content{height:100%;overflow-y:auto}.hp-dash-settings>.modal__close{position:absolute;top:12px;right:12px;z-index:3}.hp-settings-column{width:min(100%,880px)}.hp-settings-head{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;margin-bottom:24px}.hp-settings-head h1{margin-bottom:6px}.hp-settings-head p{margin:0;color:var(--text-secondary);font-size:13px}.hp-settings-status{min-height:18px;margin:0 0 18px;font-size:12px;color:var(--text-muted)}.hp-settings-status.is-error{color:var(--danger)}.hp-settings-status.is-ok{color:var(--success)}.hp-settings-pane[hidden],.hp-field[hidden]{display:none}.hp-settings-pane .card{margin-bottom:14px}.hp-settings-pane .card:last-child{margin-bottom:0}.sidebar__item.is-dirty:after{content:"";width:6px;height:6px;margin-left:auto;border-radius:50%;background:var(--accent)}.hp-cap-list{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}.hp-cfg-source{margin:6px 0 0;font-size:11px;color:var(--text-muted)}.hp-cfg-source strong{color:var(--text-secondary);font-weight:600}.hp-audit-filter{width:auto;min-width:180px}.hp-rev-row{display:flex;align-items:center;gap:12px;padding:10px 0;border-bottom:1px solid var(--border-subtle)}.hp-rev-row:last-child{border-bottom:0}.hp-rev-meta{flex:1;min-width:0;font-size:13px;color:var(--text-secondary)}.hp-rev-meta small{display:block;color:var(--text-muted);font-size:11px;margin-top:2px}.hp-audit-row{padding:8px 0;border-bottom:1px solid var(--border-subtle);font-size:12px;color:var(--text-secondary)}.hp-audit-row:last-child{border-bottom:0}.hp-audit-row small{color:var(--text-muted)}.hp-head-actions{display:flex;gap:8px;flex-shrink:0}.hp-services-actions{display:flex;gap:6px;flex-wrap:wrap}@media (prefers-reduced-motion:reduce){.hp-dash-settings *{animation:none!important;transition:none!important}}.u-mt8{margin-top:8px}.u-mt12{margin-top:12px}.u-mt14{margin-top:14px}.pane__h3{margin-bottom:4px}.pane__desc{font-size:13px;color:var(--text-secondary);margin-bottom:16px}.filter-row{display:flex;gap:10px;margin-bottom:12px;flex-wrap:wrap}.filter-row .form-input{flex:1;min-width:160px;width:auto}.filter-row select.form-input{flex:0 0 auto}.newuser{display:grid;grid-template-columns:1fr 110px 1fr auto;gap:10px;align-items:end}.row-actions{display:flex;gap:6px;flex-wrap:wrap}.metric-grid{margin-bottom:20px}.user-edit-dialog{width:min(640px,100%);max-height:min(88vh,880px);overflow-y:auto}.user-edit-section{margin-top:18px;padding-top:18px;border-top:1px solid var(--border-subtle)}.user-edit-section:first-of-type{margin-top:6px;padding-top:0;border-top:0}.user-edit-section .settings-field{margin-top:12px}.user-edit-section .settings-field:first-child{margin-top:0}.user-edit-inline{display:flex;gap:8px;align-items:center}.user-edit-inline .form-input{flex:1;min-width:0}.user-edit-perm-list{display:flex;flex-wrap:wrap;gap:6px 14px;margin-top:10px;max-height:160px;overflow-y:auto;padding:2px}.user-edit-perm{display:flex;align-items:center;gap:6px;font-size:12px;font-family:var(--font-mono);white-space:nowrap}.user-edit-perm input{margin:0}.user-edit-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.user-edit-actions .btn{font-size:12px;padding:7px 12px}#flash{position:fixed;top:18px;left:50%;transform:translate(-50%);z-index:400;display:none;background:var(--surface-0);border:1px solid var(--green);border-radius:var(--radius-md);padding:14px 20px;font-size:13px;color:var(--text-primary);box-shadow:var(--shadow-modal);max-width:90vw;word-break:break-all;text-align:center}#flash.err{border-color:var(--red)}#flash b{color:var(--green)}.cell-mono{font-family:var(--font-mono);font-size:11px}.cell-agent{font-size:11px;color:var(--text-muted);max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.empty-row{color:var(--text-muted);font-size:12px}.audit-table{table-layout:fixed;min-width:900px}.audit-table th,.audit-table td{box-sizing:border-box}.audit-table th:nth-child(1),.audit-table td:nth-child(1){width:150px}.audit-table th:nth-child(2),.audit-table td:nth-child(2){width:160px}.audit-table th:nth-child(3),.audit-table td:nth-child(3){width:130px}.audit-table th:nth-child(4),.audit-table td:nth-child(4){width:120px}.audit-table th:nth-child(5),.audit-table td:nth-child(5){width:170px}.audit-table th:nth-child(6),.audit-table td:nth-child(6){width:auto}.audit-table td:nth-child(2) .badge{white-space:normal;overflow-wrap:anywhere;line-height:1.35}.audit-table .cell-agent{max-width:none;white-space:normal;overflow-wrap:anywhere}@media (max-width: 600px){.hide-sm{display:none}.newuser{grid-template-columns:1fr}} diff --git a/themes/apiary/account/theme.properties b/themes/apiary/account/theme.properties new file mode 100644 index 0000000..a6e13dc --- /dev/null +++ b/themes/apiary/account/theme.properties @@ -0,0 +1,3 @@ +parent=keycloak.v3 +styles=css/xore-theme.css css/account.css +meta=viewport==width=device-width,initial-scale=1