@import url('https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,400..800&display=swap');

/* ====================================================================== *
 * SlopKit UI — base stylesheet
 *
 * Link this FIRST in your <head>, synchronously, to prevent FOUC:
 *
 *   <link rel="stylesheet" href="@slopkit/slopkit-ui.css">
 *
 * Because a stylesheet <link> is render-blocking, the design tokens below
 * are available on the very first paint (correct background / text / fonts),
 * and tiered `:not(:defined)` rules keep content readable while hiding
 * interactive components until their custom-element definitions upgrade.
 *
 * The token values here are the single source of truth and mirror the
 * runtime injection in core/vk-theme.js (which is skipped when this file
 * is present, via the --vk-css sentinel below).
 * ====================================================================== */

:root {
  /* Sentinel so vk-theme.js can detect this stylesheet and skip re-injecting */
  --vk-css: 1;

  color-scheme: light;

  /* Neutral scale — cool, slightly blue-tinted slate */
  --vk-neutral-0:   #ffffff;
  --vk-neutral-50:  #f8fafc;
  --vk-neutral-100: #f1f4f9;
  --vk-neutral-150: #e9edf3;
  --vk-neutral-200: #e2e8f0;
  --vk-neutral-300: #cdd5e0;
  --vk-neutral-400: #97a3b6;
  --vk-neutral-500: #64748b;
  --vk-neutral-600: #475569;
  --vk-neutral-700: #334155;
  --vk-neutral-800: #1d2738;
  --vk-neutral-900: #111827;
  --vk-neutral-950: #0a0f1a;

  /* Brand — refined indigo */
  --vk-color-primary:        #5b5bd6;
  --vk-color-primary-hover:  #5151c9;
  --vk-color-primary-active: #4646b8;
  --vk-color-primary-light:  #ecedfb;
  --vk-color-primary-subtle: #f5f5fd;
  --vk-color-on-primary:     #ffffff;
  --vk-color-accent:         #8b5cf6;

  /* Brand gradients — primary → accent for visible multi-color presets */
  --vk-gradient-brand-end: var(--vk-color-accent);
  --vk-gradient-display: linear-gradient(120deg, var(--vk-color-primary), var(--vk-color-accent));
  --vk-gradient-display-vertical: linear-gradient(180deg, var(--vk-color-primary), var(--vk-color-accent));
  --vk-gradient-display-diagonal: linear-gradient(135deg, var(--vk-color-primary), var(--vk-color-accent));

  /* Theme behavior flags (apply to both light & dark; 1 = on, 0 = off) */
  --vk-theme-atmosphere: 1; /* ambient brand glow behind the page */
  --vk-theme-grid: 1;       /* subtle grid texture overlay */
  --vk-theme-glass: 1;      /* translucent blurred chrome (navbars/headers) */

  /* Semantic surfaces & text */
  --vk-color-surface:        var(--vk-neutral-0);
  --vk-color-surface-alt:    var(--vk-neutral-50);
  --vk-color-surface-sunken: var(--vk-neutral-100);
  --vk-color-surface-hover:  var(--vk-neutral-100);
  --vk-color-text:           var(--vk-neutral-900);
  --vk-color-text-secondary: var(--vk-neutral-600);
  --vk-color-text-muted:     var(--vk-neutral-400);
  --vk-color-border:         var(--vk-neutral-200);
  --vk-color-border-strong:  var(--vk-neutral-300);

  /* Status colors */
  --vk-color-success:        #16a34a;
  --vk-color-success-light:  #dcfce7;
  --vk-color-success-text:   #14803a;
  --vk-color-warning:        #d97706;
  --vk-color-warning-light:  #fef0c7;
  --vk-color-warning-text:   #b45309;
  --vk-color-danger:         #e5484d;
  --vk-color-danger-hover:   #d63a3f;
  --vk-color-danger-light:   #ffe5e7;
  --vk-color-danger-text:    #c62a2f;
  --vk-color-info:           #0a8acb;
  --vk-color-info-light:     #d6f0fd;
  --vk-color-info-text:      #0773aa;

  /* Focus ring + overlays */
  --vk-ring:                 color-mix(in srgb, var(--vk-color-primary) 38%, transparent);
  --vk-ring-width:           3px;
  --vk-color-overlay:        rgba(15, 23, 42, 0.45);

  /* Typography */
  --vk-font-family: 'Geist', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
  --vk-font-display: 'Bricolage Grotesque', var(--vk-font-family);
  --vk-font-mono: 'Geist Mono', 'SF Mono', 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;

  --vk-font-size-xs:   0.75rem;
  --vk-font-size-sm:   0.8125rem;
  --vk-font-size-base: 0.9375rem;
  --vk-font-size-lg:   1.0625rem;
  --vk-font-size-xl:   1.25rem;
  --vk-font-size-2xl:  1.5rem;
  --vk-font-size-3xl:  1.875rem;
  --vk-font-size-4xl:  2.5rem;

  --vk-font-weight-normal:   400;
  --vk-font-weight-medium:   500;
  --vk-font-weight-semibold: 600;
  --vk-font-weight-bold:     700;

  --vk-line-height:       1.6;
  --vk-line-height-tight: 1.2;

  --vk-tracking-tight:  -0.02em;
  --vk-tracking-snug:   -0.011em;
  --vk-tracking-normal: 0;
  --vk-tracking-wide:   0.02em;

  /* Spacing */
  --vk-spacing-2xs: 0.125rem;
  --vk-spacing-xs:  0.25rem;
  --vk-spacing-sm:  0.5rem;
  --vk-spacing-md:  1rem;
  --vk-spacing-lg:  1.5rem;
  --vk-spacing-xl:  2rem;
  --vk-spacing-2xl: 3rem;
  --vk-spacing-3xl: 4rem;

  /* Radius — corner style overrides these wholesale via theme config */
  --vk-radius-xs:   0.25rem;
  --vk-radius-sm:   0.375rem;
  --vk-radius-md:   0.5rem;
  --vk-radius-lg:   0.75rem;
  --vk-radius-xl:   1rem;
  --vk-radius-2xl:  1.25rem;
  --vk-radius-full: 9999px;

  /* Elevation */
  --vk-shadow-xs: 0 1px 2px rgba(15, 23, 42, 0.06);
  --vk-shadow-sm:
    0 1px 2px rgba(15, 23, 42, 0.06),
    0 1px 3px rgba(15, 23, 42, 0.08);
  --vk-shadow-md:
    0 2px 4px -1px rgba(15, 23, 42, 0.06),
    0 4px 12px -2px rgba(15, 23, 42, 0.10);
  --vk-shadow-lg:
    0 4px 8px -2px rgba(15, 23, 42, 0.08),
    0 12px 28px -6px rgba(15, 23, 42, 0.14);
  --vk-shadow-xl:
    0 8px 16px -4px rgba(15, 23, 42, 0.10),
    0 24px 48px -12px rgba(15, 23, 42, 0.22);
  --vk-shadow-focus: 0 0 0 var(--vk-ring-width) var(--vk-ring);
  --vk-shadow-inner: inset 0 1px 2px rgba(15, 23, 42, 0.06);

  /* Motion */
  --vk-ease:        cubic-bezier(0.4, 0, 0.2, 1);
  --vk-ease-out:    cubic-bezier(0.16, 1, 0.3, 1);
  --vk-ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
  --vk-transition-fast: 130ms var(--vk-ease);
  --vk-transition-base: 220ms var(--vk-ease);
  --vk-transition-slow: 360ms var(--vk-ease-out);
  --vk-duration-fast: 130ms;
  --vk-duration-base: 220ms;
  --vk-duration-slow: 360ms;

  /* Layout */
  --vk-breakpoint-xs: 480px;
  --vk-breakpoint-sm: 640px;
  --vk-breakpoint-md: 768px;
  --vk-breakpoint-lg: 1024px;
  --vk-breakpoint-xl: 1280px;
  --vk-breakpoint-sidebar: 880px;

  --vk-container-max-sm: var(--vk-breakpoint-sm);
  --vk-container-max-md: var(--vk-breakpoint-md);
  --vk-container-max-lg: var(--vk-breakpoint-lg);
  --vk-container-max-xl: var(--vk-breakpoint-xl);
}

