@import './tokens.css'; @import './font-choice.css'; @import './admin-shell.css'; /* Public Sans (400, 500, 600) */ @font-face { font-family: 'Public Sans'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/public-sans-latin.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } @font-face { font-family: 'Public Sans'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/public-sans-latin-ext.woff2') format('woff2'); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; } @font-face { font-family: 'Public Sans'; font-style: normal; font-weight: 500; font-display: swap; src: url('/fonts/public-sans-latin.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } @font-face { font-family: 'Public Sans'; font-style: normal; font-weight: 500; font-display: swap; src: url('/fonts/public-sans-latin-ext.woff2') format('woff2'); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; } @font-face { font-family: 'Public Sans'; font-style: normal; font-weight: 600; font-display: swap; src: url('/fonts/public-sans-latin.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } @font-face { font-family: 'Public Sans'; font-style: normal; font-weight: 600; font-display: swap; src: url('/fonts/public-sans-latin-ext.woff2') format('woff2'); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* Martian Mono (400, 500, 600) */ @font-face { font-family: 'Martian Mono'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/martian-mono-latin.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } @font-face { font-family: 'Martian Mono'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/martian-mono-latin-ext.woff2') format('woff2'); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; } @font-face { font-family: 'Martian Mono'; font-style: normal; font-weight: 500; font-display: swap; src: url('/fonts/martian-mono-latin.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } @font-face { font-family: 'Martian Mono'; font-style: normal; font-weight: 500; font-display: swap; src: url('/fonts/martian-mono-latin-ext.woff2') format('woff2'); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; } @font-face { font-family: 'Martian Mono'; font-style: normal; font-weight: 600; font-display: swap; src: url('/fonts/martian-mono-latin.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } @font-face { font-family: 'Martian Mono'; font-style: normal; font-weight: 600; font-display: swap; src: url('/fonts/martian-mono-latin-ext.woff2') format('woff2'); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* Schibsted Grotesk (500, 600, 700) */ @font-face { font-family: 'Schibsted Grotesk'; font-style: normal; font-weight: 500; font-display: swap; src: url('/fonts/schibsted-grotesk-latin.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } @font-face { font-family: 'Schibsted Grotesk'; font-style: normal; font-weight: 500; font-display: swap; src: url('/fonts/schibsted-grotesk-latin-ext.woff2') format('woff2'); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; } @font-face { font-family: 'Schibsted Grotesk'; font-style: normal; font-weight: 600; font-display: swap; src: url('/fonts/schibsted-grotesk-latin.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } @font-face { font-family: 'Schibsted Grotesk'; font-style: normal; font-weight: 600; font-display: swap; src: url('/fonts/schibsted-grotesk-latin-ext.woff2') format('woff2'); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; } @font-face { font-family: 'Schibsted Grotesk'; font-style: normal; font-weight: 700; font-display: swap; src: url('/fonts/schibsted-grotesk-latin.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } @font-face { font-family: 'Schibsted Grotesk'; font-style: normal; font-weight: 700; font-display: swap; src: url('/fonts/schibsted-grotesk-latin-ext.woff2') format('woff2'); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; } * { box-sizing: border-box; } html, body { margin: 0; min-width: 0; background: var(--paper); color: var(--ink); font-family: var(--font-body); } body { min-height: 100dvh; font-size: var(--text-body-size); line-height: var(--text-body-line-height); } button, input, select, textarea { font: inherit; } button, a { -webkit-tap-highlight-color: transparent; } button { cursor: pointer; } button:disabled { cursor: not-allowed; opacity: 0.45; } a { color: inherit; } h1, h2, h3, p { margin: 0; } h1, h2, h3 { color: var(--ink); font-family: var(--font-display); font-style: normal; overflow-wrap: anywhere; } h1 { font-size: var(--text-display-lg-size); line-height: var(--text-display-lg-line-height); font-weight: var(--text-display-lg-weight); letter-spacing: var(--text-display-lg-letter-spacing); } h2 { font-size: var(--text-display-md-size); line-height: var(--text-display-md-line-height); font-weight: var(--text-display-md-weight); } small { color: var(--muted); font-size: var(--text-body-sm-size); } .tnum { font-family: var(--font-mono); font-variant-numeric: tabular-nums; } .mono-label { color: var(--muted); font-family: var(--font-body); font-size: var(--text-label-size); line-height: var(--text-label-line-height); font-weight: var(--text-label-weight); letter-spacing: var(--text-label-letter-spacing); } .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; } :focus { outline: none; } :focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; } /* ── Shared Component Reference Styles ────────────────────────────────────── */ /* Typography helper classes */ .ut-label { font-family: var(--font-body); font-size: var(--text-label-size); line-height: var(--text-label-line-height); font-weight: var(--text-label-weight); letter-spacing: var(--text-label-letter-spacing); color: var(--muted); } .ut-region .ut-label, .ut-region-cell .ut-label, .ut-region__code, .ut-strip__axis { font-family: var(--font-mono); font-variant-numeric: tabular-nums; } .ut-data { font-family: var(--font-mono); font-size: var(--text-data-size); line-height: var(--text-data-line-height); font-variant-numeric: tabular-nums; } .ut-figure { font-family: var(--font-mono); font-size: var(--text-figure-size); line-height: var(--text-figure-line-height); font-weight: var(--text-figure-weight); font-variant-numeric: tabular-nums; } .ut-muted { color: var(--muted); } .ut-display-lg, .ut-title-lg { font-family: var(--font-display); font-size: var(--text-display-lg-size); line-height: var(--text-display-lg-line-height); font-weight: var(--text-display-lg-weight); letter-spacing: var(--text-display-lg-letter-spacing); } .ut-display-md, .ut-title-md { font-family: var(--font-display); font-size: var(--text-display-md-size); line-height: var(--text-display-md-line-height); font-weight: var(--text-display-md-weight); } .ut-heading { font-family: var(--font-body); font-size: var(--text-heading-size); line-height: var(--text-heading-line-height); font-weight: var(--text-heading-weight); } .ut-body { font-family: var(--font-body); font-size: var(--text-body-size); line-height: var(--text-body-line-height); font-weight: var(--text-body-weight); } .ut-body-sm { font-family: var(--font-body); font-size: var(--text-body-sm-size); line-height: var(--text-body-sm-line-height); } /* Keyboard hint */ .ut-kbd, kbd { display: inline-block; padding: 1px var(--space-1); border: 1px solid var(--rule-strong); border-radius: var(--radius-xs); font-family: var(--font-mono); font-size: var(--text-label-size); line-height: var(--text-label-line-height); color: var(--muted); } /* ─── Buttons ─────────────────────────────────────────────────────────────── */ .ut-btn, .button { display: inline-flex; align-items: center; justify-content: center; gap: var(--space-2); box-sizing: border-box; height: var(--control-md); min-height: var(--control-md); padding: 0 calc((var(--space-3) + var(--space-4)) / 2); border: 1px solid transparent; border-radius: var(--radius-control); background: transparent; color: var(--ink); font-family: var(--font-body); font-size: var(--text-body-sm-size); font-weight: 500; line-height: var(--text-body-sm-line-height); white-space: nowrap; cursor: pointer; user-select: none; transition: background-color 120ms, border-color 120ms, color 120ms, box-shadow 120ms, transform 80ms; } .ut-btn:focus-visible, .button:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; } .ut-btn:active:not([disabled]), .ut-btn.is-active, .button:active:not([disabled]), .button.is-active { transform: translateY(1px); } .ut-btn:disabled, .ut-btn[disabled], .button:disabled, .button[disabled] { opacity: 0.45; cursor: not-allowed; box-shadow: none; transform: none; } .ut-btn[aria-busy="true"], .button[aria-busy="true"] { cursor: progress; } /* Primary */ .ut-btn--primary, .button--primary { background: var(--ink); color: var(--paper); border-color: transparent; box-shadow: inset 0 1px 0 var(--control-highlight), var(--shadow-control); } .ut-btn--primary:hover:not(:disabled), .ut-btn--primary.is-hover, .button--primary:hover:not(:disabled), .button--primary.is-hover { background: var(--ink-soft); color: var(--paper); } .ut-btn--primary:active:not([disabled]), .ut-btn--primary.is-active, .button--primary:active:not([disabled]), .button--primary.is-active { box-shadow: inset 0 1px 0 var(--control-highlight); } /* Secondary */ .ut-btn--secondary, .button--secondary { background: var(--surface); color: var(--ink); border: 1px solid var(--rule-strong); box-shadow: var(--shadow-control); } .ut-btn--secondary:hover:not(:disabled), .ut-btn--secondary.is-hover, .button--secondary:hover:not(:disabled), .button--secondary.is-hover { background: var(--paper); border-color: var(--ink-soft); } .ut-btn--secondary:focus-visible, .button--secondary:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; border-color: var(--accent); } .ut-btn--secondary:active:not([disabled]), .ut-btn--secondary.is-active, .button--secondary:active:not([disabled]), .button--secondary.is-active { background: var(--sunken); box-shadow: none; } /* Quiet */ .ut-btn--quiet, .button--quiet { background: transparent; border-color: transparent; color: var(--accent); box-shadow: none; } .ut-btn--quiet:hover:not(:disabled), .ut-btn--quiet.is-hover, .button--quiet:hover:not(:disabled), .button--quiet.is-hover { background: var(--sunken); color: var(--accent-hover); } .ut-btn--quiet:active:not([disabled]), .ut-btn--quiet.is-active, .button--quiet:active:not([disabled]), .button--quiet.is-active { background: var(--sunken); box-shadow: none; } /* Danger */ .ut-btn--danger, .button--danger { background: var(--down); color: var(--on-down); border-color: transparent; box-shadow: inset 0 1px 0 var(--control-highlight), var(--shadow-control); } .ut-btn--danger:hover:not(:disabled), .ut-btn--danger.is-hover, .button--danger:hover:not(:disabled), .button--danger.is-hover { background: color-mix(in oklab, var(--down) 86%, var(--ink)); color: var(--on-down); } .ut-btn--danger:active:not([disabled]), .ut-btn--danger.is-active, .button--danger:active:not([disabled]), .button--danger.is-active { box-shadow: inset 0 1px 0 var(--control-highlight); } .button--danger.is-active { box-shadow: inset 0 1px 0 var(--control-highlight); } /* Small button */ .ut-btn--sm, .button--sm { height: var(--control-sm); min-height: var(--control-sm); padding: 0 calc((var(--space-2) + var(--space-3)) / 2); gap: calc((var(--space-1) + var(--space-2)) / 2); font-size: var(--text-data-size); line-height: var(--text-data-line-height); } /* Icon button */ .ut-btn--icon, .button--icon { width: var(--control-md); padding: 0; } .ut-btn--sm.ut-btn--icon, .button--sm.button--icon { width: var(--control-sm); } .ut-btn .ut-kbd, .button .ut-kbd { margin-left: var(--space-1); } .ut-btn--primary .ut-kbd, .button--primary .ut-kbd { border-color: var(--control-highlight); color: var(--paper); opacity: 0.7; } .ut-spinner { flex: none; width: 14px; height: 14px; box-sizing: border-box; border: 2px solid currentColor; border-right-color: transparent; border-radius: 50%; animation: ut-spin 700ms linear infinite; } @keyframes ut-spin { to { transform: rotate(360deg); } } /* ─── Segmented control ───────────────────────────────────────────────────── */ .ut-segmented { display: inline-flex; gap: calc(var(--space-1) / 2); padding: calc(var(--space-1) / 2); border-radius: var(--radius-control); background: var(--sunken); box-shadow: var(--shadow-inset); } .ut-segmented__item { display: inline-flex; align-items: center; justify-content: center; height: calc(var(--control-sm) - var(--space-1)); min-height: calc(var(--control-sm) - var(--space-1)); padding: 0 calc((var(--space-2) + var(--space-3)) / 2); border: 0; border-radius: var(--radius-sm); background: transparent; color: var(--ink-soft); font-family: var(--font-body); font-weight: 500; font-size: var(--text-data-size); line-height: 1; white-space: nowrap; cursor: pointer; user-select: none; box-shadow: none; transform: none; transition: background-color 120ms, color 120ms, box-shadow 120ms; } .ut-segmented__item:hover { color: var(--ink); } .ut-segmented__item:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; } .ut-segmented__item[aria-pressed="true"], .ut-segmented__item[aria-checked="true"], .ut-segmented__item[aria-selected="true"], .ut-segmented__item.is-active { background: var(--surface); color: var(--ink); box-shadow: var(--shadow-control); } /* ─── Fields & Inputs ─────────────────────────────────────────────────────── */ .ut-field, .field { display: grid; gap: var(--space-1); min-width: 0; color: var(--ink); font-weight: 500; } .ut-field__label { font-size: var(--text-body-sm-size); line-height: var(--text-body-sm-line-height); font-weight: 600; color: var(--ink); } .ut-field__optional { margin-left: calc((var(--space-1) + var(--space-2)) / 2); font-weight: 400; color: var(--muted); } .ut-field__hint { font-size: var(--text-data-size); line-height: var(--text-data-line-height); color: var(--muted); } .ut-field__error, .field-error { display: flex; gap: calc((var(--space-1) + var(--space-2)) / 2); align-items: baseline; font-size: var(--text-data-size); line-height: var(--text-data-line-height); color: var(--down); } .ut-field__success, .field-success { font-size: var(--text-data-size); line-height: var(--text-data-line-height); color: var(--up); } /* Text inputs */ .ut-input, input:where(:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="button"]):not([type="submit"]):not([type="reset"]):not([type="hidden"])) { box-sizing: border-box; width: 100%; height: var(--control-md); min-height: var(--control-md); padding: 0 var(--space-3); border: 1px solid var(--rule-strong); border-radius: var(--radius-control); background: var(--surface); box-shadow: var(--shadow-inset); color: var(--ink); font-family: var(--font-body); font-size: var(--text-body-sm-size); line-height: var(--text-body-sm-line-height); transition: border-color 120ms, box-shadow 120ms, background-color 120ms; } .ut-input::placeholder, input:where(:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="button"]):not([type="submit"]):not([type="reset"]):not([type="hidden"]))::placeholder { color: var(--muted); } .ut-input:hover:not(:disabled), input:where(:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="button"]):not([type="submit"]):not([type="reset"]):not([type="hidden"])):hover:not(:disabled) { border-color: var(--ink-soft); } .ut-input:focus, .ut-input.is-focus, input:where(:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="button"]):not([type="submit"]):not([type="reset"]):not([type="hidden"])):focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent), 0 0 0 4px var(--focus-halo); } .ut-input:disabled, input:where(:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="button"]):not([type="submit"]):not([type="reset"]):not([type="hidden"])):disabled { border-color: var(--rule); background: var(--sunken); box-shadow: none; color: var(--muted); cursor: not-allowed; } .ut-field--error .ut-input, .ut-field--error input, input[aria-invalid='true'] { border-color: var(--down); } .ut-field--error .ut-input:focus, .ut-field--error .ut-input.is-focus, .ut-field--error input:focus, input[aria-invalid='true']:focus { outline: none; border-color: var(--down); box-shadow: 0 0 0 1px var(--down), 0 0 0 4px var(--down-halo); } .ut-input--mono { font-family: var(--font-mono); font-size: var(--text-data-size); } /* Affixes and Input Groups */ .ut-input-group { box-sizing: border-box; width: 100%; height: var(--control-md); min-height: var(--control-md); border: 1px solid var(--rule-strong); border-radius: var(--radius-control); background: var(--surface); box-shadow: var(--shadow-inset); color: var(--ink); font-family: var(--font-body); font-size: var(--text-body-sm-size); line-height: var(--text-body-sm-line-height); transition: border-color 120ms, box-shadow 120ms; display: flex; align-items: stretch; overflow: hidden; } .ut-input-group:hover:not(.is-disabled) { border-color: var(--ink-soft); } .ut-input-group:focus-within, .ut-input-group.is-focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent), 0 0 0 4px var(--focus-halo); } .ut-field--error .ut-input-group { border-color: var(--down); } .ut-field--error .ut-input-group:focus-within { outline: none; border-color: var(--down); box-shadow: 0 0 0 1px var(--down), 0 0 0 4px var(--down-halo); } .ut-input-group input { flex: 1 1 0; min-width: 0; height: 100%; min-height: 0; padding: 0 var(--space-3); border: 0; border-radius: 0; background: transparent; color: inherit; font: inherit; outline: none; box-shadow: none; } .ut-affix { display: flex; align-items: center; padding: 0 calc((var(--space-2) + var(--space-3)) / 2); background: var(--paper); color: var(--muted); font-family: var(--font-mono); font-size: var(--text-data-size); white-space: nowrap; } .ut-affix--prefix { border-right: 1px solid var(--rule); } .ut-affix--suffix { border-left: 1px solid var(--rule); } .ut-affix--icon { padding: 0 0 0 calc((var(--space-2) + var(--space-3)) / 2); background: transparent; } .ut-affix--icon + input { padding-left: var(--space-2); } /* ─── Native Fallback Selects ─────────────────────────────────────────────── */ /* Single-select native dropdowns fallback; scoped to avoid overriding custom .ut-select button styles */ select:not([multiple]):not([size]):not(.ut-select), select:not([multiple])[size="1"]:not(.ut-select), select.ut-input:not([multiple]):not([size]):not(.ut-select), select.ut-input:not([multiple])[size="1"]:not(.ut-select) { appearance: none; -webkit-appearance: none; -moz-appearance: none; box-sizing: border-box; width: 100%; height: var(--control-md); min-height: var(--control-md); padding: 0 calc(var(--space-3) + var(--space-4) + var(--space-2)) 0 var(--space-3); border: 1px solid var(--rule-strong); border-radius: var(--radius-control); background-color: var(--surface); background-image: linear-gradient(45deg, transparent 50%, var(--ink-soft) 50%), linear-gradient(135deg, var(--ink-soft) 50%, transparent 50%); background-position: calc(100% - var(--space-4) - 5px) calc(50% - 2px), calc(100% - var(--space-4)) calc(50% - 2px); background-size: 5px 5px, 5px 5px; background-repeat: no-repeat; box-shadow: var(--shadow-control); color: var(--ink); font-family: var(--font-body); font-size: var(--text-body-sm-size); line-height: var(--text-body-sm-line-height); cursor: pointer; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; transition: border-color 120ms, box-shadow 120ms, background-color 120ms; } select:not([multiple]):not([size]):not(.ut-select):hover:not(:disabled), select:not([multiple])[size="1"]:not(.ut-select):hover:not(:disabled), select.ut-input:not([multiple]):not([size]):not(.ut-select):hover:not(:disabled), select.ut-input:not([multiple])[size="1"]:not(.ut-select):hover:not(:disabled) { border-color: var(--ink-soft); background-image: linear-gradient(45deg, transparent 50%, var(--ink) 50%), linear-gradient(135deg, var(--ink) 50%, transparent 50%); } select:not([multiple]):not([size]):not(.ut-select):focus-visible, select:not([multiple])[size="1"]:not(.ut-select):focus-visible, select.ut-input:not([multiple]):not([size]):not(.ut-select):focus-visible, select.ut-input:not([multiple])[size="1"]:not(.ut-select):focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; border-color: var(--accent); } select:not([multiple]):not([size]):not(.ut-select):disabled, select:not([multiple])[size="1"]:not(.ut-select):disabled, select.ut-input:not([multiple]):not([size]):not(.ut-select):disabled, select.ut-input:not([multiple])[size="1"]:not(.ut-select):disabled { opacity: 0.45; cursor: not-allowed; border-color: var(--rule); background-color: var(--sunken); box-shadow: none; background-image: linear-gradient(45deg, transparent 50%, var(--muted) 50%), linear-gradient(135deg, var(--muted) 50%, transparent 50%); } select option { background-color: var(--surface); color: var(--ink); } /* Status marks & glyphs */ .ut-status { display: inline-flex; align-items: center; gap: var(--space-2); font-size: var(--text-body-size); font-weight: var(--text-heading-weight); } .ut-glyph { flex: none; display: inline-block; width: 10px; height: 10px; box-sizing: border-box; } .ut-glyph--up { border-radius: 50%; background: var(--up); } .ut-glyph--degraded { background: var(--degraded); clip-path: polygon(50% 0, 100% 100%, 0 100%); } .ut-glyph--down { border-radius: var(--radius-xs); background: var(--down); } .ut-glyph--unknown { border: 2px solid var(--unknown); border-radius: 50%; } .ut-glyph--paused { border-left: 3px solid var(--muted); border-right: 3px solid var(--muted); width: calc(var(--space-2) + 1px); } .ut-status--up { color: var(--up); } .ut-status--degraded { color: var(--degraded); } .ut-status--down { color: var(--down); } .ut-status--unknown, .ut-status--paused { color: var(--muted); } .ut-status--chip { height: var(--space-6); padding: 0 var(--space-3) 0 var(--space-2); border-radius: var(--radius-full); } .ut-status--chip.ut-status--up { background: var(--up-tint); } .ut-status--chip.ut-status--degraded { background: var(--degraded-tint); } .ut-status--chip.ut-status--down { background: var(--down-tint); } .ut-status--chip.ut-status--unknown, .ut-status--chip.ut-status--paused { background: var(--sunken); } /* Badges */ .ut-badge, .monitor-badge, .badge { display: inline-flex; align-items: center; gap: var(--space-2); height: 20px; padding: 0 var(--space-2); border: 1px solid var(--rule); border-radius: var(--radius-sm); background: var(--surface); color: var(--ink); font-size: var(--text-data-size); font-weight: var(--text-figure-weight); } .ut-badge::before, .monitor-badge::before { content: ""; width: var(--space-2); height: var(--space-2); border-radius: var(--radius-xs); background: var(--badge-color, var(--muted)); flex: none; } /* Panels & Dialogs */ .ut-panel, .settings-card { overflow: hidden; border: 1px solid var(--rule); border-radius: var(--radius-md); background: var(--surface); } .ut-panel__head { display: flex; justify-content: space-between; align-items: center; gap: var(--space-3); padding: var(--space-3) var(--space-4); border-bottom: 1px solid var(--rule); background: var(--sunken); } .ut-panel__body { padding: var(--space-4); } .ut-scrim, .dialog-backdrop { position: fixed; inset: 0; display: grid; place-items: center; padding: var(--space-6); background: var(--overlay); z-index: var(--z-modal); } dialog.confirm, dialog.ut-dialog, dialog, .ut-dialog, .dialog { display: grid; gap: var(--space-3); box-sizing: border-box; width: 100%; max-width: 440px; padding: var(--space-6); border: 1px solid var(--rule); border-radius: var(--radius-md); background: var(--surface); color: var(--ink); box-shadow: var(--shadow-overlay); } dialog::backdrop, .confirm::backdrop { background: var(--overlay); } dialog.confirm form, .confirm form { display: grid; gap: var(--space-3); } .confirm-box { border: 1px solid var(--down); border-radius: var(--radius-sm); background: var(--down-tint); padding: var(--space-3); display: grid; gap: var(--space-2); color: var(--ink); } .form-actions { display: flex; flex-wrap: wrap; gap: var(--space-2); } .ut-dialog__actions { display: flex; justify-content: flex-end; gap: var(--space-2); padding-top: var(--space-2); } /* Tables */ table { width: 100%; border-collapse: collapse; font-size: var(--text-body-size); } th { color: var(--muted); font-family: var(--font-body); font-size: var(--text-label-size); font-weight: var(--text-label-weight); letter-spacing: var(--text-label-letter-spacing); text-align: left; white-space: nowrap; background: var(--sunken); padding: var(--space-3) var(--space-4); border-bottom: 1px solid var(--rule); } td { padding: var(--space-3) var(--space-4); border-bottom: 1px solid var(--rule); vertical-align: top; } tbody tr:hover { background: var(--sunken); } /* ─── Reduced Motion ──────────────────────────────────────────────────────── */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important; } button, a { transform: none !important; } } /* ── Backward-compatible Layout & Component Helpers ───────────────────────── */ .page-head { display: flex; flex-direction: column; align-items: flex-start; gap: var(--space-3); padding-bottom: var(--space-4); border-bottom: 1px solid var(--rule); margin-bottom: var(--space-4); } @media (min-width: 40rem) { .page-head { flex-direction: row; justify-content: space-between; align-items: flex-end; } } .state, .center-state { padding: var(--space-8) 0; display: grid; gap: var(--space-2); } .state--error { color: var(--down); } .state--loading { color: var(--muted); } .state--empty { color: var(--muted); border: 1px dashed var(--rule-strong); border-radius: var(--radius-md); padding: var(--space-8); background: var(--surface); text-align: center; } .center-state { min-height: 100dvh; place-content: center; } .workspace-state { max-width: 38rem; margin-inline: auto; padding-block: 12vh; display: grid; gap: var(--space-3); text-align: center; } .workspace-state p:last-child { color: var(--muted); } .workspace--restricted { min-height: 50vh; display: grid; place-content: center; } .public-workspace { width: 100%; min-height: 100dvh; } .landing { width: 100%; margin-inline: auto; padding-inline: var(--space-4); min-height: 100dvh; display: flex; flex-direction: column; padding-block: var(--space-4); } .landing__nav, .landing__footer, .landing__foot { display: flex; align-items: center; justify-content: space-between; gap: var(--space-4); flex: 0 0 auto; } .landing__nav-links { display: flex; align-items: center; gap: var(--space-4); } .landing__nav-link { color: var(--ink-soft); text-decoration: none; font-size: var(--text-body-size); } .landing__nav-link:hover { color: var(--ink); } .landing__hero { flex: 1 1 auto; display: flex; flex-direction: column; justify-content: center; align-items: center; width: min(100%, 44rem); margin-inline: auto; padding-block: var(--space-6); text-align: center; } .landing__hero h1 { max-width: 18ch; margin-block: 0 var(--space-2); } .landing__lede { max-width: 46ch; color: var(--ink-soft); font-size: var(--text-heading-size); } .landing__hero .auth-card { width: min(100%, 28rem); margin-top: var(--space-6); padding: var(--space-4); text-align: left; } .landing__hero .auth-card .button { width: 100%; } .landing__note, .landing__disclosure { margin-top: var(--space-2); color: var(--muted); font-size: var(--text-body-size); } .landing__footer, .landing__foot { border-top: 1px solid var(--rule); padding-top: var(--space-2); color: var(--muted); font-size: var(--text-body-size); } .landing__form { display: grid; gap: var(--space-3); width: 100%; } .auth-page, .auth-screen { min-height: 100dvh; width: min(100% - var(--space-6), 34rem); margin-inline: auto; padding-block: var(--space-4); display: flex; flex-direction: column; } .auth-card { margin-top: clamp(3rem, 10vw, 6rem); border: 1px solid var(--rule); background: var(--surface); border-radius: var(--radius-md); padding: var(--space-6); display: grid; gap: var(--space-4); } .auth-card__lede { color: var(--ink-soft); font-size: var(--text-heading-size); } .auth-card__switch { color: var(--muted); font-size: var(--text-body-size); } .auth-card__switch a { color: var(--ink); } .status-dot { width: var(--space-2); height: var(--space-2); border-radius: 50%; background: var(--muted); display: inline-block; flex: none; } .status-dot--up { background: var(--up); } .status-dot--degraded, .status-dot--recovering { background: var(--degraded); } .status-dot--down { background: var(--down); } .status-dot--unknown { background: var(--unknown); } /* ── Public Status Pages & Editor ─────────────────────────────────────────── */ .public-status-workspace { width: min(100% - var(--space-8), 70rem); margin-inline: auto; padding-block: var(--space-6); } .public-status-page { display: grid; gap: var(--space-6); } .public-status-page__head { display: grid; gap: var(--space-2); padding-bottom: var(--space-4); border-bottom: 1px solid var(--rule); } .public-status-page__topline { display: flex; align-items: center; justify-content: space-between; gap: var(--space-4); flex-wrap: wrap; } .public-status-page__refresh-toggle { white-space: nowrap; } .public-status-page__freshness { font-family: var(--font-mono); font-size: var(--text-data-size); color: var(--muted); } .status-problem-summary { display: grid; gap: var(--space-3); padding: var(--space-4); border: 1px solid var(--down); border-radius: var(--radius-md); background: var(--down-tint); } .status-problem-summary__heading { display: flex; align-items: center; gap: var(--space-2); } .status-problem-summary__heading h2 { margin: 0; font-family: var(--font-display); font-size: var(--text-heading-size); font-weight: var(--text-heading-weight); color: var(--down); } .status-problem-summary__indicator { display: inline-flex; width: var(--space-6); height: var(--space-6); align-items: center; justify-content: center; border-radius: var(--radius-full); background: var(--down); color: var(--on-down); font-weight: 700; font-size: var(--text-body-sm-size); } .status-problem-summary__list { margin: 0; padding-inline-start: var(--space-4); color: var(--ink); } .public-status-page__groups { display: grid; gap: var(--space-4); } .public-status-page__group-row { min-width: 0; display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-4); } .public-status-page__group-row--paired { grid-template-columns: repeat(2, minmax(0, 1fr)); } @media (max-width: 700px) { .public-status-page__group-row--paired { grid-template-columns: minmax(0, 1fr); } } .public-status-group { display: flex; flex-direction: column; background: var(--surface); border: 1px solid var(--rule); border-radius: var(--radius-md); padding: var(--space-4); gap: var(--space-3); } .public-status-group--full { grid-column: 1 / -1; } .public-status-group__head { display: flex; align-items: baseline; justify-content: space-between; gap: var(--space-2); } .public-status-group__title { font-family: var(--font-display); font-size: var(--text-heading-size); font-weight: var(--text-heading-weight); margin: 0; color: var(--ink); } .public-status-group__count { font-family: var(--font-mono); font-size: var(--text-data-size); color: var(--muted); } .group-pagination { display: flex; align-items: center; gap: var(--space-2); } .group-pagination--bottom { justify-content: flex-end; padding-top: var(--space-3); border-top: 1px solid var(--rule); } .public-status-monitor { min-width: 0; display: grid; grid-template-columns: minmax(10rem, 1fr) 5rem minmax(14rem, 2fr) auto; align-items: center; gap: var(--space-3); padding-block: var(--space-2); border-top: 1px solid var(--rule); text-decoration: none; color: var(--ink); } .public-status-monitor:first-of-type { border-top: none; } .public-status-monitor__summary { display: contents; } .public-status-monitor__name { grid-column: 1; grid-row: 1; min-width: 0; display: flex; align-items: center; gap: var(--space-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .public-status-monitor__uptime { grid-column: 2; grid-row: 1; font-family: var(--font-mono); font-size: var(--text-data-size); color: var(--muted); } .public-status-monitor > .uptime-days, .public-status-monitor > .ut-strip__days, .public-status-monitor > .ut-strip { grid-column: 3; grid-row: 1; min-width: 0; } .public-status-monitor__state { grid-column: 4; grid-row: 1; font-size: var(--text-body-sm-size); font-weight: 600; justify-self: end; } .public-status-monitor__state--up { color: var(--up); } .public-status-monitor__state--degraded, .public-status-monitor__state--recovering { color: var(--degraded); } .public-status-monitor__state--down { color: var(--down); } .public-status-monitor__state--unknown { color: var(--unknown); } @media (max-width: 700px) { .public-status-monitor { grid-template-columns: minmax(0, 1fr); } .public-status-monitor__summary { display: flex; align-items: center; flex-wrap: wrap; gap: var(--space-2) var(--space-3); grid-column: 1; grid-row: 1; min-width: 0; } .public-status-monitor__name { grid-column: auto; grid-row: auto; flex: 1 1 10rem; min-width: 0; } .public-status-monitor__uptime { grid-column: auto; grid-row: auto; flex: 0 0 auto; } .public-status-monitor__state { grid-column: auto; grid-row: auto; flex: 0 0 auto; margin-left: auto; } .public-status-monitor > .uptime-days, .public-status-monitor > .ut-strip__days, .public-status-monitor > .ut-strip { grid-column: 1; grid-row: 2; min-width: 0; overflow: visible; } } .drag-handle { color: var(--muted); cursor: grab; user-select: none; } .public-slug-field { margin-top: var(--space-3); } .public-slug-field__input { display: flex; align-items: stretch; height: var(--control-md); min-height: var(--control-md); border: 1px solid var(--rule-strong); border-radius: var(--radius-control); background: var(--surface); box-shadow: var(--shadow-inset); overflow: hidden; transition: border-color 120ms, box-shadow 120ms; } .public-slug-field__input:hover:not(:disabled) { border-color: var(--ink-soft); } .public-slug-field__input:focus-within { outline: none; border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent), 0 0 0 4px var(--focus-halo); } .public-slug-field__input > span { display: flex; align-items: center; padding: 0 calc((var(--space-2) + var(--space-3)) / 2); background: var(--paper); border-right: 1px solid var(--rule); color: var(--muted); font-family: var(--font-mono); font-size: var(--text-data-size); white-space: nowrap; } .public-slug-field__input input { flex: 1 1 0; min-width: 0; height: 100%; min-height: 0; padding: 0 var(--space-3); border: none; border-radius: 0; background: transparent; box-shadow: none; outline: none; font: inherit; color: inherit; } .public-slug-field__input input:focus { border: none; box-shadow: none; outline: none; } .product-mark { font-family: var(--font-body); font-size: var(--text-label-size); font-weight: var(--text-label-weight); letter-spacing: var(--text-label-letter-spacing); color: var(--muted); } .empty-inline { font-size: var(--text-body-sm-size); color: var(--muted); margin: 0; } /* ─── Coarse Pointers (Touch) ─────────────────────────────────────────────── */ @media (pointer: coarse) { .ut-btn, .button, .ut-input, .ut-input-group, input:where(:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="button"]):not([type="submit"]):not([type="reset"]):not([type="hidden"])), select:not([multiple]):not([size]):not(.ut-select), select:not([multiple])[size="1"]:not(.ut-select), .public-slug-field__input { height: var(--control-touch); min-height: var(--control-touch); } .ut-input, .ut-input-group, input:where(:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="button"]):not([type="submit"]):not([type="reset"]):not([type="hidden"])), select:not([multiple]):not([size]):not(.ut-select), select:not([multiple])[size="1"]:not(.ut-select), .public-slug-field__input input { font-size: var(--text-body-size); } .ut-segmented__item { height: calc(var(--control-touch) - var(--space-1)); min-height: calc(var(--control-touch) - var(--space-1)); font-size: var(--text-body-sm-size); } }