@ngxsmk/theme 2.0.0 → 3.0.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.
- package/README.md +1 -1
- package/esm2022/lib/css.mjs +17 -1
- package/esm2022/lib/ionic-provider.mjs +30 -0
- package/esm2022/lib/theme-injector.service.mjs +19 -8
- package/esm2022/lib/token-adapter.mjs +154 -49
- package/esm2022/lib/tokens.mjs +10 -1
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/ngxsmk-theme.mjs +225 -57
- package/fesm2022/ngxsmk-theme.mjs.map +1 -1
- package/lib/css.d.ts.map +1 -1
- package/lib/ionic-provider.d.ts +18 -0
- package/lib/ionic-provider.d.ts.map +1 -0
- package/lib/theme-injector.service.d.ts.map +1 -1
- package/lib/token-adapter.d.ts +9 -7
- package/lib/token-adapter.d.ts.map +1 -1
- package/lib/tokens.d.ts +9 -0
- package/lib/tokens.d.ts.map +1 -1
- package/package.json +6 -2
- package/public-api.d.ts +1 -0
- package/public-api.d.ts.map +1 -1
- package/styles/ngxsmk.css +15 -0
- package/styles/ngxsmk.emerald.css +15 -0
- package/styles/ngxsmk.neutral.css +15 -0
- package/styles/ngxsmk.rose.css +15 -0
- package/styles/ngxsmk.violet.css +15 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngxsmk-theme.mjs","sources":["../../../../packages/theme/src/lib/types.ts","../../../../packages/theme/src/lib/color.ts","../../../../packages/theme/src/lib/tokens.ts","../../../../packages/theme/src/lib/define-config.ts","../../../../packages/theme/src/lib/css.ts","../../../../packages/theme/src/lib/presets.ts","../../../../packages/theme/src/lib/token-adapter.ts","../../../../packages/theme/src/lib/theme-injector.service.ts","../../../../packages/theme/src/lib/theme.service.ts","../../../../packages/theme/src/public-api.ts","../../../../packages/theme/src/ngxsmk-theme.ts"],"sourcesContent":["/**\n * Design token model for the NGXSMK universal theme engine.\n *\n * A `ThemeConfig` is the single source of truth for a theme. The token\n * engine transforms it into platform outputs (CSS custom properties today;\n * SCSS/Tailwind/JSON exporters build on the same model).\n */\n\n/** An 11-step color scale, 50 (lightest) to 950 (darkest). */\nexport interface ColorScale {\n 50: string;\n 100: string;\n 200: string;\n 300: string;\n 400: string;\n 500: string;\n 600: string;\n 700: string;\n 800: string;\n 900: string;\n 950: string;\n}\n\nexport type ColorScaleStep = keyof ColorScale;\n\n/** Status colors used by alerts, badges, form validation, toasts. */\nexport interface SemanticColors {\n success: string;\n warning: string;\n error: string;\n info: string;\n}\n\nexport interface FontFamilies {\n sans: string;\n mono: string;\n}\n\n/** A single typographic role (size + line height + weight). */\nexport interface TypeStyle {\n size: string;\n lineHeight: string;\n weight: string;\n}\n\nexport type TypeRoleSize = 'large' | 'medium' | 'small';\n\n/** Material-inspired type roles: display, headline, title, body, label. */\nexport interface TypographyScale {\n display: Record<TypeRoleSize, TypeStyle>;\n headline: Record<TypeRoleSize, TypeStyle>;\n title: Record<TypeRoleSize, TypeStyle>;\n body: Record<TypeRoleSize, TypeStyle>;\n label: Record<TypeRoleSize, TypeStyle>;\n}\n\nexport type DarkModeStrategy = 'class' | 'media' | 'system';\n\nexport type RadiusPreset = 'none' | 'sm' | 'md' | 'lg' | 'xl';\n\n/** User-facing theme configuration. Everything except `brand` is optional. */\nexport interface ThemeConfig {\n /** Identifier used when registering multiple themes. */\n name?: string;\n brand: {\n /** Brand color as hex (e.g. `#7C3AED`). A full 50–950 scale is derived. */\n primary: string;\n /** Optional pre-built scale; overrides derivation from `primary`. */\n primaryScale?: ColorScale;\n /** Secondary brand color as hex. A full 50–950 scale is derived. */\n secondary?: string;\n /** Optional pre-built secondary scale. */\n secondaryScale?: ColorScale;\n };\n /** Neutral (gray) scale. Defaults to a balanced zinc-like scale. */\n neutral?: ColorScale;\n semantic?: Partial<SemanticColors>;\n typography?: {\n fontFamily?: Partial<FontFamilies>;\n };\n /** Global corner rounding character of the theme. Default `md`. */\n borderRadius?: RadiusPreset;\n /** How dark mode is activated. Default: `class` (a `.dark` class on `<html>`). */\n darkMode?: {\n strategy?: DarkModeStrategy;\n /** Class name used by the `class` strategy. Default `dark`. */\n className?: string;\n };\n /**\n * Raw semantic-role token overrides merged into the generated output,\n * e.g. `{ dark: { '--ngxsmk-color-primary': '#FAFAFA' } }`.\n */\n overrides?: {\n light?: Record<string, string>;\n dark?: Record<string, string>;\n };\n}\n\n/** A fully resolved theme: config merged with defaults, scales derived. */\nexport interface ResolvedTheme {\n name: string;\n /** The exact brand color from the config — light-mode primary. */\n brandBase: string;\n brand: ColorScale;\n secondaryBase: string;\n secondary: ColorScale;\n neutral: ColorScale;\n semantic: SemanticColors;\n fontFamily: FontFamilies;\n typography: TypographyScale;\n spacing: Record<string, string>;\n radius: Record<string, string>;\n radiusBase: RadiusPreset;\n shadow: Record<string, string>;\n duration: Record<string, string>;\n easing: Record<string, string>;\n /** Stacking layers emitted as `--ngxsmk-z-*`; overlays must share this ladder. */\n zIndex: Record<string, string>;\n darkMode: { strategy: DarkModeStrategy; className: string };\n overrides: {\n light: Record<string, string>;\n dark: Record<string, string>;\n };\n}\n","import { ColorScale } from './types';\n\n/** OKLCH color: l in [0,1], c in [0,0.4], h in [0,360). */\nexport interface Oklch {\n l: number;\n c: number;\n h: number;\n}\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } {\n const value = hex.replace('#', '');\n const full =\n value.length === 3\n ? value\n .split('')\n .map((c) => c + c)\n .join('')\n : value;\n if (!/^[0-9a-fA-F]{6}$/.test(full)) {\n throw new Error(`Invalid hex color: \"${hex}\"`);\n }\n\n const r = parseInt(full.slice(0, 2), 16) / 255;\n const g = parseInt(full.slice(2, 4), 16) / 255;\n const b = parseInt(full.slice(4, 6), 16) / 255;\n return { r, g, b };\n}\n\nfunction srgbToLinear(c: number): number {\n return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n}\n\nfunction linearToSrgb(c: number): number {\n return c <= 0.0031308 ? c * 12.92 : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;\n}\n\nexport function hexToOklch(hex: string): Oklch {\n const { r: sr, g: sg, b: sb } = hexToRgb(hex);\n const r = srgbToLinear(sr);\n const g = srgbToLinear(sg);\n const b = srgbToLinear(sb);\n\n const l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b;\n const m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b;\n const s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b;\n\n const l_ = Math.cbrt(l);\n const m_ = Math.cbrt(m);\n const s_ = Math.cbrt(s);\n\n const L = 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_;\n const a = 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_;\n const b_ = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_;\n\n const C = Math.sqrt(a * a + b_ * b_);\n let h = (Math.atan2(b_, a) * 180) / Math.PI;\n if (h < 0) h += 360;\n\n return { l: L, c: C, h };\n}\n\nexport function oklchToHex({ l: L, c: C, h }: Oklch): string {\n const hRad = (h * Math.PI) / 180;\n const a = C * Math.cos(hRad);\n const b_ = C * Math.sin(hRad);\n\n const l_ = L + 0.3963377774 * a + 0.2158037573 * b_;\n const m_ = L - 0.1055613458 * a - 0.0638541728 * b_;\n const s_ = L - 0.0894841775 * a - 1.291485548 * b_;\n\n const l = l_ * l_ * l_;\n const m = m_ * m_ * m_;\n const s = s_ * s_ * s_;\n\n const r = +4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s;\n const g = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s;\n const b = -0.0041960863 * l - 0.7034186148 * m + 1.707614701 * s;\n\n const rClamped = Math.min(255, Math.max(0, Math.round(linearToSrgb(r) * 255)));\n const gClamped = Math.min(255, Math.max(0, Math.round(linearToSrgb(g) * 255)));\n const bClamped = Math.min(255, Math.max(0, Math.round(linearToSrgb(b) * 255)));\n\n const toHex = (v: number) => v.toString(16).padStart(2, '0');\n return `#${toHex(rClamped)}${toHex(gClamped)}${toHex(bClamped)}`.toUpperCase();\n}\n\n/** Shift a color's lightness by `delta` (clamped 0–1). */\nexport function shiftLightness(hex: string, delta: number): string {\n const oklch = hexToOklch(hex);\n return oklchToHex({ ...oklch, l: Math.min(1.0, Math.max(0.0, oklch.l + delta)) });\n}\n\n/** Rotate a color's hue by `degrees`, keeping chroma and lightness. */\nexport function rotateHue(hex: string, degrees: number): string {\n const oklch = hexToOklch(hex);\n return oklchToHex({ ...oklch, h: (((oklch.h + degrees) % 360) + 360) % 360 });\n}\n\n/** Lightness stops for each scale step in OKLCH (0–1). */\nconst LIGHTNESS_STOPS: Record<keyof ColorScale, number> = {\n 50: 0.97,\n 100: 0.94,\n 200: 0.87,\n 300: 0.78,\n 400: 0.66,\n 500: 0.56,\n 600: 0.48,\n 700: 0.4,\n 800: 0.32,\n 900: 0.25,\n 950: 0.16,\n};\n\n/** Derive a full 50–950 color scale from a single brand hex. */\nexport function deriveScale(baseHex: string): ColorScale {\n const base = hexToOklch(baseHex);\n\n let nearest: keyof ColorScale = 500;\n let nearestDelta = Number.POSITIVE_INFINITY;\n for (const [step, stop] of Object.entries(LIGHTNESS_STOPS)) {\n const delta = Math.abs(stop - base.l);\n if (delta < nearestDelta) {\n nearestDelta = delta;\n nearest = Number(step) as keyof ColorScale;\n }\n }\n\n const scale = {} as ColorScale;\n for (const [step, stop] of Object.entries(LIGHTNESS_STOPS)) {\n const key = Number(step) as keyof ColorScale;\n if (key === nearest) {\n scale[key] = oklchToHex(base);\n } else {\n // Perceptually scale chroma using a sine taper so that extremes (50/950) don't clip/saturate unnaturally.\n const scaleChroma = base.c * Math.sin(Math.PI * stop);\n scale[key] = oklchToHex({ l: stop, c: scaleChroma, h: base.h });\n }\n }\n return scale;\n}\n","import { ColorScale, FontFamilies, SemanticColors, TypographyScale } from './types';\n\n/**\n * Cool blue-grey neutral scale. Light steps carry a subtle blue tint; the\n * darkest steps flatten toward a near-neutral charcoal so dark-mode\n * surfaces read like a soft, desaturated navy rather than a saturated one.\n */\nexport const DEFAULT_NEUTRAL: ColorScale = {\n 50: '#F1F4F7',\n 100: '#E4E9EE',\n 200: '#CCD3DB',\n 300: '#A4B0BC',\n 400: '#778593',\n 500: '#4E606F',\n 600: '#3A4650',\n 700: '#2A333B',\n 800: '#1F1F22',\n 900: '#18181A',\n 950: '#111112',\n};\n\nexport const DEFAULT_SEMANTIC: SemanticColors = {\n success: '#0D8626',\n warning: '#E9AF08',\n error: '#E3193B',\n info: '#2563EB',\n};\n\nexport const DEFAULT_FONT_FAMILY: FontFamilies = {\n sans: \"'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif\",\n mono: \"'Geist Mono', 'Geist Mono Fallback', monospace\",\n};\n\nexport const DEFAULT_TYPOGRAPHY: TypographyScale = {\n display: {\n large: { size: '3.5625rem', lineHeight: '4rem', weight: '700' },\n medium: { size: '2.8125rem', lineHeight: '3.25rem', weight: '700' },\n small: { size: '2.25rem', lineHeight: '2.75rem', weight: '700' },\n },\n headline: {\n large: { size: '2rem', lineHeight: '2.5rem', weight: '600' },\n medium: { size: '1.75rem', lineHeight: '2.25rem', weight: '600' },\n small: { size: '1.5rem', lineHeight: '2rem', weight: '600' },\n },\n title: {\n large: { size: '1.375rem', lineHeight: '1.75rem', weight: '600' },\n medium: { size: '1.125rem', lineHeight: '1.5rem', weight: '600' },\n small: { size: '1rem', lineHeight: '1.5rem', weight: '600' },\n },\n body: {\n large: { size: '1rem', lineHeight: '1.5rem', weight: '400' },\n medium: { size: '0.875rem', lineHeight: '1.25rem', weight: '400' },\n small: { size: '0.75rem', lineHeight: '1rem', weight: '400' },\n },\n label: {\n large: { size: '0.875rem', lineHeight: '1.25rem', weight: '500' },\n medium: { size: '0.75rem', lineHeight: '1rem', weight: '500' },\n small: { size: '0.6875rem', lineHeight: '1rem', weight: '500' },\n },\n};\n\n/**\n * Standard height for single-line text controls (input, select, number-input,\n * combobox, input-group, power-search, multi-select). All controls in the\n * family use this so they read as one consistent size.\n */\nexport const CONTROL_HEIGHT = '2.5rem';\n\n/**\n * Control-height ladder. `md` mirrors CONTROL_HEIGHT (the family default);\n * `sm`/`lg` give dense and comfortable variants the same rhythm.\n */\nexport const CONTROL_HEIGHTS: Record<string, string> = {\n sm: '2rem',\n md: CONTROL_HEIGHT,\n lg: '3rem',\n};\n\n/**\n * Opacity roles. Components must use these instead of ad-hoc literals so\n * disabled/muted content reads identically across the whole kit.\n */\nexport const OPACITY: Record<string, string> = {\n disabled: '0.5',\n muted: '0.7',\n faint: '0.4',\n};\n\n/** Icon sizing ladder — aligns glyph boxes with the text roles they sit next to. */\nexport const ICON_SIZE: Record<string, string> = {\n sm: '1rem',\n md: '1.25rem',\n lg: '1.5rem',\n};\n\n/** Letter-spacing roles: tight for display/headline, wide for overline/labels. */\nexport const TRACKING: Record<string, string> = {\n tight: '-0.02em',\n normal: '0',\n wide: '0.08em',\n};\n\n/** Font-weight tokens — standalone scale for direct use outside typography presets. */\nexport const FONT_WEIGHT: Record<string, string> = {\n regular: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n};\n\n/** Line-height tokens — unitless multipliers for flexible leading control. */\nexport const LEADING: Record<string, string> = {\n none: '1',\n tight: '1.25',\n normal: '1.5',\n relaxed: '1.625',\n};\n\nexport const SPACING: Record<string, string> = {\n '0': '0px',\n '0-5': '0.125rem',\n '1': '0.25rem',\n '1-5': '0.375rem',\n '2': '0.5rem',\n '3': '0.75rem',\n '4': '1rem',\n '5': '1.25rem',\n '6': '1.5rem',\n '8': '2rem',\n '10': '2.5rem',\n '12': '3rem',\n '16': '4rem',\n '20': '5rem',\n '24': '6rem',\n '32': '8rem',\n};\n\n/**\n * Radius scale: inner 4px, element 8px (buttons/inputs, the base),\n * container 12px (cards), then progressively larger through 28px \"page\"\n * rounding. Deliberately generous so surfaces read soft and rounded.\n */\nexport const RADIUS: Record<string, string> = {\n none: '0px',\n sm: '0.25rem', // 4px — inner (nested chips, checkboxes)\n md: '0.5rem', // 8px — element (buttons, inputs) — default base\n lg: '0.75rem', // 12px — container (cards, popovers)\n xl: '1rem', // 16px\n '2xl': '1.25rem', // 20px\n '3xl': '1.75rem', // 28px — page / hero surfaces\n full: '9999px',\n};\n\n/**\n * Soft, diffuse, layered shadows: a 1px hairline \"contact\" line keeps edges\n * crisp on white, a tight key shadow gives definition, and a wide low-alpha\n * ambient blur supplies the soft depth. Overlay CSS resolves these to\n * slightly stronger values in dark mode via the elevation tokens on each\n * surface.\n */\nexport const SHADOW: Record<string, string> = {\n sm: '0 0 0 1px rgb(0 0 0 / 0.03), 0 1px 1px rgb(0 0 0 / 0.07), 0 2px 8px rgb(0 0 0 / 0.07)',\n md: '0 0 0 1px rgb(0 0 0 / 0.03), 0 1px 2px rgb(0 0 0 / 0.09), 0 4px 16px rgb(0 0 0 / 0.09)',\n lg: '0 0 0 1px rgb(0 0 0 / 0.04), 0 2px 4px rgb(0 0 0 / 0.09), 0 10px 28px rgb(0 0 0 / 0.11)',\n xl: '0 0 0 1px rgb(0 0 0 / 0.04), 0 4px 8px rgb(0 0 0 / 0.1), 0 16px 40px rgb(0 0 0 / 0.15)',\n '2xl': '0 0 0 1px rgb(0 0 0 / 0.05), 0 8px 16px rgb(0 0 0 / 0.13), 0 28px 56px rgb(0 0 0 / 0.2)',\n};\n\n/**\n * Stacking ladder for overlay components. Anchored popups sit lowest;\n * tooltips always win. Components must use these instead of ad-hoc values\n * so overlays never fight each other.\n */\nexport const Z_INDEX: Record<string, string> = {\n dropdown: '1000',\n sticky: '1100',\n banner: '1200',\n overlay: '1300',\n modal: '1400',\n popover: '1500',\n toast: '1600',\n tooltip: '1700',\n};\n\nexport const DURATION: Record<string, string> = {\n instant: '0ms',\n fast: '100ms',\n normal: '200ms',\n slow: '300ms',\n slower: '500ms',\n};\n\nexport const EASING: Record<string, string> = {\n linear: 'linear',\n in: 'cubic-bezier(0.4, 0, 1, 1)',\n out: 'cubic-bezier(0, 0, 0.2, 1)',\n 'in-out': 'cubic-bezier(0.4, 0, 0.2, 1)',\n emphasized: 'cubic-bezier(0.2, 0, 0, 1)',\n};\n","import { deriveScale, rotateHue } from './color';\nimport {\n DEFAULT_FONT_FAMILY,\n DEFAULT_NEUTRAL,\n DEFAULT_SEMANTIC,\n DEFAULT_TYPOGRAPHY,\n DURATION,\n EASING,\n RADIUS,\n SHADOW,\n SPACING,\n Z_INDEX,\n} from './tokens';\nimport { ResolvedTheme, ThemeConfig } from './types';\n\n/**\n * Identity helper that gives `ngxsmk.config.ts` files full type inference:\n *\n * ```ts\n * import { defineConfig } from '@ngxsmk/theme';\n * export default defineConfig({ brand: { primary: '#7C3AED' } });\n * ```\n */\nexport function defineConfig(config: ThemeConfig): ThemeConfig {\n return config;\n}\n\n/** Merge a user config with defaults and derive all color scales. */\nexport function resolveTheme(config: ThemeConfig): ResolvedTheme {\n const secondaryBase = config.brand.secondary ?? rotateHue(config.brand.primary, 60);\n return {\n name: config.name ?? 'custom',\n brandBase: config.brand.primary,\n brand: config.brand.primaryScale ?? deriveScale(config.brand.primary),\n secondaryBase,\n secondary: config.brand.secondaryScale ?? deriveScale(secondaryBase),\n neutral: config.neutral ?? DEFAULT_NEUTRAL,\n semantic: { ...DEFAULT_SEMANTIC, ...config.semantic },\n fontFamily: { ...DEFAULT_FONT_FAMILY, ...config.typography?.fontFamily },\n typography: DEFAULT_TYPOGRAPHY,\n spacing: SPACING,\n radius: RADIUS,\n radiusBase: config.borderRadius ?? 'md',\n shadow: SHADOW,\n duration: DURATION,\n easing: EASING,\n zIndex: Z_INDEX,\n darkMode: {\n strategy: config.darkMode?.strategy ?? 'class',\n className: config.darkMode?.className ?? 'dark',\n },\n overrides: {\n light: config.overrides?.light ?? {},\n dark: config.overrides?.dark ?? {},\n },\n };\n}\n","import { deriveScale, rotateHue, shiftLightness } from './color';\nimport { resolveTheme } from './define-config';\nimport { ColorScale, ResolvedTheme, ThemeConfig, TypeRoleSize, TypeStyle } from './types';\nimport {\n CONTROL_HEIGHT,\n CONTROL_HEIGHTS,\n FONT_WEIGHT,\n ICON_SIZE,\n LEADING,\n OPACITY,\n TRACKING,\n} from './tokens';\n\ntype Vars = Record<string, string>;\n\nfunction scaleVars(prefix: string, scale: ColorScale): Vars {\n const vars: Vars = {};\n for (const [step, value] of Object.entries(scale)) {\n vars[`--ngxsmk-color-${prefix}-${step}`] = value;\n }\n return vars;\n}\n\n/** Default CSS custom properties for each component, emitted once in :root. */\nconst COMPONENT_TOKEN_DEFAULTS: Record<string, Vars> = {\n button: {\n '--ngxsmk-button-bg': 'var(--ngxsmk-color-primary)',\n '--ngxsmk-button-color': 'var(--ngxsmk-color-on-primary)',\n '--ngxsmk-button-font-family': 'var(--ngxsmk-font-sans)',\n '--ngxsmk-button-font-weight': '500',\n '--ngxsmk-button-radius': 'var(--ngxsmk-radius-base)',\n '--ngxsmk-button-disabled-opacity': '0.5',\n },\n card: {\n '--ngxsmk-card-bg': 'var(--ngxsmk-color-surface)',\n '--ngxsmk-card-radius': 'var(--ngxsmk-radius-xl)',\n '--ngxsmk-card-shadow': 'var(--ngxsmk-shadow-sm)',\n '--ngxsmk-card-border-color': 'var(--ngxsmk-color-outline)',\n },\n accordion: {\n '--ngxsmk-accordion-bg': 'var(--ngxsmk-color-surface)',\n '--ngxsmk-accordion-radius': 'var(--ngxsmk-radius-lg)',\n '--ngxsmk-accordion-border-color': 'var(--ngxsmk-color-outline)',\n },\n progress: {\n '--ngxsmk-progress-height': '0.5rem',\n '--ngxsmk-progress-bg': 'var(--ngxsmk-color-surface-variant)',\n '--ngxsmk-progress-color': 'var(--ngxsmk-color-primary)',\n '--ngxsmk-progress-radius': 'var(--ngxsmk-radius-full)',\n },\n switch: {\n '--ngxsmk-switch-width': '2.25rem',\n '--ngxsmk-switch-height': '1.25rem',\n '--ngxsmk-switch-radius': 'var(--ngxsmk-radius-full)',\n '--ngxsmk-switch-bg': 'var(--ngxsmk-color-outline-strong)',\n '--ngxsmk-switch-thumb-size': '0.875rem',\n '--ngxsmk-switch-thumb-bg': 'var(--ngxsmk-color-surface)',\n '--ngxsmk-switch-checked-bg': 'var(--ngxsmk-color-primary)',\n },\n spreadsheet: {\n '--ngxsmk-spreadsheet-bg': 'var(--ngxsmk-color-surface)',\n '--ngxsmk-spreadsheet-header-bg': 'var(--ngxsmk-color-surface-variant)',\n '--ngxsmk-spreadsheet-header-color': 'var(--ngxsmk-color-on-surface-variant)',\n '--ngxsmk-spreadsheet-border': 'var(--ngxsmk-color-outline)',\n '--ngxsmk-spreadsheet-grid-color': 'var(--ngxsmk-color-outline-variant)',\n '--ngxsmk-spreadsheet-hover-bg': 'var(--ngxsmk-color-surface-hover)',\n '--ngxsmk-spreadsheet-selected-bg':\n 'color-mix(in srgb, var(--ngxsmk-color-primary) 12%, transparent)',\n '--ngxsmk-spreadsheet-active-border': 'var(--ngxsmk-color-primary)',\n '--ngxsmk-spreadsheet-font': 'var(--ngxsmk-font-sans)',\n '--ngxsmk-spreadsheet-font-mono': 'var(--ngxsmk-font-mono)',\n '--ngxsmk-spreadsheet-row-height': '2.25rem',\n '--ngxsmk-spreadsheet-header-height': '2.5rem',\n '--ngxsmk-spreadsheet-cell-padding': '6px 10px',\n '--ngxsmk-spreadsheet-cell-font-size': 'var(--ngxsmk-text-body-sm-size)',\n '--ngxsmk-spreadsheet-scrollbar-size': '8px',\n '--ngxsmk-spreadsheet-shadow': 'var(--ngxsmk-shadow-sm)',\n '--ngxsmk-spreadsheet-radius': 'var(--ngxsmk-radius-lg)',\n '--ngxsmk-spreadsheet-edit-bg': 'var(--ngxsmk-color-surface)',\n '--ngxsmk-spreadsheet-edit-border': 'var(--ngxsmk-color-primary)',\n '--ngxsmk-spreadsheet-row-hover-bg': 'var(--ngxsmk-color-surface-hover)',\n '--ngxsmk-spreadsheet-col-hover-bg':\n 'color-mix(in srgb, var(--ngxsmk-color-primary) 6%, transparent)',\n '--ngxsmk-spreadsheet-frozen-shadow': '2px 0 4px rgba(0,0,0,0.08)',\n '--ngxsmk-spreadsheet-selection-range':\n 'color-mix(in srgb, var(--ngxsmk-color-primary) 8%, transparent)',\n },\n inputGroup: {\n '--ngxsmk-input-group-bg': 'var(--ngxsmk-color-surface)',\n '--ngxsmk-input-group-border': 'var(--ngxsmk-color-outline-strong)',\n '--ngxsmk-input-group-radius': 'var(--ngxsmk-radius-md)',\n '--ngxsmk-input-group-shadow': 'none',\n '--ngxsmk-input-group-focus-border': 'var(--ngxsmk-color-primary)',\n '--ngxsmk-input-group-focus-shadow':\n '0 0 0 3px color-mix(in srgb, var(--ngxsmk-color-primary) 15%, transparent)',\n '--ngxsmk-input-group-error-border': 'var(--ngxsmk-color-error)',\n '--ngxsmk-input-group-error-focus-shadow':\n '0 0 0 3px color-mix(in srgb, var(--ngxsmk-color-error) 15%, transparent)',\n '--ngxsmk-input-group-success-border': 'var(--ngxsmk-color-success)',\n '--ngxsmk-input-group-warning-border': 'var(--ngxsmk-color-warning)',\n '--ngxsmk-input-group-height': '2.5rem',\n '--ngxsmk-input-group-padding': '0.75rem',\n '--ngxsmk-input-group-gap': 'var(--ngxsmk-space-2)',\n '--ngxsmk-input-group-font': 'var(--ngxsmk-font-sans)',\n },\n};\n\n/** Tokens that do not change between light and dark mode. */\nfunction staticVars(theme: ResolvedTheme): Vars {\n const vars: Vars = {\n ...scaleVars('brand', theme.brand),\n ...scaleVars('secondary', theme.secondary),\n ...scaleVars('neutral', theme.neutral),\n '--ngxsmk-font-sans': theme.fontFamily.sans,\n '--ngxsmk-font-mono': theme.fontFamily.mono,\n '--ngxsmk-radius-base': theme.radius[theme.radiusBase],\n '--ngxsmk-control-height': CONTROL_HEIGHT,\n\n // Motion Tokens\n '--ngxsmk-motion-duration': 'var(--ngxsmk-duration-normal)',\n '--ngxsmk-motion-ease': 'var(--ngxsmk-ease-in-out)',\n\n // Interactive-state motion: shared lift/press transforms. Neutralized to\n // `none` under prefers-reduced-motion (see buildThemeCss).\n '--ngxsmk-hover-lift': 'translateY(-1px)',\n '--ngxsmk-press-scale': 'scale(0.98)',\n\n // Focus ring: THE focus indicator for every component. Aliases the\n // mode-aware --ngxsmk-shadow-focus; the error variant derives from the\n // semantic error role so invalid controls ring red in both modes.\n '--ngxsmk-focus-ring': 'var(--ngxsmk-shadow-focus)',\n '--ngxsmk-focus-ring-error':\n '0 0 0 2px color-mix(in srgb, var(--ngxsmk-color-error) 15%, transparent), ' +\n '0 0 0 4px color-mix(in srgb, var(--ngxsmk-color-error) 45%, transparent)',\n\n // Component-specific token defaults\n ...Object.values(COMPONENT_TOKEN_DEFAULTS).reduce(\n (merged, tokens) => ({ ...merged, ...tokens }),\n {} as Vars,\n ),\n };\n\n for (const [key, value] of Object.entries(CONTROL_HEIGHTS)) {\n vars[`--ngxsmk-control-height-${key}`] = value;\n }\n for (const [key, value] of Object.entries(OPACITY)) {\n vars[`--ngxsmk-opacity-${key}`] = value;\n }\n for (const [key, value] of Object.entries(ICON_SIZE)) {\n vars[`--ngxsmk-icon-${key}`] = value;\n }\n for (const [key, value] of Object.entries(TRACKING)) {\n vars[`--ngxsmk-tracking-${key}`] = value;\n }\n for (const [key, value] of Object.entries(FONT_WEIGHT)) {\n vars[`--ngxsmk-font-weight-${key}`] = value;\n }\n for (const [key, value] of Object.entries(LEADING)) {\n vars[`--ngxsmk-leading-${key}`] = value;\n }\n for (const [key, value] of Object.entries(theme.spacing)) {\n vars[`--ngxsmk-space-${key}`] = value;\n }\n for (const [key, value] of Object.entries(theme.radius)) {\n vars[`--ngxsmk-radius-${key}`] = value;\n }\n for (const [key, value] of Object.entries(theme.shadow)) {\n vars[`--ngxsmk-shadow-${key}`] = value;\n }\n for (const [key, value] of Object.entries(theme.duration)) {\n vars[`--ngxsmk-duration-${key}`] = value;\n }\n for (const [key, value] of Object.entries(theme.easing)) {\n vars[`--ngxsmk-ease-${key}`] = value;\n }\n for (const [key, value] of Object.entries(theme.zIndex)) {\n vars[`--ngxsmk-z-${key}`] = value;\n }\n\n const sizes = { large: 'lg', medium: 'md', small: 'sm' } as const;\n for (const [role, styles] of Object.entries(theme.typography)) {\n for (const [size, suffix] of Object.entries(sizes)) {\n const style: TypeStyle = styles[size as TypeRoleSize];\n vars[`--ngxsmk-text-${role}-${suffix}-size`] = style.size;\n vars[`--ngxsmk-text-${role}-${suffix}-line`] = style.lineHeight;\n vars[`--ngxsmk-text-${role}-${suffix}-weight`] = style.weight;\n }\n }\n\n // Extra-small body text for dense metadata rows; below the smallest\n // TypeRoleSize so it is emitted outside the role loop.\n vars['--ngxsmk-text-body-xs-size'] = '0.6875rem';\n vars['--ngxsmk-text-body-xs-line'] = '1rem';\n vars['--ngxsmk-text-body-xs-weight'] = '400';\n\n return vars;\n}\n\n/** Semantic role tokens for light mode. */\nfunction lightVars(theme: ResolvedTheme): Vars {\n const vars: Vars = {\n 'color-scheme': 'light',\n\n '--ngxsmk-color-primary': theme.brandBase,\n '--ngxsmk-color-on-primary': '#FFFFFF',\n '--ngxsmk-color-primary-hover': shiftLightness(theme.brandBase, -8),\n '--ngxsmk-color-primary-active': shiftLightness(theme.brandBase, -14),\n '--ngxsmk-color-primary-container': theme.brand[100],\n '--ngxsmk-color-on-primary-container': theme.brand[900],\n\n '--ngxsmk-color-secondary': theme.secondaryBase,\n '--ngxsmk-color-on-secondary': '#FFFFFF',\n '--ngxsmk-color-secondary-hover': shiftLightness(theme.secondaryBase, -8),\n '--ngxsmk-color-secondary-active': shiftLightness(theme.secondaryBase, -14),\n '--ngxsmk-color-secondary-container': theme.secondary[100],\n '--ngxsmk-color-on-secondary-container': theme.secondary[900],\n\n // Default light theme: cool-grey body, white cards floating on top, hairline borders.\n '--ngxsmk-color-background': theme.neutral[50],\n '--ngxsmk-color-on-background': '#0A1317',\n '--ngxsmk-color-surface': '#FFFFFF',\n '--ngxsmk-color-on-surface': '#0A1317',\n '--ngxsmk-color-surface-variant': theme.neutral[100],\n '--ngxsmk-color-on-surface-variant': theme.neutral[500],\n '--ngxsmk-color-surface-hover': 'rgb(5 54 89 / 0.05)',\n '--ngxsmk-color-surface-active': 'rgb(5 54 89 / 0.1)',\n '--ngxsmk-color-surface-container': '#FFFFFF',\n '--ngxsmk-color-outline': 'rgb(5 54 89 / 0.1)',\n '--ngxsmk-color-outline-strong': theme.neutral[200],\n '--ngxsmk-color-outline-variant': 'rgb(5 54 89 / 0.06)',\n\n // Elevation ladder\n '--ngxsmk-color-surface-1': '#FFFFFF',\n '--ngxsmk-color-surface-2': theme.neutral[50],\n '--ngxsmk-color-surface-3': theme.neutral[100],\n '--ngxsmk-color-surface-4': theme.neutral[200],\n '--ngxsmk-color-surface-5': theme.neutral[300],\n\n '--ngxsmk-color-ring': theme.brandBase,\n '--ngxsmk-color-backdrop': 'rgb(1 18 40 / 0.4)',\n '--ngxsmk-shadow-focus': `0 0 0 2px ${theme.brand[100]}, 0 0 0 4px color-mix(in srgb, ${theme.brandBase} 45%, transparent)`,\n\n // Categorical chart palette — a fixed 8-hue qualitative set (NOT derived\n // from the brand, so adjacent series stay distinguishable across themes),\n // stepped for the light surface. Validated for the light chart surface:\n // CVD worst-adjacent ΔE 24.2, chroma/lightness in-band. Charts read these\n // via getComputedStyle; consumers can override any slot to rebrand series.\n '--ngxsmk-chart-1': '#2A78D6',\n '--ngxsmk-chart-2': '#1BAF7A',\n '--ngxsmk-chart-3': '#EDA100',\n '--ngxsmk-chart-4': '#008300',\n '--ngxsmk-chart-5': '#4A3AA7',\n '--ngxsmk-chart-6': '#E34948',\n '--ngxsmk-chart-7': '#E87BA4',\n '--ngxsmk-chart-8': '#EB6834',\n };\n\n const tertiary = deriveScale(rotateHue(theme.brandBase, 64));\n vars['--ngxsmk-color-tertiary'] = tertiary[500];\n vars['--ngxsmk-color-on-tertiary'] = '#FFFFFF';\n vars['--ngxsmk-color-tertiary-container'] = tertiary[100];\n vars['--ngxsmk-color-on-tertiary-container'] = tertiary[900];\n\n for (const [name, hex] of Object.entries(theme.semantic)) {\n const scale = deriveScale(hex);\n vars[`--ngxsmk-color-${name}`] = hex;\n vars[`--ngxsmk-color-on-${name}`] = '#FFFFFF';\n vars[`--ngxsmk-color-${name}-container`] = scale[100];\n vars[`--ngxsmk-color-on-${name}-container`] = scale[800];\n }\n\n return { ...vars, ...theme.overrides.light };\n}\n\n/** Semantic role tokens for dark mode. */\nfunction darkVars(theme: ResolvedTheme): Vars {\n const vars: Vars = {\n 'color-scheme': 'dark',\n\n '--ngxsmk-color-primary': theme.brand[400],\n '--ngxsmk-color-on-primary': '#FFFFFF',\n '--ngxsmk-color-primary-hover': theme.brand[300],\n '--ngxsmk-color-primary-active': theme.brand[200],\n '--ngxsmk-color-primary-container': theme.brand[900],\n '--ngxsmk-color-on-primary-container': theme.brand[100],\n\n '--ngxsmk-color-secondary': theme.secondary[400],\n '--ngxsmk-color-on-secondary': '#FFFFFF',\n '--ngxsmk-color-secondary-hover': theme.secondary[300],\n '--ngxsmk-color-secondary-active': theme.secondary[200],\n '--ngxsmk-color-secondary-container': theme.secondary[900],\n '--ngxsmk-color-on-secondary-container': theme.secondary[100],\n\n // Default dark theme: near-neutral charcoal body, slightly lighter card,\n // lighter still for popovers; hairline light-on-dark borders.\n '--ngxsmk-color-background': '#111112',\n '--ngxsmk-color-on-background': '#DFE2E5',\n '--ngxsmk-color-surface': '#1F1F22',\n '--ngxsmk-color-on-surface': '#DFE2E5',\n '--ngxsmk-color-surface-variant': '#28292C',\n '--ngxsmk-color-on-surface-variant': '#AAAFB5',\n '--ngxsmk-color-surface-hover': 'rgb(255 255 255 / 0.05)',\n '--ngxsmk-color-surface-active': 'rgb(255 255 255 / 0.1)',\n '--ngxsmk-color-surface-container': '#28292C',\n '--ngxsmk-color-outline': 'rgb(242 244 246 / 0.1)',\n '--ngxsmk-color-outline-strong': '#494D53',\n '--ngxsmk-color-outline-variant': 'rgb(242 244 246 / 0.06)',\n\n // Elevation ladder\n '--ngxsmk-color-surface-1': theme.neutral[800],\n '--ngxsmk-color-surface-2': theme.neutral[700],\n '--ngxsmk-color-surface-3': theme.neutral[600],\n '--ngxsmk-color-surface-4': theme.neutral[500],\n '--ngxsmk-color-surface-5': theme.neutral[400],\n\n '--ngxsmk-color-ring': theme.brand[400],\n '--ngxsmk-color-backdrop': 'rgb(17 17 18 / 0.6)',\n '--ngxsmk-shadow-focus': `0 0 0 2px color-mix(in srgb, ${theme.brand[400]} 25%, transparent), 0 0 0 4px color-mix(in srgb, ${theme.brand[400]} 45%, transparent)`,\n\n // Categorical chart palette — the same eight hues as light, re-stepped for\n // the dark surface (not a different palette). Validated for the dark chart\n // surface: all slots ≥ 3:1 contrast, CVD worst-adjacent ΔE 10.3 (floor band,\n // relies on the legend/labels charts already render for secondary encoding).\n '--ngxsmk-chart-1': '#3987E5',\n '--ngxsmk-chart-2': '#199E70',\n '--ngxsmk-chart-3': '#C98500',\n '--ngxsmk-chart-4': '#008300',\n '--ngxsmk-chart-5': '#9085E9',\n '--ngxsmk-chart-6': '#E66767',\n '--ngxsmk-chart-7': '#D55181',\n '--ngxsmk-chart-8': '#D95926',\n };\n\n const tertiary = deriveScale(rotateHue(theme.brandBase, 64));\n vars['--ngxsmk-color-tertiary'] = tertiary[400];\n vars['--ngxsmk-color-on-tertiary'] = tertiary[950];\n vars['--ngxsmk-color-tertiary-container'] = tertiary[900];\n vars['--ngxsmk-color-on-tertiary-container'] = tertiary[100];\n\n for (const [name, hex] of Object.entries(theme.semantic)) {\n const scale = deriveScale(hex);\n vars[`--ngxsmk-color-${name}`] = scale[400];\n vars[`--ngxsmk-color-on-${name}`] = scale[950];\n vars[`--ngxsmk-color-${name}-container`] = scale[950];\n vars[`--ngxsmk-color-on-${name}-container`] = scale[300];\n }\n\n return { ...vars, ...theme.overrides.dark };\n}\n\nfunction block(selector: string, vars: Vars, indent = ''): string {\n const lines = Object.entries(vars).map(([name, value]) => `${indent} ${name}: ${value};`);\n return `${indent}${selector} {\\n${lines.join('\\n')}\\n${indent}}`;\n}\n\n/**\n * Transform a theme config into a CSS stylesheet of `--ngxsmk-*` custom\n * properties. Emits static tokens plus light-mode roles on `:root`, and\n * dark-mode roles according to the configured dark-mode strategy.\n */\nexport function buildThemeCss(config: ThemeConfig | ResolvedTheme): string {\n const theme =\n 'brand' in config && 'spacing' in (config as object)\n ? (config as ResolvedTheme)\n : resolveTheme(config as ThemeConfig);\n\n const root = block(':root', { ...staticVars(theme), ...lightVars(theme) });\n const dark = darkVars(theme);\n\n let darkBlock: string;\n switch (theme.darkMode.strategy) {\n case 'media':\n darkBlock = `@media (prefers-color-scheme: dark) {\\n${block(':root', dark, ' ')}\\n}`;\n break;\n case 'system': {\n // `light-dark()` support is per-property; the class block still serves\n // as the override hook, so `system` behaves as media + class.\n const cn = theme.darkMode.className;\n darkBlock = [\n `@media (prefers-color-scheme: dark) {\\n${block(':root', dark, ' ')}\\n}`,\n block(`:root.${cn}, :root.${cn} body, .${cn}`, dark),\n ].join('\\n\\n');\n break;\n }\n default: {\n // `:root.<class>` (specificity 0,2,0) plus a `body` variant defend the\n // dark tokens against third-party stylesheets that redefine `--ngxsmk-*`\n // on a plain `:root` (0,1,0) — those would otherwise win by source order\n // when injected into <head> after this sheet. The bare `.<class>` keeps\n // scoped (non-root) dark regions working.\n const cn = theme.darkMode.className;\n darkBlock = block(`:root.${cn}, :root.${cn} body, .${cn}`, dark);\n }\n }\n\n // Zero every duration token (components animate with --ngxsmk-duration-*\n // directly) and neutralize the shared transforms so ALL token-driven motion\n // stops. `.ngxsmk-reduce-motion` offers the same as an app-level opt-in.\n const reducedVars: Vars = {\n '--ngxsmk-motion-duration': '0ms',\n '--ngxsmk-hover-lift': 'none',\n '--ngxsmk-press-scale': 'none',\n };\n for (const key of Object.keys(theme.duration)) {\n reducedVars[`--ngxsmk-duration-${key}`] = '0ms';\n }\n const reducedMotion = [\n `@media (prefers-reduced-motion: reduce) {\\n${block(':root', reducedVars, ' ')}\\n}`,\n block(':root.ngxsmk-reduce-motion, .ngxsmk-reduce-motion', reducedVars),\n ].join('\\n\\n');\n return `/* Generated by @ngxsmk/theme — do not edit by hand. */\\n${root}\\n\\n${darkBlock}\\n\\n${reducedMotion}\\n`;\n}\n","import { ThemeConfig } from './types';\n\n/** Retained alias so existing violet-themed demos keep working. */\nexport const violetPreset: ThemeConfig = {\n name: 'violet',\n brand: { primary: '#7C3AED' },\n};\n\n/** Monochrome preset in the spirit of shadcn/ui's default look. */\nexport const neutralPreset: ThemeConfig = {\n name: 'neutral',\n brand: {\n primary: '#18181B',\n // A neutral brand cannot be derived from lightness alone — pin the scale.\n primaryScale: {\n 50: '#FAFAFA',\n 100: '#F4F4F5',\n 200: '#E4E4E7',\n 300: '#D4D4D8',\n 400: '#A1A1AA',\n 500: '#71717A',\n 600: '#3F3F46',\n 700: '#27272A',\n 800: '#1F1F23',\n 900: '#18181B',\n 950: '#09090B',\n },\n },\n overrides: {\n // A near-black brand must invert in dark mode to stay visible.\n dark: {\n '--ngxsmk-color-primary': '#FAFAFA',\n '--ngxsmk-color-on-primary': '#18181B',\n '--ngxsmk-color-primary-hover': '#E4E4E7',\n '--ngxsmk-color-primary-active': '#D4D4D8',\n '--ngxsmk-color-ring': '#D4D4D8',\n },\n },\n};\n\n/**\n * Default preset: Emerald green. This preset generates the prebuilt\n * `ngxsmk.css` stylesheet shipped with @ngxsmk/theme.\n */\nexport const emeraldPreset: ThemeConfig = {\n name: 'emerald',\n brand: { primary: '#059669' },\n};\n\nexport const rosePreset: ThemeConfig = {\n name: 'rose',\n brand: { primary: '#E11D48' },\n};\n\nexport const presets: Record<string, ThemeConfig> = {\n violet: violetPreset,\n neutral: neutralPreset,\n emerald: emeraldPreset,\n rose: rosePreset,\n};\n","import { ResolvedTheme } from './types';\nimport { deriveScale, rotateHue } from './color';\n\n/**\n * A token output adapter transforms a `ResolvedTheme` into platform-specific\n * CSS custom properties. The default `cssVarsAdapter` emits `--ngxsmk-*`\n * variables; the `ionicVarsAdapter` emits `--ion-*` variables that Ionic\n * components consume.\n */\nexport interface TokenOutputAdapter {\n /** Unique name for this adapter (e.g. 'ngxsmk', 'ionic'). */\n readonly name: string;\n /** Transform a resolved theme into platform-specific CSS variables. */\n vars(theme: ResolvedTheme): Record<string, string>;\n}\n\n/**\n * Maps NGXSMK semantic color roles to Ionic's color variable namespace.\n *\n * Ionic expects:\n * --ion-color-primary, --ion-color-primary-rgb, --ion-color-primary-shade,\n * --ion-color-primary-tint, --ion-color-secondary, etc.\n *\n * This adapter produces the subset Ionic needs for theming.\n */\nexport const ionicVarsAdapter: TokenOutputAdapter = {\n name: 'ionic',\n\n vars(theme: ResolvedTheme): Record<string, string> {\n const vars: Record<string, string> = {};\n\n // Primary\n vars['--ion-color-primary'] = theme.brandBase;\n vars['--ion-color-primary-rgb'] = hexToRgbStr(theme.brandBase);\n vars['--ion-color-primary-shade'] = shiftLightnessHex(theme.brandBase, -14);\n vars['--ion-color-primary-tint'] = shiftLightnessHex(theme.brandBase, 8);\n\n // Secondary\n vars['--ion-color-secondary'] = theme.secondaryBase;\n vars['--ion-color-secondary-rgb'] = hexToRgbStr(theme.secondaryBase);\n vars['--ion-color-secondary-shade'] = shiftLightnessHex(theme.secondaryBase, -14);\n vars['--ion-color-secondary-tint'] = shiftLightnessHex(theme.secondaryBase, 8);\n\n // Tertiary (derived from brand hue + 64)\n const tertiary = deriveScale(rotateHue(theme.brandBase, 64));\n vars['--ion-color-tertiary'] = tertiary[500];\n vars['--ion-color-tertiary-rgb'] = hexToRgbStr(tertiary[500]);\n vars['--ion-color-tertiary-shade'] = tertiary[600];\n vars['--ion-color-tertiary-tint'] = tertiary[400];\n\n // Semantic status colors\n for (const [name, hex] of Object.entries(theme.semantic)) {\n vars[`--ion-color-${name}`] = hex;\n vars[`--ion-color-${name}-rgb`] = hexToRgbStr(hex);\n }\n\n // Background / surface\n vars['--ion-background-color'] = theme.neutral[50];\n vars['--ion-background-color-rgb'] = hexToRgbStr(theme.neutral[50]);\n vars['--ion-text-color'] = '#0A1317';\n vars['--ion-text-color-rgb'] = '10, 19, 23';\n\n // Typography\n vars['--ion-font-family'] = theme.fontFamily.sans;\n\n // Border radius (Ionic uses --ion-border-radius)\n vars['--ion-border-radius'] = theme.radius[theme.radiusBase];\n\n return vars;\n },\n};\n\n/** Default NGXSMK adapter — emits `--ngxsmk-*` variables. */\nexport const cssVarsAdapter: TokenOutputAdapter = {\n name: 'ngxsmk',\n vars: () => ({}), // Not used directly — buildThemeCss handles this\n};\n\n// ─── Helpers ──────────────────────────────────────────────\n\nfunction hexToRgbStr(hex: string): string {\n const h = hex.replace('#', '');\n const r = parseInt(h.substring(0, 2), 16);\n const g = parseInt(h.substring(2, 4), 16);\n const b = parseInt(h.substring(4, 6), 16);\n return `${r}, ${g}, ${b}`;\n}\n\nfunction shiftLightnessHex(hex: string, amount: number): string {\n // Simple hex lightness shift — import from color.ts would be circular\n const h = hex.replace('#', '');\n let r = parseInt(h.substring(0, 2), 16);\n let g = parseInt(h.substring(2, 4), 16);\n let b = parseInt(h.substring(4, 6), 16);\n\n if (amount > 0) {\n r = Math.min(255, r + Math.round((255 - r) * (amount / 100)));\n g = Math.min(255, g + Math.round((255 - g) * (amount / 100)));\n b = Math.min(255, b + Math.round((255 - b) * (amount / 100)));\n } else {\n const factor = 1 + amount / 100;\n r = Math.max(0, Math.round(r * factor));\n g = Math.max(0, Math.round(g * factor));\n b = Math.max(0, Math.round(b * factor));\n }\n\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Injectable, inject } from '@angular/core';\nimport { buildThemeCss } from './css';\nimport { resolveTheme } from './define-config';\nimport { TokenOutputAdapter, ionicVarsAdapter } from './token-adapter';\nimport { ThemeConfig } from './types';\n\nconst STYLE_ID = 'ngxsmk-theme';\nconst IONIC_STYLE_ID = 'ngxsmk-ionic-theme';\n\n/**\n * Injects generated theme CSS into the document at runtime.\n *\n * Decoupled from dark-mode switching so consumers who only need\n * token injection (e.g. the CLI theme-preview) don't pull in\n * class-toggle / localStorage / matchMedia logic.\n *\n * SSR-safe: all DOM access goes through the injected document.\n */\n@Injectable({ providedIn: 'root' })\nexport class NgxThemeInjectorService {\n private readonly document = inject(DOCUMENT);\n\n /**\n * Apply a theme at runtime. Generates token CSS from the config and swaps\n * it into a dedicated `<style>` element, overriding the build-time theme.\n *\n * @param adapter Optional output adapter. Defaults to the standard NGXSMK\n * `--ngxsmk-*` CSS variables. Pass `ionicVarsAdapter` to also generate\n * `--ion-*` variables for Ionic components.\n */\n applyTheme(config: ThemeConfig, adapter?: TokenOutputAdapter): void {\n const head = this.document.head;\n let style = this.document.getElementById(STYLE_ID) as HTMLStyleElement | null;\n if (!style) {\n style = this.document.createElement('style');\n style.id = STYLE_ID;\n head.appendChild(style);\n }\n\n let css = buildThemeCss(config);\n\n if (adapter) {\n const resolved = resolveTheme(config);\n const platformVars = adapter.vars(resolved);\n css += '\\n' + this.buildAdapterCss(adapter.name, platformVars);\n }\n\n style.textContent = css;\n }\n\n /**\n * Apply Ionic-specific token variables alongside the standard NGXSMK theme.\n * Generates `--ion-*` variables derived from the same `ThemeConfig`.\n */\n applyIonicTheme(config: ThemeConfig): void {\n const head = this.document.head;\n let style = this.document.getElementById(IONIC_STYLE_ID) as HTMLStyleElement | null;\n if (!style) {\n style = this.document.createElement('style');\n style.id = IONIC_STYLE_ID;\n head.appendChild(style);\n }\n\n const resolved = resolveTheme(config);\n const vars = ionicVarsAdapter.vars(resolved);\n style.textContent = this.buildAdapterCss('ionic', vars);\n }\n\n /** Remove a runtime-applied theme, falling back to the build-time CSS. */\n clearTheme(): void {\n this.document.getElementById(STYLE_ID)?.remove();\n }\n\n /** Remove the Ionic adapter stylesheet. */\n clearIonicTheme(): void {\n this.document.getElementById(IONIC_STYLE_ID)?.remove();\n }\n\n private buildAdapterCss(adapterName: string, vars: Record<string, string>): string {\n const lines = Object.entries(vars).map(([k, v]) => ` ${k}: ${v};`);\n return `/* @ngxsmk/theme — ${adapterName} adapter */\\n:root {\\n${lines.join('\\n')}\\n}`;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Injectable, computed, effect, inject, signal } from '@angular/core';\nimport { NgxThemeInjectorService } from './theme-injector.service';\nimport { TokenOutputAdapter } from './token-adapter';\nimport { ThemeConfig } from './types';\n\nexport type ThemeMode = 'light' | 'dark' | 'system';\n\nconst STORAGE_KEY = 'ngxsmk-theme-mode';\n\n/**\n * Runtime theme control: dark-mode switching (class strategy) and dynamic\n * theme application by injecting generated token CSS into the document.\n *\n * CSS injection is delegated to {@link NgxThemeInjectorService} for\n * consumers who only need token injection without dark-mode logic.\n *\n * SSR-safe: all DOM access goes through the injected document and degrades\n * gracefully when `window`/`matchMedia` are unavailable.\n */\n@Injectable({ providedIn: 'root' })\nexport class NgxsmkThemeService {\n private readonly document: Document;\n private readonly injector = inject(NgxThemeInjectorService);\n\n /** User preference: explicit light/dark or follow the OS. */\n readonly mode: ReturnType<typeof signal<ThemeMode>>;\n\n private readonly systemDark: ReturnType<typeof signal<boolean>>;\n\n /** Effective darkness after resolving `system` against the OS setting. */\n readonly isDark: ReturnType<typeof computed<boolean>>;\n\n constructor() {\n this.document = inject(DOCUMENT);\n\n this.mode = signal<ThemeMode>(this.restoreMode());\n this.systemDark = signal(this.matchSystemDark());\n this.isDark = computed(() =>\n this.mode() === 'system' ? this.systemDark() : this.mode() === 'dark',\n );\n\n const media = this.document.defaultView?.matchMedia?.('(prefers-color-scheme: dark)');\n media?.addEventListener('change', (e) => this.systemDark.set(e.matches));\n\n effect(() => {\n this.document.documentElement.classList.toggle('dark', this.isDark());\n });\n }\n\n setMode(mode: ThemeMode): void {\n this.mode.set(mode);\n try {\n this.document.defaultView?.localStorage?.setItem(STORAGE_KEY, mode);\n } catch {\n // Storage unavailable (SSR, privacy mode) — preference is session-only.\n }\n }\n\n toggle(): void {\n this.setMode(this.isDark() ? 'light' : 'dark');\n }\n\n /** @see NgxThemeInjectorService.applyTheme */\n applyTheme(config: ThemeConfig, adapter?: TokenOutputAdapter): void {\n this.injector.applyTheme(config, adapter);\n }\n\n /** @see NgxThemeInjectorService.applyIonicTheme */\n applyIonicTheme(config: ThemeConfig): void {\n this.injector.applyIonicTheme(config);\n }\n\n /** @see NgxThemeInjectorService.clearTheme */\n clearTheme(): void {\n this.injector.clearTheme();\n }\n\n /** @see NgxThemeInjectorService.clearIonicTheme */\n clearIonicTheme(): void {\n this.injector.clearIonicTheme();\n }\n\n private restoreMode(): ThemeMode {\n try {\n const stored = this.document.defaultView?.localStorage?.getItem(STORAGE_KEY);\n if (stored === 'light' || stored === 'dark' || stored === 'system') {\n return stored;\n }\n } catch {\n // Fall through to default.\n }\n return 'system';\n }\n\n private matchSystemDark(): boolean {\n return this.document.defaultView?.matchMedia?.('(prefers-color-scheme: dark)').matches ?? false;\n }\n}\n","/*\n * Public API Surface of @ngxsmk/theme\n */\n\nexport * from './lib/types';\nexport * from './lib/color';\nexport * from './lib/tokens';\nexport * from './lib/define-config';\nexport * from './lib/css';\nexport * from './lib/presets';\nexport * from './lib/theme.service';\nexport * from './lib/theme-injector.service';\nexport * from './lib/token-adapter';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AAAA;;;;;;AAMG;;ACGH,SAAS,QAAQ,CAAC,GAAW,EAAA;IAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;AAClC,IAAA,MAAM,IAAI,GACR,KAAK,CAAC,MAAM,KAAK;AACf,UAAE;aACG,KAAK,CAAC,EAAE;aACR,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;aAChB,IAAI,CAAC,EAAE;UACV,KAAK;IACX,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AAClC,QAAA,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,CAAA,CAAA,CAAG,CAAC;IAChD;AAEA,IAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG;AAC9C,IAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG;AAC9C,IAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG;AAC9C,IAAA,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACpB;AAEA,SAAS,YAAY,CAAC,CAAS,EAAA;IAC7B,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,KAAK,EAAE,GAAG,CAAC;AACtE;AAEA,SAAS,YAAY,CAAC,CAAS,EAAA;IAC7B,OAAO,CAAC,IAAI,SAAS,GAAG,CAAC,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK;AAC1E;AAEM,SAAU,UAAU,CAAC,GAAW,EAAA;AACpC,IAAA,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC;AAC7C,IAAA,MAAM,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;AAC1B,IAAA,MAAM,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;AAC1B,IAAA,MAAM,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;AAE1B,IAAA,MAAM,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC;AAChE,IAAA,MAAM,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC;AAChE,IAAA,MAAM,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC;IAEhE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAEvB,IAAA,MAAM,CAAC,GAAG,YAAY,GAAG,EAAE,GAAG,WAAW,GAAG,EAAE,GAAG,YAAY,GAAG,EAAE;AAClE,IAAA,MAAM,CAAC,GAAG,YAAY,GAAG,EAAE,GAAG,WAAW,GAAG,EAAE,GAAG,YAAY,GAAG,EAAE;AAClE,IAAA,MAAM,EAAE,GAAG,YAAY,GAAG,EAAE,GAAG,YAAY,GAAG,EAAE,GAAG,WAAW,GAAG,EAAE;AAEnE,IAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;AACpC,IAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,EAAE;IAC3C,IAAI,CAAC,GAAG,CAAC;QAAE,CAAC,IAAI,GAAG;IAEnB,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAC1B;AAEM,SAAU,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAS,EAAA;IACjD,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG;IAChC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5B,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IAE7B,MAAM,EAAE,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,EAAE;IACnD,MAAM,EAAE,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,EAAE;IACnD,MAAM,EAAE,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,WAAW,GAAG,EAAE;AAElD,IAAA,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACtB,IAAA,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACtB,IAAA,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AAEtB,IAAA,MAAM,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC;AACjE,IAAA,MAAM,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC;AACjE,IAAA,MAAM,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,WAAW,GAAG,CAAC;IAEhE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAE9E,MAAM,KAAK,GAAG,CAAC,CAAS,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AAC5D,IAAA,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAA,EAAG,KAAK,CAAC,QAAQ,CAAC,CAAA,EAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE;AAChF;AAEA;AACM,SAAU,cAAc,CAAC,GAAW,EAAE,KAAa,EAAA;AACvD,IAAA,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC;AAC7B,IAAA,OAAO,UAAU,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;AACnF;AAEA;AACM,SAAU,SAAS,CAAC,GAAW,EAAE,OAAe,EAAA;AACpD,IAAA,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC;IAC7B,OAAO,UAAU,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;AAC/E;AAEA;AACA,MAAM,eAAe,GAAqC;AACxD,IAAA,EAAE,EAAE,IAAI;AACR,IAAA,GAAG,EAAE,IAAI;AACT,IAAA,GAAG,EAAE,IAAI;AACT,IAAA,GAAG,EAAE,IAAI;AACT,IAAA,GAAG,EAAE,IAAI;AACT,IAAA,GAAG,EAAE,IAAI;AACT,IAAA,GAAG,EAAE,IAAI;AACT,IAAA,GAAG,EAAE,GAAG;AACR,IAAA,GAAG,EAAE,IAAI;AACT,IAAA,GAAG,EAAE,IAAI;AACT,IAAA,GAAG,EAAE,IAAI;CACV;AAED;AACM,SAAU,WAAW,CAAC,OAAe,EAAA;AACzC,IAAA,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC;IAEhC,IAAI,OAAO,GAAqB,GAAG;AACnC,IAAA,IAAI,YAAY,GAAG,MAAM,CAAC,iBAAiB;AAC3C,IAAA,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;AAC1D,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;AACrC,QAAA,IAAI,KAAK,GAAG,YAAY,EAAE;YACxB,YAAY,GAAG,KAAK;AACpB,YAAA,OAAO,GAAG,MAAM,CAAC,IAAI,CAAqB;QAC5C;IACF;IAEA,MAAM,KAAK,GAAG,EAAgB;AAC9B,IAAA,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;AAC1D,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAqB;AAC5C,QAAA,IAAI,GAAG,KAAK,OAAO,EAAE;YACnB,KAAK,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC;QAC/B;aAAO;;AAEL,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;YACrD,KAAK,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;QACjE;IACF;AACA,IAAA,OAAO,KAAK;AACd;;ACzIA;;;;AAIG;AACI,MAAM,eAAe,GAAe;AACzC,IAAA,EAAE,EAAE,SAAS;AACb,IAAA,GAAG,EAAE,SAAS;AACd,IAAA,GAAG,EAAE,SAAS;AACd,IAAA,GAAG,EAAE,SAAS;AACd,IAAA,GAAG,EAAE,SAAS;AACd,IAAA,GAAG,EAAE,SAAS;AACd,IAAA,GAAG,EAAE,SAAS;AACd,IAAA,GAAG,EAAE,SAAS;AACd,IAAA,GAAG,EAAE,SAAS;AACd,IAAA,GAAG,EAAE,SAAS;AACd,IAAA,GAAG,EAAE,SAAS;;AAGT,MAAM,gBAAgB,GAAmB;AAC9C,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,KAAK,EAAE,SAAS;AAChB,IAAA,IAAI,EAAE,SAAS;;AAGV,MAAM,mBAAmB,GAAiB;AAC/C,IAAA,IAAI,EAAE,2DAA2D;AACjE,IAAA,IAAI,EAAE,gDAAgD;;AAGjD,MAAM,kBAAkB,GAAoB;AACjD,IAAA,OAAO,EAAE;AACP,QAAA,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;AAC/D,QAAA,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;AACnE,QAAA,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;AACjE,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;AAC5D,QAAA,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;AACjE,QAAA,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;AAC7D,KAAA;AACD,IAAA,KAAK,EAAE;AACL,QAAA,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;AACjE,QAAA,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;AACjE,QAAA,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;AAC7D,KAAA;AACD,IAAA,IAAI,EAAE;AACJ,QAAA,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;AAC5D,QAAA,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;AAClE,QAAA,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;AAC9D,KAAA;AACD,IAAA,KAAK,EAAE;AACL,QAAA,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;AACjE,QAAA,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;AAC9D,QAAA,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;AAChE,KAAA;;AAGH;;;;AAIG;AACI,MAAM,cAAc,GAAG;AAE9B;;;AAGG;AACI,MAAM,eAAe,GAA2B;AACrD,IAAA,EAAE,EAAE,MAAM;AACV,IAAA,EAAE,EAAE,cAAc;AAClB,IAAA,EAAE,EAAE,MAAM;;AAGZ;;;AAGG;AACI,MAAM,OAAO,GAA2B;AAC7C,IAAA,QAAQ,EAAE,KAAK;AACf,IAAA,KAAK,EAAE,KAAK;AACZ,IAAA,KAAK,EAAE,KAAK;;AAGd;AACO,MAAM,SAAS,GAA2B;AAC/C,IAAA,EAAE,EAAE,MAAM;AACV,IAAA,EAAE,EAAE,SAAS;AACb,IAAA,EAAE,EAAE,QAAQ;;AAGd;AACO,MAAM,QAAQ,GAA2B;AAC9C,IAAA,KAAK,EAAE,SAAS;AAChB,IAAA,MAAM,EAAE,GAAG;AACX,IAAA,IAAI,EAAE,QAAQ;;AAGhB;AACO,MAAM,WAAW,GAA2B;AACjD,IAAA,OAAO,EAAE,KAAK;AACd,IAAA,MAAM,EAAE,KAAK;AACb,IAAA,QAAQ,EAAE,KAAK;AACf,IAAA,IAAI,EAAE,KAAK;;AAGb;AACO,MAAM,OAAO,GAA2B;AAC7C,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,KAAK,EAAE,MAAM;AACb,IAAA,MAAM,EAAE,KAAK;AACb,IAAA,OAAO,EAAE,OAAO;;AAGX,MAAM,OAAO,GAA2B;AAC7C,IAAA,GAAG,EAAE,KAAK;AACV,IAAA,KAAK,EAAE,UAAU;AACjB,IAAA,GAAG,EAAE,SAAS;AACd,IAAA,KAAK,EAAE,UAAU;AACjB,IAAA,GAAG,EAAE,QAAQ;AACb,IAAA,GAAG,EAAE,SAAS;AACd,IAAA,GAAG,EAAE,MAAM;AACX,IAAA,GAAG,EAAE,SAAS;AACd,IAAA,GAAG,EAAE,QAAQ;AACb,IAAA,GAAG,EAAE,MAAM;AACX,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,IAAI,EAAE,MAAM;;AAGd;;;;AAIG;AACI,MAAM,MAAM,GAA2B;AAC5C,IAAA,IAAI,EAAE,KAAK;IACX,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,MAAM;IACV,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,SAAS;AAChB,IAAA,IAAI,EAAE,QAAQ;;AAGhB;;;;;;AAMG;AACI,MAAM,MAAM,GAA2B;AAC5C,IAAA,EAAE,EAAE,uFAAuF;AAC3F,IAAA,EAAE,EAAE,wFAAwF;AAC5F,IAAA,EAAE,EAAE,yFAAyF;AAC7F,IAAA,EAAE,EAAE,wFAAwF;AAC5F,IAAA,KAAK,EAAE,yFAAyF;;AAGlG;;;;AAIG;AACI,MAAM,OAAO,GAA2B;AAC7C,IAAA,QAAQ,EAAE,MAAM;AAChB,IAAA,MAAM,EAAE,MAAM;AACd,IAAA,MAAM,EAAE,MAAM;AACd,IAAA,OAAO,EAAE,MAAM;AACf,IAAA,KAAK,EAAE,MAAM;AACb,IAAA,OAAO,EAAE,MAAM;AACf,IAAA,KAAK,EAAE,MAAM;AACb,IAAA,OAAO,EAAE,MAAM;;AAGV,MAAM,QAAQ,GAA2B;AAC9C,IAAA,OAAO,EAAE,KAAK;AACd,IAAA,IAAI,EAAE,OAAO;AACb,IAAA,MAAM,EAAE,OAAO;AACf,IAAA,IAAI,EAAE,OAAO;AACb,IAAA,MAAM,EAAE,OAAO;;AAGV,MAAM,MAAM,GAA2B;AAC5C,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,EAAE,EAAE,4BAA4B;AAChC,IAAA,GAAG,EAAE,4BAA4B;AACjC,IAAA,QAAQ,EAAE,8BAA8B;AACxC,IAAA,UAAU,EAAE,4BAA4B;;;ACtL1C;;;;;;;AAOG;AACG,SAAU,YAAY,CAAC,MAAmB,EAAA;AAC9C,IAAA,OAAO,MAAM;AACf;AAEA;AACM,SAAU,YAAY,CAAC,MAAmB,EAAA;AAC9C,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;IACnF,OAAO;AACL,QAAA,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,QAAQ;AAC7B,QAAA,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;AAC/B,QAAA,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;QACrE,aAAa;QACb,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,cAAc,IAAI,WAAW,CAAC,aAAa,CAAC;AACpE,QAAA,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,eAAe;QAC1C,QAAQ,EAAE,EAAE,GAAG,gBAAgB,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE;QACrD,UAAU,EAAE,EAAE,GAAG,mBAAmB,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE;AACxE,QAAA,UAAU,EAAE,kBAAkB;AAC9B,QAAA,OAAO,EAAE,OAAO;AAChB,QAAA,MAAM,EAAE,MAAM;AACd,QAAA,UAAU,EAAE,MAAM,CAAC,YAAY,IAAI,IAAI;AACvC,QAAA,MAAM,EAAE,MAAM;AACd,QAAA,QAAQ,EAAE,QAAQ;AAClB,QAAA,MAAM,EAAE,MAAM;AACd,QAAA,MAAM,EAAE,OAAO;AACf,QAAA,QAAQ,EAAE;AACR,YAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,IAAI,OAAO;AAC9C,YAAA,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,IAAI,MAAM;AAChD,SAAA;AACD,QAAA,SAAS,EAAE;AACT,YAAA,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;AACpC,YAAA,IAAI,EAAE,MAAM,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE;AACnC,SAAA;KACF;AACH;;ACzCA,SAAS,SAAS,CAAC,MAAc,EAAE,KAAiB,EAAA;IAClD,MAAM,IAAI,GAAS,EAAE;AACrB,IAAA,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACjD,IAAI,CAAC,kBAAkB,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAC,GAAG,KAAK;IAClD;AACA,IAAA,OAAO,IAAI;AACb;AAEA;AACA,MAAM,wBAAwB,GAAyB;AACrD,IAAA,MAAM,EAAE;AACN,QAAA,oBAAoB,EAAE,6BAA6B;AACnD,QAAA,uBAAuB,EAAE,gCAAgC;AACzD,QAAA,6BAA6B,EAAE,yBAAyB;AACxD,QAAA,6BAA6B,EAAE,KAAK;AACpC,QAAA,wBAAwB,EAAE,2BAA2B;AACrD,QAAA,kCAAkC,EAAE,KAAK;AAC1C,KAAA;AACD,IAAA,IAAI,EAAE;AACJ,QAAA,kBAAkB,EAAE,6BAA6B;AACjD,QAAA,sBAAsB,EAAE,yBAAyB;AACjD,QAAA,sBAAsB,EAAE,yBAAyB;AACjD,QAAA,4BAA4B,EAAE,6BAA6B;AAC5D,KAAA;AACD,IAAA,SAAS,EAAE;AACT,QAAA,uBAAuB,EAAE,6BAA6B;AACtD,QAAA,2BAA2B,EAAE,yBAAyB;AACtD,QAAA,iCAAiC,EAAE,6BAA6B;AACjE,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,0BAA0B,EAAE,QAAQ;AACpC,QAAA,sBAAsB,EAAE,qCAAqC;AAC7D,QAAA,yBAAyB,EAAE,6BAA6B;AACxD,QAAA,0BAA0B,EAAE,2BAA2B;AACxD,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,uBAAuB,EAAE,SAAS;AAClC,QAAA,wBAAwB,EAAE,SAAS;AACnC,QAAA,wBAAwB,EAAE,2BAA2B;AACrD,QAAA,oBAAoB,EAAE,oCAAoC;AAC1D,QAAA,4BAA4B,EAAE,UAAU;AACxC,QAAA,0BAA0B,EAAE,6BAA6B;AACzD,QAAA,4BAA4B,EAAE,6BAA6B;AAC5D,KAAA;AACD,IAAA,WAAW,EAAE;AACX,QAAA,yBAAyB,EAAE,6BAA6B;AACxD,QAAA,gCAAgC,EAAE,qCAAqC;AACvE,QAAA,mCAAmC,EAAE,wCAAwC;AAC7E,QAAA,6BAA6B,EAAE,6BAA6B;AAC5D,QAAA,iCAAiC,EAAE,qCAAqC;AACxE,QAAA,+BAA+B,EAAE,mCAAmC;AACpE,QAAA,kCAAkC,EAChC,kEAAkE;AACpE,QAAA,oCAAoC,EAAE,6BAA6B;AACnE,QAAA,2BAA2B,EAAE,yBAAyB;AACtD,QAAA,gCAAgC,EAAE,yBAAyB;AAC3D,QAAA,iCAAiC,EAAE,SAAS;AAC5C,QAAA,oCAAoC,EAAE,QAAQ;AAC9C,QAAA,mCAAmC,EAAE,UAAU;AAC/C,QAAA,qCAAqC,EAAE,iCAAiC;AACxE,QAAA,qCAAqC,EAAE,KAAK;AAC5C,QAAA,6BAA6B,EAAE,yBAAyB;AACxD,QAAA,6BAA6B,EAAE,yBAAyB;AACxD,QAAA,8BAA8B,EAAE,6BAA6B;AAC7D,QAAA,kCAAkC,EAAE,6BAA6B;AACjE,QAAA,mCAAmC,EAAE,mCAAmC;AACxE,QAAA,mCAAmC,EACjC,iEAAiE;AACnE,QAAA,oCAAoC,EAAE,4BAA4B;AAClE,QAAA,sCAAsC,EACpC,iEAAiE;AACpE,KAAA;AACD,IAAA,UAAU,EAAE;AACV,QAAA,yBAAyB,EAAE,6BAA6B;AACxD,QAAA,6BAA6B,EAAE,oCAAoC;AACnE,QAAA,6BAA6B,EAAE,yBAAyB;AACxD,QAAA,6BAA6B,EAAE,MAAM;AACrC,QAAA,mCAAmC,EAAE,6BAA6B;AAClE,QAAA,mCAAmC,EACjC,4EAA4E;AAC9E,QAAA,mCAAmC,EAAE,2BAA2B;AAChE,QAAA,yCAAyC,EACvC,0EAA0E;AAC5E,QAAA,qCAAqC,EAAE,6BAA6B;AACpE,QAAA,qCAAqC,EAAE,6BAA6B;AACpE,QAAA,6BAA6B,EAAE,QAAQ;AACvC,QAAA,8BAA8B,EAAE,SAAS;AACzC,QAAA,0BAA0B,EAAE,uBAAuB;AACnD,QAAA,2BAA2B,EAAE,yBAAyB;AACvD,KAAA;CACF;AAED;AACA,SAAS,UAAU,CAAC,KAAoB,EAAA;AACtC,IAAA,MAAM,IAAI,GAAS;AACjB,QAAA,GAAG,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;AAClC,QAAA,GAAG,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC;AAC1C,QAAA,GAAG,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;AACtC,QAAA,oBAAoB,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI;AAC3C,QAAA,oBAAoB,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI;QAC3C,sBAAsB,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;AACtD,QAAA,yBAAyB,EAAE,cAAc;;AAGzC,QAAA,0BAA0B,EAAE,+BAA+B;AAC3D,QAAA,sBAAsB,EAAE,2BAA2B;;;AAInD,QAAA,qBAAqB,EAAE,kBAAkB;AACzC,QAAA,sBAAsB,EAAE,aAAa;;;;AAKrC,QAAA,qBAAqB,EAAE,4BAA4B;AACnD,QAAA,2BAA2B,EACzB,4EAA4E;YAC5E,0EAA0E;;QAG5E,GAAG,MAAM,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,MAAM,CAC/C,CAAC,MAAM,EAAE,MAAM,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,EAC9C,EAAU,CACX;KACF;AAED,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;AAC1D,QAAA,IAAI,CAAC,CAAA,wBAAA,EAA2B,GAAG,EAAE,CAAC,GAAG,KAAK;IAChD;AACA,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AAClD,QAAA,IAAI,CAAC,CAAA,iBAAA,EAAoB,GAAG,EAAE,CAAC,GAAG,KAAK;IACzC;AACA,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;AACpD,QAAA,IAAI,CAAC,CAAA,cAAA,EAAiB,GAAG,EAAE,CAAC,GAAG,KAAK;IACtC;AACA,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AACnD,QAAA,IAAI,CAAC,CAAA,kBAAA,EAAqB,GAAG,EAAE,CAAC,GAAG,KAAK;IAC1C;AACA,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AACtD,QAAA,IAAI,CAAC,CAAA,qBAAA,EAAwB,GAAG,EAAE,CAAC,GAAG,KAAK;IAC7C;AACA,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AAClD,QAAA,IAAI,CAAC,CAAA,iBAAA,EAAoB,GAAG,EAAE,CAAC,GAAG,KAAK;IACzC;AACA,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;AACxD,QAAA,IAAI,CAAC,CAAA,eAAA,EAAkB,GAAG,EAAE,CAAC,GAAG,KAAK;IACvC;AACA,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;AACvD,QAAA,IAAI,CAAC,CAAA,gBAAA,EAAmB,GAAG,EAAE,CAAC,GAAG,KAAK;IACxC;AACA,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;AACvD,QAAA,IAAI,CAAC,CAAA,gBAAA,EAAmB,GAAG,EAAE,CAAC,GAAG,KAAK;IACxC;AACA,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AACzD,QAAA,IAAI,CAAC,CAAA,kBAAA,EAAqB,GAAG,EAAE,CAAC,GAAG,KAAK;IAC1C;AACA,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;AACvD,QAAA,IAAI,CAAC,CAAA,cAAA,EAAiB,GAAG,EAAE,CAAC,GAAG,KAAK;IACtC;AACA,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;AACvD,QAAA,IAAI,CAAC,CAAA,WAAA,EAAc,GAAG,EAAE,CAAC,GAAG,KAAK;IACnC;AAEA,IAAA,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAW;AACjE,IAAA,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;AAC7D,QAAA,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAClD,YAAA,MAAM,KAAK,GAAc,MAAM,CAAC,IAAoB,CAAC;YACrD,IAAI,CAAC,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,KAAA,CAAO,CAAC,GAAG,KAAK,CAAC,IAAI;YACzD,IAAI,CAAC,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,KAAA,CAAO,CAAC,GAAG,KAAK,CAAC,UAAU;YAC/D,IAAI,CAAC,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,OAAA,CAAS,CAAC,GAAG,KAAK,CAAC,MAAM;QAC/D;IACF;;;AAIA,IAAA,IAAI,CAAC,4BAA4B,CAAC,GAAG,WAAW;AAChD,IAAA,IAAI,CAAC,4BAA4B,CAAC,GAAG,MAAM;AAC3C,IAAA,IAAI,CAAC,8BAA8B,CAAC,GAAG,KAAK;AAE5C,IAAA,OAAO,IAAI;AACb;AAEA;AACA,SAAS,SAAS,CAAC,KAAoB,EAAA;AACrC,IAAA,MAAM,IAAI,GAAS;AACjB,QAAA,cAAc,EAAE,OAAO;QAEvB,wBAAwB,EAAE,KAAK,CAAC,SAAS;AACzC,QAAA,2BAA2B,EAAE,SAAS;QACtC,8BAA8B,EAAE,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACnE,+BAA+B,EAAE,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC;AACrE,QAAA,kCAAkC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;AACpD,QAAA,qCAAqC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;QAEvD,0BAA0B,EAAE,KAAK,CAAC,aAAa;AAC/C,QAAA,6BAA6B,EAAE,SAAS;QACxC,gCAAgC,EAAE,cAAc,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QACzE,iCAAiC,EAAE,cAAc,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC;AAC3E,QAAA,oCAAoC,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;AAC1D,QAAA,uCAAuC,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;;AAG7D,QAAA,2BAA2B,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;AAC9C,QAAA,8BAA8B,EAAE,SAAS;AACzC,QAAA,wBAAwB,EAAE,SAAS;AACnC,QAAA,2BAA2B,EAAE,SAAS;AACtC,QAAA,gCAAgC,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;AACpD,QAAA,mCAAmC,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;AACvD,QAAA,8BAA8B,EAAE,qBAAqB;AACrD,QAAA,+BAA+B,EAAE,oBAAoB;AACrD,QAAA,kCAAkC,EAAE,SAAS;AAC7C,QAAA,wBAAwB,EAAE,oBAAoB;AAC9C,QAAA,+BAA+B,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;AACnD,QAAA,gCAAgC,EAAE,qBAAqB;;AAGvD,QAAA,0BAA0B,EAAE,SAAS;AACrC,QAAA,0BAA0B,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;AAC7C,QAAA,0BAA0B,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;AAC9C,QAAA,0BAA0B,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;AAC9C,QAAA,0BAA0B,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAE9C,qBAAqB,EAAE,KAAK,CAAC,SAAS;AACtC,QAAA,yBAAyB,EAAE,oBAAoB;AAC/C,QAAA,uBAAuB,EAAE,CAAA,UAAA,EAAa,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA,+BAAA,EAAkC,KAAK,CAAC,SAAS,CAAA,kBAAA,CAAoB;;;;;;AAO3H,QAAA,kBAAkB,EAAE,SAAS;AAC7B,QAAA,kBAAkB,EAAE,SAAS;AAC7B,QAAA,kBAAkB,EAAE,SAAS;AAC7B,QAAA,kBAAkB,EAAE,SAAS;AAC7B,QAAA,kBAAkB,EAAE,SAAS;AAC7B,QAAA,kBAAkB,EAAE,SAAS;AAC7B,QAAA,kBAAkB,EAAE,SAAS;AAC7B,QAAA,kBAAkB,EAAE,SAAS;KAC9B;AAED,IAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC5D,IAAI,CAAC,yBAAyB,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC;AAC/C,IAAA,IAAI,CAAC,4BAA4B,CAAC,GAAG,SAAS;IAC9C,IAAI,CAAC,mCAAmC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC;IACzD,IAAI,CAAC,sCAAsC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC;AAE5D,IAAA,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AACxD,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC;AAC9B,QAAA,IAAI,CAAC,CAAA,eAAA,EAAkB,IAAI,EAAE,CAAC,GAAG,GAAG;AACpC,QAAA,IAAI,CAAC,CAAA,kBAAA,EAAqB,IAAI,EAAE,CAAC,GAAG,SAAS;QAC7C,IAAI,CAAC,CAAA,eAAA,EAAkB,IAAI,CAAA,UAAA,CAAY,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;QACrD,IAAI,CAAC,CAAA,kBAAA,EAAqB,IAAI,CAAA,UAAA,CAAY,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;IAC1D;IAEA,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE;AAC9C;AAEA;AACA,SAAS,QAAQ,CAAC,KAAoB,EAAA;AACpC,IAAA,MAAM,IAAI,GAAS;AACjB,QAAA,cAAc,EAAE,MAAM;AAEtB,QAAA,wBAAwB,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;AAC1C,QAAA,2BAA2B,EAAE,SAAS;AACtC,QAAA,8BAA8B,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;AAChD,QAAA,+BAA+B,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;AACjD,QAAA,kCAAkC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;AACpD,QAAA,qCAAqC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;AAEvD,QAAA,0BAA0B,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;AAChD,QAAA,6BAA6B,EAAE,SAAS;AACxC,QAAA,gCAAgC,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;AACtD,QAAA,iCAAiC,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;AACvD,QAAA,oCAAoC,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;AAC1D,QAAA,uCAAuC,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;;;AAI7D,QAAA,2BAA2B,EAAE,SAAS;AACtC,QAAA,8BAA8B,EAAE,SAAS;AACzC,QAAA,wBAAwB,EAAE,SAAS;AACnC,QAAA,2BAA2B,EAAE,SAAS;AACtC,QAAA,gCAAgC,EAAE,SAAS;AAC3C,QAAA,mCAAmC,EAAE,SAAS;AAC9C,QAAA,8BAA8B,EAAE,yBAAyB;AACzD,QAAA,+BAA+B,EAAE,wBAAwB;AACzD,QAAA,kCAAkC,EAAE,SAAS;AAC7C,QAAA,wBAAwB,EAAE,wBAAwB;AAClD,QAAA,+BAA+B,EAAE,SAAS;AAC1C,QAAA,gCAAgC,EAAE,yBAAyB;;AAG3D,QAAA,0BAA0B,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;AAC9C,QAAA,0BAA0B,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;AAC9C,QAAA,0BAA0B,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;AAC9C,QAAA,0BAA0B,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;AAC9C,QAAA,0BAA0B,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;AAE9C,QAAA,qBAAqB,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;AACvC,QAAA,yBAAyB,EAAE,qBAAqB;AAChD,QAAA,uBAAuB,EAAE,CAAA,6BAAA,EAAgC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA,iDAAA,EAAoD,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA,kBAAA,CAAoB;;;;;AAMjK,QAAA,kBAAkB,EAAE,SAAS;AAC7B,QAAA,kBAAkB,EAAE,SAAS;AAC7B,QAAA,kBAAkB,EAAE,SAAS;AAC7B,QAAA,kBAAkB,EAAE,SAAS;AAC7B,QAAA,kBAAkB,EAAE,SAAS;AAC7B,QAAA,kBAAkB,EAAE,SAAS;AAC7B,QAAA,kBAAkB,EAAE,SAAS;AAC7B,QAAA,kBAAkB,EAAE,SAAS;KAC9B;AAED,IAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC5D,IAAI,CAAC,yBAAyB,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC;IAC/C,IAAI,CAAC,4BAA4B,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC;IAClD,IAAI,CAAC,mCAAmC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC;IACzD,IAAI,CAAC,sCAAsC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC;AAE5D,IAAA,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AACxD,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC;QAC9B,IAAI,CAAC,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAE,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;QAC3C,IAAI,CAAC,CAAA,kBAAA,EAAqB,IAAI,CAAA,CAAE,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;QAC9C,IAAI,CAAC,CAAA,eAAA,EAAkB,IAAI,CAAA,UAAA,CAAY,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;QACrD,IAAI,CAAC,CAAA,kBAAA,EAAqB,IAAI,CAAA,UAAA,CAAY,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;IAC1D;IAEA,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE;AAC7C;AAEA,SAAS,KAAK,CAAC,QAAgB,EAAE,IAAU,EAAE,MAAM,GAAG,EAAE,EAAA;AACtD,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,IAAI,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAC;AAC1F,IAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,QAAQ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,EAAA,EAAK,MAAM,GAAG;AAClE;AAEA;;;;AAIG;AACG,SAAU,aAAa,CAAC,MAAmC,EAAA;IAC/D,MAAM,KAAK,GACT,OAAO,IAAI,MAAM,IAAI,SAAS,IAAK;AACjC,UAAG;AACH,UAAE,YAAY,CAAC,MAAqB,CAAC;IAEzC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;AAC1E,IAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC;AAE5B,IAAA,IAAI,SAAiB;AACrB,IAAA,QAAQ,KAAK,CAAC,QAAQ,CAAC,QAAQ;AAC7B,QAAA,KAAK,OAAO;YACV,SAAS,GAAG,CAAA,uCAAA,EAA0C,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA,GAAA,CAAK;YACrF;QACF,KAAK,QAAQ,EAAE;;;AAGb,YAAA,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS;AACnC,YAAA,SAAS,GAAG;gBACV,CAAA,uCAAA,EAA0C,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA,GAAA,CAAK;gBACzE,KAAK,CAAC,CAAA,MAAA,EAAS,EAAE,CAAA,QAAA,EAAW,EAAE,WAAW,EAAE,CAAA,CAAE,EAAE,IAAI,CAAC;AACrD,aAAA,CAAC,IAAI,CAAC,MAAM,CAAC;YACd;QACF;QACA,SAAS;;;;;;AAMP,YAAA,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS;AACnC,YAAA,SAAS,GAAG,KAAK,CAAC,CAAA,MAAA,EAAS,EAAE,CAAA,QAAA,EAAW,EAAE,CAAA,QAAA,EAAW,EAAE,CAAA,CAAE,EAAE,IAAI,CAAC;QAClE;;;;;AAMF,IAAA,MAAM,WAAW,GAAS;AACxB,QAAA,0BAA0B,EAAE,KAAK;AACjC,QAAA,qBAAqB,EAAE,MAAM;AAC7B,QAAA,sBAAsB,EAAE,MAAM;KAC/B;AACD,IAAA,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AAC7C,QAAA,WAAW,CAAC,CAAA,kBAAA,EAAqB,GAAG,EAAE,CAAC,GAAG,KAAK;IACjD;AACA,IAAA,MAAM,aAAa,GAAG;QACpB,CAAA,2CAAA,EAA8C,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA,GAAA,CAAK;AACpF,QAAA,KAAK,CAAC,mDAAmD,EAAE,WAAW,CAAC;AACxE,KAAA,CAAC,IAAI,CAAC,MAAM,CAAC;AACd,IAAA,OAAO,4DAA4D,IAAI,CAAA,IAAA,EAAO,SAAS,CAAA,IAAA,EAAO,aAAa,IAAI;AACjH;;ACzZA;AACO,MAAM,YAAY,GAAgB;AACvC,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE;;AAG/B;AACO,MAAM,aAAa,GAAgB;AACxC,IAAA,IAAI,EAAE,SAAS;AACf,IAAA,KAAK,EAAE;AACL,QAAA,OAAO,EAAE,SAAS;;AAElB,QAAA,YAAY,EAAE;AACZ,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,GAAG,EAAE,SAAS;AACd,YAAA,GAAG,EAAE,SAAS;AACd,YAAA,GAAG,EAAE,SAAS;AACd,YAAA,GAAG,EAAE,SAAS;AACd,YAAA,GAAG,EAAE,SAAS;AACd,YAAA,GAAG,EAAE,SAAS;AACd,YAAA,GAAG,EAAE,SAAS;AACd,YAAA,GAAG,EAAE,SAAS;AACd,YAAA,GAAG,EAAE,SAAS;AACd,YAAA,GAAG,EAAE,SAAS;AACf,SAAA;AACF,KAAA;AACD,IAAA,SAAS,EAAE;;AAET,QAAA,IAAI,EAAE;AACJ,YAAA,wBAAwB,EAAE,SAAS;AACnC,YAAA,2BAA2B,EAAE,SAAS;AACtC,YAAA,8BAA8B,EAAE,SAAS;AACzC,YAAA,+BAA+B,EAAE,SAAS;AAC1C,YAAA,qBAAqB,EAAE,SAAS;AACjC,SAAA;AACF,KAAA;;AAGH;;;AAGG;AACI,MAAM,aAAa,GAAgB;AACxC,IAAA,IAAI,EAAE,SAAS;AACf,IAAA,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE;;AAGxB,MAAM,UAAU,GAAgB;AACrC,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE;;AAGxB,MAAM,OAAO,GAAgC;AAClD,IAAA,MAAM,EAAE,YAAY;AACpB,IAAA,OAAO,EAAE,aAAa;AACtB,IAAA,OAAO,EAAE,aAAa;AACtB,IAAA,IAAI,EAAE,UAAU;;;AC1ClB;;;;;;;;AAQG;AACI,MAAM,gBAAgB,GAAuB;AAClD,IAAA,IAAI,EAAE,OAAO;AAEb,IAAA,IAAI,CAAC,KAAoB,EAAA;QACvB,MAAM,IAAI,GAA2B,EAAE;;AAGvC,QAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,KAAK,CAAC,SAAS;QAC7C,IAAI,CAAC,yBAAyB,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC;AAC9D,QAAA,IAAI,CAAC,2BAA2B,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC;AAC3E,QAAA,IAAI,CAAC,0BAA0B,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;;AAGxE,QAAA,IAAI,CAAC,uBAAuB,CAAC,GAAG,KAAK,CAAC,aAAa;QACnD,IAAI,CAAC,2BAA2B,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC;AACpE,QAAA,IAAI,CAAC,6BAA6B,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC;AACjF,QAAA,IAAI,CAAC,4BAA4B,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;;AAG9E,QAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,sBAAsB,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC;QAC5C,IAAI,CAAC,0BAA0B,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC7D,IAAI,CAAC,4BAA4B,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC;QAClD,IAAI,CAAC,2BAA2B,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC;;AAGjD,QAAA,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AACxD,YAAA,IAAI,CAAC,CAAA,YAAA,EAAe,IAAI,EAAE,CAAC,GAAG,GAAG;YACjC,IAAI,CAAC,CAAA,YAAA,EAAe,IAAI,CAAA,IAAA,CAAM,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC;QACpD;;QAGA,IAAI,CAAC,wBAAwB,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;AAClD,QAAA,IAAI,CAAC,4BAA4B,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AACnE,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,SAAS;AACpC,QAAA,IAAI,CAAC,sBAAsB,CAAC,GAAG,YAAY;;QAG3C,IAAI,CAAC,mBAAmB,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI;;AAGjD,QAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;AAE5D,QAAA,OAAO,IAAI;IACb,CAAC;;AAGH;AACO,MAAM,cAAc,GAAuB;AAChD,IAAA,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,OAAO,EAAE,CAAC;;AAGlB;AAEA,SAAS,WAAW,CAAC,GAAW,EAAA;IAC9B,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;AAC9B,IAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AACzC,IAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AACzC,IAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AACzC,IAAA,OAAO,GAAG,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,CAAC,EAAE;AAC3B;AAEA,SAAS,iBAAiB,CAAC,GAAW,EAAE,MAAc,EAAA;;IAEpD,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;AAC9B,IAAA,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AACvC,IAAA,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AACvC,IAAA,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AAEvC,IAAA,IAAI,MAAM,GAAG,CAAC,EAAE;QACd,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC;QAC7D,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC;QAC7D,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC;IAC/D;SAAO;AACL,QAAA,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,GAAG,GAAG;AAC/B,QAAA,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;AACvC,QAAA,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;AACvC,QAAA,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;IACzC;AAEA,IAAA,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,EAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,EAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;AAClH;;ACpGA,MAAM,QAAQ,GAAG,cAAc;AAC/B,MAAM,cAAc,GAAG,oBAAoB;AAE3C;;;;;;;;AAQG;MAEU,uBAAuB,CAAA;AADpC,IAAA,WAAA,GAAA;AAEmB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AA8D7C,IAAA;AA5DC;;;;;;;AAOG;IACH,UAAU,CAAC,MAAmB,EAAE,OAA4B,EAAA;AAC1D,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI;QAC/B,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAA4B;QAC7E,IAAI,CAAC,KAAK,EAAE;YACV,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC5C,YAAA,KAAK,CAAC,EAAE,GAAG,QAAQ;AACnB,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QACzB;AAEA,QAAA,IAAI,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC;QAE/B,IAAI,OAAO,EAAE;AACX,YAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC;YACrC,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC3C,YAAA,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC;QAChE;AAEA,QAAA,KAAK,CAAC,WAAW,GAAG,GAAG;IACzB;AAEA;;;AAGG;AACH,IAAA,eAAe,CAAC,MAAmB,EAAA;AACjC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI;QAC/B,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,cAAc,CAA4B;QACnF,IAAI,CAAC,KAAK,EAAE;YACV,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC5C,YAAA,KAAK,CAAC,EAAE,GAAG,cAAc;AACzB,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QACzB;AAEA,QAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC;QACrC,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC5C,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC;IACzD;;IAGA,UAAU,GAAA;QACR,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE;IAClD;;IAGA,eAAe,GAAA;QACb,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE;IACxD;IAEQ,eAAe,CAAC,WAAmB,EAAE,IAA4B,EAAA;QACvE,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,CAAG,CAAC;QACnE,OAAO,CAAA,mBAAA,EAAsB,WAAW,CAAA,sBAAA,EAAyB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,GAAA,CAAK;IACxF;8GA9DW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cADV,MAAM,EAAA,CAAA,CAAA;;2FACnB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBADnC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACXlC,MAAM,WAAW,GAAG,mBAAmB;AAEvC;;;;;;;;;AASG;MAEU,kBAAkB,CAAA;AAY7B,IAAA,WAAA,GAAA;AAViB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAWzD,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAEhC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAY,IAAI,CAAC,WAAW,EAAE,CAAC;QACjD,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;AAChD,QAAA,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MACrB,IAAI,CAAC,IAAI,EAAE,KAAK,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,CACtE;AAED,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,UAAU,GAAG,8BAA8B,CAAC;QACrF,KAAK,EAAE,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAExE,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AACvE,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,OAAO,CAAC,IAAe,EAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC;QACrE;AAAE,QAAA,MAAM;;QAER;IACF;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,GAAG,MAAM,CAAC;IAChD;;IAGA,UAAU,CAAC,MAAmB,EAAE,OAA4B,EAAA;QAC1D,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC;IAC3C;;AAGA,IAAA,eAAe,CAAC,MAAmB,EAAA;AACjC,QAAA,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC;IACvC;;IAGA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;IAC5B;;IAGA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE;IACjC;IAEQ,WAAW,GAAA;AACjB,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,WAAW,CAAC;AAC5E,YAAA,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,QAAQ,EAAE;AAClE,gBAAA,OAAO,MAAM;YACf;QACF;AAAE,QAAA,MAAM;;QAER;AACA,QAAA,OAAO,QAAQ;IACjB;IAEQ,eAAe,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,UAAU,GAAG,8BAA8B,CAAC,CAAC,OAAO,IAAI,KAAK;IACjG;8GA5EW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cADL,MAAM,EAAA,CAAA,CAAA;;2FACnB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACpBlC;;AAEG;;ACFH;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"ngxsmk-theme.mjs","sources":["../../../../packages/theme/src/lib/types.ts","../../../../packages/theme/src/lib/color.ts","../../../../packages/theme/src/lib/tokens.ts","../../../../packages/theme/src/lib/define-config.ts","../../../../packages/theme/src/lib/css.ts","../../../../packages/theme/src/lib/presets.ts","../../../../packages/theme/src/lib/token-adapter.ts","../../../../packages/theme/src/lib/theme-injector.service.ts","../../../../packages/theme/src/lib/theme.service.ts","../../../../packages/theme/src/lib/ionic-provider.ts","../../../../packages/theme/src/public-api.ts","../../../../packages/theme/src/ngxsmk-theme.ts"],"sourcesContent":["/**\n * Design token model for the NGXSMK universal theme engine.\n *\n * A `ThemeConfig` is the single source of truth for a theme. The token\n * engine transforms it into platform outputs (CSS custom properties today;\n * SCSS/Tailwind/JSON exporters build on the same model).\n */\n\n/** An 11-step color scale, 50 (lightest) to 950 (darkest). */\nexport interface ColorScale {\n 50: string;\n 100: string;\n 200: string;\n 300: string;\n 400: string;\n 500: string;\n 600: string;\n 700: string;\n 800: string;\n 900: string;\n 950: string;\n}\n\nexport type ColorScaleStep = keyof ColorScale;\n\n/** Status colors used by alerts, badges, form validation, toasts. */\nexport interface SemanticColors {\n success: string;\n warning: string;\n error: string;\n info: string;\n}\n\nexport interface FontFamilies {\n sans: string;\n mono: string;\n}\n\n/** A single typographic role (size + line height + weight). */\nexport interface TypeStyle {\n size: string;\n lineHeight: string;\n weight: string;\n}\n\nexport type TypeRoleSize = 'large' | 'medium' | 'small';\n\n/** Material-inspired type roles: display, headline, title, body, label. */\nexport interface TypographyScale {\n display: Record<TypeRoleSize, TypeStyle>;\n headline: Record<TypeRoleSize, TypeStyle>;\n title: Record<TypeRoleSize, TypeStyle>;\n body: Record<TypeRoleSize, TypeStyle>;\n label: Record<TypeRoleSize, TypeStyle>;\n}\n\nexport type DarkModeStrategy = 'class' | 'media' | 'system';\n\nexport type RadiusPreset = 'none' | 'sm' | 'md' | 'lg' | 'xl';\n\n/** User-facing theme configuration. Everything except `brand` is optional. */\nexport interface ThemeConfig {\n /** Identifier used when registering multiple themes. */\n name?: string;\n brand: {\n /** Brand color as hex (e.g. `#7C3AED`). A full 50–950 scale is derived. */\n primary: string;\n /** Optional pre-built scale; overrides derivation from `primary`. */\n primaryScale?: ColorScale;\n /** Secondary brand color as hex. A full 50–950 scale is derived. */\n secondary?: string;\n /** Optional pre-built secondary scale. */\n secondaryScale?: ColorScale;\n };\n /** Neutral (gray) scale. Defaults to a balanced zinc-like scale. */\n neutral?: ColorScale;\n semantic?: Partial<SemanticColors>;\n typography?: {\n fontFamily?: Partial<FontFamilies>;\n };\n /** Global corner rounding character of the theme. Default `md`. */\n borderRadius?: RadiusPreset;\n /** How dark mode is activated. Default: `class` (a `.dark` class on `<html>`). */\n darkMode?: {\n strategy?: DarkModeStrategy;\n /** Class name used by the `class` strategy. Default `dark`. */\n className?: string;\n };\n /**\n * Raw semantic-role token overrides merged into the generated output,\n * e.g. `{ dark: { '--ngxsmk-color-primary': '#FAFAFA' } }`.\n */\n overrides?: {\n light?: Record<string, string>;\n dark?: Record<string, string>;\n };\n}\n\n/** A fully resolved theme: config merged with defaults, scales derived. */\nexport interface ResolvedTheme {\n name: string;\n /** The exact brand color from the config — light-mode primary. */\n brandBase: string;\n brand: ColorScale;\n secondaryBase: string;\n secondary: ColorScale;\n neutral: ColorScale;\n semantic: SemanticColors;\n fontFamily: FontFamilies;\n typography: TypographyScale;\n spacing: Record<string, string>;\n radius: Record<string, string>;\n radiusBase: RadiusPreset;\n shadow: Record<string, string>;\n duration: Record<string, string>;\n easing: Record<string, string>;\n /** Stacking layers emitted as `--ngxsmk-z-*`; overlays must share this ladder. */\n zIndex: Record<string, string>;\n darkMode: { strategy: DarkModeStrategy; className: string };\n overrides: {\n light: Record<string, string>;\n dark: Record<string, string>;\n };\n}\n","import { ColorScale } from './types';\n\n/** OKLCH color: l in [0,1], c in [0,0.4], h in [0,360). */\nexport interface Oklch {\n l: number;\n c: number;\n h: number;\n}\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } {\n const value = hex.replace('#', '');\n const full =\n value.length === 3\n ? value\n .split('')\n .map((c) => c + c)\n .join('')\n : value;\n if (!/^[0-9a-fA-F]{6}$/.test(full)) {\n throw new Error(`Invalid hex color: \"${hex}\"`);\n }\n\n const r = parseInt(full.slice(0, 2), 16) / 255;\n const g = parseInt(full.slice(2, 4), 16) / 255;\n const b = parseInt(full.slice(4, 6), 16) / 255;\n return { r, g, b };\n}\n\nfunction srgbToLinear(c: number): number {\n return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n}\n\nfunction linearToSrgb(c: number): number {\n return c <= 0.0031308 ? c * 12.92 : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;\n}\n\nexport function hexToOklch(hex: string): Oklch {\n const { r: sr, g: sg, b: sb } = hexToRgb(hex);\n const r = srgbToLinear(sr);\n const g = srgbToLinear(sg);\n const b = srgbToLinear(sb);\n\n const l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b;\n const m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b;\n const s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b;\n\n const l_ = Math.cbrt(l);\n const m_ = Math.cbrt(m);\n const s_ = Math.cbrt(s);\n\n const L = 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_;\n const a = 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_;\n const b_ = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_;\n\n const C = Math.sqrt(a * a + b_ * b_);\n let h = (Math.atan2(b_, a) * 180) / Math.PI;\n if (h < 0) h += 360;\n\n return { l: L, c: C, h };\n}\n\nexport function oklchToHex({ l: L, c: C, h }: Oklch): string {\n const hRad = (h * Math.PI) / 180;\n const a = C * Math.cos(hRad);\n const b_ = C * Math.sin(hRad);\n\n const l_ = L + 0.3963377774 * a + 0.2158037573 * b_;\n const m_ = L - 0.1055613458 * a - 0.0638541728 * b_;\n const s_ = L - 0.0894841775 * a - 1.291485548 * b_;\n\n const l = l_ * l_ * l_;\n const m = m_ * m_ * m_;\n const s = s_ * s_ * s_;\n\n const r = +4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s;\n const g = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s;\n const b = -0.0041960863 * l - 0.7034186148 * m + 1.707614701 * s;\n\n const rClamped = Math.min(255, Math.max(0, Math.round(linearToSrgb(r) * 255)));\n const gClamped = Math.min(255, Math.max(0, Math.round(linearToSrgb(g) * 255)));\n const bClamped = Math.min(255, Math.max(0, Math.round(linearToSrgb(b) * 255)));\n\n const toHex = (v: number) => v.toString(16).padStart(2, '0');\n return `#${toHex(rClamped)}${toHex(gClamped)}${toHex(bClamped)}`.toUpperCase();\n}\n\n/** Shift a color's lightness by `delta` (clamped 0–1). */\nexport function shiftLightness(hex: string, delta: number): string {\n const oklch = hexToOklch(hex);\n return oklchToHex({ ...oklch, l: Math.min(1.0, Math.max(0.0, oklch.l + delta)) });\n}\n\n/** Rotate a color's hue by `degrees`, keeping chroma and lightness. */\nexport function rotateHue(hex: string, degrees: number): string {\n const oklch = hexToOklch(hex);\n return oklchToHex({ ...oklch, h: (((oklch.h + degrees) % 360) + 360) % 360 });\n}\n\n/** Lightness stops for each scale step in OKLCH (0–1). */\nconst LIGHTNESS_STOPS: Record<keyof ColorScale, number> = {\n 50: 0.97,\n 100: 0.94,\n 200: 0.87,\n 300: 0.78,\n 400: 0.66,\n 500: 0.56,\n 600: 0.48,\n 700: 0.4,\n 800: 0.32,\n 900: 0.25,\n 950: 0.16,\n};\n\n/** Derive a full 50–950 color scale from a single brand hex. */\nexport function deriveScale(baseHex: string): ColorScale {\n const base = hexToOklch(baseHex);\n\n let nearest: keyof ColorScale = 500;\n let nearestDelta = Number.POSITIVE_INFINITY;\n for (const [step, stop] of Object.entries(LIGHTNESS_STOPS)) {\n const delta = Math.abs(stop - base.l);\n if (delta < nearestDelta) {\n nearestDelta = delta;\n nearest = Number(step) as keyof ColorScale;\n }\n }\n\n const scale = {} as ColorScale;\n for (const [step, stop] of Object.entries(LIGHTNESS_STOPS)) {\n const key = Number(step) as keyof ColorScale;\n if (key === nearest) {\n scale[key] = oklchToHex(base);\n } else {\n // Perceptually scale chroma using a sine taper so that extremes (50/950) don't clip/saturate unnaturally.\n const scaleChroma = base.c * Math.sin(Math.PI * stop);\n scale[key] = oklchToHex({ l: stop, c: scaleChroma, h: base.h });\n }\n }\n return scale;\n}\n","import { ColorScale, FontFamilies, SemanticColors, TypographyScale } from './types';\n\n/**\n * Cool blue-grey neutral scale. Light steps carry a subtle blue tint; the\n * darkest steps flatten toward a near-neutral charcoal so dark-mode\n * surfaces read like a soft, desaturated navy rather than a saturated one.\n */\nexport const DEFAULT_NEUTRAL: ColorScale = {\n 50: '#F1F4F7',\n 100: '#E4E9EE',\n 200: '#CCD3DB',\n 300: '#A4B0BC',\n 400: '#778593',\n 500: '#4E606F',\n 600: '#3A4650',\n 700: '#2A333B',\n 800: '#1F1F22',\n 900: '#18181A',\n 950: '#111112',\n};\n\nexport const DEFAULT_SEMANTIC: SemanticColors = {\n success: '#0D8626',\n warning: '#E9AF08',\n error: '#E3193B',\n info: '#2563EB',\n};\n\nexport const DEFAULT_FONT_FAMILY: FontFamilies = {\n sans: \"'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif\",\n mono: \"'Geist Mono', 'Geist Mono Fallback', monospace\",\n};\n\nexport const DEFAULT_TYPOGRAPHY: TypographyScale = {\n display: {\n large: { size: '3.5625rem', lineHeight: '4rem', weight: '700' },\n medium: { size: '2.8125rem', lineHeight: '3.25rem', weight: '700' },\n small: { size: '2.25rem', lineHeight: '2.75rem', weight: '700' },\n },\n headline: {\n large: { size: '2rem', lineHeight: '2.5rem', weight: '600' },\n medium: { size: '1.75rem', lineHeight: '2.25rem', weight: '600' },\n small: { size: '1.5rem', lineHeight: '2rem', weight: '600' },\n },\n title: {\n large: { size: '1.375rem', lineHeight: '1.75rem', weight: '600' },\n medium: { size: '1.125rem', lineHeight: '1.5rem', weight: '600' },\n small: { size: '1rem', lineHeight: '1.5rem', weight: '600' },\n },\n body: {\n large: { size: '1rem', lineHeight: '1.5rem', weight: '400' },\n medium: { size: '0.875rem', lineHeight: '1.25rem', weight: '400' },\n small: { size: '0.75rem', lineHeight: '1rem', weight: '400' },\n },\n label: {\n large: { size: '0.875rem', lineHeight: '1.25rem', weight: '500' },\n medium: { size: '0.75rem', lineHeight: '1rem', weight: '500' },\n small: { size: '0.6875rem', lineHeight: '1rem', weight: '500' },\n },\n};\n\n/**\n * Standard height for single-line text controls (input, select, number-input,\n * combobox, input-group, power-search, multi-select). All controls in the\n * family use this so they read as one consistent size.\n */\nexport const CONTROL_HEIGHT = '2.5rem';\n\n/**\n * Control-height ladder. `md` mirrors CONTROL_HEIGHT (the family default);\n * `sm`/`lg` give dense and comfortable variants the same rhythm.\n */\nexport const CONTROL_HEIGHTS: Record<string, string> = {\n sm: '2rem',\n md: CONTROL_HEIGHT,\n lg: '3rem',\n};\n\n/**\n * Opacity roles. Components must use these instead of ad-hoc literals so\n * disabled/muted content reads identically across the whole kit.\n */\nexport const OPACITY: Record<string, string> = {\n disabled: '0.5',\n muted: '0.7',\n faint: '0.4',\n};\n\n/** Icon sizing ladder — aligns glyph boxes with the text roles they sit next to. */\nexport const ICON_SIZE: Record<string, string> = {\n sm: '1rem',\n md: '1.25rem',\n lg: '1.5rem',\n};\n\n/** Letter-spacing roles: tight for display/headline, wide for overline/labels. */\nexport const TRACKING: Record<string, string> = {\n tight: '-0.02em',\n normal: '0',\n wide: '0.08em',\n};\n\n/** Font-weight tokens — standalone scale for direct use outside typography presets. */\nexport const FONT_WEIGHT: Record<string, string> = {\n regular: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n};\n\n/** Line-height tokens — unitless multipliers for flexible leading control. */\nexport const LEADING: Record<string, string> = {\n none: '1',\n tight: '1.25',\n normal: '1.5',\n relaxed: '1.625',\n};\n\nexport const SPACING: Record<string, string> = {\n '0': '0px',\n '0-5': '0.125rem',\n '1': '0.25rem',\n '1-5': '0.375rem',\n '2': '0.5rem',\n '3': '0.75rem',\n '4': '1rem',\n '5': '1.25rem',\n '6': '1.5rem',\n '8': '2rem',\n '10': '2.5rem',\n '12': '3rem',\n '16': '4rem',\n '20': '5rem',\n '24': '6rem',\n '32': '8rem',\n};\n\n/**\n * Radius scale: inner 4px, element 8px (buttons/inputs, the base),\n * container 12px (cards), then progressively larger through 28px \"page\"\n * rounding. Deliberately generous so surfaces read soft and rounded.\n */\nexport const RADIUS: Record<string, string> = {\n none: '0px',\n sm: '0.25rem', // 4px — inner (nested chips, checkboxes)\n md: '0.5rem', // 8px — element (buttons, inputs) — default base\n lg: '0.75rem', // 12px — container (cards, popovers)\n xl: '1rem', // 16px\n '2xl': '1.25rem', // 20px\n '3xl': '1.75rem', // 28px — page / hero surfaces\n full: '9999px',\n};\n\n/**\n * Soft, diffuse, layered shadows: a 1px hairline \"contact\" line keeps edges\n * crisp on white, a tight key shadow gives definition, and a wide low-alpha\n * ambient blur supplies the soft depth. Overlay CSS resolves these to\n * slightly stronger values in dark mode via the elevation tokens on each\n * surface.\n */\nexport const SHADOW: Record<string, string> = {\n sm: '0 0 0 1px rgb(0 0 0 / 0.03), 0 1px 1px rgb(0 0 0 / 0.07), 0 2px 8px rgb(0 0 0 / 0.07)',\n md: '0 0 0 1px rgb(0 0 0 / 0.03), 0 1px 2px rgb(0 0 0 / 0.09), 0 4px 16px rgb(0 0 0 / 0.09)',\n lg: '0 0 0 1px rgb(0 0 0 / 0.04), 0 2px 4px rgb(0 0 0 / 0.09), 0 10px 28px rgb(0 0 0 / 0.11)',\n xl: '0 0 0 1px rgb(0 0 0 / 0.04), 0 4px 8px rgb(0 0 0 / 0.1), 0 16px 40px rgb(0 0 0 / 0.15)',\n '2xl': '0 0 0 1px rgb(0 0 0 / 0.05), 0 8px 16px rgb(0 0 0 / 0.13), 0 28px 56px rgb(0 0 0 / 0.2)',\n};\n\n/**\n * Stacking ladder for overlay components. Anchored popups sit lowest;\n * tooltips always win. Components must use these instead of ad-hoc values\n * so overlays never fight each other.\n */\nexport const Z_INDEX: Record<string, string> = {\n dropdown: '1000',\n sticky: '1100',\n banner: '1200',\n overlay: '1300',\n modal: '1400',\n popover: '1500',\n toast: '1600',\n tooltip: '1700',\n};\n\nexport const DURATION: Record<string, string> = {\n instant: '0ms',\n fast: '100ms',\n normal: '200ms',\n slow: '300ms',\n slower: '500ms',\n};\n\nexport const EASING: Record<string, string> = {\n linear: 'linear',\n in: 'cubic-bezier(0.4, 0, 1, 1)',\n out: 'cubic-bezier(0, 0, 0.2, 1)',\n 'in-out': 'cubic-bezier(0.4, 0, 0.2, 1)',\n emphasized: 'cubic-bezier(0.2, 0, 0, 1)',\n};\n\n/** Safe-area inset defaults (fallback to CSS env() variables for iOS/Android/Ionic). */\nexport const SAFE_AREA = {\n top: 'env(safe-area-inset-top, 0px)',\n bottom: 'env(safe-area-inset-bottom, 0px)',\n left: 'env(safe-area-inset-left, 0px)',\n right: 'env(safe-area-inset-right, 0px)',\n};\n\n/** Minimum touch target size for mobile accessibility (Apple HIG & Android Material). */\nexport const TOUCH_TARGET_MIN = '44px';\n","import { deriveScale, rotateHue } from './color';\nimport {\n DEFAULT_FONT_FAMILY,\n DEFAULT_NEUTRAL,\n DEFAULT_SEMANTIC,\n DEFAULT_TYPOGRAPHY,\n DURATION,\n EASING,\n RADIUS,\n SHADOW,\n SPACING,\n Z_INDEX,\n} from './tokens';\nimport { ResolvedTheme, ThemeConfig } from './types';\n\n/**\n * Identity helper that gives `ngxsmk.config.ts` files full type inference:\n *\n * ```ts\n * import { defineConfig } from '@ngxsmk/theme';\n * export default defineConfig({ brand: { primary: '#7C3AED' } });\n * ```\n */\nexport function defineConfig(config: ThemeConfig): ThemeConfig {\n return config;\n}\n\n/** Merge a user config with defaults and derive all color scales. */\nexport function resolveTheme(config: ThemeConfig): ResolvedTheme {\n const secondaryBase = config.brand.secondary ?? rotateHue(config.brand.primary, 60);\n return {\n name: config.name ?? 'custom',\n brandBase: config.brand.primary,\n brand: config.brand.primaryScale ?? deriveScale(config.brand.primary),\n secondaryBase,\n secondary: config.brand.secondaryScale ?? deriveScale(secondaryBase),\n neutral: config.neutral ?? DEFAULT_NEUTRAL,\n semantic: { ...DEFAULT_SEMANTIC, ...config.semantic },\n fontFamily: { ...DEFAULT_FONT_FAMILY, ...config.typography?.fontFamily },\n typography: DEFAULT_TYPOGRAPHY,\n spacing: SPACING,\n radius: RADIUS,\n radiusBase: config.borderRadius ?? 'md',\n shadow: SHADOW,\n duration: DURATION,\n easing: EASING,\n zIndex: Z_INDEX,\n darkMode: {\n strategy: config.darkMode?.strategy ?? 'class',\n className: config.darkMode?.className ?? 'dark',\n },\n overrides: {\n light: config.overrides?.light ?? {},\n dark: config.overrides?.dark ?? {},\n },\n };\n}\n","import { deriveScale, rotateHue, shiftLightness } from './color';\nimport { resolveTheme } from './define-config';\nimport { ColorScale, ResolvedTheme, ThemeConfig, TypeRoleSize, TypeStyle } from './types';\nimport {\n CONTROL_HEIGHT,\n CONTROL_HEIGHTS,\n FONT_WEIGHT,\n ICON_SIZE,\n LEADING,\n OPACITY,\n TRACKING,\n} from './tokens';\n\ntype Vars = Record<string, string>;\n\nfunction scaleVars(prefix: string, scale: ColorScale): Vars {\n const vars: Vars = {};\n for (const [step, value] of Object.entries(scale)) {\n vars[`--ngxsmk-color-${prefix}-${step}`] = value;\n }\n return vars;\n}\n\n/** Default CSS custom properties for each component, emitted once in :root. */\nconst COMPONENT_TOKEN_DEFAULTS: Record<string, Vars> = {\n button: {\n '--ngxsmk-button-bg': 'var(--ngxsmk-color-primary)',\n '--ngxsmk-button-color': 'var(--ngxsmk-color-on-primary)',\n '--ngxsmk-button-font-family': 'var(--ngxsmk-font-sans)',\n '--ngxsmk-button-font-weight': '500',\n '--ngxsmk-button-radius': 'var(--ngxsmk-radius-base)',\n '--ngxsmk-button-disabled-opacity': '0.5',\n },\n card: {\n '--ngxsmk-card-bg': 'var(--ngxsmk-color-surface)',\n '--ngxsmk-card-radius': 'var(--ngxsmk-radius-xl)',\n '--ngxsmk-card-shadow': 'var(--ngxsmk-shadow-sm)',\n '--ngxsmk-card-border-color': 'var(--ngxsmk-color-outline)',\n },\n accordion: {\n '--ngxsmk-accordion-bg': 'var(--ngxsmk-color-surface)',\n '--ngxsmk-accordion-radius': 'var(--ngxsmk-radius-lg)',\n '--ngxsmk-accordion-border-color': 'var(--ngxsmk-color-outline)',\n },\n progress: {\n '--ngxsmk-progress-height': '0.5rem',\n '--ngxsmk-progress-bg': 'var(--ngxsmk-color-surface-variant)',\n '--ngxsmk-progress-color': 'var(--ngxsmk-color-primary)',\n '--ngxsmk-progress-radius': 'var(--ngxsmk-radius-full)',\n },\n switch: {\n '--ngxsmk-switch-width': '2.25rem',\n '--ngxsmk-switch-height': '1.25rem',\n '--ngxsmk-switch-radius': 'var(--ngxsmk-radius-full)',\n '--ngxsmk-switch-bg': 'var(--ngxsmk-color-outline-strong)',\n '--ngxsmk-switch-thumb-size': '0.875rem',\n '--ngxsmk-switch-thumb-bg': 'var(--ngxsmk-color-surface)',\n '--ngxsmk-switch-checked-bg': 'var(--ngxsmk-color-primary)',\n },\n spreadsheet: {\n '--ngxsmk-spreadsheet-bg': 'var(--ngxsmk-color-surface)',\n '--ngxsmk-spreadsheet-header-bg': 'var(--ngxsmk-color-surface-variant)',\n '--ngxsmk-spreadsheet-header-color': 'var(--ngxsmk-color-on-surface-variant)',\n '--ngxsmk-spreadsheet-border': 'var(--ngxsmk-color-outline)',\n '--ngxsmk-spreadsheet-grid-color': 'var(--ngxsmk-color-outline-variant)',\n '--ngxsmk-spreadsheet-hover-bg': 'var(--ngxsmk-color-surface-hover)',\n '--ngxsmk-spreadsheet-selected-bg':\n 'color-mix(in srgb, var(--ngxsmk-color-primary) 12%, transparent)',\n '--ngxsmk-spreadsheet-active-border': 'var(--ngxsmk-color-primary)',\n '--ngxsmk-spreadsheet-font': 'var(--ngxsmk-font-sans)',\n '--ngxsmk-spreadsheet-font-mono': 'var(--ngxsmk-font-mono)',\n '--ngxsmk-spreadsheet-row-height': '2.25rem',\n '--ngxsmk-spreadsheet-header-height': '2.5rem',\n '--ngxsmk-spreadsheet-cell-padding': '6px 10px',\n '--ngxsmk-spreadsheet-cell-font-size': 'var(--ngxsmk-text-body-sm-size)',\n '--ngxsmk-spreadsheet-scrollbar-size': '8px',\n '--ngxsmk-spreadsheet-shadow': 'var(--ngxsmk-shadow-sm)',\n '--ngxsmk-spreadsheet-radius': 'var(--ngxsmk-radius-lg)',\n '--ngxsmk-spreadsheet-edit-bg': 'var(--ngxsmk-color-surface)',\n '--ngxsmk-spreadsheet-edit-border': 'var(--ngxsmk-color-primary)',\n '--ngxsmk-spreadsheet-row-hover-bg': 'var(--ngxsmk-color-surface-hover)',\n '--ngxsmk-spreadsheet-col-hover-bg':\n 'color-mix(in srgb, var(--ngxsmk-color-primary) 6%, transparent)',\n '--ngxsmk-spreadsheet-frozen-shadow': '2px 0 4px rgba(0,0,0,0.08)',\n '--ngxsmk-spreadsheet-selection-range':\n 'color-mix(in srgb, var(--ngxsmk-color-primary) 8%, transparent)',\n },\n inputGroup: {\n '--ngxsmk-input-group-bg': 'var(--ngxsmk-color-surface)',\n '--ngxsmk-input-group-border': 'var(--ngxsmk-color-outline-strong)',\n '--ngxsmk-input-group-radius': 'var(--ngxsmk-radius-md)',\n '--ngxsmk-input-group-shadow': 'none',\n '--ngxsmk-input-group-focus-border': 'var(--ngxsmk-color-primary)',\n '--ngxsmk-input-group-focus-shadow':\n '0 0 0 3px color-mix(in srgb, var(--ngxsmk-color-primary) 15%, transparent)',\n '--ngxsmk-input-group-error-border': 'var(--ngxsmk-color-error)',\n '--ngxsmk-input-group-error-focus-shadow':\n '0 0 0 3px color-mix(in srgb, var(--ngxsmk-color-error) 15%, transparent)',\n '--ngxsmk-input-group-success-border': 'var(--ngxsmk-color-success)',\n '--ngxsmk-input-group-warning-border': 'var(--ngxsmk-color-warning)',\n '--ngxsmk-input-group-height': '2.5rem',\n '--ngxsmk-input-group-padding': '0.75rem',\n '--ngxsmk-input-group-gap': 'var(--ngxsmk-space-2)',\n '--ngxsmk-input-group-font': 'var(--ngxsmk-font-sans)',\n },\n};\n\n/** Tokens that do not change between light and dark mode. */\nfunction staticVars(theme: ResolvedTheme): Vars {\n const vars: Vars = {\n ...scaleVars('brand', theme.brand),\n ...scaleVars('secondary', theme.secondary),\n ...scaleVars('neutral', theme.neutral),\n '--ngxsmk-font-sans': theme.fontFamily.sans,\n '--ngxsmk-font-mono': theme.fontFamily.mono,\n '--ngxsmk-radius-base': theme.radius[theme.radiusBase],\n '--ngxsmk-control-height': CONTROL_HEIGHT,\n\n // Motion Tokens\n '--ngxsmk-motion-duration': 'var(--ngxsmk-duration-normal)',\n '--ngxsmk-motion-ease': 'var(--ngxsmk-ease-in-out)',\n\n // Interactive-state motion: shared lift/press transforms. Neutralized to\n // `none` under prefers-reduced-motion (see buildThemeCss).\n '--ngxsmk-hover-lift': 'translateY(-1px)',\n '--ngxsmk-press-scale': 'scale(0.98)',\n\n // Focus ring: THE focus indicator for every component. Aliases the\n // mode-aware --ngxsmk-shadow-focus; the error variant derives from the\n // semantic error role so invalid controls ring red in both modes.\n '--ngxsmk-focus-ring': 'var(--ngxsmk-shadow-focus)',\n '--ngxsmk-focus-ring-error':\n '0 0 0 2px color-mix(in srgb, var(--ngxsmk-color-error) 15%, transparent), ' +\n '0 0 0 4px color-mix(in srgb, var(--ngxsmk-color-error) 45%, transparent)',\n\n // Mobile viewport & safe-area tokens (iOS / Android / Ionic)\n '--ngxsmk-safe-area-top': 'env(safe-area-inset-top, 0px)',\n '--ngxsmk-safe-area-bottom': 'env(safe-area-inset-bottom, 0px)',\n '--ngxsmk-safe-area-left': 'env(safe-area-inset-left, 0px)',\n '--ngxsmk-safe-area-right': 'env(safe-area-inset-right, 0px)',\n '--ngxsmk-touch-target-min': '44px',\n\n // Component-specific token defaults\n ...Object.values(COMPONENT_TOKEN_DEFAULTS).reduce(\n (merged, tokens) => ({ ...merged, ...tokens }),\n {} as Vars,\n ),\n };\n\n for (const [key, value] of Object.entries(CONTROL_HEIGHTS)) {\n vars[`--ngxsmk-control-height-${key}`] = value;\n }\n for (const [key, value] of Object.entries(OPACITY)) {\n vars[`--ngxsmk-opacity-${key}`] = value;\n }\n for (const [key, value] of Object.entries(ICON_SIZE)) {\n vars[`--ngxsmk-icon-${key}`] = value;\n }\n for (const [key, value] of Object.entries(TRACKING)) {\n vars[`--ngxsmk-tracking-${key}`] = value;\n }\n for (const [key, value] of Object.entries(FONT_WEIGHT)) {\n vars[`--ngxsmk-font-weight-${key}`] = value;\n }\n for (const [key, value] of Object.entries(LEADING)) {\n vars[`--ngxsmk-leading-${key}`] = value;\n }\n for (const [key, value] of Object.entries(theme.spacing)) {\n vars[`--ngxsmk-space-${key}`] = value;\n }\n for (const [key, value] of Object.entries(theme.radius)) {\n vars[`--ngxsmk-radius-${key}`] = value;\n }\n for (const [key, value] of Object.entries(theme.shadow)) {\n vars[`--ngxsmk-shadow-${key}`] = value;\n }\n for (const [key, value] of Object.entries(theme.duration)) {\n vars[`--ngxsmk-duration-${key}`] = value;\n }\n for (const [key, value] of Object.entries(theme.easing)) {\n vars[`--ngxsmk-ease-${key}`] = value;\n }\n for (const [key, value] of Object.entries(theme.zIndex)) {\n vars[`--ngxsmk-z-${key}`] = value;\n }\n\n const sizes = { large: 'lg', medium: 'md', small: 'sm' } as const;\n for (const [role, styles] of Object.entries(theme.typography)) {\n for (const [size, suffix] of Object.entries(sizes)) {\n const style: TypeStyle = styles[size as TypeRoleSize];\n vars[`--ngxsmk-text-${role}-${suffix}-size`] = style.size;\n vars[`--ngxsmk-text-${role}-${suffix}-line`] = style.lineHeight;\n vars[`--ngxsmk-text-${role}-${suffix}-weight`] = style.weight;\n }\n }\n\n // Extra-small body text for dense metadata rows; below the smallest\n // TypeRoleSize so it is emitted outside the role loop.\n vars['--ngxsmk-text-body-xs-size'] = '0.6875rem';\n vars['--ngxsmk-text-body-xs-line'] = '1rem';\n vars['--ngxsmk-text-body-xs-weight'] = '400';\n\n return vars;\n}\n\n/** Semantic role tokens for light mode. */\nfunction lightVars(theme: ResolvedTheme): Vars {\n const vars: Vars = {\n 'color-scheme': 'light',\n\n '--ngxsmk-color-primary': theme.brandBase,\n '--ngxsmk-color-on-primary': '#FFFFFF',\n '--ngxsmk-color-primary-hover': shiftLightness(theme.brandBase, -8),\n '--ngxsmk-color-primary-active': shiftLightness(theme.brandBase, -14),\n '--ngxsmk-color-primary-container': theme.brand[100],\n '--ngxsmk-color-on-primary-container': theme.brand[900],\n\n '--ngxsmk-color-secondary': theme.secondaryBase,\n '--ngxsmk-color-on-secondary': '#FFFFFF',\n '--ngxsmk-color-secondary-hover': shiftLightness(theme.secondaryBase, -8),\n '--ngxsmk-color-secondary-active': shiftLightness(theme.secondaryBase, -14),\n '--ngxsmk-color-secondary-container': theme.secondary[100],\n '--ngxsmk-color-on-secondary-container': theme.secondary[900],\n\n // Default light theme: cool-grey body, white cards floating on top, hairline borders.\n '--ngxsmk-color-background': theme.neutral[50],\n '--ngxsmk-color-on-background': '#0A1317',\n '--ngxsmk-color-surface': '#FFFFFF',\n '--ngxsmk-color-on-surface': '#0A1317',\n '--ngxsmk-color-surface-variant': theme.neutral[100],\n '--ngxsmk-color-on-surface-variant': theme.neutral[500],\n '--ngxsmk-color-surface-muted': theme.neutral[50],\n '--ngxsmk-color-surface-elevated': '#FFFFFF',\n '--ngxsmk-color-surface-overlay': '#FFFFFF',\n '--ngxsmk-color-on-surface-muted': theme.neutral[400],\n '--ngxsmk-color-surface-hover': 'rgb(5 54 89 / 0.05)',\n '--ngxsmk-color-surface-active': 'rgb(5 54 89 / 0.1)',\n '--ngxsmk-color-surface-container': '#FFFFFF',\n '--ngxsmk-color-outline': 'rgb(5 54 89 / 0.1)',\n '--ngxsmk-color-outline-strong': theme.neutral[200],\n '--ngxsmk-color-outline-variant': 'rgb(5 54 89 / 0.06)',\n '--ngxsmk-color-outline-subtle': 'rgb(5 54 89 / 0.05)',\n\n // Elevation ladder\n '--ngxsmk-color-surface-1': '#FFFFFF',\n '--ngxsmk-color-surface-2': theme.neutral[50],\n '--ngxsmk-color-surface-3': theme.neutral[100],\n '--ngxsmk-color-surface-4': theme.neutral[200],\n '--ngxsmk-color-surface-5': theme.neutral[300],\n\n '--ngxsmk-color-ring': theme.brandBase,\n '--ngxsmk-color-backdrop': 'rgb(1 18 40 / 0.4)',\n '--ngxsmk-shadow-focus': `0 0 0 2px ${theme.brand[100]}, 0 0 0 4px color-mix(in srgb, ${theme.brandBase} 45%, transparent)`,\n\n // Categorical chart palette — a fixed 8-hue qualitative set (NOT derived\n // from the brand, so adjacent series stay distinguishable across themes),\n // stepped for the light surface. Validated for the light chart surface:\n // CVD worst-adjacent ΔE 24.2, chroma/lightness in-band. Charts read these\n // via getComputedStyle; consumers can override any slot to rebrand series.\n '--ngxsmk-chart-1': '#2A78D6',\n '--ngxsmk-chart-2': '#1BAF7A',\n '--ngxsmk-chart-3': '#EDA100',\n '--ngxsmk-chart-4': '#008300',\n '--ngxsmk-chart-5': '#4A3AA7',\n '--ngxsmk-chart-6': '#E34948',\n '--ngxsmk-chart-7': '#E87BA4',\n '--ngxsmk-chart-8': '#EB6834',\n };\n\n const tertiary = deriveScale(rotateHue(theme.brandBase, 64));\n vars['--ngxsmk-color-tertiary'] = tertiary[500];\n vars['--ngxsmk-color-on-tertiary'] = '#FFFFFF';\n vars['--ngxsmk-color-tertiary-container'] = tertiary[100];\n vars['--ngxsmk-color-on-tertiary-container'] = tertiary[900];\n\n for (const [name, hex] of Object.entries(theme.semantic)) {\n const scale = deriveScale(hex);\n vars[`--ngxsmk-color-${name}`] = hex;\n vars[`--ngxsmk-color-on-${name}`] = '#FFFFFF';\n vars[`--ngxsmk-color-${name}-container`] = scale[100];\n vars[`--ngxsmk-color-on-${name}-container`] = scale[800];\n }\n\n return { ...vars, ...theme.overrides.light };\n}\n\n/** Semantic role tokens for dark mode. */\nfunction darkVars(theme: ResolvedTheme): Vars {\n const vars: Vars = {\n 'color-scheme': 'dark',\n\n '--ngxsmk-color-primary': theme.brand[400],\n '--ngxsmk-color-on-primary': '#FFFFFF',\n '--ngxsmk-color-primary-hover': theme.brand[300],\n '--ngxsmk-color-primary-active': theme.brand[200],\n '--ngxsmk-color-primary-container': theme.brand[900],\n '--ngxsmk-color-on-primary-container': theme.brand[100],\n\n '--ngxsmk-color-secondary': theme.secondary[400],\n '--ngxsmk-color-on-secondary': '#FFFFFF',\n '--ngxsmk-color-secondary-hover': theme.secondary[300],\n '--ngxsmk-color-secondary-active': theme.secondary[200],\n '--ngxsmk-color-secondary-container': theme.secondary[900],\n '--ngxsmk-color-on-secondary-container': theme.secondary[100],\n\n // Default dark theme: near-neutral charcoal body, slightly lighter card,\n // lighter still for popovers; hairline light-on-dark borders.\n '--ngxsmk-color-background': '#111112',\n '--ngxsmk-color-on-background': '#DFE2E5',\n '--ngxsmk-color-surface': '#1F1F22',\n '--ngxsmk-color-on-surface': '#DFE2E5',\n '--ngxsmk-color-surface-variant': '#28292C',\n '--ngxsmk-color-on-surface-variant': '#AAAFB5',\n '--ngxsmk-color-surface-muted': '#141416',\n '--ngxsmk-color-surface-elevated': '#28292C',\n '--ngxsmk-color-surface-overlay': '#2F3136',\n '--ngxsmk-color-on-surface-muted': '#777C85',\n '--ngxsmk-color-surface-hover': 'rgb(255 255 255 / 0.05)',\n '--ngxsmk-color-surface-active': 'rgb(255 255 255 / 0.1)',\n '--ngxsmk-color-surface-container': '#28292C',\n '--ngxsmk-color-outline': 'rgb(242 244 246 / 0.1)',\n '--ngxsmk-color-outline-strong': '#494D53',\n '--ngxsmk-color-outline-variant': 'rgb(242 244 246 / 0.06)',\n '--ngxsmk-color-outline-subtle': 'rgb(242 244 246 / 0.05)',\n\n // Elevation ladder\n '--ngxsmk-color-surface-1': theme.neutral[800],\n '--ngxsmk-color-surface-2': theme.neutral[700],\n '--ngxsmk-color-surface-3': theme.neutral[600],\n '--ngxsmk-color-surface-4': theme.neutral[500],\n '--ngxsmk-color-surface-5': theme.neutral[400],\n\n '--ngxsmk-color-ring': theme.brand[400],\n '--ngxsmk-color-backdrop': 'rgb(17 17 18 / 0.6)',\n '--ngxsmk-shadow-focus': `0 0 0 2px color-mix(in srgb, ${theme.brand[400]} 25%, transparent), 0 0 0 4px color-mix(in srgb, ${theme.brand[400]} 45%, transparent)`,\n\n // Categorical chart palette — the same eight hues as light, re-stepped for\n // the dark surface (not a different palette). Validated for the dark chart\n // surface: all slots ≥ 3:1 contrast, CVD worst-adjacent ΔE 10.3 (floor band,\n // relies on the legend/labels charts already render for secondary encoding).\n '--ngxsmk-chart-1': '#3987E5',\n '--ngxsmk-chart-2': '#199E70',\n '--ngxsmk-chart-3': '#C98500',\n '--ngxsmk-chart-4': '#008300',\n '--ngxsmk-chart-5': '#9085E9',\n '--ngxsmk-chart-6': '#E66767',\n '--ngxsmk-chart-7': '#D55181',\n '--ngxsmk-chart-8': '#D95926',\n };\n\n const tertiary = deriveScale(rotateHue(theme.brandBase, 64));\n vars['--ngxsmk-color-tertiary'] = tertiary[400];\n vars['--ngxsmk-color-on-tertiary'] = tertiary[950];\n vars['--ngxsmk-color-tertiary-container'] = tertiary[900];\n vars['--ngxsmk-color-on-tertiary-container'] = tertiary[100];\n\n for (const [name, hex] of Object.entries(theme.semantic)) {\n const scale = deriveScale(hex);\n vars[`--ngxsmk-color-${name}`] = scale[400];\n vars[`--ngxsmk-color-on-${name}`] = scale[950];\n vars[`--ngxsmk-color-${name}-container`] = scale[950];\n vars[`--ngxsmk-color-on-${name}-container`] = scale[300];\n }\n\n return { ...vars, ...theme.overrides.dark };\n}\n\nfunction block(selector: string, vars: Vars, indent = ''): string {\n const lines = Object.entries(vars).map(([name, value]) => `${indent} ${name}: ${value};`);\n return `${indent}${selector} {\\n${lines.join('\\n')}\\n${indent}}`;\n}\n\n/**\n * Transform a theme config into a CSS stylesheet of `--ngxsmk-*` custom\n * properties. Emits static tokens plus light-mode roles on `:root`, and\n * dark-mode roles according to the configured dark-mode strategy.\n */\nexport function buildThemeCss(config: ThemeConfig | ResolvedTheme): string {\n const theme =\n 'brand' in config && 'spacing' in (config as object)\n ? (config as ResolvedTheme)\n : resolveTheme(config as ThemeConfig);\n\n const root = block(':root', { ...staticVars(theme), ...lightVars(theme) });\n const dark = darkVars(theme);\n\n let darkBlock: string;\n switch (theme.darkMode.strategy) {\n case 'media':\n darkBlock = `@media (prefers-color-scheme: dark) {\\n${block(':root', dark, ' ')}\\n}`;\n break;\n case 'system': {\n // `light-dark()` support is per-property; the class block still serves\n // as the override hook, so `system` behaves as media + class.\n const cn = theme.darkMode.className;\n darkBlock = [\n `@media (prefers-color-scheme: dark) {\\n${block(':root', dark, ' ')}\\n}`,\n block(`:root.${cn}, :root.${cn} body, .${cn}`, dark),\n ].join('\\n\\n');\n break;\n }\n default: {\n // `:root.<class>` (specificity 0,2,0) plus a `body` variant defend the\n // dark tokens against third-party stylesheets that redefine `--ngxsmk-*`\n // on a plain `:root` (0,1,0) — those would otherwise win by source order\n // when injected into <head> after this sheet. The bare `.<class>` keeps\n // scoped (non-root) dark regions working.\n const cn = theme.darkMode.className;\n darkBlock = block(`:root.${cn}, :root.${cn} body, .${cn}`, dark);\n }\n }\n\n // Zero every duration token (components animate with --ngxsmk-duration-*\n // directly) and neutralize the shared transforms so ALL token-driven motion\n // stops. `.ngxsmk-reduce-motion` offers the same as an app-level opt-in.\n const reducedVars: Vars = {\n '--ngxsmk-motion-duration': '0ms',\n '--ngxsmk-hover-lift': 'none',\n '--ngxsmk-press-scale': 'none',\n };\n for (const key of Object.keys(theme.duration)) {\n reducedVars[`--ngxsmk-duration-${key}`] = '0ms';\n }\n const reducedMotion = [\n `@media (prefers-reduced-motion: reduce) {\\n${block(':root', reducedVars, ' ')}\\n}`,\n block(':root.ngxsmk-reduce-motion, .ngxsmk-reduce-motion', reducedVars),\n ].join('\\n\\n');\n return `/* Generated by @ngxsmk/theme — do not edit by hand. */\\n${root}\\n\\n${darkBlock}\\n\\n${reducedMotion}\\n`;\n}\n","import { ThemeConfig } from './types';\n\n/** Retained alias so existing violet-themed demos keep working. */\nexport const violetPreset: ThemeConfig = {\n name: 'violet',\n brand: { primary: '#7C3AED' },\n};\n\n/** Monochrome preset in the spirit of shadcn/ui's default look. */\nexport const neutralPreset: ThemeConfig = {\n name: 'neutral',\n brand: {\n primary: '#18181B',\n // A neutral brand cannot be derived from lightness alone — pin the scale.\n primaryScale: {\n 50: '#FAFAFA',\n 100: '#F4F4F5',\n 200: '#E4E4E7',\n 300: '#D4D4D8',\n 400: '#A1A1AA',\n 500: '#71717A',\n 600: '#3F3F46',\n 700: '#27272A',\n 800: '#1F1F23',\n 900: '#18181B',\n 950: '#09090B',\n },\n },\n overrides: {\n // A near-black brand must invert in dark mode to stay visible.\n dark: {\n '--ngxsmk-color-primary': '#FAFAFA',\n '--ngxsmk-color-on-primary': '#18181B',\n '--ngxsmk-color-primary-hover': '#E4E4E7',\n '--ngxsmk-color-primary-active': '#D4D4D8',\n '--ngxsmk-color-ring': '#D4D4D8',\n },\n },\n};\n\n/**\n * Default preset: Emerald green. This preset generates the prebuilt\n * `ngxsmk.css` stylesheet shipped with @ngxsmk/theme.\n */\nexport const emeraldPreset: ThemeConfig = {\n name: 'emerald',\n brand: { primary: '#059669' },\n};\n\nexport const rosePreset: ThemeConfig = {\n name: 'rose',\n brand: { primary: '#E11D48' },\n};\n\nexport const presets: Record<string, ThemeConfig> = {\n violet: violetPreset,\n neutral: neutralPreset,\n emerald: emeraldPreset,\n rose: rosePreset,\n};\n","import { ResolvedTheme } from './types';\nimport { deriveScale, rotateHue } from './color';\n\n/**\n * A token output adapter transforms a `ResolvedTheme` into platform-specific\n * CSS custom properties. The default `cssVarsAdapter` emits `--ngxsmk-*`\n * variables; the `ionicVarsAdapter` emits `--ion-*` variables that Ionic\n * components consume.\n */\nexport interface TokenOutputAdapter {\n /** Unique name for this adapter (e.g. 'ngxsmk', 'ionic'). */\n readonly name: string;\n /** Transform a resolved theme into platform-specific CSS variables. */\n vars(theme: ResolvedTheme, options?: { isDark?: boolean }): Record<string, string>;\n /** Transform a resolved theme into dark-mode platform CSS variables. */\n darkVars?(theme: ResolvedTheme): Record<string, string>;\n}\n\n/**\n * Maps NGXSMK semantic color roles to Ionic 7 & 8 color variable specifications.\n *\n * Emits full color suites (base, rgb, contrast, contrast-rgb, shade, tint),\n * 19-step contrast ladder (--ion-color-step-50..950), safe area mappings, and\n * surface variables for seamless Ionic framework interoperability.\n */\nexport const ionicVarsAdapter: TokenOutputAdapter = {\n name: 'ionic',\n\n vars(theme: ResolvedTheme, options?: { isDark?: boolean }): Record<string, string> {\n if (options?.isDark) {\n return this.darkVars ? this.darkVars(theme) : buildLightVars(theme);\n }\n return buildLightVars(theme);\n },\n\n darkVars(theme: ResolvedTheme): Record<string, string> {\n return buildDarkVars(theme);\n },\n};\n\nfunction buildColorSuite(prefix: string, baseHex: string, vars: Record<string, string>): void {\n const contrastHex = getContrastHex(baseHex);\n vars[`--ion-color-${prefix}`] = baseHex;\n vars[`--ion-color-${prefix}-rgb`] = hexToRgbStr(baseHex);\n vars[`--ion-color-${prefix}-contrast`] = contrastHex;\n vars[`--ion-color-${prefix}-contrast-rgb`] = hexToRgbStr(contrastHex);\n vars[`--ion-color-${prefix}-shade`] = shiftLightnessHex(baseHex, -12);\n vars[`--ion-color-${prefix}-tint`] = shiftLightnessHex(baseHex, 10);\n}\n\nfunction buildLightVars(theme: ResolvedTheme): Record<string, string> {\n const vars: Record<string, string> = {};\n\n // Primary & Secondary\n buildColorSuite('primary', theme.brandBase, vars);\n buildColorSuite('secondary', theme.secondaryBase, vars);\n\n // Tertiary (derived from brand hue + 64)\n const tertiary = deriveScale(rotateHue(theme.brandBase, 64));\n buildColorSuite('tertiary', tertiary[500], vars);\n\n // Status & Feedback colors\n const successHex = theme.semantic['success'] ?? '#0D8626';\n const warningHex = theme.semantic['warning'] ?? '#E9AF08';\n const dangerHex = theme.semantic['error'] ?? '#E3193B';\n const infoHex = theme.semantic['info'] ?? '#2563EB';\n\n buildColorSuite('success', successHex, vars);\n buildColorSuite('warning', warningHex, vars);\n buildColorSuite('danger', dangerHex, vars);\n buildColorSuite('info', infoHex, vars);\n\n // Medium / Light / Dark baseline scales\n buildColorSuite('light', theme.neutral[100] ?? '#F1F4F7', vars);\n buildColorSuite('medium', theme.neutral[500] ?? '#778593', vars);\n buildColorSuite('dark', theme.neutral[900] ?? '#18181A', vars);\n\n // Background / Surfaces\n const bgHex = theme.neutral[50] ?? '#FFFFFF';\n const textHex = '#0A1317';\n vars['--ion-background-color'] = bgHex;\n vars['--ion-background-color-rgb'] = hexToRgbStr(bgHex);\n vars['--ion-text-color'] = textHex;\n vars['--ion-text-color-rgb'] = hexToRgbStr(textHex);\n\n vars['--ion-card-background'] = '#FFFFFF';\n vars['--ion-item-background'] = '#FFFFFF';\n vars['--ion-item-color'] = textHex;\n vars['--ion-toolbar-background'] = bgHex;\n vars['--ion-toolbar-color'] = textHex;\n vars['--ion-tab-bar-background'] = '#FFFFFF';\n vars['--ion-border-color'] = theme.neutral[200] ?? '#CCD3DB';\n\n // Typography & Radius\n vars['--ion-font-family'] = theme.fontFamily.sans;\n vars['--ion-border-radius'] = theme.radius[theme.radiusBase];\n\n // Stepped colors for light mode (interpolated between bg and text)\n interpolateSteppedColors(bgHex, textHex, vars);\n\n // Safe area insets\n vars['--ion-safe-area-top'] = 'var(--ngxsmk-safe-area-top, env(safe-area-inset-top, 0px))';\n vars['--ion-safe-area-bottom'] =\n 'var(--ngxsmk-safe-area-bottom, env(safe-area-inset-bottom, 0px))';\n vars['--ion-safe-area-left'] = 'var(--ngxsmk-safe-area-left, env(safe-area-inset-left, 0px))';\n vars['--ion-safe-area-right'] = 'var(--ngxsmk-safe-area-right, env(safe-area-inset-right, 0px))';\n\n return vars;\n}\n\nfunction buildDarkVars(theme: ResolvedTheme): Record<string, string> {\n const vars: Record<string, string> = {};\n\n // Primary & Secondary dark adjustments\n const primaryDark = theme.brand[400] ?? theme.brandBase;\n const secondaryDark = theme.secondary[400] ?? theme.secondaryBase;\n\n buildColorSuite('primary', primaryDark, vars);\n buildColorSuite('secondary', secondaryDark, vars);\n\n // Tertiary\n const tertiary = deriveScale(rotateHue(theme.brandBase, 64));\n buildColorSuite('tertiary', tertiary[400] ?? tertiary[500], vars);\n\n // Status & Feedback\n buildColorSuite('success', shiftLightnessHex(theme.semantic['success'] ?? '#0D8626', 10), vars);\n buildColorSuite('warning', shiftLightnessHex(theme.semantic['warning'] ?? '#E9AF08', 8), vars);\n buildColorSuite('danger', shiftLightnessHex(theme.semantic['error'] ?? '#E3193B', 10), vars);\n buildColorSuite('info', shiftLightnessHex(theme.semantic['info'] ?? '#2563EB', 10), vars);\n\n buildColorSuite('light', theme.neutral[800] ?? '#1F1F22', vars);\n buildColorSuite('medium', theme.neutral[400] ?? '#778593', vars);\n buildColorSuite('dark', theme.neutral[100] ?? '#F1F4F7', vars);\n\n // Dark backgrounds & surfaces\n const darkBgHex = '#111112';\n const darkTextHex = '#DFE2E5';\n const darkSurface = '#1F1F22';\n\n vars['--ion-background-color'] = darkBgHex;\n vars['--ion-background-color-rgb'] = hexToRgbStr(darkBgHex);\n vars['--ion-text-color'] = darkTextHex;\n vars['--ion-text-color-rgb'] = hexToRgbStr(darkTextHex);\n\n vars['--ion-card-background'] = darkSurface;\n vars['--ion-item-background'] = darkSurface;\n vars['--ion-item-color'] = darkTextHex;\n vars['--ion-toolbar-background'] = '#18181A';\n vars['--ion-toolbar-color'] = darkTextHex;\n vars['--ion-tab-bar-background'] = '#18181A';\n vars['--ion-border-color'] = 'rgba(242, 244, 246, 0.1)';\n\n // Typography & Radius\n vars['--ion-font-family'] = theme.fontFamily.sans;\n vars['--ion-border-radius'] = theme.radius[theme.radiusBase];\n\n // Stepped colors for dark mode\n interpolateSteppedColors(darkBgHex, darkTextHex, vars);\n\n // Safe area insets\n vars['--ion-safe-area-top'] = 'var(--ngxsmk-safe-area-top, env(safe-area-inset-top, 0px))';\n vars['--ion-safe-area-bottom'] =\n 'var(--ngxsmk-safe-area-bottom, env(safe-area-inset-bottom, 0px))';\n vars['--ion-safe-area-left'] = 'var(--ngxsmk-safe-area-left, env(safe-area-inset-left, 0px))';\n vars['--ion-safe-area-right'] = 'var(--ngxsmk-safe-area-right, env(safe-area-inset-right, 0px))';\n\n return vars;\n}\n\n/** Default NGXSMK adapter — emits `--ngxsmk-*` variables. */\nexport const cssVarsAdapter: TokenOutputAdapter = {\n name: 'ngxsmk',\n vars: () => ({}), // Not used directly — buildThemeCss handles this\n};\n\n// ─── Helpers ──────────────────────────────────────────────\n\nfunction hexToRgbStr(hex: string): string {\n const clean = hex.replace('#', '');\n const r = parseInt(clean.substring(0, 2), 16) || 0;\n const g = parseInt(clean.substring(2, 4), 16) || 0;\n const b = parseInt(clean.substring(4, 6), 16) || 0;\n return `${r}, ${g}, ${b}`;\n}\n\nfunction getContrastHex(hex: string): string {\n const clean = hex.replace('#', '');\n const r = parseInt(clean.substring(0, 2), 16) || 0;\n const g = parseInt(clean.substring(2, 4), 16) || 0;\n const b = parseInt(clean.substring(4, 6), 16) || 0;\n // Standard WCAG relative luminance approximation\n const yiq = (r * 299 + g * 587 + b * 114) / 1000;\n return yiq >= 150 ? '#000000' : '#FFFFFF';\n}\n\nfunction shiftLightnessHex(hex: string, amount: number): string {\n const clean = hex.replace('#', '');\n let r = parseInt(clean.substring(0, 2), 16) || 0;\n let g = parseInt(clean.substring(2, 4), 16) || 0;\n let b = parseInt(clean.substring(4, 6), 16) || 0;\n\n if (amount > 0) {\n r = Math.min(255, r + Math.round((255 - r) * (amount / 100)));\n g = Math.min(255, g + Math.round((255 - g) * (amount / 100)));\n b = Math.min(255, b + Math.round((255 - b) * (amount / 100)));\n } else {\n const factor = 1 + amount / 100;\n r = Math.max(0, Math.round(r * factor));\n g = Math.max(0, Math.round(g * factor));\n b = Math.max(0, Math.round(b * factor));\n }\n\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`.toUpperCase();\n}\n\nfunction interpolateSteppedColors(\n bgHex: string,\n textHex: string,\n vars: Record<string, string>,\n): void {\n const cleanBg = bgHex.replace('#', '');\n const cleanText = textHex.replace('#', '');\n\n const bgR = parseInt(cleanBg.substring(0, 2), 16) || 0;\n const bgG = parseInt(cleanBg.substring(2, 4), 16) || 0;\n const bgB = parseInt(cleanBg.substring(4, 6), 16) || 0;\n\n const textR = parseInt(cleanText.substring(0, 2), 16) || 0;\n const textG = parseInt(cleanText.substring(2, 4), 16) || 0;\n const textB = parseInt(cleanText.substring(4, 6), 16) || 0;\n\n const steps = [\n 50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, 900, 950,\n ];\n\n for (const step of steps) {\n const weight = step / 1000;\n const r = Math.round(bgR * (1 - weight) + textR * weight);\n const g = Math.round(bgG * (1 - weight) + textG * weight);\n const b = Math.round(bgB * (1 - weight) + textB * weight);\n const hex =\n `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`.toUpperCase();\n vars[`--ion-color-step-${step}`] = hex;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Injectable, inject } from '@angular/core';\nimport { buildThemeCss } from './css';\nimport { resolveTheme } from './define-config';\nimport { TokenOutputAdapter, ionicVarsAdapter } from './token-adapter';\nimport { ThemeConfig } from './types';\n\nconst STYLE_ID = 'ngxsmk-theme';\nconst IONIC_STYLE_ID = 'ngxsmk-ionic-theme';\n\n/**\n * Injects generated theme CSS into the document at runtime.\n *\n * Decoupled from dark-mode switching so consumers who only need\n * token injection (e.g. the CLI theme-preview) don't pull in\n * class-toggle / localStorage / matchMedia logic.\n *\n * SSR-safe: all DOM access goes through the injected document.\n */\n@Injectable({ providedIn: 'root' })\nexport class NgxThemeInjectorService {\n private readonly document = inject(DOCUMENT) as Document;\n\n /**\n * Apply a theme at runtime. Generates token CSS from the config and swaps\n * it into a dedicated `<style>` element, overriding the build-time theme.\n *\n * @param adapter Optional output adapter. Defaults to the standard NGXSMK\n * `--ngxsmk-*` CSS variables. Pass `ionicVarsAdapter` to also generate\n * `--ion-*` variables for Ionic components.\n */\n applyTheme(config: ThemeConfig, adapter?: TokenOutputAdapter): void {\n const head = this.document.head;\n let style = this.document.getElementById(STYLE_ID) as HTMLStyleElement | null;\n if (!style) {\n style = this.document.createElement('style');\n style.id = STYLE_ID;\n head?.appendChild(style);\n }\n\n let css = buildThemeCss(config);\n\n if (adapter) {\n const resolved = resolveTheme(config);\n const platformVars = adapter.vars(resolved);\n css += '\\n' + this.buildAdapterCss(adapter.name, platformVars);\n }\n\n if (style) {\n style.textContent = css;\n }\n }\n\n /**\n * Apply Ionic-specific token variables alongside the standard NGXSMK theme.\n * Generates `--ion-*` variables derived from the same `ThemeConfig`.\n */\n applyIonicTheme(config: ThemeConfig): void {\n const head = this.document.head;\n let style = this.document.getElementById(IONIC_STYLE_ID) as HTMLStyleElement | null;\n if (!style) {\n style = this.document.createElement('style');\n style.id = IONIC_STYLE_ID;\n head?.appendChild(style);\n }\n\n const resolved = resolveTheme(config);\n const lightVars = ionicVarsAdapter.vars(resolved);\n const darkVars = ionicVarsAdapter.darkVars ? ionicVarsAdapter.darkVars(resolved) : undefined;\n if (style) {\n style.textContent = this.buildAdapterCss('ionic', lightVars, darkVars);\n }\n }\n\n /** Remove a runtime-applied theme, falling back to the build-time CSS. */\n clearTheme(): void {\n this.document.getElementById(STYLE_ID)?.remove();\n }\n\n /** Remove the Ionic adapter stylesheet. */\n clearIonicTheme(): void {\n this.document.getElementById(IONIC_STYLE_ID)?.remove();\n }\n\n private buildAdapterCss(\n adapterName: string,\n vars: Record<string, string>,\n darkVars?: Record<string, string>,\n ): string {\n const lines = Object.entries(vars).map(([k, v]) => ` ${k}: ${v};`);\n let result = `/* @ngxsmk/theme — ${adapterName} adapter */\\n:root {\\n${lines.join('\\n')}\\n}`;\n if (darkVars && Object.keys(darkVars).length > 0) {\n const darkLines = Object.entries(darkVars).map(([k, v]) => ` ${k}: ${v};`);\n result += `\\n\\n:root.dark, body.dark, html.dark, [data-theme=\"dark\"] {\\n${darkLines.join('\\n')}\\n}`;\n result += `\\n\\n@media (prefers-color-scheme: dark) {\\n :root:not(.light) {\\n ${darkLines.join('\\n ')}\\n }\\n}`;\n }\n return result;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Injectable, computed, effect, inject, signal } from '@angular/core';\nimport { NgxThemeInjectorService } from './theme-injector.service';\nimport { TokenOutputAdapter } from './token-adapter';\nimport { ThemeConfig } from './types';\n\nexport type ThemeMode = 'light' | 'dark' | 'system';\n\nconst STORAGE_KEY = 'ngxsmk-theme-mode';\n\n/**\n * Runtime theme control: dark-mode switching (class strategy) and dynamic\n * theme application by injecting generated token CSS into the document.\n *\n * CSS injection is delegated to {@link NgxThemeInjectorService} for\n * consumers who only need token injection without dark-mode logic.\n *\n * SSR-safe: all DOM access goes through the injected document and degrades\n * gracefully when `window`/`matchMedia` are unavailable.\n */\n@Injectable({ providedIn: 'root' })\nexport class NgxsmkThemeService {\n private readonly document: Document;\n private readonly injector = inject(NgxThemeInjectorService);\n\n /** User preference: explicit light/dark or follow the OS. */\n readonly mode: ReturnType<typeof signal<ThemeMode>>;\n\n private readonly systemDark: ReturnType<typeof signal<boolean>>;\n\n /** Effective darkness after resolving `system` against the OS setting. */\n readonly isDark: ReturnType<typeof computed<boolean>>;\n\n constructor() {\n this.document = inject(DOCUMENT);\n\n this.mode = signal<ThemeMode>(this.restoreMode());\n this.systemDark = signal(this.matchSystemDark());\n this.isDark = computed(() =>\n this.mode() === 'system' ? this.systemDark() : this.mode() === 'dark',\n );\n\n const media = this.document.defaultView?.matchMedia?.('(prefers-color-scheme: dark)');\n media?.addEventListener('change', (e) => this.systemDark.set(e.matches));\n\n effect(() => {\n this.document.documentElement.classList.toggle('dark', this.isDark());\n });\n }\n\n setMode(mode: ThemeMode): void {\n this.mode.set(mode);\n try {\n this.document.defaultView?.localStorage?.setItem(STORAGE_KEY, mode);\n } catch {\n // Storage unavailable (SSR, privacy mode) — preference is session-only.\n }\n }\n\n toggle(): void {\n this.setMode(this.isDark() ? 'light' : 'dark');\n }\n\n /** @see NgxThemeInjectorService.applyTheme */\n applyTheme(config: ThemeConfig, adapter?: TokenOutputAdapter): void {\n this.injector.applyTheme(config, adapter);\n }\n\n /** @see NgxThemeInjectorService.applyIonicTheme */\n applyIonicTheme(config: ThemeConfig): void {\n this.injector.applyIonicTheme(config);\n }\n\n /** @see NgxThemeInjectorService.clearTheme */\n clearTheme(): void {\n this.injector.clearTheme();\n }\n\n /** @see NgxThemeInjectorService.clearIonicTheme */\n clearIonicTheme(): void {\n this.injector.clearIonicTheme();\n }\n\n private restoreMode(): ThemeMode {\n try {\n const stored = this.document.defaultView?.localStorage?.getItem(STORAGE_KEY);\n if (stored === 'light' || stored === 'dark' || stored === 'system') {\n return stored;\n }\n } catch {\n // Fall through to default.\n }\n return 'system';\n }\n\n private matchSystemDark(): boolean {\n return this.document.defaultView?.matchMedia?.('(prefers-color-scheme: dark)').matches ?? false;\n }\n}\n","import {\n ENVIRONMENT_INITIALIZER,\n EnvironmentProviders,\n inject,\n makeEnvironmentProviders,\n} from '@angular/core';\nimport { NgxsmkThemeService } from './theme.service';\nimport { violetPreset } from './presets';\nimport { ThemeConfig } from './types';\n\n/**\n * Standalone provider for Angular 18-22+ applications that automatically\n * synchronizes NGXSMK design tokens with Ionic 7/8 CSS variables on startup.\n *\n * @example\n * ```ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideIonicAngular(),\n * provideNgxsmkIonicTheme(),\n * ]\n * };\n * ```\n */\nexport function provideNgxsmkIonicTheme(config?: ThemeConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useValue: () => {\n const theme = inject(NgxsmkThemeService);\n theme.applyIonicTheme(config ?? violetPreset);\n },\n },\n ]);\n}\n","/*\n * Public API Surface of @ngxsmk/theme\n */\n\nexport * from './lib/types';\nexport * from './lib/color';\nexport * from './lib/tokens';\nexport * from './lib/define-config';\nexport * from './lib/css';\nexport * from './lib/presets';\nexport * from './lib/theme.service';\nexport * from './lib/theme-injector.service';\nexport * from './lib/token-adapter';\nexport * from './lib/ionic-provider';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/lib/css.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../../../../packages/theme/src/lib/css.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,aAAa,EAAE,WAAW,EAA2B,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../../../../packages/theme/src/lib/css.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,aAAa,EAAE,WAAW,EAA2B,MAAM,SAAS,CAAC;AAkX1F;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,aAAa,GAAG,MAAM,CAmDzE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { EnvironmentProviders } from '@angular/core';
|
|
2
|
+
import { ThemeConfig } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Standalone provider for Angular 18-22+ applications that automatically
|
|
5
|
+
* synchronizes NGXSMK design tokens with Ionic 7/8 CSS variables on startup.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* export const appConfig: ApplicationConfig = {
|
|
10
|
+
* providers: [
|
|
11
|
+
* provideIonicAngular(),
|
|
12
|
+
* provideNgxsmkIonicTheme(),
|
|
13
|
+
* ]
|
|
14
|
+
* };
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare function provideNgxsmkIonicTheme(config?: ThemeConfig): EnvironmentProviders;
|
|
18
|
+
//# sourceMappingURL=ionic-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ionic-provider.d.ts","sourceRoot":"","sources":["../../../../packages/theme/src/lib/ionic-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,oBAAoB,EAGrB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,oBAAoB,CAWlF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme-injector.service.d.ts","sourceRoot":"","sources":["../../../../packages/theme/src/lib/theme-injector.service.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAoB,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;;AAKtC;;;;;;;;GAQG;AACH,qBACa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,
|
|
1
|
+
{"version":3,"file":"theme-injector.service.d.ts","sourceRoot":"","sources":["../../../../packages/theme/src/lib/theme-injector.service.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAoB,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;;AAKtC;;;;;;;;GAQG;AACH,qBACa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgC;IAEzD;;;;;;;OAOG;IACH,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,IAAI;IAsBnE;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAiB1C,0EAA0E;IAC1E,UAAU,IAAI,IAAI;IAIlB,2CAA2C;IAC3C,eAAe,IAAI,IAAI;IAIvB,OAAO,CAAC,eAAe;yCAhEZ,uBAAuB;6CAAvB,uBAAuB;CA8EnC"}
|
package/lib/token-adapter.d.ts
CHANGED
|
@@ -9,16 +9,18 @@ export interface TokenOutputAdapter {
|
|
|
9
9
|
/** Unique name for this adapter (e.g. 'ngxsmk', 'ionic'). */
|
|
10
10
|
readonly name: string;
|
|
11
11
|
/** Transform a resolved theme into platform-specific CSS variables. */
|
|
12
|
-
vars(theme: ResolvedTheme
|
|
12
|
+
vars(theme: ResolvedTheme, options?: {
|
|
13
|
+
isDark?: boolean;
|
|
14
|
+
}): Record<string, string>;
|
|
15
|
+
/** Transform a resolved theme into dark-mode platform CSS variables. */
|
|
16
|
+
darkVars?(theme: ResolvedTheme): Record<string, string>;
|
|
13
17
|
}
|
|
14
18
|
/**
|
|
15
|
-
* Maps NGXSMK semantic color roles to Ionic
|
|
19
|
+
* Maps NGXSMK semantic color roles to Ionic 7 & 8 color variable specifications.
|
|
16
20
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* This adapter produces the subset Ionic needs for theming.
|
|
21
|
+
* Emits full color suites (base, rgb, contrast, contrast-rgb, shade, tint),
|
|
22
|
+
* 19-step contrast ladder (--ion-color-step-50..950), safe area mappings, and
|
|
23
|
+
* surface variables for seamless Ionic framework interoperability.
|
|
22
24
|
*/
|
|
23
25
|
export declare const ionicVarsAdapter: TokenOutputAdapter;
|
|
24
26
|
/** Default NGXSMK adapter — emits `--ngxsmk-*` variables. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-adapter.d.ts","sourceRoot":"","sources":["../../../../packages/theme/src/lib/token-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGxC;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,6DAA6D;IAC7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"token-adapter.d.ts","sourceRoot":"","sources":["../../../../packages/theme/src/lib/token-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGxC;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,6DAA6D;IAC7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnF,wEAAwE;IACxE,QAAQ,CAAC,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzD;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,kBAa9B,CAAC;AAmIF,6DAA6D;AAC7D,eAAO,MAAM,cAAc,EAAE,kBAG5B,CAAC"}
|
package/lib/tokens.d.ts
CHANGED
|
@@ -55,4 +55,13 @@ export declare const SHADOW: Record<string, string>;
|
|
|
55
55
|
export declare const Z_INDEX: Record<string, string>;
|
|
56
56
|
export declare const DURATION: Record<string, string>;
|
|
57
57
|
export declare const EASING: Record<string, string>;
|
|
58
|
+
/** Safe-area inset defaults (fallback to CSS env() variables for iOS/Android/Ionic). */
|
|
59
|
+
export declare const SAFE_AREA: {
|
|
60
|
+
top: string;
|
|
61
|
+
bottom: string;
|
|
62
|
+
left: string;
|
|
63
|
+
right: string;
|
|
64
|
+
};
|
|
65
|
+
/** Minimum touch target size for mobile accessibility (Apple HIG & Android Material). */
|
|
66
|
+
export declare const TOUCH_TARGET_MIN = "44px";
|
|
58
67
|
//# sourceMappingURL=tokens.d.ts.map
|
package/lib/tokens.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../../packages/theme/src/lib/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAEpF;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,UAY7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,cAK9B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,YAGjC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,eA0BhC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,WAAW,CAAC;AAEvC;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIlD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAI1C,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAI5C,CAAC;AAEF,kFAAkF;AAClF,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAI3C,CAAC;AAEF,uFAAuF;AACvF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAK9C,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAK1C,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiB1C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CASzC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMzC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAS1C,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAM3C,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMzC,CAAC"}
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../../packages/theme/src/lib/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAEpF;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,UAY7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,cAK9B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,YAGjC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,eA0BhC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,WAAW,CAAC;AAEvC;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIlD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAI1C,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAI5C,CAAC;AAEF,kFAAkF;AAClF,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAI3C,CAAC;AAEF,uFAAuF;AACvF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAK9C,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAK1C,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiB1C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CASzC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMzC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAS1C,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAM3C,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMzC,CAAC;AAEF,wFAAwF;AACxF,eAAO,MAAM,SAAS;;;;;CAKrB,CAAC;AAEF,yFAAyF;AACzF,eAAO,MAAM,gBAAgB,SAAS,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ngxsmk/theme",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "Runtime theming and design-token engine for @ngxsmk/core with light/dark modes and preset palettes.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"angular",
|
|
@@ -25,11 +25,15 @@
|
|
|
25
25
|
},
|
|
26
26
|
"peerDependencies": {
|
|
27
27
|
"@angular/common": ">=17.3.0",
|
|
28
|
-
"@angular/core": ">=17.3.0"
|
|
28
|
+
"@angular/core": ">=17.3.0",
|
|
29
|
+
"@ionic/angular": ">=7.0.0 || >=8.0.0"
|
|
29
30
|
},
|
|
30
31
|
"peerDependenciesMeta": {
|
|
31
32
|
"tailwindcss": {
|
|
32
33
|
"optional": true
|
|
34
|
+
},
|
|
35
|
+
"@ionic/angular": {
|
|
36
|
+
"optional": true
|
|
33
37
|
}
|
|
34
38
|
},
|
|
35
39
|
"dependencies": {
|
package/public-api.d.ts
CHANGED
package/public-api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../../../packages/theme/src/public-api.ts"],"names":[],"mappings":"AAIA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../../../packages/theme/src/public-api.ts"],"names":[],"mappings":"AAIA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC"}
|