export declare const ROXY_UI_TOKENS_CSS = "/**\n * Roxy UI design tokens. 47 CSS custom properties that every component reads. Light + dark defaults. Host page overrides at :root or per element. No Tailwind, no class-name overrides, no JS theme switcher.\n *\n * Delivery model: this file ships as a global light-DOM stylesheet (linked, or auto-injected by the CDN bundle). Why every rule sits in a cascade layer is the note above the layer statement below. Custom properties inherit through the shadow boundary, so tokens set on a light-DOM ancestor reach every component shadow. The explicit theme blocks therefore target light-DOM selectors (:root, .dark, [data-theme=\"dark\"], a wrapper element), NOT :host (a :host rule in a global sheet matches nothing). The :host([data-theme]) selectors are kept only for the case where this CSS is ever adopted directly into a shadow root; they are inert in global delivery.\n *\n * Light is the default. Dark applies under any of:\n * - prefers-color-scheme: dark\n * - [data-theme=\"dark\"] on the element itself or any ancestor (typically :root)\n * - .dark class on the element itself or any ancestor (typically :root)\n *\n * Explicit choice wins over the OS: the [data-theme] / .dark blocks come after the @media (prefers-color-scheme: dark) block in source order, and a closer ancestor overrides a farther one through normal custom-property inheritance.\n *\n * Motion gating:\n * - --roxy-motion-duration defaults to 200ms. Set to 0ms to disable.\n * - prefers-reduced-motion: reduce forces 0ms regardless of host overrides.\n */\n\n/*\n * Two mechanisms keep the host page in charge of every token, and both are load bearing.\n *\n * The rules below sit in the `roxy.tokens` cascade layer, and an unlayered declaration beats a\n * layered one at ANY specificity. So a plain `:root { --roxy-accent: #8b5cf6 }` on the host page\n * wins, and so does the same line written inside a layer of its own, because the layer\n * statement above registers ours first and the CDN bundle injects this sheet at the top of\n *
. A host that links this file after its own CSS orders the layers itself:\n * `@layer roxy, base, components, utilities;` before either sheet.\n *\n * Every selector is ALSO wrapped in :where(), which has ZERO specificity, so a host declaration\n * still wins wherever a layer cannot decide it. Without that, `:root.dark` and\n * `[data-theme=\"dark\"]` would carry class and attribute specificity (0,1,1) and outrank a plain\n * `:root` (0,1,0), and one brand override would hold under prefers-color-scheme and revert\n * under the other two dark signals: one line, three different results.\n *\n * Source order still decides among the rules in THIS file, which is what lets the explicit dark\n * block beat the light defaults when both match.\n */\n\n/* Layer order, named here so it is fixed wherever the two files load: the theme presets in\n * styles/themes/*.css reassign tokens and must win over these defaults. Both files declare it,\n * so either one loading alone still orders the pair. */\n@layer roxy.tokens, roxy.theme;\n\n@layer roxy.tokens {\n\t:where(:root, :host) {\n\t\t/* Native controls follow the theme, and this is the ONLY thing that makes them.\n\t\t *\n\t\t * `color-scheme` is a real property, not the `prefers-color-scheme` query above it, and\n\t\t * without it the browser paints every native control in its LIGHT appearance whatever our\n\t\t * tokens say. A looks fine closed, because we colour it ourselves, and then opens a\n\t\t * light popup whose rows inherit our near-white --roxy-fg: white text on white. The\n\t\t * same omission dims a date or time picker's calendar, the number spinner, the autofill\n\t\t * highlight and the scrollbar.\n\t\t *\n\t\t * It belongs HERE and not on the controls, because a per-control fix is one rule per input\n\t\t * type per component, forever, and it still cannot reach the popup: that is rendered by the\n\t\t * OS outside the DOM, so no selector we write applies to it. Declared once per theme trigger,\n\t\t * beside the tokens, it covers every control in every component and on the host page.\n\t\t * `color-scheme` is inherited, and these selectors match :host, so each shadow root gets it. */\n\t\tcolor-scheme: light;\n\n\t\t/* Color: brand */\n\t\t--roxy-primary: #0f172a;\n\t\t--roxy-secondary: #475569;\n\t\t--roxy-accent: #f59e0b;\n\t\t/* Text-safe accent variant, DERIVED from --roxy-accent so overriding the accent\n\t\t * alone rebrands the whole library. Never hardcode a colour here: a consumer\n\t\t * following the theming recipe sets only --roxy-accent, and a fixed value leaves\n\t\t * the active tab label, the conjunction aspect lines and the focus ring on the\n\t\t * old hue, giving a two-tone palette from a one-line override.\n\t\t *\n\t\t * The raw accent is too light for text (amber-500 is 2.14:1 on white, far under\n\t\t * WCAG AA). Mixing 70% of it into black is measured, not guessed: rasterised to\n\t\t * real pixels, the darkest of the twelve shipped domain accents still lands at\n\t\t * 5.24:1 on white, above AA. At 75% amber falls to 4.46 and fails, so 70 is a\n\t\t * ceiling, not a round number.\n\t\t *\n\t\t * Fills (planet glyphs, chart accents, non-text badges) keep --roxy-accent. */\n\t\t--roxy-accent-ink: color-mix(in oklab, var(--roxy-accent) 70%, black);\n\n\t\t/* Color: status. The base value (success, warning, danger, info) is for\n\t\t * fills and tints. The -fg partner is the INK for a tint of that base, and it\n\t\t * is DERIVED from it exactly as --roxy-accent-ink is derived from the accent,\n\t\t * so re-pointing a status colour carries its text with it instead of leaving\n\t\t * the old hue on every rule that reads the ink.\n\t\t *\n\t\t * 70 percent toward black is the ratio the accent already uses, and it is\n\t\t * measured rather than chosen: rasterised to real pixels the four shipped\n\t\t * pairs land between 7.4 and 9.8 to 1 on the card and between 6.5 and 8.1 on\n\t\t * a 12 percent tint of their own base, every one of them above WCAG AA and at\n\t\t * or above the fixed hexes they replace. Use -fg whenever status color hits\n\t\t * text. */\n\t\t--roxy-success: #16a34a;\n\t\t--roxy-success-fg: color-mix(in oklab, var(--roxy-success) 70%, black);\n\t\t--roxy-warning: #ea580c;\n\t\t--roxy-warning-fg: color-mix(in oklab, var(--roxy-warning) 70%, black);\n\t\t--roxy-danger: #dc2626;\n\t\t--roxy-danger-fg: color-mix(in oklab, var(--roxy-danger) 70%, black);\n\t\t--roxy-info: #0284c7;\n\t\t--roxy-info-fg: color-mix(in oklab, var(--roxy-info) 70%, black);\n\n\t\t/* Color: surface */\n\t\t--roxy-bg: #ffffff;\n\t\t--roxy-surface: #ffffff;\n\t\t--roxy-fg: #0a0a0a;\n\t\t--roxy-muted: #71717a;\n\t\t--roxy-border: #e4e4e7;\n\t\t--roxy-ring: color-mix(in srgb, var(--roxy-accent) 40%, transparent);\n\n\t\t/* Typography */\n\t\t--roxy-font-sans:\n\t\t\t\"Geist\", system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto,\n\t\t\tsans-serif;\n\t\t--roxy-font-mono:\n\t\t\t\"Geist Mono\", ui-monospace, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\",\n\t\t\tmonospace;\n\t\t/* Heading/display font. Defaults to the sans stack so nothing changes for an\n\t\t * existing consumer; a preset (the practitioner theme ships a serif) overrides\n\t\t * it to restyle every result heading and the self-fetch form title in one token.\n\t\t * Fonts do not vary by theme, so it is declared once here and inherited by the\n\t\t * dark/light blocks unchanged. */\n\t\t--roxy-font-display: var(--roxy-font-sans);\n\n\t\t--roxy-text-xs: 0.75rem;\n\t\t--roxy-text-sm: 0.875rem;\n\t\t--roxy-text-base: 1rem;\n\t\t--roxy-text-lg: 1.125rem;\n\t\t--roxy-text-xl: 1.5rem;\n\n\t\t--roxy-weight-normal: 400;\n\t\t--roxy-weight-bold: 600;\n\n\t\t--roxy-leading-tight: 1.2;\n\t\t--roxy-leading-normal: 1.5;\n\n\t\t--roxy-tracking-tight: -0.02em;\n\t\t--roxy-tracking-normal: 0em;\n\n\t\t/* Spacing */\n\t\t--roxy-space-xs: 0.25rem;\n\t\t--roxy-space-sm: 0.5rem;\n\t\t--roxy-space-md: 1rem;\n\t\t--roxy-space-lg: 1.5rem;\n\t\t--roxy-space-xl: 2.5rem;\n\n\t\t/* Radius */\n\t\t--roxy-radius-sm: 4px;\n\t\t--roxy-radius-md: 8px;\n\t\t--roxy-radius-lg: 12px;\n\t\t--roxy-radius-full: 9999px;\n\n\t\t/* Shadow */\n\t\t--roxy-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.06);\n\t\t--roxy-shadow-md:\n\t\t\t0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -2px rgba(0, 0, 0, 0.06);\n\t\t--roxy-shadow-lg: 0 12px 24px -8px rgba(0, 0, 0, 0.14);\n\n\t\t/* Motion */\n\t\t--roxy-motion-duration: 200ms;\n\t\t--roxy-motion-easing: cubic-bezier(0.4, 0, 0.2, 1);\n\n\t\t/* Heat scale: a single base hue. Consumers mix it with `transparent` at\n\t\t * increasing percentages to paint cooler-to-hotter tiers. The mix-with-\n\t\t * transparent approach lets the page bg show through and keeps text\n\t\t * colour stable (always --roxy-fg), so the cells read in both themes\n\t\t * without per-tier text colours. */\n\t\t--roxy-heat: var(--roxy-danger, #ef4444);\n\t}\n\n\t/* Dark theme via system preference */\n\t@media (prefers-color-scheme: dark) {\n\t\t:where(:root, :host) {\n\t\t\tcolor-scheme: dark;\n\t\t\t--roxy-primary: #f8fafc;\n\t\t\t--roxy-secondary: #94a3b8;\n\t\t\t--roxy-accent: #fbbf24;\n\t\t\t--roxy-accent-ink: var(--roxy-accent);\n\n\t\t\t/* The dark blocks mix toward WHITE, and BOTH dark triggers carry the line.\n\t\t\t * Without it a visitor on system dark with no data-theme attribute inherits\n\t\t\t * the light derivation, which lands a dark green on a near-black surface and\n\t\t\t * fails WCAG AA. */\n\t\t\t--roxy-success: #22c55e;\n\t\t\t--roxy-success-fg: color-mix(in oklab, var(--roxy-success) 70%, white);\n\t\t\t--roxy-warning: #fb923c;\n\t\t\t--roxy-warning-fg: color-mix(in oklab, var(--roxy-warning) 70%, white);\n\t\t\t--roxy-danger: #ef4444;\n\t\t\t--roxy-danger-fg: color-mix(in oklab, var(--roxy-danger) 70%, white);\n\t\t\t--roxy-info: #38bdf8;\n\t\t\t--roxy-info-fg: color-mix(in oklab, var(--roxy-info) 70%, white);\n\n\t\t\t--roxy-bg: #0a0a0a;\n\t\t\t--roxy-surface: #18181b;\n\t\t\t--roxy-fg: #fafafa;\n\t\t\t--roxy-muted: #a1a1aa;\n\t\t\t--roxy-border: #27272a;\n\t\t\t--roxy-ring: color-mix(in srgb, var(--roxy-accent) 45%, transparent);\n\n\t\t\t--roxy-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.5);\n\t\t\t--roxy-shadow-md:\n\t\t\t\t0 4px 6px -1px rgba(0, 0, 0, 0.6), 0 2px 4px -2px rgba(0, 0, 0, 0.5);\n\t\t\t--roxy-shadow-lg: 0 12px 24px -8px rgba(0, 0, 0, 0.7);\n\n\t\t\t--roxy-heat: var(--roxy-danger, #ef4444);\n\t\t}\n\t}\n\n\t/* Light theme override. Beats the @media (prefers-color-scheme: dark) block\n\t * when the host explicitly opts back into light. Without this, a dark-mode OS\n\t * pins the tokens to dark even after data-theme=\"light\" is set. The light-DOM\n\t * selectors (:root.light, .light, [data-theme=\"light\"]) set the vars on the\n\t * ancestor or the element itself so they inherit into every component shadow;\n\t * :host([data-theme=\"light\"]) is inert in global delivery and kept only for\n\t * shadow-adopted use. */\n\t:where(\n\t\t:root[data-theme=\"light\"],\n\t\t[data-theme=\"light\"],\n\t\t:root.light,\n\t\t.light,\n\t\t:host([data-theme=\"light\"])\n\t) {\n\t\tcolor-scheme: light;\n\t\t--roxy-primary: #0f172a;\n\t\t--roxy-secondary: #475569;\n\t\t--roxy-accent: #f59e0b;\n\t\t--roxy-accent-ink: color-mix(in oklab, var(--roxy-accent) 70%, black);\n\n\t\t--roxy-success: #16a34a;\n\t\t--roxy-success-fg: color-mix(in oklab, var(--roxy-success) 70%, black);\n\t\t--roxy-warning: #ea580c;\n\t\t--roxy-warning-fg: color-mix(in oklab, var(--roxy-warning) 70%, black);\n\t\t--roxy-danger: #dc2626;\n\t\t--roxy-danger-fg: color-mix(in oklab, var(--roxy-danger) 70%, black);\n\t\t--roxy-info: #0284c7;\n\t\t--roxy-info-fg: color-mix(in oklab, var(--roxy-info) 70%, black);\n\n\t\t--roxy-bg: #ffffff;\n\t\t--roxy-surface: #ffffff;\n\t\t--roxy-fg: #0a0a0a;\n\t\t--roxy-muted: #71717a;\n\t\t--roxy-border: #e4e4e7;\n\t\t--roxy-ring: color-mix(in srgb, var(--roxy-accent) 40%, transparent);\n\n\t\t--roxy-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.06);\n\t\t--roxy-shadow-md:\n\t\t\t0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -2px rgba(0, 0, 0, 0.06);\n\t\t--roxy-shadow-lg: 0 12px 24px -8px rgba(0, 0, 0, 0.14);\n\t}\n\n\t/* Dark theme via explicit opt-in. The light-DOM selectors (:root.dark, .dark,\n\t * [data-theme=\"dark\"]) set the vars on the ancestor or the element itself so\n\t * they inherit into every component shadow; this is what makes a .dark class on\n\t * any ancestor (Tailwind, shadcn) actually theme the components in global\n\t * delivery. :host([data-theme=\"dark\"]) is inert in global delivery and kept\n\t * only for shadow-adopted use. */\n\t:where(\n\t\t:root[data-theme=\"dark\"],\n\t\t[data-theme=\"dark\"],\n\t\t:root.dark,\n\t\t.dark,\n\t\t:host([data-theme=\"dark\"])\n\t) {\n\t\tcolor-scheme: dark;\n\t\t--roxy-primary: #f8fafc;\n\t\t--roxy-secondary: #94a3b8;\n\t\t--roxy-accent: #fbbf24;\n\t\t--roxy-accent-ink: var(--roxy-accent);\n\n\t\t--roxy-success: #22c55e;\n\t\t--roxy-success-fg: color-mix(in oklab, var(--roxy-success) 70%, white);\n\t\t--roxy-warning: #fb923c;\n\t\t--roxy-warning-fg: color-mix(in oklab, var(--roxy-warning) 70%, white);\n\t\t--roxy-danger: #ef4444;\n\t\t--roxy-danger-fg: color-mix(in oklab, var(--roxy-danger) 70%, white);\n\t\t--roxy-info: #38bdf8;\n\t\t--roxy-info-fg: color-mix(in oklab, var(--roxy-info) 70%, white);\n\n\t\t--roxy-bg: #0a0a0a;\n\t\t--roxy-surface: #18181b;\n\t\t--roxy-fg: #fafafa;\n\t\t--roxy-muted: #a1a1aa;\n\t\t--roxy-border: #27272a;\n\t\t--roxy-ring: color-mix(in srgb, var(--roxy-accent) 45%, transparent);\n\n\t\t--roxy-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.5);\n\t\t--roxy-shadow-md:\n\t\t\t0 4px 6px -1px rgba(0, 0, 0, 0.6), 0 2px 4px -2px rgba(0, 0, 0, 0.5);\n\t\t--roxy-shadow-lg: 0 12px 24px -8px rgba(0, 0, 0, 0.7);\n\n\t\t--roxy-heat: var(--roxy-danger, #ef4444);\n\t}\n\n\t/* Reduced motion override */\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:where(:root, :host) {\n\t\t\t--roxy-motion-duration: 0ms;\n\t\t}\n\t}\n}\n";
//# sourceMappingURL=tokens-css.d.ts.map