@uni-design-system/uni-core 7.2.0 → 7.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../src/concepts/animation/keyframes.constants.ts","../../src/concepts/color/color.records.ts","../../src/concepts/color/color.utils.ts","../../src/concepts/color/color.helper.ts","../../src/concepts/generation/oklch.helper.ts","../../src/concepts/generation/palette.factory.ts","../../src/concepts/color/color.factory.ts","../../src/concepts/elevation/zIndex.ts","../../src/concepts/generation/dtcg.emitter.ts","../../src/concepts/generation/shadow.generator.ts","../../src/concepts/iconography/icon.records.ts","../../src/concepts/theme/themes/base.theme.ts","../../src/concepts/generation/theme.generator.ts","../../src/concepts/generation/theme-file.emitter.ts","../../src/concepts/gradient/gradient.helper.ts","../../src/concepts/iconography/icon.helper.ts","../../src/concepts/layout/layout.helper.ts","../../src/concepts/shadow/shadow.utils.ts","../../src/concepts/shadow/shadow.records.ts","../../src/concepts/style/inputs.constants.ts","../../src/concepts/theme/themes/dark.theme.ts","../../src/concepts/theme/themes/light.theme.ts","../../src/concepts/theme/theme.records.ts","../../src/concepts/typography/typography.records.ts","../../src/concepts/typography/typeface.helpers.ts","../../src/utils/getValue.ts","../../src/utils/debounce.ts"],"sourcesContent":["import type { StyleExpression } from '../style/style.types';\n\nexport type PercentageString = `${number}%`;\nexport type KeyframesExpression = Record<PercentageString, StyleExpression>;\n\nexport const fadeIn: KeyframesExpression = {\n '0%': {\n opacity: 0,\n },\n '100%': {\n opacity: 1,\n },\n};\n\nexport const fadeOut: KeyframesExpression = {\n '0%': {\n opacity: 1,\n },\n '100%': {\n opacity: 0,\n },\n};\n\nexport const expandFadeIn = {\n '0%': {\n gridTemplateRows: '0fr',\n opacity: 0,\n },\n '100%': {\n gridTemplateRows: '1fr',\n opacity: 1,\n },\n};\n\nexport const collapseFadeOut = {\n '0%': {\n gridTemplateRows: '1fr',\n opacity: 1,\n },\n '100%': {\n gridTemplateRows: '0fr',\n opacity: 0,\n },\n};\n","import { Range } from './color.model';\nimport { ColorCategory, ColorRole, UtilityColorRole } from './color.types';\n\n/**\n * @deprecated HSL saturation ranges are superseded by the perceptual OKLCH\n * chroma model inside `concepts/generation` (see `generateThemes`). Kept for\n * legacy callers of `uniColor`; removal follows the changeset major process.\n */\nexport const CategorySaturation: Record<ColorCategory, Range> = {\n jewel: { low: 73, high: 83 },\n pastel: { low: 14, high: 21 },\n earth: { low: 36, high: 41 },\n neutral: { low: 1, high: 10 },\n florescent: { low: 63, high: 100 },\n shades: { low: 0, high: 0 },\n};\n\n/**\n * @deprecated HSL lightness ranges are superseded by the perceptual OKLCH\n * tone slots inside `concepts/generation` (see `generateThemes`).\n */\nexport const CategoryLightness: Record<ColorCategory, Range> = {\n jewel: { low: 56, high: 76 },\n pastel: { low: 89, high: 96 },\n earth: { low: 36, high: 77 },\n neutral: { low: 70, high: 99 },\n florescent: { low: 82, high: 100 },\n shades: { low: 0, high: 100 },\n};\n\nexport const RoleHues: Record<ColorRole | UtilityColorRole, Range> = {\n primary: { low: 73, high: 83, default: 0 },\n secondary: { low: 14, high: 21, default: 0 },\n tertiary: { low: 36, high: 41, default: 0 },\n inverse: { low: 63, high: 100, default: 0 },\n ghost: { low: 0, high: 0, default: 0 },\n warn: { low: 320, high: 20, default: 0 }, // red\n alert: { low: 40, high: 70, default: 60 }, // yellow\n success: { low: 90, high: 150, default: 120 }, // green\n info: { low: 200, high: 260, default: 240 }, // blue\n};\n","import { Range } from './color.model';\nimport type { ColorScheme } from './color.types';\n\n/**\n * @deprecated Randomized generation is superseded by the deterministic OKLCH\n * engine in `concepts/generation` — same input, same theme. Seeded \"surprise\n * me\" behavior belongs in the consumer (playground), not the engine.\n */\nexport const randomRangeValue = ({ low, high }: Range): number => {\n low = Math.ceil(low);\n high = Math.floor(high);\n return Math.floor(Math.random() * (high - low + 1)) + low;\n};\n\nexport const cycle = (angle: number): number => {\n if (angle > 360) return angle - 360;\n if (angle < 0) return angle + 360;\n return angle;\n};\n\nexport const getAnalogousHues = (hue: number): number[] => [cycle(hue + 30), cycle(hue + 60)];\nexport const getComplimentaryHue = (hue: number): number => cycle(hue + 180);\nexport const getTriadicHues = (hue: number): number[] => [cycle(hue + 120), cycle(hue - 120)];\nexport const getSplitComplimentaryHues = (hue: number): number[] => [\n cycle(hue + 150),\n cycle(hue - 150),\n];\n\nexport interface RoleHueSet {\n primary: number;\n secondary: number;\n tertiary: number;\n}\n\n/**\n * Derive the primary/secondary/tertiary hues from a seed hue using the color\n * wheel relationships in {@link ColorScheme}. Pure angle math — works in any\n * hue space (HSL historically, OKLCH in the generation engine).\n */\nexport const schemeHues = (hue: number, scheme: ColorScheme): RoleHueSet => {\n switch (scheme) {\n case 'monochromatic':\n return { primary: hue, secondary: hue, tertiary: hue };\n case 'analogous': {\n const [a, b] = getAnalogousHues(hue);\n return { primary: hue, secondary: a, tertiary: b };\n }\n case 'complimentary': {\n const [a] = getAnalogousHues(hue);\n return { primary: hue, secondary: getComplimentaryHue(hue), tertiary: a };\n }\n case 'splitComplimentary': {\n const [a, b] = getSplitComplimentaryHues(hue);\n return { primary: hue, secondary: a, tertiary: b };\n }\n case 'triadic': {\n const [a, b] = getTriadicHues(hue);\n return { primary: hue, secondary: a, tertiary: b };\n }\n }\n};\n","import { HSL, HSLA, RGB, UniColor } from './color.model';\nimport { CategoryLightness, CategorySaturation, RoleHues } from './color.records';\nimport { randomRangeValue } from './color.utils';\n\nexport function HSLAToString({ hue, saturation, lightness, alpha = 1 }: HSLA): string {\n return `hsla(${hue}, ${saturation}%, ${lightness}%, ${alpha})`;\n}\n\nexport function RGBToString({ red, green, blue }: RGB): string {\n return `rgb(${red}, ${green}, ${blue})`;\n}\n\n/**\n * @deprecated Random HSL generation produces non-deterministic, perceptually\n * uneven colors. Use the OKLCH engine (`generateThemes` in\n * `concepts/generation`) or `generatePalette` instead.\n */\nexport function uniColor({ role, category, alpha = 1 }: UniColor): string {\n const hue = randomRangeValue(RoleHues[role]);\n const saturation = randomRangeValue(CategorySaturation[category]);\n const lightness = randomRangeValue(CategoryLightness[category]);\n\n return HSLAToString({ hue, saturation, lightness, alpha });\n}\n\nexport const RGBToHSL = ({ red, green, blue }: RGB): HSL => {\n red /= 255;\n green /= 255;\n blue /= 255;\n const l = Math.max(red, green, blue);\n const s = l - Math.min(red, green, blue);\n const h = s\n ? l === red\n ? (green - blue) / s\n : l === green\n ? 2 + (blue - red) / s\n : 4 + (red - green) / s\n : 0;\n return {\n hue: 60 * h < 0 ? 60 * h + 360 : 60 * h,\n saturation: 100 * (s ? (l <= 0.5 ? s / (2 * l - s) : s / (2 - (2 * l - s))) : 0),\n lightness: (100 * (2 * l - s)) / 2,\n };\n};\n\n// ── Conversions & contrast (used by the palette factory) ────────────────────\n\nconst clamp = (value: number, min: number, max: number): number =>\n Math.min(max, Math.max(min, value));\n\nconst toHex2 = (value: number): string => clamp(Math.round(value), 0, 255).toString(16).padStart(2, '0');\n\nexport const rgbToHex = ({ red, green, blue }: RGB): string =>\n `#${toHex2(red)}${toHex2(green)}${toHex2(blue)}`.toUpperCase();\n\nexport const hexToRgb = (hex: string): RGB => {\n let h = hex.replace('#', '').trim();\n if (h.length === 3) h = h.split('').map((c) => c + c).join('');\n const int = parseInt(h, 16);\n return { red: (int >> 16) & 255, green: (int >> 8) & 255, blue: int & 255 };\n};\n\nexport const HSLToRGB = ({ hue = 0, saturation = 0, lightness = 0 }: HSL): RGB => {\n const s = clamp(saturation, 0, 100) / 100;\n const l = clamp(lightness, 0, 100) / 100;\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const hp = (((hue % 360) + 360) % 360) / 60;\n const x = c * (1 - Math.abs((hp % 2) - 1));\n const [r1, g1, b1] =\n hp < 1\n ? [c, x, 0]\n : hp < 2\n ? [x, c, 0]\n : hp < 3\n ? [0, c, x]\n : hp < 4\n ? [0, x, c]\n : hp < 5\n ? [x, 0, c]\n : [c, 0, x];\n const m = l - c / 2;\n return {\n red: (r1 + m) * 255,\n green: (g1 + m) * 255,\n blue: (b1 + m) * 255,\n };\n};\n\n/** Build an sRGB hex string straight from HSL channel values. */\nexport const HSLToHex = (hsl: HSL): string => rgbToHex(HSLToRGB(hsl));\n\nexport const hexToHSL = (hex: string): HSL => RGBToHSL(hexToRgb(hex));\n\n/** WCAG relative luminance of an sRGB color (0 = black, 1 = white). */\nexport const relativeLuminance = ({ red, green, blue }: RGB): number => {\n const channel = (value: number): number => {\n const v = value / 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n };\n return 0.2126 * channel(red) + 0.7152 * channel(green) + 0.0722 * channel(blue);\n};\n\n/** WCAG contrast ratio between two colors (1:1 – 21:1). Accepts RGB or hex. */\nexport const contrastRatio = (a: RGB | string, b: RGB | string): number => {\n const la = relativeLuminance(typeof a === 'string' ? hexToRgb(a) : a);\n const lb = relativeLuminance(typeof b === 'string' ? hexToRgb(b) : b);\n const [hi, lo] = la > lb ? [la, lb] : [lb, la];\n return (hi + 0.05) / (lo + 0.05);\n};\n\n// Future Methods - https://codepen.io/jkantner/pen/VVEMRK\n","import type { RGB } from '../color/color.model';\nimport { hexToRgb, rgbToHex } from '../color/color.helper';\n\n/**\n * A color in OKLCH: perceptual lightness `l` (0–1), chroma `c` (0 = grey,\n * ~0.37 = max sRGB vividness) and hue angle `h` in degrees (0–360).\n *\n * Unlike HSL lightness, OKLCH `l` is perceptually uniform — a blue and a\n * yellow at the same `l` *look* equally light — which is what makes derived\n * tonal scales consistent across hues.\n */\nexport interface Oklch {\n l: number;\n c: number;\n h: number;\n}\n\nconst clamp = (value: number, min: number, max: number): number =>\n Math.min(max, Math.max(min, value));\n\n// sRGB transfer function and its inverse (gamma ↔ linear light).\nconst srgbToLinear = (channel: number): number =>\n channel <= 0.04045 ? channel / 12.92 : Math.pow((channel + 0.055) / 1.055, 2.4);\n\nconst linearToSrgb = (channel: number): number =>\n channel <= 0.0031308 ? 12.92 * channel : 1.055 * Math.pow(channel, 1 / 2.4) - 0.055;\n\ninterface LinearRGB {\n r: number;\n g: number;\n b: number;\n}\n\n// OKLab ↔ linear sRGB matrices (Björn Ottosson's reference constants).\nconst linearRgbToOklab = ({ r, g, b }: LinearRGB): { l: number; a: number; b: number } => {\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\n return {\n l: 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n a: 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n b: 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n };\n};\n\nconst oklabToLinearRgb = (l: number, a: number, b: number): LinearRGB => {\n const l_ = Math.pow(l + 0.3963377774 * a + 0.2158037573 * b, 3);\n const m_ = Math.pow(l - 0.1055613458 * a - 0.0638541728 * b, 3);\n const s_ = Math.pow(l - 0.0894841775 * a - 1.291485548 * b, 3);\n return {\n r: 4.0767416621 * l_ - 3.3077115913 * m_ + 0.2309699292 * s_,\n g: -1.2684380046 * l_ + 2.6097574011 * m_ - 0.3413193965 * s_,\n b: -0.0041960863 * l_ - 0.7034186147 * m_ + 1.707614701 * s_,\n };\n};\n\nconst oklchToLinearRgb = ({ l, c, h }: Oklch): LinearRGB => {\n const rad = (h * Math.PI) / 180;\n return oklabToLinearRgb(l, c * Math.cos(rad), c * Math.sin(rad));\n};\n\nconst GAMUT_EPSILON = 1e-4;\n\nconst inSrgbGamut = ({ r, g, b }: LinearRGB): boolean =>\n r >= -GAMUT_EPSILON &&\n r <= 1 + GAMUT_EPSILON &&\n g >= -GAMUT_EPSILON &&\n g <= 1 + GAMUT_EPSILON &&\n b >= -GAMUT_EPSILON &&\n b <= 1 + GAMUT_EPSILON;\n\n/** Parse a hex color (`#RGB` or `#RRGGBB`) into OKLCH. */\nexport const hexToOklch = (hex: string): Oklch => {\n const { red, green, blue } = hexToRgb(hex);\n const { l, a, b } = linearRgbToOklab({\n r: srgbToLinear(red / 255),\n g: srgbToLinear(green / 255),\n b: srgbToLinear(blue / 255),\n });\n const c = Math.hypot(a, b);\n const h = c < 1e-6 ? 0 : (Math.atan2(b, a) * 180) / Math.PI;\n return { l, c, h: h < 0 ? h + 360 : h };\n};\n\n/**\n * Render OKLCH as an sRGB hex string. Out-of-gamut colors are mapped back\n * into sRGB by reducing chroma only — lightness and hue are preserved, so\n * vivid seeds desaturate gracefully instead of shifting hue or clipping.\n */\nexport const oklchToHex = (color: Oklch): string => {\n const target: Oklch = { l: clamp(color.l, 0, 1), c: Math.max(color.c, 0), h: color.h };\n let rgb = oklchToLinearRgb(target);\n if (!inSrgbGamut(rgb)) {\n let low = 0;\n let high = target.c;\n for (let i = 0; i < 24; i++) {\n const mid = (low + high) / 2;\n if (inSrgbGamut(oklchToLinearRgb({ ...target, c: mid }))) low = mid;\n else high = mid;\n }\n rgb = oklchToLinearRgb({ ...target, c: low });\n }\n // Scale *after* the transfer function: 255 × transfer(channel), rounded once\n // inside rgbToHex. Rounding before scaling collapses every channel to 0/1.\n return rgbToHex(toSrgb255(rgb));\n};\n\nconst toSrgb255 = ({ r, g, b }: LinearRGB): RGB => ({\n red: 255 * linearToSrgb(clamp(r, 0, 1)),\n green: 255 * linearToSrgb(clamp(g, 0, 1)),\n blue: 255 * linearToSrgb(clamp(b, 0, 1)),\n});\n","import type { Colors } from '../theme/theme.model';\nimport type { BrandRole, PaletteConfig } from '../color/color.factory';\nimport type { ColorCategory } from '../color/color.types';\nimport { contrastRatio, hexToRgb, relativeLuminance } from '../color/color.helper';\nimport { schemeHues } from '../color/color.utils';\nimport { hexToOklch, oklchToHex, type Oklch } from './oklch.helper';\nimport type { ContrastCheck } from './generation.types';\n\nexport interface GenerateColorsConfig extends PaletteConfig {\n /**\n * Soft brand anchors, per role: the palette starts from these exact colors\n * but the WCAG guard-rail may adjust lightness (never hue) to reach AA.\n * Contrast-safe counterpart to the hard `brand` pins, which are emitted\n * verbatim even when they fail.\n */\n targets?: Partial<Record<BrandRole, string>>;\n /** Sink for the contrast checks performed while building this palette. */\n checks?: ContrastCheck[];\n}\n\n// ── Tonal architecture ──────────────────────────────────────────────────────\n// Every token maps onto one of these OKLCH lightness slots. Because OKLCH L\n// is perceptually uniform, a slot renders equally light for every hue — the\n// property HSL lacked, and the root fix for muddy derived palettes.\nconst toneMap = (dark: boolean) =>\n dark\n ? {\n accent: 0.78,\n container: 0.42,\n roleSurface: 0.26,\n background: 0.18,\n surface: 0.21,\n surfaceVariant: 0.32,\n outline: 0.66,\n onSurface: 0.93,\n mutedText: 0.76,\n inverse: 0.93,\n onInverse: 0.25,\n onDeep: 0.2,\n onLight: 0.985,\n grey: 0.72,\n disabledContainer: 0.3,\n }\n : {\n accent: 0.55,\n container: 0.9,\n roleSurface: 0.97,\n background: 0.995,\n surface: 0.985,\n surfaceVariant: 0.94,\n outline: 0.6,\n onSurface: 0.25,\n mutedText: 0.48,\n inverse: 0.3,\n onInverse: 0.97,\n onDeep: 0.24,\n onLight: 0.985,\n grey: 0.5,\n disabledContainer: 0.96,\n };\n\n// OKLCH chroma per tonal category — the perceptual successor to the HSL\n// `CategorySaturation` table. Values are accent-level chroma; container and\n// surface chroma are derived fractions.\nexport const CategoryChroma: Record<ColorCategory, number> = {\n jewel: 0.17,\n pastel: 0.055,\n earth: 0.08,\n neutral: 0.03,\n florescent: 0.26,\n shades: 0,\n};\n\n/** Dark-mode accents cap chroma so they don't vibrate on dark surfaces. */\nconst DARK_ACCENT_CHROMA_CAP = 0.16;\n\n// Semantic feedback roles in OKLCH: hue + chroma per role. Chroma differs per\n// role because sRGB gamut room differs by hue at the AA-dark lightness light\n// mode forces on ink tokens: red holds 0.20; amber sits at 55° (not 70° —\n// dark yellow reads brown, dark orange stays lively) with 0.18; green 0.16.\nconst SemanticColors = {\n error: { hue: 27, chroma: 0.2 },\n warn: { hue: 55, chroma: 0.18 },\n success: { hue: 152, chroma: 0.16 },\n} as const;\n\nconst clamp = (value: number, min: number, max: number): number =>\n Math.min(max, Math.max(min, value));\n\n/**\n * Generate a complete {@link Colors} token set in OKLCH. Same contract as\n * `generatePalette` (which delegates here), plus soft brand targets and a\n * contrast-check sink for {@link ContrastReport} consumers.\n */\nexport const generateColors = (config: GenerateColorsConfig): Colors => {\n const {\n seed,\n scheme,\n category,\n mode = 'light',\n accentSaturationFloor = 18,\n brand = {},\n targets = {},\n checks,\n } = config;\n const dark = mode === 'dark';\n const t = toneMap(dark);\n\n // The primary anchor (hard pin > soft target > seed) sets the neutral hue.\n const anchor = hexToOklch(brand.primary ?? targets.primary ?? seed);\n const hues = schemeHues(anchor.h, scheme);\n\n // Chroma model. The floor keeps the brand hue perceptible even for the\n // near-grey `neutral` category (0–100 legacy scale → OKLCH chroma).\n const chromaFloor = (accentSaturationFloor / 100) * 0.28;\n let accentC = Math.max(CategoryChroma[category], chromaFloor);\n if (dark) accentC = Math.min(accentC, DARK_ACCENT_CHROMA_CAP);\n const containerC = Math.max(CategoryChroma[category] * 0.45, accentC * 0.35);\n const surfaceC = Math.min(CategoryChroma[category], 0.012);\n\n const tone = (hue: number, c: number, l: number): string => oklchToHex({ l, c, h: hue });\n\n /**\n * The WCAG guard-rail: walk the foreground's OKLCH lightness away from the\n * background until the pair meets `target` (≤ 50 steps). Hue is never\n * touched; chroma only shrinks as a last resort when L runs out of room.\n */\n const ensureContrast = (fg: Oklch, bg: string, target: number): Oklch => {\n const out: Oklch = { ...fg };\n let hex = oklchToHex(out);\n if (contrastRatio(hex, bg) >= target) return out;\n // Pick the direction that can actually reach the target: each side has a\n // hard ceiling — black tops out at (Ybg + 0.05) / 0.05, white at\n // 1.05 / (Ybg + 0.05) — so staying on the foreground's current side is\n // only right when that side has enough headroom.\n const bgY = relativeLuminance(hexToRgb(bg));\n const darkCeiling = (bgY + 0.05) / 0.05;\n const lightCeiling = 1.05 / (bgY + 0.05);\n let lighten = relativeLuminance(hexToRgb(hex)) >= bgY;\n if (lighten && lightCeiling < target && darkCeiling >= target) lighten = false;\n if (!lighten && darkCeiling < target && lightCeiling >= target) lighten = true;\n const step = lighten ? 0.015 : -0.015;\n for (let i = 0; i < 50 && contrastRatio(hex, bg) < target; i++) {\n if ((step > 0 && out.l < 0.995) || (step < 0 && out.l > 0.02)) {\n out.l = clamp(out.l + step, 0, 1);\n } else {\n out.c = Math.max(0, out.c - 0.02);\n }\n hex = oklchToHex(out);\n }\n return out;\n };\n\n /** Guard-railed token: adjust toward `target` contrast, then record the pair. */\n const contrasted = (fg: Oklch, bgHex: string, target: number): string =>\n oklchToHex(ensureContrast(fg, bgHex, target));\n\n const record = (\n foreground: string,\n background: string,\n foregroundColor: string,\n backgroundColor: string,\n required: number\n ): void => {\n if (!checks) return;\n const ratio = contrastRatio(foregroundColor, backgroundColor);\n checks.push({\n mode,\n foreground,\n background,\n foregroundColor,\n backgroundColor,\n ratio: Math.round(ratio * 100) / 100,\n required,\n pass: ratio >= required,\n level: ratio < required ? 'fail' : ratio >= 7 ? 'AAA' : 'AA',\n });\n };\n\n const background = tone(anchor.h, surfaceC, t.background);\n const surface = tone(anchor.h, surfaceC, t.surface);\n const surfaceVariant = tone(anchor.h, surfaceC, t.surfaceVariant);\n\n // Legible foreground for a given ground: whichever of the tonal near-black /\n // near-white starts closer to AA, then guard-railed the rest of the way.\n const onColor = (hue: number, bg: string, c: number): string => {\n const deep: Oklch = { l: t.onDeep, c: Math.min(c, 0.05), h: hue };\n const light: Oklch = { l: t.onLight, c: Math.min(c, 0.02), h: hue };\n const pick =\n contrastRatio(oklchToHex(deep), bg) >= contrastRatio(oklchToHex(light), bg) ? deep : light;\n return contrasted(pick, bg, 4.5);\n };\n\n // Dark-mode counterpart of a *hard-pinned* brand color: lift lightness only\n // (hue and chroma preserved) until it clears 3:1 on the dark ground.\n const adaptPinForDark = (hex: string): string => {\n const pin = hexToOklch(hex);\n pin.l = Math.max(pin.l, 0.6);\n return oklchToHex(ensureContrast(pin, background, 3));\n };\n\n /**\n * Resolve a role's base color: hard pins are verbatim in light mode and\n * lightness-lifted in dark; soft targets and generated tones are pulled to\n * ≥ 4.5:1 as standalone ink on `background` and `surface` (§3.6).\n */\n const baseFor = (name: BrandRole, hue: number, c: number): string => {\n const pinned = brand[name];\n if (pinned) return dark ? adaptPinForDark(pinned) : pinned;\n const target = targets[name];\n let base: Oklch;\n if (target) {\n // Soft targets keep their own chroma — brand fidelity beats category.\n // Callers that want a vibe cap applied clamp the target before passing\n // it in (see `generateThemes`). Dark mode still decouples chroma.\n base = hexToOklch(target);\n if (dark) {\n base.c = Math.min(base.c, DARK_ACCENT_CHROMA_CAP);\n base.l = Math.max(base.l, t.accent - 0.08);\n }\n } else {\n base = { l: t.accent, c, h: hue };\n }\n return oklchToHex(ensureContrast(ensureContrast(base, background, 4.5), surface, 4.5));\n };\n\n const disabled = dark ? 'rgba(255,255,255,0.12)' : 'rgba(0,0,0,0.12)';\n const onDisabled = dark ? 'rgba(255,255,255,0.38)' : 'rgba(0,0,0,0.38)';\n\n // An accent role's base drives its container/surface/on satellites. Every\n // content satellite passes through the guard-rail and is recorded.\n const role = (name: string, base: string, cC: number = containerC) => {\n const { h, c } = hexToOklch(base);\n const container = tone(h, cC, t.container);\n const roleSurface = tone(h, surfaceC, t.roleSurface);\n const onBase = onColor(h, base, c);\n const onContainer = onColor(h, container, c);\n const onContainerVariant = contrasted({ l: t.mutedText, c: Math.min(cC, 0.06), h }, container, 4.5);\n const border = ensureContrast(ensureContrast(hexToOklch(base), container, 3), surface, 3);\n const borderHex = oklchToHex(border);\n const onRoleSurface = onColor(h, roleSurface, surfaceC);\n const onRoleSurfaceVariant = contrasted(hexToOklch(base), roleSurface, 4.5);\n\n record(`on-${name}`, name, onBase, base, 4.5);\n record(`on-${name}-container`, `${name}-container`, onContainer, container, 4.5);\n record(`on-${name}-container-variant`, `${name}-container`, onContainerVariant, container, 4.5);\n record(`on-${name}-container-border`, `${name}-container`, borderHex, container, 3);\n record(`on-${name}-container-border`, 'surface', borderHex, surface, 3);\n record(`on-${name}-surface`, `${name}-surface`, onRoleSurface, roleSurface, 4.5);\n record(`on-${name}-surface-variant`, `${name}-surface`, onRoleSurfaceVariant, roleSurface, 4.5);\n record(name, 'background', base, background, 4.5);\n record(name, 'surface', base, surface, 4.5);\n\n return {\n [name]: base,\n [`on-${name}`]: onBase,\n [`${name}-container`]: container,\n [`on-${name}-container`]: onContainer,\n [`on-${name}-container-variant`]: onContainerVariant,\n [`on-${name}-container-border`]: borderHex,\n [`${name}-surface`]: roleSurface,\n [`on-${name}-surface`]: onRoleSurface,\n [`on-${name}-surface-variant`]: onRoleSurfaceVariant,\n };\n };\n\n const primaryBase = baseFor('primary', hues.primary, accentC);\n const secondaryBase = baseFor('secondary', hues.secondary, accentC);\n const tertiaryBase = baseFor('tertiary', hues.tertiary, accentC);\n\n // Quaternary is a neutral, near-grey accent tied to the brand hue.\n const quaternaryGrey = brand.quaternary\n ? dark\n ? adaptPinForDark(brand.quaternary)\n : brand.quaternary\n : oklchToHex(ensureContrast({ l: t.grey, c: surfaceC, h: anchor.h }, surface, 3));\n const quaternarySurface = tone(anchor.h, surfaceC, t.roleSurface);\n const onQuaternary = onColor(anchor.h, quaternaryGrey, surfaceC);\n const onQuaternarySurface = onColor(anchor.h, quaternarySurface, surfaceC);\n const onQuaternarySurfaceVariant = contrasted(hexToOklch(primaryBase), quaternarySurface, 4.5);\n const onQuaternaryContainerVariant = contrasted(\n { l: t.mutedText, c: Math.min(containerC, 0.06), h: anchor.h },\n quaternarySurface,\n 4.5\n );\n record('on-quaternary', 'quaternary', onQuaternary, quaternaryGrey, 4.5);\n record('on-quaternary-surface', 'quaternary-surface', onQuaternarySurface, quaternarySurface, 4.5);\n record(\n 'on-quaternary-surface-variant',\n 'quaternary-surface',\n onQuaternarySurfaceVariant,\n quaternarySurface,\n 4.5\n );\n\n // Semantic feedback roles keep colorful, recognizable hues in every category.\n const semantic = (name: 'error' | 'warn' | 'success') => {\n const { hue, chroma } = SemanticColors[name];\n const base = baseFor(name, hue, dark ? Math.min(chroma, DARK_ACCENT_CHROMA_CAP) : chroma);\n const { h } = hexToOklch(base);\n const container = tone(h, containerC + 0.04, t.container);\n const onBase = onColor(h, base, chroma);\n const onContainer = onColor(h, container, chroma);\n record(`on-${name}`, name, onBase, base, 4.5);\n record(`on-${name}-container`, `${name}-container`, onContainer, container, 4.5);\n record(name, 'background', base, background, 4.5);\n record(name, 'surface', base, surface, 4.5);\n return { base, container, onBase, onContainer, h };\n };\n\n const error = semantic('error');\n const warn = semantic('warn');\n const success = semantic('success');\n\n const semanticExtras = (name: 'warn' | 'success', s: ReturnType<typeof semantic>) => {\n const variant = contrasted({ l: t.mutedText, c: 0.06, h: s.h }, s.container, 4.5);\n const border = oklchToHex(\n ensureContrast(ensureContrast(hexToOklch(s.base), s.container, 3), surface, 3)\n );\n record(`on-${name}-container-variant`, `${name}-container`, variant, s.container, 4.5);\n record(`on-${name}-container-border`, `${name}-container`, border, s.container, 3);\n return { variant, border };\n };\n const warnExtras = semanticExtras('warn', warn);\n const successExtras = semanticExtras('success', success);\n\n // Neutral text tokens.\n const onBackground = tone(anchor.h, surfaceC, t.onSurface);\n const onBackgroundVariant = contrasted({ l: t.mutedText, c: surfaceC, h: anchor.h }, background, 4.5);\n const onSurface = tone(anchor.h, surfaceC, t.onSurface);\n const onSurfaceVariant = contrasted(\n { l: dark ? t.mutedText : t.mutedText - 0.14, c: surfaceC, h: anchor.h },\n surfaceVariant,\n 4.5\n );\n record('on-background', 'background', onBackground, background, 4.5);\n record('on-background-variant', 'background', onBackgroundVariant, background, 4.5);\n record('on-surface', 'surface', onSurface, surface, 4.5);\n record('on-surface-variant', 'surface-variant', onSurfaceVariant, surfaceVariant, 4.5);\n\n // Inverse surfaces flip the ground; their accents must stay legible there.\n const inverseSurface = tone(anchor.h, surfaceC, t.inverse);\n const onInverse = tone(anchor.h, surfaceC, t.onInverse);\n const inversePrimary = contrasted(hexToOklch(primaryBase), inverseSurface, 4.5);\n record('on-inverse-surface', 'inverse-surface', onInverse, inverseSurface, 4.5);\n record('on-inverse-surface-primary', 'inverse-surface', inversePrimary, inverseSurface, 4.5);\n record('on-inverse-container', 'inverse-container', onInverse, inverseSurface, 4.5);\n\n const outline = oklchToHex(\n ensureContrast(\n ensureContrast({ l: t.outline, c: Math.min(surfaceC, 0.02), h: hues.primary }, surface, 3),\n background,\n 3\n )\n );\n record('outline', 'surface', outline, surface, 3);\n record('outline', 'background', outline, background, 3);\n\n return {\n ...role('primary', primaryBase),\n ...role('secondary', secondaryBase),\n ...role('tertiary', tertiaryBase),\n\n quaternary: quaternaryGrey,\n 'on-quaternary': onQuaternary,\n 'quaternary-surface': quaternarySurface,\n 'on-quaternary-surface': onQuaternarySurface,\n 'on-quaternary-surface-variant': onQuaternarySurfaceVariant,\n 'on-quaternary-container-variant': onQuaternaryContainerVariant,\n 'on-quaternary-container-border': quaternaryGrey,\n\n // Semantic\n error: error.base,\n 'on-error': error.onBase,\n 'error-container': error.container,\n 'on-error-container': error.onContainer,\n\n warn: warn.base,\n 'on-warn': warn.onBase,\n 'warn-container': warn.container,\n 'on-warn-container': warn.onContainer,\n 'on-warn-container-variant': warnExtras.variant,\n 'on-warn-container-border': warnExtras.border,\n\n success: success.base,\n 'on-success': success.onBase,\n 'success-container': success.container,\n 'on-success-container': success.onContainer,\n 'on-success-container-variant': successExtras.variant,\n 'on-success-container-border': successExtras.border,\n\n // Neutral surfaces\n background,\n 'on-background': onBackground,\n 'on-background-variant': onBackgroundVariant,\n surface,\n 'on-surface': onSurface,\n 'surface-variant': surfaceVariant,\n 'on-surface-variant': onSurfaceVariant,\n\n // Inverse\n 'inverse-surface': inverseSurface,\n 'on-inverse-surface': onInverse,\n 'on-inverse-surface-primary': inversePrimary,\n 'on-inverse-surface-variant': inversePrimary,\n 'inverse-container': inverseSurface,\n 'on-inverse-container': onInverse,\n\n // Utility\n outline,\n shadow: '#000000',\n scrim: '#000000',\n 'surface-tint': primaryBase,\n transparent: 'rgba(0,0,0,0)',\n ghost: 'rgba(0,0,0,0)',\n\n // Disabled (deliberate alpha overlays — excluded from the contrast report)\n disabled,\n 'on-disabled': onDisabled,\n 'disabled-container': tone(hues.primary, surfaceC, t.disabledContainer),\n 'on-disabled-container': onDisabled,\n 'disabled-surface': disabled,\n 'on-disabled-surface': dark ? 'rgba(255,255,255,0.5)' : 'rgba(0,0,0,0.5)',\n 'on-disabled-surface-variant': dark ? 'rgba(255,255,255,0.4)' : 'rgba(0,0,0,0.4)',\n };\n};\n","import type { Colors } from '../theme';\nimport { generateColors, type GenerateColorsConfig } from '../generation/palette.factory';\nimport type { ColorCategory, ColorScheme } from './color.types';\n\n/** Roles whose base color can be pinned to an exact brand hex. */\nexport type BrandRole =\n | 'primary'\n | 'secondary'\n | 'tertiary'\n | 'quaternary'\n | 'error'\n | 'warn'\n | 'success';\n\nexport interface PaletteConfig {\n /**\n * Seed brand color as a hex string, e.g. '#4F46E5'. Anchors the neutral\n * hue and every role you don't pin via `brand`. When `brand.primary` is\n * set, that color anchors instead.\n */\n seed: string;\n /** How secondary/tertiary hues relate to the anchor, for unpinned roles. */\n scheme: ColorScheme;\n /** Saturation / tonal character of the generated (unpinned) colors. */\n category: ColorCategory;\n /** Light or dark rendering of the same palette. Defaults to 'light'. */\n mode?: 'light' | 'dark';\n /**\n * Minimum accent saturation (0–100 scale) so the brand hue stays perceptible\n * even for the `neutral` category (which is otherwise near-grey). Set to 0\n * to honor the category saturation exactly.\n */\n accentSaturationFloor?: number;\n /**\n * Exact brand colors, pinned per role. A pinned color is emitted verbatim as\n * that role's base token in **light** mode (\"cannot shift\"); in **dark** mode\n * it is lifted in lightness only — hue and chroma preserved — so it stays\n * legible on a dark ground. Its on/container/surface satellites are derived\n * from it. Unpinned roles are generated from the seed + scheme as usual, so an\n * arbitrary brand pair (e.g. forest green + ochre) can be reproduced exactly.\n */\n brand?: Partial<Record<BrandRole, string>>;\n}\n\n/**\n * Generate a complete {@link Colors} token set from a single seed color, a\n * {@link ColorScheme} and a {@link ColorCategory}. Produces a light or dark\n * variant of the same palette; `on-*` colors are driven to WCAG AA contrast\n * so text stays legible for any seed.\n *\n * Delegates to the OKLCH engine in `concepts/generation` — all lightness and\n * chroma math is perceptual, and every derived pair passes through the WCAG\n * guard-rail. Accepts the engine's extended config, so callers may also pass\n * soft `targets` (brand-faithful but guard-railed) and a `checks` sink. Use\n * `generateThemes()` for the light+dark pair plus a {@link ContrastReport}.\n */\nexport const generatePalette = (config: GenerateColorsConfig): Colors => generateColors(config);\n","export type ZIndexableElements =\n | 'dropdown'\n | 'sticky'\n | 'fixed'\n | 'backdrop'\n | 'dialog'\n | 'popover'\n | 'tooltip'\n | 'overlay';\n\nexport const Z_INDEX: Record<ZIndexableElements, number> = {\n dropdown: 1000,\n sticky: 1020,\n fixed: 1030,\n backdrop: 1040,\n dialog: 1050,\n popover: 1060,\n tooltip: 1070,\n overlay: 1080,\n};\n","import type { Colors, Radii, Spacing } from '../theme/theme.model';\n\n/** A single W3C DTCG design token. */\nexport interface DtcgToken {\n $value: string;\n $type: 'color' | 'dimension';\n}\n\n/** DTCG-format token document (Style Dictionary compatible), per PRD §6. */\nexport interface DtcgTokens {\n color: Record<string, DtcgToken>;\n size: {\n radius: Record<string, DtcgToken>;\n spacing: Record<string, DtcgToken>;\n };\n}\n\nconst dimensionEntries = (record: Radii | Spacing | undefined): Record<string, DtcgToken> =>\n Object.fromEntries(\n Object.entries(record ?? {})\n .filter(([, value]) => value !== undefined && value !== 'none')\n .map(([key, value]) => [key, { $value: String(value), $type: 'dimension' as const }])\n );\n\n/**\n * Render one theme mode's tokens as W3C DTCG JSON for external pipelines\n * (Style Dictionary etc.). Token names are exactly Uni's `ColorToken` strings —\n * one vocabulary everywhere. The native `UniTheme` object remains the primary,\n * lossless output; this is the interop layer.\n */\nexport const emitDtcgTokens = (input: {\n colors: Colors;\n radii?: Radii;\n spacing?: Spacing;\n}): DtcgTokens => ({\n color: Object.fromEntries(\n Object.entries(input.colors)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => [key, { $value: value as string, $type: 'color' as const }])\n ),\n size: {\n radius: dimensionEntries(input.radii),\n spacing: dimensionEntries(input.spacing),\n },\n});\n","import type { Colors, Shadows } from '../theme/theme.model';\nimport { hexToRgb } from '../color/color.helper';\nimport { hexToOklch, oklchToHex } from './oklch.helper';\n\nconst rgba = (hex: string, alpha: number): string => {\n const { red, green, blue } = hexToRgb(hex);\n return `rgba(${red}, ${green}, ${blue}, ${alpha})`;\n};\n\n/**\n * Brand-tinted, theme-scoped elevation shadows (PRD §3.5.C).\n *\n * Light mode replaces the dead-neutral black stacks with a shadow ink pulled\n * toward the brand hue — dark and low-chroma enough to read as shadow, tinted\n * enough to kill the grey \"mud\" where shadows meet brand surfaces. Dark mode\n * goes near-zero: elevation is carried by the surface lightness steps, with\n * only a faint veil kept on floating overlays (menus/dialogs genuinely need\n * separation) and the `warn` glow tinted by the theme's own error color.\n */\nexport const generateShadows = (colors: Colors, mode: 'light' | 'dark' = 'light'): Shadows => {\n const error = colors['error'] ?? '#CC2827';\n\n if (mode === 'dark') {\n return {\n raised: 'none',\n menu: `0px 4px 12px ${rgba('#000000', 0.45)}`,\n dialog: `0px 8px 28px ${rgba('#000000', 0.55)}`,\n warn: `0 0 5px ${rgba(error, 0.55)}, inset 0 0 5px ${rgba(error, 0.35)}`,\n };\n }\n\n // Shadow ink: near-black carrying ~6–8% of the brand hue's chroma.\n const { h } = hexToOklch(colors['primary'] ?? '#000000');\n const ink = oklchToHex({ l: 0.22, c: 0.035, h });\n return {\n raised: `${rgba(ink, 0.2)} 0px 2px 1px -1px, ${rgba(ink, 0.14)} 0px 1px 1px 0px, ${rgba(ink, 0.12)} 0px 1px 3px 0px`,\n menu: `${rgba(ink, 0.2)} 0px 3px 3px -2px, ${rgba(ink, 0.14)} 0px 3px 4px 0px, ${rgba(ink, 0.12)} 0px 1px 8px 0px`,\n dialog: `${rgba(ink, 0.2)} 0px 3px 5px -1px, ${rgba(ink, 0.14)} 0px 6px 10px 0px, ${rgba(ink, 0.12)} 0px 1px 18px 0px`,\n warn: `0 0 5px ${rgba(error, 0.5)}, inset 0 0 5px ${rgba(error, 0.3)}`,\n };\n};\n","import type { Icons } from '../theme/theme.model';\n\n/**\n * Default icon primitives shipped with every theme. Each icon is an inline\n * SVG data URI rendered as a CSS mask over `currentColor`, so icons recolor\n * with the theme automatically. `createTheme` merges a theme's own `icons`\n * over this set — add or override under any name; components render them by\n * token via `uni-icon`, never by inlining SVG.\n *\n * The set is Material Symbols Outlined at weight 300, normalized to a\n * single `0 -960 960 960` grid so every glyph shares one optical weight.\n *\n * Generated by scripts/generate-icons.mjs (pnpm icons:generate). Do not edit\n * by hand — add or change icons in that script's manifest and regenerate.\n */\nexport const BaseIcons = {\n // Navigation & layout\n menu: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M140-254.62v-59.99h680v59.99H140ZM140-450v-60h680v60H140Zm0-195.39v-59.99h680v59.99H140Z'/%3e%3c/svg%3e\",\n chevronUp:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m480-541.85-184 184L253.85-400 480-626.15 706.15-400 664-357.85l-184-184Z'/%3e%3c/svg%3e\",\n chevronDown:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M480-357.85 253.85-584 296-626.15l184 184 184-184L706.15-584 480-357.85Z'/%3e%3c/svg%3e\",\n chevronLeft:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M560-253.85 333.85-480 560-706.15 602.15-664l-184 184 184 184L560-253.85Z'/%3e%3c/svg%3e\",\n chevronRight:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m517.85-480-184-184L376-706.15 602.15-480 376-253.85 333.85-296l184-184Z'/%3e%3c/svg%3e\",\n arrowLeft:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m294.92-450 227.85 227.85L480-180 180-480l300-300 42.77 42.15L294.92-510H780v60H294.92Z'/%3e%3c/svg%3e\",\n arrowRight:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M665.08-450H180v-60h485.08L437.23-737.85 480-780l300 300-300 300-42.77-42.15L665.08-450Z'/%3e%3c/svg%3e\",\n home: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M240-200h133.85v-237.69h212.3V-200H720v-360L480-740.77 240-560v360Zm-60 60v-450l300-225.77L780-590v450H526.15v-237.69h-92.3V-140H180Zm300-330.38Z'/%3e%3c/svg%3e\",\n building:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M130-136.92v-540h160v-160h380v320h160v380H530v-160H430v160H130Zm60-60h100v-100H190v100Zm0-160h100v-100H190v100Zm0-160h100v-100H190v100Zm160 160h100v-100H350v100Zm0-160h100v-100H350v100Zm0-160h100v-100H350v100Zm160 320h100v-100H510v100Zm0-160h100v-100H510v100Zm0-160h100v-100H510v100Zm160 480h100v-100H670v100Zm0-160h100v-100H670v100Z'/%3e%3c/svg%3e\",\n externalLink:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M212.31-140Q182-140 161-161q-21-21-21-51.31v-535.38Q140-778 161-799q21-21 51.31-21h252.3v60h-252.3q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v535.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h535.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-252.3h60v252.3Q820-182 799-161q-21 21-51.31 21H212.31Zm176.46-206.62-42.15-42.15L717.85-760H560v-60h260v260h-60v-157.85L388.77-346.62Z'/%3e%3c/svg%3e\",\n link: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M432.31-298.46H281.54q-75.34 0-128.44-53.1Q100-404.65 100-479.98q0-75.33 53.1-128.44 53.1-53.12 128.44-53.12h150.77v60H281.54q-50.39 0-85.96 35.58Q160-530.38 160-480q0 50.38 35.58 85.96 35.57 35.58 85.96 35.58h150.77v60ZM330-450v-60h300v60H330Zm197.69 151.54v-60h150.77q50.39 0 85.96-35.58Q800-429.62 800-480q0-50.38-35.58-85.96-35.57-35.58-85.96-35.58H527.69v-60h150.77q75.34 0 128.44 53.1Q860-555.35 860-480.02q0 75.33-53.1 128.44-53.1 53.12-128.44 53.12H527.69Z'/%3e%3c/svg%3e\",\n expand:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M140-140v-300h60v198.23L718.23-760H520v-60h300v300h-60v-198.23L241.77-200H440v60H140Z'/%3e%3c/svg%3e\",\n gridView:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M140-520v-300h300v300H140Zm0 380v-300h300v300H140Zm380-380v-300h300v300H520Zm0 380v-300h300v300H520ZM200-580h180v-180H200v180Zm380 0h180v-180H580v180Zm0 380h180v-180H580v180Zm-380 0h180v-180H200v180Zm380-380Zm0 200Zm-200 0Zm0-200Z'/%3e%3c/svg%3e\",\n listView:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M293.08-597.69v-60H820v60H293.08Zm0 147.69v-60H820v60H293.08Zm0 147.69v-60H820v60H293.08ZM172.31-595.38q-13.73 0-23.02-9.4t-9.29-23.3q0-13.56 9.29-22.74 9.29-9.18 23.02-9.18t23.02 9.18q9.29 9.18 9.29 22.74 0 13.9-9.29 23.3t-23.02 9.4Zm0 147.3q-13.73 0-23.02-9.18Q140-466.43 140-480q0-14.31 9.29-23.5t23.02-9.19q13.73 0 23.02 9.19t9.29 23.5q0 13.57-9.29 22.74-9.29 9.18-23.02 9.18Zm0 148.08q-13.73 0-23.02-9.4T140-332.69q0-13.57 9.29-22.75t23.02-9.18q13.73 0 23.02 9.18t9.29 22.75q0 13.89-9.29 23.29-9.29 9.4-23.02 9.4Z'/%3e%3c/svg%3e\",\n\n // Actions & controls\n search:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M781.69-136.92 530.46-388.16q-30 24.77-69 38.77-39 14-80.69 14-102.46 0-173.54-71.07-71.07-71.08-71.07-173.54t71.07-173.54q71.08-71.07 173.54-71.07t173.54 71.07q71.07 71.08 71.07 173.54 0 42.85-14.38 81.85-14.39 39-38.39 67.84l251.23 251.23-42.15 42.16ZM380.77-395.38q77.31 0 130.96-53.66 53.66-53.65 53.66-130.96t-53.66-130.96q-53.65-53.66-130.96-53.66t-130.96 53.66Q196.15-657.31 196.15-580t53.66 130.96q53.65 53.66 130.96 53.66Z'/%3e%3c/svg%3e\",\n close:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M256-213.85 213.85-256l224-224-224-224L256-746.15l224 224 224-224L746.15-704l-224 224 224 224L704-213.85l-224-224-224 224Z'/%3e%3c/svg%3e\",\n plus: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M450-450H220v-60h230v-230h60v230h230v60H510v230h-60v-230Z'/%3e%3c/svg%3e\",\n minus:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M220-450v-60h520v60H220Z'/%3e%3c/svg%3e\",\n more: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M480-189.23q-24.75 0-42.37-17.63Q420-224.48 420-249.23q0-24.75 17.63-42.38 17.62-17.62 42.37-17.62 24.75 0 42.37 17.62Q540-273.98 540-249.23q0 24.75-17.63 42.37-17.62 17.63-42.37 17.63ZM480-420q-24.75 0-42.37-17.63Q420-455.25 420-480q0-24.75 17.63-42.37Q455.25-540 480-540q24.75 0 42.37 17.63Q540-504.75 540-480q0 24.75-17.63 42.37Q504.75-420 480-420Zm0-230.77q-24.75 0-42.37-17.62Q420-686.02 420-710.77q0-24.75 17.63-42.37 17.62-17.63 42.37-17.63 24.75 0 42.37 17.63Q540-735.52 540-710.77q0 24.75-17.63 42.38-17.62 17.62-42.37 17.62Z'/%3e%3c/svg%3e\",\n moreHorizontal:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M249.23-420q-24.75 0-42.37-17.63-17.63-17.62-17.63-42.37 0-24.75 17.63-42.37Q224.48-540 249.23-540q24.75 0 42.38 17.63 17.62 17.62 17.62 42.37 0 24.75-17.62 42.37Q273.98-420 249.23-420ZM480-420q-24.75 0-42.37-17.63Q420-455.25 420-480q0-24.75 17.63-42.37Q455.25-540 480-540q24.75 0 42.37 17.63Q540-504.75 540-480q0 24.75-17.63 42.37Q504.75-420 480-420Zm230.77 0q-24.75 0-42.38-17.63-17.62-17.62-17.62-42.37 0-24.75 17.62-42.37Q686.02-540 710.77-540q24.75 0 42.37 17.63 17.63 17.62 17.63 42.37 0 24.75-17.63 42.37Q735.52-420 710.77-420Z'/%3e%3c/svg%3e\",\n delete:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M292.31-140q-29.92 0-51.12-21.19Q220-182.39 220-212.31V-720h-40v-60h180v-35.38h240V-780h180v60h-40v507.69Q740-182 719-161q-21 21-51.31 21H292.31ZM680-720H280v507.69q0 5.39 3.46 8.85t8.85 3.46h375.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46V-720ZM376.16-280h59.99v-360h-59.99v360Zm147.69 0h59.99v-360h-59.99v360ZM280-720v520-520Z'/%3e%3c/svg%3e\",\n edit: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M200-200h50.46l409.46-409.46-50.46-50.46L200-250.46V-200Zm-60 60v-135.38l527.62-527.39q9.07-8.24 20.03-12.73 10.97-4.5 23-4.5t23.3 4.27q11.28 4.27 19.97 13.58l48.85 49.46q9.31 8.69 13.27 20 3.96 11.31 3.96 22.62 0 12.07-4.12 23.03-4.12 10.97-13.11 20.04L275.38-140H140Zm620.38-570.15-50.23-50.23 50.23 50.23Zm-126.13 75.9-24.79-25.67 50.46 50.46-25.67-24.79Z'/%3e%3c/svg%3e\",\n copy: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M362.31-260Q332-260 311-281q-21-21-21-51.31v-455.38Q290-818 311-839q21-21 51.31-21h335.38Q728-860 749-839q21 21 21 51.31v455.38Q770-302 749-281q-21 21-51.31 21H362.31Zm0-60h335.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85Zm-140 200Q192-120 171-141q-21-21-21-51.31v-515.38h60v515.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h395.38v60H222.31ZM350-320v-480 480Z'/%3e%3c/svg%3e\",\n download:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M480-328.46 309.23-499.23l42.16-43.38L450-444v-336h60v336l98.61-98.61 42.16 43.38L480-328.46ZM252.31-180Q222-180 201-201q-21-21-21-51.31v-108.46h60v108.46q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h455.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-108.46h60v108.46Q780-222 759-201q-21 21-51.31 21H252.31Z'/%3e%3c/svg%3e\",\n upload:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M450-328.46v-336l-98.61 98.61-42.16-43.38L480-780l170.77 170.77-42.16 43.38L510-664.46v336h-60ZM252.31-180Q222-180 201-201q-21-21-21-51.31v-108.46h60v108.46q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h455.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-108.46h60v108.46Q780-222 759-201q-21 21-51.31 21H252.31Z'/%3e%3c/svg%3e\",\n share:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M672.22-100q-44.91 0-76.26-31.41-31.34-31.41-31.34-76.28 0-6 4.15-29.16L284.31-404.31q-14.46 15-34.36 23.5t-42.64 8.5q-44.71 0-76.01-31.54Q100-435.39 100-480q0-44.61 31.3-76.15 31.3-31.54 76.01-31.54 22.74 0 42.64 8.5 19.9 8.5 34.36 23.5l284.46-167.08q-2.38-7.38-3.27-14.46-.88-7.08-.88-15.08 0-44.87 31.43-76.28Q627.49-860 672.4-860t76.25 31.44Q780-797.13 780-752.22q0 44.91-31.41 76.26-31.41 31.34-76.28 31.34-22.85 0-42.5-8.69Q610.15-662 595.69-677L311.23-509.54q2.38 7.39 3.27 14.46.88 7.08.88 15.08t-.88 15.08q-.89 7.07-3.27 14.46L595.69-283q14.46-15 34.12-23.69 19.65-8.69 42.5-8.69 44.87 0 76.28 31.43Q780-252.51 780-207.6t-31.44 76.25Q717.13-100 672.22-100Zm.09-60q20.27 0 33.98-13.71Q720-187.42 720-207.69q0-20.27-13.71-33.98-13.71-13.72-33.98-13.72-20.27 0-33.98 13.72-13.72 13.71-13.72 33.98 0 20.27 13.72 33.98Q652.04-160 672.31-160Zm-465-272.31q20.43 0 34.25-13.8 13.83-13.81 13.83-33.89t-13.83-33.89q-13.82-13.8-34.25-13.8-20.11 0-33.71 13.8Q160-500.08 160-480t13.6 33.89q13.6 13.8 33.71 13.8Zm498.88-286.02Q720-732.04 720-752.31q0-20.27-13.71-33.98Q692.58-800 672.31-800q-20.27 0-33.98 13.71-13.72 13.71-13.72 33.98 0 20.27 13.81 33.98 13.81 13.72 33.89 13.72 20.07 0 33.88-13.72Zm-33.88 510.64ZM207.69-480Zm464.62-272.31Z'/%3e%3c/svg%3e\",\n send: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M140-190v-580l688.46 290L140-190Zm60-90 474-200-474-200v147.69L416.92-480 200-427.69V-280Zm0 0v-400 400Z'/%3e%3c/svg%3e\",\n filter:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M411.15-260v-60h137.31v60H411.15ZM256.16-450v-60h447.3v60h-447.3ZM140-640v-60h680v60H140Z'/%3e%3c/svg%3e\",\n funnel:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M455.39-180q-15.08 0-25.23-10.16Q420-200.31 420-215.39v-231.53L196.08-731.38q-11.54-15.39-3.35-32 8.2-16.62 27.66-16.62h519.22q19.46 0 27.66 16.62 8.19 16.61-3.35 32L540-446.92v231.53q0 15.08-10.16 25.23Q519.69-180 504.61-180h-49.22ZM480-468l198-252H282l198 252Zm0 0Z'/%3e%3c/svg%3e\",\n refresh:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M481.54-180q-125.63 0-212.81-87.17-87.19-87.17-87.19-212.77 0-125.6 87.19-212.83Q355.91-780 481.54-780q70.15 0 132.77 31.19 62.61 31.2 104.15 88.04V-780h60v244.61H533.85v-59.99h158q-31.62-57.93-87.7-91.27Q548.08-720 481.54-720q-100 0-170 70t-70 170q0 100 70 170t170 70q77 0 139-44t87-116h63.23q-27.23 97.92-107.27 158.96Q583.46-180 481.54-180Z'/%3e%3c/svg%3e\",\n dragHandle:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M360-175.39q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Zm240 0q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Zm-240-240q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Zm240 0q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Zm-240-240q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Zm240 0q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Z'/%3e%3c/svg%3e\",\n qrCode:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M140-520v-300h300v300H140Zm60-60h180v-180H200v180Zm-60 440v-300h300v300H140Zm60-60h180v-180H200v180Zm320-320v-300h300v300H520Zm60-60h180v-180H580v180Zm165 440v-75h75v75h-75ZM520-365v-75h75v75h-75Zm75 75v-75h75v75h-75Zm-75 75v-75h75v75h-75Zm75 75v-75h75v75h-75Zm75-75v-75h75v75h-75Zm0-150v-75h75v75h-75Zm75 75v-75h75v75h-75Z'/%3e%3c/svg%3e\",\n\n // Status & feedback\n check:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M382-253.85 168.62-467.23 211.38-510 382-339.38 748.62-706l42.76 42.77L382-253.85Z'/%3e%3c/svg%3e\",\n checkCircle:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m423.23-309.85 268.92-268.92L650-620.92 423.23-394.15l-114-114L267.08-466l156.15 156.15ZM480.07-100q-78.84 0-148.21-29.92t-120.68-81.21q-51.31-51.29-81.25-120.63Q100-401.1 100-479.93q0-78.84 29.92-148.21t81.21-120.68q51.29-51.31 120.63-81.25Q401.1-860 479.93-860q78.84 0 148.21 29.92t120.68 81.21q51.31 51.29 81.25 120.63Q860-558.9 860-480.07q0 78.84-29.92 148.21t-81.21 120.68q-51.29 51.31-120.63 81.25Q558.9-100 480.07-100Zm-.07-60q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z'/%3e%3c/svg%3e\",\n xCircle:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m336-293.85 144-144 144 144L666.15-336l-144-144 144-144L624-666.15l-144 144-144-144L293.85-624l144 144-144 144L336-293.85ZM480.07-100q-78.84 0-148.21-29.92t-120.68-81.21q-51.31-51.29-81.25-120.63Q100-401.1 100-479.93q0-78.84 29.92-148.21t81.21-120.68q51.29-51.31 120.63-81.25Q401.1-860 479.93-860q78.84 0 148.21 29.92t120.68 81.21q51.31 51.29 81.25 120.63Q860-558.9 860-480.07q0 78.84-29.92 148.21t-81.21 120.68q-51.29 51.31-120.63 81.25Q558.9-100 480.07-100Zm-.07-60q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z'/%3e%3c/svg%3e\",\n alertCircle:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M502.92-300.15q9.39-9.39 9.39-22.93T502.92-346q-9.38-9.38-22.92-9.38-13.54 0-22.92 9.38-9.39 9.38-9.39 22.92 0 13.54 9.39 22.93 9.38 9.38 22.92 9.38 13.54 0 22.92-9.38ZM450-436.92h60v-240h-60v240ZM480.07-100q-78.84 0-148.21-29.92t-120.68-81.21q-51.31-51.29-81.25-120.63Q100-401.1 100-479.93q0-78.84 29.92-148.21t81.21-120.68q51.29-51.31 120.63-81.25Q401.1-860 479.93-860q78.84 0 148.21 29.92t120.68 81.21q51.31 51.29 81.25 120.63Q860-558.9 860-480.07q0 78.84-29.92 148.21t-81.21 120.68q-51.29 51.31-120.63 81.25Q558.9-100 480.07-100Zm-.07-60q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z'/%3e%3c/svg%3e\",\n info: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M450-290h60v-230h-60v230Zm52.92-307.75q9.39-9.29 9.39-23.02t-9.29-23.02q-9.29-9.28-23.02-9.28t-23.02 9.28q-9.29 9.29-9.29 23.02t9.39 23.02q9.38 9.29 22.92 9.29 13.54 0 22.92-9.29ZM480.07-100q-78.84 0-148.21-29.92t-120.68-81.21q-51.31-51.29-81.25-120.63Q100-401.1 100-479.93q0-78.84 29.92-148.21t81.21-120.68q51.29-51.31 120.63-81.25Q401.1-860 479.93-860q78.84 0 148.21 29.92t120.68 81.21q51.31 51.29 81.25 120.63Q860-558.9 860-480.07q0 78.84-29.92 148.21t-81.21 120.68q-51.29 51.31-120.63 81.25Q558.9-100 480.07-100Zm-.07-60q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z'/%3e%3c/svg%3e\",\n warning:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M74.62-140 480-840l405.38 700H74.62ZM178-200h604L480-720 178-200Zm324.92-57.08q9.39-9.38 9.39-22.92 0-13.54-9.39-22.92-9.38-9.39-22.92-9.39-13.54 0-22.92 9.39-9.39 9.38-9.39 22.92 0 13.54 9.39 22.92 9.38 9.39 22.92 9.39 13.54 0 22.92-9.39ZM450-352.31h60v-200h-60v200ZM480-460Z'/%3e%3c/svg%3e\",\n lock: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M252.31-100q-29.92 0-51.12-21.19Q180-142.39 180-172.31v-375.38q0-29.92 21.19-51.12Q222.39-620 252.31-620H300v-80q0-74.92 52.54-127.46Q405.08-880 480-880q74.92 0 127.46 52.54Q660-774.92 660-700v80h47.69q29.92 0 51.12 21.19Q780-577.61 780-547.69v375.38q0 29.92-21.19 51.12Q737.61-100 707.69-100H252.31Zm0-60h455.38q5.39 0 8.85-3.46t3.46-8.85v-375.38q0-5.39-3.46-8.85t-8.85-3.46H252.31q-5.39 0-8.85 3.46t-3.46 8.85v375.38q0 5.39 3.46 8.85t8.85 3.46Zm277.27-150.42Q550-330.85 550-360t-20.42-49.58Q509.15-430 480-430t-49.58 20.42Q410-389.15 410-360t20.42 49.58Q450.85-290 480-290t49.58-20.42ZM360-620h240v-80q0-50-35-85t-85-35q-50 0-85 35t-35 85v80ZM240-160v-400 400Z'/%3e%3c/svg%3e\",\n star: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m354-287 126-76 126 77-33-144 111-96-146-13-58-136-58 135-146 13 111 97-33 143Zm-91 125.46 57.31-246.77-191.46-165.92 252.61-21.92L480-828.84l98.54 232.69 252.61 21.92-191.46 165.92L697-161.54 480-292.46 263-161.54ZM480-470Z'/%3e%3c/svg%3e\",\n verified:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m352.46-85.39-71.38-120.3-135.54-29.7 13.23-139.53L66.93-480l91.84-105.08-13.23-139.53 135.54-29.7 71.38-120.3L480-820.46l127.54-54.15 71.38 120.3 135.54 29.7-13.23 139.53L893.07-480l-91.84 105.08 13.23 139.53-135.54 29.7-71.38 120.3L480-139.54 352.46-85.39ZM378-162l102-43.23L583.23-162 640-258l110-25.23L740-396l74-84-74-85.23L750-678l-110-24-58-96-102 43.23L376.77-798 320-702l-110 24 10 112.77L146-480l74 84-10 114 110 24 58 96Zm102-318Zm-42 128.15L650.15-564 608-607.38l-170 170-86-84.77L309.85-480 438-351.85Z'/%3e%3c/svg%3e\",\n\n // User & system\n profile:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M381.04-533.35Q340-574.38 340-632.31q0-57.92 41.04-98.96 41.04-41.04 98.96-41.04 57.92 0 98.96 41.04Q620-690.23 620-632.31q0 57.93-41.04 98.96-41.04 41.04-98.96 41.04-57.92 0-98.96-41.04ZM180-187.69v-88.93q0-29.38 15.96-54.42 15.96-25.04 42.66-38.5 59.3-29.07 119.65-43.61 60.35-14.54 121.73-14.54t121.73 14.54q60.35 14.54 119.65 43.61 26.7 13.46 42.66 38.5Q780-306 780-276.62v88.93H180Zm60-60h480v-28.93q0-12.15-7.04-22.5-7.04-10.34-19.11-16.88-51.7-25.46-105.42-38.58Q534.7-367.69 480-367.69q-54.7 0-108.43 13.11-53.72 13.12-105.42 38.58-12.07 6.54-19.11 16.88-7.04 10.35-7.04 22.5v28.93Zm296.5-328.12q23.5-23.5 23.5-56.5t-23.5-56.5q-23.5-23.5-56.5-23.5t-56.5 23.5q-23.5 23.5-23.5 56.5t23.5 56.5q23.5 23.5 56.5 23.5t56.5-23.5Zm-56.5-56.5Zm0 384.62Z'/%3e%3c/svg%3e\",\n group:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M71.93-187.69v-88.93q0-30.92 15.96-55.19 15.96-24.27 42.63-37.76 57.02-27.89 114.67-43.01 57.66-15.11 126.73-15.11 69.08 0 126.73 15.11 57.66 15.12 114.68 43.01 26.67 13.49 42.63 37.76 15.96 24.27 15.96 55.19v88.93H71.93Zm679.99 0v-93.85q0-39.38-19.28-75.07-19.29-35.68-54.72-61.23 40.23 6 76.39 18.57 36.15 12.58 69 29.73 31 16.54 47.88 38.99 16.88 22.44 16.88 49.01v93.85H751.92ZM272.96-533.35q-41.03-41.03-41.03-98.96 0-57.92 41.03-98.96 41.04-41.04 98.96-41.04 57.93 0 98.96 41.04 41.04 41.04 41.04 98.96 0 57.93-41.04 98.96-41.03 41.04-98.96 41.04-57.92 0-98.96-41.04Zm403.22 0q-41.12 41.04-98.87 41.04-6.77 0-17.23-1.54-10.47-1.54-17.23-3.38 23.66-28.45 36.37-63.12 12.7-34.67 12.7-72 0-37.34-12.96-71.73-12.96-34.38-36.11-63.3 8.61-3.08 17.23-4 8.61-.93 17.23-.93 57.75 0 98.87 41.04 41.12 41.04 41.12 98.96 0 57.93-41.12 98.96ZM131.92-247.69h480v-28.93q0-12.53-6.27-22.3-6.26-9.77-19.88-17.08-49.38-25.46-101.69-38.58-52.31-13.11-112.16-13.11-59.84 0-112.15 13.11-52.31 13.12-101.69 38.58-13.62 7.31-19.89 17.08-6.27 9.77-6.27 22.3v28.93Zm296.5-328.12q23.5-23.5 23.5-56.5t-23.5-56.5q-23.5-23.5-56.5-23.5t-56.5 23.5q-23.5 23.5-23.5 56.5t23.5 56.5q23.5 23.5 56.5 23.5t56.5-23.5Zm-56.5 328.12Zm0-384.62Z'/%3e%3c/svg%3e\",\n shieldPerson:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M387.62-487.62Q350-525.23 350-580q0-54.77 37.62-92.38Q425.23-710 480-710q54.77 0 92.38 37.62Q610-634.77 610-580q0 54.77-37.62 92.38Q534.77-450 480-450q-54.77 0-92.38-37.62Zm142.3-42.46Q550-550.15 550-580t-20.08-49.92Q509.85-650 480-650t-49.92 20.08Q410-609.85 410-580t20.08 49.92Q450.15-510 480-510t49.92-20.08ZM480-100.77q-129.77-35.39-214.88-152.77Q180-370.92 180-516v-230.15l300-112.31 300 112.31V-516q0 145.08-85.12 262.46Q609.77-136.16 480-100.77Zm0-378.85Zm0-315L240-705v189q0 57.08 16.35 110.39 16.34 53.3 45.42 99.46 40.46-20.62 84.73-32.23Q430.77-350 480-350t93.5 11.62q44.27 11.61 84.73 32.23 29.08-46.16 45.42-99.46Q720-458.92 720-516v-189l-240-89.62Zm-74.42 513q-35.73 8.39-67.5 23.54 29.77 33.08 65.5 57.2Q439.31-176.77 480-164q40.69-12.77 76.23-36.88 35.54-24.12 65.31-57.2-31.77-15.15-67.31-23.54Q518.69-290 480-290q-38.69 0-74.42 8.38Z'/%3e%3c/svg%3e\",\n settings:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m387.69-100-15.23-121.85q-16.07-5.38-32.96-15.07-16.88-9.7-30.19-20.77L196.46-210l-92.3-160 97.61-73.77q-1.38-8.92-1.96-17.92-.58-9-.58-17.93 0-8.53.58-17.34t1.96-19.27L104.16-590l92.3-159.23 112.46 47.31q14.47-11.46 30.89-20.96t32.27-15.27L387.69-860h184.62l15.23 122.23q18 6.54 32.57 15.27 14.58 8.73 29.43 20.58l114-47.31L855.84-590l-99.15 74.92q2.15 9.69 2.35 18.12.19 8.42.19 16.96 0 8.15-.39 16.58-.38 8.42-2.76 19.27L854.46-370l-92.31 160-112.61-48.08q-14.85 11.85-30.31 20.96-15.46 9.12-31.69 14.89L572.31-100H387.69ZM440-160h78.62L533-267.15q30.62-8 55.96-22.73 25.35-14.74 48.89-37.89L737.23-286l39.39-68-86.77-65.38q5-15.54 6.8-30.47 1.81-14.92 1.81-30.15 0-15.62-1.81-30.15-1.8-14.54-6.8-29.7L777.38-606 738-674l-100.54 42.38q-20.08-21.46-48.11-37.92-28.04-16.46-56.73-23.31L520-800h-79.38l-13.24 106.77q-30.61 7.23-56.53 22.15-25.93 14.93-49.47 38.46L222-674l-39.38 68L269-541.62q-5 14.24-7 29.62t-2 32.38q0 15.62 2 30.62 2 15 6.62 29.62l-86 65.38L222-286l99-42q22.77 23.38 48.69 38.31 25.93 14.92 57.31 22.92L440-160Zm40.46-200q49.92 0 84.96-35.04 35.04-35.04 35.04-84.96 0-49.92-35.04-84.96Q530.38-600 480.46-600q-50.54 0-85.27 35.04T360.46-480q0 49.92 34.73 84.96Q429.92-360 480.46-360ZM480-480Z'/%3e%3c/svg%3e\",\n notification:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M180-204.62v-59.99h72.31v-298.47q0-80.69 49.81-142.69 49.8-62 127.88-79.31V-810q0-20.83 14.57-35.42Q459.14-860 479.95-860q20.82 0 35.43 14.58Q530-830.83 530-810v24.92q78.08 17.31 127.88 79.31 49.81 62 49.81 142.69v298.47H780v59.99H180Zm300-293.07Zm-.07 405.38q-29.85 0-51.04-21.24-21.2-21.24-21.2-51.07h144.62q0 29.93-21.26 51.12-21.26 21.19-51.12 21.19Zm-167.62-172.3h335.38v-298.47q0-69.46-49.11-118.57-49.12-49.12-118.58-49.12-69.46 0-118.58 49.12-49.11 49.11-49.11 118.57v298.47Z'/%3e%3c/svg%3e\",\n favorite:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m480-146.93-44.15-39.69q-99.46-90.23-164.5-155.07-65.04-64.85-103.08-115.43-38.04-50.57-53.15-92.27Q100-591.08 100-634q0-85.15 57.42-142.58Q214.85-834 300-834q52.38 0 99 24.5t81 70.27q34.38-45.77 81-70.27 46.62-24.5 99-24.5 85.15 0 142.58 57.42Q860-719.15 860-634q0 42.92-15.12 84.61-15.11 41.7-53.15 92.27-38.04 50.58-102.89 115.43Q624-276.85 524.15-186.62L480-146.93Zm0-81.07q96-86.38 158-148.08 62-61.69 98-107.19t50-80.81q14-35.3 14-69.92 0-60-40-100t-100-40q-47.38 0-87.58 26.88-40.19 26.89-63.65 74.81h-57.54q-23.85-48.31-63.85-75Q347.38-774 300-774q-59.62 0-99.81 40Q160-694 160-634q0 34.62 14 69.92 14 35.31 50 80.81t98 107q62 61.5 158 148.27Zm0-273Z'/%3e%3c/svg%3e\",\n help: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M508.5-267.21q11.81-11.83 11.81-28.97 0-17.13-11.83-28.94-11.83-11.8-28.96-11.8-17.13 0-28.94 11.83-11.81 11.83-11.81 28.96 0 17.13 11.83 28.94 11.83 11.8 28.96 11.8 17.13 0 28.94-11.82Zm-57.27-131.41h56.31q.77-29.53 8.65-47.19 7.89-17.65 38.27-46.8 26.39-26.39 40.42-48.74 14.04-22.34 14.04-52.77 0-51.65-37.11-80.69-37.12-29.03-87.81-29.03-50.08 0-82.88 26.73-32.81 26.73-46.81 62.96l51.38 20.61q7.31-19.92 25-38.81 17.69-18.88 52.54-18.88 35.46 0 52.42 19.42 16.97 19.43 16.97 42.73 0 20.39-11.62 37.31-11.61 16.92-29.61 32.69-39.39 35.54-49.77 56.7-10.39 21.15-10.39 63.76ZM480.07-100q-78.84 0-148.21-29.92t-120.68-81.21q-51.31-51.29-81.25-120.63Q100-401.1 100-479.93q0-78.84 29.92-148.21t81.21-120.68q51.29-51.31 120.63-81.25Q401.1-860 479.93-860q78.84 0 148.21 29.92t120.68 81.21q51.31 51.29 81.25 120.63Q860-558.9 860-480.07q0 78.84-29.92 148.21t-81.21 120.68q-51.29 51.31-120.63 81.25Q558.9-100 480.07-100Zm-.07-60q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z'/%3e%3c/svg%3e\",\n calendar:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M212.31-100Q182-100 161-121q-21-21-21-51.31v-535.38Q140-738 161-759q21-21 51.31-21h55.38v-84.61h61.54V-780h303.08v-84.61h60V-780h55.38Q778-780 799-759q21 21 21 51.31v535.38Q820-142 799-121q-21 21-51.31 21H212.31Zm0-60h535.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-375.38H200v375.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85ZM200-607.69h560v-100q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H212.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v100Zm0 0V-720v112.31Zm280 210.77q-14.69 0-25.04-10.35-10.34-10.34-10.34-25.04 0-14.69 10.34-25.04 10.35-10.34 25.04-10.34t25.04 10.34q10.34 10.35 10.34 25.04 0 14.7-10.34 25.04-10.35 10.35-25.04 10.35Zm-185.04-10.35q-10.34-10.34-10.34-25.04 0-14.69 10.34-25.04 10.35-10.34 25.04-10.34t25.04 10.34q10.34 10.35 10.34 25.04 0 14.7-10.34 25.04-10.35 10.35-25.04 10.35t-25.04-10.35ZM640-396.92q-14.69 0-25.04-10.35-10.34-10.34-10.34-25.04 0-14.69 10.34-25.04 10.35-10.34 25.04-10.34t25.04 10.34q10.34 10.35 10.34 25.04 0 14.7-10.34 25.04-10.35 10.35-25.04 10.35ZM480-240q-14.69 0-25.04-10.35-10.34-10.34-10.34-25.03 0-14.7 10.34-25.04 10.35-10.35 25.04-10.35t25.04 10.35q10.34 10.34 10.34 25.04 0 14.69-10.34 25.03Q494.69-240 480-240Zm-185.04-10.35q-10.34-10.34-10.34-25.03 0-14.7 10.34-25.04 10.35-10.35 25.04-10.35t25.04 10.35q10.34 10.34 10.34 25.04 0 14.69-10.34 25.03Q334.69-240 320-240t-25.04-10.35ZM640-240q-14.69 0-25.04-10.35-10.34-10.34-10.34-25.03 0-14.7 10.34-25.04 10.35-10.35 25.04-10.35t25.04 10.35q10.34 10.34 10.34 25.04 0 14.69-10.34 25.03Q654.69-240 640-240Z'/%3e%3c/svg%3e\",\n clock:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m618.92-298.92 42.16-42.16L510-492.16V-680h-60v212.15l168.92 168.93ZM480.07-100q-78.84 0-148.21-29.92t-120.68-81.21q-51.31-51.29-81.25-120.63Q100-401.1 100-479.93q0-78.84 29.92-148.21t81.21-120.68q51.29-51.31 120.63-81.25Q401.1-860 479.93-860q78.84 0 148.21 29.92t120.68 81.21q51.31 51.29 81.25 120.63Q860-558.9 860-480.07q0 78.84-29.92 148.21t-81.21 120.68q-51.29 51.31-120.63 81.25Q558.9-100 480.07-100ZM480-480Zm0 320q133 0 226.5-93.5T800-480q0-133-93.5-226.5T480-800q-133 0-226.5 93.5T160-480q0 133 93.5 226.5T480-160Z'/%3e%3c/svg%3e\",\n mail: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M172.31-180Q142-180 121-201q-21-21-21-51.31v-455.38Q100-738 121-759q21-21 51.31-21h615.38Q818-780 839-759q21 21 21 51.31v455.38Q860-222 839-201q-21 21-51.31 21H172.31ZM480-457.69 160-662.31v410q0 5.39 3.46 8.85t8.85 3.46h615.38q5.39 0 8.85-3.46t3.46-8.85v-410L480-457.69Zm0-62.31 313.85-200h-627.7L480-520ZM160-662.31V-720v467.69q0 5.39 3.46 8.85t8.85 3.46H160v-422.31Z'/%3e%3c/svg%3e\",\n chat: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M250-410h300v-60H250v60Zm0-120h460v-60H250v60Zm0-120h460v-60H250v60ZM100-118.46v-669.23Q100-818 121-839q21-21 51.31-21h615.38Q818-860 839-839q21 21 21 51.31v455.38Q860-302 839-281q-21 21-51.31 21H241.54L100-118.46ZM216-320h571.69q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H172.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v523.08L216-320Zm-56 0v-480 480Z'/%3e%3c/svg%3e\",\n image:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M212.31-140Q182-140 161-161q-21-21-21-51.31v-535.38Q140-778 161-799q21-21 51.31-21h535.38Q778-820 799-799q21 21 21 51.31v535.38Q820-182 799-161q-21 21-51.31 21H212.31Zm0-60h535.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-535.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H212.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v535.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85ZM270-290h423.07L561.54-465.38 449.23-319.23l-80-102.31L270-290Zm-70 90v-560 560Z'/%3e%3c/svg%3e\",\n document:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M330-250h300v-60H330v60Zm0-160h300v-60H330v60Zm-77.69 310Q222-100 201-121q-21-21-21-51.31v-615.38Q180-818 201-839q21-21 51.31-21H570l210 210v477.69Q780-142 759-121q-21 21-51.31 21H252.31ZM540-620v-180H252.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v615.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h455.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46V-620H540ZM240-800v180-180V-160v-640Z'/%3e%3c/svg%3e\",\n payment:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M550-451.54q-41.92 0-70.96-29.04Q450-509.62 450-551.54q0-41.92 29.04-70.96 29.04-29.04 70.96-29.04 41.92 0 70.96 29.04Q650-593.46 650-551.54q0 41.92-29.04 70.96-29.04 29.04-70.96 29.04ZM286.15-327.69q-29.82 0-51.06-21.24-21.24-21.24-21.24-51.07v-303.08q0-29.82 21.24-51.06 21.24-21.24 51.06-21.24h527.69q29.83 0 51.07 21.24 21.24 21.24 21.24 51.06V-400q0 29.83-21.24 51.07-21.24 21.24-51.07 21.24H286.15Zm60-60h407.7q0-29.92 21.24-51.12Q796.33-460 826.15-460v-183.08q-29.92 0-51.11-21.24-21.19-21.24-21.19-51.06h-407.7q0 29.92-21.24 51.11-21.24 21.19-51.06 21.19V-460q29.92 0 51.11 21.24 21.19 21.24 21.19 51.07Zm420.77 200H146.16q-29.83 0-51.07-21.24Q73.85-230.17 73.85-260v-396.15h60V-260q0 4.61 3.84 8.46 3.85 3.85 8.47 3.85h620.76v60Zm-480.77-200h-12.3V-715.38h12.3q-5 0-8.65 3.65-3.65 3.65-3.65 8.65V-400q0 5 3.65 8.65 3.65 3.66 8.65 3.66Z'/%3e%3c/svg%3e\",\n bank: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M230-280v-300h60v300h-60Zm220 0v-300h60v300h-60ZM110.77-140v-60h738.46v60H110.77ZM670-280v-300h60v300h-60ZM110.77-660v-56.92L480-897.69l369.23 180.77V-660H110.77Zm141.84-60h454.78-454.78Zm0 0h454.78L480-830 252.61-720Z'/%3e%3c/svg%3e\",\n trendingUp:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M142.15-258.08 100-300.23l274.08-276.08 160 160 224.54-221.77H640v-60h220v220h-60v-117.84L534.08-330l-160-160-231.93 231.92Z'/%3e%3c/svg%3e\",\n extension:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M208.85-197.69h504.61q3.85 0 6.35-2.69 2.5-2.7 2.5-6.54v-176.31l36.92-15.85q18.31-6.84 29.54-23.53Q800-439.31 800-461.15q0-21.62-11.23-38.43t-29.54-24.04l-36.92-15.23v-176.53q0-4.24-2.5-6.74t-6.35-2.5H534.92l-7.3-51.07q-3.77-25.85-22.39-43.92-18.61-18.08-44.08-18.08-26.07 0-44.69 18.08-18.61 18.07-22.38 43.92l-7.31 51.07H208.46q-3.46 0-5.96 2.5t-2.5 6.74V-624q51.77 17.15 84.15 62.04 32.39 44.88 32.39 100.81 0 57.3-32.19 102.19-32.2 44.88-84.35 61.27v90.77q0 3.84 2.5 6.54 2.5 2.69 6.35 2.69Zm0 60q-29 0-48.93-20.12Q140-177.92 140-206.92V-347q48-1.54 82.27-33.58 34.27-32.04 34.27-80.57 0-45.62-34.46-78.12-34.46-32.5-82.08-36.42v-139.69q0-28.77 20.04-49t48.42-20.23h126.23q6.62-47.93 42.16-80.5 35.54-32.58 84.3-32.58 48.16 0 83.7 32.58 35.53 32.57 42.76 80.5h125.85q28.39 0 48.62 20.23 20.23 20.23 20.23 49v136.69q34.84 14.15 56.27 46.23Q860-500.38 860-461.15q0 39.07-21.42 70.96-21.43 31.88-56.27 46.57v136.7q0 29-20.23 49.11-20.23 20.12-48.62 20.12H208.85ZM500-461.15Z'/%3e%3c/svg%3e\",\n webhook:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M280-130q-78.77 0-134.38-55.62Q90-241.23 90-320q0-66.08 39.54-116.35 39.54-50.26 100.46-66.19v63q-35 14.31-57.5 46.85T150-320q0 53.85 38.08 91.92Q226.15-190 280-190t91.92-38.08Q410-266.15 410-320v-30h225.38q6.85-10.92 18.54-17.77 11.7-6.84 26.08-6.84 22.69 0 38.65 15.96 15.96 15.96 15.96 38.65 0 22.69-15.96 38.65-15.96 15.96-38.65 15.96-14.77 0-26.27-6.65T635.38-290H467.54q-11.69 71.31-65.04 115.65Q349.15-130 280-130Zm400 0q-49.08 0-89.96-22.89-40.88-22.88-67.27-61.72h81.61q15.16 11.53 34.85 18.07Q658.92-190 680-190q53.85 0 91.92-38.08Q810-266.15 810-320t-38.08-91.92Q733.85-450 680-450q-18.85 0-34.88 4.73-16.04 4.73-30.66 13.81l-117-194.93q-21-.53-36.54-15.57Q445.39-657 445.39-680q0-22.69 15.96-38.65 15.96-15.96 38.65-15.96 22.69 0 38.65 15.96 15.96 15.96 15.96 38.65 0 6.15-1.15 11.38-1.15 5.24-4.31 10.24L640-505.85q9.15-2 19.12-3.07Q669.08-510 680-510q78.77 0 134.38 55.62Q870-398.77 870-320t-55.62 134.38Q758.77-130 680-130ZM280-265.39q-22.69 0-38.65-15.96-15.96-15.96-15.96-38.65 0-21.23 14.57-36.85 14.58-15.61 36.89-16.76l98.23-163.31q-31.31-26.62-48.19-63.73Q310-637.77 310-680q0-78.77 55.62-134.38Q421.23-870 500-870t134.38 55.62Q690-758.77 690-680h-60q0-53.85-38.08-91.92Q553.85-810 500-810t-91.92 38.08Q370-733.85 370-680q0 42.62 24.08 75.5 24.07 32.88 63.3 46.89L328.54-342.62q3.15 5.39 4.61 10.93 1.46 5.54 1.46 11.69 0 22.69-15.96 38.65-15.96 15.96-38.65 15.96Z'/%3e%3c/svg%3e\",\n logout:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M212.31-140Q182-140 161-161q-21-21-21-51.31v-535.38Q140-778 161-799q21-21 51.31-21h268.07v60H212.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v535.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h268.07v60H212.31Zm436.92-169.23-41.54-43.39L705.08-450H363.85v-60h341.23l-97.39-97.38 41.54-43.39L820-480 649.23-309.23Z'/%3e%3c/svg%3e\",\n\n // Hand-authored: animated, no Material Symbols equivalent\n spinner:\n \"data:image/svg+xml;charset=UTF-8,%3csvg stroke='%23000' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg' %3e%3cstyle%3e .oui_spinner %7b transform-origin: center; animation: rotate_360 2s linear infinite;%7d .oui_spinner circle %7b stroke-linecap: round; animation: dash 1.5s ease-in-out infinite;%7d %40keyframes rotate_360 %7b 100%25 %7b transform: rotate(360deg);%7d %7d %40keyframes dash %7b 0%25 %7b stroke-dasharray: 0 150; stroke-dashoffset: 0;%7d 47.5%25 %7b stroke-dasharray: 42 150; stroke-dashoffset: -16;%7d 95%25, 100%25 %7b stroke-dasharray: 42 150; stroke-dashoffset: -59;%7d %7d %3c/style%3e%3cg class='oui_spinner'%3e%3ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3'%3e%3c/circle%3e%3c/g%3e%3c/svg%3e \",\n} satisfies Icons;\n\n/** Names guaranteed present on every theme. */\nexport type BaseIconName = keyof typeof BaseIcons;\n\n/**\n * An icon name. Autocompletes the built-in set while still allowing any name a\n * theme registers through `createTheme({ icons })`.\n */\nexport type IconName = BaseIconName | (string & {});\n","import type { ComponentThemes } from '../../component';\nimport { generatePalette, type PaletteConfig } from '../../color';\nimport type { GenerateColorsConfig } from '../../generation/palette.factory';\nimport { generateShadows } from '../../generation/shadow.generator';\nimport { BaseIcons } from '../../iconography/icon.records';\nimport type { TextRole, TextStyle } from '../../typography';\nimport type {\n Borders,\n Colors,\n Icons,\n Radii,\n Shadows,\n Spacing,\n Thicknesses,\n Typography,\n UniTheme,\n} from '../theme.model';\n\n// ==========================================\n// Type scale — the single source of type truth.\n// CSS-ready `typefaces` are derived from this on read (toTypefaces).\n// ==========================================\nconst BaseTypography: Typography = {\n 'display-large': {\n fontFamily: 'Red Hat Display',\n fontSize: 57,\n lineHeight: 64,\n fontWeight: 'normal',\n letterSpacing: -0.25,\n },\n 'display-medium': { fontFamily: 'Red Hat Display', fontSize: 45, lineHeight: 52, fontWeight: 'normal' },\n 'display-small': { fontFamily: 'Red Hat Display', fontSize: 36, lineHeight: 44, fontWeight: 'normal' },\n 'headline-large': { fontFamily: 'Red Hat Display', fontSize: 32, lineHeight: 40, fontWeight: 'normal' },\n 'headline-medium': { fontFamily: 'Red Hat Display', fontSize: 28, lineHeight: 36, fontWeight: 'normal' },\n 'headline-small': { fontFamily: 'Red Hat Display', fontSize: 24, lineHeight: 32, fontWeight: 'normal' },\n 'title-large': { fontFamily: 'Red Hat Display', fontSize: 22, lineHeight: 28, fontWeight: 'normal' },\n 'title-medium': {\n fontFamily: 'Red Hat Display',\n fontSize: 16,\n lineHeight: 24,\n fontWeight: 'medium',\n letterSpacing: 0.15,\n },\n 'title-small': {\n fontFamily: 'Red Hat Display',\n fontWeight: 'medium',\n fontSize: 14,\n lineHeight: 20,\n letterSpacing: 0.1,\n },\n 'body-1-long': { fontFamily: 'Roboto', fontSize: 16, lineHeight: 22 },\n 'body-1-short': { fontFamily: 'Roboto', fontSize: 16, lineHeight: 24 },\n 'body-2-long': { fontFamily: 'Roboto', fontSize: 14, lineHeight: 18 },\n 'body-2-short': { fontFamily: 'Roboto', fontSize: 14, lineHeight: 20 },\n 'subtitle-1': { fontFamily: 'Red Hat Display', fontSize: 16, lineHeight: 24, letterSpacing: 0.15 },\n 'subtitle-2': {\n fontFamily: 'Red Hat Display',\n fontSize: 14,\n lineHeight: 20,\n fontWeight: 'medium',\n letterSpacing: 0.1,\n },\n label: { fontFamily: 'Roboto', fontSize: 14, lineHeight: 20 },\n button: {\n fontFamily: 'Red Hat Display',\n fontSize: 14,\n lineHeight: 20,\n fontWeight: 'medium',\n textTransform: 'capitalize',\n },\n caption: { fontFamily: 'Roboto', fontSize: 12, lineHeight: 18, letterSpacing: 0.4 },\n overline: {\n fontFamily: 'Red Hat Display',\n fontSize: 10,\n lineHeight: 18,\n letterSpacing: 1.5,\n textTransform: 'uppercase',\n },\n paragraph: { fontFamily: 'Roboto', fontSize: 16, lineHeight: 24 },\n quote: { fontFamily: 'Roboto', fontSize: 16, lineHeight: 24 },\n note: { fontFamily: 'Roboto', fontSize: 14, lineHeight: 22, fontStyle: 'italic' },\n // Product-specific extras (were duplicated into `typefaces` before).\n badge: { fontFamily: 'Red Hat Display', fontSize: 16, lineHeight: 24 },\n // Stat-tile value: large, semibold, slightly tightened. Proportional\n // figures on purpose — tabular-nums is for columns, not display numbers.\n stat: {\n fontFamily: 'Red Hat Display',\n fontSize: 32,\n lineHeight: 38,\n fontWeight: 600,\n letterSpacing: -0.32,\n },\n tag: { fontFamily: 'Red Hat Display', fontSize: 15, lineHeight: 20, fontWeight: 600 },\n input: { fontFamily: 'Red Hat Display', fontSize: 14, lineHeight: 24 },\n} as Record<TextRole, TextStyle> & Record<string, TextStyle>;\n\n// ==========================================\n// Shared token scales — theme-agnostic.\n// ==========================================\nconst BaseShadows: Shadows = {\n raised:\n 'rgba(0, 0, 0, 0.2) 0px 2px 1px -1px, rgba(0, 0, 0, 0.14) 0px 1px 1px 0px, rgba(0, 0, 0, 0.12) 0px 1px 3px 0px',\n menu: 'rgba(0, 0, 0, 0.2) 0px 3px 3px -2px, rgba(0, 0, 0, 0.14) 0px 3px 4px 0px, rgba(0, 0, 0, 0.12) 0px 1px 8px 0px;',\n dialog:\n 'rgba(0, 0, 0, 0.2) 0px 3px 5px -1px, rgba(0, 0, 0, 0.14) 0px 6px 10px 0px, rgba(0, 0, 0, 0.12) 0px 1px 18px 0px',\n warn: '0 0 5px rgba(255, 0, 0, 0.5), inset 0 0 5px rgba(255, 0, 0, 0.3)',\n};\n\nconst BaseSpacing: Spacing = {\n // 0, not 'none': `padding: none` is invalid CSS and gets dropped, which let\n // user-agent defaults (e.g. <dialog>'s 1em padding) leak through the token.\n none: 0,\n xxs: '2px',\n xs: '4px',\n sm: '8px',\n md: '16px',\n lg: '32px',\n xl: '64px',\n};\n\nconst BaseThicknesses: Thicknesses = { thin: 1, standard: 2, thick: 4 };\n\nconst BaseRadii: Radii = {\n none: 'none',\n xxs: '4px',\n xs: '8px',\n sm: '16px',\n md: '24px',\n lg: '32px',\n max: '999px',\n};\n\n// ==========================================\n// Color-derived token builders — the reason a custom theme\n// only has to supply `colors`.\n// ==========================================\nconst buildBorders = (c: Colors): Borders => ({\n primary: `1px solid ${c.primary}`,\n secondary: `1px solid ${c.secondary}`,\n tertiary: `1px solid ${c.tertiary}`,\n quaternary: `1px solid ${c.quaternary}`,\n warn: `1px solid ${c.warn}`,\n success: `1px solid ${c.success}`,\n light: `1px solid ${c.outline}`,\n dark: `1px solid ${c['on-background']}`,\n dotted: `1px dotted ${c['on-background']}`,\n});\n\nconst buildComponents = (c: Colors): ComponentThemes => ({\n alert: {\n options: { topPosition: 40, borderRadius: 'sm', transitionSpeed: 0.35, elevation: 'md' },\n },\n // Trail typography, link/current colors, separator symbol and spacing are\n // tokens; the current page reads in the stronger ink.\n breadcrumb: {\n options: {\n typeface: 'label',\n color: 'on-background-variant',\n currentColor: 'on-background',\n separatorSymbol: 'chevron_right',\n gap: 'xs',\n },\n },\n // App shell: bar surface, divider, title type and spacing are all tokens.\n appBar: {\n options: {\n color: 'surface',\n height: 56,\n divider: 'light',\n typeface: 'title-large',\n padding: 'md',\n gap: 'md',\n elevation: undefined,\n },\n },\n // Navigation drawer: shares the dialog's native-<dialog> machinery in\n // 'over' mode (elevation + scrim backdrop); 'side' mode is an in-flow\n // aside separated by the divider border primitive.\n drawer: {\n options: {\n color: 'surface',\n width: 280,\n divider: 'light',\n elevation: 'menu',\n padding: 'md',\n backdrop: { background: 'rgba(0, 0, 0, 0.4)' },\n },\n },\n // Initials/icon avatars color from the role's container tokens; the radius\n // token makes them circles by default and squares under a 'sharp' theme.\n avatar: {\n options: { borderRadius: 'max', typeface: 'subtitle-2', fallbackSymbol: 'person' },\n variants: {\n primary: { backgroundColor: c['primary-container'], color: c['on-primary-container'] },\n secondary: { backgroundColor: c['secondary-container'], color: c['on-secondary-container'] },\n tertiary: { backgroundColor: c['tertiary-container'], color: c['on-tertiary-container'] },\n quaternary: { backgroundColor: c['surface-variant'], color: c['on-surface-variant'] },\n warn: { backgroundColor: c['warn-container'], color: c['on-warn-container'] },\n success: { backgroundColor: c['success-container'], color: c['on-success-container'] },\n },\n sizes: {\n sm: { height: 24, width: 24, fontSize: 10 },\n md: { height: 32, width: 32, fontSize: 13 },\n lg: { height: 40, width: 40, fontSize: 16 },\n xl: { height: 56, width: 56, fontSize: 22 },\n },\n },\n // Overlap is a spacing token; the ring separates stacked avatars using the\n // surface color so groups read on any background.\n avatarGroup: { options: { overlap: 'sm', ringColor: 'surface', ringWidth: 2 } },\n // Search field: chrome comes from the shared `input` options via\n // uni-input-box; these tokens style the affordances and suggestion list.\n searchInput: {\n options: {\n searchSymbol: 'search',\n clearSymbol: 'close',\n listColor: 'primary-surface',\n listShadow: 'menu',\n listBorderRadius: 'xs',\n maxSuggestions: 8,\n },\n },\n // Selection controls: chrome colors are tokens (accent fill/ring follows the\n // component's variant; its on-color pairs are derived in the component).\n checkbox: { options: { size: 20, boxColor: 'surface' } },\n radio: { options: { size: 20, ringColor: 'outline', fillColor: 'surface' } },\n dialog: {\n options: {\n borderRadius: 'lg',\n color: 'primary-surface',\n border: 'quaternary',\n padding: 'sm',\n elevation: 'dialog',\n backdrop: { background: 'rgba(255, 255, 255, 0.6)', backdropFilter: 'blur(2px)' },\n },\n },\n // Footer action row: every layout knob is a token so a theme can move from\n // the default centered pill pair to e.g. Carbon-style full-bleed halves\n // (stretch + reverseOrder + 'none' spacing) without touching the component.\n dialogButtons: {\n options: {\n gap: 'md',\n padding: 'md',\n paddingBottom: 'lg',\n justifyContent: 'center',\n confirmButtonVariant: 'primary',\n cancelButtonVariant: 'warn',\n buttonSize: 'lg',\n stretch: false,\n reverseOrder: false,\n },\n },\n dialogHeader: {\n options: {\n borderRadius: 'max',\n color: 'primary',\n height: 48,\n textRole: 'title-large',\n textAlign: 'center',\n closeButtonIcon: 'close',\n closeButtonSize: 'md',\n },\n },\n dropdown: {\n options: { border: 'none', borderRadius: 'xxs', color: 'primary-surface', shadow: 'menu' },\n },\n footer: { options: { height: 52, color: 'primary', logoHeight: 18.6, logoPadding: 'md' } },\n input: {\n options: {\n typeFace: 'input',\n color: 'primary-surface',\n textColor: 'on-primary-surface',\n disabledColor: 'disabled-surface',\n disabledTextColor: 'on-disabled-surface',\n border: 'light',\n borderRadius: 'xs',\n errorShadow: 'warn',\n errorBorder: 'warn',\n height: 32,\n paddingLeft: 'sm',\n focusOutline: `2px solid ${c.primary}`,\n focusOutlineOffset: 2,\n },\n },\n // Field chrome (color/border/typeface/focus) comes from the shared `input`\n // options via uni-input-box; these are the textarea-specific behaviors.\n textarea: { options: { rows: 3, resize: 'vertical' } },\n // Every visual knob is a token, so a theme can turn the default underline\n // tabs into pills (borderRadius 'max' + activeColor) or restyle the\n // indicator without touching component code.\n tabs: {\n options: {\n typeface: 'title-small',\n textColor: 'on-surface-variant',\n activeTextColor: 'primary',\n indicatorColor: 'primary',\n indicatorThickness: 'standard',\n divider: 'light',\n gap: 'sm',\n borderRadius: 'none',\n padding: 'md',\n activeColor: undefined,\n },\n },\n multiSelectDropdown: {\n options: {\n textRole: 'input',\n textColor: 'on-primary-surface',\n dividerBorder: 'light',\n searchInputBorder: 'light',\n searchInputBorderRadius: 'xxs',\n focusOutline: `2px solid ${c.primary}`,\n focusOutlineOffset: 2,\n },\n },\n badge: { options: { borderRadius: 'xxs' } },\n\n // ---- Buttons: variants are structural archetypes with interaction states ----\n button: {\n // Radius and typeface are tokens, not baked values: `max` renders the\n // classic pill and the type scale's `button` role carries the label\n // typography, so shape languages, custom radii, and typography edits\n // restyle every button by re-pointing or redefining a token.\n options: { borderRadius: 'max', typeface: 'button' },\n fixed: {\n position: 'relative',\n overflow: 'hidden',\n outline: '0',\n border: '0',\n cursor: 'pointer',\n transition: 'all 0.28s ease',\n },\n variants: {\n ghost: {\n backgroundColor: 'transparent',\n color: 'currentcolor',\n '&:hover': { backgroundColor: 'rgba(0,0,0,0.06)' },\n },\n // Solid\n primary: {\n backgroundColor: c.primary,\n color: c['on-primary'],\n border: '0',\n '&:hover': { filter: 'brightness(0.92)' },\n },\n // Hollow\n secondary: {\n backgroundColor: 'transparent',\n color: c.secondary,\n border: `1px solid ${c.secondary}`,\n '&:hover': { backgroundColor: c.secondary, color: c['on-secondary'] },\n },\n // Solid\n tertiary: {\n backgroundColor: c.tertiary,\n color: c['on-tertiary'],\n border: '0',\n '&:hover': { filter: 'brightness(0.92)' },\n },\n warn: {\n backgroundColor: c.warn,\n color: c['on-warn'],\n border: '0',\n '&:hover': { filter: 'brightness(0.92)' },\n },\n success: {\n backgroundColor: c.success,\n color: c['on-success'],\n border: '0',\n '&:hover': { filter: 'brightness(0.92)' },\n },\n disabled: {\n backgroundColor: `${c.disabled} !important`,\n color: `${c['on-disabled']} !important`,\n border: '0',\n },\n },\n // Sizes are geometry only (height/padding/fontSize); families, weights and\n // transforms come from the `typeface` option's type-scale role.\n sizes: {\n sm: { height: 22, fontSize: 12, padding: '0 12px', fontWeight: 600 },\n md: { height: 26, fontSize: 16, padding: '0 16px' },\n lg: { height: 36, fontSize: 18, padding: '0 18px' },\n xl: { height: 48, fontSize: 24, padding: '0 22px' },\n },\n },\n iconButton: {\n options: { borderRadius: 'max' },\n variants: {\n ghost: { backgroundColor: 'transparent', color: 'currentcolor' },\n primary: { backgroundColor: c.primary, color: c['on-primary'] },\n secondary: { backgroundColor: c.secondary, color: c['on-secondary'] },\n tertiary: { backgroundColor: c.tertiary, color: c['on-tertiary'] },\n warn: { backgroundColor: c.warn, color: c['on-warn'] },\n success: { backgroundColor: c.success, color: c['on-success'] },\n disabled: {\n backgroundColor: 'transparent !important',\n color: `${c['on-disabled']} !important`,\n },\n },\n sizes: {\n sm: { height: 22, minHeight: 22, width: 22, minWidth: 22, fontSize: 18 },\n md: { height: 26, minHeight: 26, width: 26, minWidth: 26, fontSize: 22 },\n lg: { height: 36, minHeight: 36, width: 36, minWidth: 36, fontSize: 30 },\n xl: { height: 40, minHeight: 40, width: 40, minWidth: 40, fontSize: 34 },\n },\n },\n progressGauge: {\n fixed: { textFill: c['on-background'] },\n // Track = the role's container token (the palette's soft tint of that\n // role), arc = the role base — so gauges follow any brand palette instead\n // of the fixed pastels they used to hardcode.\n variants: {\n primary: { backgroundColor: c['primary-container'], color: c.primary },\n secondary: { backgroundColor: c['secondary-container'], color: c.secondary },\n tertiary: { backgroundColor: c['tertiary-container'], color: c.tertiary },\n warn: { backgroundColor: c['warn-container'], color: c.warn },\n success: { backgroundColor: c['success-container'], color: c.success },\n },\n sizes: {\n sm: { height: '54px' },\n md: { height: '68px' },\n lg: { height: '82px' },\n xl: { height: '104px' },\n },\n },\n card: {\n // The frame is tokens: the border primitive named by the active variant\n // (borders.primary … borders.success — override with `border` to pin all\n // cards to one primitive, e.g. a custom 'brush-stroke'), the radii scale\n // (`xs` = the classic 8px), and an optional elevation shadow.\n options: { borderRadius: 'xs' },\n fixed: { overflow: 'hidden', backgroundColor: c.background },\n },\n cardHeader: {\n fixed: { padding: '12px 24px' },\n variants: {\n primary: { backgroundColor: c.primary, color: c['on-primary'] },\n secondary: { backgroundColor: c.secondary, color: c['on-secondary'] },\n tertiary: { backgroundColor: c.tertiary, color: c['on-tertiary'] },\n warn: { backgroundColor: c.warn, color: c['on-warn'] },\n success: { backgroundColor: c.success, color: c['on-success'] },\n },\n },\n cardContent: { fixed: { padding: '12px 24px' } },\n dataSearch: {\n options: {\n border: 'light',\n borderRadius: 'xs',\n color: 'primary-surface',\n placeholderColor: 'disabled',\n },\n },\n dataTable: {\n options: {\n color: 'primary-surface',\n border: 'light',\n borderRadius: 'sm',\n elevation: undefined,\n headerPadding: 'sm',\n footerPadding: 'sm',\n thTextRole: 'headline-small',\n thColor: 'primary-container',\n thVerticalBorder: 'dotted',\n thHorizontalBorder: 'light',\n thPadding: 'sm',\n tdTextRole: 'title-small',\n tdColor: 'primary-surface',\n tdStickyColor: 'primary-container',\n tdPadding: 'sm',\n tdVerticalBorder: 'dotted',\n tdHorizontalBorder: 'light',\n rowHoverColor: 'primary-container',\n loadingOverlayColor: 'scrim',\n loadingSpinnerColor: 'primary',\n loadingSpinnerSize: 40,\n },\n },\n notificationBadge: { options: { borderRadius: 'sm', offset: -10 } },\n paginator: {\n options: {\n gap: 'xs',\n textRole: 'label',\n inputBorder: 'light',\n inputBorderRadius: 'xs',\n pageBorderRadius: 'xs',\n currentPageBorder: 'light',\n currentPageBorderRadius: 'xs',\n },\n },\n // KPI tile: card-recipe frame, muted label over a large `stat`-role value;\n // delta inks are the semantic success/error (direction × goodness decided\n // by the component); sparkline in the outline hue, endpoint in the accent.\n stat: {\n options: {\n labelTypeface: 'label',\n valueTypeface: 'stat',\n color: 'surface',\n border: 'light',\n borderRadius: 'xs',\n positiveColor: 'success',\n negativeColor: 'error',\n trendColor: 'outline',\n trendAccent: 'primary',\n padding: 'md',\n gap: 'xxs',\n },\n },\n // Range input: fill/thumb in the accent, track in the muted surface, both\n // radius-tokened — geometry knobs are plain numbers.\n slider: {\n options: {\n color: 'primary',\n trackColor: 'surface-variant',\n borderRadius: 'max',\n trackHeight: 4,\n thumbSize: 16,\n },\n },\n // Loading placeholders paint with surface tokens so they sit naturally on\n // any theme; the shimmer highlight sweeps in the lighter surface color.\n skeleton: {\n options: {\n color: 'surface-variant',\n highlightColor: 'surface',\n borderRadius: 'xs',\n animation: 'shimmer',\n duration: 1.4,\n gap: 'sm',\n },\n },\n snackbar: {\n options: { bottomPosition: 40, transitionDelay: '0.35s', autoCloseDelay: 35000 },\n },\n symbol: { options: { fill: 0, weight: 400, grade: 0, opticalSize: 24 } },\n toggle: { options: { size: 20, trackColor: 'surface-variant', knobColor: 'surface' } },\n tooltip: {\n options: {\n border: undefined,\n borderRadius: 'xs',\n shadow: 'raised',\n color: 'inverse-surface',\n typeface: 'label',\n },\n },\n});\n\n// ==========================================\n// Theme factory. A custom theme = a name + a `colors` map.\n// Everything color-dependent (borders, component variants) is derived;\n// `borders`/`components` overrides deep-merge over the derived defaults, so a\n// theme file can define its own named primitives and rewire per-component\n// options without restating anything it doesn't touch.\n// ==========================================\nexport interface ThemeConfig {\n id: string;\n name: string;\n colors: Colors;\n /**\n * Named icon primitives (inline SVG data URIs, masked with `currentColor`),\n * merged over {@link BaseIcons}. Add or override under any name; components\n * render them by token via the icon component, never by inlining SVG.\n */\n icons?: Icons;\n /** Override the radii scale, e.g. a generated shape-language preset. */\n radii?: Radii;\n /** Override the elevation shadows, e.g. brand-tinted generated stacks. */\n shadows?: Shadows;\n /**\n * Named border primitives, merged over the derived defaults. New tokens may\n * use any name — point component options (or `components` overrides) at\n * them and every consumer of the shared token picks up the change.\n */\n borders?: Borders;\n /**\n * Sparse per-component overrides, deep-merged over the derived component\n * themes: only the sections you provide (fixed/variants/sizes/options keys)\n * are replaced; everything else keeps tracking the library defaults.\n */\n components?: ComponentThemes;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst deepMerge = <T>(base: T, override: Partial<T> | undefined): T => {\n if (!override) return base;\n const out = { ...base } as Record<string, unknown>;\n for (const [key, value] of Object.entries(override)) {\n out[key] = isRecord(value) && isRecord(out[key]) ? deepMerge(out[key], value) : value;\n }\n return out as T;\n};\n\nexport const createTheme = ({\n id,\n name,\n colors,\n icons = {},\n radii = BaseRadii,\n shadows = BaseShadows,\n borders,\n components,\n}: ThemeConfig): UniTheme => ({\n id,\n name,\n colors,\n typography: BaseTypography,\n borders: deepMerge(buildBorders(colors), borders),\n radii,\n shadows,\n spacing: BaseSpacing,\n thicknesses: BaseThicknesses,\n icons: { ...BaseIcons, ...icons },\n components: deepMerge(buildComponents(colors), components),\n});\n\n/**\n * Build a full {@link UniTheme} straight from a {@link PaletteConfig} — the\n * one-call path a theme builder uses to turn a brand color (or a seed +\n * scheme + category) into a complete, ready-to-apply theme.\n */\nexport const createThemeFromPalette = (\n config: GenerateColorsConfig & { id?: string; name?: string; icons?: Icons; radii?: Radii }\n): UniTheme => {\n const colors = generatePalette(config);\n return createTheme({\n id: config.id ?? 'CustomTheme',\n name: config.name ?? 'Custom Theme',\n colors,\n radii: config.radii,\n shadows: generateShadows(colors, config.mode ?? 'light'),\n icons: config.icons,\n });\n};\n\n/**\n * Seed for the shipped Light/Dark themes. Swap these three values (or call\n * `generatePalette` with your own) to reskin the entire system — every color\n * token is derived, so there is nothing else to hand-author.\n */\nexport const BASE_PALETTE_CONFIG: Pick<PaletteConfig, 'seed' | 'scheme' | 'category'> = {\n seed: '#4F46E5', // indigo\n scheme: 'triadic',\n category: 'neutral',\n};\n\nexport const lightColors: Colors = generatePalette({ ...BASE_PALETTE_CONFIG, mode: 'light' });\n\nexport const BaseTheme: UniTheme = createTheme({\n id: 'BaseTheme',\n name: 'Base Theme',\n colors: lightColors,\n});\n","import type { ColorCategory, ColorScheme } from '../color/color.types';\nimport type { Radii, UniTheme } from '../theme/theme.model';\nimport type { BrandRole } from '../color/color.factory';\nimport { createTheme } from '../theme/themes/base.theme';\nimport { hexToOklch, oklchToHex } from './oklch.helper';\nimport { CategoryChroma, generateColors } from './palette.factory';\nimport { generateShadows } from './shadow.generator';\nimport type {\n ContrastCheck,\n GeneratedThemeConfig,\n GenerationInput,\n ThemeShape,\n} from './generation.types';\n\n/** Radii presets per shape language (PRD §3.5.A). Same keys as `BaseRadii`. */\nexport const ShapeRadii: Record<ThemeShape, Radii> = {\n sharp: { none: 'none', xxs: '0px', xs: '0px', sm: '0px', md: '0px', lg: '0px', max: '0px' },\n modern: { none: 'none', xxs: '4px', xs: '8px', sm: '16px', md: '24px', lg: '32px', max: '999px' },\n playful: { none: 'none', xxs: '8px', xs: '16px', sm: '24px', md: '32px', lg: '48px', max: '9999px' },\n};\n\n/** Shortest angular distance between two hue angles, in degrees (0–180). */\nconst hueDistance = (a: number, b: number): number => {\n const d = Math.abs(a - b) % 360;\n return d > 180 ? 360 - d : d;\n};\n\n/**\n * Classify 2–3 brand hues against {@link ColorScheme} by their angular\n * distances from the primary hue. Heuristic bands, widest match wins.\n */\nexport const classifyScheme = (primaryHue: number, otherHues: number[]): ColorScheme => {\n const distances = otherHues.map((h) => hueDistance(primaryHue, h));\n if (distances.length === 0) return 'analogous';\n if (distances.every((d) => d < 15)) return 'monochromatic';\n if (distances.every((d) => d <= 65)) return 'analogous';\n if (distances.some((d) => d >= 165)) return 'complimentary';\n if (distances.length > 1 && distances.every((d) => d >= 130)) return 'splitComplimentary';\n return 'triadic';\n};\n\n/**\n * Infer a tonal category from the seed's own chroma, so an unstated \"vibe\"\n * preserves the brand's character — vivid stays vivid, muted stays muted.\n */\nexport const inferCategory = (seedHex: string): ColorCategory => {\n const { c } = hexToOklch(seedHex);\n if (c >= 0.13) return 'jewel';\n if (c >= 0.07) return 'earth';\n if (c >= 0.03) return 'pastel';\n return 'neutral';\n};\n\n/**\n * The theme generation engine (PRD §3.3): brand seed(s) in, complete WCAG-AA\n * light+dark {@link Colors} pair out, with a machine-readable contrast report.\n * Pure and deterministic — identical input yields identical output.\n */\nexport const generateThemes = (input: GenerationInput): GeneratedThemeConfig => {\n const seeds = (Array.isArray(input.seed) ? input.seed : [input.seed]).slice(0, 3);\n const [primary, secondary, tertiary] = seeds;\n const scheme =\n input.scheme ??\n (seeds.length > 1\n ? classifyScheme(hexToOklch(primary).h, seeds.slice(1).map((s) => hexToOklch(s).h))\n : 'analogous');\n const category = input.vibe ?? inferCategory(primary);\n\n // Seeds pass through as soft targets with their own chroma (brand fidelity).\n // Only an *explicit* vibe caps them to the category's chroma ceiling.\n const applyVibe = (hex: string): string => {\n if (!input.vibe) return hex;\n const color = hexToOklch(hex);\n return oklchToHex({ ...color, c: Math.min(color.c, CategoryChroma[input.vibe]) });\n };\n const targets: Partial<Record<BrandRole, string>> = { primary: applyVibe(primary) };\n if (secondary) targets.secondary = applyVibe(secondary);\n if (tertiary) targets.tertiary = applyVibe(tertiary);\n\n const checks: ContrastCheck[] = [];\n const base = { seed: primary, scheme, category, targets, checks };\n const lightColors = generateColors({ ...base, mode: 'light' });\n const darkColors = generateColors({ ...base, mode: 'dark' });\n\n const worstRatio = checks.reduce((worst, check) => Math.min(worst, check.ratio), 21);\n return {\n lightColors,\n darkColors,\n radii: input.shape ? ShapeRadii[input.shape] : undefined,\n lightShadows: generateShadows(lightColors, 'light'),\n darkShadows: generateShadows(darkColors, 'dark'),\n report: { checks, worstRatio, pass: checks.every((check) => check.pass) },\n };\n};\n\n/**\n * Convenience wrapper: {@link generateThemes} piped through `createTheme()`,\n * returning a registration-ready light/dark {@link UniTheme} pair.\n */\nexport const generateUniThemes = (input: GenerationInput): { light: UniTheme; dark: UniTheme } => {\n const { lightColors, darkColors, radii, lightShadows, darkShadows } = generateThemes(input);\n const name = input.name ?? 'Brand';\n const id = name.replace(/\\W+/g, '') || 'Brand';\n return {\n light: createTheme({\n id: `${id}Light`,\n name: `${name} Light`,\n colors: lightColors,\n radii,\n shadows: lightShadows,\n }),\n dark: createTheme({\n id: `${id}Dark`,\n name: `${name} Dark`,\n colors: darkColors,\n radii,\n shadows: darkShadows,\n }),\n };\n};\n","import type { Colors, Shadows } from '../theme/theme.model';\nimport { generateThemes } from './theme.generator';\nimport type { ContrastReport, GenerationInput } from './generation.types';\n\nexport interface ThemeFileInput extends GenerationInput {\n /** Emit the dark theme alongside the light one. Defaults to true. */\n darkMode?: boolean;\n}\n\n/** A rendered static theme file plus everything a consumer needs to wire it. */\nexport interface EmittedThemeFile {\n /** TypeScript source for a static `uni-theme.ts` — plain, reviewable data. */\n content: string;\n /** Registration snippet for the consumer's `app.config.ts`. */\n providerSnippet: string;\n report: ContrastReport;\n /** One-line human summary of the contrast report. */\n reportSummary: string;\n}\n\nconst IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\nconst asKey = (k: string): string => (IDENT.test(k) ? k : `'${k}'`);\n\nconst recordLiteral = (record: Record<string, string | undefined>, indent: string): string =>\n Object.entries(record)\n .map(([k, v]) => `${indent}${asKey(k)}: '${v}',`)\n .join('\\n');\n\n// The derived border primitives, spelled out as template literals over the\n// colors const — visible, editable, and edits to a color propagate. Access is\n// bracket-only: `Colors` carries an index signature, and consumer tsconfigs\n// with `noPropertyAccessFromIndexSignature` (ng new strict default) reject\n// dot access on it.\nconst bordersLiteral = (): string =>\n [\n '/**',\n ' * Named border primitives. These mirror the derived defaults — edit them, or',\n ' * add your own under any token name and point component options (or the',\n ' * `components` overrides below) at it. Every component deriving from a',\n ' * shared token picks up the change.',\n ' */',\n 'const borders = (colors: Colors): Borders => ({',\n \" primary: `1px solid ${colors['primary']}`,\",\n \" secondary: `1px solid ${colors['secondary']}`,\",\n \" tertiary: `1px solid ${colors['tertiary']}`,\",\n \" quaternary: `1px solid ${colors['quaternary']}`,\",\n \" warn: `1px solid ${colors['warn']}`,\",\n \" success: `1px solid ${colors['success']}`,\",\n \" light: `1px solid ${colors['outline']}`,\",\n \" dark: `1px solid ${colors['on-background']}`,\",\n \" dotted: `1px dotted ${colors['on-background']}`,\",\n '});',\n ].join('\\n');\n\nconst themeExport = (\n exportName: string,\n displayName: string,\n colorsConst: string,\n shadowsConst: string,\n radii: boolean\n): string =>\n [\n `export const ${exportName}: UniTheme = createTheme({`,\n ` id: '${exportName}',`,\n ` name: '${displayName}',`,\n ` colors: ${colorsConst},`,\n ` borders: borders(${colorsConst}),`,\n ` components: components(${colorsConst}),`,\n ` shadows: ${shadowsConst},`,\n ' icons,',\n ...(radii ? [' radii,'] : []),\n '});',\n ].join('\\n');\n\n/**\n * Render a static `uni-theme.ts` from a brand seed — the file the `ng add`\n * schematic writes and the MCP `generate_uni_theme` tool returns.\n *\n * The file is the system's **source of truth**: literal colors, the border\n * primitives spelled out, and a sparse `components` override section — so a\n * human (or an AI agent) can retheme by editing tokens in place, with no\n * runtime generation. Deterministic: same input, same file.\n */\nexport const emitThemeFile = (input: ThemeFileInput): EmittedThemeFile => {\n const { darkMode = true, name = 'Brand' } = input;\n const { lightColors, darkColors, radii, lightShadows, darkShadows, report } =\n generateThemes(input);\n const id = (name.replace(/\\W+/g, '') || 'Brand') as string;\n\n const seeds = Array.isArray(input.seed) ? input.seed : [input.seed];\n const regenerate = [\n `--brand=${seeds.join(',')}`,\n input.vibe && `--vibe=${input.vibe}`,\n input.scheme && `--scheme=${input.scheme}`,\n input.shape && `--shape=${input.shape}`,\n !darkMode && '--dark-mode=false',\n ]\n .filter(Boolean)\n .join(' ');\n\n const reportSummary = `${report.checks.length} contrast pairs checked · worst ${report.worstRatio}:1 · ${\n report.pass ? 'all AA' : `${report.checks.filter((c) => !c.pass).length} failing`\n }`;\n\n const modes: {\n exportName: string;\n displayName: string;\n colorsConst: string;\n colors: Colors;\n shadowsConst: string;\n shadows: Shadows;\n }[] = [\n {\n exportName: `${id}Light`,\n displayName: `${name} Light`,\n colorsConst: 'lightColors',\n colors: lightColors,\n shadowsConst: 'lightShadows',\n shadows: lightShadows,\n },\n ...(darkMode\n ? [\n {\n exportName: `${id}Dark`,\n displayName: `${name} Dark`,\n colorsConst: 'darkColors',\n colors: darkColors,\n shadowsConst: 'darkShadows',\n shadows: darkShadows,\n },\n ]\n : []),\n ];\n\n const content = [\n '/**',\n ` * ${name} theme for Uni — generated data, yours to edit.`,\n ' *',\n ` * Regenerate colors: ng add @uni-design-system/uni-angular ${regenerate}`,\n ' * (or the `generate-uni-theme` MCP tool). Edits are never overwritten silently —',\n ' * regeneration rewrites this file, so commit before regenerating.',\n ` * ${reportSummary}.`,\n ' */',\n 'import {',\n ' createTheme,',\n ' type Borders,',\n ' type Colors,',\n ' type ComponentThemes,',\n ' type Icons,',\n ' type Shadows,',\n ' type UniTheme,',\n \"} from '@uni-design-system/uni-core';\",\n '',\n ...modes.map(\n ({ colorsConst, colors }) =>\n `const ${colorsConst}: Colors = {\\n${recordLiteral(colors as Record<string, string>, ' ')}\\n};\\n`\n ),\n '/** Brand-tinted elevation shadows — theme-scoped, edit freely. */',\n ...modes.map(\n ({ shadowsConst, shadows }) =>\n `const ${shadowsConst}: Shadows = {\\n${recordLiteral(shadows as Record<string, string>, ' ')}\\n};\\n`\n ),\n bordersLiteral(),\n '',\n '/**',\n ' * Sparse component overrides, deep-merged over Uni component defaults: only',\n ' * what you write here changes. Point components at your own primitives, e.g.:',\n \" * button: { variants: { secondary: { border: `2px dashed ${colors['tertiary']}` } } },\",\n \" * input: { options: { borderRadius: 'max' } },\",\n ' */',\n 'const components = (colors: Colors): ComponentThemes => ({});',\n '',\n '/**',\n ' * Icon primitives, merged over the built-in 61-icon set per name: reuse a',\n ' * built-in name to reskin it, or add any new name. Define an icon ONCE here',\n \" * and render it anywhere via `<uni-icon name='…'/>` — never inline SVG in\",\n ' * components.',\n ' *',\n ' * Encode your own SVGs with `svgToIconUri` rather than by hand — it strips',\n ' * fixed width/height, escapes the URI and rejects artwork that cannot',\n ' * survive masking:',\n ' *',\n \" * import { svgToIconUri } from '@uni-design-system/uni-core';\",\n \" * const icons: Icons = { logo: svgToIconUri(readFileSync('logo.svg', 'utf8')) };\",\n ' *',\n ' * Icons are masked with currentColor, so they recolor with the theme — but',\n ' * that also means they are MONOCHROME: the mask uses the alpha channel, so a',\n ' * multi-color mark flattens to its silhouette. Keep one grid (viewBox) across',\n ' * your set, or the glyphs will not share an optical weight.',\n ' */',\n 'const icons: Icons = {};',\n '',\n ...(radii\n ? [\n `/** Shape language: '${input.shape}'. */`,\n `const radii = {\\n${recordLiteral(radii as Record<string, string>, ' ')}\\n};`,\n '',\n ]\n : []),\n ...modes.map(\n ({ exportName, displayName, colorsConst, shadowsConst }) =>\n `${themeExport(exportName, displayName, colorsConst, shadowsConst, !!radii)}\\n`\n ),\n '/** First key wins as the default theme when registered via UNI_THEMES. */',\n `export const ${id}Themes = { ${modes.map((m) => m.exportName).join(', ')} };`,\n '',\n ].join('\\n');\n\n const providerSnippet = [\n `import { UNI_THEMES } from '@uni-design-system/uni-angular';`,\n `import { ${id}Themes } from './uni-theme';`,\n '',\n '// app.config.ts → providers:',\n `{ provide: UNI_THEMES, useValue: ${id}Themes },`,\n ].join('\\n');\n\n return { content, providerSnippet, report, reportSummary };\n};\n","import { Gradient } from './gradient.model';\n\nexport function gradient(config: Gradient): string {\n return ``;\n}\n","/**\n * Turns a raw SVG source string into an icon primitive — the inline data URI\n * form `uni-icon` renders as a CSS mask over `currentColor`.\n *\n * This is the path for bringing your own icons (a brand set, a designer\n * handoff) into a theme. The built-in `BaseIcons` are generated separately\n * from Material Symbols; everything you add goes through here:\n *\n * ```ts\n * const icons: Icons = {\n * acmeLogo: svgToIconUri(readFileSync('brand/logo.svg', 'utf8')),\n * search: svgToIconUri(readFileSync('brand/search.svg', 'utf8')),\n * };\n * createTheme({ id: 'Acme', name: 'Acme', colors, icons });\n * ```\n *\n * `createTheme` merges these over `BaseIcons` per name, so reusing a built-in\n * name reskins it and any new name is simply added.\n */\n\nexport interface SvgToIconUriOptions {\n /**\n * Accept an SVG that paints in more than one color. Masks are monochrome —\n * the artwork is flattened to its silhouette and takes `currentColor` — so\n * this is rejected by default to catch logos that were never going to\n * survive the pipeline. Set this when a silhouette is what you want.\n */\n allowMultiColor?: boolean;\n /** Name used in error messages, so a failing icon in a set is identifiable. */\n name?: string;\n}\n\n/** Paint values that produce no pixels, and so never count as a color. */\nconst BLANK_PAINT = new Set(['none', 'transparent', 'inherit', '']);\n\n/** Collect every distinct paint value the artwork actually renders with. */\nfunction paintValues(svg: string): string[] {\n const found = new Set<string>();\n\n for (const [, value] of svg.matchAll(/\\b(?:fill|stroke)\\s*=\\s*[\"']([^\"']*)[\"']/g)) {\n const paint = value.trim().toLowerCase();\n if (!BLANK_PAINT.has(paint)) found.add(paint);\n }\n // `style=\"fill:#fff\"` — same meaning, different syntax.\n for (const [, , value] of svg.matchAll(/\\b(fill|stroke)\\s*:\\s*([^;\"'}]+)/g)) {\n const paint = value.trim().toLowerCase();\n if (!BLANK_PAINT.has(paint)) found.add(paint);\n }\n\n return [...found];\n}\n\n/**\n * Strip everything that stops an SVG scaling to the box it is masked into, and\n * collapse it to one line. Fixed `width`/`height` are removed rather than\n * rejected — designers export them by default and they carry no information\n * the `viewBox` doesn't already have.\n */\nfunction normalize(svg: string): string {\n return svg\n .replace(/<\\?xml[^>]*\\?>/g, '')\n .replace(/<!DOCTYPE[^>]*>/gi, '')\n .replace(/<!--[\\s\\S]*?-->/g, '')\n .replace(/\\s(width|height)\\s*=\\s*[\"'][^\"']*[\"']/g, '')\n .replace(/\\s+/g, ' ')\n .replace(/>\\s+</g, '><')\n .trim();\n}\n\n/**\n * Percent-encode only what a data URI requires. SVG attributes are switched to\n * single quotes so the result drops straight into a double-quoted TypeScript\n * string with no escaping — and stays readable, unlike base64.\n */\nfunction encode(svg: string): string {\n return (\n 'data:image/svg+xml,' +\n svg\n .replace(/\"/g, \"'\")\n .replace(/%/g, '%25')\n .replace(/#/g, '%23')\n .replace(/</g, '%3c')\n .replace(/>/g, '%3e')\n );\n}\n\n/**\n * Encode an SVG string as a mask-ready icon data URI, validating that it will\n * actually survive the mask pipeline.\n *\n * Throws when the source is not a complete `<svg>` document, has no `viewBox`\n * (it could not scale), references an external or raster image, or paints in\n * more than one color (see {@link SvgToIconUriOptions.allowMultiColor}).\n */\nexport function svgToIconUri(svg: string, options: SvgToIconUriOptions = {}): string {\n const label = options.name ? `${options.name}: ` : '';\n const fail = (message: string): never => {\n throw new Error(`${label}${message}`);\n };\n\n if (typeof svg !== 'string' || !svg.trim()) fail('empty SVG source');\n\n const normalized = normalize(svg);\n\n if (!/^<svg[\\s>]/i.test(normalized) || !/<\\/svg>$/i.test(normalized)) {\n fail('not a complete <svg> document');\n }\n\n // Without a viewBox the mask has no intrinsic ratio to scale by, and\n // `uni-icon` sizes itself from its container.\n if (!/\\bviewBox\\s*=\\s*[\"'][^\"']+[\"']/i.test(normalized)) {\n fail('no viewBox — the icon could not scale to its container');\n }\n\n // A mask is rendered as an isolated image: it cannot fetch anything, so an\n // external reference silently renders nothing.\n if (/<image\\b/i.test(normalized)) {\n fail('contains a raster <image>; masks need vector artwork');\n }\n if (/\\b(?:xlink:)?href\\s*=\\s*[\"'](?!#)/i.test(normalized)) {\n fail('references an external resource, which a masked SVG cannot load');\n }\n\n if (!options.allowMultiColor) {\n const paints = paintValues(normalized);\n if (paints.some((p) => p.startsWith('url('))) {\n fail(\n 'paints with a gradient or pattern — masks use the alpha channel only, ' +\n 'so it would flatten to a silhouette. Pass { allowMultiColor: true } to accept that.'\n );\n }\n if (paints.length > 1) {\n fail(\n `paints in ${paints.length} colors (${paints.join(', ')}) — masks use the alpha ` +\n 'channel only, so it would flatten to a silhouette in currentColor. ' +\n 'Pass { allowMultiColor: true } to accept that.'\n );\n }\n }\n\n return encode(normalized);\n}\n","import { Size } from '../core.types';\nimport { DeviceOrientation } from './layout.types';\n\nexport function getDeviceSize(height: number, width: number): Size {\n if (!height || !width) return 'md';\n\n const max = Math.max(height, width);\n\n if (max <= 600)\n // Small Mobile\n return 'xs';\n\n if (max <= 960)\n // Large Mobile\n return 'sm';\n\n if (max <= 1264)\n // Tablets\n return 'md';\n\n if (max <= 1904)\n // Laptops & Monitors\n return 'lg';\n\n return 'xl'; // Large Monitors\n}\n\nexport function getDeviceOrientation(height: number, width: number): DeviceOrientation {\n if (!height || !width) return 'landscape';\n\n return height > width ? 'portrait' : 'landscape';\n}\n","import { BoxShadow, ShadowDefinition } from './shadow.model';\n\n// box-shadow: none|h-offset v-offset blur spread color\nexport const GetBoxShadow = ({ offset, blur, opacity }: BoxShadow): string => {\n return `0 ${offset}px ${blur}px rgba(0,0,0,0.${opacity})`;\n};\n\nexport const GetBoxShadows = ({ umbra, penumbra }: ShadowDefinition): string => {\n return GetBoxShadow(umbra) + ', ' + GetBoxShadow(penumbra);\n};\n","import { ShadowDefinition } from './shadow.model';\nimport { ShadowElevation } from './shadow.types';\nimport { GetBoxShadows } from './shadow.utils';\n\nexport const ShadowMap: Record<ShadowElevation, ShadowDefinition> = {\n pressed: {\n umbra: {\n offset: 1,\n blur: 2,\n opacity: 24,\n },\n penumbra: {\n offset: 1,\n blur: 3,\n opacity: 12,\n },\n },\n raised: {\n umbra: {\n offset: 3,\n blur: 6,\n opacity: 23,\n },\n penumbra: {\n offset: 3,\n blur: 6,\n opacity: 16,\n },\n },\n focussed: {\n umbra: {\n offset: 6,\n blur: 6,\n opacity: 23,\n },\n penumbra: {\n offset: 10,\n blur: 20,\n opacity: 19,\n },\n },\n navigation: {\n umbra: {\n offset: 10,\n blur: 10,\n opacity: 22,\n },\n penumbra: {\n offset: 14,\n blur: 28,\n opacity: 25,\n },\n },\n modal: {\n umbra: {\n offset: 15,\n blur: 12,\n opacity: 22,\n },\n penumbra: {\n offset: 19,\n blur: 38,\n opacity: 30,\n },\n },\n};\n\nexport const ShadowCssMap: Record<ShadowElevation, string> = {\n pressed: GetBoxShadows(ShadowMap['pressed']),\n raised: GetBoxShadows(ShadowMap['raised']),\n focussed: GetBoxShadows(ShadowMap['focussed']),\n navigation: GetBoxShadows(ShadowMap['navigation']),\n modal: GetBoxShadows(ShadowMap['modal']),\n};\n","import type { StyleExpression } from './style.types';\n\nexport const removeInputPlatformStyling: StyleExpression = {\n appearance: 'none' /* Removes default platform styling */,\n background: 'none' /* Removes default background */,\n border: 'none' /* Removes default gray border */,\n outline: 'none' /* Removes default focus ring */,\n boxShadow: 'none' /* Removes any inner shadows on iOS */,\n padding: 0 /* Resets default spacing */,\n width: '100%' /* Makes it fill the stylized div */,\n};\n","import type { Colors } from '../theme.model';\nimport { generatePalette } from '../../color';\nimport { generateShadows } from '../../generation/shadow.generator';\nimport { BASE_PALETTE_CONFIG, createTheme } from './base.theme';\n\nexport const darkColors: Colors = generatePalette({ ...BASE_PALETTE_CONFIG, mode: 'dark' });\n\nexport const DarkTheme = createTheme({\n id: 'DarkTheme',\n name: 'Dark Theme',\n colors: darkColors,\n shadows: generateShadows(darkColors, 'dark'),\n});\n","import { generateShadows } from '../../generation/shadow.generator';\nimport { createTheme, lightColors } from './base.theme';\n\nexport const LightTheme = createTheme({\n id: 'LightTheme',\n name: 'Light Theme',\n colors: lightColors,\n shadows: generateShadows(lightColors, 'light'),\n});\n","import { type UniTheme } from './theme.model';\nimport { DarkTheme } from './themes/dark.theme';\nimport { LightTheme } from './themes/light.theme';\n\nexport const UniThemes: Record<string, UniTheme> = {\n LightTheme,\n DarkTheme,\n};\n\n// First Theme is default.\nexport const DefaultThemeId = Object.keys(UniThemes)[0];\n","import { FontWeight } from './typography.types';\n\nexport const FontWeightMap: Record<FontWeight, number> = {\n thin: 100,\n 'extra-light': 200,\n light: 200,\n normal: 400,\n medium: 500,\n 'semi-bold': 600,\n bold: 700,\n 'extra-bold': 800,\n black: 900,\n 'extra-black': 950,\n};\n","import type { CssLength, TextStyle, TypeFaceDefinition } from './text.model';\n\nconst px = (value: CssLength): string => (typeof value === 'number' ? `${value}px` : value);\n\n/**\n * Converts a TextStyle (numeric, design-token oriented) into a\n * TypeFaceDefinition (CSS-ready) so a theme's `typefaces` map can be\n * derived from its `typography` block instead of being duplicated.\n */\nexport const toTypeface = (style: TextStyle): TypeFaceDefinition => ({\n fontFamily: style.fontFamily,\n fontSize: px(style.fontSize),\n lineHeight: px(style.lineHeight),\n ...(style.letterSpacing !== undefined && { letterSpacing: px(style.letterSpacing) }),\n ...(style.textTransform === 'uppercase' && { textTransform: 'uppercase' as const }),\n ...(style.fontWeight !== undefined && { fontWeight: style.fontWeight }),\n ...(style.fontStyle && { fontStyle: style.fontStyle }),\n});\n\nexport const toTypefaces = (\n typography: Record<string, TextStyle>\n): Record<string, TypeFaceDefinition> =>\n Object.fromEntries(Object.entries(typography).map(([role, style]) => [role, toTypeface(style)]));\n","import { GetFieldType } from './types';\n\nexport function getValue<TData, TPath extends string, TDefault = GetFieldType<TData, TPath>>(\n data: TData,\n path: TPath,\n defaultValue?: TDefault\n): GetFieldType<TData, TPath> | TDefault {\n const value = path\n .split(/[.[\\]]/)\n .filter(Boolean)\n .reduce<GetFieldType<TData, TPath>>((value, key) => (value as any)?.[key], data as any);\n\n return value !== undefined ? value : (defaultValue as TDefault);\n}\n","export const debounce = <T extends (...args: any[]) => ReturnType<T>>(\n callback: T,\n timeout: number\n): ((...args: Parameters<T>) => void) => {\n let timer: ReturnType<typeof setTimeout>;\n\n return (...args: Parameters<T>) => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n callback(...args);\n }, timeout);\n };\n};\n"],"mappings":"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IF,MAAM,EAAE,MAAM,WAAW,OAAO,cAAc,SAAS;CACvD,MAAM,MAAM,WAAW;EAAE,GAAG;EAAM,GAAG;EAAO;CAAE,CAAC;CAC/C,OAAO;EACL,QAAQ,GAAG,KAAK,KAAK,EAAG,EAAE,qBAAqB,KAAK,KAAK,GAAI,EAAE,oBAAoB,KAAK,KAAK,GAAI,EAAE;EACnG,MAAM,GAAG,KAAK,KAAK,EAAG,EAAE,qBAAqB,KAAK,KAAK,GAAI,EAAE,oBAAoB,KAAK,KAAK,GAAI,EAAE;EACjG,QAAQ,GAAG,KAAK,KAAK,EAAG,EAAE,qBAAqB,KAAK,KAAK,GAAI,EAAE,qBAAqB,KAAK,KAAK,GAAI,EAAE;EACpG,MAAM,WAAW,KAAK,OAAO,EAAG,EAAE,kBAAkB,KAAK,OAAO,EAAG;CACrE;AACF;;;;;;;;;;;;;;;;ACzBA,IAAa,YAAY;CAEvB,MAAM;CACN,WACE;CACF,aACE;CACF,aACE;CACF,cACE;CACF,WACE;CACF,YACE;CACF,MAAM;CACN,UACE;CACF,cACE;CACF,MAAM;CACN,QACE;CACF,UACE;CACF,UACE;CAGF,QACE;CACF,OACE;CACF,MAAM;CACN,OACE;CACF,MAAM;CACN,gBACE;CACF,QACE;CACF,MAAM;CACN,MAAM;CACN,UACE;CACF,QACE;CACF,OACE;CACF,MAAM;CACN,QACE;CACF,QACE;CACF,SACE;CACF,YACE;CACF,QACE;CAGF,OACE;CACF,aACE;CACF,SACE;CACF,aACE;CACF,MAAM;CACN,SACE;CACF,MAAM;CACN,MAAM;CACN,UACE;CAGF,SACE;CACF,OACE;CACF,cACE;CACF,UACE;CACF,cACE;CACF,UACE;CACF,MAAM;CACN,UACE;CACF,OACE;CACF,MAAM;CACN,MAAM;CACN,OACE;CACF,UACE;CACF,SACE;CACF,MAAM;CACN,YACE;CACF,WACE;CACF,SACE;CACF,QACE;CAGF,SACE;AACJ;;;AC9GA,IAAM,iBAA6B;CACjC,iBAAiB;EACf,YAAY;EACZ,UAAU;EACV,YAAY;EACZ,YAAY;EACZ,eAAe;CACjB;CACA,kBAAkB;EAAE,YAA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"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../src/concepts/animation/duration.helpers.ts","../../src/concepts/animation/keyframes.constants.ts","../../src/concepts/color/color.records.ts","../../src/concepts/color/color.utils.ts","../../src/concepts/color/color.helper.ts","../../src/concepts/generation/oklch.helper.ts","../../src/concepts/generation/palette.factory.ts","../../src/concepts/color/color.factory.ts","../../src/concepts/elevation/zIndex.ts","../../src/concepts/generation/dtcg.emitter.ts","../../src/concepts/generation/shadow.generator.ts","../../src/concepts/iconography/icon.records.ts","../../src/concepts/theme/themes/base.theme.ts","../../src/concepts/generation/theme.generator.ts","../../src/concepts/generation/theme-file.emitter.ts","../../src/concepts/gradient/gradient.helper.ts","../../src/concepts/iconography/icon.helper.ts","../../src/concepts/layout/layout.helper.ts","../../src/concepts/shadow/shadow.utils.ts","../../src/concepts/shadow/shadow.records.ts","../../src/concepts/style/inputs.constants.ts","../../src/concepts/theme/themes/dark.theme.ts","../../src/concepts/theme/themes/light.theme.ts","../../src/concepts/theme/theme.records.ts","../../src/concepts/typography/typography.records.ts","../../src/concepts/typography/typeface.helpers.ts","../../src/utils/getValue.ts","../../src/utils/debounce.ts"],"sourcesContent":["/** Duration (seconds) the default theme assigns `expand`'s `transitionSpeed`. */\nexport const EXPAND_DEFAULT_SPEED = 0.35;\n\n/**\n * Content height (px) at which a reveal runs at exactly its `transitionSpeed`.\n * Roughly a few lines of card content — the size the default 0.35s was tuned on.\n */\nexport const EXPAND_REFERENCE_HEIGHT = 240;\n\n/**\n * Duration envelope at the default speed. A tiny region never blinks past\n * faster than the min; a full-page region never drags longer than the max.\n * Expressed at `EXPAND_DEFAULT_SPEED` and applied as scale-factor clamps, so a\n * theme that slows `transitionSpeed` down widens its envelope proportionally\n * instead of being capped back to the stock feel.\n */\nexport const EXPAND_MIN_DURATION = 0.15;\nexport const EXPAND_MAX_DURATION = 0.6;\n\nconst MIN_SCALE = EXPAND_MIN_DURATION / EXPAND_DEFAULT_SPEED;\nconst MAX_SCALE = EXPAND_MAX_DURATION / EXPAND_DEFAULT_SPEED;\n\n/**\n * Size-aware reveal duration: `speed × √(height ÷ reference)`, clamped.\n *\n * A fixed duration reads as sluggish on a short region and rushed on a tall\n * one; scaling by the square root of height keeps perceived speed steady —\n * bigger reveals get more time, but sublinearly.\n */\nexport const expandDuration = (\n contentHeight: number,\n speed: number = EXPAND_DEFAULT_SPEED,\n): number => {\n const height = Number.isFinite(contentHeight) ? Math.max(contentHeight, 0) : 0;\n const scale = Math.sqrt(height / EXPAND_REFERENCE_HEIGHT);\n return speed * Math.min(Math.max(scale, MIN_SCALE), MAX_SCALE);\n};\n","import type { StyleExpression } from '../style/style.types';\n\nexport type PercentageString = `${number}%`;\nexport type KeyframesExpression = Record<PercentageString, StyleExpression>;\n\nexport const fadeIn: KeyframesExpression = {\n '0%': {\n opacity: 0,\n },\n '100%': {\n opacity: 1,\n },\n};\n\nexport const fadeOut: KeyframesExpression = {\n '0%': {\n opacity: 1,\n },\n '100%': {\n opacity: 0,\n },\n};\n\nexport const expandFadeIn = {\n '0%': {\n gridTemplateRows: '0fr',\n opacity: 0,\n },\n '100%': {\n gridTemplateRows: '1fr',\n opacity: 1,\n },\n};\n\nexport const collapseFadeOut = {\n '0%': {\n gridTemplateRows: '1fr',\n opacity: 1,\n },\n '100%': {\n gridTemplateRows: '0fr',\n opacity: 0,\n },\n};\n","import { Range } from './color.model';\nimport { ColorCategory, ColorRole, UtilityColorRole } from './color.types';\n\n/**\n * @deprecated HSL saturation ranges are superseded by the perceptual OKLCH\n * chroma model inside `concepts/generation` (see `generateThemes`). Kept for\n * legacy callers of `uniColor`; removal follows the changeset major process.\n */\nexport const CategorySaturation: Record<ColorCategory, Range> = {\n jewel: { low: 73, high: 83 },\n pastel: { low: 14, high: 21 },\n earth: { low: 36, high: 41 },\n neutral: { low: 1, high: 10 },\n florescent: { low: 63, high: 100 },\n shades: { low: 0, high: 0 },\n};\n\n/**\n * @deprecated HSL lightness ranges are superseded by the perceptual OKLCH\n * tone slots inside `concepts/generation` (see `generateThemes`).\n */\nexport const CategoryLightness: Record<ColorCategory, Range> = {\n jewel: { low: 56, high: 76 },\n pastel: { low: 89, high: 96 },\n earth: { low: 36, high: 77 },\n neutral: { low: 70, high: 99 },\n florescent: { low: 82, high: 100 },\n shades: { low: 0, high: 100 },\n};\n\nexport const RoleHues: Record<ColorRole | UtilityColorRole, Range> = {\n primary: { low: 73, high: 83, default: 0 },\n secondary: { low: 14, high: 21, default: 0 },\n tertiary: { low: 36, high: 41, default: 0 },\n inverse: { low: 63, high: 100, default: 0 },\n ghost: { low: 0, high: 0, default: 0 },\n warn: { low: 320, high: 20, default: 0 }, // red\n alert: { low: 40, high: 70, default: 60 }, // yellow\n success: { low: 90, high: 150, default: 120 }, // green\n info: { low: 200, high: 260, default: 240 }, // blue\n};\n","import { Range } from './color.model';\nimport type { ColorScheme } from './color.types';\n\n/**\n * @deprecated Randomized generation is superseded by the deterministic OKLCH\n * engine in `concepts/generation` — same input, same theme. Seeded \"surprise\n * me\" behavior belongs in the consumer (playground), not the engine.\n */\nexport const randomRangeValue = ({ low, high }: Range): number => {\n low = Math.ceil(low);\n high = Math.floor(high);\n return Math.floor(Math.random() * (high - low + 1)) + low;\n};\n\nexport const cycle = (angle: number): number => {\n if (angle > 360) return angle - 360;\n if (angle < 0) return angle + 360;\n return angle;\n};\n\nexport const getAnalogousHues = (hue: number): number[] => [cycle(hue + 30), cycle(hue + 60)];\nexport const getComplimentaryHue = (hue: number): number => cycle(hue + 180);\nexport const getTriadicHues = (hue: number): number[] => [cycle(hue + 120), cycle(hue - 120)];\nexport const getSplitComplimentaryHues = (hue: number): number[] => [\n cycle(hue + 150),\n cycle(hue - 150),\n];\n\nexport interface RoleHueSet {\n primary: number;\n secondary: number;\n tertiary: number;\n}\n\n/**\n * Derive the primary/secondary/tertiary hues from a seed hue using the color\n * wheel relationships in {@link ColorScheme}. Pure angle math — works in any\n * hue space (HSL historically, OKLCH in the generation engine).\n */\nexport const schemeHues = (hue: number, scheme: ColorScheme): RoleHueSet => {\n switch (scheme) {\n case 'monochromatic':\n return { primary: hue, secondary: hue, tertiary: hue };\n case 'analogous': {\n const [a, b] = getAnalogousHues(hue);\n return { primary: hue, secondary: a, tertiary: b };\n }\n case 'complimentary': {\n const [a] = getAnalogousHues(hue);\n return { primary: hue, secondary: getComplimentaryHue(hue), tertiary: a };\n }\n case 'splitComplimentary': {\n const [a, b] = getSplitComplimentaryHues(hue);\n return { primary: hue, secondary: a, tertiary: b };\n }\n case 'triadic': {\n const [a, b] = getTriadicHues(hue);\n return { primary: hue, secondary: a, tertiary: b };\n }\n }\n};\n","import { HSL, HSLA, RGB, UniColor } from './color.model';\nimport { CategoryLightness, CategorySaturation, RoleHues } from './color.records';\nimport { randomRangeValue } from './color.utils';\n\nexport function HSLAToString({ hue, saturation, lightness, alpha = 1 }: HSLA): string {\n return `hsla(${hue}, ${saturation}%, ${lightness}%, ${alpha})`;\n}\n\nexport function RGBToString({ red, green, blue }: RGB): string {\n return `rgb(${red}, ${green}, ${blue})`;\n}\n\n/**\n * @deprecated Random HSL generation produces non-deterministic, perceptually\n * uneven colors. Use the OKLCH engine (`generateThemes` in\n * `concepts/generation`) or `generatePalette` instead.\n */\nexport function uniColor({ role, category, alpha = 1 }: UniColor): string {\n const hue = randomRangeValue(RoleHues[role]);\n const saturation = randomRangeValue(CategorySaturation[category]);\n const lightness = randomRangeValue(CategoryLightness[category]);\n\n return HSLAToString({ hue, saturation, lightness, alpha });\n}\n\nexport const RGBToHSL = ({ red, green, blue }: RGB): HSL => {\n red /= 255;\n green /= 255;\n blue /= 255;\n const l = Math.max(red, green, blue);\n const s = l - Math.min(red, green, blue);\n const h = s\n ? l === red\n ? (green - blue) / s\n : l === green\n ? 2 + (blue - red) / s\n : 4 + (red - green) / s\n : 0;\n return {\n hue: 60 * h < 0 ? 60 * h + 360 : 60 * h,\n saturation: 100 * (s ? (l <= 0.5 ? s / (2 * l - s) : s / (2 - (2 * l - s))) : 0),\n lightness: (100 * (2 * l - s)) / 2,\n };\n};\n\n// ── Conversions & contrast (used by the palette factory) ────────────────────\n\nconst clamp = (value: number, min: number, max: number): number =>\n Math.min(max, Math.max(min, value));\n\nconst toHex2 = (value: number): string => clamp(Math.round(value), 0, 255).toString(16).padStart(2, '0');\n\nexport const rgbToHex = ({ red, green, blue }: RGB): string =>\n `#${toHex2(red)}${toHex2(green)}${toHex2(blue)}`.toUpperCase();\n\nexport const hexToRgb = (hex: string): RGB => {\n let h = hex.replace('#', '').trim();\n if (h.length === 3) h = h.split('').map((c) => c + c).join('');\n const int = parseInt(h, 16);\n return { red: (int >> 16) & 255, green: (int >> 8) & 255, blue: int & 255 };\n};\n\nexport const HSLToRGB = ({ hue = 0, saturation = 0, lightness = 0 }: HSL): RGB => {\n const s = clamp(saturation, 0, 100) / 100;\n const l = clamp(lightness, 0, 100) / 100;\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const hp = (((hue % 360) + 360) % 360) / 60;\n const x = c * (1 - Math.abs((hp % 2) - 1));\n const [r1, g1, b1] =\n hp < 1\n ? [c, x, 0]\n : hp < 2\n ? [x, c, 0]\n : hp < 3\n ? [0, c, x]\n : hp < 4\n ? [0, x, c]\n : hp < 5\n ? [x, 0, c]\n : [c, 0, x];\n const m = l - c / 2;\n return {\n red: (r1 + m) * 255,\n green: (g1 + m) * 255,\n blue: (b1 + m) * 255,\n };\n};\n\n/** Build an sRGB hex string straight from HSL channel values. */\nexport const HSLToHex = (hsl: HSL): string => rgbToHex(HSLToRGB(hsl));\n\nexport const hexToHSL = (hex: string): HSL => RGBToHSL(hexToRgb(hex));\n\n/** WCAG relative luminance of an sRGB color (0 = black, 1 = white). */\nexport const relativeLuminance = ({ red, green, blue }: RGB): number => {\n const channel = (value: number): number => {\n const v = value / 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n };\n return 0.2126 * channel(red) + 0.7152 * channel(green) + 0.0722 * channel(blue);\n};\n\n/** WCAG contrast ratio between two colors (1:1 – 21:1). Accepts RGB or hex. */\nexport const contrastRatio = (a: RGB | string, b: RGB | string): number => {\n const la = relativeLuminance(typeof a === 'string' ? hexToRgb(a) : a);\n const lb = relativeLuminance(typeof b === 'string' ? hexToRgb(b) : b);\n const [hi, lo] = la > lb ? [la, lb] : [lb, la];\n return (hi + 0.05) / (lo + 0.05);\n};\n\n// Future Methods - https://codepen.io/jkantner/pen/VVEMRK\n","import type { RGB } from '../color/color.model';\nimport { hexToRgb, rgbToHex } from '../color/color.helper';\n\n/**\n * A color in OKLCH: perceptual lightness `l` (0–1), chroma `c` (0 = grey,\n * ~0.37 = max sRGB vividness) and hue angle `h` in degrees (0–360).\n *\n * Unlike HSL lightness, OKLCH `l` is perceptually uniform — a blue and a\n * yellow at the same `l` *look* equally light — which is what makes derived\n * tonal scales consistent across hues.\n */\nexport interface Oklch {\n l: number;\n c: number;\n h: number;\n}\n\nconst clamp = (value: number, min: number, max: number): number =>\n Math.min(max, Math.max(min, value));\n\n// sRGB transfer function and its inverse (gamma ↔ linear light).\nconst srgbToLinear = (channel: number): number =>\n channel <= 0.04045 ? channel / 12.92 : Math.pow((channel + 0.055) / 1.055, 2.4);\n\nconst linearToSrgb = (channel: number): number =>\n channel <= 0.0031308 ? 12.92 * channel : 1.055 * Math.pow(channel, 1 / 2.4) - 0.055;\n\ninterface LinearRGB {\n r: number;\n g: number;\n b: number;\n}\n\n// OKLab ↔ linear sRGB matrices (Björn Ottosson's reference constants).\nconst linearRgbToOklab = ({ r, g, b }: LinearRGB): { l: number; a: number; b: number } => {\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\n return {\n l: 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n a: 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n b: 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n };\n};\n\nconst oklabToLinearRgb = (l: number, a: number, b: number): LinearRGB => {\n const l_ = Math.pow(l + 0.3963377774 * a + 0.2158037573 * b, 3);\n const m_ = Math.pow(l - 0.1055613458 * a - 0.0638541728 * b, 3);\n const s_ = Math.pow(l - 0.0894841775 * a - 1.291485548 * b, 3);\n return {\n r: 4.0767416621 * l_ - 3.3077115913 * m_ + 0.2309699292 * s_,\n g: -1.2684380046 * l_ + 2.6097574011 * m_ - 0.3413193965 * s_,\n b: -0.0041960863 * l_ - 0.7034186147 * m_ + 1.707614701 * s_,\n };\n};\n\nconst oklchToLinearRgb = ({ l, c, h }: Oklch): LinearRGB => {\n const rad = (h * Math.PI) / 180;\n return oklabToLinearRgb(l, c * Math.cos(rad), c * Math.sin(rad));\n};\n\nconst GAMUT_EPSILON = 1e-4;\n\nconst inSrgbGamut = ({ r, g, b }: LinearRGB): boolean =>\n r >= -GAMUT_EPSILON &&\n r <= 1 + GAMUT_EPSILON &&\n g >= -GAMUT_EPSILON &&\n g <= 1 + GAMUT_EPSILON &&\n b >= -GAMUT_EPSILON &&\n b <= 1 + GAMUT_EPSILON;\n\n/** Parse a hex color (`#RGB` or `#RRGGBB`) into OKLCH. */\nexport const hexToOklch = (hex: string): Oklch => {\n const { red, green, blue } = hexToRgb(hex);\n const { l, a, b } = linearRgbToOklab({\n r: srgbToLinear(red / 255),\n g: srgbToLinear(green / 255),\n b: srgbToLinear(blue / 255),\n });\n const c = Math.hypot(a, b);\n const h = c < 1e-6 ? 0 : (Math.atan2(b, a) * 180) / Math.PI;\n return { l, c, h: h < 0 ? h + 360 : h };\n};\n\n/**\n * Render OKLCH as an sRGB hex string. Out-of-gamut colors are mapped back\n * into sRGB by reducing chroma only — lightness and hue are preserved, so\n * vivid seeds desaturate gracefully instead of shifting hue or clipping.\n */\nexport const oklchToHex = (color: Oklch): string => {\n const target: Oklch = { l: clamp(color.l, 0, 1), c: Math.max(color.c, 0), h: color.h };\n let rgb = oklchToLinearRgb(target);\n if (!inSrgbGamut(rgb)) {\n let low = 0;\n let high = target.c;\n for (let i = 0; i < 24; i++) {\n const mid = (low + high) / 2;\n if (inSrgbGamut(oklchToLinearRgb({ ...target, c: mid }))) low = mid;\n else high = mid;\n }\n rgb = oklchToLinearRgb({ ...target, c: low });\n }\n // Scale *after* the transfer function: 255 × transfer(channel), rounded once\n // inside rgbToHex. Rounding before scaling collapses every channel to 0/1.\n return rgbToHex(toSrgb255(rgb));\n};\n\nconst toSrgb255 = ({ r, g, b }: LinearRGB): RGB => ({\n red: 255 * linearToSrgb(clamp(r, 0, 1)),\n green: 255 * linearToSrgb(clamp(g, 0, 1)),\n blue: 255 * linearToSrgb(clamp(b, 0, 1)),\n});\n","import type { Colors } from '../theme/theme.model';\nimport type { BrandRole, PaletteConfig } from '../color/color.factory';\nimport type { ColorCategory } from '../color/color.types';\nimport { contrastRatio, hexToRgb, relativeLuminance } from '../color/color.helper';\nimport { schemeHues } from '../color/color.utils';\nimport { hexToOklch, oklchToHex, type Oklch } from './oklch.helper';\nimport type { ContrastCheck } from './generation.types';\n\nexport interface GenerateColorsConfig extends PaletteConfig {\n /**\n * Soft brand anchors, per role: the palette starts from these exact colors\n * but the WCAG guard-rail may adjust lightness (never hue) to reach AA.\n * Contrast-safe counterpart to the hard `brand` pins, which are emitted\n * verbatim even when they fail.\n */\n targets?: Partial<Record<BrandRole, string>>;\n /** Sink for the contrast checks performed while building this palette. */\n checks?: ContrastCheck[];\n}\n\n// ── Tonal architecture ──────────────────────────────────────────────────────\n// Every token maps onto one of these OKLCH lightness slots. Because OKLCH L\n// is perceptually uniform, a slot renders equally light for every hue — the\n// property HSL lacked, and the root fix for muddy derived palettes.\nconst toneMap = (dark: boolean) =>\n dark\n ? {\n accent: 0.78,\n container: 0.42,\n roleSurface: 0.26,\n background: 0.18,\n surface: 0.21,\n surfaceVariant: 0.32,\n outline: 0.66,\n onSurface: 0.93,\n mutedText: 0.76,\n inverse: 0.93,\n onInverse: 0.25,\n onDeep: 0.2,\n onLight: 0.985,\n grey: 0.72,\n disabledContainer: 0.3,\n }\n : {\n accent: 0.55,\n container: 0.9,\n roleSurface: 0.97,\n background: 0.995,\n surface: 0.985,\n surfaceVariant: 0.94,\n outline: 0.6,\n onSurface: 0.25,\n mutedText: 0.48,\n inverse: 0.3,\n onInverse: 0.97,\n onDeep: 0.24,\n onLight: 0.985,\n grey: 0.5,\n disabledContainer: 0.96,\n };\n\n// OKLCH chroma per tonal category — the perceptual successor to the HSL\n// `CategorySaturation` table. Values are accent-level chroma; container and\n// surface chroma are derived fractions.\nexport const CategoryChroma: Record<ColorCategory, number> = {\n jewel: 0.17,\n pastel: 0.055,\n earth: 0.08,\n neutral: 0.03,\n florescent: 0.26,\n shades: 0,\n};\n\n/** Dark-mode accents cap chroma so they don't vibrate on dark surfaces. */\nconst DARK_ACCENT_CHROMA_CAP = 0.16;\n\n// Semantic feedback roles in OKLCH: hue + chroma per role. Chroma differs per\n// role because sRGB gamut room differs by hue at the AA-dark lightness light\n// mode forces on ink tokens: red holds 0.20; amber sits at 55° (not 70° —\n// dark yellow reads brown, dark orange stays lively) with 0.18; green 0.16.\nconst SemanticColors = {\n error: { hue: 27, chroma: 0.2 },\n warn: { hue: 55, chroma: 0.18 },\n success: { hue: 152, chroma: 0.16 },\n} as const;\n\nconst clamp = (value: number, min: number, max: number): number =>\n Math.min(max, Math.max(min, value));\n\n/**\n * Generate a complete {@link Colors} token set in OKLCH. Same contract as\n * `generatePalette` (which delegates here), plus soft brand targets and a\n * contrast-check sink for {@link ContrastReport} consumers.\n */\nexport const generateColors = (config: GenerateColorsConfig): Colors => {\n const {\n seed,\n scheme,\n category,\n mode = 'light',\n accentSaturationFloor = 18,\n brand = {},\n targets = {},\n checks,\n } = config;\n const dark = mode === 'dark';\n const t = toneMap(dark);\n\n // The primary anchor (hard pin > soft target > seed) sets the neutral hue.\n const anchor = hexToOklch(brand.primary ?? targets.primary ?? seed);\n const hues = schemeHues(anchor.h, scheme);\n\n // Chroma model. The floor keeps the brand hue perceptible even for the\n // near-grey `neutral` category (0–100 legacy scale → OKLCH chroma).\n const chromaFloor = (accentSaturationFloor / 100) * 0.28;\n let accentC = Math.max(CategoryChroma[category], chromaFloor);\n if (dark) accentC = Math.min(accentC, DARK_ACCENT_CHROMA_CAP);\n const containerC = Math.max(CategoryChroma[category] * 0.45, accentC * 0.35);\n const surfaceC = Math.min(CategoryChroma[category], 0.012);\n\n const tone = (hue: number, c: number, l: number): string => oklchToHex({ l, c, h: hue });\n\n /**\n * The WCAG guard-rail: walk the foreground's OKLCH lightness away from the\n * background until the pair meets `target` (≤ 50 steps). Hue is never\n * touched; chroma only shrinks as a last resort when L runs out of room.\n */\n const ensureContrast = (fg: Oklch, bg: string, target: number): Oklch => {\n const out: Oklch = { ...fg };\n let hex = oklchToHex(out);\n if (contrastRatio(hex, bg) >= target) return out;\n // Pick the direction that can actually reach the target: each side has a\n // hard ceiling — black tops out at (Ybg + 0.05) / 0.05, white at\n // 1.05 / (Ybg + 0.05) — so staying on the foreground's current side is\n // only right when that side has enough headroom.\n const bgY = relativeLuminance(hexToRgb(bg));\n const darkCeiling = (bgY + 0.05) / 0.05;\n const lightCeiling = 1.05 / (bgY + 0.05);\n let lighten = relativeLuminance(hexToRgb(hex)) >= bgY;\n if (lighten && lightCeiling < target && darkCeiling >= target) lighten = false;\n if (!lighten && darkCeiling < target && lightCeiling >= target) lighten = true;\n const step = lighten ? 0.015 : -0.015;\n for (let i = 0; i < 50 && contrastRatio(hex, bg) < target; i++) {\n if ((step > 0 && out.l < 0.995) || (step < 0 && out.l > 0.02)) {\n out.l = clamp(out.l + step, 0, 1);\n } else {\n out.c = Math.max(0, out.c - 0.02);\n }\n hex = oklchToHex(out);\n }\n return out;\n };\n\n /** Guard-railed token: adjust toward `target` contrast, then record the pair. */\n const contrasted = (fg: Oklch, bgHex: string, target: number): string =>\n oklchToHex(ensureContrast(fg, bgHex, target));\n\n const record = (\n foreground: string,\n background: string,\n foregroundColor: string,\n backgroundColor: string,\n required: number\n ): void => {\n if (!checks) return;\n const ratio = contrastRatio(foregroundColor, backgroundColor);\n checks.push({\n mode,\n foreground,\n background,\n foregroundColor,\n backgroundColor,\n ratio: Math.round(ratio * 100) / 100,\n required,\n pass: ratio >= required,\n level: ratio < required ? 'fail' : ratio >= 7 ? 'AAA' : 'AA',\n });\n };\n\n const background = tone(anchor.h, surfaceC, t.background);\n const surface = tone(anchor.h, surfaceC, t.surface);\n const surfaceVariant = tone(anchor.h, surfaceC, t.surfaceVariant);\n\n // Legible foreground for a given ground: whichever of the tonal near-black /\n // near-white starts closer to AA, then guard-railed the rest of the way.\n const onColor = (hue: number, bg: string, c: number): string => {\n const deep: Oklch = { l: t.onDeep, c: Math.min(c, 0.05), h: hue };\n const light: Oklch = { l: t.onLight, c: Math.min(c, 0.02), h: hue };\n const pick =\n contrastRatio(oklchToHex(deep), bg) >= contrastRatio(oklchToHex(light), bg) ? deep : light;\n return contrasted(pick, bg, 4.5);\n };\n\n // Dark-mode counterpart of a *hard-pinned* brand color: lift lightness only\n // (hue and chroma preserved) until it clears 3:1 on the dark ground.\n const adaptPinForDark = (hex: string): string => {\n const pin = hexToOklch(hex);\n pin.l = Math.max(pin.l, 0.6);\n return oklchToHex(ensureContrast(pin, background, 3));\n };\n\n /**\n * Resolve a role's base color: hard pins are verbatim in light mode and\n * lightness-lifted in dark; soft targets and generated tones are pulled to\n * ≥ 4.5:1 as standalone ink on `background` and `surface` (§3.6).\n */\n const baseFor = (name: BrandRole, hue: number, c: number): string => {\n const pinned = brand[name];\n if (pinned) return dark ? adaptPinForDark(pinned) : pinned;\n const target = targets[name];\n let base: Oklch;\n if (target) {\n // Soft targets keep their own chroma — brand fidelity beats category.\n // Callers that want a vibe cap applied clamp the target before passing\n // it in (see `generateThemes`). Dark mode still decouples chroma.\n base = hexToOklch(target);\n if (dark) {\n base.c = Math.min(base.c, DARK_ACCENT_CHROMA_CAP);\n base.l = Math.max(base.l, t.accent - 0.08);\n }\n } else {\n base = { l: t.accent, c, h: hue };\n }\n return oklchToHex(ensureContrast(ensureContrast(base, background, 4.5), surface, 4.5));\n };\n\n const disabled = dark ? 'rgba(255,255,255,0.12)' : 'rgba(0,0,0,0.12)';\n const onDisabled = dark ? 'rgba(255,255,255,0.38)' : 'rgba(0,0,0,0.38)';\n\n // An accent role's base drives its container/surface/on satellites. Every\n // content satellite passes through the guard-rail and is recorded.\n const role = (name: string, base: string, cC: number = containerC) => {\n const { h, c } = hexToOklch(base);\n const container = tone(h, cC, t.container);\n const roleSurface = tone(h, surfaceC, t.roleSurface);\n const onBase = onColor(h, base, c);\n const onContainer = onColor(h, container, c);\n const onContainerVariant = contrasted({ l: t.mutedText, c: Math.min(cC, 0.06), h }, container, 4.5);\n const border = ensureContrast(ensureContrast(hexToOklch(base), container, 3), surface, 3);\n const borderHex = oklchToHex(border);\n const onRoleSurface = onColor(h, roleSurface, surfaceC);\n const onRoleSurfaceVariant = contrasted(hexToOklch(base), roleSurface, 4.5);\n\n record(`on-${name}`, name, onBase, base, 4.5);\n record(`on-${name}-container`, `${name}-container`, onContainer, container, 4.5);\n record(`on-${name}-container-variant`, `${name}-container`, onContainerVariant, container, 4.5);\n record(`on-${name}-container-border`, `${name}-container`, borderHex, container, 3);\n record(`on-${name}-container-border`, 'surface', borderHex, surface, 3);\n record(`on-${name}-surface`, `${name}-surface`, onRoleSurface, roleSurface, 4.5);\n record(`on-${name}-surface-variant`, `${name}-surface`, onRoleSurfaceVariant, roleSurface, 4.5);\n record(name, 'background', base, background, 4.5);\n record(name, 'surface', base, surface, 4.5);\n\n return {\n [name]: base,\n [`on-${name}`]: onBase,\n [`${name}-container`]: container,\n [`on-${name}-container`]: onContainer,\n [`on-${name}-container-variant`]: onContainerVariant,\n [`on-${name}-container-border`]: borderHex,\n [`${name}-surface`]: roleSurface,\n [`on-${name}-surface`]: onRoleSurface,\n [`on-${name}-surface-variant`]: onRoleSurfaceVariant,\n };\n };\n\n const primaryBase = baseFor('primary', hues.primary, accentC);\n const secondaryBase = baseFor('secondary', hues.secondary, accentC);\n const tertiaryBase = baseFor('tertiary', hues.tertiary, accentC);\n\n // Quaternary is a neutral, near-grey accent tied to the brand hue.\n const quaternaryGrey = brand.quaternary\n ? dark\n ? adaptPinForDark(brand.quaternary)\n : brand.quaternary\n : oklchToHex(ensureContrast({ l: t.grey, c: surfaceC, h: anchor.h }, surface, 3));\n const quaternarySurface = tone(anchor.h, surfaceC, t.roleSurface);\n const onQuaternary = onColor(anchor.h, quaternaryGrey, surfaceC);\n const onQuaternarySurface = onColor(anchor.h, quaternarySurface, surfaceC);\n const onQuaternarySurfaceVariant = contrasted(hexToOklch(primaryBase), quaternarySurface, 4.5);\n const onQuaternaryContainerVariant = contrasted(\n { l: t.mutedText, c: Math.min(containerC, 0.06), h: anchor.h },\n quaternarySurface,\n 4.5\n );\n record('on-quaternary', 'quaternary', onQuaternary, quaternaryGrey, 4.5);\n record('on-quaternary-surface', 'quaternary-surface', onQuaternarySurface, quaternarySurface, 4.5);\n record(\n 'on-quaternary-surface-variant',\n 'quaternary-surface',\n onQuaternarySurfaceVariant,\n quaternarySurface,\n 4.5\n );\n\n // Semantic feedback roles keep colorful, recognizable hues in every category.\n const semantic = (name: 'error' | 'warn' | 'success') => {\n const { hue, chroma } = SemanticColors[name];\n const base = baseFor(name, hue, dark ? Math.min(chroma, DARK_ACCENT_CHROMA_CAP) : chroma);\n const { h } = hexToOklch(base);\n const container = tone(h, containerC + 0.04, t.container);\n const onBase = onColor(h, base, chroma);\n const onContainer = onColor(h, container, chroma);\n record(`on-${name}`, name, onBase, base, 4.5);\n record(`on-${name}-container`, `${name}-container`, onContainer, container, 4.5);\n record(name, 'background', base, background, 4.5);\n record(name, 'surface', base, surface, 4.5);\n return { base, container, onBase, onContainer, h };\n };\n\n const error = semantic('error');\n const warn = semantic('warn');\n const success = semantic('success');\n\n const semanticExtras = (name: 'warn' | 'success', s: ReturnType<typeof semantic>) => {\n const variant = contrasted({ l: t.mutedText, c: 0.06, h: s.h }, s.container, 4.5);\n const border = oklchToHex(\n ensureContrast(ensureContrast(hexToOklch(s.base), s.container, 3), surface, 3)\n );\n record(`on-${name}-container-variant`, `${name}-container`, variant, s.container, 4.5);\n record(`on-${name}-container-border`, `${name}-container`, border, s.container, 3);\n return { variant, border };\n };\n const warnExtras = semanticExtras('warn', warn);\n const successExtras = semanticExtras('success', success);\n\n // Neutral text tokens.\n const onBackground = tone(anchor.h, surfaceC, t.onSurface);\n const onBackgroundVariant = contrasted({ l: t.mutedText, c: surfaceC, h: anchor.h }, background, 4.5);\n const onSurface = tone(anchor.h, surfaceC, t.onSurface);\n const onSurfaceVariant = contrasted(\n { l: dark ? t.mutedText : t.mutedText - 0.14, c: surfaceC, h: anchor.h },\n surfaceVariant,\n 4.5\n );\n record('on-background', 'background', onBackground, background, 4.5);\n record('on-background-variant', 'background', onBackgroundVariant, background, 4.5);\n record('on-surface', 'surface', onSurface, surface, 4.5);\n record('on-surface-variant', 'surface-variant', onSurfaceVariant, surfaceVariant, 4.5);\n\n // Inverse surfaces flip the ground; their accents must stay legible there.\n const inverseSurface = tone(anchor.h, surfaceC, t.inverse);\n const onInverse = tone(anchor.h, surfaceC, t.onInverse);\n const inversePrimary = contrasted(hexToOklch(primaryBase), inverseSurface, 4.5);\n record('on-inverse-surface', 'inverse-surface', onInverse, inverseSurface, 4.5);\n record('on-inverse-surface-primary', 'inverse-surface', inversePrimary, inverseSurface, 4.5);\n record('on-inverse-container', 'inverse-container', onInverse, inverseSurface, 4.5);\n\n const outline = oklchToHex(\n ensureContrast(\n ensureContrast({ l: t.outline, c: Math.min(surfaceC, 0.02), h: hues.primary }, surface, 3),\n background,\n 3\n )\n );\n record('outline', 'surface', outline, surface, 3);\n record('outline', 'background', outline, background, 3);\n\n return {\n ...role('primary', primaryBase),\n ...role('secondary', secondaryBase),\n ...role('tertiary', tertiaryBase),\n\n quaternary: quaternaryGrey,\n 'on-quaternary': onQuaternary,\n 'quaternary-surface': quaternarySurface,\n 'on-quaternary-surface': onQuaternarySurface,\n 'on-quaternary-surface-variant': onQuaternarySurfaceVariant,\n 'on-quaternary-container-variant': onQuaternaryContainerVariant,\n 'on-quaternary-container-border': quaternaryGrey,\n\n // Semantic\n error: error.base,\n 'on-error': error.onBase,\n 'error-container': error.container,\n 'on-error-container': error.onContainer,\n\n warn: warn.base,\n 'on-warn': warn.onBase,\n 'warn-container': warn.container,\n 'on-warn-container': warn.onContainer,\n 'on-warn-container-variant': warnExtras.variant,\n 'on-warn-container-border': warnExtras.border,\n\n success: success.base,\n 'on-success': success.onBase,\n 'success-container': success.container,\n 'on-success-container': success.onContainer,\n 'on-success-container-variant': successExtras.variant,\n 'on-success-container-border': successExtras.border,\n\n // Neutral surfaces\n background,\n 'on-background': onBackground,\n 'on-background-variant': onBackgroundVariant,\n surface,\n 'on-surface': onSurface,\n 'surface-variant': surfaceVariant,\n 'on-surface-variant': onSurfaceVariant,\n\n // Inverse\n 'inverse-surface': inverseSurface,\n 'on-inverse-surface': onInverse,\n 'on-inverse-surface-primary': inversePrimary,\n 'on-inverse-surface-variant': inversePrimary,\n 'inverse-container': inverseSurface,\n 'on-inverse-container': onInverse,\n\n // Utility\n outline,\n shadow: '#000000',\n scrim: '#000000',\n 'surface-tint': primaryBase,\n transparent: 'rgba(0,0,0,0)',\n ghost: 'rgba(0,0,0,0)',\n\n // Disabled (deliberate alpha overlays — excluded from the contrast report)\n disabled,\n 'on-disabled': onDisabled,\n 'disabled-container': tone(hues.primary, surfaceC, t.disabledContainer),\n 'on-disabled-container': onDisabled,\n 'disabled-surface': disabled,\n 'on-disabled-surface': dark ? 'rgba(255,255,255,0.5)' : 'rgba(0,0,0,0.5)',\n 'on-disabled-surface-variant': dark ? 'rgba(255,255,255,0.4)' : 'rgba(0,0,0,0.4)',\n };\n};\n","import type { Colors } from '../theme';\nimport { generateColors, type GenerateColorsConfig } from '../generation/palette.factory';\nimport type { ColorCategory, ColorScheme } from './color.types';\n\n/** Roles whose base color can be pinned to an exact brand hex. */\nexport type BrandRole =\n | 'primary'\n | 'secondary'\n | 'tertiary'\n | 'quaternary'\n | 'error'\n | 'warn'\n | 'success';\n\nexport interface PaletteConfig {\n /**\n * Seed brand color as a hex string, e.g. '#4F46E5'. Anchors the neutral\n * hue and every role you don't pin via `brand`. When `brand.primary` is\n * set, that color anchors instead.\n */\n seed: string;\n /** How secondary/tertiary hues relate to the anchor, for unpinned roles. */\n scheme: ColorScheme;\n /** Saturation / tonal character of the generated (unpinned) colors. */\n category: ColorCategory;\n /** Light or dark rendering of the same palette. Defaults to 'light'. */\n mode?: 'light' | 'dark';\n /**\n * Minimum accent saturation (0–100 scale) so the brand hue stays perceptible\n * even for the `neutral` category (which is otherwise near-grey). Set to 0\n * to honor the category saturation exactly.\n */\n accentSaturationFloor?: number;\n /**\n * Exact brand colors, pinned per role. A pinned color is emitted verbatim as\n * that role's base token in **light** mode (\"cannot shift\"); in **dark** mode\n * it is lifted in lightness only — hue and chroma preserved — so it stays\n * legible on a dark ground. Its on/container/surface satellites are derived\n * from it. Unpinned roles are generated from the seed + scheme as usual, so an\n * arbitrary brand pair (e.g. forest green + ochre) can be reproduced exactly.\n */\n brand?: Partial<Record<BrandRole, string>>;\n}\n\n/**\n * Generate a complete {@link Colors} token set from a single seed color, a\n * {@link ColorScheme} and a {@link ColorCategory}. Produces a light or dark\n * variant of the same palette; `on-*` colors are driven to WCAG AA contrast\n * so text stays legible for any seed.\n *\n * Delegates to the OKLCH engine in `concepts/generation` — all lightness and\n * chroma math is perceptual, and every derived pair passes through the WCAG\n * guard-rail. Accepts the engine's extended config, so callers may also pass\n * soft `targets` (brand-faithful but guard-railed) and a `checks` sink. Use\n * `generateThemes()` for the light+dark pair plus a {@link ContrastReport}.\n */\nexport const generatePalette = (config: GenerateColorsConfig): Colors => generateColors(config);\n","export type ZIndexableElements =\n | 'dropdown'\n | 'sticky'\n | 'fixed'\n | 'backdrop'\n | 'dialog'\n | 'popover'\n | 'tooltip'\n | 'overlay';\n\nexport const Z_INDEX: Record<ZIndexableElements, number> = {\n dropdown: 1000,\n sticky: 1020,\n fixed: 1030,\n backdrop: 1040,\n dialog: 1050,\n popover: 1060,\n tooltip: 1070,\n overlay: 1080,\n};\n","import type { Colors, Radii, Spacing } from '../theme/theme.model';\n\n/** A single W3C DTCG design token. */\nexport interface DtcgToken {\n $value: string;\n $type: 'color' | 'dimension';\n}\n\n/** DTCG-format token document (Style Dictionary compatible), per PRD §6. */\nexport interface DtcgTokens {\n color: Record<string, DtcgToken>;\n size: {\n radius: Record<string, DtcgToken>;\n spacing: Record<string, DtcgToken>;\n };\n}\n\nconst dimensionEntries = (record: Radii | Spacing | undefined): Record<string, DtcgToken> =>\n Object.fromEntries(\n Object.entries(record ?? {})\n .filter(([, value]) => value !== undefined && value !== 'none')\n .map(([key, value]) => [key, { $value: String(value), $type: 'dimension' as const }])\n );\n\n/**\n * Render one theme mode's tokens as W3C DTCG JSON for external pipelines\n * (Style Dictionary etc.). Token names are exactly Uni's `ColorToken` strings —\n * one vocabulary everywhere. The native `UniTheme` object remains the primary,\n * lossless output; this is the interop layer.\n */\nexport const emitDtcgTokens = (input: {\n colors: Colors;\n radii?: Radii;\n spacing?: Spacing;\n}): DtcgTokens => ({\n color: Object.fromEntries(\n Object.entries(input.colors)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => [key, { $value: value as string, $type: 'color' as const }])\n ),\n size: {\n radius: dimensionEntries(input.radii),\n spacing: dimensionEntries(input.spacing),\n },\n});\n","import type { Colors, Shadows } from '../theme/theme.model';\nimport { hexToRgb } from '../color/color.helper';\nimport { hexToOklch, oklchToHex } from './oklch.helper';\n\nconst rgba = (hex: string, alpha: number): string => {\n const { red, green, blue } = hexToRgb(hex);\n return `rgba(${red}, ${green}, ${blue}, ${alpha})`;\n};\n\n/**\n * Brand-tinted, theme-scoped elevation shadows (PRD §3.5.C).\n *\n * Light mode replaces the dead-neutral black stacks with a shadow ink pulled\n * toward the brand hue — dark and low-chroma enough to read as shadow, tinted\n * enough to kill the grey \"mud\" where shadows meet brand surfaces. Dark mode\n * goes near-zero: elevation is carried by the surface lightness steps, with\n * only a faint veil kept on floating overlays (menus/dialogs genuinely need\n * separation) and the `warn` glow tinted by the theme's own error color.\n */\nexport const generateShadows = (colors: Colors, mode: 'light' | 'dark' = 'light'): Shadows => {\n const error = colors['error'] ?? '#CC2827';\n\n if (mode === 'dark') {\n return {\n raised: 'none',\n menu: `0px 4px 12px ${rgba('#000000', 0.45)}`,\n dialog: `0px 8px 28px ${rgba('#000000', 0.55)}`,\n warn: `0 0 5px ${rgba(error, 0.55)}, inset 0 0 5px ${rgba(error, 0.35)}`,\n };\n }\n\n // Shadow ink: near-black carrying ~6–8% of the brand hue's chroma.\n const { h } = hexToOklch(colors['primary'] ?? '#000000');\n const ink = oklchToHex({ l: 0.22, c: 0.035, h });\n return {\n raised: `${rgba(ink, 0.2)} 0px 2px 1px -1px, ${rgba(ink, 0.14)} 0px 1px 1px 0px, ${rgba(ink, 0.12)} 0px 1px 3px 0px`,\n menu: `${rgba(ink, 0.2)} 0px 3px 3px -2px, ${rgba(ink, 0.14)} 0px 3px 4px 0px, ${rgba(ink, 0.12)} 0px 1px 8px 0px`,\n dialog: `${rgba(ink, 0.2)} 0px 3px 5px -1px, ${rgba(ink, 0.14)} 0px 6px 10px 0px, ${rgba(ink, 0.12)} 0px 1px 18px 0px`,\n warn: `0 0 5px ${rgba(error, 0.5)}, inset 0 0 5px ${rgba(error, 0.3)}`,\n };\n};\n","import type { Icons } from '../theme/theme.model';\n\n/**\n * Default icon primitives shipped with every theme. Each icon is an inline\n * SVG data URI rendered as a CSS mask over `currentColor`, so icons recolor\n * with the theme automatically. `createTheme` merges a theme's own `icons`\n * over this set — add or override under any name; components render them by\n * token via `uni-icon`, never by inlining SVG.\n *\n * The set is Material Symbols Outlined at weight 300, normalized to a\n * single `0 -960 960 960` grid so every glyph shares one optical weight.\n *\n * Generated by scripts/generate-icons.mjs (pnpm icons:generate). Do not edit\n * by hand — add or change icons in that script's manifest and regenerate.\n */\nexport const BaseIcons = {\n // Navigation & layout\n menu: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M140-254.62v-59.99h680v59.99H140ZM140-450v-60h680v60H140Zm0-195.39v-59.99h680v59.99H140Z'/%3e%3c/svg%3e\",\n chevronUp:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m480-541.85-184 184L253.85-400 480-626.15 706.15-400 664-357.85l-184-184Z'/%3e%3c/svg%3e\",\n chevronDown:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M480-357.85 253.85-584 296-626.15l184 184 184-184L706.15-584 480-357.85Z'/%3e%3c/svg%3e\",\n chevronLeft:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M560-253.85 333.85-480 560-706.15 602.15-664l-184 184 184 184L560-253.85Z'/%3e%3c/svg%3e\",\n chevronRight:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m517.85-480-184-184L376-706.15 602.15-480 376-253.85 333.85-296l184-184Z'/%3e%3c/svg%3e\",\n arrowLeft:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m294.92-450 227.85 227.85L480-180 180-480l300-300 42.77 42.15L294.92-510H780v60H294.92Z'/%3e%3c/svg%3e\",\n arrowRight:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M665.08-450H180v-60h485.08L437.23-737.85 480-780l300 300-300 300-42.77-42.15L665.08-450Z'/%3e%3c/svg%3e\",\n home: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M240-200h133.85v-237.69h212.3V-200H720v-360L480-740.77 240-560v360Zm-60 60v-450l300-225.77L780-590v450H526.15v-237.69h-92.3V-140H180Zm300-330.38Z'/%3e%3c/svg%3e\",\n building:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M130-136.92v-540h160v-160h380v320h160v380H530v-160H430v160H130Zm60-60h100v-100H190v100Zm0-160h100v-100H190v100Zm0-160h100v-100H190v100Zm160 160h100v-100H350v100Zm0-160h100v-100H350v100Zm0-160h100v-100H350v100Zm160 320h100v-100H510v100Zm0-160h100v-100H510v100Zm0-160h100v-100H510v100Zm160 480h100v-100H670v100Zm0-160h100v-100H670v100Z'/%3e%3c/svg%3e\",\n externalLink:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M212.31-140Q182-140 161-161q-21-21-21-51.31v-535.38Q140-778 161-799q21-21 51.31-21h252.3v60h-252.3q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v535.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h535.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-252.3h60v252.3Q820-182 799-161q-21 21-51.31 21H212.31Zm176.46-206.62-42.15-42.15L717.85-760H560v-60h260v260h-60v-157.85L388.77-346.62Z'/%3e%3c/svg%3e\",\n link: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M432.31-298.46H281.54q-75.34 0-128.44-53.1Q100-404.65 100-479.98q0-75.33 53.1-128.44 53.1-53.12 128.44-53.12h150.77v60H281.54q-50.39 0-85.96 35.58Q160-530.38 160-480q0 50.38 35.58 85.96 35.57 35.58 85.96 35.58h150.77v60ZM330-450v-60h300v60H330Zm197.69 151.54v-60h150.77q50.39 0 85.96-35.58Q800-429.62 800-480q0-50.38-35.58-85.96-35.57-35.58-85.96-35.58H527.69v-60h150.77q75.34 0 128.44 53.1Q860-555.35 860-480.02q0 75.33-53.1 128.44-53.1 53.12-128.44 53.12H527.69Z'/%3e%3c/svg%3e\",\n expand:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M140-140v-300h60v198.23L718.23-760H520v-60h300v300h-60v-198.23L241.77-200H440v60H140Z'/%3e%3c/svg%3e\",\n gridView:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M140-520v-300h300v300H140Zm0 380v-300h300v300H140Zm380-380v-300h300v300H520Zm0 380v-300h300v300H520ZM200-580h180v-180H200v180Zm380 0h180v-180H580v180Zm0 380h180v-180H580v180Zm-380 0h180v-180H200v180Zm380-380Zm0 200Zm-200 0Zm0-200Z'/%3e%3c/svg%3e\",\n listView:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M293.08-597.69v-60H820v60H293.08Zm0 147.69v-60H820v60H293.08Zm0 147.69v-60H820v60H293.08ZM172.31-595.38q-13.73 0-23.02-9.4t-9.29-23.3q0-13.56 9.29-22.74 9.29-9.18 23.02-9.18t23.02 9.18q9.29 9.18 9.29 22.74 0 13.9-9.29 23.3t-23.02 9.4Zm0 147.3q-13.73 0-23.02-9.18Q140-466.43 140-480q0-14.31 9.29-23.5t23.02-9.19q13.73 0 23.02 9.19t9.29 23.5q0 13.57-9.29 22.74-9.29 9.18-23.02 9.18Zm0 148.08q-13.73 0-23.02-9.4T140-332.69q0-13.57 9.29-22.75t23.02-9.18q13.73 0 23.02 9.18t9.29 22.75q0 13.89-9.29 23.29-9.29 9.4-23.02 9.4Z'/%3e%3c/svg%3e\",\n\n // Actions & controls\n search:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M781.69-136.92 530.46-388.16q-30 24.77-69 38.77-39 14-80.69 14-102.46 0-173.54-71.07-71.07-71.08-71.07-173.54t71.07-173.54q71.08-71.07 173.54-71.07t173.54 71.07q71.07 71.08 71.07 173.54 0 42.85-14.38 81.85-14.39 39-38.39 67.84l251.23 251.23-42.15 42.16ZM380.77-395.38q77.31 0 130.96-53.66 53.66-53.65 53.66-130.96t-53.66-130.96q-53.65-53.66-130.96-53.66t-130.96 53.66Q196.15-657.31 196.15-580t53.66 130.96q53.65 53.66 130.96 53.66Z'/%3e%3c/svg%3e\",\n close:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M256-213.85 213.85-256l224-224-224-224L256-746.15l224 224 224-224L746.15-704l-224 224 224 224L704-213.85l-224-224-224 224Z'/%3e%3c/svg%3e\",\n plus: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M450-450H220v-60h230v-230h60v230h230v60H510v230h-60v-230Z'/%3e%3c/svg%3e\",\n minus:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M220-450v-60h520v60H220Z'/%3e%3c/svg%3e\",\n more: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M480-189.23q-24.75 0-42.37-17.63Q420-224.48 420-249.23q0-24.75 17.63-42.38 17.62-17.62 42.37-17.62 24.75 0 42.37 17.62Q540-273.98 540-249.23q0 24.75-17.63 42.37-17.62 17.63-42.37 17.63ZM480-420q-24.75 0-42.37-17.63Q420-455.25 420-480q0-24.75 17.63-42.37Q455.25-540 480-540q24.75 0 42.37 17.63Q540-504.75 540-480q0 24.75-17.63 42.37Q504.75-420 480-420Zm0-230.77q-24.75 0-42.37-17.62Q420-686.02 420-710.77q0-24.75 17.63-42.37 17.62-17.63 42.37-17.63 24.75 0 42.37 17.63Q540-735.52 540-710.77q0 24.75-17.63 42.38-17.62 17.62-42.37 17.62Z'/%3e%3c/svg%3e\",\n moreHorizontal:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M249.23-420q-24.75 0-42.37-17.63-17.63-17.62-17.63-42.37 0-24.75 17.63-42.37Q224.48-540 249.23-540q24.75 0 42.38 17.63 17.62 17.62 17.62 42.37 0 24.75-17.62 42.37Q273.98-420 249.23-420ZM480-420q-24.75 0-42.37-17.63Q420-455.25 420-480q0-24.75 17.63-42.37Q455.25-540 480-540q24.75 0 42.37 17.63Q540-504.75 540-480q0 24.75-17.63 42.37Q504.75-420 480-420Zm230.77 0q-24.75 0-42.38-17.63-17.62-17.62-17.62-42.37 0-24.75 17.62-42.37Q686.02-540 710.77-540q24.75 0 42.37 17.63 17.63 17.62 17.63 42.37 0 24.75-17.63 42.37Q735.52-420 710.77-420Z'/%3e%3c/svg%3e\",\n delete:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M292.31-140q-29.92 0-51.12-21.19Q220-182.39 220-212.31V-720h-40v-60h180v-35.38h240V-780h180v60h-40v507.69Q740-182 719-161q-21 21-51.31 21H292.31ZM680-720H280v507.69q0 5.39 3.46 8.85t8.85 3.46h375.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46V-720ZM376.16-280h59.99v-360h-59.99v360Zm147.69 0h59.99v-360h-59.99v360ZM280-720v520-520Z'/%3e%3c/svg%3e\",\n edit: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M200-200h50.46l409.46-409.46-50.46-50.46L200-250.46V-200Zm-60 60v-135.38l527.62-527.39q9.07-8.24 20.03-12.73 10.97-4.5 23-4.5t23.3 4.27q11.28 4.27 19.97 13.58l48.85 49.46q9.31 8.69 13.27 20 3.96 11.31 3.96 22.62 0 12.07-4.12 23.03-4.12 10.97-13.11 20.04L275.38-140H140Zm620.38-570.15-50.23-50.23 50.23 50.23Zm-126.13 75.9-24.79-25.67 50.46 50.46-25.67-24.79Z'/%3e%3c/svg%3e\",\n copy: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M362.31-260Q332-260 311-281q-21-21-21-51.31v-455.38Q290-818 311-839q21-21 51.31-21h335.38Q728-860 749-839q21 21 21 51.31v455.38Q770-302 749-281q-21 21-51.31 21H362.31Zm0-60h335.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85Zm-140 200Q192-120 171-141q-21-21-21-51.31v-515.38h60v515.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h395.38v60H222.31ZM350-320v-480 480Z'/%3e%3c/svg%3e\",\n download:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M480-328.46 309.23-499.23l42.16-43.38L450-444v-336h60v336l98.61-98.61 42.16 43.38L480-328.46ZM252.31-180Q222-180 201-201q-21-21-21-51.31v-108.46h60v108.46q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h455.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-108.46h60v108.46Q780-222 759-201q-21 21-51.31 21H252.31Z'/%3e%3c/svg%3e\",\n upload:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M450-328.46v-336l-98.61 98.61-42.16-43.38L480-780l170.77 170.77-42.16 43.38L510-664.46v336h-60ZM252.31-180Q222-180 201-201q-21-21-21-51.31v-108.46h60v108.46q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h455.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-108.46h60v108.46Q780-222 759-201q-21 21-51.31 21H252.31Z'/%3e%3c/svg%3e\",\n share:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M672.22-100q-44.91 0-76.26-31.41-31.34-31.41-31.34-76.28 0-6 4.15-29.16L284.31-404.31q-14.46 15-34.36 23.5t-42.64 8.5q-44.71 0-76.01-31.54Q100-435.39 100-480q0-44.61 31.3-76.15 31.3-31.54 76.01-31.54 22.74 0 42.64 8.5 19.9 8.5 34.36 23.5l284.46-167.08q-2.38-7.38-3.27-14.46-.88-7.08-.88-15.08 0-44.87 31.43-76.28Q627.49-860 672.4-860t76.25 31.44Q780-797.13 780-752.22q0 44.91-31.41 76.26-31.41 31.34-76.28 31.34-22.85 0-42.5-8.69Q610.15-662 595.69-677L311.23-509.54q2.38 7.39 3.27 14.46.88 7.08.88 15.08t-.88 15.08q-.89 7.07-3.27 14.46L595.69-283q14.46-15 34.12-23.69 19.65-8.69 42.5-8.69 44.87 0 76.28 31.43Q780-252.51 780-207.6t-31.44 76.25Q717.13-100 672.22-100Zm.09-60q20.27 0 33.98-13.71Q720-187.42 720-207.69q0-20.27-13.71-33.98-13.71-13.72-33.98-13.72-20.27 0-33.98 13.72-13.72 13.71-13.72 33.98 0 20.27 13.72 33.98Q652.04-160 672.31-160Zm-465-272.31q20.43 0 34.25-13.8 13.83-13.81 13.83-33.89t-13.83-33.89q-13.82-13.8-34.25-13.8-20.11 0-33.71 13.8Q160-500.08 160-480t13.6 33.89q13.6 13.8 33.71 13.8Zm498.88-286.02Q720-732.04 720-752.31q0-20.27-13.71-33.98Q692.58-800 672.31-800q-20.27 0-33.98 13.71-13.72 13.71-13.72 33.98 0 20.27 13.81 33.98 13.81 13.72 33.89 13.72 20.07 0 33.88-13.72Zm-33.88 510.64ZM207.69-480Zm464.62-272.31Z'/%3e%3c/svg%3e\",\n send: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M140-190v-580l688.46 290L140-190Zm60-90 474-200-474-200v147.69L416.92-480 200-427.69V-280Zm0 0v-400 400Z'/%3e%3c/svg%3e\",\n filter:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M411.15-260v-60h137.31v60H411.15ZM256.16-450v-60h447.3v60h-447.3ZM140-640v-60h680v60H140Z'/%3e%3c/svg%3e\",\n funnel:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M455.39-180q-15.08 0-25.23-10.16Q420-200.31 420-215.39v-231.53L196.08-731.38q-11.54-15.39-3.35-32 8.2-16.62 27.66-16.62h519.22q19.46 0 27.66 16.62 8.19 16.61-3.35 32L540-446.92v231.53q0 15.08-10.16 25.23Q519.69-180 504.61-180h-49.22ZM480-468l198-252H282l198 252Zm0 0Z'/%3e%3c/svg%3e\",\n refresh:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M481.54-180q-125.63 0-212.81-87.17-87.19-87.17-87.19-212.77 0-125.6 87.19-212.83Q355.91-780 481.54-780q70.15 0 132.77 31.19 62.61 31.2 104.15 88.04V-780h60v244.61H533.85v-59.99h158q-31.62-57.93-87.7-91.27Q548.08-720 481.54-720q-100 0-170 70t-70 170q0 100 70 170t170 70q77 0 139-44t87-116h63.23q-27.23 97.92-107.27 158.96Q583.46-180 481.54-180Z'/%3e%3c/svg%3e\",\n dragHandle:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M360-175.39q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Zm240 0q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Zm-240-240q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Zm240 0q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Zm-240-240q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Zm240 0q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Z'/%3e%3c/svg%3e\",\n qrCode:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M140-520v-300h300v300H140Zm60-60h180v-180H200v180Zm-60 440v-300h300v300H140Zm60-60h180v-180H200v180Zm320-320v-300h300v300H520Zm60-60h180v-180H580v180Zm165 440v-75h75v75h-75ZM520-365v-75h75v75h-75Zm75 75v-75h75v75h-75Zm-75 75v-75h75v75h-75Zm75 75v-75h75v75h-75Zm75-75v-75h75v75h-75Zm0-150v-75h75v75h-75Zm75 75v-75h75v75h-75Z'/%3e%3c/svg%3e\",\n\n // Status & feedback\n check:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M382-253.85 168.62-467.23 211.38-510 382-339.38 748.62-706l42.76 42.77L382-253.85Z'/%3e%3c/svg%3e\",\n checkCircle:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m423.23-309.85 268.92-268.92L650-620.92 423.23-394.15l-114-114L267.08-466l156.15 156.15ZM480.07-100q-78.84 0-148.21-29.92t-120.68-81.21q-51.31-51.29-81.25-120.63Q100-401.1 100-479.93q0-78.84 29.92-148.21t81.21-120.68q51.29-51.31 120.63-81.25Q401.1-860 479.93-860q78.84 0 148.21 29.92t120.68 81.21q51.31 51.29 81.25 120.63Q860-558.9 860-480.07q0 78.84-29.92 148.21t-81.21 120.68q-51.29 51.31-120.63 81.25Q558.9-100 480.07-100Zm-.07-60q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z'/%3e%3c/svg%3e\",\n xCircle:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m336-293.85 144-144 144 144L666.15-336l-144-144 144-144L624-666.15l-144 144-144-144L293.85-624l144 144-144 144L336-293.85ZM480.07-100q-78.84 0-148.21-29.92t-120.68-81.21q-51.31-51.29-81.25-120.63Q100-401.1 100-479.93q0-78.84 29.92-148.21t81.21-120.68q51.29-51.31 120.63-81.25Q401.1-860 479.93-860q78.84 0 148.21 29.92t120.68 81.21q51.31 51.29 81.25 120.63Q860-558.9 860-480.07q0 78.84-29.92 148.21t-81.21 120.68q-51.29 51.31-120.63 81.25Q558.9-100 480.07-100Zm-.07-60q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z'/%3e%3c/svg%3e\",\n alertCircle:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M502.92-300.15q9.39-9.39 9.39-22.93T502.92-346q-9.38-9.38-22.92-9.38-13.54 0-22.92 9.38-9.39 9.38-9.39 22.92 0 13.54 9.39 22.93 9.38 9.38 22.92 9.38 13.54 0 22.92-9.38ZM450-436.92h60v-240h-60v240ZM480.07-100q-78.84 0-148.21-29.92t-120.68-81.21q-51.31-51.29-81.25-120.63Q100-401.1 100-479.93q0-78.84 29.92-148.21t81.21-120.68q51.29-51.31 120.63-81.25Q401.1-860 479.93-860q78.84 0 148.21 29.92t120.68 81.21q51.31 51.29 81.25 120.63Q860-558.9 860-480.07q0 78.84-29.92 148.21t-81.21 120.68q-51.29 51.31-120.63 81.25Q558.9-100 480.07-100Zm-.07-60q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z'/%3e%3c/svg%3e\",\n info: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M450-290h60v-230h-60v230Zm52.92-307.75q9.39-9.29 9.39-23.02t-9.29-23.02q-9.29-9.28-23.02-9.28t-23.02 9.28q-9.29 9.29-9.29 23.02t9.39 23.02q9.38 9.29 22.92 9.29 13.54 0 22.92-9.29ZM480.07-100q-78.84 0-148.21-29.92t-120.68-81.21q-51.31-51.29-81.25-120.63Q100-401.1 100-479.93q0-78.84 29.92-148.21t81.21-120.68q51.29-51.31 120.63-81.25Q401.1-860 479.93-860q78.84 0 148.21 29.92t120.68 81.21q51.31 51.29 81.25 120.63Q860-558.9 860-480.07q0 78.84-29.92 148.21t-81.21 120.68q-51.29 51.31-120.63 81.25Q558.9-100 480.07-100Zm-.07-60q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z'/%3e%3c/svg%3e\",\n warning:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M74.62-140 480-840l405.38 700H74.62ZM178-200h604L480-720 178-200Zm324.92-57.08q9.39-9.38 9.39-22.92 0-13.54-9.39-22.92-9.38-9.39-22.92-9.39-13.54 0-22.92 9.39-9.39 9.38-9.39 22.92 0 13.54 9.39 22.92 9.38 9.39 22.92 9.39 13.54 0 22.92-9.39ZM450-352.31h60v-200h-60v200ZM480-460Z'/%3e%3c/svg%3e\",\n lock: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M252.31-100q-29.92 0-51.12-21.19Q180-142.39 180-172.31v-375.38q0-29.92 21.19-51.12Q222.39-620 252.31-620H300v-80q0-74.92 52.54-127.46Q405.08-880 480-880q74.92 0 127.46 52.54Q660-774.92 660-700v80h47.69q29.92 0 51.12 21.19Q780-577.61 780-547.69v375.38q0 29.92-21.19 51.12Q737.61-100 707.69-100H252.31Zm0-60h455.38q5.39 0 8.85-3.46t3.46-8.85v-375.38q0-5.39-3.46-8.85t-8.85-3.46H252.31q-5.39 0-8.85 3.46t-3.46 8.85v375.38q0 5.39 3.46 8.85t8.85 3.46Zm277.27-150.42Q550-330.85 550-360t-20.42-49.58Q509.15-430 480-430t-49.58 20.42Q410-389.15 410-360t20.42 49.58Q450.85-290 480-290t49.58-20.42ZM360-620h240v-80q0-50-35-85t-85-35q-50 0-85 35t-35 85v80ZM240-160v-400 400Z'/%3e%3c/svg%3e\",\n star: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m354-287 126-76 126 77-33-144 111-96-146-13-58-136-58 135-146 13 111 97-33 143Zm-91 125.46 57.31-246.77-191.46-165.92 252.61-21.92L480-828.84l98.54 232.69 252.61 21.92-191.46 165.92L697-161.54 480-292.46 263-161.54ZM480-470Z'/%3e%3c/svg%3e\",\n verified:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m352.46-85.39-71.38-120.3-135.54-29.7 13.23-139.53L66.93-480l91.84-105.08-13.23-139.53 135.54-29.7 71.38-120.3L480-820.46l127.54-54.15 71.38 120.3 135.54 29.7-13.23 139.53L893.07-480l-91.84 105.08 13.23 139.53-135.54 29.7-71.38 120.3L480-139.54 352.46-85.39ZM378-162l102-43.23L583.23-162 640-258l110-25.23L740-396l74-84-74-85.23L750-678l-110-24-58-96-102 43.23L376.77-798 320-702l-110 24 10 112.77L146-480l74 84-10 114 110 24 58 96Zm102-318Zm-42 128.15L650.15-564 608-607.38l-170 170-86-84.77L309.85-480 438-351.85Z'/%3e%3c/svg%3e\",\n\n // User & system\n profile:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M381.04-533.35Q340-574.38 340-632.31q0-57.92 41.04-98.96 41.04-41.04 98.96-41.04 57.92 0 98.96 41.04Q620-690.23 620-632.31q0 57.93-41.04 98.96-41.04 41.04-98.96 41.04-57.92 0-98.96-41.04ZM180-187.69v-88.93q0-29.38 15.96-54.42 15.96-25.04 42.66-38.5 59.3-29.07 119.65-43.61 60.35-14.54 121.73-14.54t121.73 14.54q60.35 14.54 119.65 43.61 26.7 13.46 42.66 38.5Q780-306 780-276.62v88.93H180Zm60-60h480v-28.93q0-12.15-7.04-22.5-7.04-10.34-19.11-16.88-51.7-25.46-105.42-38.58Q534.7-367.69 480-367.69q-54.7 0-108.43 13.11-53.72 13.12-105.42 38.58-12.07 6.54-19.11 16.88-7.04 10.35-7.04 22.5v28.93Zm296.5-328.12q23.5-23.5 23.5-56.5t-23.5-56.5q-23.5-23.5-56.5-23.5t-56.5 23.5q-23.5 23.5-23.5 56.5t23.5 56.5q23.5 23.5 56.5 23.5t56.5-23.5Zm-56.5-56.5Zm0 384.62Z'/%3e%3c/svg%3e\",\n group:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M71.93-187.69v-88.93q0-30.92 15.96-55.19 15.96-24.27 42.63-37.76 57.02-27.89 114.67-43.01 57.66-15.11 126.73-15.11 69.08 0 126.73 15.11 57.66 15.12 114.68 43.01 26.67 13.49 42.63 37.76 15.96 24.27 15.96 55.19v88.93H71.93Zm679.99 0v-93.85q0-39.38-19.28-75.07-19.29-35.68-54.72-61.23 40.23 6 76.39 18.57 36.15 12.58 69 29.73 31 16.54 47.88 38.99 16.88 22.44 16.88 49.01v93.85H751.92ZM272.96-533.35q-41.03-41.03-41.03-98.96 0-57.92 41.03-98.96 41.04-41.04 98.96-41.04 57.93 0 98.96 41.04 41.04 41.04 41.04 98.96 0 57.93-41.04 98.96-41.03 41.04-98.96 41.04-57.92 0-98.96-41.04Zm403.22 0q-41.12 41.04-98.87 41.04-6.77 0-17.23-1.54-10.47-1.54-17.23-3.38 23.66-28.45 36.37-63.12 12.7-34.67 12.7-72 0-37.34-12.96-71.73-12.96-34.38-36.11-63.3 8.61-3.08 17.23-4 8.61-.93 17.23-.93 57.75 0 98.87 41.04 41.12 41.04 41.12 98.96 0 57.93-41.12 98.96ZM131.92-247.69h480v-28.93q0-12.53-6.27-22.3-6.26-9.77-19.88-17.08-49.38-25.46-101.69-38.58-52.31-13.11-112.16-13.11-59.84 0-112.15 13.11-52.31 13.12-101.69 38.58-13.62 7.31-19.89 17.08-6.27 9.77-6.27 22.3v28.93Zm296.5-328.12q23.5-23.5 23.5-56.5t-23.5-56.5q-23.5-23.5-56.5-23.5t-56.5 23.5q-23.5 23.5-23.5 56.5t23.5 56.5q23.5 23.5 56.5 23.5t56.5-23.5Zm-56.5 328.12Zm0-384.62Z'/%3e%3c/svg%3e\",\n shieldPerson:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M387.62-487.62Q350-525.23 350-580q0-54.77 37.62-92.38Q425.23-710 480-710q54.77 0 92.38 37.62Q610-634.77 610-580q0 54.77-37.62 92.38Q534.77-450 480-450q-54.77 0-92.38-37.62Zm142.3-42.46Q550-550.15 550-580t-20.08-49.92Q509.85-650 480-650t-49.92 20.08Q410-609.85 410-580t20.08 49.92Q450.15-510 480-510t49.92-20.08ZM480-100.77q-129.77-35.39-214.88-152.77Q180-370.92 180-516v-230.15l300-112.31 300 112.31V-516q0 145.08-85.12 262.46Q609.77-136.16 480-100.77Zm0-378.85Zm0-315L240-705v189q0 57.08 16.35 110.39 16.34 53.3 45.42 99.46 40.46-20.62 84.73-32.23Q430.77-350 480-350t93.5 11.62q44.27 11.61 84.73 32.23 29.08-46.16 45.42-99.46Q720-458.92 720-516v-189l-240-89.62Zm-74.42 513q-35.73 8.39-67.5 23.54 29.77 33.08 65.5 57.2Q439.31-176.77 480-164q40.69-12.77 76.23-36.88 35.54-24.12 65.31-57.2-31.77-15.15-67.31-23.54Q518.69-290 480-290q-38.69 0-74.42 8.38Z'/%3e%3c/svg%3e\",\n settings:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m387.69-100-15.23-121.85q-16.07-5.38-32.96-15.07-16.88-9.7-30.19-20.77L196.46-210l-92.3-160 97.61-73.77q-1.38-8.92-1.96-17.92-.58-9-.58-17.93 0-8.53.58-17.34t1.96-19.27L104.16-590l92.3-159.23 112.46 47.31q14.47-11.46 30.89-20.96t32.27-15.27L387.69-860h184.62l15.23 122.23q18 6.54 32.57 15.27 14.58 8.73 29.43 20.58l114-47.31L855.84-590l-99.15 74.92q2.15 9.69 2.35 18.12.19 8.42.19 16.96 0 8.15-.39 16.58-.38 8.42-2.76 19.27L854.46-370l-92.31 160-112.61-48.08q-14.85 11.85-30.31 20.96-15.46 9.12-31.69 14.89L572.31-100H387.69ZM440-160h78.62L533-267.15q30.62-8 55.96-22.73 25.35-14.74 48.89-37.89L737.23-286l39.39-68-86.77-65.38q5-15.54 6.8-30.47 1.81-14.92 1.81-30.15 0-15.62-1.81-30.15-1.8-14.54-6.8-29.7L777.38-606 738-674l-100.54 42.38q-20.08-21.46-48.11-37.92-28.04-16.46-56.73-23.31L520-800h-79.38l-13.24 106.77q-30.61 7.23-56.53 22.15-25.93 14.93-49.47 38.46L222-674l-39.38 68L269-541.62q-5 14.24-7 29.62t-2 32.38q0 15.62 2 30.62 2 15 6.62 29.62l-86 65.38L222-286l99-42q22.77 23.38 48.69 38.31 25.93 14.92 57.31 22.92L440-160Zm40.46-200q49.92 0 84.96-35.04 35.04-35.04 35.04-84.96 0-49.92-35.04-84.96Q530.38-600 480.46-600q-50.54 0-85.27 35.04T360.46-480q0 49.92 34.73 84.96Q429.92-360 480.46-360ZM480-480Z'/%3e%3c/svg%3e\",\n notification:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M180-204.62v-59.99h72.31v-298.47q0-80.69 49.81-142.69 49.8-62 127.88-79.31V-810q0-20.83 14.57-35.42Q459.14-860 479.95-860q20.82 0 35.43 14.58Q530-830.83 530-810v24.92q78.08 17.31 127.88 79.31 49.81 62 49.81 142.69v298.47H780v59.99H180Zm300-293.07Zm-.07 405.38q-29.85 0-51.04-21.24-21.2-21.24-21.2-51.07h144.62q0 29.93-21.26 51.12-21.26 21.19-51.12 21.19Zm-167.62-172.3h335.38v-298.47q0-69.46-49.11-118.57-49.12-49.12-118.58-49.12-69.46 0-118.58 49.12-49.11 49.11-49.11 118.57v298.47Z'/%3e%3c/svg%3e\",\n favorite:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m480-146.93-44.15-39.69q-99.46-90.23-164.5-155.07-65.04-64.85-103.08-115.43-38.04-50.57-53.15-92.27Q100-591.08 100-634q0-85.15 57.42-142.58Q214.85-834 300-834q52.38 0 99 24.5t81 70.27q34.38-45.77 81-70.27 46.62-24.5 99-24.5 85.15 0 142.58 57.42Q860-719.15 860-634q0 42.92-15.12 84.61-15.11 41.7-53.15 92.27-38.04 50.58-102.89 115.43Q624-276.85 524.15-186.62L480-146.93Zm0-81.07q96-86.38 158-148.08 62-61.69 98-107.19t50-80.81q14-35.3 14-69.92 0-60-40-100t-100-40q-47.38 0-87.58 26.88-40.19 26.89-63.65 74.81h-57.54q-23.85-48.31-63.85-75Q347.38-774 300-774q-59.62 0-99.81 40Q160-694 160-634q0 34.62 14 69.92 14 35.31 50 80.81t98 107q62 61.5 158 148.27Zm0-273Z'/%3e%3c/svg%3e\",\n help: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M508.5-267.21q11.81-11.83 11.81-28.97 0-17.13-11.83-28.94-11.83-11.8-28.96-11.8-17.13 0-28.94 11.83-11.81 11.83-11.81 28.96 0 17.13 11.83 28.94 11.83 11.8 28.96 11.8 17.13 0 28.94-11.82Zm-57.27-131.41h56.31q.77-29.53 8.65-47.19 7.89-17.65 38.27-46.8 26.39-26.39 40.42-48.74 14.04-22.34 14.04-52.77 0-51.65-37.11-80.69-37.12-29.03-87.81-29.03-50.08 0-82.88 26.73-32.81 26.73-46.81 62.96l51.38 20.61q7.31-19.92 25-38.81 17.69-18.88 52.54-18.88 35.46 0 52.42 19.42 16.97 19.43 16.97 42.73 0 20.39-11.62 37.31-11.61 16.92-29.61 32.69-39.39 35.54-49.77 56.7-10.39 21.15-10.39 63.76ZM480.07-100q-78.84 0-148.21-29.92t-120.68-81.21q-51.31-51.29-81.25-120.63Q100-401.1 100-479.93q0-78.84 29.92-148.21t81.21-120.68q51.29-51.31 120.63-81.25Q401.1-860 479.93-860q78.84 0 148.21 29.92t120.68 81.21q51.31 51.29 81.25 120.63Q860-558.9 860-480.07q0 78.84-29.92 148.21t-81.21 120.68q-51.29 51.31-120.63 81.25Q558.9-100 480.07-100Zm-.07-60q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z'/%3e%3c/svg%3e\",\n calendar:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M212.31-100Q182-100 161-121q-21-21-21-51.31v-535.38Q140-738 161-759q21-21 51.31-21h55.38v-84.61h61.54V-780h303.08v-84.61h60V-780h55.38Q778-780 799-759q21 21 21 51.31v535.38Q820-142 799-121q-21 21-51.31 21H212.31Zm0-60h535.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-375.38H200v375.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85ZM200-607.69h560v-100q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H212.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v100Zm0 0V-720v112.31Zm280 210.77q-14.69 0-25.04-10.35-10.34-10.34-10.34-25.04 0-14.69 10.34-25.04 10.35-10.34 25.04-10.34t25.04 10.34q10.34 10.35 10.34 25.04 0 14.7-10.34 25.04-10.35 10.35-25.04 10.35Zm-185.04-10.35q-10.34-10.34-10.34-25.04 0-14.69 10.34-25.04 10.35-10.34 25.04-10.34t25.04 10.34q10.34 10.35 10.34 25.04 0 14.7-10.34 25.04-10.35 10.35-25.04 10.35t-25.04-10.35ZM640-396.92q-14.69 0-25.04-10.35-10.34-10.34-10.34-25.04 0-14.69 10.34-25.04 10.35-10.34 25.04-10.34t25.04 10.34q10.34 10.35 10.34 25.04 0 14.7-10.34 25.04-10.35 10.35-25.04 10.35ZM480-240q-14.69 0-25.04-10.35-10.34-10.34-10.34-25.03 0-14.7 10.34-25.04 10.35-10.35 25.04-10.35t25.04 10.35q10.34 10.34 10.34 25.04 0 14.69-10.34 25.03Q494.69-240 480-240Zm-185.04-10.35q-10.34-10.34-10.34-25.03 0-14.7 10.34-25.04 10.35-10.35 25.04-10.35t25.04 10.35q10.34 10.34 10.34 25.04 0 14.69-10.34 25.03Q334.69-240 320-240t-25.04-10.35ZM640-240q-14.69 0-25.04-10.35-10.34-10.34-10.34-25.03 0-14.7 10.34-25.04 10.35-10.35 25.04-10.35t25.04 10.35q10.34 10.34 10.34 25.04 0 14.69-10.34 25.03Q654.69-240 640-240Z'/%3e%3c/svg%3e\",\n clock:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m618.92-298.92 42.16-42.16L510-492.16V-680h-60v212.15l168.92 168.93ZM480.07-100q-78.84 0-148.21-29.92t-120.68-81.21q-51.31-51.29-81.25-120.63Q100-401.1 100-479.93q0-78.84 29.92-148.21t81.21-120.68q51.29-51.31 120.63-81.25Q401.1-860 479.93-860q78.84 0 148.21 29.92t120.68 81.21q51.31 51.29 81.25 120.63Q860-558.9 860-480.07q0 78.84-29.92 148.21t-81.21 120.68q-51.29 51.31-120.63 81.25Q558.9-100 480.07-100ZM480-480Zm0 320q133 0 226.5-93.5T800-480q0-133-93.5-226.5T480-800q-133 0-226.5 93.5T160-480q0 133 93.5 226.5T480-160Z'/%3e%3c/svg%3e\",\n mail: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M172.31-180Q142-180 121-201q-21-21-21-51.31v-455.38Q100-738 121-759q21-21 51.31-21h615.38Q818-780 839-759q21 21 21 51.31v455.38Q860-222 839-201q-21 21-51.31 21H172.31ZM480-457.69 160-662.31v410q0 5.39 3.46 8.85t8.85 3.46h615.38q5.39 0 8.85-3.46t3.46-8.85v-410L480-457.69Zm0-62.31 313.85-200h-627.7L480-520ZM160-662.31V-720v467.69q0 5.39 3.46 8.85t8.85 3.46H160v-422.31Z'/%3e%3c/svg%3e\",\n chat: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M250-410h300v-60H250v60Zm0-120h460v-60H250v60Zm0-120h460v-60H250v60ZM100-118.46v-669.23Q100-818 121-839q21-21 51.31-21h615.38Q818-860 839-839q21 21 21 51.31v455.38Q860-302 839-281q-21 21-51.31 21H241.54L100-118.46ZM216-320h571.69q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H172.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v523.08L216-320Zm-56 0v-480 480Z'/%3e%3c/svg%3e\",\n image:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M212.31-140Q182-140 161-161q-21-21-21-51.31v-535.38Q140-778 161-799q21-21 51.31-21h535.38Q778-820 799-799q21 21 21 51.31v535.38Q820-182 799-161q-21 21-51.31 21H212.31Zm0-60h535.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-535.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H212.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v535.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85ZM270-290h423.07L561.54-465.38 449.23-319.23l-80-102.31L270-290Zm-70 90v-560 560Z'/%3e%3c/svg%3e\",\n document:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M330-250h300v-60H330v60Zm0-160h300v-60H330v60Zm-77.69 310Q222-100 201-121q-21-21-21-51.31v-615.38Q180-818 201-839q21-21 51.31-21H570l210 210v477.69Q780-142 759-121q-21 21-51.31 21H252.31ZM540-620v-180H252.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v615.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h455.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46V-620H540ZM240-800v180-180V-160v-640Z'/%3e%3c/svg%3e\",\n payment:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M550-451.54q-41.92 0-70.96-29.04Q450-509.62 450-551.54q0-41.92 29.04-70.96 29.04-29.04 70.96-29.04 41.92 0 70.96 29.04Q650-593.46 650-551.54q0 41.92-29.04 70.96-29.04 29.04-70.96 29.04ZM286.15-327.69q-29.82 0-51.06-21.24-21.24-21.24-21.24-51.07v-303.08q0-29.82 21.24-51.06 21.24-21.24 51.06-21.24h527.69q29.83 0 51.07 21.24 21.24 21.24 21.24 51.06V-400q0 29.83-21.24 51.07-21.24 21.24-51.07 21.24H286.15Zm60-60h407.7q0-29.92 21.24-51.12Q796.33-460 826.15-460v-183.08q-29.92 0-51.11-21.24-21.19-21.24-21.19-51.06h-407.7q0 29.92-21.24 51.11-21.24 21.19-51.06 21.19V-460q29.92 0 51.11 21.24 21.19 21.24 21.19 51.07Zm420.77 200H146.16q-29.83 0-51.07-21.24Q73.85-230.17 73.85-260v-396.15h60V-260q0 4.61 3.84 8.46 3.85 3.85 8.47 3.85h620.76v60Zm-480.77-200h-12.3V-715.38h12.3q-5 0-8.65 3.65-3.65 3.65-3.65 8.65V-400q0 5 3.65 8.65 3.65 3.66 8.65 3.66Z'/%3e%3c/svg%3e\",\n bank: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M230-280v-300h60v300h-60Zm220 0v-300h60v300h-60ZM110.77-140v-60h738.46v60H110.77ZM670-280v-300h60v300h-60ZM110.77-660v-56.92L480-897.69l369.23 180.77V-660H110.77Zm141.84-60h454.78-454.78Zm0 0h454.78L480-830 252.61-720Z'/%3e%3c/svg%3e\",\n trendingUp:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M142.15-258.08 100-300.23l274.08-276.08 160 160 224.54-221.77H640v-60h220v220h-60v-117.84L534.08-330l-160-160-231.93 231.92Z'/%3e%3c/svg%3e\",\n extension:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M208.85-197.69h504.61q3.85 0 6.35-2.69 2.5-2.7 2.5-6.54v-176.31l36.92-15.85q18.31-6.84 29.54-23.53Q800-439.31 800-461.15q0-21.62-11.23-38.43t-29.54-24.04l-36.92-15.23v-176.53q0-4.24-2.5-6.74t-6.35-2.5H534.92l-7.3-51.07q-3.77-25.85-22.39-43.92-18.61-18.08-44.08-18.08-26.07 0-44.69 18.08-18.61 18.07-22.38 43.92l-7.31 51.07H208.46q-3.46 0-5.96 2.5t-2.5 6.74V-624q51.77 17.15 84.15 62.04 32.39 44.88 32.39 100.81 0 57.3-32.19 102.19-32.2 44.88-84.35 61.27v90.77q0 3.84 2.5 6.54 2.5 2.69 6.35 2.69Zm0 60q-29 0-48.93-20.12Q140-177.92 140-206.92V-347q48-1.54 82.27-33.58 34.27-32.04 34.27-80.57 0-45.62-34.46-78.12-34.46-32.5-82.08-36.42v-139.69q0-28.77 20.04-49t48.42-20.23h126.23q6.62-47.93 42.16-80.5 35.54-32.58 84.3-32.58 48.16 0 83.7 32.58 35.53 32.57 42.76 80.5h125.85q28.39 0 48.62 20.23 20.23 20.23 20.23 49v136.69q34.84 14.15 56.27 46.23Q860-500.38 860-461.15q0 39.07-21.42 70.96-21.43 31.88-56.27 46.57v136.7q0 29-20.23 49.11-20.23 20.12-48.62 20.12H208.85ZM500-461.15Z'/%3e%3c/svg%3e\",\n webhook:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M280-130q-78.77 0-134.38-55.62Q90-241.23 90-320q0-66.08 39.54-116.35 39.54-50.26 100.46-66.19v63q-35 14.31-57.5 46.85T150-320q0 53.85 38.08 91.92Q226.15-190 280-190t91.92-38.08Q410-266.15 410-320v-30h225.38q6.85-10.92 18.54-17.77 11.7-6.84 26.08-6.84 22.69 0 38.65 15.96 15.96 15.96 15.96 38.65 0 22.69-15.96 38.65-15.96 15.96-38.65 15.96-14.77 0-26.27-6.65T635.38-290H467.54q-11.69 71.31-65.04 115.65Q349.15-130 280-130Zm400 0q-49.08 0-89.96-22.89-40.88-22.88-67.27-61.72h81.61q15.16 11.53 34.85 18.07Q658.92-190 680-190q53.85 0 91.92-38.08Q810-266.15 810-320t-38.08-91.92Q733.85-450 680-450q-18.85 0-34.88 4.73-16.04 4.73-30.66 13.81l-117-194.93q-21-.53-36.54-15.57Q445.39-657 445.39-680q0-22.69 15.96-38.65 15.96-15.96 38.65-15.96 22.69 0 38.65 15.96 15.96 15.96 15.96 38.65 0 6.15-1.15 11.38-1.15 5.24-4.31 10.24L640-505.85q9.15-2 19.12-3.07Q669.08-510 680-510q78.77 0 134.38 55.62Q870-398.77 870-320t-55.62 134.38Q758.77-130 680-130ZM280-265.39q-22.69 0-38.65-15.96-15.96-15.96-15.96-38.65 0-21.23 14.57-36.85 14.58-15.61 36.89-16.76l98.23-163.31q-31.31-26.62-48.19-63.73Q310-637.77 310-680q0-78.77 55.62-134.38Q421.23-870 500-870t134.38 55.62Q690-758.77 690-680h-60q0-53.85-38.08-91.92Q553.85-810 500-810t-91.92 38.08Q370-733.85 370-680q0 42.62 24.08 75.5 24.07 32.88 63.3 46.89L328.54-342.62q3.15 5.39 4.61 10.93 1.46 5.54 1.46 11.69 0 22.69-15.96 38.65-15.96 15.96-38.65 15.96Z'/%3e%3c/svg%3e\",\n logout:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M212.31-140Q182-140 161-161q-21-21-21-51.31v-535.38Q140-778 161-799q21-21 51.31-21h268.07v60H212.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v535.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h268.07v60H212.31Zm436.92-169.23-41.54-43.39L705.08-450H363.85v-60h341.23l-97.39-97.38 41.54-43.39L820-480 649.23-309.23Z'/%3e%3c/svg%3e\",\n\n // Hand-authored: animated, no Material Symbols equivalent\n spinner:\n \"data:image/svg+xml;charset=UTF-8,%3csvg stroke='%23000' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg' %3e%3cstyle%3e .oui_spinner %7b transform-origin: center; animation: rotate_360 2s linear infinite;%7d .oui_spinner circle %7b stroke-linecap: round; animation: dash 1.5s ease-in-out infinite;%7d %40keyframes rotate_360 %7b 100%25 %7b transform: rotate(360deg);%7d %7d %40keyframes dash %7b 0%25 %7b stroke-dasharray: 0 150; stroke-dashoffset: 0;%7d 47.5%25 %7b stroke-dasharray: 42 150; stroke-dashoffset: -16;%7d 95%25, 100%25 %7b stroke-dasharray: 42 150; stroke-dashoffset: -59;%7d %7d %3c/style%3e%3cg class='oui_spinner'%3e%3ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3'%3e%3c/circle%3e%3c/g%3e%3c/svg%3e \",\n} satisfies Icons;\n\n/** Names guaranteed present on every theme. */\nexport type BaseIconName = keyof typeof BaseIcons;\n\n/**\n * An icon name. Autocompletes the built-in set while still allowing any name a\n * theme registers through `createTheme({ icons })`.\n */\nexport type IconName = BaseIconName | (string & {});\n","import type { ComponentThemes } from '../../component';\nimport { generatePalette, type PaletteConfig } from '../../color';\nimport type { GenerateColorsConfig } from '../../generation/palette.factory';\nimport { generateShadows } from '../../generation/shadow.generator';\nimport { BaseIcons } from '../../iconography/icon.records';\nimport type { TextRole, TextStyle } from '../../typography';\nimport type {\n Borders,\n Colors,\n Icons,\n Radii,\n Shadows,\n Spacing,\n Thicknesses,\n Typography,\n UniTheme,\n} from '../theme.model';\n\n// ==========================================\n// Type scale — the single source of type truth.\n// CSS-ready `typefaces` are derived from this on read (toTypefaces).\n// ==========================================\nconst BaseTypography: Typography = {\n 'display-large': {\n fontFamily: 'Red Hat Display',\n fontSize: 57,\n lineHeight: 64,\n fontWeight: 'normal',\n letterSpacing: -0.25,\n },\n 'display-medium': { fontFamily: 'Red Hat Display', fontSize: 45, lineHeight: 52, fontWeight: 'normal' },\n 'display-small': { fontFamily: 'Red Hat Display', fontSize: 36, lineHeight: 44, fontWeight: 'normal' },\n 'headline-large': { fontFamily: 'Red Hat Display', fontSize: 32, lineHeight: 40, fontWeight: 'normal' },\n 'headline-medium': { fontFamily: 'Red Hat Display', fontSize: 28, lineHeight: 36, fontWeight: 'normal' },\n 'headline-small': { fontFamily: 'Red Hat Display', fontSize: 24, lineHeight: 32, fontWeight: 'normal' },\n 'title-large': { fontFamily: 'Red Hat Display', fontSize: 22, lineHeight: 28, fontWeight: 'normal' },\n 'title-medium': {\n fontFamily: 'Red Hat Display',\n fontSize: 16,\n lineHeight: 24,\n fontWeight: 'medium',\n letterSpacing: 0.15,\n },\n 'title-small': {\n fontFamily: 'Red Hat Display',\n fontWeight: 'medium',\n fontSize: 14,\n lineHeight: 20,\n letterSpacing: 0.1,\n },\n 'body-1-long': { fontFamily: 'Roboto', fontSize: 16, lineHeight: 22 },\n 'body-1-short': { fontFamily: 'Roboto', fontSize: 16, lineHeight: 24 },\n 'body-2-long': { fontFamily: 'Roboto', fontSize: 14, lineHeight: 18 },\n 'body-2-short': { fontFamily: 'Roboto', fontSize: 14, lineHeight: 20 },\n 'subtitle-1': { fontFamily: 'Red Hat Display', fontSize: 16, lineHeight: 24, letterSpacing: 0.15 },\n 'subtitle-2': {\n fontFamily: 'Red Hat Display',\n fontSize: 14,\n lineHeight: 20,\n fontWeight: 'medium',\n letterSpacing: 0.1,\n },\n label: { fontFamily: 'Roboto', fontSize: 14, lineHeight: 20 },\n button: {\n fontFamily: 'Red Hat Display',\n fontSize: 14,\n lineHeight: 20,\n fontWeight: 'medium',\n textTransform: 'capitalize',\n },\n caption: { fontFamily: 'Roboto', fontSize: 12, lineHeight: 18, letterSpacing: 0.4 },\n overline: {\n fontFamily: 'Red Hat Display',\n fontSize: 10,\n lineHeight: 18,\n letterSpacing: 1.5,\n textTransform: 'uppercase',\n },\n paragraph: { fontFamily: 'Roboto', fontSize: 16, lineHeight: 24 },\n quote: { fontFamily: 'Roboto', fontSize: 16, lineHeight: 24 },\n note: { fontFamily: 'Roboto', fontSize: 14, lineHeight: 22, fontStyle: 'italic' },\n // Product-specific extras (were duplicated into `typefaces` before).\n badge: { fontFamily: 'Red Hat Display', fontSize: 16, lineHeight: 24 },\n // Stat-tile value: large, semibold, slightly tightened. Proportional\n // figures on purpose — tabular-nums is for columns, not display numbers.\n stat: {\n fontFamily: 'Red Hat Display',\n fontSize: 32,\n lineHeight: 38,\n fontWeight: 600,\n letterSpacing: -0.32,\n },\n tag: { fontFamily: 'Red Hat Display', fontSize: 15, lineHeight: 20, fontWeight: 600 },\n input: { fontFamily: 'Red Hat Display', fontSize: 14, lineHeight: 24 },\n} as Record<TextRole, TextStyle> & Record<string, TextStyle>;\n\n// ==========================================\n// Shared token scales — theme-agnostic.\n// ==========================================\nconst BaseShadows: Shadows = {\n raised:\n 'rgba(0, 0, 0, 0.2) 0px 2px 1px -1px, rgba(0, 0, 0, 0.14) 0px 1px 1px 0px, rgba(0, 0, 0, 0.12) 0px 1px 3px 0px',\n menu: 'rgba(0, 0, 0, 0.2) 0px 3px 3px -2px, rgba(0, 0, 0, 0.14) 0px 3px 4px 0px, rgba(0, 0, 0, 0.12) 0px 1px 8px 0px;',\n dialog:\n 'rgba(0, 0, 0, 0.2) 0px 3px 5px -1px, rgba(0, 0, 0, 0.14) 0px 6px 10px 0px, rgba(0, 0, 0, 0.12) 0px 1px 18px 0px',\n warn: '0 0 5px rgba(255, 0, 0, 0.5), inset 0 0 5px rgba(255, 0, 0, 0.3)',\n};\n\nconst BaseSpacing: Spacing = {\n // 0, not 'none': `padding: none` is invalid CSS and gets dropped, which let\n // user-agent defaults (e.g. <dialog>'s 1em padding) leak through the token.\n none: 0,\n xxs: '2px',\n xs: '4px',\n sm: '8px',\n md: '16px',\n lg: '32px',\n xl: '64px',\n};\n\nconst BaseThicknesses: Thicknesses = { thin: 1, standard: 2, thick: 4 };\n\nconst BaseRadii: Radii = {\n none: 'none',\n xxs: '4px',\n xs: '8px',\n sm: '16px',\n md: '24px',\n lg: '32px',\n max: '999px',\n};\n\n// ==========================================\n// Color-derived token builders — the reason a custom theme\n// only has to supply `colors`.\n// ==========================================\nconst buildBorders = (c: Colors): Borders => ({\n primary: `1px solid ${c.primary}`,\n secondary: `1px solid ${c.secondary}`,\n tertiary: `1px solid ${c.tertiary}`,\n quaternary: `1px solid ${c.quaternary}`,\n warn: `1px solid ${c.warn}`,\n success: `1px solid ${c.success}`,\n light: `1px solid ${c.outline}`,\n dark: `1px solid ${c['on-background']}`,\n dotted: `1px dotted ${c['on-background']}`,\n});\n\nconst buildComponents = (c: Colors): ComponentThemes => ({\n alert: {\n options: { topPosition: 40, borderRadius: 'sm', transitionSpeed: 0.35, elevation: 'md' },\n },\n // Trail typography, link/current colors, separator symbol and spacing are\n // tokens; the current page reads in the stronger ink.\n breadcrumb: {\n options: {\n typeface: 'label',\n color: 'on-background-variant',\n currentColor: 'on-background',\n separatorSymbol: 'chevron_right',\n gap: 'xs',\n },\n },\n // App shell: bar surface, divider, title type and spacing are all tokens.\n appBar: {\n options: {\n color: 'surface',\n height: 56,\n divider: 'light',\n typeface: 'title-large',\n padding: 'md',\n gap: 'md',\n elevation: undefined,\n },\n },\n // Navigation drawer: shares the dialog's native-<dialog> machinery in\n // 'over' mode (elevation + scrim backdrop); 'side' mode is an in-flow\n // aside separated by the divider border primitive.\n drawer: {\n options: {\n color: 'surface',\n width: 280,\n divider: 'light',\n elevation: 'menu',\n padding: 'md',\n backdrop: { background: 'rgba(0, 0, 0, 0.4)' },\n },\n },\n // Initials/icon avatars color from the role's container tokens; the radius\n // token makes them circles by default and squares under a 'sharp' theme.\n avatar: {\n options: { borderRadius: 'max', typeface: 'subtitle-2', fallbackSymbol: 'person' },\n variants: {\n primary: { backgroundColor: c['primary-container'], color: c['on-primary-container'] },\n secondary: { backgroundColor: c['secondary-container'], color: c['on-secondary-container'] },\n tertiary: { backgroundColor: c['tertiary-container'], color: c['on-tertiary-container'] },\n quaternary: { backgroundColor: c['surface-variant'], color: c['on-surface-variant'] },\n warn: { backgroundColor: c['warn-container'], color: c['on-warn-container'] },\n success: { backgroundColor: c['success-container'], color: c['on-success-container'] },\n },\n sizes: {\n sm: { height: 24, width: 24, fontSize: 10 },\n md: { height: 32, width: 32, fontSize: 13 },\n lg: { height: 40, width: 40, fontSize: 16 },\n xl: { height: 56, width: 56, fontSize: 22 },\n },\n },\n // Overlap is a spacing token; the ring separates stacked avatars using the\n // surface color so groups read on any background.\n avatarGroup: { options: { overlap: 'sm', ringColor: 'surface', ringWidth: 2 } },\n // Search field: chrome comes from the shared `input` options via\n // uni-input-box; these tokens style the affordances and suggestion list.\n searchInput: {\n options: {\n searchSymbol: 'search',\n clearSymbol: 'close',\n listColor: 'primary-surface',\n listShadow: 'menu',\n listBorderRadius: 'xs',\n maxSuggestions: 8,\n },\n },\n // Selection controls: chrome colors are tokens (accent fill/ring follows the\n // component's variant; its on-color pairs are derived in the component).\n checkbox: { options: { size: 20, boxColor: 'surface' } },\n radio: { options: { size: 20, ringColor: 'outline', fillColor: 'surface' } },\n dialog: {\n options: {\n borderRadius: 'lg',\n color: 'primary-surface',\n border: 'quaternary',\n padding: 'sm',\n elevation: 'dialog',\n backdrop: { background: 'rgba(255, 255, 255, 0.6)', backdropFilter: 'blur(2px)' },\n },\n },\n // Footer action row: every layout knob is a token so a theme can move from\n // the default centered pill pair to e.g. Carbon-style full-bleed halves\n // (stretch + reverseOrder + 'none' spacing) without touching the component.\n dialogButtons: {\n options: {\n gap: 'md',\n padding: 'md',\n paddingBottom: 'lg',\n justifyContent: 'center',\n confirmButtonVariant: 'primary',\n cancelButtonVariant: 'warn',\n buttonSize: 'lg',\n stretch: false,\n reverseOrder: false,\n },\n },\n dialogHeader: {\n options: {\n borderRadius: 'max',\n color: 'primary',\n height: 48,\n textRole: 'title-large',\n textAlign: 'center',\n closeButtonIcon: 'close',\n closeButtonSize: 'md',\n },\n },\n dropdown: {\n options: { border: 'none', borderRadius: 'xxs', color: 'primary-surface', shadow: 'menu' },\n },\n // Menu panel chrome. The undefined color/border/borderRadius/shadow fall\n // back to the `dropdown` options above, so menus follow generic popovers\n // until a theme deliberately splits them. Panel padding + item borderRadius\n // together select the archetype: full-bleed rows (padding none) vs. the\n // inset \"hover pill\" look (padding xs + menuItem borderRadius).\n menu: {\n options: {\n minWidth: 184,\n color: undefined,\n border: undefined,\n borderRadius: undefined,\n shadow: undefined,\n paddingVertical: 'xs',\n paddingHorizontal: 'none',\n dividerBorder: 'light',\n dividerSpacing: 'xs',\n },\n },\n // Item anatomy: every density/shape/type knob is a token, and `variants`\n // carry tones — an item declares `variant: 'warn'` and the theme decides\n // what a destructive action looks like. `activeSymbol` marks the selected\n // item; set it to undefined to drop the trailing symbol entirely.\n menuItem: {\n options: {\n height: 38,\n paddingHorizontal: 'md',\n gap: 'md',\n borderRadius: 'none',\n typeface: 'label',\n textColor: undefined,\n hoverColor: 'primary-container',\n activeSymbol: 'check',\n transitionSpeed: 0.35,\n },\n variants: {\n warn: {\n color: c.warn,\n '&:hover, &:focus': {\n backgroundColor: c['warn-container'],\n color: c['on-warn-container'],\n },\n },\n },\n },\n // Base reveal/collapse duration (seconds, matching alert/card\n // `transitionSpeed`) at a 240px-tall region; actual duration scales with\n // content height (√-of-height, clamped ~0.15–0.6s at this speed — see\n // `expandDuration`). The toggle's chevron rotation shares the clock.\n expand: { options: { transitionSpeed: 0.35 } },\n footer: { options: { height: 52, color: 'primary', logoHeight: 18.6, logoPadding: 'md' } },\n input: {\n options: {\n typeFace: 'input',\n color: 'primary-surface',\n textColor: 'on-primary-surface',\n disabledColor: 'disabled-surface',\n disabledTextColor: 'on-disabled-surface',\n border: 'light',\n borderRadius: 'xs',\n errorShadow: 'warn',\n errorBorder: 'warn',\n height: 32,\n paddingLeft: 'sm',\n focusOutline: `2px solid ${c.primary}`,\n focusOutlineOffset: 2,\n },\n },\n // Field chrome (color/border/typeface/focus) comes from the shared `input`\n // options via uni-input-box; these are the textarea-specific behaviors.\n textarea: { options: { rows: 3, resize: 'vertical' } },\n // Every visual knob is a token, so a theme can turn the default underline\n // tabs into pills (borderRadius 'max' + activeColor) or restyle the\n // indicator without touching component code.\n tabs: {\n options: {\n typeface: 'title-small',\n textColor: 'on-surface-variant',\n activeTextColor: 'primary',\n indicatorColor: 'primary',\n indicatorThickness: 'standard',\n divider: 'light',\n gap: 'sm',\n borderRadius: 'none',\n padding: 'md',\n activeColor: undefined,\n },\n },\n multiSelectDropdown: {\n options: {\n textRole: 'input',\n textColor: 'on-primary-surface',\n dividerBorder: 'light',\n searchInputBorder: 'light',\n searchInputBorderRadius: 'xxs',\n focusOutline: `2px solid ${c.primary}`,\n focusOutlineOffset: 2,\n },\n },\n badge: { options: { borderRadius: 'xxs' } },\n\n // ---- Buttons: variants are structural archetypes with interaction states ----\n button: {\n // Radius and typeface are tokens, not baked values: `max` renders the\n // classic pill and the type scale's `button` role carries the label\n // typography, so shape languages, custom radii, and typography edits\n // restyle every button by re-pointing or redefining a token.\n options: { borderRadius: 'max', typeface: 'button' },\n fixed: {\n position: 'relative',\n overflow: 'hidden',\n outline: '0',\n border: '0',\n cursor: 'pointer',\n transition: 'all 0.28s ease',\n },\n variants: {\n ghost: {\n backgroundColor: 'transparent',\n color: 'currentcolor',\n '&:hover': { backgroundColor: 'rgba(0,0,0,0.06)' },\n },\n // Solid\n primary: {\n backgroundColor: c.primary,\n color: c['on-primary'],\n border: '0',\n '&:hover': { filter: 'brightness(0.92)' },\n },\n // Hollow\n secondary: {\n backgroundColor: 'transparent',\n color: c.secondary,\n border: `1px solid ${c.secondary}`,\n '&:hover': { backgroundColor: c.secondary, color: c['on-secondary'] },\n },\n // Solid\n tertiary: {\n backgroundColor: c.tertiary,\n color: c['on-tertiary'],\n border: '0',\n '&:hover': { filter: 'brightness(0.92)' },\n },\n warn: {\n backgroundColor: c.warn,\n color: c['on-warn'],\n border: '0',\n '&:hover': { filter: 'brightness(0.92)' },\n },\n success: {\n backgroundColor: c.success,\n color: c['on-success'],\n border: '0',\n '&:hover': { filter: 'brightness(0.92)' },\n },\n disabled: {\n backgroundColor: `${c.disabled} !important`,\n color: `${c['on-disabled']} !important`,\n border: '0',\n },\n },\n // Sizes are geometry only (height/padding/fontSize); families, weights and\n // transforms come from the `typeface` option's type-scale role.\n sizes: {\n sm: { height: 22, fontSize: 12, padding: '0 12px', fontWeight: 600 },\n md: { height: 26, fontSize: 16, padding: '0 16px' },\n lg: { height: 36, fontSize: 18, padding: '0 18px' },\n xl: { height: 48, fontSize: 24, padding: '0 22px' },\n },\n },\n iconButton: {\n options: { borderRadius: 'max' },\n variants: {\n ghost: { backgroundColor: 'transparent', color: 'currentcolor' },\n primary: { backgroundColor: c.primary, color: c['on-primary'] },\n secondary: { backgroundColor: c.secondary, color: c['on-secondary'] },\n tertiary: { backgroundColor: c.tertiary, color: c['on-tertiary'] },\n warn: { backgroundColor: c.warn, color: c['on-warn'] },\n success: { backgroundColor: c.success, color: c['on-success'] },\n disabled: {\n backgroundColor: 'transparent !important',\n color: `${c['on-disabled']} !important`,\n },\n },\n sizes: {\n sm: { height: 22, minHeight: 22, width: 22, minWidth: 22, fontSize: 18 },\n md: { height: 26, minHeight: 26, width: 26, minWidth: 26, fontSize: 22 },\n lg: { height: 36, minHeight: 36, width: 36, minWidth: 36, fontSize: 30 },\n xl: { height: 40, minHeight: 40, width: 40, minWidth: 40, fontSize: 34 },\n },\n },\n progressGauge: {\n fixed: { textFill: c['on-background'] },\n // Track = the role's container token (the palette's soft tint of that\n // role), arc = the role base — so gauges follow any brand palette instead\n // of the fixed pastels they used to hardcode.\n variants: {\n primary: { backgroundColor: c['primary-container'], color: c.primary },\n secondary: { backgroundColor: c['secondary-container'], color: c.secondary },\n tertiary: { backgroundColor: c['tertiary-container'], color: c.tertiary },\n warn: { backgroundColor: c['warn-container'], color: c.warn },\n success: { backgroundColor: c['success-container'], color: c.success },\n },\n sizes: {\n sm: { height: '54px' },\n md: { height: '68px' },\n lg: { height: '82px' },\n xl: { height: '104px' },\n },\n },\n card: {\n // The frame is tokens: the border primitive named by the active variant\n // (borders.primary … borders.success — override with `border` to pin all\n // cards to one primitive, e.g. a custom 'brush-stroke'), the radii scale\n // (`xs` = the classic 8px), and an optional elevation shadow.\n options: { borderRadius: 'xs' },\n fixed: { overflow: 'hidden', backgroundColor: c.background },\n },\n cardHeader: {\n fixed: { padding: '12px 24px' },\n variants: {\n primary: { backgroundColor: c.primary, color: c['on-primary'] },\n secondary: { backgroundColor: c.secondary, color: c['on-secondary'] },\n tertiary: { backgroundColor: c.tertiary, color: c['on-tertiary'] },\n warn: { backgroundColor: c.warn, color: c['on-warn'] },\n success: { backgroundColor: c.success, color: c['on-success'] },\n },\n },\n cardContent: { fixed: { padding: '12px 24px' } },\n dataSearch: {\n options: {\n border: 'light',\n borderRadius: 'xs',\n color: 'primary-surface',\n placeholderColor: 'disabled',\n },\n },\n dataTable: {\n options: {\n color: 'primary-surface',\n border: 'light',\n borderRadius: 'sm',\n elevation: undefined,\n headerPadding: 'sm',\n footerPadding: 'sm',\n thTextRole: 'headline-small',\n thColor: 'primary-container',\n thVerticalBorder: 'dotted',\n thHorizontalBorder: 'light',\n thPadding: 'sm',\n tdTextRole: 'title-small',\n tdColor: 'primary-surface',\n tdStickyColor: 'primary-container',\n tdPadding: 'sm',\n tdVerticalBorder: 'dotted',\n tdHorizontalBorder: 'light',\n rowHoverColor: 'primary-container',\n loadingOverlayColor: 'scrim',\n loadingSpinnerColor: 'primary',\n loadingSpinnerSize: 40,\n },\n },\n notificationBadge: { options: { borderRadius: 'sm', offset: -10 } },\n paginator: {\n options: {\n gap: 'xs',\n textRole: 'label',\n inputBorder: 'light',\n inputBorderRadius: 'xs',\n pageBorderRadius: 'xs',\n currentPageBorder: 'light',\n currentPageBorderRadius: 'xs',\n },\n },\n // KPI tile: card-recipe frame, muted label over a large `stat`-role value;\n // delta inks are the semantic success/error (direction × goodness decided\n // by the component); sparkline in the outline hue, endpoint in the accent.\n stat: {\n options: {\n labelTypeface: 'label',\n valueTypeface: 'stat',\n color: 'surface',\n border: 'light',\n borderRadius: 'xs',\n positiveColor: 'success',\n negativeColor: 'error',\n trendColor: 'outline',\n trendAccent: 'primary',\n padding: 'md',\n gap: 'xxs',\n },\n },\n // Range input: fill/thumb in the accent, track in the muted surface, both\n // radius-tokened — geometry knobs are plain numbers.\n slider: {\n options: {\n color: 'primary',\n trackColor: 'surface-variant',\n borderRadius: 'max',\n trackHeight: 4,\n thumbSize: 16,\n },\n },\n // Loading placeholders paint with surface tokens so they sit naturally on\n // any theme; the shimmer highlight sweeps in the lighter surface color.\n skeleton: {\n options: {\n color: 'surface-variant',\n highlightColor: 'surface',\n borderRadius: 'xs',\n animation: 'shimmer',\n duration: 1.4,\n gap: 'sm',\n },\n },\n snackbar: {\n options: { bottomPosition: 40, transitionDelay: '0.35s', autoCloseDelay: 35000 },\n },\n symbol: { options: { fill: 0, weight: 400, grade: 0, opticalSize: 24 } },\n toggle: { options: { size: 20, trackColor: 'surface-variant', knobColor: 'surface' } },\n tooltip: {\n options: {\n border: undefined,\n borderRadius: 'xs',\n shadow: 'raised',\n color: 'inverse-surface',\n typeface: 'label',\n },\n },\n});\n\n// ==========================================\n// Theme factory. A custom theme = a name + a `colors` map.\n// Everything color-dependent (borders, component variants) is derived;\n// `borders`/`components` overrides deep-merge over the derived defaults, so a\n// theme file can define its own named primitives and rewire per-component\n// options without restating anything it doesn't touch.\n// ==========================================\nexport interface ThemeConfig {\n id: string;\n name: string;\n colors: Colors;\n /**\n * Named icon primitives (inline SVG data URIs, masked with `currentColor`),\n * merged over {@link BaseIcons}. Add or override under any name; components\n * render them by token via the icon component, never by inlining SVG.\n */\n icons?: Icons;\n /** Override the radii scale, e.g. a generated shape-language preset. */\n radii?: Radii;\n /** Override the elevation shadows, e.g. brand-tinted generated stacks. */\n shadows?: Shadows;\n /**\n * Named border primitives, merged over the derived defaults. New tokens may\n * use any name — point component options (or `components` overrides) at\n * them and every consumer of the shared token picks up the change.\n */\n borders?: Borders;\n /**\n * Sparse per-component overrides, deep-merged over the derived component\n * themes: only the sections you provide (fixed/variants/sizes/options keys)\n * are replaced; everything else keeps tracking the library defaults.\n */\n components?: ComponentThemes;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst deepMerge = <T>(base: T, override: Partial<T> | undefined): T => {\n if (!override) return base;\n const out = { ...base } as Record<string, unknown>;\n for (const [key, value] of Object.entries(override)) {\n out[key] = isRecord(value) && isRecord(out[key]) ? deepMerge(out[key], value) : value;\n }\n return out as T;\n};\n\nexport const createTheme = ({\n id,\n name,\n colors,\n icons = {},\n radii = BaseRadii,\n shadows = BaseShadows,\n borders,\n components,\n}: ThemeConfig): UniTheme => ({\n id,\n name,\n colors,\n typography: BaseTypography,\n borders: deepMerge(buildBorders(colors), borders),\n radii,\n shadows,\n spacing: BaseSpacing,\n thicknesses: BaseThicknesses,\n icons: { ...BaseIcons, ...icons },\n components: deepMerge(buildComponents(colors), components),\n});\n\n/**\n * Build a full {@link UniTheme} straight from a {@link PaletteConfig} — the\n * one-call path a theme builder uses to turn a brand color (or a seed +\n * scheme + category) into a complete, ready-to-apply theme.\n */\nexport const createThemeFromPalette = (\n config: GenerateColorsConfig & { id?: string; name?: string; icons?: Icons; radii?: Radii }\n): UniTheme => {\n const colors = generatePalette(config);\n return createTheme({\n id: config.id ?? 'CustomTheme',\n name: config.name ?? 'Custom Theme',\n colors,\n radii: config.radii,\n shadows: generateShadows(colors, config.mode ?? 'light'),\n icons: config.icons,\n });\n};\n\n/**\n * Seed for the shipped Light/Dark themes. Swap these three values (or call\n * `generatePalette` with your own) to reskin the entire system — every color\n * token is derived, so there is nothing else to hand-author.\n */\nexport const BASE_PALETTE_CONFIG: Pick<PaletteConfig, 'seed' | 'scheme' | 'category'> = {\n seed: '#4F46E5', // indigo\n scheme: 'triadic',\n category: 'neutral',\n};\n\nexport const lightColors: Colors = generatePalette({ ...BASE_PALETTE_CONFIG, mode: 'light' });\n\nexport const BaseTheme: UniTheme = createTheme({\n id: 'BaseTheme',\n name: 'Base Theme',\n colors: lightColors,\n});\n","import type { ColorCategory, ColorScheme } from '../color/color.types';\nimport type { Radii, UniTheme } from '../theme/theme.model';\nimport type { BrandRole } from '../color/color.factory';\nimport { createTheme } from '../theme/themes/base.theme';\nimport { hexToOklch, oklchToHex } from './oklch.helper';\nimport { CategoryChroma, generateColors } from './palette.factory';\nimport { generateShadows } from './shadow.generator';\nimport type {\n ContrastCheck,\n GeneratedThemeConfig,\n GenerationInput,\n ThemeShape,\n} from './generation.types';\n\n/** Radii presets per shape language (PRD §3.5.A). Same keys as `BaseRadii`. */\nexport const ShapeRadii: Record<ThemeShape, Radii> = {\n sharp: { none: 'none', xxs: '0px', xs: '0px', sm: '0px', md: '0px', lg: '0px', max: '0px' },\n modern: { none: 'none', xxs: '4px', xs: '8px', sm: '16px', md: '24px', lg: '32px', max: '999px' },\n playful: { none: 'none', xxs: '8px', xs: '16px', sm: '24px', md: '32px', lg: '48px', max: '9999px' },\n};\n\n/** Shortest angular distance between two hue angles, in degrees (0–180). */\nconst hueDistance = (a: number, b: number): number => {\n const d = Math.abs(a - b) % 360;\n return d > 180 ? 360 - d : d;\n};\n\n/**\n * Classify 2–3 brand hues against {@link ColorScheme} by their angular\n * distances from the primary hue. Heuristic bands, widest match wins.\n */\nexport const classifyScheme = (primaryHue: number, otherHues: number[]): ColorScheme => {\n const distances = otherHues.map((h) => hueDistance(primaryHue, h));\n if (distances.length === 0) return 'analogous';\n if (distances.every((d) => d < 15)) return 'monochromatic';\n if (distances.every((d) => d <= 65)) return 'analogous';\n if (distances.some((d) => d >= 165)) return 'complimentary';\n if (distances.length > 1 && distances.every((d) => d >= 130)) return 'splitComplimentary';\n return 'triadic';\n};\n\n/**\n * Infer a tonal category from the seed's own chroma, so an unstated \"vibe\"\n * preserves the brand's character — vivid stays vivid, muted stays muted.\n */\nexport const inferCategory = (seedHex: string): ColorCategory => {\n const { c } = hexToOklch(seedHex);\n if (c >= 0.13) return 'jewel';\n if (c >= 0.07) return 'earth';\n if (c >= 0.03) return 'pastel';\n return 'neutral';\n};\n\n/**\n * The theme generation engine (PRD §3.3): brand seed(s) in, complete WCAG-AA\n * light+dark {@link Colors} pair out, with a machine-readable contrast report.\n * Pure and deterministic — identical input yields identical output.\n */\nexport const generateThemes = (input: GenerationInput): GeneratedThemeConfig => {\n const seeds = (Array.isArray(input.seed) ? input.seed : [input.seed]).slice(0, 3);\n const [primary, secondary, tertiary] = seeds;\n const scheme =\n input.scheme ??\n (seeds.length > 1\n ? classifyScheme(hexToOklch(primary).h, seeds.slice(1).map((s) => hexToOklch(s).h))\n : 'analogous');\n const category = input.vibe ?? inferCategory(primary);\n\n // Seeds pass through as soft targets with their own chroma (brand fidelity).\n // Only an *explicit* vibe caps them to the category's chroma ceiling.\n const applyVibe = (hex: string): string => {\n if (!input.vibe) return hex;\n const color = hexToOklch(hex);\n return oklchToHex({ ...color, c: Math.min(color.c, CategoryChroma[input.vibe]) });\n };\n const targets: Partial<Record<BrandRole, string>> = { primary: applyVibe(primary) };\n if (secondary) targets.secondary = applyVibe(secondary);\n if (tertiary) targets.tertiary = applyVibe(tertiary);\n\n const checks: ContrastCheck[] = [];\n const base = { seed: primary, scheme, category, targets, checks };\n const lightColors = generateColors({ ...base, mode: 'light' });\n const darkColors = generateColors({ ...base, mode: 'dark' });\n\n const worstRatio = checks.reduce((worst, check) => Math.min(worst, check.ratio), 21);\n return {\n lightColors,\n darkColors,\n radii: input.shape ? ShapeRadii[input.shape] : undefined,\n lightShadows: generateShadows(lightColors, 'light'),\n darkShadows: generateShadows(darkColors, 'dark'),\n report: { checks, worstRatio, pass: checks.every((check) => check.pass) },\n };\n};\n\n/**\n * Convenience wrapper: {@link generateThemes} piped through `createTheme()`,\n * returning a registration-ready light/dark {@link UniTheme} pair.\n */\nexport const generateUniThemes = (input: GenerationInput): { light: UniTheme; dark: UniTheme } => {\n const { lightColors, darkColors, radii, lightShadows, darkShadows } = generateThemes(input);\n const name = input.name ?? 'Brand';\n const id = name.replace(/\\W+/g, '') || 'Brand';\n return {\n light: createTheme({\n id: `${id}Light`,\n name: `${name} Light`,\n colors: lightColors,\n radii,\n shadows: lightShadows,\n }),\n dark: createTheme({\n id: `${id}Dark`,\n name: `${name} Dark`,\n colors: darkColors,\n radii,\n shadows: darkShadows,\n }),\n };\n};\n","import type { Colors, Shadows } from '../theme/theme.model';\nimport { generateThemes } from './theme.generator';\nimport type { ContrastReport, GenerationInput } from './generation.types';\n\nexport interface ThemeFileInput extends GenerationInput {\n /** Emit the dark theme alongside the light one. Defaults to true. */\n darkMode?: boolean;\n}\n\n/** A rendered static theme file plus everything a consumer needs to wire it. */\nexport interface EmittedThemeFile {\n /** TypeScript source for a static `uni-theme.ts` — plain, reviewable data. */\n content: string;\n /** Registration snippet for the consumer's `app.config.ts`. */\n providerSnippet: string;\n report: ContrastReport;\n /** One-line human summary of the contrast report. */\n reportSummary: string;\n}\n\nconst IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\nconst asKey = (k: string): string => (IDENT.test(k) ? k : `'${k}'`);\n\nconst recordLiteral = (record: Record<string, string | undefined>, indent: string): string =>\n Object.entries(record)\n .map(([k, v]) => `${indent}${asKey(k)}: '${v}',`)\n .join('\\n');\n\n// The derived border primitives, spelled out as template literals over the\n// colors const — visible, editable, and edits to a color propagate. Access is\n// bracket-only: `Colors` carries an index signature, and consumer tsconfigs\n// with `noPropertyAccessFromIndexSignature` (ng new strict default) reject\n// dot access on it.\nconst bordersLiteral = (): string =>\n [\n '/**',\n ' * Named border primitives. These mirror the derived defaults — edit them, or',\n ' * add your own under any token name and point component options (or the',\n ' * `components` overrides below) at it. Every component deriving from a',\n ' * shared token picks up the change.',\n ' */',\n 'const borders = (colors: Colors): Borders => ({',\n \" primary: `1px solid ${colors['primary']}`,\",\n \" secondary: `1px solid ${colors['secondary']}`,\",\n \" tertiary: `1px solid ${colors['tertiary']}`,\",\n \" quaternary: `1px solid ${colors['quaternary']}`,\",\n \" warn: `1px solid ${colors['warn']}`,\",\n \" success: `1px solid ${colors['success']}`,\",\n \" light: `1px solid ${colors['outline']}`,\",\n \" dark: `1px solid ${colors['on-background']}`,\",\n \" dotted: `1px dotted ${colors['on-background']}`,\",\n '});',\n ].join('\\n');\n\nconst themeExport = (\n exportName: string,\n displayName: string,\n colorsConst: string,\n shadowsConst: string,\n radii: boolean\n): string =>\n [\n `export const ${exportName}: UniTheme = createTheme({`,\n ` id: '${exportName}',`,\n ` name: '${displayName}',`,\n ` colors: ${colorsConst},`,\n ` borders: borders(${colorsConst}),`,\n ` components: components(${colorsConst}),`,\n ` shadows: ${shadowsConst},`,\n ' icons,',\n ...(radii ? [' radii,'] : []),\n '});',\n ].join('\\n');\n\n/**\n * Render a static `uni-theme.ts` from a brand seed — the file the `ng add`\n * schematic writes and the MCP `generate_uni_theme` tool returns.\n *\n * The file is the system's **source of truth**: literal colors, the border\n * primitives spelled out, and a sparse `components` override section — so a\n * human (or an AI agent) can retheme by editing tokens in place, with no\n * runtime generation. Deterministic: same input, same file.\n */\nexport const emitThemeFile = (input: ThemeFileInput): EmittedThemeFile => {\n const { darkMode = true, name = 'Brand' } = input;\n const { lightColors, darkColors, radii, lightShadows, darkShadows, report } =\n generateThemes(input);\n const id = (name.replace(/\\W+/g, '') || 'Brand') as string;\n\n const seeds = Array.isArray(input.seed) ? input.seed : [input.seed];\n const regenerate = [\n `--brand=${seeds.join(',')}`,\n input.vibe && `--vibe=${input.vibe}`,\n input.scheme && `--scheme=${input.scheme}`,\n input.shape && `--shape=${input.shape}`,\n !darkMode && '--dark-mode=false',\n ]\n .filter(Boolean)\n .join(' ');\n\n const reportSummary = `${report.checks.length} contrast pairs checked · worst ${report.worstRatio}:1 · ${\n report.pass ? 'all AA' : `${report.checks.filter((c) => !c.pass).length} failing`\n }`;\n\n const modes: {\n exportName: string;\n displayName: string;\n colorsConst: string;\n colors: Colors;\n shadowsConst: string;\n shadows: Shadows;\n }[] = [\n {\n exportName: `${id}Light`,\n displayName: `${name} Light`,\n colorsConst: 'lightColors',\n colors: lightColors,\n shadowsConst: 'lightShadows',\n shadows: lightShadows,\n },\n ...(darkMode\n ? [\n {\n exportName: `${id}Dark`,\n displayName: `${name} Dark`,\n colorsConst: 'darkColors',\n colors: darkColors,\n shadowsConst: 'darkShadows',\n shadows: darkShadows,\n },\n ]\n : []),\n ];\n\n const content = [\n '/**',\n ` * ${name} theme for Uni — generated data, yours to edit.`,\n ' *',\n ` * Regenerate colors: ng add @uni-design-system/uni-angular ${regenerate}`,\n ' * (or the `generate-uni-theme` MCP tool). Edits are never overwritten silently —',\n ' * regeneration rewrites this file, so commit before regenerating.',\n ` * ${reportSummary}.`,\n ' */',\n 'import {',\n ' createTheme,',\n ' type Borders,',\n ' type Colors,',\n ' type ComponentThemes,',\n ' type Icons,',\n ' type Shadows,',\n ' type UniTheme,',\n \"} from '@uni-design-system/uni-core';\",\n '',\n ...modes.map(\n ({ colorsConst, colors }) =>\n `const ${colorsConst}: Colors = {\\n${recordLiteral(colors as Record<string, string>, ' ')}\\n};\\n`\n ),\n '/** Brand-tinted elevation shadows — theme-scoped, edit freely. */',\n ...modes.map(\n ({ shadowsConst, shadows }) =>\n `const ${shadowsConst}: Shadows = {\\n${recordLiteral(shadows as Record<string, string>, ' ')}\\n};\\n`\n ),\n bordersLiteral(),\n '',\n '/**',\n ' * Sparse component overrides, deep-merged over Uni component defaults: only',\n ' * what you write here changes. Point components at your own primitives, e.g.:',\n \" * button: { variants: { secondary: { border: `2px dashed ${colors['tertiary']}` } } },\",\n \" * input: { options: { borderRadius: 'max' } },\",\n ' */',\n 'const components = (colors: Colors): ComponentThemes => ({});',\n '',\n '/**',\n ' * Icon primitives, merged over the built-in 61-icon set per name: reuse a',\n ' * built-in name to reskin it, or add any new name. Define an icon ONCE here',\n \" * and render it anywhere via `<uni-icon name='…'/>` — never inline SVG in\",\n ' * components.',\n ' *',\n ' * Encode your own SVGs with `svgToIconUri` rather than by hand — it strips',\n ' * fixed width/height, escapes the URI and rejects artwork that cannot',\n ' * survive masking:',\n ' *',\n \" * import { svgToIconUri } from '@uni-design-system/uni-core';\",\n \" * const icons: Icons = { logo: svgToIconUri(readFileSync('logo.svg', 'utf8')) };\",\n ' *',\n ' * Icons are masked with currentColor, so they recolor with the theme — but',\n ' * that also means they are MONOCHROME: the mask uses the alpha channel, so a',\n ' * multi-color mark flattens to its silhouette. Keep one grid (viewBox) across',\n ' * your set, or the glyphs will not share an optical weight.',\n ' */',\n 'const icons: Icons = {};',\n '',\n ...(radii\n ? [\n `/** Shape language: '${input.shape}'. */`,\n `const radii = {\\n${recordLiteral(radii as Record<string, string>, ' ')}\\n};`,\n '',\n ]\n : []),\n ...modes.map(\n ({ exportName, displayName, colorsConst, shadowsConst }) =>\n `${themeExport(exportName, displayName, colorsConst, shadowsConst, !!radii)}\\n`\n ),\n '/** First key wins as the default theme when registered via UNI_THEMES. */',\n `export const ${id}Themes = { ${modes.map((m) => m.exportName).join(', ')} };`,\n '',\n ].join('\\n');\n\n const providerSnippet = [\n `import { UNI_THEMES } from '@uni-design-system/uni-angular';`,\n `import { ${id}Themes } from './uni-theme';`,\n '',\n '// app.config.ts → providers:',\n `{ provide: UNI_THEMES, useValue: ${id}Themes },`,\n ].join('\\n');\n\n return { content, providerSnippet, report, reportSummary };\n};\n","import { Gradient } from './gradient.model';\n\nexport function gradient(config: Gradient): string {\n return ``;\n}\n","/**\n * Turns a raw SVG source string into an icon primitive — the inline data URI\n * form `uni-icon` renders as a CSS mask over `currentColor`.\n *\n * This is the path for bringing your own icons (a brand set, a designer\n * handoff) into a theme. The built-in `BaseIcons` are generated separately\n * from Material Symbols; everything you add goes through here:\n *\n * ```ts\n * const icons: Icons = {\n * acmeLogo: svgToIconUri(readFileSync('brand/logo.svg', 'utf8')),\n * search: svgToIconUri(readFileSync('brand/search.svg', 'utf8')),\n * };\n * createTheme({ id: 'Acme', name: 'Acme', colors, icons });\n * ```\n *\n * `createTheme` merges these over `BaseIcons` per name, so reusing a built-in\n * name reskins it and any new name is simply added.\n */\n\nexport interface SvgToIconUriOptions {\n /**\n * Accept an SVG that paints in more than one color. Masks are monochrome —\n * the artwork is flattened to its silhouette and takes `currentColor` — so\n * this is rejected by default to catch logos that were never going to\n * survive the pipeline. Set this when a silhouette is what you want.\n */\n allowMultiColor?: boolean;\n /** Name used in error messages, so a failing icon in a set is identifiable. */\n name?: string;\n}\n\n/** Paint values that produce no pixels, and so never count as a color. */\nconst BLANK_PAINT = new Set(['none', 'transparent', 'inherit', '']);\n\n/** Collect every distinct paint value the artwork actually renders with. */\nfunction paintValues(svg: string): string[] {\n const found = new Set<string>();\n\n for (const [, value] of svg.matchAll(/\\b(?:fill|stroke)\\s*=\\s*[\"']([^\"']*)[\"']/g)) {\n const paint = value.trim().toLowerCase();\n if (!BLANK_PAINT.has(paint)) found.add(paint);\n }\n // `style=\"fill:#fff\"` — same meaning, different syntax.\n for (const [, , value] of svg.matchAll(/\\b(fill|stroke)\\s*:\\s*([^;\"'}]+)/g)) {\n const paint = value.trim().toLowerCase();\n if (!BLANK_PAINT.has(paint)) found.add(paint);\n }\n\n return [...found];\n}\n\n/**\n * Strip everything that stops an SVG scaling to the box it is masked into, and\n * collapse it to one line. Fixed `width`/`height` are removed rather than\n * rejected — designers export them by default and they carry no information\n * the `viewBox` doesn't already have.\n */\nfunction normalize(svg: string): string {\n return svg\n .replace(/<\\?xml[^>]*\\?>/g, '')\n .replace(/<!DOCTYPE[^>]*>/gi, '')\n .replace(/<!--[\\s\\S]*?-->/g, '')\n .replace(/\\s(width|height)\\s*=\\s*[\"'][^\"']*[\"']/g, '')\n .replace(/\\s+/g, ' ')\n .replace(/>\\s+</g, '><')\n .trim();\n}\n\n/**\n * Percent-encode only what a data URI requires. SVG attributes are switched to\n * single quotes so the result drops straight into a double-quoted TypeScript\n * string with no escaping — and stays readable, unlike base64.\n */\nfunction encode(svg: string): string {\n return (\n 'data:image/svg+xml,' +\n svg\n .replace(/\"/g, \"'\")\n .replace(/%/g, '%25')\n .replace(/#/g, '%23')\n .replace(/</g, '%3c')\n .replace(/>/g, '%3e')\n );\n}\n\n/**\n * Encode an SVG string as a mask-ready icon data URI, validating that it will\n * actually survive the mask pipeline.\n *\n * Throws when the source is not a complete `<svg>` document, has no `viewBox`\n * (it could not scale), references an external or raster image, or paints in\n * more than one color (see {@link SvgToIconUriOptions.allowMultiColor}).\n */\nexport function svgToIconUri(svg: string, options: SvgToIconUriOptions = {}): string {\n const label = options.name ? `${options.name}: ` : '';\n const fail = (message: string): never => {\n throw new Error(`${label}${message}`);\n };\n\n if (typeof svg !== 'string' || !svg.trim()) fail('empty SVG source');\n\n const normalized = normalize(svg);\n\n if (!/^<svg[\\s>]/i.test(normalized) || !/<\\/svg>$/i.test(normalized)) {\n fail('not a complete <svg> document');\n }\n\n // Without a viewBox the mask has no intrinsic ratio to scale by, and\n // `uni-icon` sizes itself from its container.\n if (!/\\bviewBox\\s*=\\s*[\"'][^\"']+[\"']/i.test(normalized)) {\n fail('no viewBox — the icon could not scale to its container');\n }\n\n // A mask is rendered as an isolated image: it cannot fetch anything, so an\n // external reference silently renders nothing.\n if (/<image\\b/i.test(normalized)) {\n fail('contains a raster <image>; masks need vector artwork');\n }\n if (/\\b(?:xlink:)?href\\s*=\\s*[\"'](?!#)/i.test(normalized)) {\n fail('references an external resource, which a masked SVG cannot load');\n }\n\n if (!options.allowMultiColor) {\n const paints = paintValues(normalized);\n if (paints.some((p) => p.startsWith('url('))) {\n fail(\n 'paints with a gradient or pattern — masks use the alpha channel only, ' +\n 'so it would flatten to a silhouette. Pass { allowMultiColor: true } to accept that.'\n );\n }\n if (paints.length > 1) {\n fail(\n `paints in ${paints.length} colors (${paints.join(', ')}) — masks use the alpha ` +\n 'channel only, so it would flatten to a silhouette in currentColor. ' +\n 'Pass { allowMultiColor: true } to accept that.'\n );\n }\n }\n\n return encode(normalized);\n}\n","import { Size } from '../core.types';\nimport { DeviceOrientation } from './layout.types';\n\nexport function getDeviceSize(height: number, width: number): Size {\n if (!height || !width) return 'md';\n\n const max = Math.max(height, width);\n\n if (max <= 600)\n // Small Mobile\n return 'xs';\n\n if (max <= 960)\n // Large Mobile\n return 'sm';\n\n if (max <= 1264)\n // Tablets\n return 'md';\n\n if (max <= 1904)\n // Laptops & Monitors\n return 'lg';\n\n return 'xl'; // Large Monitors\n}\n\nexport function getDeviceOrientation(height: number, width: number): DeviceOrientation {\n if (!height || !width) return 'landscape';\n\n return height > width ? 'portrait' : 'landscape';\n}\n","import { BoxShadow, ShadowDefinition } from './shadow.model';\n\n// box-shadow: none|h-offset v-offset blur spread color\nexport const GetBoxShadow = ({ offset, blur, opacity }: BoxShadow): string => {\n return `0 ${offset}px ${blur}px rgba(0,0,0,0.${opacity})`;\n};\n\nexport const GetBoxShadows = ({ umbra, penumbra }: ShadowDefinition): string => {\n return GetBoxShadow(umbra) + ', ' + GetBoxShadow(penumbra);\n};\n","import { ShadowDefinition } from './shadow.model';\nimport { ShadowElevation } from './shadow.types';\nimport { GetBoxShadows } from './shadow.utils';\n\nexport const ShadowMap: Record<ShadowElevation, ShadowDefinition> = {\n pressed: {\n umbra: {\n offset: 1,\n blur: 2,\n opacity: 24,\n },\n penumbra: {\n offset: 1,\n blur: 3,\n opacity: 12,\n },\n },\n raised: {\n umbra: {\n offset: 3,\n blur: 6,\n opacity: 23,\n },\n penumbra: {\n offset: 3,\n blur: 6,\n opacity: 16,\n },\n },\n focussed: {\n umbra: {\n offset: 6,\n blur: 6,\n opacity: 23,\n },\n penumbra: {\n offset: 10,\n blur: 20,\n opacity: 19,\n },\n },\n navigation: {\n umbra: {\n offset: 10,\n blur: 10,\n opacity: 22,\n },\n penumbra: {\n offset: 14,\n blur: 28,\n opacity: 25,\n },\n },\n modal: {\n umbra: {\n offset: 15,\n blur: 12,\n opacity: 22,\n },\n penumbra: {\n offset: 19,\n blur: 38,\n opacity: 30,\n },\n },\n};\n\nexport const ShadowCssMap: Record<ShadowElevation, string> = {\n pressed: GetBoxShadows(ShadowMap['pressed']),\n raised: GetBoxShadows(ShadowMap['raised']),\n focussed: GetBoxShadows(ShadowMap['focussed']),\n navigation: GetBoxShadows(ShadowMap['navigation']),\n modal: GetBoxShadows(ShadowMap['modal']),\n};\n","import type { StyleExpression } from './style.types';\n\nexport const removeInputPlatformStyling: StyleExpression = {\n appearance: 'none' /* Removes default platform styling */,\n background: 'none' /* Removes default background */,\n border: 'none' /* Removes default gray border */,\n outline: 'none' /* Removes default focus ring */,\n boxShadow: 'none' /* Removes any inner shadows on iOS */,\n padding: 0 /* Resets default spacing */,\n width: '100%' /* Makes it fill the stylized div */,\n};\n","import type { Colors } from '../theme.model';\nimport { generatePalette } from '../../color';\nimport { generateShadows } from '../../generation/shadow.generator';\nimport { BASE_PALETTE_CONFIG, createTheme } from './base.theme';\n\nexport const darkColors: Colors = generatePalette({ ...BASE_PALETTE_CONFIG, mode: 'dark' });\n\nexport const DarkTheme = createTheme({\n id: 'DarkTheme',\n name: 'Dark Theme',\n colors: darkColors,\n shadows: generateShadows(darkColors, 'dark'),\n});\n","import { generateShadows } from '../../generation/shadow.generator';\nimport { createTheme, lightColors } from './base.theme';\n\nexport const LightTheme = createTheme({\n id: 'LightTheme',\n name: 'Light Theme',\n colors: lightColors,\n shadows: generateShadows(lightColors, 'light'),\n});\n","import { type UniTheme } from './theme.model';\nimport { DarkTheme } from './themes/dark.theme';\nimport { LightTheme } from './themes/light.theme';\n\nexport const UniThemes: Record<string, UniTheme> = {\n LightTheme,\n DarkTheme,\n};\n\n// First Theme is default.\nexport const DefaultThemeId = Object.keys(UniThemes)[0];\n","import { FontWeight } from './typography.types';\n\nexport const FontWeightMap: Record<FontWeight, number> = {\n thin: 100,\n 'extra-light': 200,\n light: 200,\n normal: 400,\n medium: 500,\n 'semi-bold': 600,\n bold: 700,\n 'extra-bold': 800,\n black: 900,\n 'extra-black': 950,\n};\n","import type { CssLength, TextStyle, TypeFaceDefinition } from './text.model';\nimport type { FontWeight } from './typography.types';\nimport { FontWeightMap } from './typography.records';\n\nconst px = (value: CssLength): string => (typeof value === 'number' ? `${value}px` : value);\n\n// Keyword weights ('medium', 'semi-bold', …) are design tokens, not valid CSS\n// font-weight values — resolve them to their numeric equivalents.\nconst weight = (value: FontWeight): number =>\n typeof value === 'number' ? value : FontWeightMap[value];\n\n/**\n * Converts a TextStyle (numeric, design-token oriented) into a\n * TypeFaceDefinition (CSS-ready) so a theme's `typefaces` map can be\n * derived from its `typography` block instead of being duplicated.\n */\nexport const toTypeface = (style: TextStyle): TypeFaceDefinition => ({\n fontFamily: style.fontFamily,\n fontSize: px(style.fontSize),\n lineHeight: px(style.lineHeight),\n ...(style.letterSpacing !== undefined && { letterSpacing: px(style.letterSpacing) }),\n ...(style.textTransform === 'uppercase' && { textTransform: 'uppercase' as const }),\n ...(style.fontWeight !== undefined && { fontWeight: weight(style.fontWeight) }),\n ...(style.fontStyle && { fontStyle: style.fontStyle }),\n});\n\nexport const toTypefaces = (\n typography: Record<string, TextStyle>\n): Record<string, TypeFaceDefinition> =>\n Object.fromEntries(Object.entries(typography).map(([role, style]) => [role, toTypeface(style)]));\n","import { GetFieldType } from './types';\n\nexport function getValue<TData, TPath extends string, TDefault = GetFieldType<TData, TPath>>(\n data: TData,\n path: TPath,\n defaultValue?: TDefault\n): GetFieldType<TData, TPath> | TDefault {\n const value = path\n .split(/[.[\\]]/)\n .filter(Boolean)\n .reduce<GetFieldType<TData, TPath>>((value, key) => (value as any)?.[key], data as any);\n\n return value !== undefined ? value : (defaultValue as TDefault);\n}\n","export const debounce = <T extends (...args: any[]) => ReturnType<T>>(\n callback: T,\n timeout: number\n): ((...args: Parameters<T>) => void) => {\n let timer: ReturnType<typeof setTimeout>;\n\n return (...args: Parameters<T>) => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n callback(...args);\n }, timeout);\n };\n};\n"],"mappings":"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"}