/* ---------------------------------------------------------------------- *
 * Dark theme — explicit opt-in (setTheme('dark') -> [data-vk-theme])
 * ---------------------------------------------------------------------- */
[data-vk-theme="dark"] {
  color-scheme: dark;

  --vk-color-primary:        #7b7bf0;
  --vk-color-primary-hover:  #8c8cf4;
  --vk-color-primary-active: #9d9df7;
  --vk-color-primary-light:  #24244a;
  --vk-color-primary-subtle: #1a1a33;
  --vk-color-on-primary:     #ffffff;
  --vk-color-accent:         #a78bfa;
  --vk-gradient-brand-end: var(--vk-color-accent);
  --vk-gradient-display: linear-gradient(120deg, var(--vk-color-primary), var(--vk-color-accent));
  --vk-gradient-display-vertical: linear-gradient(180deg, var(--vk-color-primary), var(--vk-color-accent));
  --vk-gradient-display-diagonal: linear-gradient(135deg, var(--vk-color-primary), var(--vk-color-accent));

  --vk-color-surface:        #14181f;
  --vk-color-surface-alt:    #1a1f29;
  --vk-color-surface-sunken: #0e1117;
  --vk-color-surface-hover:  #222834;
  --vk-color-text:           #f1f4f9;
  --vk-color-text-secondary: #aab4c5;
  --vk-color-text-muted:     #6b7688;
  --vk-color-border:         #2a313e;
  --vk-color-border-strong:  #3a4250;

  --vk-color-success:        #3dd68c;
  --vk-color-success-light:  #0c2b1e;
  --vk-color-success-text:   #4ade80;
  --vk-color-warning:        #f0a830;
  --vk-color-warning-light:  #2e2410;
  --vk-color-warning-text:   #fbbf45;
  --vk-color-danger:         #f2555a;
  --vk-color-danger-hover:   #f4696e;
  --vk-color-danger-light:   #2e1416;
  --vk-color-danger-text:    #ff7b80;
  --vk-color-info:           #3bb6ed;
  --vk-color-info-light:     #0c2733;
  --vk-color-info-text:      #5ac8f5;

  --vk-color-overlay:        rgba(2, 6, 16, 0.6);

  --vk-shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.35);
  --vk-shadow-sm:
    0 1px 2px rgba(0, 0, 0, 0.4),
    0 1px 3px rgba(0, 0, 0, 0.5);
  --vk-shadow-md:
    0 2px 4px -1px rgba(0, 0, 0, 0.4),
    0 4px 12px -2px rgba(0, 0, 0, 0.5);
  --vk-shadow-lg:
    0 4px 8px -2px rgba(0, 0, 0, 0.45),
    0 12px 28px -6px rgba(0, 0, 0, 0.6);
  --vk-shadow-xl:
    0 8px 16px -4px rgba(0, 0, 0, 0.5),
    0 24px 48px -12px rgba(0, 0, 0, 0.7);
  --vk-shadow-inner: inset 0 1px 2px rgba(0, 0, 0, 0.3);
}

