/* Core stylesheet: tokens, appearances, typography and the shared components. Pattern families live in ci-.css; ci-styles.css imports everything. */ @layer theme, base, components, utilities; @import "./ci-tokens.css"; @import "./ci-editions.css"; @import "./keak-brand.css"; @import "./ci-typography.css"; @import "./loading-screen.css"; @layer components { .ci-recovery-state { min-width:0; color:var(--ci-color-foreground); font-family:var(--ci-font-ui); } .ci-recovery-state[data-variant="page"] { min-height:100svh; display:flex; flex-direction:column; background:var(--ci-color-background); } .ci-recovery-state__header { display:flex; align-items:center; justify-content:space-between; gap:var(--ci-space-4); padding:var(--ci-space-6) var(--ci-space-8); border-bottom:var(--ci-border-hairline) solid var(--ci-color-border-subtle); } .ci-recovery-state__body { flex:1; min-width:0; display:grid; place-items:center; padding:var(--ci-space-10) var(--ci-space-6); } .ci-recovery-state__panel { width:100%; max-width:36rem; min-width:0; box-sizing:border-box; padding:var(--ci-space-8); border:var(--ci-border-hairline) solid var(--ci-color-border); border-radius:var(--ci-radius-surface); background:var(--ci-color-surface); } .ci-recovery-state__icon { display:grid; place-items:center; width:3rem; height:3rem; border-radius:50%; color:var(--ci-color-foreground); background:var(--ci-color-accent-surface-strong); margin-bottom:var(--ci-space-6); } .ci-recovery-state__icon svg { width:1.5rem; height:1.5rem; } .ci-recovery-state__eyebrow { margin:0 0 var(--ci-space-2); color:var(--ci-color-text-muted); font-size:var(--ci-font-size-xs); font-weight:var(--ci-font-weight-medium); } .ci-recovery-state__title { margin:0; font-size:var(--ci-font-size-3xl); font-weight:var(--ci-font-weight-medium); line-height:1.15; letter-spacing:-.025em; text-wrap:balance; } .ci-recovery-state__description { margin:var(--ci-space-3) 0 0; color:var(--ci-color-text-muted); font-size:var(--ci-font-size-sm); line-height:1.6; } .ci-recovery-state__actions { display:flex; align-items:center; flex-wrap:wrap; gap:var(--ci-space-3); margin-top:var(--ci-space-6); } .ci-recovery-state__footer { display:flex; flex-direction:column; gap:var(--ci-space-3); margin-top:var(--ci-space-8); padding-top:var(--ci-space-5); border-top:var(--ci-border-hairline) solid var(--ci-color-border-subtle); color:var(--ci-color-text-muted); font-size:var(--ci-font-size-xs); line-height:1.5; } .ci-recovery-state__footer a, .ci-recovery-state__header a { color:inherit; text-underline-offset:.2em; } .ci-recovery-state__footer a:hover { color:var(--ci-color-foreground); } .ci-recovery-state__reference { margin:0; overflow-wrap:anywhere; } .ci-recovery-state__reference code { font-family:var(--ci-font-code); font-size:inherit; } .ci-recovery-state[data-variant="section"] .ci-recovery-state__body { padding:var(--ci-space-6); } @media(max-width:480px) { .ci-recovery-state__header { padding:var(--ci-space-5); } .ci-recovery-state__body { padding:var(--ci-space-8) var(--ci-space-4); } .ci-recovery-state__panel { padding:var(--ci-space-6); } .ci-recovery-state__title { font-size:var(--ci-font-size-2xl); } .ci-recovery-state__actions { align-items:stretch; flex-direction:column; } .ci-recovery-state__actions > * { width:100%; } .ci-recovery-state[data-variant="section"] .ci-recovery-state__body { padding:var(--ci-space-4); } } } @layer base { .ci-theme { color: var(--ci-color-foreground); background: var(--ci-color-background); font-family: var(--ci-font-ui); font-size: var(--ci-font-size-md); line-height: var(--ci-type-body-leading); text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; font-weight: var(--ci-font-weight-regular); letter-spacing: var(--ci-type-body-tracking); } .ci-theme *, .ci-theme *::before, .ci-theme *::after { box-sizing: border-box; } .ci-theme ::selection { color: var(--ci-color-selection-foreground); background: var(--ci-color-selection); } } @layer components { .ci-display { margin: 0; color: var(--ci-color-heading); font-family: var(--ci-font-display); font-size: var(--ci-font-size-hero); font-weight: var(--ci-font-weight-medium); line-height: var(--ci-type-heading-leading); letter-spacing: var(--ci-type-heading-tracking); } .ci-heading { margin: 0; color: var(--ci-color-heading); font-family: var(--ci-font-ui); font-weight: var(--ci-font-weight-medium); line-height: var(--ci-type-heading-leading); letter-spacing: var(--ci-type-heading-tracking); } .ci-dashboard-display { margin: 0; color: var(--ci-color-heading); font-family: var(--ci-type-dashboard-display-family); font-size: var(--ci-type-dashboard-display-size); font-weight: var(--ci-type-dashboard-display-weight); line-height: var(--ci-type-dashboard-display-leading); letter-spacing: var(--ci-type-heading-tracking); } .ci-eyebrow { color: var(--ci-color-text-muted); font-family: var(--ci-font-ui); font-size: var(--ci-font-size-xs); font-weight: var(--ci-font-weight-regular); letter-spacing: var(--ci-type-caption-tracking); line-height: var(--ci-type-caption-leading); text-transform: uppercase; } .ci-button { display: inline-flex; min-height: var(--ci-control-height-lg); align-items: center; justify-content: center; gap: var(--ci-space-2); padding: 0 var(--ci-space-4); border: var(--ci-border-default) solid transparent; border-radius: var(--ci-radius-pill); color: var(--ci-button-primary-fg); background: var(--ci-button-primary-bg); font: var(--ci-font-weight-medium) var(--ci-font-size-sm) / var(--ci-line-height-ui) var(--ci-font-ui); letter-spacing: var(--ci-type-control-tracking); text-decoration: none; cursor: pointer; transition: color var(--ci-duration-base) var(--ci-ease-standard), background-color var(--ci-duration-base) var(--ci-ease-standard), border-color var(--ci-duration-base) var(--ci-ease-standard), transform var(--ci-duration-fast) var(--ci-ease-standard); font-weight: var(--ci-font-weight-medium); line-height: var(--ci-type-control-leading); } .ci-button:hover { color: var(--ci-button-primary-fg); background: var(--ci-button-primary-hover); } .ci-button:active { transform: translateY(1px); } .ci-button:focus-visible, .ci-segmented__item:focus-visible { outline: none; box-shadow: var(--ci-ring-focus); } .ci-input:focus-visible { outline: none; border-color: var(--ci-color-focus); box-shadow: var(--ci-ring-field-focus); } .ci-button:disabled, .ci-button[aria-disabled="true"] { opacity: 0.48; pointer-events: none; } .ci-button[data-blocked="true"]:not(:disabled) { pointer-events: auto; cursor: help; } .ci-button--secondary { color: var(--ci-color-foreground); background: var(--ci-color-surface); border-color: var(--ci-color-border); } .ci-button--secondary:hover { background: var(--ci-color-surface-subtle); } .ci-button--ghost { color: var(--ci-color-foreground); background: transparent; } .ci-button--ghost:hover { background: var(--ci-color-surface-muted); } .ci-input { width: 100%; min-width: 0; max-width: 100%; min-height: var(--ci-control-height-lg); padding: 0 var(--ci-space-3); border: var(--ci-border-default) solid var(--ci-field-border); border-radius: var(--ci-radius-control); color: var(--ci-field-fg); background: var(--ci-field-bg); font: var(--ci-font-weight-regular) var(--ci-font-size-sm) / var(--ci-line-height-ui) var(--ci-font-ui); transition: border-color var(--ci-duration-base) var(--ci-ease-standard), box-shadow var(--ci-duration-base) var(--ci-ease-standard); font-weight: var(--ci-font-weight-regular); line-height: var(--ci-type-data-leading); letter-spacing: var(--ci-type-data-tracking); } .ci-input::placeholder { color: var(--ci-field-placeholder); } .ci-input:hover { border-color: var(--ci-color-border-strong); } .ci-input[aria-invalid="true"] { border-color: var(--ci-color-danger); } .ci-search-field { display: flex; min-height: var(--ci-control-height-lg); align-items: center; gap: var(--ci-space-2); padding: 0 var(--ci-space-3); border: var(--ci-border-default) solid var(--ci-field-border); border-radius: var(--ci-radius-control); color: var(--ci-color-text-muted); background: var(--ci-field-bg); } .ci-search-field:hover { border-color: var(--ci-color-border-strong); } .ci-search-field:focus-within { border-color: var(--ci-color-focus); box-shadow: var(--ci-ring-field-focus); } .ci-search-field .ci-input { min-height: calc(var(--ci-control-height-lg) - 2px); padding: 0; border: 0; border-radius: 0; outline: 0; background: transparent; box-shadow: none; } .ci-model-selector { display: inline-flex; align-items: center; padding: 4px; border: var(--ci-border-default) solid var(--ci-color-border); border-radius: var(--ci-radius-pill); background: var(--ci-color-canvas); } .ci-model-selector__item { display: inline-flex; align-items: center; justify-content: center; gap: 4px; padding: 8px 16px; border: 0; border-radius: var(--ci-radius-pill); color: var(--ci-color-foreground); background: transparent; font: var(--ci-font-weight-regular) var(--ci-font-size-base) / normal var(--ci-font-ui); cursor: pointer; transition: color var(--ci-duration-base) var(--ci-ease-standard), background var(--ci-duration-base) var(--ci-ease-standard); font-weight: var(--ci-font-weight-medium); line-height: var(--ci-type-control-leading); letter-spacing: var(--ci-type-control-tracking); } .ci-model-selector__item[aria-pressed="true"] { color: var(--ci-color-control-active-fg); background: var(--ci-color-control-active-bg); } .ci-model-selector__item:focus-visible { outline: none; box-shadow: var(--ci-ring-focus); } .ci-card { border: var(--ci-border-default) solid var(--ci-card-border); border-radius: var(--ci-radius-surface); color: var(--ci-color-foreground); background: var(--ci-card-bg); box-shadow: var(--ci-shadow-xs); } .ci-badge { display: inline-flex; min-height: var(--ci-badge-height); align-items: center; gap: var(--ci-space-1); padding: var(--ci-space-0-5) var(--ci-space-1-5); border-radius: var(--ci-radius-sm); color: var(--ci-color-accent-foreground); background: var(--ci-color-accent); font: var(--ci-font-weight-semibold) var(--ci-font-size-xs) / var(--ci-line-height-ui) var(--ci-font-ui); font-weight: var(--ci-font-weight-medium); line-height: var(--ci-type-control-leading); letter-spacing: var(--ci-type-control-tracking); } .ci-segmented { display: inline-flex; align-items: center; gap: var(--ci-space-1); padding: var(--ci-space-1); border: var(--ci-border-default) solid var(--ci-color-border); border-radius: var(--ci-radius-pill); background: var(--ci-color-surface); } .ci-segmented__item { display: inline-flex; min-height: var(--ci-control-height-md); align-items: center; gap: var(--ci-space-1); padding: 0 var(--ci-space-3); border: 0; border-radius: var(--ci-radius-pill); color: var(--ci-color-text-muted); background: transparent; font: var(--ci-font-weight-medium) var(--ci-font-size-sm) / var(--ci-line-height-ui) var(--ci-font-ui); cursor: pointer; font-weight: var(--ci-font-weight-medium); line-height: var(--ci-type-control-leading); letter-spacing: var(--ci-type-control-tracking); } .ci-segmented__item[aria-pressed="true"], .ci-segmented__item[data-active="true"] { color: var(--ci-color-control-active-fg); background: var(--ci-color-control-active-bg); } .ci-icon { width: var(--ci-icon-size-md); height: var(--ci-icon-size-md); flex: none; fill: none; stroke: currentColor; stroke-width: var(--ci-icon-stroke-width); stroke-linecap: round; stroke-linejoin: round; } .ci-icon--sm { width: var(--ci-icon-size-sm); height: var(--ci-icon-size-sm); } .ci-icon--lg { width: var(--ci-icon-size-lg); height: var(--ci-icon-size-lg); } .ci-button--outline { color: var(--ci-color-foreground); border-color: var(--ci-color-border); background: transparent; } .ci-button--outline:hover, .ci-button--secondary:hover, .ci-button--ghost:hover { color: var(--ci-color-heading); background: var(--ci-color-surface-muted); } .ci-button--destructive { color: var(--ci-color-danger-foreground); background: var(--ci-color-danger); } .ci-button--destructive:hover { color: var(--ci-color-danger); background: var(--ci-color-danger-bg); } /* Risky but reversible actions (force refresh, reset cooldowns, clear a cache). Hover fills with the warning ink, mirroring the destructive swap. */ .ci-button--warning { color: var(--ci-color-warning); border-color: var(--ci-color-warning-border); background: var(--ci-color-warning-bg); } .ci-button--warning:hover { color: var(--ci-color-warning-bg); background: var(--ci-color-warning); } .ci-button--link { min-height: auto; padding: 0; border-radius: 0; color: var(--ci-color-foreground); background: transparent; text-decoration: underline; text-underline-offset: 0.2em; } .ci-button--link:hover { color: var(--ci-color-text-muted); background: transparent; } .ci-button--size-xs, .ci-button--size-icon-xs { min-height: var(--ci-control-height-sm); padding-inline: var(--ci-space-3); font-size: var(--ci-font-size-xs); font-weight: var(--ci-font-weight-medium); line-height: var(--ci-type-control-leading); letter-spacing: var(--ci-type-control-tracking); } .ci-button--size-sm, .ci-button--size-icon-sm, .ci-button--size-md { min-height: var(--ci-control-height-md); padding-inline: var(--ci-space-3); } .ci-button--size-lg { min-height: var(--ci-control-height-xl); padding-inline: var(--ci-space-5); font-size: var(--ci-font-size-md); font-weight: var(--ci-font-weight-medium); line-height: var(--ci-type-control-leading); letter-spacing: var(--ci-type-control-tracking); } .ci-button--size-icon, .ci-button--size-icon-xs, .ci-button--size-icon-sm, .ci-button--size-icon-lg { width: var(--ci-control-height-lg); padding-inline: 0; } .ci-button--size-icon-xs { width: var(--ci-control-height-sm); } .ci-button--size-icon-sm { width: var(--ci-control-height-md); } .ci-button--size-icon-lg { width: var(--ci-control-height-xl); } .ci-button > svg, .ci-button__spinner { width: var(--ci-icon-size-sm); height: var(--ci-icon-size-sm); flex: none; } .ci-button__spinner { animation: ci-spin 0.8s linear infinite; } .ci-spinner { position: relative; display: inline-flex; flex: none; width: var(--ci-icon-size-sm); height: var(--ci-icon-size-sm); vertical-align: middle; } .ci-spinner[data-size="xs"] { width: var(--ci-icon-size-xs); height: var(--ci-icon-size-xs); } .ci-spinner[data-size="md"] { width: var(--ci-icon-size-md); height: var(--ci-icon-size-md); } .ci-spinner__graphic { display: block; width: 100%; height: 100%; animation: ci-spin 0.8s linear infinite; } .ci-badge--secondary { color: var(--ci-color-foreground); background: var(--ci-color-surface-muted); } .ci-badge--destructive { color: var(--ci-color-danger); background: var(--ci-color-danger-bg); } .ci-badge--outline { border: var(--ci-border-default) solid var(--ci-color-border); color: var(--ci-color-foreground); background: transparent; } .ci-badge--live { color: var(--ci-observed-body); background: var(--ci-color-live); font-size: var(--ci-font-size-sm); font-weight: var(--ci-font-weight-medium); line-height: var(--ci-type-control-leading); letter-spacing: var(--ci-type-control-tracking); } .ci-badge--pill { border-radius: var(--ci-radius-pill); } .ci-badge--live::before { width: 8px; height: 8px; flex: none; border-radius: 50%; background: var(--ci-color-control-thumb-checked); content: ""; animation: ci-live-blink 1.2s ease-in-out infinite; } .ci-badge--circle { width: var(--ci-badge-height); min-width: var(--ci-badge-height); height: var(--ci-badge-height); justify-content: center; padding: 0; border-radius: var(--ci-radius-pill); } .ci-badge > svg { width: var(--ci-icon-size-xs); height: var(--ci-icon-size-xs); } /* Status tones: AA ink on a subtle tint. They follow every variant rule, so a tone recolours any variant; border-color only shows on outline, which keeps its border. */ .ci-badge--tone-neutral { border-color: var(--ci-color-border); color: var(--ci-color-foreground); background: var(--ci-color-surface-muted); } .ci-badge--tone-success { border-color: var(--ci-color-success); color: var(--ci-color-success); background: var(--ci-color-success-bg); } .ci-badge--tone-warning { border-color: var(--ci-color-warning); color: var(--ci-color-warning); background: var(--ci-color-warning-bg); } .ci-badge--tone-info { border-color: var(--ci-color-info); color: var(--ci-color-info); background: var(--ci-color-info-bg); } .ci-badge--tone-danger { border-color: var(--ci-color-danger); color: var(--ci-color-danger); background: var(--ci-color-danger-bg); } .ci-badge--tone-accent { border-color: var(--ci-badge-accent-ink); color: var(--ci-badge-accent-ink); background: var(--ci-color-accent-surface-strong); } .ci-card__header { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: var(--ci-space-1) var(--ci-space-4); padding: var(--ci-space-6) var(--ci-space-6) 0; } .ci-card__title { color: var(--ci-color-heading); font-size: var(--ci-font-size-lg); font-weight: var(--ci-font-weight-medium); line-height: var(--ci-type-heading-leading); letter-spacing: var(--ci-type-heading-tracking); } .ci-card__description { grid-column: 1; color: var(--ci-color-text-muted); font-size: var(--ci-font-size-sm); font-weight: var(--ci-font-weight-regular); line-height: var(--ci-type-body-leading); letter-spacing: var(--ci-type-body-tracking); } .ci-card__action { grid-column: 2; grid-row: 1 / span 2; } .ci-card__content { padding: var(--ci-space-6); } .ci-card__header + .ci-card__content { padding-top: var(--ci-space-4); } .ci-card__footer { display: flex; align-items: center; gap: var(--ci-space-3); padding: 0 var(--ci-space-6) var(--ci-space-6); } .ci-card__footer--between { justify-content: space-between; } .ci-card__footer--end { justify-content: flex-end; } .ci-input--sm { min-height: var(--ci-control-height-md); } .ci-input--error, .ci-input[aria-invalid="true"] { border-color: var(--ci-color-danger); } .ci-input-shell { display: flex; width: 100%; min-width: 0; max-width: 100%; min-height: var(--ci-control-height-lg); align-items: center; gap: var(--ci-space-2); padding-inline: var(--ci-space-3); border: var(--ci-border-default) solid var(--ci-field-border); border-radius: var(--ci-radius-control); color: var(--ci-color-text-muted); background: var(--ci-field-bg); transition: border-color var(--ci-duration-base) var(--ci-ease-standard), box-shadow var(--ci-duration-base) var(--ci-ease-standard); } .ci-input-shell:hover { border-color: var(--ci-color-border-strong); } .ci-input-shell:focus-within { border-color: var(--ci-color-focus); box-shadow: var(--ci-ring-field-focus); } .ci-input-shell--sm { min-height: var(--ci-control-height-md); } .ci-input-shell--error { border-color: var(--ci-color-danger); } .ci-input-shell .ci-input { min-height: calc(var(--ci-control-height-lg) - 2px); padding: 0; border: 0; border-radius: 0; outline: 0; background: transparent; box-shadow: none; } .ci-input-shell--sm .ci-input { min-height: calc(var(--ci-control-height-md) - 2px); } .ci-input-shell__icon { display: inline-flex; flex: none; } .ci-input-shell__icon > svg { width: var(--ci-icon-size-sm); height: var(--ci-icon-size-sm); } /* Browser autofill paints its own background above the author background. An opaque inset surface preserves the normal field tokens without disabling suggestions, delaying transitions, or losing the keyboard focus indicator. */ .ci-input:is(:autofill, :-webkit-autofill) { -webkit-text-fill-color: var(--ci-field-fg); caret-color: var(--ci-field-fg); box-shadow: inset 0 0 0 1000px var(--ci-field-bg); } .ci-input:is(:autofill, :-webkit-autofill):focus-visible { box-shadow: var(--ci-ring-field-focus), inset 0 0 0 1000px var(--ci-field-bg); } /* Icon inputs draw their focus ring on the shell, not the inner input. */ .ci-input-shell .ci-input:is(:autofill, :-webkit-autofill):focus-visible { box-shadow: inset 0 0 0 1000px var(--ci-field-bg); } @media (forced-colors: active) { .ci-input:is(:autofill, :-webkit-autofill) { -webkit-text-fill-color: FieldText; caret-color: FieldText; } } .ci-label { display: inline-flex; align-items: center; gap: var(--ci-space-2); color: var(--ci-color-foreground); font: var(--ci-font-weight-medium) var(--ci-font-size-sm) / var(--ci-line-height-ui) var(--ci-font-ui); font-weight: var(--ci-font-weight-medium); line-height: var(--ci-type-control-leading); letter-spacing: var(--ci-type-control-tracking); } .ci-separator { flex: none; background: var(--ci-separator-color, var(--ci-color-border)); } .ci-separator[data-orientation="horizontal"] { width: 100%; height: var(--ci-border-hairline); } .ci-separator[data-orientation="vertical"] { align-self: stretch; width: var(--ci-border-hairline); } .ci-separator-label { display: flex; width: 100%; align-items: center; gap: var(--ci-space-3); color: var(--ci-color-text-muted); font-size: var(--ci-font-size-xs); } .ci-separator-label > span[aria-hidden="true"] { height: var(--ci-border-hairline); flex: 1; background: var(--ci-separator-color, var(--ci-color-border)); } .ci-separator-label[data-align="start"] > span:first-child, .ci-separator-label[data-align="end"] > span:last-child { display: none; } .ci-skeleton { min-height: 1rem; border-radius: var(--ci-radius-control); background: var(--ci-color-surface-muted); } .ci-skeleton--circular { border-radius: 50%; } .ci-skeleton--text { height: 0.875rem; border-radius: var(--ci-radius-pill); } .ci-skeleton--pulse { animation: ci-pulse 1.6s ease-in-out infinite; } .ci-skeleton--wave { background: linear-gradient(90deg, var(--ci-color-surface-muted), var(--ci-color-surface), var(--ci-color-surface-muted)); background-size: 200% 100%; animation: ci-wave 1.5s linear infinite; } .ci-switch { display: inline-flex; align-items: center; gap: var(--ci-space-3); color: var(--ci-color-foreground); cursor: pointer; } .ci-switch[data-side="right"] { justify-content: space-between; } .ci-switch--card { width: 100%; padding: var(--ci-space-4); border: var(--ci-border-default) solid var(--ci-color-border); border-radius: var(--ci-radius-surface); background: var(--ci-color-surface); } .ci-switch[data-disabled="true"] { opacity: 0.48; cursor: not-allowed; } .ci-switch[data-error="true"] { color: var(--ci-color-danger); } .ci-switch__control { position: relative; display: inline-flex; flex: none; cursor: pointer; } .ci-switch__control[data-disabled="true"] { cursor: not-allowed; } /* A standalone switch has no row to dim, so its control carries the disabled look. */ .ci-switch__control[data-slot="switch"][data-disabled="true"] { opacity: 0.48; } /* The transparent native input covers the whole control: the visible track is the hit target with or without a