@ngxsmk/theme 1.2.0 → 1.3.1
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 +50 -12
- package/esm2022/lib/css.mjs +41 -5
- package/esm2022/lib/presets.mjs +5 -26
- package/esm2022/lib/tokens.mjs +47 -16
- package/fesm2022/ngxsmk-theme.mjs +90 -44
- package/fesm2022/ngxsmk-theme.mjs.map +1 -1
- package/lib/css.d.ts.map +1 -1
- package/lib/presets.d.ts +4 -6
- package/lib/presets.d.ts.map +1 -1
- package/lib/tokens.d.ts +24 -9
- package/lib/tokens.d.ts.map +1 -1
- package/package.json +11 -1
- package/styles/ngxsmk.css +162 -132
- package/styles/ngxsmk.emerald.css +156 -126
- package/styles/ngxsmk.neutral.css +155 -125
- package/styles/ngxsmk.rose.css +160 -130
- package/styles/ngxsmk.violet.css +162 -132
- package/styles/ngx.css +0 -212
- package/styles/ngxsmk.astryx.css +0 -280
|
@@ -126,10 +126,9 @@ function deriveScale(baseHex) {
|
|
|
126
126
|
}
|
|
127
127
|
|
|
128
128
|
/**
|
|
129
|
-
* Cool blue-grey neutral scale
|
|
130
|
-
*
|
|
131
|
-
* a
|
|
132
|
-
* (#111112 body / #1F1F22 card) rather than a saturated navy.
|
|
129
|
+
* Cool blue-grey neutral scale. Light steps carry a subtle blue tint; the
|
|
130
|
+
* darkest steps flatten toward a near-neutral charcoal so dark-mode
|
|
131
|
+
* surfaces read like a soft, desaturated navy rather than a saturated one.
|
|
133
132
|
*/
|
|
134
133
|
const DEFAULT_NEUTRAL = {
|
|
135
134
|
50: '#F1F4F7',
|
|
@@ -148,7 +147,7 @@ const DEFAULT_SEMANTIC = {
|
|
|
148
147
|
success: '#0D8626',
|
|
149
148
|
warning: '#E9AF08',
|
|
150
149
|
error: '#E3193B',
|
|
151
|
-
info: '#
|
|
150
|
+
info: '#2563EB',
|
|
152
151
|
};
|
|
153
152
|
const DEFAULT_FONT_FAMILY = {
|
|
154
153
|
sans: "'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif",
|
|
@@ -187,6 +186,36 @@ const DEFAULT_TYPOGRAPHY = {
|
|
|
187
186
|
* family use this so they read as one consistent size.
|
|
188
187
|
*/
|
|
189
188
|
const CONTROL_HEIGHT = '2.5rem';
|
|
189
|
+
/**
|
|
190
|
+
* Control-height ladder. `md` mirrors CONTROL_HEIGHT (the family default);
|
|
191
|
+
* `sm`/`lg` give dense and comfortable variants the same rhythm.
|
|
192
|
+
*/
|
|
193
|
+
const CONTROL_HEIGHTS = {
|
|
194
|
+
sm: '2rem',
|
|
195
|
+
md: CONTROL_HEIGHT,
|
|
196
|
+
lg: '3rem',
|
|
197
|
+
};
|
|
198
|
+
/**
|
|
199
|
+
* Opacity roles. Components must use these instead of ad-hoc literals so
|
|
200
|
+
* disabled/muted content reads identically across the whole kit.
|
|
201
|
+
*/
|
|
202
|
+
const OPACITY = {
|
|
203
|
+
disabled: '0.5',
|
|
204
|
+
muted: '0.7',
|
|
205
|
+
faint: '0.4',
|
|
206
|
+
};
|
|
207
|
+
/** Icon sizing ladder — aligns glyph boxes with the text roles they sit next to. */
|
|
208
|
+
const ICON_SIZE = {
|
|
209
|
+
sm: '1rem',
|
|
210
|
+
md: '1.25rem',
|
|
211
|
+
lg: '1.5rem',
|
|
212
|
+
};
|
|
213
|
+
/** Letter-spacing roles: tight for display/headline, wide for overline/labels. */
|
|
214
|
+
const TRACKING = {
|
|
215
|
+
tight: '-0.02em',
|
|
216
|
+
normal: '0',
|
|
217
|
+
wide: '0.08em',
|
|
218
|
+
};
|
|
190
219
|
const SPACING = {
|
|
191
220
|
'0': '0px',
|
|
192
221
|
'0-5': '0.125rem',
|
|
@@ -206,9 +235,9 @@ const SPACING = {
|
|
|
206
235
|
'32': '8rem',
|
|
207
236
|
};
|
|
208
237
|
/**
|
|
209
|
-
*
|
|
238
|
+
* Radius scale: inner 4px, element 8px (buttons/inputs, the base),
|
|
210
239
|
* container 12px (cards), then progressively larger through 28px "page"
|
|
211
|
-
* rounding. Deliberately generous
|
|
240
|
+
* rounding. Deliberately generous so surfaces read soft and rounded.
|
|
212
241
|
*/
|
|
213
242
|
const RADIUS = {
|
|
214
243
|
none: '0px',
|
|
@@ -221,16 +250,18 @@ const RADIUS = {
|
|
|
221
250
|
full: '9999px',
|
|
222
251
|
};
|
|
223
252
|
/**
|
|
224
|
-
* Soft, diffuse, layered shadows
|
|
225
|
-
*
|
|
226
|
-
*
|
|
253
|
+
* Soft, diffuse, layered shadows: a 1px hairline "contact" line keeps edges
|
|
254
|
+
* crisp on white, a tight key shadow gives definition, and a wide low-alpha
|
|
255
|
+
* ambient blur supplies the soft depth. Overlay CSS resolves these to
|
|
256
|
+
* slightly stronger values in dark mode via the elevation tokens on each
|
|
257
|
+
* surface.
|
|
227
258
|
*/
|
|
228
259
|
const SHADOW = {
|
|
229
|
-
sm: '0 1px 1px rgb(0 0 0 / 0.
|
|
230
|
-
md: '0 1px 2px rgb(0 0 0 / 0.
|
|
231
|
-
lg: '0
|
|
232
|
-
xl: '0 4px
|
|
233
|
-
'2xl': '0 8px
|
|
260
|
+
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)',
|
|
261
|
+
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)',
|
|
262
|
+
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)',
|
|
263
|
+
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)',
|
|
264
|
+
'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)',
|
|
234
265
|
};
|
|
235
266
|
/**
|
|
236
267
|
* Stacking ladder for overlay components. Anchored popups sit lowest;
|
|
@@ -324,6 +355,16 @@ function staticVars(theme) {
|
|
|
324
355
|
// Motion Tokens
|
|
325
356
|
'--ngxsmk-motion-duration': 'var(--ngxsmk-duration-normal)',
|
|
326
357
|
'--ngxsmk-motion-ease': 'var(--ngxsmk-ease-in-out)',
|
|
358
|
+
// Interactive-state motion: shared lift/press transforms. Neutralized to
|
|
359
|
+
// `none` under prefers-reduced-motion (see buildThemeCss).
|
|
360
|
+
'--ngxsmk-hover-lift': 'translateY(-1px)',
|
|
361
|
+
'--ngxsmk-press-scale': 'scale(0.98)',
|
|
362
|
+
// Focus ring: THE focus indicator for every component. Aliases the
|
|
363
|
+
// mode-aware --ngxsmk-shadow-focus; the error variant derives from the
|
|
364
|
+
// semantic error role so invalid controls ring red in both modes.
|
|
365
|
+
'--ngxsmk-focus-ring': 'var(--ngxsmk-shadow-focus)',
|
|
366
|
+
'--ngxsmk-focus-ring-error': '0 0 0 2px color-mix(in srgb, var(--ngxsmk-color-error) 15%, transparent), ' +
|
|
367
|
+
'0 0 0 4px color-mix(in srgb, var(--ngxsmk-color-error) 45%, transparent)',
|
|
327
368
|
// Component-specific Tokens (Buttons)
|
|
328
369
|
'--ngxsmk-button-bg': 'var(--ngxsmk-color-primary)',
|
|
329
370
|
'--ngxsmk-button-color': 'var(--ngxsmk-color-on-primary)',
|
|
@@ -354,6 +395,18 @@ function staticVars(theme) {
|
|
|
354
395
|
'--ngxsmk-switch-thumb-bg': 'var(--ngxsmk-color-surface)',
|
|
355
396
|
'--ngxsmk-switch-checked-bg': 'var(--ngxsmk-color-primary)',
|
|
356
397
|
};
|
|
398
|
+
for (const [key, value] of Object.entries(CONTROL_HEIGHTS)) {
|
|
399
|
+
vars[`--ngxsmk-control-height-${key}`] = value;
|
|
400
|
+
}
|
|
401
|
+
for (const [key, value] of Object.entries(OPACITY)) {
|
|
402
|
+
vars[`--ngxsmk-opacity-${key}`] = value;
|
|
403
|
+
}
|
|
404
|
+
for (const [key, value] of Object.entries(ICON_SIZE)) {
|
|
405
|
+
vars[`--ngxsmk-icon-${key}`] = value;
|
|
406
|
+
}
|
|
407
|
+
for (const [key, value] of Object.entries(TRACKING)) {
|
|
408
|
+
vars[`--ngxsmk-tracking-${key}`] = value;
|
|
409
|
+
}
|
|
357
410
|
for (const [key, value] of Object.entries(theme.spacing)) {
|
|
358
411
|
vars[`--ngxsmk-space-${key}`] = value;
|
|
359
412
|
}
|
|
@@ -404,7 +457,7 @@ function lightVars(theme) {
|
|
|
404
457
|
'--ngxsmk-color-secondary-active': shiftLightness(theme.secondaryBase, -14),
|
|
405
458
|
'--ngxsmk-color-secondary-container': theme.secondary[100],
|
|
406
459
|
'--ngxsmk-color-on-secondary-container': theme.secondary[900],
|
|
407
|
-
//
|
|
460
|
+
// Default light theme: cool-grey body, white cards floating on top, hairline borders.
|
|
408
461
|
'--ngxsmk-color-background': theme.neutral[50],
|
|
409
462
|
'--ngxsmk-color-on-background': '#0A1317',
|
|
410
463
|
'--ngxsmk-color-surface': '#FFFFFF',
|
|
@@ -457,7 +510,7 @@ function darkVars(theme) {
|
|
|
457
510
|
'--ngxsmk-color-secondary-active': theme.secondary[200],
|
|
458
511
|
'--ngxsmk-color-secondary-container': theme.secondary[900],
|
|
459
512
|
'--ngxsmk-color-on-secondary-container': theme.secondary[100],
|
|
460
|
-
//
|
|
513
|
+
// Default dark theme: near-neutral charcoal body, slightly lighter card,
|
|
461
514
|
// lighter still for popovers; hairline light-on-dark borders.
|
|
462
515
|
'--ngxsmk-color-background': '#111112',
|
|
463
516
|
'--ngxsmk-color-on-background': '#DFE2E5',
|
|
@@ -535,34 +588,24 @@ function buildThemeCss(config) {
|
|
|
535
588
|
darkBlock = block(`:root.${cn}, :root.${cn} body, .${cn}`, dark);
|
|
536
589
|
}
|
|
537
590
|
}
|
|
538
|
-
|
|
591
|
+
// Zero every duration token (components animate with --ngxsmk-duration-*
|
|
592
|
+
// directly) and neutralize the shared transforms so ALL token-driven motion
|
|
593
|
+
// stops. `.ngxsmk-reduce-motion` offers the same as an app-level opt-in.
|
|
594
|
+
const reducedVars = {
|
|
595
|
+
'--ngxsmk-motion-duration': '0ms',
|
|
596
|
+
'--ngxsmk-hover-lift': 'none',
|
|
597
|
+
'--ngxsmk-press-scale': 'none',
|
|
598
|
+
};
|
|
599
|
+
for (const key of Object.keys(theme.duration)) {
|
|
600
|
+
reducedVars[`--ngxsmk-duration-${key}`] = '0ms';
|
|
601
|
+
}
|
|
602
|
+
const reducedMotion = [
|
|
603
|
+
`@media (prefers-reduced-motion: reduce) {\n${block(':root', reducedVars, ' ')}\n}`,
|
|
604
|
+
block(':root.ngxsmk-reduce-motion, .ngxsmk-reduce-motion', reducedVars),
|
|
605
|
+
].join('\n\n');
|
|
539
606
|
return `/* Generated by @ngxsmk/theme — do not edit by hand. */\n${root}\n\n${darkBlock}\n\n${reducedMotion}\n`;
|
|
540
607
|
}
|
|
541
608
|
|
|
542
|
-
/**
|
|
543
|
-
* Default preset: Astryx (Meta) blue. Light-mode primary is the exact
|
|
544
|
-
* Astryx accent (#0064E0); dark mode brightens it to #2694FE via the
|
|
545
|
-
* scale, matching astryx.atmeta.com.
|
|
546
|
-
*/
|
|
547
|
-
const astryxPreset = {
|
|
548
|
-
name: 'astryx',
|
|
549
|
-
brand: {
|
|
550
|
-
primary: '#0064E0',
|
|
551
|
-
primaryScale: {
|
|
552
|
-
50: '#E7F1FE',
|
|
553
|
-
100: '#CFE3FD',
|
|
554
|
-
200: '#9AC6FC',
|
|
555
|
-
300: '#5CA5FB',
|
|
556
|
-
400: '#2694FE',
|
|
557
|
-
500: '#0064E0',
|
|
558
|
-
600: '#0057C2',
|
|
559
|
-
700: '#0046A0',
|
|
560
|
-
800: '#00397F',
|
|
561
|
-
900: '#002C63',
|
|
562
|
-
950: '#001A3D',
|
|
563
|
-
},
|
|
564
|
-
},
|
|
565
|
-
};
|
|
566
609
|
/** Retained alias so existing violet-themed demos keep working. */
|
|
567
610
|
const violetPreset = {
|
|
568
611
|
name: 'violet',
|
|
@@ -599,6 +642,10 @@ const neutralPreset = {
|
|
|
599
642
|
},
|
|
600
643
|
},
|
|
601
644
|
};
|
|
645
|
+
/**
|
|
646
|
+
* Default preset: Emerald green. This preset generates the prebuilt
|
|
647
|
+
* `ngxsmk.css` stylesheet shipped with @ngxsmk/theme.
|
|
648
|
+
*/
|
|
602
649
|
const emeraldPreset = {
|
|
603
650
|
name: 'emerald',
|
|
604
651
|
brand: { primary: '#059669' },
|
|
@@ -608,7 +655,6 @@ const rosePreset = {
|
|
|
608
655
|
brand: { primary: '#E11D48' },
|
|
609
656
|
};
|
|
610
657
|
const presets = {
|
|
611
|
-
astryx: astryxPreset,
|
|
612
658
|
violet: violetPreset,
|
|
613
659
|
neutral: neutralPreset,
|
|
614
660
|
emerald: emeraldPreset,
|
|
@@ -699,5 +745,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImpor
|
|
|
699
745
|
* Generated bundle index. Do not edit.
|
|
700
746
|
*/
|
|
701
747
|
|
|
702
|
-
export { CONTROL_HEIGHT, DEFAULT_FONT_FAMILY, DEFAULT_NEUTRAL, DEFAULT_SEMANTIC, DEFAULT_TYPOGRAPHY, DURATION, EASING, NgxsmkThemeService, RADIUS, SHADOW, SPACING,
|
|
748
|
+
export { CONTROL_HEIGHT, CONTROL_HEIGHTS, DEFAULT_FONT_FAMILY, DEFAULT_NEUTRAL, DEFAULT_SEMANTIC, DEFAULT_TYPOGRAPHY, DURATION, EASING, ICON_SIZE, NgxsmkThemeService, OPACITY, RADIUS, SHADOW, SPACING, TRACKING, Z_INDEX, buildThemeCss, defineConfig, deriveScale, emeraldPreset, hexToHsl, hslToHex, neutralPreset, presets, resolveTheme, rosePreset, rotateHue, shiftLightness, violetPreset };
|
|
703
749
|
//# sourceMappingURL=ngxsmk-theme.mjs.map
|
|
@@ -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/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/** HSL triple: h in [0,360), s and l in [0,100]. */\nexport interface Hsl {\n h: number;\n s: number;\n l: number;\n}\n\nexport function hexToHsl(hex: string): Hsl {\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\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n const l = (max + min) / 2;\n\n let h = 0;\n let s = 0;\n if (delta !== 0) {\n s = delta / (1 - Math.abs(2 * l - 1));\n switch (max) {\n case r:\n h = 60 * (((g - b) / delta) % 6);\n break;\n case g:\n h = 60 * ((b - r) / delta + 2);\n break;\n default:\n h = 60 * ((r - g) / delta + 4);\n }\n }\n if (h < 0) h += 360;\n\n return { h, s: s * 100, l: l * 100 };\n}\n\nexport function hslToHex({ h, s, l }: Hsl): string {\n const sn = s / 100;\n const ln = l / 100;\n const c = (1 - Math.abs(2 * ln - 1)) * sn;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = ln - c / 2;\n\n let rgb: [number, number, number];\n if (h < 60) rgb = [c, x, 0];\n else if (h < 120) rgb = [x, c, 0];\n else if (h < 180) rgb = [0, c, x];\n else if (h < 240) rgb = [0, x, c];\n else if (h < 300) rgb = [x, 0, c];\n else rgb = [c, 0, x];\n\n const toHex = (v: number) =>\n Math.round((v + m) * 255)\n .toString(16)\n .padStart(2, '0');\n\n return `#${toHex(rgb[0])}${toHex(rgb[1])}${toHex(rgb[2])}`.toUpperCase();\n}\n\n/** Shift a color's lightness by `delta` percentage points (clamped 0–100). */\nexport function shiftLightness(hex: string, delta: number): string {\n const hsl = hexToHsl(hex);\n return hslToHex({ ...hsl, l: Math.min(100, Math.max(0, hsl.l + delta)) });\n}\n\n/** Rotate a color's hue by `degrees`, keeping saturation and lightness. */\nexport function rotateHue(hex: string, degrees: number): string {\n const hsl = hexToHsl(hex);\n return hslToHex({ ...hsl, h: (((hsl.h + degrees) % 360) + 360) % 360 });\n}\n\n/**\n * Lightness stops for each scale step. Tuned so that step 500/600 stays close\n * to typical brand-color lightness and the extremes remain usable as tinted\n * backgrounds (50–100) and readable text (900–950).\n */\nconst LIGHTNESS_STOPS: Record<keyof ColorScale, number> = {\n 50: 97,\n 100: 94,\n 200: 87,\n 300: 78,\n 400: 66,\n 500: 56,\n 600: 48,\n 700: 40,\n 800: 32,\n 900: 25,\n 950: 16,\n};\n\n/**\n * Derive a full 50–950 color scale from a single brand hex.\n *\n * The input color keeps its exact value at the step whose lightness stop is\n * nearest to the input's own lightness, so `scale[step]` round-trips brand\n * colors instead of shifting them.\n */\nexport function deriveScale(baseHex: string): ColorScale {\n const base = hexToHsl(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 scale[key] = key === nearest ? hslToHex(base) : hslToHex({ h: base.h, s: base.s, l: stop });\n }\n return scale;\n}\n","import { ColorScale, FontFamilies, SemanticColors, TypographyScale } from './types';\n\n/**\n * Cool blue-grey neutral scale matching the Astryx (Meta) design language.\n * Light steps carry a subtle blue tint; the darkest steps flatten toward\n * a near-neutral charcoal so dark-mode surfaces read like Astryx's\n * (#111112 body / #1F1F22 card) rather than a saturated navy.\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: '#0064E0',\n};\n\nexport const DEFAULT_FONT_FAMILY: FontFamilies = {\n sans: \"'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif\",\n mono: \"'JetBrains Mono', 'Fira Code', 'Cascadia Code', 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\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 * Astryx radius scale: inner 4px, element 8px (buttons/inputs, the base),\n * container 12px (cards), then progressively larger through 28px \"page\"\n * rounding. Deliberately generous — Astryx reads 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 in the Astryx style (two stacked blurs,\n * low alpha). Overlay CSS resolves these to slightly stronger values in\n * dark mode via the elevation tokens on each surface.\n */\nexport const SHADOW: Record<string, string> = {\n sm: '0 1px 1px rgb(0 0 0 / 0.08), 0 2px 8px rgb(0 0 0 / 0.08)',\n md: '0 1px 2px rgb(0 0 0 / 0.1), 0 2px 12px rgb(0 0 0 / 0.1)',\n lg: '0 2px 2px rgb(0 0 0 / 0.1), 0 8px 24px rgb(0 0 0 / 0.12)',\n xl: '0 4px 6px rgb(0 0 0 / 0.1), 0 12px 32px rgb(0 0 0 / 0.16)',\n '2xl': '0 8px 12px rgb(0 0 0 / 0.14), 0 24px 48px rgb(0 0 0 / 0.22)',\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 { CONTROL_HEIGHT } 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/** 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 // Component-specific Tokens (Buttons)\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 // Component-specific Tokens (Cards)\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 // Component-specific Tokens (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 // Component-specific Tokens (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 // Component-specific Tokens (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\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 // Astryx: 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\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 // Astryx dark: 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\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 const reducedMotion = `@media (prefers-reduced-motion: reduce) {\\n :root {\\n --ngxsmk-motion-duration: 0ms;\\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/**\n * Default preset: Astryx (Meta) blue. Light-mode primary is the exact\n * Astryx accent (#0064E0); dark mode brightens it to #2694FE via the\n * scale, matching astryx.atmeta.com.\n */\nexport const astryxPreset: ThemeConfig = {\n name: 'astryx',\n brand: {\n primary: '#0064E0',\n primaryScale: {\n 50: '#E7F1FE',\n 100: '#CFE3FD',\n 200: '#9AC6FC',\n 300: '#5CA5FB',\n 400: '#2694FE',\n 500: '#0064E0',\n 600: '#0057C2',\n 700: '#0046A0',\n 800: '#00397F',\n 900: '#002C63',\n 950: '#001A3D',\n },\n },\n};\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\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 astryx: astryxPreset,\n violet: violetPreset,\n neutral: neutralPreset,\n emerald: emeraldPreset,\n rose: rosePreset,\n};\n","import { DOCUMENT } from '@angular/common';\nimport { Injectable, computed, effect, inject, signal } from '@angular/core';\nimport { buildThemeCss } from './css';\nimport { ThemeConfig } from './types';\n\nexport type ThemeMode = 'light' | 'dark' | 'system';\n\nconst STORAGE_KEY = 'ngxsmk-theme-mode';\nconst STYLE_ID = 'ngxsmk-theme';\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 * 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\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 // Inject DOCUMENT first so that restoreMode() and matchSystemDark()\n // can safely access it when the signals are initialised below.\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 /**\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 applyTheme(config: ThemeConfig): 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 style.textContent = buildThemeCss(config);\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 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';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
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/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/** HSL triple: h in [0,360), s and l in [0,100]. */\nexport interface Hsl {\n h: number;\n s: number;\n l: number;\n}\n\nexport function hexToHsl(hex: string): Hsl {\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\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n const l = (max + min) / 2;\n\n let h = 0;\n let s = 0;\n if (delta !== 0) {\n s = delta / (1 - Math.abs(2 * l - 1));\n switch (max) {\n case r:\n h = 60 * (((g - b) / delta) % 6);\n break;\n case g:\n h = 60 * ((b - r) / delta + 2);\n break;\n default:\n h = 60 * ((r - g) / delta + 4);\n }\n }\n if (h < 0) h += 360;\n\n return { h, s: s * 100, l: l * 100 };\n}\n\nexport function hslToHex({ h, s, l }: Hsl): string {\n const sn = s / 100;\n const ln = l / 100;\n const c = (1 - Math.abs(2 * ln - 1)) * sn;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = ln - c / 2;\n\n let rgb: [number, number, number];\n if (h < 60) rgb = [c, x, 0];\n else if (h < 120) rgb = [x, c, 0];\n else if (h < 180) rgb = [0, c, x];\n else if (h < 240) rgb = [0, x, c];\n else if (h < 300) rgb = [x, 0, c];\n else rgb = [c, 0, x];\n\n const toHex = (v: number) =>\n Math.round((v + m) * 255)\n .toString(16)\n .padStart(2, '0');\n\n return `#${toHex(rgb[0])}${toHex(rgb[1])}${toHex(rgb[2])}`.toUpperCase();\n}\n\n/** Shift a color's lightness by `delta` percentage points (clamped 0–100). */\nexport function shiftLightness(hex: string, delta: number): string {\n const hsl = hexToHsl(hex);\n return hslToHex({ ...hsl, l: Math.min(100, Math.max(0, hsl.l + delta)) });\n}\n\n/** Rotate a color's hue by `degrees`, keeping saturation and lightness. */\nexport function rotateHue(hex: string, degrees: number): string {\n const hsl = hexToHsl(hex);\n return hslToHex({ ...hsl, h: (((hsl.h + degrees) % 360) + 360) % 360 });\n}\n\n/**\n * Lightness stops for each scale step. Tuned so that step 500/600 stays close\n * to typical brand-color lightness and the extremes remain usable as tinted\n * backgrounds (50–100) and readable text (900–950).\n */\nconst LIGHTNESS_STOPS: Record<keyof ColorScale, number> = {\n 50: 97,\n 100: 94,\n 200: 87,\n 300: 78,\n 400: 66,\n 500: 56,\n 600: 48,\n 700: 40,\n 800: 32,\n 900: 25,\n 950: 16,\n};\n\n/**\n * Derive a full 50–950 color scale from a single brand hex.\n *\n * The input color keeps its exact value at the step whose lightness stop is\n * nearest to the input's own lightness, so `scale[step]` round-trips brand\n * colors instead of shifting them.\n */\nexport function deriveScale(baseHex: string): ColorScale {\n const base = hexToHsl(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 scale[key] = key === nearest ? hslToHex(base) : hslToHex({ h: base.h, s: base.s, l: stop });\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: \"'JetBrains Mono', 'Fira Code', 'Cascadia Code', 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\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 { CONTROL_HEIGHT, CONTROL_HEIGHTS, ICON_SIZE, OPACITY, TRACKING } 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/** 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 Tokens (Buttons)\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 // Component-specific Tokens (Cards)\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 // Component-specific Tokens (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 // Component-specific Tokens (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 // Component-specific Tokens (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\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(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\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\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 { DOCUMENT } from '@angular/common';\nimport { Injectable, computed, effect, inject, signal } from '@angular/core';\nimport { buildThemeCss } from './css';\nimport { ThemeConfig } from './types';\n\nexport type ThemeMode = 'light' | 'dark' | 'system';\n\nconst STORAGE_KEY = 'ngxsmk-theme-mode';\nconst STYLE_ID = 'ngxsmk-theme';\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 * 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\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 // Inject DOCUMENT first so that restoreMode() and matchSystemDark()\n // can safely access it when the signals are initialised below.\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 /**\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 applyTheme(config: ThemeConfig): 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 style.textContent = buildThemeCss(config);\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 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';\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;AAgQ1F;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,aAAa,GAAG,MAAM,CAmDzE"}
|
package/lib/presets.d.ts
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
import { ThemeConfig } from './types';
|
|
2
|
-
/**
|
|
3
|
-
* Default preset: Astryx (Meta) blue. Light-mode primary is the exact
|
|
4
|
-
* Astryx accent (#0064E0); dark mode brightens it to #2694FE via the
|
|
5
|
-
* scale, matching astryx.atmeta.com.
|
|
6
|
-
*/
|
|
7
|
-
export declare const astryxPreset: ThemeConfig;
|
|
8
2
|
/** Retained alias so existing violet-themed demos keep working. */
|
|
9
3
|
export declare const violetPreset: ThemeConfig;
|
|
10
4
|
/** Monochrome preset in the spirit of shadcn/ui's default look. */
|
|
11
5
|
export declare const neutralPreset: ThemeConfig;
|
|
6
|
+
/**
|
|
7
|
+
* Default preset: Emerald green. This preset generates the prebuilt
|
|
8
|
+
* `ngxsmk.css` stylesheet shipped with @ngxsmk/theme.
|
|
9
|
+
*/
|
|
12
10
|
export declare const emeraldPreset: ThemeConfig;
|
|
13
11
|
export declare const rosePreset: ThemeConfig;
|
|
14
12
|
export declare const presets: Record<string, ThemeConfig>;
|
package/lib/presets.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../../../packages/theme/src/lib/presets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC
|
|
1
|
+
{"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../../../packages/theme/src/lib/presets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,mEAAmE;AACnE,eAAO,MAAM,YAAY,EAAE,WAG1B,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,aAAa,EAAE,WA6B3B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,WAG3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,WAGxB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAK/C,CAAC"}
|
package/lib/tokens.d.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { ColorScale, FontFamilies, SemanticColors, TypographyScale } from './types';
|
|
2
2
|
/**
|
|
3
|
-
* Cool blue-grey neutral scale
|
|
4
|
-
*
|
|
5
|
-
* a
|
|
6
|
-
* (#111112 body / #1F1F22 card) rather than a saturated navy.
|
|
3
|
+
* Cool blue-grey neutral scale. Light steps carry a subtle blue tint; the
|
|
4
|
+
* darkest steps flatten toward a near-neutral charcoal so dark-mode
|
|
5
|
+
* surfaces read like a soft, desaturated navy rather than a saturated one.
|
|
7
6
|
*/
|
|
8
7
|
export declare const DEFAULT_NEUTRAL: ColorScale;
|
|
9
8
|
export declare const DEFAULT_SEMANTIC: SemanticColors;
|
|
@@ -15,17 +14,33 @@ export declare const DEFAULT_TYPOGRAPHY: TypographyScale;
|
|
|
15
14
|
* family use this so they read as one consistent size.
|
|
16
15
|
*/
|
|
17
16
|
export declare const CONTROL_HEIGHT = "2.5rem";
|
|
17
|
+
/**
|
|
18
|
+
* Control-height ladder. `md` mirrors CONTROL_HEIGHT (the family default);
|
|
19
|
+
* `sm`/`lg` give dense and comfortable variants the same rhythm.
|
|
20
|
+
*/
|
|
21
|
+
export declare const CONTROL_HEIGHTS: Record<string, string>;
|
|
22
|
+
/**
|
|
23
|
+
* Opacity roles. Components must use these instead of ad-hoc literals so
|
|
24
|
+
* disabled/muted content reads identically across the whole kit.
|
|
25
|
+
*/
|
|
26
|
+
export declare const OPACITY: Record<string, string>;
|
|
27
|
+
/** Icon sizing ladder — aligns glyph boxes with the text roles they sit next to. */
|
|
28
|
+
export declare const ICON_SIZE: Record<string, string>;
|
|
29
|
+
/** Letter-spacing roles: tight for display/headline, wide for overline/labels. */
|
|
30
|
+
export declare const TRACKING: Record<string, string>;
|
|
18
31
|
export declare const SPACING: Record<string, string>;
|
|
19
32
|
/**
|
|
20
|
-
*
|
|
33
|
+
* Radius scale: inner 4px, element 8px (buttons/inputs, the base),
|
|
21
34
|
* container 12px (cards), then progressively larger through 28px "page"
|
|
22
|
-
* rounding. Deliberately generous
|
|
35
|
+
* rounding. Deliberately generous so surfaces read soft and rounded.
|
|
23
36
|
*/
|
|
24
37
|
export declare const RADIUS: Record<string, string>;
|
|
25
38
|
/**
|
|
26
|
-
* Soft, diffuse, layered shadows
|
|
27
|
-
*
|
|
28
|
-
*
|
|
39
|
+
* Soft, diffuse, layered shadows: a 1px hairline "contact" line keeps edges
|
|
40
|
+
* crisp on white, a tight key shadow gives definition, and a wide low-alpha
|
|
41
|
+
* ambient blur supplies the soft depth. Overlay CSS resolves these to
|
|
42
|
+
* slightly stronger values in dark mode via the elevation tokens on each
|
|
43
|
+
* surface.
|
|
29
44
|
*/
|
|
30
45
|
export declare const SHADOW: Record<string, string>;
|
|
31
46
|
/**
|
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
|
|
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,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"}
|