/* System preference (unless the user has forced light) */
@media (prefers-color-scheme: dark) {
  :root:not([data-vk-theme="light"]) {
    color-scheme: dark;

    --vk-color-primary:        #7b7bf0;
    --vk-color-primary-hover:  #8c8cf4;
    --vk-color-primary-active: #9d9df7;
    --vk-color-primary-light:  #24244a;
    --vk-color-primary-subtle: #1a1a33;
    --vk-color-on-primary:     #ffffff;
    --vk-color-accent:         #a78bfa;
    --vk-gradient-brand-end: var(--vk-color-accent);
    --vk-gradient-display: linear-gradient(120deg, var(--vk-color-primary), var(--vk-color-accent));
    --vk-gradient-display-vertical: linear-gradient(180deg, var(--vk-color-primary), var(--vk-color-accent));
    --vk-gradient-display-diagonal: linear-gradient(135deg, var(--vk-color-primary), var(--vk-color-accent));

    --vk-color-surface:        #14181f;
    --vk-color-surface-alt:    #1a1f29;
    --vk-color-surface-sunken: #0e1117;
    --vk-color-surface-hover:  #222834;
    --vk-color-text:           #f1f4f9;
    --vk-color-text-secondary: #aab4c5;
    --vk-color-text-muted:     #6b7688;
    --vk-color-border:         #2a313e;
    --vk-color-border-strong:  #3a4250;

    --vk-color-success:        #3dd68c;
    --vk-color-success-light:  #0c2b1e;
    --vk-color-success-text:   #4ade80;
    --vk-color-warning:        #f0a830;
    --vk-color-warning-light:  #2e2410;
    --vk-color-warning-text:   #fbbf45;
    --vk-color-danger:         #f2555a;
    --vk-color-danger-hover:   #f4696e;
    --vk-color-danger-light:   #2e1416;
    --vk-color-danger-text:    #ff7b80;
    --vk-color-info:           #3bb6ed;
    --vk-color-info-light:     #0c2733;
    --vk-color-info-text:      #5ac8f5;

    --vk-color-overlay:        rgba(2, 6, 16, 0.6);

    --vk-shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.35);
    --vk-shadow-sm:
      0 1px 2px rgba(0, 0, 0, 0.4),
      0 1px 3px rgba(0, 0, 0, 0.5);
    --vk-shadow-md:
      0 2px 4px -1px rgba(0, 0, 0, 0.4),
      0 4px 12px -2px rgba(0, 0, 0, 0.5);
    --vk-shadow-lg:
      0 4px 8px -2px rgba(0, 0, 0, 0.45),
      0 12px 28px -6px rgba(0, 0, 0, 0.6);
    --vk-shadow-xl:
      0 8px 16px -4px rgba(0, 0, 0, 0.5),
      0 24px 48px -12px rgba(0, 0, 0, 0.7);
    --vk-shadow-inner: inset 0 1px 2px rgba(0, 0, 0, 0.3);
  }
}

@media (prefers-reduced-motion: reduce) {
  :root {
    --vk-transition-fast: 0ms;
    --vk-transition-base: 0ms;
    --vk-transition-slow: 0ms;
    --vk-duration-fast: 0ms;
    --vk-duration-base: 0ms;
    --vk-duration-slow: 0ms;
  }
}

/* ====================================================================== *
 * Site chrome (internal — demo / docs / editor)
 *
 * Reserve header height before the custom element upgrades so the layout
 * never collapses to zero and jumps when the shadow bar paints. Paired with
 * `view-transition-name` on `<vk-site-header>` for stable MPA navigation.
 * ====================================================================== */

vk-site-header:not(:defined) {
  display: block;
  min-height: 3.25rem;
}

/* ====================================================================== *
 * Anti-FOUC cloak (tiered)
 *
 * Content-bearing components stay readable when undefined (no JS yet) —
 * slotted text inherits design tokens from :root. Interactive controls and
 * overlays stay hidden until upgraded so broken UI never flashes.
 *
 * Authors may set `class="no-js"` on `<html>` server-side (or use the
 * `<noscript>` override in getting-started) for the same content-visible
 * tier without relying on `:not(:defined)`.
 *
 * `:where()` keeps specificity at 0 so your own styles win once defined.
 * ====================================================================== */

/* --- Tier 1: content-visible (undefined + html.no-js) ----------------- */
:where(
  vk-container, vk-row, vk-col, vk-stack, vk-divider, vk-scroll-strip,
  vk-page-header, vk-split, vk-toolbar, vk-filter-bar, vk-divider-grid, vk-divider-stack, vk-inset-cell, vk-dashboard, vk-dashboard-tile,
  vk-text, vk-heading, vk-code, vk-blockquote, vk-source-code,
  vk-markdown, vk-citation, vk-link, vk-highlight, vk-diff,
  vk-card, vk-list, vk-stat, vk-timeline, vk-empty, vk-description-list,
  vk-json, vk-comparison, vk-pinboard, vk-metric-row, vk-metric-grid, vk-metric-cell, vk-metric-stack, vk-metric-capacity, vk-panel,
  vk-alert, vk-badge, vk-callout, vk-tag, vk-log, vk-meter, vk-progress,
  vk-chat-bubble, vk-chat-history
):not(:defined),
html.no-js :where(
  vk-container, vk-row, vk-col, vk-stack, vk-divider, vk-scroll-strip,
  vk-page-header, vk-split, vk-toolbar, vk-filter-bar, vk-divider-grid, vk-divider-stack, vk-inset-cell, vk-dashboard, vk-dashboard-tile,
  vk-text, vk-heading, vk-code, vk-blockquote, vk-source-code,
  vk-markdown, vk-citation, vk-link, vk-highlight, vk-diff,
  vk-card, vk-list, vk-stat, vk-timeline, vk-empty, vk-description-list,
  vk-json, vk-comparison, vk-pinboard, vk-metric-row, vk-metric-grid, vk-metric-cell, vk-metric-stack, vk-metric-capacity, vk-panel,
  vk-alert, vk-badge, vk-callout, vk-tag, vk-log, vk-meter, vk-progress,
  vk-chat-bubble, vk-chat-history
) {
  visibility: visible;
  color: var(--vk-color-text);
  font-family: var(--vk-font-family);
  font-size: var(--vk-font-size-base);
  line-height: var(--vk-line-height);
}

/* Readable fallbacks for common content tags (undefined / no-js only) */
:where(vk-text, vk-heading, vk-code, vk-blockquote, vk-link, vk-citation):not(:defined),
html.no-js :where(vk-text, vk-heading, vk-code, vk-blockquote, vk-link, vk-citation) {
  display: block;
}

:where(vk-heading):not(:defined),
html.no-js vk-heading {
  font-family: var(--vk-font-display);
  font-weight: var(--vk-font-weight-bold);
  line-height: var(--vk-line-height-tight);
  letter-spacing: var(--vk-tracking-tight);
  margin: 0 0 var(--vk-spacing-sm);
}
:where(vk-heading[level="1"]):not(:defined), html.no-js vk-heading[level="1"] { font-size: var(--vk-font-size-4xl); }
:where(vk-heading[level="2"]):not(:defined), html.no-js vk-heading[level="2"] { font-size: var(--vk-font-size-3xl); }
:where(vk-heading[level="3"]):not(:defined), html.no-js vk-heading[level="3"] { font-size: var(--vk-font-size-2xl); }
:where(vk-heading[level="4"]):not(:defined), html.no-js vk-heading[level="4"] { font-size: var(--vk-font-size-xl); }
:where(vk-heading[level="5"]):not(:defined), html.no-js vk-heading[level="5"] { font-size: var(--vk-font-size-lg); }
:where(vk-heading[level="6"]):not(:defined), html.no-js vk-heading[level="6"] {
  font-size: var(--vk-font-size-base);
  text-transform: uppercase;
  letter-spacing: var(--vk-tracking-wide);
}
:where(vk-heading:not([level])):not(:defined), html.no-js vk-heading:not([level]) { font-size: var(--vk-font-size-3xl); }

:where(vk-text):not(:defined), html.no-js vk-text { margin-bottom: var(--vk-spacing-md); }
:where(vk-text[color="secondary"], vk-text[color="muted"]):not(:defined),
html.no-js vk-text[color="secondary"], html.no-js vk-text[color="muted"] {
  color: var(--vk-color-text-secondary);
}
:where(vk-link):not(:defined), html.no-js vk-link {
  display: inline;
  color: var(--vk-color-primary);
  text-decoration: underline;
  text-underline-offset: 0.15em;
}

:where(vk-code):not(:defined), html.no-js vk-code {
  display: inline;
  font-family: var(--vk-font-mono);
  font-size: 0.92em;
  padding: 0.12em 0.35em;
  border-radius: var(--vk-radius-sm);
  background: var(--vk-color-surface-sunken);
  border: 1px solid var(--vk-color-border);
}

:where(vk-blockquote):not(:defined), html.no-js vk-blockquote {
  margin: 0 0 var(--vk-spacing-md);
  padding: var(--vk-spacing-sm) var(--vk-spacing-md);
  border-left: 3px solid var(--vk-color-primary);
  color: var(--vk-color-text-secondary);
}

:where(vk-card):not(:defined), html.no-js vk-card {
  display: block;
  padding: var(--vk-spacing-lg);
  background: var(--vk-color-surface);
  border: 1px solid var(--vk-color-border);
  border-radius: var(--vk-radius-lg);
  box-shadow: var(--vk-shadow-xs);
  color: var(--vk-color-text-secondary);
}

:where(vk-alert):not(:defined), html.no-js vk-alert {
  display: block;
  padding: 0.875rem 1rem;
  border-radius: var(--vk-radius-md);
  font-size: var(--vk-font-size-sm);
  background: var(--vk-color-info-light);
  color: var(--vk-color-info-text);
  border: 1px solid color-mix(in srgb, var(--vk-color-info) 30%, transparent);
}
:where(vk-alert[variant="success"]):not(:defined), html.no-js vk-alert[variant="success"] {
  background: var(--vk-color-success-light);
  color: var(--vk-color-success-text);
  border-color: color-mix(in srgb, var(--vk-color-success) 30%, transparent);
}
:where(vk-alert[variant="warning"]):not(:defined), html.no-js vk-alert[variant="warning"] {
  background: var(--vk-color-warning-light);
  color: var(--vk-color-warning-text);
  border-color: color-mix(in srgb, var(--vk-color-warning) 30%, transparent);
}
:where(vk-alert[variant="danger"]):not(:defined), html.no-js vk-alert[variant="danger"] {
  background: var(--vk-color-danger-light);
  color: var(--vk-color-danger-text);
  border-color: color-mix(in srgb, var(--vk-color-danger) 30%, transparent);
}

:where(vk-badge, vk-tag):not(:defined), html.no-js vk-badge, html.no-js vk-tag {
  display: inline;
  font-size: var(--vk-font-size-xs);
  font-weight: var(--vk-font-weight-medium);
  padding: 0.32em 0.6em;
  border-radius: var(--vk-radius-full);
  background: var(--vk-color-primary-light);
  color: var(--vk-color-primary);
}

:where(vk-container):not(:defined), html.no-js vk-container {
  display: block;
  width: 100%;
  max-width: var(--vk-container-max-lg, var(--vk-breakpoint-lg));
  margin-inline: auto;
  padding-inline: var(--vk-spacing-md);
}

:where(vk-row):not(:defined), html.no-js vk-row {
  display: flex;
  flex-wrap: wrap;
  gap: var(--vk-spacing-md);
}
:where(vk-col):not(:defined), html.no-js vk-col {
  display: block;
  flex: 1 1 0;
  min-width: 0;
}
:where(vk-stack):not(:defined), html.no-js vk-stack {
  display: flex;
  flex-direction: column;
  gap: var(--vk-spacing-md);
}
:where(vk-stack[direction="row"]):not(:defined), html.no-js vk-stack[direction="row"] {
  flex-direction: row;
}
:where(vk-divider):not(:defined), html.no-js vk-divider {
  display: block;
  border: none;
  border-top: 1px solid var(--vk-color-border);
  margin: var(--vk-spacing-md) 0;
}

/* --- Tier 2: interactive — hidden until defined ----------------------- */
:where(
  vk-table, vk-accordion, vk-collapse, vk-carousel, vk-kanban, vk-skeleton, vk-tree,
  vk-tabs, vk-navbar, vk-breadcrumb, vk-pagination, vk-sidebar, vk-steps, vk-menu,
  vk-button, vk-toggle-button, vk-input, vk-select, vk-checkbox, vk-radio, vk-switch,
  vk-form, vk-rating, vk-fieldset, vk-item-group,
  vk-textarea, vk-search, vk-combobox, vk-slider, vk-file-input, vk-copy, vk-segmented,
  vk-color-picker,
  vk-icon, vk-image, vk-avatar, vk-system-logo, vk-audio, vk-map, vk-chart, vk-chart-map, vk-mermaid, vk-gauge, vk-sparkline,
  vk-calendar, vk-date-range, vk-heatmap, vk-editable, vk-resize-handle,
  vk-spinner
):not(:defined) {
  display: none !important;
}

/* --- Tier 3: overlays — no space, never reveal slotted content -------- */
:where(
  vk-modal, vk-drawer, vk-drawer-sidebar, vk-popover, vk-dock,
  vk-tooltip, vk-toast, vk-confirm, vk-lightbox, vk-command-palette, vk-form-dialog
):not(:defined) {
  display: none !important;
}

/* ====================================================================== *
 * Static CSS primitives (optional progressive enhancement)
 *
 * Class-based styling that mirrors presentational components — readable
 * without JS. Pair with vk-* tags when modules load, or use classes alone.
 * ====================================================================== */

.vk-text {
  font-family: var(--vk-font-family);
  font-size: var(--vk-font-size-base);
  line-height: var(--vk-line-height);
  color: var(--vk-color-text);
  margin: 0 0 var(--vk-spacing-md);
}
.vk-text--secondary { color: var(--vk-color-text-secondary); }
.vk-text--muted { color: var(--vk-color-text-muted); }
.vk-text--sm { font-size: var(--vk-font-size-sm); }
.vk-text--lg { font-size: var(--vk-font-size-lg); }

.vk-heading {
  font-family: var(--vk-font-display);
  font-weight: var(--vk-font-weight-bold);
  line-height: var(--vk-line-height-tight);
  letter-spacing: var(--vk-tracking-tight);
  color: var(--vk-color-text);
  margin: 0 0 var(--vk-spacing-sm);
}
.vk-heading[data-level="1"], .vk-heading--1 { font-size: var(--vk-font-size-4xl); }
.vk-heading[data-level="2"], .vk-heading--2 { font-size: var(--vk-font-size-3xl); }
.vk-heading[data-level="3"], .vk-heading--3 { font-size: var(--vk-font-size-2xl); }
.vk-heading[data-level="4"], .vk-heading--4 { font-size: var(--vk-font-size-xl); }
.vk-heading[data-level="5"], .vk-heading--5 { font-size: var(--vk-font-size-lg); }
.vk-heading[data-level="6"], .vk-heading--6 {
  font-size: var(--vk-font-size-base);
  text-transform: uppercase;
  letter-spacing: var(--vk-tracking-wide);
}

.vk-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.5em;
  padding: 0.5rem 0.95rem;
  border: 1px solid transparent;
  border-radius: var(--vk-radius-md);
  font-family: var(--vk-font-family);
  font-size: var(--vk-font-size-sm);
  font-weight: var(--vk-font-weight-medium);
  line-height: 1.4;
  text-decoration: none;
  cursor: pointer;
  background: var(--vk-color-primary);
  color: var(--vk-color-on-primary);
  box-shadow: var(--vk-shadow-xs);
  transition:
    background var(--vk-transition-fast),
    border-color var(--vk-transition-fast),
    box-shadow var(--vk-transition-fast);
}
.vk-btn:hover { background: var(--vk-color-primary-hover); }
.vk-btn:focus-visible {
  outline: none;
  box-shadow: var(--vk-shadow-focus);
}
.vk-btn--secondary {
  background: var(--vk-color-surface);
  color: var(--vk-color-text);
  border-color: var(--vk-color-border-strong);
}
.vk-btn--secondary:hover { background: var(--vk-color-surface-hover); }
.vk-btn--ghost {
  background: transparent;
  color: var(--vk-color-text);
  border-color: transparent;
  box-shadow: none;
}
.vk-btn--ghost:hover { background: var(--vk-color-surface-hover); }
.vk-btn--danger {
  background: var(--vk-color-danger);
  color: #fff;
  border-color: transparent;
}
.vk-btn--danger:hover { background: var(--vk-color-danger-hover); }
.vk-btn--sm { padding: 0.3rem 0.7rem; font-size: var(--vk-font-size-xs); }
.vk-btn--lg { padding: 0.7rem 1.35rem; font-size: var(--vk-font-size-base); }

.vk-card {
  display: block;
  background: var(--vk-color-surface);
  border: 1px solid var(--vk-color-border);
  border-radius: var(--vk-radius-lg);
  box-shadow: var(--vk-shadow-xs);
  overflow: clip;
}
.vk-card__body {
  padding: var(--vk-spacing-lg);
  color: var(--vk-color-text-secondary);
  font-family: var(--vk-font-family);
  font-size: var(--vk-font-size-base);
  line-height: var(--vk-line-height);
}
.vk-card__header {
  padding: var(--vk-spacing-lg) var(--vk-spacing-lg) var(--vk-spacing-sm);
  font-family: var(--vk-font-display);
  font-weight: var(--vk-font-weight-semibold);
  font-size: var(--vk-font-size-lg);
  color: var(--vk-color-text);
}

.vk-badge {
  display: inline-flex;
  align-items: center;
  font-family: var(--vk-font-family);
  font-size: var(--vk-font-size-xs);
  font-weight: var(--vk-font-weight-medium);
  letter-spacing: var(--vk-tracking-wide);
  line-height: 1;
  padding: 0.32em 0.6em;
  border-radius: var(--vk-radius-full);
  background: var(--vk-color-primary-light);
  color: var(--vk-color-primary);
  white-space: nowrap;
}
.vk-badge--success { background: var(--vk-color-success-light); color: var(--vk-color-success-text); }
.vk-badge--warning { background: var(--vk-color-warning-light); color: var(--vk-color-warning-text); }
.vk-badge--danger { background: var(--vk-color-danger-light); color: var(--vk-color-danger-text); }
.vk-badge--neutral {
  background: var(--vk-color-surface-sunken);
  color: var(--vk-color-text-secondary);
  border: 1px solid var(--vk-color-border);
}

.vk-alert {
  display: flex;
  gap: var(--vk-spacing-sm);
  padding: 0.875rem 1rem;
  border-radius: var(--vk-radius-md);
  font-family: var(--vk-font-family);
  font-size: var(--vk-font-size-sm);
  line-height: 1.55;
  background: var(--vk-color-info-light);
  color: var(--vk-color-info-text);
  border: 1px solid color-mix(in srgb, var(--vk-color-info) 30%, transparent);
  box-shadow: inset 3px 0 0 0 var(--vk-color-info);
}
.vk-alert--success {
  background: var(--vk-color-success-light);
  color: var(--vk-color-success-text);
  border-color: color-mix(in srgb, var(--vk-color-success) 30%, transparent);
  box-shadow: inset 3px 0 0 0 var(--vk-color-success);
}
.vk-alert--warning {
  background: var(--vk-color-warning-light);
  color: var(--vk-color-warning-text);
  border-color: color-mix(in srgb, var(--vk-color-warning) 30%, transparent);
  box-shadow: inset 3px 0 0 0 var(--vk-color-warning);
}
.vk-alert--danger {
  background: var(--vk-color-danger-light);
  color: var(--vk-color-danger-text);
  border-color: color-mix(in srgb, var(--vk-color-danger) 30%, transparent);
  box-shadow: inset 3px 0 0 0 var(--vk-color-danger);
}

.vk-stack {
  display: flex;
  flex-direction: column;
  gap: var(--vk-spacing-md);
}
.vk-stack--row { flex-direction: row; flex-wrap: wrap; }
.vk-stack--sm { gap: var(--vk-spacing-sm); }
.vk-stack--lg { gap: var(--vk-spacing-lg); }

.vk-row {
  display: flex;
  flex-wrap: wrap;
  gap: var(--vk-spacing-md);
  width: 100%;
}
.vk-col {
  flex: 1 1 0;
  min-width: 0;
}

/* ====================================================================== *
 * Page transitions (anti-blink)
 *
 * Custom elements upgrade only after the page's module runs, so a naive load
 * paints the raw layout first and components pop in a frame later — a visible
 * blink, worst for buttons against a dark surface. The fix is two-fold and
 * needs no JS cloak:
 *
 *   1. Pages that need blink-free chrome render-block only the shared header
 *      (`<script type="module" src=".../vk-site-chrome.js" blocking="render">`,
 *      before any catalog import). `<vk-site-header>` uses
 *      `view-transition-name: vk-site-header` so MPA navigation keeps the bar
 *      stable while the page body cross-fades.
 *
 *   2. `@view-transition` opts every same-origin navigation into a native
 *      cross-document View Transition (a smooth cross-fade by default) in
 *      supporting browsers. Browsers without support simply fall back to the
 *      paint-holding behavior from step 1 — still blink-free.
 * ====================================================================== */
@view-transition {
  navigation: auto;
}

@media (prefers-reduced-motion: reduce) {
  ::view-transition-group(*),
  ::view-transition-old(*),
  ::view-transition-new(*) {
    animation: none !important;
  }
}

/* While the page first renders, `core/vk-theme-boot.js` adds `.vk-preload` so
 * nothing animates as the theme settles (a transition firing on the first
 * frame reads as a blink). Zeroing the motion tokens reaches into component
 * shadow DOM (they all transition via these tokens); the universal rule covers
 * light-DOM transitions/animations. The class is removed after the first
 * painted frame. */
html.vk-preload {
  --vk-transition-fast: 0ms;
  --vk-transition-base: 0ms;
  --vk-transition-slow: 0ms;
  --vk-duration-fast: 0ms;
  --vk-duration-base: 0ms;
  --vk-duration-slow: 0ms;
}

html.vk-preload *,
html.vk-preload *::before,
html.vk-preload *::after {
  transition-duration: 0s !important;
  animation-duration: 0s !important;
  animation-delay: 0s !important;
}

/* vk-dock push layout — applied to push-target (html or custom selector) */
html.vk-dock-push,
body.vk-dock-push,
.vk-dock-push {
  transition:
    margin-right var(--vk-duration-base) var(--vk-ease),
    margin-left var(--vk-duration-base) var(--vk-ease);
}

html.vk-dock-push[data-vk-dock-placement="right"],
body.vk-dock-push[data-vk-dock-placement="right"],
.vk-dock-push[data-vk-dock-placement="right"] {
  margin-right: var(--vk-dock-width, 400px);
}

html.vk-dock-push[data-vk-dock-placement="left"],
body.vk-dock-push[data-vk-dock-placement="left"],
.vk-dock-push[data-vk-dock-placement="left"] {
  margin-left: var(--vk-dock-width, 400px);
}
