@grundtone/core 2.0.0 → 2.0.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 CHANGED
@@ -1,78 +1,59 @@
1
1
  # @grundtone/core
2
2
 
3
- Core package for the Grundtone design system. This package contains the fundamental building blocks,
4
- types, and utilities that form the foundation of the design system.
3
+ Foundation package for the [Grundtone](https://grundtone.com) design system. Provides the theme
4
+ system, TypeScript types, and presets that all other packages build on.
5
5
 
6
6
  ## Installation
7
7
 
8
8
  ```bash
9
- pnpm add @grundtone/core
9
+ npm install @grundtone/core
10
10
  ```
11
11
 
12
12
  ## Usage
13
13
 
14
14
  ```typescript
15
- import { DEFAULT_THEME, type ThemeConfig } from '@grundtone/core';
16
-
17
- // Use the default theme
18
- const theme: ThemeConfig = DEFAULT_THEME;
15
+ import { createTheme, type ThemeConfig } from '@grundtone/core';
16
+
17
+ const { light, dark } = createTheme({
18
+ light: {
19
+ colors: {
20
+ primary: '#2563eb',
21
+ background: '#ffffff',
22
+ },
23
+ },
24
+ dark: {
25
+ colors: {
26
+ primary: '#3b82f6',
27
+ background: '#0a0a0a',
28
+ },
29
+ },
30
+ });
19
31
  ```
20
32
 
21
33
  ## Exports
22
34
 
23
- ### Types
24
-
25
- - `ComponentProps` - Base interface for component props
26
- - `ThemeConfig` - Theme configuration interface
27
- - `Size` - Common size variants ('sm' | 'md' | 'lg')
28
- - `Variant` - Common component variants ('primary' | 'secondary' | 'tertiary')
29
-
30
- ### Constants
35
+ ### Theme
31
36
 
37
+ - `createTheme()` - Create light/dark theme configurations
32
38
  - `DEFAULT_THEME` - Default theme configuration
39
+ - Theme presets
33
40
 
34
- ## Development
35
-
36
- 1. Install dependencies:
37
-
38
- ```bash
39
- pnpm install
40
- ```
41
-
42
- 2. Start development server:
43
-
44
- ```bash
45
- pnpm dev
46
- ```
47
-
48
- 3. Build package:
49
-
50
- ```bash
51
- pnpm build
52
- ```
53
-
54
- 4. Run tests:
55
-
56
- ```bash
57
- pnpm test
58
- ```
41
+ ### Types
59
42
 
60
- ## Contributing
43
+ - `ThemeConfig` - Theme configuration interface
44
+ - `ThemeMode` - Light/dark mode type
45
+ - `ComponentProps` - Base component props interface
46
+ - `Size` - Size variants (`'sm' | 'md' | 'lg'`)
47
+ - `Variant` - Component variants (`'primary' | 'secondary' | 'tertiary'`)
61
48
 
62
- Please refer to the main project README for contribution guidelines.
49
+ ### Branding
63
50
 
64
- ## TypeScript-konfiguration
51
+ - Branding configuration and utilities
65
52
 
66
- Denne pakke bruger en specifik `tsconfig.json`, som udvider rodens `tsconfig.build.json`.
67
- Konfigurationen sikrer at kildekoden i `src/` og types i `types/` bliver korrekt transpileret og at
68
- types genereres i `dist/types`.
53
+ ## Documentation
69
54
 
70
- - outDir: `dist`
71
- - rootDir: `src`
72
- - Types genereres automatisk ved build
55
+ See [grundtone.com](https://grundtone.com) for full documentation.
73
56
 
74
- Byg pakken med:
57
+ ## License
75
58
 
76
- ```sh
77
- pnpm build
78
- ```
59
+ MIT
package/dist/index.d.mts CHANGED
@@ -1,11 +1,26 @@
1
1
  import { InjectionKey, Ref } from 'vue';
2
2
 
3
+ interface GrundtoneConfig {
4
+ prefix: string;
5
+ iconColor: string;
6
+ }
7
+ declare function defineGrundtoneConfig(config: Partial<GrundtoneConfig>): GrundtoneConfig;
8
+ declare function getGrundtoneConfig(): GrundtoneConfig;
9
+ declare function getClassPrefix(): string;
10
+ declare function getIconColor(): string;
11
+
3
12
  interface ComponentProps {
4
13
  class?: string;
5
14
  style?: string | Record<string, string>;
6
15
  }
7
16
  type Size = 'sm' | 'md' | 'lg';
8
17
  type Variant = 'primary' | 'secondary' | 'tertiary';
18
+ interface IconDefinition {
19
+ body: string;
20
+ viewBox: string;
21
+ category?: string;
22
+ }
23
+ type IconRegistry = Record<string, IconDefinition>;
9
24
 
10
25
  type ThemeMode = 'light' | 'dark' | 'auto';
11
26
  interface ThemeColors {
@@ -282,6 +297,25 @@ declare function createTheme(overrides: {
282
297
  };
283
298
  declare const defaultTheme: Theme;
284
299
 
300
+ declare const TOGGLE_SIZES: {
301
+ readonly sm: {
302
+ readonly width: 36;
303
+ readonly height: 20;
304
+ readonly thumb: 16;
305
+ };
306
+ readonly md: {
307
+ readonly width: 44;
308
+ readonly height: 24;
309
+ readonly thumb: 20;
310
+ };
311
+ readonly lg: {
312
+ readonly width: 52;
313
+ readonly height: 28;
314
+ readonly thumb: 24;
315
+ };
316
+ };
317
+ type ToggleSize = keyof typeof TOGGLE_SIZES;
318
+
285
319
  interface LogoVariants {
286
320
  primary: string;
287
321
  favicon32: string;
@@ -302,4 +336,4 @@ declare const LOGO_VARIANT_SIZES: Record<keyof LogoVariants, {
302
336
  declare const defaultBranding: BrandingConfig;
303
337
  declare function createBranding(overrides?: Partial<BrandingConfig>): BrandingConfig;
304
338
 
305
- export { type BrandingConfig, type ColorPreset, type ComponentProps, LOGO_VARIANT_SIZES, type LogoVariants, SEMANTIC_COLOR_KEYS, type ShadowLayer, type Size, THEME_INJECTION_KEY, type Theme, type ThemeColors, type ThemeConfig, type ThemeMode, type ThemeProviderContext, type ThemeProviderProps, type ThemeRadius, type ThemeShadows, type ThemeSpacing, type ThemeTransitions, type ThemeTypography, type ThemeZIndex, type Variant, createBranding, createTheme, defaultBranding, defaultColorPreset, defaultColorPresetDark, defaultRadius, defaultShadowDefinitions, defaultShadows, defaultSpacing, defaultTheme, defaultTransitions, defaultTypography, defaultZIndex, hexToRgb, shadowLayersToCSS };
339
+ export { type BrandingConfig, type ColorPreset, type ComponentProps, type GrundtoneConfig, type IconDefinition, type IconRegistry, LOGO_VARIANT_SIZES, type LogoVariants, SEMANTIC_COLOR_KEYS, type ShadowLayer, type Size, THEME_INJECTION_KEY, TOGGLE_SIZES, type Theme, type ThemeColors, type ThemeConfig, type ThemeMode, type ThemeProviderContext, type ThemeProviderProps, type ThemeRadius, type ThemeShadows, type ThemeSpacing, type ThemeTransitions, type ThemeTypography, type ThemeZIndex, type ToggleSize, type Variant, createBranding, createTheme, defaultBranding, defaultColorPreset, defaultColorPresetDark, defaultRadius, defaultShadowDefinitions, defaultShadows, defaultSpacing, defaultTheme, defaultTransitions, defaultTypography, defaultZIndex, defineGrundtoneConfig, getClassPrefix, getGrundtoneConfig, getIconColor, hexToRgb, shadowLayersToCSS };
package/dist/index.d.ts CHANGED
@@ -1,11 +1,26 @@
1
1
  import { InjectionKey, Ref } from 'vue';
2
2
 
3
+ interface GrundtoneConfig {
4
+ prefix: string;
5
+ iconColor: string;
6
+ }
7
+ declare function defineGrundtoneConfig(config: Partial<GrundtoneConfig>): GrundtoneConfig;
8
+ declare function getGrundtoneConfig(): GrundtoneConfig;
9
+ declare function getClassPrefix(): string;
10
+ declare function getIconColor(): string;
11
+
3
12
  interface ComponentProps {
4
13
  class?: string;
5
14
  style?: string | Record<string, string>;
6
15
  }
7
16
  type Size = 'sm' | 'md' | 'lg';
8
17
  type Variant = 'primary' | 'secondary' | 'tertiary';
18
+ interface IconDefinition {
19
+ body: string;
20
+ viewBox: string;
21
+ category?: string;
22
+ }
23
+ type IconRegistry = Record<string, IconDefinition>;
9
24
 
10
25
  type ThemeMode = 'light' | 'dark' | 'auto';
11
26
  interface ThemeColors {
@@ -282,6 +297,25 @@ declare function createTheme(overrides: {
282
297
  };
283
298
  declare const defaultTheme: Theme;
284
299
 
300
+ declare const TOGGLE_SIZES: {
301
+ readonly sm: {
302
+ readonly width: 36;
303
+ readonly height: 20;
304
+ readonly thumb: 16;
305
+ };
306
+ readonly md: {
307
+ readonly width: 44;
308
+ readonly height: 24;
309
+ readonly thumb: 20;
310
+ };
311
+ readonly lg: {
312
+ readonly width: 52;
313
+ readonly height: 28;
314
+ readonly thumb: 24;
315
+ };
316
+ };
317
+ type ToggleSize = keyof typeof TOGGLE_SIZES;
318
+
285
319
  interface LogoVariants {
286
320
  primary: string;
287
321
  favicon32: string;
@@ -302,4 +336,4 @@ declare const LOGO_VARIANT_SIZES: Record<keyof LogoVariants, {
302
336
  declare const defaultBranding: BrandingConfig;
303
337
  declare function createBranding(overrides?: Partial<BrandingConfig>): BrandingConfig;
304
338
 
305
- export { type BrandingConfig, type ColorPreset, type ComponentProps, LOGO_VARIANT_SIZES, type LogoVariants, SEMANTIC_COLOR_KEYS, type ShadowLayer, type Size, THEME_INJECTION_KEY, type Theme, type ThemeColors, type ThemeConfig, type ThemeMode, type ThemeProviderContext, type ThemeProviderProps, type ThemeRadius, type ThemeShadows, type ThemeSpacing, type ThemeTransitions, type ThemeTypography, type ThemeZIndex, type Variant, createBranding, createTheme, defaultBranding, defaultColorPreset, defaultColorPresetDark, defaultRadius, defaultShadowDefinitions, defaultShadows, defaultSpacing, defaultTheme, defaultTransitions, defaultTypography, defaultZIndex, hexToRgb, shadowLayersToCSS };
339
+ export { type BrandingConfig, type ColorPreset, type ComponentProps, type GrundtoneConfig, type IconDefinition, type IconRegistry, LOGO_VARIANT_SIZES, type LogoVariants, SEMANTIC_COLOR_KEYS, type ShadowLayer, type Size, THEME_INJECTION_KEY, TOGGLE_SIZES, type Theme, type ThemeColors, type ThemeConfig, type ThemeMode, type ThemeProviderContext, type ThemeProviderProps, type ThemeRadius, type ThemeShadows, type ThemeSpacing, type ThemeTransitions, type ThemeTypography, type ThemeZIndex, type ToggleSize, type Variant, createBranding, createTheme, defaultBranding, defaultColorPreset, defaultColorPresetDark, defaultRadius, defaultShadowDefinitions, defaultShadows, defaultSpacing, defaultTheme, defaultTransitions, defaultTypography, defaultZIndex, defineGrundtoneConfig, getClassPrefix, getGrundtoneConfig, getIconColor, hexToRgb, shadowLayersToCSS };
package/dist/index.js CHANGED
@@ -1,5 +1,25 @@
1
1
  'use strict';
2
2
 
3
+ // src/config.ts
4
+ var defaultConfig = {
5
+ prefix: "GT",
6
+ iconColor: "currentColor"
7
+ };
8
+ var currentConfig = { ...defaultConfig };
9
+ function defineGrundtoneConfig(config) {
10
+ currentConfig = { ...defaultConfig, ...config };
11
+ return currentConfig;
12
+ }
13
+ function getGrundtoneConfig() {
14
+ return currentConfig;
15
+ }
16
+ function getClassPrefix() {
17
+ return currentConfig.prefix.toLowerCase();
18
+ }
19
+ function getIconColor() {
20
+ return currentConfig.iconColor;
21
+ }
22
+
3
23
  // src/theme.ts
4
24
  var THEME_INJECTION_KEY = /* @__PURE__ */ Symbol("grundtone-theme");
5
25
 
@@ -58,9 +78,9 @@ var defaultColorPreset = {
58
78
  primaryLight: "#3381cc",
59
79
  primaryDark: "#003a7a",
60
80
  onPrimary: "#ffffff",
61
- secondary: "#6c757d",
62
- secondaryLight: "#868e96",
63
- secondaryDark: "#494f54",
81
+ secondary: "#e9ecef",
82
+ secondaryLight: "#f8f9fa",
83
+ secondaryDark: "#dee2e6",
64
84
  // Status
65
85
  success: "#198754",
66
86
  successLight: "#d1e7dd",
@@ -106,9 +126,9 @@ var defaultColorPresetDark = {
106
126
  primaryLight: "#74c0fc",
107
127
  primaryDark: "#339af0",
108
128
  onPrimary: "#121212",
109
- secondary: "#adb5bd",
110
- secondaryLight: "#ced4da",
111
- secondaryDark: "#868e96",
129
+ secondary: "#343a40",
130
+ secondaryLight: "#495057",
131
+ secondaryDark: "#2b3035",
112
132
  // Status
113
133
  success: "#51cf66",
114
134
  successLight: "#1a3d20",
@@ -318,6 +338,13 @@ function createTheme(overrides) {
318
338
  }
319
339
  var defaultTheme = buildLightTheme({});
320
340
 
341
+ // src/toggle.ts
342
+ var TOGGLE_SIZES = {
343
+ sm: { width: 36, height: 20, thumb: 16 },
344
+ md: { width: 44, height: 24, thumb: 20 },
345
+ lg: { width: 52, height: 28, thumb: 24 }
346
+ };
347
+
321
348
  // src/branding.ts
322
349
  var LOGO_VARIANT_SIZES = {
323
350
  primary: { width: 1080, height: 1080 },
@@ -354,6 +381,7 @@ function createBranding(overrides) {
354
381
  exports.LOGO_VARIANT_SIZES = LOGO_VARIANT_SIZES;
355
382
  exports.SEMANTIC_COLOR_KEYS = SEMANTIC_COLOR_KEYS;
356
383
  exports.THEME_INJECTION_KEY = THEME_INJECTION_KEY;
384
+ exports.TOGGLE_SIZES = TOGGLE_SIZES;
357
385
  exports.createBranding = createBranding;
358
386
  exports.createTheme = createTheme;
359
387
  exports.defaultBranding = defaultBranding;
@@ -367,6 +395,10 @@ exports.defaultTheme = defaultTheme;
367
395
  exports.defaultTransitions = defaultTransitions;
368
396
  exports.defaultTypography = defaultTypography;
369
397
  exports.defaultZIndex = defaultZIndex;
398
+ exports.defineGrundtoneConfig = defineGrundtoneConfig;
399
+ exports.getClassPrefix = getClassPrefix;
400
+ exports.getGrundtoneConfig = getGrundtoneConfig;
401
+ exports.getIconColor = getIconColor;
370
402
  exports.hexToRgb = hexToRgb;
371
403
  exports.shadowLayersToCSS = shadowLayersToCSS;
372
404
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/theme.ts","../src/theme-preset.ts","../src/branding.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { InjectionKey, Ref } from 'vue';\n\nexport type ThemeMode = 'light' | 'dark' | 'auto';\n\n/**\n * Semantic color tokens – configure these to match your brand.\n * All keys map to CSS var: --color-{kebab-case-key}\n *\n * Shade-based naming: `primaryLight`/`primaryDark` instead of state-based\n * (`primaryHover`/`primaryActive`). Components decide which shade to use\n * for hover, active, tint, etc.\n */\nexport interface ThemeColors {\n // Brand\n primary: string;\n primaryLight: string;\n primaryDark: string;\n onPrimary: string;\n secondary: string;\n secondaryLight: string;\n secondaryDark: string;\n // Status\n success: string;\n successLight: string;\n successDark: string;\n warning: string;\n warningLight: string;\n warningDark: string;\n error: string;\n errorLight: string;\n errorDark: string;\n info: string;\n infoLight: string;\n infoDark: string;\n // Surface\n background: string;\n backgroundAlt: string;\n surface: string;\n surfaceAlt: string;\n surfaceRaised: string;\n surfaceOverlay: string;\n modalBackdrop: string;\n // Text\n text: string;\n textSecondary: string;\n textTertiary: string;\n textInverse: string;\n textPlaceholder: string;\n textDisabled: string;\n // Border\n borderLight: string;\n borderMedium: string;\n borderStrong: string;\n borderInverse: string;\n // Focus\n focus: string;\n focusRing: string;\n // Neutral\n neutral: string;\n}\n\nexport interface ThemeSpacing {\n xs: string;\n sm: string;\n md: string;\n lg: string;\n xl: string;\n '2xl': string;\n '3xl': string;\n '4xl': string;\n}\n\nexport interface ThemeTypography {\n fontFamily: {\n base: string;\n heading: string;\n mono: string;\n };\n fontSize: {\n xs: string;\n sm: string;\n base: string;\n lg: string;\n xl: string;\n '2xl': string;\n '3xl': string;\n '4xl': string;\n '5xl': string;\n };\n fontWeight: {\n thin: number;\n light: number;\n normal: number;\n medium: number;\n semibold: number;\n bold: number;\n extrabold: number;\n };\n lineHeight: {\n none: number;\n tight: number;\n snug: number;\n normal: number;\n relaxed: number;\n loose: number;\n };\n}\n\nexport interface ThemeShadows {\n xs: string;\n sm: string;\n md: string;\n lg: string;\n xl: string;\n '2xl': string;\n inner: string;\n none: string;\n}\n\n/**\n * Structured shadow layer — platform-agnostic description of a single\n * CSS box-shadow layer. Web converts to CSS string; React Native converts\n * to iOS shadowColor/Offset/Opacity/Radius + Android elevation.\n */\nexport interface ShadowLayer {\n x: number;\n y: number;\n blur: number;\n spread: number;\n color: string;\n opacity: number;\n inset?: boolean;\n}\n\nexport interface ThemeRadius {\n none: string;\n xs: string;\n sm: string;\n md: string;\n lg: string;\n xl: string;\n '2xl': string;\n '3xl': string;\n full: string;\n}\n\nexport interface ThemeTransitions {\n duration: {\n fast: string;\n base: string;\n slow: string;\n };\n timing: {\n ease: string;\n easeIn: string;\n easeOut: string;\n easeInOut: string;\n linear: string;\n };\n}\n\nexport interface ThemeZIndex {\n dropdown: number;\n sticky: number;\n fixed: number;\n modalBackdrop: number;\n modal: number;\n popover: number;\n tooltip: number;\n toast: number;\n}\n\nexport interface Theme {\n mode: ThemeMode;\n colors: ThemeColors;\n spacing: ThemeSpacing;\n typography: ThemeTypography;\n shadows: ThemeShadows;\n shadowDefinitions: Record<string, ShadowLayer[]>;\n radius: ThemeRadius;\n transitions: ThemeTransitions;\n zIndex: ThemeZIndex;\n}\n\nexport interface ThemeProviderContext {\n theme: Readonly<Ref<Theme>>;\n mode: Readonly<Ref<ThemeMode>>;\n isDark: Readonly<Ref<boolean>>;\n isLight: Readonly<Ref<boolean>>;\n setMode: (mode: ThemeMode) => void;\n toggleMode: () => void;\n applyTheme: () => void;\n}\n\nexport const THEME_INJECTION_KEY: InjectionKey<ThemeProviderContext> =\n Symbol('grundtone-theme');\n\n/**\n * Theme configuration: either a single partial theme (applies to both modes)\n * or separate light/dark overrides for proper dark mode support.\n */\nexport type ThemeConfig =\n | Partial<Theme>\n | { light?: Partial<Theme>; dark?: Partial<Theme> };\n\nexport interface ThemeProviderProps {\n mode?: ThemeMode;\n theme?: ThemeConfig;\n enableTransitions?: boolean;\n persistMode?: boolean;\n storageKey?: string;\n}\n","/**\n * Grundtone Theme Preset\n *\n * Standard reference colors. When installing Grundtone, you MUST configure your\n * theme colors - either customize this preset or provide your own.\n * The design system will not apply colors until you explicitly pass a theme.\n *\n * @example\n * // Nuxt: Configure in nuxt.config.ts\n * grundtone: {\n * theme: {\n * light: { colors: { primary: '#your-brand', ... } },\n * dark: { colors: { primary: '#your-brand-dark', ... } }\n * }\n * }\n *\n * @example\n * // Vue: Pass to ThemeProvider\n * import { defaultTheme, createTheme } from '@grundtone/core';\n * <ThemeProvider :theme=\"defaultTheme\" />\n */\n\nimport type { ShadowLayer, Theme, ThemeShadows } from './theme';\n\nexport type ColorPreset = Theme['colors'];\n\n/**\n * Semantic color keys – all colors your app should configure.\n */\nexport const SEMANTIC_COLOR_KEYS = [\n // Brand\n 'primary',\n 'primaryLight',\n 'primaryDark',\n 'onPrimary',\n 'secondary',\n 'secondaryLight',\n 'secondaryDark',\n // Status\n 'success',\n 'successLight',\n 'successDark',\n 'warning',\n 'warningLight',\n 'warningDark',\n 'error',\n 'errorLight',\n 'errorDark',\n 'info',\n 'infoLight',\n 'infoDark',\n // Surface\n 'background',\n 'backgroundAlt',\n 'surface',\n 'surfaceAlt',\n 'surfaceRaised',\n 'surfaceOverlay',\n 'modalBackdrop',\n // Text\n 'text',\n 'textSecondary',\n 'textTertiary',\n 'textInverse',\n 'textPlaceholder',\n 'textDisabled',\n // Border\n 'borderLight',\n 'borderMedium',\n 'borderStrong',\n 'borderInverse',\n // Focus\n 'focus',\n 'focusRing',\n // Neutral\n 'neutral',\n] as const;\n\n/**\n * Standard reference colors (Bootstrap-inspired).\n * Copy and customize – do not use passively without reviewing.\n */\nexport const defaultColorPreset: ColorPreset = {\n // Brand\n primary: '#0059b3',\n primaryLight: '#3381cc',\n primaryDark: '#003a7a',\n onPrimary: '#ffffff',\n secondary: '#6c757d',\n secondaryLight: '#868e96',\n secondaryDark: '#494f54',\n // Status\n success: '#198754',\n successLight: '#d1e7dd',\n successDark: '#146c43',\n warning: '#ffc107',\n warningLight: '#fff3cd',\n warningDark: '#cc9a06',\n error: '#dc3545',\n errorLight: '#f8d7da',\n errorDark: '#b02a37',\n info: '#0dcaf0',\n infoLight: '#cff4fc',\n infoDark: '#0aa2c0',\n // Surface\n background: '#ffffff',\n backgroundAlt: '#fafafa',\n surface: '#f8f9fa',\n surfaceAlt: '#f0f1f2',\n surfaceRaised: '#ffffff',\n surfaceOverlay: 'rgba(255,255,255,0.95)',\n modalBackdrop: 'rgba(0,0,0,0.5)',\n // Text\n text: '#212529',\n textSecondary: '#6c757d',\n textTertiary: '#adb5bd',\n textInverse: '#ffffff',\n textPlaceholder: '#a3a3a3',\n textDisabled: '#d4d4d4',\n // Border\n borderLight: '#dee2e6',\n borderMedium: '#ced4da',\n borderStrong: '#adb5bd',\n borderInverse: 'rgba(255,255,255,0.2)',\n // Focus\n focus: '#0059b3',\n focusRing: 'rgba(0,89,179,0.25)',\n // Neutral\n neutral: '#6c757d',\n};\n\n/**\n * Dark mode preset (standard reference).\n */\nexport const defaultColorPresetDark: ColorPreset = {\n // Brand\n primary: '#4dabf7',\n primaryLight: '#74c0fc',\n primaryDark: '#339af0',\n onPrimary: '#121212',\n secondary: '#adb5bd',\n secondaryLight: '#ced4da',\n secondaryDark: '#868e96',\n // Status\n success: '#51cf66',\n successLight: '#1a3d20',\n successDark: '#40c057',\n warning: '#ffd43b',\n warningLight: '#3d3a1a',\n warningDark: '#fab005',\n error: '#ff6b6b',\n errorLight: '#3d1a1c',\n errorDark: '#fa5252',\n info: '#4dabf7',\n infoLight: '#1a2e3d',\n infoDark: '#339af0',\n // Surface\n background: '#121212',\n backgroundAlt: '#1a1a1a',\n surface: '#1e1e1e',\n surfaceAlt: '#252525',\n surfaceRaised: '#2a2a2a',\n surfaceOverlay: 'rgba(30,30,30,0.95)',\n modalBackdrop: 'rgba(0,0,0,0.7)',\n // Text\n text: '#ffffff',\n textSecondary: '#b0b0b0',\n textTertiary: '#808080',\n textInverse: '#121212',\n textPlaceholder: '#666666',\n textDisabled: '#4a4a4a',\n // Border\n borderLight: '#404040',\n borderMedium: '#505050',\n borderStrong: '#606060',\n borderInverse: 'rgba(0,0,0,0.3)',\n // Focus\n focus: '#4dabf7',\n focusRing: 'rgba(77,171,247,0.25)',\n // Neutral\n neutral: '#9e9e9e',\n};\n\n/**\n * 8px base unit spacing system.\n * All values are multiples of the 8px grid (4px = 0.5×, 8px = 1×, 16px = 2×, etc.).\n * Web: used as rem via CSS custom properties (--space-*).\n * React Native: convert to numbers (4, 8, 16, 24, 32, 48, 64, 80).\n */\nexport const defaultSpacing = {\n xs: '0.25rem', // 4px — 0.5× base\n sm: '0.5rem', // 8px — 1× base\n md: '1rem', // 16px — 2× base\n lg: '1.5rem', // 24px — 3× base\n xl: '2rem', // 32px — 4× base\n '2xl': '3rem', // 48px — 6× base\n '3xl': '4rem', // 64px — 8× base\n '4xl': '6rem', // 96px — 12× base\n} as const;\n\nexport const defaultTypography = {\n fontFamily: {\n base: \"'IBM Plex Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif\",\n heading:\n \"'IBM Plex Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif\",\n mono: \"'IBM Plex Mono', 'Courier New', monospace\",\n },\n fontSize: {\n xs: '0.75rem',\n sm: '0.875rem',\n base: '1rem',\n lg: '1.125rem',\n xl: '1.25rem',\n '2xl': '1.5rem',\n '3xl': '1.875rem',\n '4xl': '2.25rem',\n '5xl': '3rem',\n },\n fontWeight: {\n thin: 100,\n light: 300,\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n extrabold: 800,\n },\n lineHeight: {\n none: 1,\n tight: 1.25,\n snug: 1.375,\n normal: 1.5,\n relaxed: 1.625,\n loose: 2,\n },\n} as const;\n\n/**\n * Structured shadow definitions — single source of truth.\n * Web: converted to CSS box-shadow strings via shadowLayersToCSS().\n * React Native: converted to iOS/Android shadow styles via shadowToRN().\n */\nexport const defaultShadowDefinitions: Record<string, ShadowLayer[]> = {\n xs: [{ x: 0, y: 1, blur: 2, spread: 0, color: '#000000', opacity: 0.05 }],\n sm: [\n { x: 0, y: 1, blur: 3, spread: 0, color: '#000000', opacity: 0.1 },\n { x: 0, y: 1, blur: 2, spread: 0, color: '#000000', opacity: 0.06 },\n ],\n md: [\n { x: 0, y: 4, blur: 6, spread: -1, color: '#000000', opacity: 0.1 },\n { x: 0, y: 2, blur: 4, spread: -1, color: '#000000', opacity: 0.06 },\n ],\n lg: [\n { x: 0, y: 10, blur: 15, spread: -3, color: '#000000', opacity: 0.1 },\n { x: 0, y: 4, blur: 6, spread: -2, color: '#000000', opacity: 0.05 },\n ],\n xl: [\n { x: 0, y: 20, blur: 25, spread: -5, color: '#000000', opacity: 0.1 },\n { x: 0, y: 10, blur: 10, spread: -5, color: '#000000', opacity: 0.04 },\n ],\n '2xl': [\n { x: 0, y: 25, blur: 50, spread: -12, color: '#000000', opacity: 0.25 },\n ],\n inner: [\n {\n x: 0,\n y: 2,\n blur: 4,\n spread: 0,\n color: '#000000',\n opacity: 0.06,\n inset: true,\n },\n ],\n};\n\n/** Parse a hex color string (#RGB or #RRGGBB) to { r, g, b }. */\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } {\n const h = hex.replace('#', '');\n const full = h.length === 3 ? h[0] + h[0] + h[1] + h[1] + h[2] + h[2] : h;\n return {\n r: parseInt(full.slice(0, 2), 16),\n g: parseInt(full.slice(2, 4), 16),\n b: parseInt(full.slice(4, 6), 16),\n };\n}\n\n/** Convert structured shadow layers to a CSS box-shadow string. */\nexport function shadowLayersToCSS(layers: ShadowLayer[]): string {\n return layers\n .map(l => {\n const inset = l.inset ? 'inset ' : '';\n const px = (n: number) => (n === 0 ? '0' : `${n}px`);\n const { r, g, b } = hexToRgb(l.color);\n return `${inset}${px(l.x)} ${px(l.y)} ${px(l.blur)} ${px(l.spread)} rgba(${r}, ${g}, ${b}, ${l.opacity})`;\n })\n .join(', ');\n}\n\n/** CSS shadow strings derived from structured definitions. */\nexport const defaultShadows: ThemeShadows = {\n ...(Object.fromEntries(\n Object.entries(defaultShadowDefinitions).map(([k, layers]) => [\n k,\n shadowLayersToCSS(layers),\n ]),\n ) as Omit<ThemeShadows, 'none'>),\n none: 'none',\n};\n\nexport const defaultRadius = {\n none: '0',\n xs: '0.125rem',\n sm: '0.25rem',\n md: '0.375rem',\n lg: '0.5rem',\n xl: '0.75rem',\n '2xl': '1rem',\n '3xl': '1.5rem',\n full: '9999px',\n} as const;\n\nexport const defaultTransitions = {\n duration: { fast: '150ms', base: '300ms', slow: '500ms' },\n timing: {\n ease: 'cubic-bezier(0.4, 0, 0.2, 1)',\n easeIn: 'cubic-bezier(0.4, 0, 1, 1)',\n easeOut: 'cubic-bezier(0, 0, 0.2, 1)',\n easeInOut: 'cubic-bezier(0.4, 0, 0.2, 1)',\n linear: 'linear',\n },\n} as const;\n\nexport const defaultZIndex = {\n dropdown: 1000,\n sticky: 1020,\n fixed: 1030,\n modalBackdrop: 1040,\n modal: 1050,\n popover: 1060,\n tooltip: 1070,\n toast: 1080,\n} as const;\n\nfunction buildLightTheme(colors: Partial<ColorPreset>): Theme {\n const c = { ...defaultColorPreset, ...colors };\n return {\n mode: 'light',\n colors: c as Theme['colors'],\n spacing: { ...defaultSpacing },\n typography: { ...defaultTypography },\n shadows: { ...defaultShadows },\n shadowDefinitions: { ...defaultShadowDefinitions },\n radius: { ...defaultRadius },\n transitions: { ...defaultTransitions },\n zIndex: { ...defaultZIndex },\n };\n}\n\nfunction buildDarkTheme(colors: Partial<ColorPreset>): Theme {\n const base = buildLightTheme(defaultColorPresetDark);\n const c = { ...defaultColorPresetDark, ...colors };\n return { ...base, mode: 'dark', colors: c as Theme['colors'] };\n}\n\n/**\n * Create a theme with your brand colors.\n * Override only what you need – rest uses standard defaults.\n */\nexport function createTheme(overrides: {\n light?: Partial<ColorPreset>;\n dark?: Partial<ColorPreset>;\n}): { light: Theme; dark: Theme } {\n return {\n light: buildLightTheme(overrides.light ?? {}),\n dark: buildDarkTheme(overrides.dark ?? {}),\n };\n}\n\n/**\n * Default theme (standard colors).\n * Use createTheme() to customize – do not ship without reviewing colors.\n */\nexport const defaultTheme = buildLightTheme({});\n","/**\n * Grundtone Branding System\n *\n * Central branding definition — one source of truth for logo assets\n * and brand identity across web and React Native.\n *\n * @example\n * // Use defaults\n * import { defaultBranding } from '@grundtone/core';\n *\n * @example\n * // Override for your brand\n * import { createBranding } from '@grundtone/core';\n * const branding = createBranding({\n * name: 'My App',\n * tagline: 'Build something great',\n * logos: { primary: '/my-logo.png' },\n * });\n */\n\n/** Asset path for a single logo variant. */\nexport interface LogoVariants {\n /** Primary logo (1080×1080) */\n primary: string;\n /** Favicon 32×32 */\n favicon32: string;\n /** Favicon 16×16 */\n favicon16: string;\n /** Apple touch icon (180×180) */\n appleTouchIcon: string;\n /** PWA manifest icon (192×192) */\n pwa192: string;\n /** PWA manifest icon (512×512) */\n pwa512: string;\n}\n\nexport interface BrandingConfig {\n /** Brand name */\n name: string;\n /** Short tagline / description */\n tagline: string;\n /** Logo asset paths per variant */\n logos: LogoVariants;\n}\n\n/** Width and height metadata for each logo variant. */\nexport const LOGO_VARIANT_SIZES: Record<\n keyof LogoVariants,\n { width: number; height: number }\n> = {\n primary: { width: 1080, height: 1080 },\n favicon32: { width: 32, height: 32 },\n favicon16: { width: 16, height: 16 },\n appleTouchIcon: { width: 180, height: 180 },\n pwa192: { width: 192, height: 192 },\n pwa512: { width: 512, height: 512 },\n} as const;\n\n/**\n * Default branding — Grundtone reference assets.\n * Paths are relative to `@grundtone/core/assets/`.\n */\nexport const defaultBranding: BrandingConfig = {\n name: 'Grundtone',\n tagline: 'A cross-platform design system',\n logos: {\n primary: '@grundtone/core/assets/logo.png',\n favicon32: '@grundtone/core/assets/logo-32x32.png',\n favicon16: '@grundtone/core/assets/logo-16x16.png',\n appleTouchIcon: '@grundtone/core/assets/logo-180x180.png',\n pwa192: '@grundtone/core/assets/logo-192x192.png',\n pwa512: '@grundtone/core/assets/logo-512x512.png',\n },\n};\n\n/**\n * Create a branding config with your brand identity.\n * Override only what you need — the rest uses Grundtone defaults.\n */\nexport function createBranding(\n overrides?: Partial<BrandingConfig>,\n): BrandingConfig {\n if (!overrides) return { ...defaultBranding };\n\n return {\n name: overrides.name ?? defaultBranding.name,\n tagline: overrides.tagline ?? defaultBranding.tagline,\n logos: {\n ...defaultBranding.logos,\n ...overrides.logos,\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/config.ts","../src/theme.ts","../src/theme-preset.ts","../src/toggle.ts","../src/branding.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export interface GrundtoneConfig {\n /**\n * Prefix for component names in auto-import contexts (Nuxt).\n * Also used as CSS class prefix for all components.\n *\n * @default 'GT'\n *\n * @example\n * // Default: <GTButton>, .gt-btn\n * // Custom: <KHButton>, .kh-btn\n * defineGrundtoneConfig({ prefix: 'KH' })\n */\n prefix: string;\n\n /**\n * Default color for icons. Uses any valid CSS color value.\n * Icons inherit parent text color via `currentColor` by default.\n *\n * @default 'currentColor'\n *\n * @example\n * defineGrundtoneConfig({ iconColor: 'var(--color-text-secondary)' })\n */\n iconColor: string;\n}\n\nconst defaultConfig: GrundtoneConfig = {\n prefix: 'GT',\n iconColor: 'currentColor',\n};\n\nlet currentConfig: GrundtoneConfig = { ...defaultConfig };\n\n/**\n * Configure Grundtone for your project. Call this once at app startup,\n * before any components are rendered.\n *\n * @example\n * // In main.ts or nuxt.config.ts\n * import { defineGrundtoneConfig } from '@grundtone/core';\n *\n * defineGrundtoneConfig({\n * prefix: 'KH', // Components become <KHButton>, CSS becomes .kh-btn\n * });\n */\nexport function defineGrundtoneConfig(\n config: Partial<GrundtoneConfig>,\n): GrundtoneConfig {\n currentConfig = { ...defaultConfig, ...config };\n return currentConfig;\n}\n\n/**\n * Get the current Grundtone configuration.\n */\nexport function getGrundtoneConfig(): GrundtoneConfig {\n return currentConfig;\n}\n\n/**\n * Get the CSS class prefix (lowercase version of prefix).\n *\n * @example\n * getClassPrefix() // 'gt' (default)\n * // After defineGrundtoneConfig({ prefix: 'KH' })\n * getClassPrefix() // 'kh'\n */\nexport function getClassPrefix(): string {\n return currentConfig.prefix.toLowerCase();\n}\n\n/**\n * Get the default icon color.\n *\n * @example\n * getIconColor() // 'currentColor' (default)\n * // After defineGrundtoneConfig({ iconColor: 'var(--color-primary)' })\n * getIconColor() // 'var(--color-primary)'\n */\nexport function getIconColor(): string {\n return currentConfig.iconColor;\n}\n","import type { InjectionKey, Ref } from 'vue';\n\nexport type ThemeMode = 'light' | 'dark' | 'auto';\n\n/**\n * Semantic color tokens – configure these to match your brand.\n * All keys map to CSS var: --color-{kebab-case-key}\n *\n * Shade-based naming: `primaryLight`/`primaryDark` instead of state-based\n * (`primaryHover`/`primaryActive`). Components decide which shade to use\n * for hover, active, tint, etc.\n */\nexport interface ThemeColors {\n // Brand\n primary: string;\n primaryLight: string;\n primaryDark: string;\n onPrimary: string;\n secondary: string;\n secondaryLight: string;\n secondaryDark: string;\n // Status\n success: string;\n successLight: string;\n successDark: string;\n warning: string;\n warningLight: string;\n warningDark: string;\n error: string;\n errorLight: string;\n errorDark: string;\n info: string;\n infoLight: string;\n infoDark: string;\n // Surface\n background: string;\n backgroundAlt: string;\n surface: string;\n surfaceAlt: string;\n surfaceRaised: string;\n surfaceOverlay: string;\n modalBackdrop: string;\n // Text\n text: string;\n textSecondary: string;\n textTertiary: string;\n textInverse: string;\n textPlaceholder: string;\n textDisabled: string;\n // Border\n borderLight: string;\n borderMedium: string;\n borderStrong: string;\n borderInverse: string;\n // Focus\n focus: string;\n focusRing: string;\n // Neutral\n neutral: string;\n}\n\nexport interface ThemeSpacing {\n xs: string;\n sm: string;\n md: string;\n lg: string;\n xl: string;\n '2xl': string;\n '3xl': string;\n '4xl': string;\n}\n\nexport interface ThemeTypography {\n fontFamily: {\n base: string;\n heading: string;\n mono: string;\n };\n fontSize: {\n xs: string;\n sm: string;\n base: string;\n lg: string;\n xl: string;\n '2xl': string;\n '3xl': string;\n '4xl': string;\n '5xl': string;\n };\n fontWeight: {\n thin: number;\n light: number;\n normal: number;\n medium: number;\n semibold: number;\n bold: number;\n extrabold: number;\n };\n lineHeight: {\n none: number;\n tight: number;\n snug: number;\n normal: number;\n relaxed: number;\n loose: number;\n };\n}\n\nexport interface ThemeShadows {\n xs: string;\n sm: string;\n md: string;\n lg: string;\n xl: string;\n '2xl': string;\n inner: string;\n none: string;\n}\n\n/**\n * Structured shadow layer — platform-agnostic description of a single\n * CSS box-shadow layer. Web converts to CSS string; React Native converts\n * to iOS shadowColor/Offset/Opacity/Radius + Android elevation.\n */\nexport interface ShadowLayer {\n x: number;\n y: number;\n blur: number;\n spread: number;\n color: string;\n opacity: number;\n inset?: boolean;\n}\n\nexport interface ThemeRadius {\n none: string;\n xs: string;\n sm: string;\n md: string;\n lg: string;\n xl: string;\n '2xl': string;\n '3xl': string;\n full: string;\n}\n\nexport interface ThemeTransitions {\n duration: {\n fast: string;\n base: string;\n slow: string;\n };\n timing: {\n ease: string;\n easeIn: string;\n easeOut: string;\n easeInOut: string;\n linear: string;\n };\n}\n\nexport interface ThemeZIndex {\n dropdown: number;\n sticky: number;\n fixed: number;\n modalBackdrop: number;\n modal: number;\n popover: number;\n tooltip: number;\n toast: number;\n}\n\nexport interface Theme {\n mode: ThemeMode;\n colors: ThemeColors;\n spacing: ThemeSpacing;\n typography: ThemeTypography;\n shadows: ThemeShadows;\n shadowDefinitions: Record<string, ShadowLayer[]>;\n radius: ThemeRadius;\n transitions: ThemeTransitions;\n zIndex: ThemeZIndex;\n}\n\nexport interface ThemeProviderContext {\n theme: Readonly<Ref<Theme>>;\n mode: Readonly<Ref<ThemeMode>>;\n isDark: Readonly<Ref<boolean>>;\n isLight: Readonly<Ref<boolean>>;\n setMode: (mode: ThemeMode) => void;\n toggleMode: () => void;\n applyTheme: () => void;\n}\n\nexport const THEME_INJECTION_KEY: InjectionKey<ThemeProviderContext> =\n Symbol('grundtone-theme');\n\n/**\n * Theme configuration: either a single partial theme (applies to both modes)\n * or separate light/dark overrides for proper dark mode support.\n */\nexport type ThemeConfig =\n | Partial<Theme>\n | { light?: Partial<Theme>; dark?: Partial<Theme> };\n\nexport interface ThemeProviderProps {\n mode?: ThemeMode;\n theme?: ThemeConfig;\n enableTransitions?: boolean;\n persistMode?: boolean;\n storageKey?: string;\n}\n","/**\n * Grundtone Theme Preset\n *\n * Standard reference colors. When installing Grundtone, you MUST configure your\n * theme colors - either customize this preset or provide your own.\n * The design system will not apply colors until you explicitly pass a theme.\n *\n * @example\n * // Nuxt: Configure in nuxt.config.ts\n * grundtone: {\n * theme: {\n * light: { colors: { primary: '#your-brand', ... } },\n * dark: { colors: { primary: '#your-brand-dark', ... } }\n * }\n * }\n *\n * @example\n * // Vue: Pass to ThemeProvider\n * import { defaultTheme, createTheme } from '@grundtone/core';\n * <ThemeProvider :theme=\"defaultTheme\" />\n */\n\nimport type { ShadowLayer, Theme, ThemeShadows } from './theme';\n\nexport type ColorPreset = Theme['colors'];\n\n/**\n * Semantic color keys – all colors your app should configure.\n */\nexport const SEMANTIC_COLOR_KEYS = [\n // Brand\n 'primary',\n 'primaryLight',\n 'primaryDark',\n 'onPrimary',\n 'secondary',\n 'secondaryLight',\n 'secondaryDark',\n // Status\n 'success',\n 'successLight',\n 'successDark',\n 'warning',\n 'warningLight',\n 'warningDark',\n 'error',\n 'errorLight',\n 'errorDark',\n 'info',\n 'infoLight',\n 'infoDark',\n // Surface\n 'background',\n 'backgroundAlt',\n 'surface',\n 'surfaceAlt',\n 'surfaceRaised',\n 'surfaceOverlay',\n 'modalBackdrop',\n // Text\n 'text',\n 'textSecondary',\n 'textTertiary',\n 'textInverse',\n 'textPlaceholder',\n 'textDisabled',\n // Border\n 'borderLight',\n 'borderMedium',\n 'borderStrong',\n 'borderInverse',\n // Focus\n 'focus',\n 'focusRing',\n // Neutral\n 'neutral',\n] as const;\n\n/**\n * Standard reference colors (Bootstrap-inspired).\n * Copy and customize – do not use passively without reviewing.\n */\nexport const defaultColorPreset: ColorPreset = {\n // Brand\n primary: '#0059b3',\n primaryLight: '#3381cc',\n primaryDark: '#003a7a',\n onPrimary: '#ffffff',\n secondary: '#e9ecef',\n secondaryLight: '#f8f9fa',\n secondaryDark: '#dee2e6',\n // Status\n success: '#198754',\n successLight: '#d1e7dd',\n successDark: '#146c43',\n warning: '#ffc107',\n warningLight: '#fff3cd',\n warningDark: '#cc9a06',\n error: '#dc3545',\n errorLight: '#f8d7da',\n errorDark: '#b02a37',\n info: '#0dcaf0',\n infoLight: '#cff4fc',\n infoDark: '#0aa2c0',\n // Surface\n background: '#ffffff',\n backgroundAlt: '#fafafa',\n surface: '#f8f9fa',\n surfaceAlt: '#f0f1f2',\n surfaceRaised: '#ffffff',\n surfaceOverlay: 'rgba(255,255,255,0.95)',\n modalBackdrop: 'rgba(0,0,0,0.5)',\n // Text\n text: '#212529',\n textSecondary: '#6c757d',\n textTertiary: '#adb5bd',\n textInverse: '#ffffff',\n textPlaceholder: '#a3a3a3',\n textDisabled: '#d4d4d4',\n // Border\n borderLight: '#dee2e6',\n borderMedium: '#ced4da',\n borderStrong: '#adb5bd',\n borderInverse: 'rgba(255,255,255,0.2)',\n // Focus\n focus: '#0059b3',\n focusRing: 'rgba(0,89,179,0.25)',\n // Neutral\n neutral: '#6c757d',\n};\n\n/**\n * Dark mode preset (standard reference).\n */\nexport const defaultColorPresetDark: ColorPreset = {\n // Brand\n primary: '#4dabf7',\n primaryLight: '#74c0fc',\n primaryDark: '#339af0',\n onPrimary: '#121212',\n secondary: '#343a40',\n secondaryLight: '#495057',\n secondaryDark: '#2b3035',\n // Status\n success: '#51cf66',\n successLight: '#1a3d20',\n successDark: '#40c057',\n warning: '#ffd43b',\n warningLight: '#3d3a1a',\n warningDark: '#fab005',\n error: '#ff6b6b',\n errorLight: '#3d1a1c',\n errorDark: '#fa5252',\n info: '#4dabf7',\n infoLight: '#1a2e3d',\n infoDark: '#339af0',\n // Surface\n background: '#121212',\n backgroundAlt: '#1a1a1a',\n surface: '#1e1e1e',\n surfaceAlt: '#252525',\n surfaceRaised: '#2a2a2a',\n surfaceOverlay: 'rgba(30,30,30,0.95)',\n modalBackdrop: 'rgba(0,0,0,0.7)',\n // Text\n text: '#ffffff',\n textSecondary: '#b0b0b0',\n textTertiary: '#808080',\n textInverse: '#121212',\n textPlaceholder: '#666666',\n textDisabled: '#4a4a4a',\n // Border\n borderLight: '#404040',\n borderMedium: '#505050',\n borderStrong: '#606060',\n borderInverse: 'rgba(0,0,0,0.3)',\n // Focus\n focus: '#4dabf7',\n focusRing: 'rgba(77,171,247,0.25)',\n // Neutral\n neutral: '#9e9e9e',\n};\n\n/**\n * 8px base unit spacing system.\n * All values are multiples of the 8px grid (4px = 0.5×, 8px = 1×, 16px = 2×, etc.).\n * Web: used as rem via CSS custom properties (--space-*).\n * React Native: convert to numbers (4, 8, 16, 24, 32, 48, 64, 80).\n */\nexport const defaultSpacing = {\n xs: '0.25rem', // 4px — 0.5× base\n sm: '0.5rem', // 8px — 1× base\n md: '1rem', // 16px — 2× base\n lg: '1.5rem', // 24px — 3× base\n xl: '2rem', // 32px — 4× base\n '2xl': '3rem', // 48px — 6× base\n '3xl': '4rem', // 64px — 8× base\n '4xl': '6rem', // 96px — 12× base\n} as const;\n\nexport const defaultTypography = {\n fontFamily: {\n base: \"'IBM Plex Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif\",\n heading:\n \"'IBM Plex Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif\",\n mono: \"'IBM Plex Mono', 'Courier New', monospace\",\n },\n fontSize: {\n xs: '0.75rem',\n sm: '0.875rem',\n base: '1rem',\n lg: '1.125rem',\n xl: '1.25rem',\n '2xl': '1.5rem',\n '3xl': '1.875rem',\n '4xl': '2.25rem',\n '5xl': '3rem',\n },\n fontWeight: {\n thin: 100,\n light: 300,\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n extrabold: 800,\n },\n lineHeight: {\n none: 1,\n tight: 1.25,\n snug: 1.375,\n normal: 1.5,\n relaxed: 1.625,\n loose: 2,\n },\n} as const;\n\n/**\n * Structured shadow definitions — single source of truth.\n * Web: converted to CSS box-shadow strings via shadowLayersToCSS().\n * React Native: converted to iOS/Android shadow styles via shadowToRN().\n */\nexport const defaultShadowDefinitions: Record<string, ShadowLayer[]> = {\n xs: [{ x: 0, y: 1, blur: 2, spread: 0, color: '#000000', opacity: 0.05 }],\n sm: [\n { x: 0, y: 1, blur: 3, spread: 0, color: '#000000', opacity: 0.1 },\n { x: 0, y: 1, blur: 2, spread: 0, color: '#000000', opacity: 0.06 },\n ],\n md: [\n { x: 0, y: 4, blur: 6, spread: -1, color: '#000000', opacity: 0.1 },\n { x: 0, y: 2, blur: 4, spread: -1, color: '#000000', opacity: 0.06 },\n ],\n lg: [\n { x: 0, y: 10, blur: 15, spread: -3, color: '#000000', opacity: 0.1 },\n { x: 0, y: 4, blur: 6, spread: -2, color: '#000000', opacity: 0.05 },\n ],\n xl: [\n { x: 0, y: 20, blur: 25, spread: -5, color: '#000000', opacity: 0.1 },\n { x: 0, y: 10, blur: 10, spread: -5, color: '#000000', opacity: 0.04 },\n ],\n '2xl': [\n { x: 0, y: 25, blur: 50, spread: -12, color: '#000000', opacity: 0.25 },\n ],\n inner: [\n {\n x: 0,\n y: 2,\n blur: 4,\n spread: 0,\n color: '#000000',\n opacity: 0.06,\n inset: true,\n },\n ],\n};\n\n/** Parse a hex color string (#RGB or #RRGGBB) to { r, g, b }. */\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } {\n const h = hex.replace('#', '');\n const full = h.length === 3 ? h[0] + h[0] + h[1] + h[1] + h[2] + h[2] : h;\n return {\n r: parseInt(full.slice(0, 2), 16),\n g: parseInt(full.slice(2, 4), 16),\n b: parseInt(full.slice(4, 6), 16),\n };\n}\n\n/** Convert structured shadow layers to a CSS box-shadow string. */\nexport function shadowLayersToCSS(layers: ShadowLayer[]): string {\n return layers\n .map(l => {\n const inset = l.inset ? 'inset ' : '';\n const px = (n: number) => (n === 0 ? '0' : `${n}px`);\n const { r, g, b } = hexToRgb(l.color);\n return `${inset}${px(l.x)} ${px(l.y)} ${px(l.blur)} ${px(l.spread)} rgba(${r}, ${g}, ${b}, ${l.opacity})`;\n })\n .join(', ');\n}\n\n/** CSS shadow strings derived from structured definitions. */\nexport const defaultShadows: ThemeShadows = {\n ...(Object.fromEntries(\n Object.entries(defaultShadowDefinitions).map(([k, layers]) => [\n k,\n shadowLayersToCSS(layers),\n ]),\n ) as Omit<ThemeShadows, 'none'>),\n none: 'none',\n};\n\nexport const defaultRadius = {\n none: '0',\n xs: '0.125rem',\n sm: '0.25rem',\n md: '0.375rem',\n lg: '0.5rem',\n xl: '0.75rem',\n '2xl': '1rem',\n '3xl': '1.5rem',\n full: '9999px',\n} as const;\n\nexport const defaultTransitions = {\n duration: { fast: '150ms', base: '300ms', slow: '500ms' },\n timing: {\n ease: 'cubic-bezier(0.4, 0, 0.2, 1)',\n easeIn: 'cubic-bezier(0.4, 0, 1, 1)',\n easeOut: 'cubic-bezier(0, 0, 0.2, 1)',\n easeInOut: 'cubic-bezier(0.4, 0, 0.2, 1)',\n linear: 'linear',\n },\n} as const;\n\nexport const defaultZIndex = {\n dropdown: 1000,\n sticky: 1020,\n fixed: 1030,\n modalBackdrop: 1040,\n modal: 1050,\n popover: 1060,\n tooltip: 1070,\n toast: 1080,\n} as const;\n\nfunction buildLightTheme(colors: Partial<ColorPreset>): Theme {\n const c = { ...defaultColorPreset, ...colors };\n return {\n mode: 'light',\n colors: c as Theme['colors'],\n spacing: { ...defaultSpacing },\n typography: { ...defaultTypography },\n shadows: { ...defaultShadows },\n shadowDefinitions: { ...defaultShadowDefinitions },\n radius: { ...defaultRadius },\n transitions: { ...defaultTransitions },\n zIndex: { ...defaultZIndex },\n };\n}\n\nfunction buildDarkTheme(colors: Partial<ColorPreset>): Theme {\n const base = buildLightTheme(defaultColorPresetDark);\n const c = { ...defaultColorPresetDark, ...colors };\n return { ...base, mode: 'dark', colors: c as Theme['colors'] };\n}\n\n/**\n * Create a theme with your brand colors.\n * Override only what you need – rest uses standard defaults.\n */\nexport function createTheme(overrides: {\n light?: Partial<ColorPreset>;\n dark?: Partial<ColorPreset>;\n}): { light: Theme; dark: Theme } {\n return {\n light: buildLightTheme(overrides.light ?? {}),\n dark: buildDarkTheme(overrides.dark ?? {}),\n };\n}\n\n/**\n * Default theme (standard colors).\n * Use createTheme() to customize – do not ship without reviewing colors.\n */\nexport const defaultTheme = buildLightTheme({});\n","/**\n * Toggle switch dimensions — single source of truth for all platforms.\n * Track width/height and thumb diameter in pixels.\n */\nexport const TOGGLE_SIZES = {\n sm: { width: 36, height: 20, thumb: 16 },\n md: { width: 44, height: 24, thumb: 20 },\n lg: { width: 52, height: 28, thumb: 24 },\n} as const;\n\nexport type ToggleSize = keyof typeof TOGGLE_SIZES;\n","/**\n * Grundtone Branding System\n *\n * Central branding definition — one source of truth for logo assets\n * and brand identity across web and React Native.\n *\n * @example\n * // Use defaults\n * import { defaultBranding } from '@grundtone/core';\n *\n * @example\n * // Override for your brand\n * import { createBranding } from '@grundtone/core';\n * const branding = createBranding({\n * name: 'My App',\n * tagline: 'Build something great',\n * logos: { primary: '/my-logo.png' },\n * });\n */\n\n/** Asset path for a single logo variant. */\nexport interface LogoVariants {\n /** Primary logo (1080×1080) */\n primary: string;\n /** Favicon 32×32 */\n favicon32: string;\n /** Favicon 16×16 */\n favicon16: string;\n /** Apple touch icon (180×180) */\n appleTouchIcon: string;\n /** PWA manifest icon (192×192) */\n pwa192: string;\n /** PWA manifest icon (512×512) */\n pwa512: string;\n}\n\nexport interface BrandingConfig {\n /** Brand name */\n name: string;\n /** Short tagline / description */\n tagline: string;\n /** Logo asset paths per variant */\n logos: LogoVariants;\n}\n\n/** Width and height metadata for each logo variant. */\nexport const LOGO_VARIANT_SIZES: Record<\n keyof LogoVariants,\n { width: number; height: number }\n> = {\n primary: { width: 1080, height: 1080 },\n favicon32: { width: 32, height: 32 },\n favicon16: { width: 16, height: 16 },\n appleTouchIcon: { width: 180, height: 180 },\n pwa192: { width: 192, height: 192 },\n pwa512: { width: 512, height: 512 },\n} as const;\n\n/**\n * Default branding — Grundtone reference assets.\n * Paths are relative to `@grundtone/core/assets/`.\n */\nexport const defaultBranding: BrandingConfig = {\n name: 'Grundtone',\n tagline: 'A cross-platform design system',\n logos: {\n primary: '@grundtone/core/assets/logo.png',\n favicon32: '@grundtone/core/assets/logo-32x32.png',\n favicon16: '@grundtone/core/assets/logo-16x16.png',\n appleTouchIcon: '@grundtone/core/assets/logo-180x180.png',\n pwa192: '@grundtone/core/assets/logo-192x192.png',\n pwa512: '@grundtone/core/assets/logo-512x512.png',\n },\n};\n\n/**\n * Create a branding config with your brand identity.\n * Override only what you need — the rest uses Grundtone defaults.\n */\nexport function createBranding(\n overrides?: Partial<BrandingConfig>,\n): BrandingConfig {\n if (!overrides) return { ...defaultBranding };\n\n return {\n name: overrides.name ?? defaultBranding.name,\n tagline: overrides.tagline ?? defaultBranding.tagline,\n logos: {\n ...defaultBranding.logos,\n ...overrides.logos,\n },\n };\n}\n"]}
package/dist/index.mjs CHANGED
@@ -1,3 +1,23 @@
1
+ // src/config.ts
2
+ var defaultConfig = {
3
+ prefix: "GT",
4
+ iconColor: "currentColor"
5
+ };
6
+ var currentConfig = { ...defaultConfig };
7
+ function defineGrundtoneConfig(config) {
8
+ currentConfig = { ...defaultConfig, ...config };
9
+ return currentConfig;
10
+ }
11
+ function getGrundtoneConfig() {
12
+ return currentConfig;
13
+ }
14
+ function getClassPrefix() {
15
+ return currentConfig.prefix.toLowerCase();
16
+ }
17
+ function getIconColor() {
18
+ return currentConfig.iconColor;
19
+ }
20
+
1
21
  // src/theme.ts
2
22
  var THEME_INJECTION_KEY = /* @__PURE__ */ Symbol("grundtone-theme");
3
23
 
@@ -56,9 +76,9 @@ var defaultColorPreset = {
56
76
  primaryLight: "#3381cc",
57
77
  primaryDark: "#003a7a",
58
78
  onPrimary: "#ffffff",
59
- secondary: "#6c757d",
60
- secondaryLight: "#868e96",
61
- secondaryDark: "#494f54",
79
+ secondary: "#e9ecef",
80
+ secondaryLight: "#f8f9fa",
81
+ secondaryDark: "#dee2e6",
62
82
  // Status
63
83
  success: "#198754",
64
84
  successLight: "#d1e7dd",
@@ -104,9 +124,9 @@ var defaultColorPresetDark = {
104
124
  primaryLight: "#74c0fc",
105
125
  primaryDark: "#339af0",
106
126
  onPrimary: "#121212",
107
- secondary: "#adb5bd",
108
- secondaryLight: "#ced4da",
109
- secondaryDark: "#868e96",
127
+ secondary: "#343a40",
128
+ secondaryLight: "#495057",
129
+ secondaryDark: "#2b3035",
110
130
  // Status
111
131
  success: "#51cf66",
112
132
  successLight: "#1a3d20",
@@ -316,6 +336,13 @@ function createTheme(overrides) {
316
336
  }
317
337
  var defaultTheme = buildLightTheme({});
318
338
 
339
+ // src/toggle.ts
340
+ var TOGGLE_SIZES = {
341
+ sm: { width: 36, height: 20, thumb: 16 },
342
+ md: { width: 44, height: 24, thumb: 20 },
343
+ lg: { width: 52, height: 28, thumb: 24 }
344
+ };
345
+
319
346
  // src/branding.ts
320
347
  var LOGO_VARIANT_SIZES = {
321
348
  primary: { width: 1080, height: 1080 },
@@ -349,6 +376,6 @@ function createBranding(overrides) {
349
376
  };
350
377
  }
351
378
 
352
- export { LOGO_VARIANT_SIZES, SEMANTIC_COLOR_KEYS, THEME_INJECTION_KEY, createBranding, createTheme, defaultBranding, defaultColorPreset, defaultColorPresetDark, defaultRadius, defaultShadowDefinitions, defaultShadows, defaultSpacing, defaultTheme, defaultTransitions, defaultTypography, defaultZIndex, hexToRgb, shadowLayersToCSS };
379
+ export { LOGO_VARIANT_SIZES, SEMANTIC_COLOR_KEYS, THEME_INJECTION_KEY, TOGGLE_SIZES, createBranding, createTheme, defaultBranding, defaultColorPreset, defaultColorPresetDark, defaultRadius, defaultShadowDefinitions, defaultShadows, defaultSpacing, defaultTheme, defaultTransitions, defaultTypography, defaultZIndex, defineGrundtoneConfig, getClassPrefix, getGrundtoneConfig, getIconColor, hexToRgb, shadowLayersToCSS };
353
380
  //# sourceMappingURL=index.mjs.map
354
381
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/theme.ts","../src/theme-preset.ts","../src/branding.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { InjectionKey, Ref } from 'vue';\n\nexport type ThemeMode = 'light' | 'dark' | 'auto';\n\n/**\n * Semantic color tokens – configure these to match your brand.\n * All keys map to CSS var: --color-{kebab-case-key}\n *\n * Shade-based naming: `primaryLight`/`primaryDark` instead of state-based\n * (`primaryHover`/`primaryActive`). Components decide which shade to use\n * for hover, active, tint, etc.\n */\nexport interface ThemeColors {\n // Brand\n primary: string;\n primaryLight: string;\n primaryDark: string;\n onPrimary: string;\n secondary: string;\n secondaryLight: string;\n secondaryDark: string;\n // Status\n success: string;\n successLight: string;\n successDark: string;\n warning: string;\n warningLight: string;\n warningDark: string;\n error: string;\n errorLight: string;\n errorDark: string;\n info: string;\n infoLight: string;\n infoDark: string;\n // Surface\n background: string;\n backgroundAlt: string;\n surface: string;\n surfaceAlt: string;\n surfaceRaised: string;\n surfaceOverlay: string;\n modalBackdrop: string;\n // Text\n text: string;\n textSecondary: string;\n textTertiary: string;\n textInverse: string;\n textPlaceholder: string;\n textDisabled: string;\n // Border\n borderLight: string;\n borderMedium: string;\n borderStrong: string;\n borderInverse: string;\n // Focus\n focus: string;\n focusRing: string;\n // Neutral\n neutral: string;\n}\n\nexport interface ThemeSpacing {\n xs: string;\n sm: string;\n md: string;\n lg: string;\n xl: string;\n '2xl': string;\n '3xl': string;\n '4xl': string;\n}\n\nexport interface ThemeTypography {\n fontFamily: {\n base: string;\n heading: string;\n mono: string;\n };\n fontSize: {\n xs: string;\n sm: string;\n base: string;\n lg: string;\n xl: string;\n '2xl': string;\n '3xl': string;\n '4xl': string;\n '5xl': string;\n };\n fontWeight: {\n thin: number;\n light: number;\n normal: number;\n medium: number;\n semibold: number;\n bold: number;\n extrabold: number;\n };\n lineHeight: {\n none: number;\n tight: number;\n snug: number;\n normal: number;\n relaxed: number;\n loose: number;\n };\n}\n\nexport interface ThemeShadows {\n xs: string;\n sm: string;\n md: string;\n lg: string;\n xl: string;\n '2xl': string;\n inner: string;\n none: string;\n}\n\n/**\n * Structured shadow layer — platform-agnostic description of a single\n * CSS box-shadow layer. Web converts to CSS string; React Native converts\n * to iOS shadowColor/Offset/Opacity/Radius + Android elevation.\n */\nexport interface ShadowLayer {\n x: number;\n y: number;\n blur: number;\n spread: number;\n color: string;\n opacity: number;\n inset?: boolean;\n}\n\nexport interface ThemeRadius {\n none: string;\n xs: string;\n sm: string;\n md: string;\n lg: string;\n xl: string;\n '2xl': string;\n '3xl': string;\n full: string;\n}\n\nexport interface ThemeTransitions {\n duration: {\n fast: string;\n base: string;\n slow: string;\n };\n timing: {\n ease: string;\n easeIn: string;\n easeOut: string;\n easeInOut: string;\n linear: string;\n };\n}\n\nexport interface ThemeZIndex {\n dropdown: number;\n sticky: number;\n fixed: number;\n modalBackdrop: number;\n modal: number;\n popover: number;\n tooltip: number;\n toast: number;\n}\n\nexport interface Theme {\n mode: ThemeMode;\n colors: ThemeColors;\n spacing: ThemeSpacing;\n typography: ThemeTypography;\n shadows: ThemeShadows;\n shadowDefinitions: Record<string, ShadowLayer[]>;\n radius: ThemeRadius;\n transitions: ThemeTransitions;\n zIndex: ThemeZIndex;\n}\n\nexport interface ThemeProviderContext {\n theme: Readonly<Ref<Theme>>;\n mode: Readonly<Ref<ThemeMode>>;\n isDark: Readonly<Ref<boolean>>;\n isLight: Readonly<Ref<boolean>>;\n setMode: (mode: ThemeMode) => void;\n toggleMode: () => void;\n applyTheme: () => void;\n}\n\nexport const THEME_INJECTION_KEY: InjectionKey<ThemeProviderContext> =\n Symbol('grundtone-theme');\n\n/**\n * Theme configuration: either a single partial theme (applies to both modes)\n * or separate light/dark overrides for proper dark mode support.\n */\nexport type ThemeConfig =\n | Partial<Theme>\n | { light?: Partial<Theme>; dark?: Partial<Theme> };\n\nexport interface ThemeProviderProps {\n mode?: ThemeMode;\n theme?: ThemeConfig;\n enableTransitions?: boolean;\n persistMode?: boolean;\n storageKey?: string;\n}\n","/**\n * Grundtone Theme Preset\n *\n * Standard reference colors. When installing Grundtone, you MUST configure your\n * theme colors - either customize this preset or provide your own.\n * The design system will not apply colors until you explicitly pass a theme.\n *\n * @example\n * // Nuxt: Configure in nuxt.config.ts\n * grundtone: {\n * theme: {\n * light: { colors: { primary: '#your-brand', ... } },\n * dark: { colors: { primary: '#your-brand-dark', ... } }\n * }\n * }\n *\n * @example\n * // Vue: Pass to ThemeProvider\n * import { defaultTheme, createTheme } from '@grundtone/core';\n * <ThemeProvider :theme=\"defaultTheme\" />\n */\n\nimport type { ShadowLayer, Theme, ThemeShadows } from './theme';\n\nexport type ColorPreset = Theme['colors'];\n\n/**\n * Semantic color keys – all colors your app should configure.\n */\nexport const SEMANTIC_COLOR_KEYS = [\n // Brand\n 'primary',\n 'primaryLight',\n 'primaryDark',\n 'onPrimary',\n 'secondary',\n 'secondaryLight',\n 'secondaryDark',\n // Status\n 'success',\n 'successLight',\n 'successDark',\n 'warning',\n 'warningLight',\n 'warningDark',\n 'error',\n 'errorLight',\n 'errorDark',\n 'info',\n 'infoLight',\n 'infoDark',\n // Surface\n 'background',\n 'backgroundAlt',\n 'surface',\n 'surfaceAlt',\n 'surfaceRaised',\n 'surfaceOverlay',\n 'modalBackdrop',\n // Text\n 'text',\n 'textSecondary',\n 'textTertiary',\n 'textInverse',\n 'textPlaceholder',\n 'textDisabled',\n // Border\n 'borderLight',\n 'borderMedium',\n 'borderStrong',\n 'borderInverse',\n // Focus\n 'focus',\n 'focusRing',\n // Neutral\n 'neutral',\n] as const;\n\n/**\n * Standard reference colors (Bootstrap-inspired).\n * Copy and customize – do not use passively without reviewing.\n */\nexport const defaultColorPreset: ColorPreset = {\n // Brand\n primary: '#0059b3',\n primaryLight: '#3381cc',\n primaryDark: '#003a7a',\n onPrimary: '#ffffff',\n secondary: '#6c757d',\n secondaryLight: '#868e96',\n secondaryDark: '#494f54',\n // Status\n success: '#198754',\n successLight: '#d1e7dd',\n successDark: '#146c43',\n warning: '#ffc107',\n warningLight: '#fff3cd',\n warningDark: '#cc9a06',\n error: '#dc3545',\n errorLight: '#f8d7da',\n errorDark: '#b02a37',\n info: '#0dcaf0',\n infoLight: '#cff4fc',\n infoDark: '#0aa2c0',\n // Surface\n background: '#ffffff',\n backgroundAlt: '#fafafa',\n surface: '#f8f9fa',\n surfaceAlt: '#f0f1f2',\n surfaceRaised: '#ffffff',\n surfaceOverlay: 'rgba(255,255,255,0.95)',\n modalBackdrop: 'rgba(0,0,0,0.5)',\n // Text\n text: '#212529',\n textSecondary: '#6c757d',\n textTertiary: '#adb5bd',\n textInverse: '#ffffff',\n textPlaceholder: '#a3a3a3',\n textDisabled: '#d4d4d4',\n // Border\n borderLight: '#dee2e6',\n borderMedium: '#ced4da',\n borderStrong: '#adb5bd',\n borderInverse: 'rgba(255,255,255,0.2)',\n // Focus\n focus: '#0059b3',\n focusRing: 'rgba(0,89,179,0.25)',\n // Neutral\n neutral: '#6c757d',\n};\n\n/**\n * Dark mode preset (standard reference).\n */\nexport const defaultColorPresetDark: ColorPreset = {\n // Brand\n primary: '#4dabf7',\n primaryLight: '#74c0fc',\n primaryDark: '#339af0',\n onPrimary: '#121212',\n secondary: '#adb5bd',\n secondaryLight: '#ced4da',\n secondaryDark: '#868e96',\n // Status\n success: '#51cf66',\n successLight: '#1a3d20',\n successDark: '#40c057',\n warning: '#ffd43b',\n warningLight: '#3d3a1a',\n warningDark: '#fab005',\n error: '#ff6b6b',\n errorLight: '#3d1a1c',\n errorDark: '#fa5252',\n info: '#4dabf7',\n infoLight: '#1a2e3d',\n infoDark: '#339af0',\n // Surface\n background: '#121212',\n backgroundAlt: '#1a1a1a',\n surface: '#1e1e1e',\n surfaceAlt: '#252525',\n surfaceRaised: '#2a2a2a',\n surfaceOverlay: 'rgba(30,30,30,0.95)',\n modalBackdrop: 'rgba(0,0,0,0.7)',\n // Text\n text: '#ffffff',\n textSecondary: '#b0b0b0',\n textTertiary: '#808080',\n textInverse: '#121212',\n textPlaceholder: '#666666',\n textDisabled: '#4a4a4a',\n // Border\n borderLight: '#404040',\n borderMedium: '#505050',\n borderStrong: '#606060',\n borderInverse: 'rgba(0,0,0,0.3)',\n // Focus\n focus: '#4dabf7',\n focusRing: 'rgba(77,171,247,0.25)',\n // Neutral\n neutral: '#9e9e9e',\n};\n\n/**\n * 8px base unit spacing system.\n * All values are multiples of the 8px grid (4px = 0.5×, 8px = 1×, 16px = 2×, etc.).\n * Web: used as rem via CSS custom properties (--space-*).\n * React Native: convert to numbers (4, 8, 16, 24, 32, 48, 64, 80).\n */\nexport const defaultSpacing = {\n xs: '0.25rem', // 4px — 0.5× base\n sm: '0.5rem', // 8px — 1× base\n md: '1rem', // 16px — 2× base\n lg: '1.5rem', // 24px — 3× base\n xl: '2rem', // 32px — 4× base\n '2xl': '3rem', // 48px — 6× base\n '3xl': '4rem', // 64px — 8× base\n '4xl': '6rem', // 96px — 12× base\n} as const;\n\nexport const defaultTypography = {\n fontFamily: {\n base: \"'IBM Plex Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif\",\n heading:\n \"'IBM Plex Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif\",\n mono: \"'IBM Plex Mono', 'Courier New', monospace\",\n },\n fontSize: {\n xs: '0.75rem',\n sm: '0.875rem',\n base: '1rem',\n lg: '1.125rem',\n xl: '1.25rem',\n '2xl': '1.5rem',\n '3xl': '1.875rem',\n '4xl': '2.25rem',\n '5xl': '3rem',\n },\n fontWeight: {\n thin: 100,\n light: 300,\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n extrabold: 800,\n },\n lineHeight: {\n none: 1,\n tight: 1.25,\n snug: 1.375,\n normal: 1.5,\n relaxed: 1.625,\n loose: 2,\n },\n} as const;\n\n/**\n * Structured shadow definitions — single source of truth.\n * Web: converted to CSS box-shadow strings via shadowLayersToCSS().\n * React Native: converted to iOS/Android shadow styles via shadowToRN().\n */\nexport const defaultShadowDefinitions: Record<string, ShadowLayer[]> = {\n xs: [{ x: 0, y: 1, blur: 2, spread: 0, color: '#000000', opacity: 0.05 }],\n sm: [\n { x: 0, y: 1, blur: 3, spread: 0, color: '#000000', opacity: 0.1 },\n { x: 0, y: 1, blur: 2, spread: 0, color: '#000000', opacity: 0.06 },\n ],\n md: [\n { x: 0, y: 4, blur: 6, spread: -1, color: '#000000', opacity: 0.1 },\n { x: 0, y: 2, blur: 4, spread: -1, color: '#000000', opacity: 0.06 },\n ],\n lg: [\n { x: 0, y: 10, blur: 15, spread: -3, color: '#000000', opacity: 0.1 },\n { x: 0, y: 4, blur: 6, spread: -2, color: '#000000', opacity: 0.05 },\n ],\n xl: [\n { x: 0, y: 20, blur: 25, spread: -5, color: '#000000', opacity: 0.1 },\n { x: 0, y: 10, blur: 10, spread: -5, color: '#000000', opacity: 0.04 },\n ],\n '2xl': [\n { x: 0, y: 25, blur: 50, spread: -12, color: '#000000', opacity: 0.25 },\n ],\n inner: [\n {\n x: 0,\n y: 2,\n blur: 4,\n spread: 0,\n color: '#000000',\n opacity: 0.06,\n inset: true,\n },\n ],\n};\n\n/** Parse a hex color string (#RGB or #RRGGBB) to { r, g, b }. */\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } {\n const h = hex.replace('#', '');\n const full = h.length === 3 ? h[0] + h[0] + h[1] + h[1] + h[2] + h[2] : h;\n return {\n r: parseInt(full.slice(0, 2), 16),\n g: parseInt(full.slice(2, 4), 16),\n b: parseInt(full.slice(4, 6), 16),\n };\n}\n\n/** Convert structured shadow layers to a CSS box-shadow string. */\nexport function shadowLayersToCSS(layers: ShadowLayer[]): string {\n return layers\n .map(l => {\n const inset = l.inset ? 'inset ' : '';\n const px = (n: number) => (n === 0 ? '0' : `${n}px`);\n const { r, g, b } = hexToRgb(l.color);\n return `${inset}${px(l.x)} ${px(l.y)} ${px(l.blur)} ${px(l.spread)} rgba(${r}, ${g}, ${b}, ${l.opacity})`;\n })\n .join(', ');\n}\n\n/** CSS shadow strings derived from structured definitions. */\nexport const defaultShadows: ThemeShadows = {\n ...(Object.fromEntries(\n Object.entries(defaultShadowDefinitions).map(([k, layers]) => [\n k,\n shadowLayersToCSS(layers),\n ]),\n ) as Omit<ThemeShadows, 'none'>),\n none: 'none',\n};\n\nexport const defaultRadius = {\n none: '0',\n xs: '0.125rem',\n sm: '0.25rem',\n md: '0.375rem',\n lg: '0.5rem',\n xl: '0.75rem',\n '2xl': '1rem',\n '3xl': '1.5rem',\n full: '9999px',\n} as const;\n\nexport const defaultTransitions = {\n duration: { fast: '150ms', base: '300ms', slow: '500ms' },\n timing: {\n ease: 'cubic-bezier(0.4, 0, 0.2, 1)',\n easeIn: 'cubic-bezier(0.4, 0, 1, 1)',\n easeOut: 'cubic-bezier(0, 0, 0.2, 1)',\n easeInOut: 'cubic-bezier(0.4, 0, 0.2, 1)',\n linear: 'linear',\n },\n} as const;\n\nexport const defaultZIndex = {\n dropdown: 1000,\n sticky: 1020,\n fixed: 1030,\n modalBackdrop: 1040,\n modal: 1050,\n popover: 1060,\n tooltip: 1070,\n toast: 1080,\n} as const;\n\nfunction buildLightTheme(colors: Partial<ColorPreset>): Theme {\n const c = { ...defaultColorPreset, ...colors };\n return {\n mode: 'light',\n colors: c as Theme['colors'],\n spacing: { ...defaultSpacing },\n typography: { ...defaultTypography },\n shadows: { ...defaultShadows },\n shadowDefinitions: { ...defaultShadowDefinitions },\n radius: { ...defaultRadius },\n transitions: { ...defaultTransitions },\n zIndex: { ...defaultZIndex },\n };\n}\n\nfunction buildDarkTheme(colors: Partial<ColorPreset>): Theme {\n const base = buildLightTheme(defaultColorPresetDark);\n const c = { ...defaultColorPresetDark, ...colors };\n return { ...base, mode: 'dark', colors: c as Theme['colors'] };\n}\n\n/**\n * Create a theme with your brand colors.\n * Override only what you need – rest uses standard defaults.\n */\nexport function createTheme(overrides: {\n light?: Partial<ColorPreset>;\n dark?: Partial<ColorPreset>;\n}): { light: Theme; dark: Theme } {\n return {\n light: buildLightTheme(overrides.light ?? {}),\n dark: buildDarkTheme(overrides.dark ?? {}),\n };\n}\n\n/**\n * Default theme (standard colors).\n * Use createTheme() to customize – do not ship without reviewing colors.\n */\nexport const defaultTheme = buildLightTheme({});\n","/**\n * Grundtone Branding System\n *\n * Central branding definition — one source of truth for logo assets\n * and brand identity across web and React Native.\n *\n * @example\n * // Use defaults\n * import { defaultBranding } from '@grundtone/core';\n *\n * @example\n * // Override for your brand\n * import { createBranding } from '@grundtone/core';\n * const branding = createBranding({\n * name: 'My App',\n * tagline: 'Build something great',\n * logos: { primary: '/my-logo.png' },\n * });\n */\n\n/** Asset path for a single logo variant. */\nexport interface LogoVariants {\n /** Primary logo (1080×1080) */\n primary: string;\n /** Favicon 32×32 */\n favicon32: string;\n /** Favicon 16×16 */\n favicon16: string;\n /** Apple touch icon (180×180) */\n appleTouchIcon: string;\n /** PWA manifest icon (192×192) */\n pwa192: string;\n /** PWA manifest icon (512×512) */\n pwa512: string;\n}\n\nexport interface BrandingConfig {\n /** Brand name */\n name: string;\n /** Short tagline / description */\n tagline: string;\n /** Logo asset paths per variant */\n logos: LogoVariants;\n}\n\n/** Width and height metadata for each logo variant. */\nexport const LOGO_VARIANT_SIZES: Record<\n keyof LogoVariants,\n { width: number; height: number }\n> = {\n primary: { width: 1080, height: 1080 },\n favicon32: { width: 32, height: 32 },\n favicon16: { width: 16, height: 16 },\n appleTouchIcon: { width: 180, height: 180 },\n pwa192: { width: 192, height: 192 },\n pwa512: { width: 512, height: 512 },\n} as const;\n\n/**\n * Default branding — Grundtone reference assets.\n * Paths are relative to `@grundtone/core/assets/`.\n */\nexport const defaultBranding: BrandingConfig = {\n name: 'Grundtone',\n tagline: 'A cross-platform design system',\n logos: {\n primary: '@grundtone/core/assets/logo.png',\n favicon32: '@grundtone/core/assets/logo-32x32.png',\n favicon16: '@grundtone/core/assets/logo-16x16.png',\n appleTouchIcon: '@grundtone/core/assets/logo-180x180.png',\n pwa192: '@grundtone/core/assets/logo-192x192.png',\n pwa512: '@grundtone/core/assets/logo-512x512.png',\n },\n};\n\n/**\n * Create a branding config with your brand identity.\n * Override only what you need — the rest uses Grundtone defaults.\n */\nexport function createBranding(\n overrides?: Partial<BrandingConfig>,\n): BrandingConfig {\n if (!overrides) return { ...defaultBranding };\n\n return {\n name: overrides.name ?? defaultBranding.name,\n tagline: overrides.tagline ?? defaultBranding.tagline,\n logos: {\n ...defaultBranding.logos,\n ...overrides.logos,\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/config.ts","../src/theme.ts","../src/theme-preset.ts","../src/toggle.ts","../src/branding.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export interface GrundtoneConfig {\n /**\n * Prefix for component names in auto-import contexts (Nuxt).\n * Also used as CSS class prefix for all components.\n *\n * @default 'GT'\n *\n * @example\n * // Default: <GTButton>, .gt-btn\n * // Custom: <KHButton>, .kh-btn\n * defineGrundtoneConfig({ prefix: 'KH' })\n */\n prefix: string;\n\n /**\n * Default color for icons. Uses any valid CSS color value.\n * Icons inherit parent text color via `currentColor` by default.\n *\n * @default 'currentColor'\n *\n * @example\n * defineGrundtoneConfig({ iconColor: 'var(--color-text-secondary)' })\n */\n iconColor: string;\n}\n\nconst defaultConfig: GrundtoneConfig = {\n prefix: 'GT',\n iconColor: 'currentColor',\n};\n\nlet currentConfig: GrundtoneConfig = { ...defaultConfig };\n\n/**\n * Configure Grundtone for your project. Call this once at app startup,\n * before any components are rendered.\n *\n * @example\n * // In main.ts or nuxt.config.ts\n * import { defineGrundtoneConfig } from '@grundtone/core';\n *\n * defineGrundtoneConfig({\n * prefix: 'KH', // Components become <KHButton>, CSS becomes .kh-btn\n * });\n */\nexport function defineGrundtoneConfig(\n config: Partial<GrundtoneConfig>,\n): GrundtoneConfig {\n currentConfig = { ...defaultConfig, ...config };\n return currentConfig;\n}\n\n/**\n * Get the current Grundtone configuration.\n */\nexport function getGrundtoneConfig(): GrundtoneConfig {\n return currentConfig;\n}\n\n/**\n * Get the CSS class prefix (lowercase version of prefix).\n *\n * @example\n * getClassPrefix() // 'gt' (default)\n * // After defineGrundtoneConfig({ prefix: 'KH' })\n * getClassPrefix() // 'kh'\n */\nexport function getClassPrefix(): string {\n return currentConfig.prefix.toLowerCase();\n}\n\n/**\n * Get the default icon color.\n *\n * @example\n * getIconColor() // 'currentColor' (default)\n * // After defineGrundtoneConfig({ iconColor: 'var(--color-primary)' })\n * getIconColor() // 'var(--color-primary)'\n */\nexport function getIconColor(): string {\n return currentConfig.iconColor;\n}\n","import type { InjectionKey, Ref } from 'vue';\n\nexport type ThemeMode = 'light' | 'dark' | 'auto';\n\n/**\n * Semantic color tokens – configure these to match your brand.\n * All keys map to CSS var: --color-{kebab-case-key}\n *\n * Shade-based naming: `primaryLight`/`primaryDark` instead of state-based\n * (`primaryHover`/`primaryActive`). Components decide which shade to use\n * for hover, active, tint, etc.\n */\nexport interface ThemeColors {\n // Brand\n primary: string;\n primaryLight: string;\n primaryDark: string;\n onPrimary: string;\n secondary: string;\n secondaryLight: string;\n secondaryDark: string;\n // Status\n success: string;\n successLight: string;\n successDark: string;\n warning: string;\n warningLight: string;\n warningDark: string;\n error: string;\n errorLight: string;\n errorDark: string;\n info: string;\n infoLight: string;\n infoDark: string;\n // Surface\n background: string;\n backgroundAlt: string;\n surface: string;\n surfaceAlt: string;\n surfaceRaised: string;\n surfaceOverlay: string;\n modalBackdrop: string;\n // Text\n text: string;\n textSecondary: string;\n textTertiary: string;\n textInverse: string;\n textPlaceholder: string;\n textDisabled: string;\n // Border\n borderLight: string;\n borderMedium: string;\n borderStrong: string;\n borderInverse: string;\n // Focus\n focus: string;\n focusRing: string;\n // Neutral\n neutral: string;\n}\n\nexport interface ThemeSpacing {\n xs: string;\n sm: string;\n md: string;\n lg: string;\n xl: string;\n '2xl': string;\n '3xl': string;\n '4xl': string;\n}\n\nexport interface ThemeTypography {\n fontFamily: {\n base: string;\n heading: string;\n mono: string;\n };\n fontSize: {\n xs: string;\n sm: string;\n base: string;\n lg: string;\n xl: string;\n '2xl': string;\n '3xl': string;\n '4xl': string;\n '5xl': string;\n };\n fontWeight: {\n thin: number;\n light: number;\n normal: number;\n medium: number;\n semibold: number;\n bold: number;\n extrabold: number;\n };\n lineHeight: {\n none: number;\n tight: number;\n snug: number;\n normal: number;\n relaxed: number;\n loose: number;\n };\n}\n\nexport interface ThemeShadows {\n xs: string;\n sm: string;\n md: string;\n lg: string;\n xl: string;\n '2xl': string;\n inner: string;\n none: string;\n}\n\n/**\n * Structured shadow layer — platform-agnostic description of a single\n * CSS box-shadow layer. Web converts to CSS string; React Native converts\n * to iOS shadowColor/Offset/Opacity/Radius + Android elevation.\n */\nexport interface ShadowLayer {\n x: number;\n y: number;\n blur: number;\n spread: number;\n color: string;\n opacity: number;\n inset?: boolean;\n}\n\nexport interface ThemeRadius {\n none: string;\n xs: string;\n sm: string;\n md: string;\n lg: string;\n xl: string;\n '2xl': string;\n '3xl': string;\n full: string;\n}\n\nexport interface ThemeTransitions {\n duration: {\n fast: string;\n base: string;\n slow: string;\n };\n timing: {\n ease: string;\n easeIn: string;\n easeOut: string;\n easeInOut: string;\n linear: string;\n };\n}\n\nexport interface ThemeZIndex {\n dropdown: number;\n sticky: number;\n fixed: number;\n modalBackdrop: number;\n modal: number;\n popover: number;\n tooltip: number;\n toast: number;\n}\n\nexport interface Theme {\n mode: ThemeMode;\n colors: ThemeColors;\n spacing: ThemeSpacing;\n typography: ThemeTypography;\n shadows: ThemeShadows;\n shadowDefinitions: Record<string, ShadowLayer[]>;\n radius: ThemeRadius;\n transitions: ThemeTransitions;\n zIndex: ThemeZIndex;\n}\n\nexport interface ThemeProviderContext {\n theme: Readonly<Ref<Theme>>;\n mode: Readonly<Ref<ThemeMode>>;\n isDark: Readonly<Ref<boolean>>;\n isLight: Readonly<Ref<boolean>>;\n setMode: (mode: ThemeMode) => void;\n toggleMode: () => void;\n applyTheme: () => void;\n}\n\nexport const THEME_INJECTION_KEY: InjectionKey<ThemeProviderContext> =\n Symbol('grundtone-theme');\n\n/**\n * Theme configuration: either a single partial theme (applies to both modes)\n * or separate light/dark overrides for proper dark mode support.\n */\nexport type ThemeConfig =\n | Partial<Theme>\n | { light?: Partial<Theme>; dark?: Partial<Theme> };\n\nexport interface ThemeProviderProps {\n mode?: ThemeMode;\n theme?: ThemeConfig;\n enableTransitions?: boolean;\n persistMode?: boolean;\n storageKey?: string;\n}\n","/**\n * Grundtone Theme Preset\n *\n * Standard reference colors. When installing Grundtone, you MUST configure your\n * theme colors - either customize this preset or provide your own.\n * The design system will not apply colors until you explicitly pass a theme.\n *\n * @example\n * // Nuxt: Configure in nuxt.config.ts\n * grundtone: {\n * theme: {\n * light: { colors: { primary: '#your-brand', ... } },\n * dark: { colors: { primary: '#your-brand-dark', ... } }\n * }\n * }\n *\n * @example\n * // Vue: Pass to ThemeProvider\n * import { defaultTheme, createTheme } from '@grundtone/core';\n * <ThemeProvider :theme=\"defaultTheme\" />\n */\n\nimport type { ShadowLayer, Theme, ThemeShadows } from './theme';\n\nexport type ColorPreset = Theme['colors'];\n\n/**\n * Semantic color keys – all colors your app should configure.\n */\nexport const SEMANTIC_COLOR_KEYS = [\n // Brand\n 'primary',\n 'primaryLight',\n 'primaryDark',\n 'onPrimary',\n 'secondary',\n 'secondaryLight',\n 'secondaryDark',\n // Status\n 'success',\n 'successLight',\n 'successDark',\n 'warning',\n 'warningLight',\n 'warningDark',\n 'error',\n 'errorLight',\n 'errorDark',\n 'info',\n 'infoLight',\n 'infoDark',\n // Surface\n 'background',\n 'backgroundAlt',\n 'surface',\n 'surfaceAlt',\n 'surfaceRaised',\n 'surfaceOverlay',\n 'modalBackdrop',\n // Text\n 'text',\n 'textSecondary',\n 'textTertiary',\n 'textInverse',\n 'textPlaceholder',\n 'textDisabled',\n // Border\n 'borderLight',\n 'borderMedium',\n 'borderStrong',\n 'borderInverse',\n // Focus\n 'focus',\n 'focusRing',\n // Neutral\n 'neutral',\n] as const;\n\n/**\n * Standard reference colors (Bootstrap-inspired).\n * Copy and customize – do not use passively without reviewing.\n */\nexport const defaultColorPreset: ColorPreset = {\n // Brand\n primary: '#0059b3',\n primaryLight: '#3381cc',\n primaryDark: '#003a7a',\n onPrimary: '#ffffff',\n secondary: '#e9ecef',\n secondaryLight: '#f8f9fa',\n secondaryDark: '#dee2e6',\n // Status\n success: '#198754',\n successLight: '#d1e7dd',\n successDark: '#146c43',\n warning: '#ffc107',\n warningLight: '#fff3cd',\n warningDark: '#cc9a06',\n error: '#dc3545',\n errorLight: '#f8d7da',\n errorDark: '#b02a37',\n info: '#0dcaf0',\n infoLight: '#cff4fc',\n infoDark: '#0aa2c0',\n // Surface\n background: '#ffffff',\n backgroundAlt: '#fafafa',\n surface: '#f8f9fa',\n surfaceAlt: '#f0f1f2',\n surfaceRaised: '#ffffff',\n surfaceOverlay: 'rgba(255,255,255,0.95)',\n modalBackdrop: 'rgba(0,0,0,0.5)',\n // Text\n text: '#212529',\n textSecondary: '#6c757d',\n textTertiary: '#adb5bd',\n textInverse: '#ffffff',\n textPlaceholder: '#a3a3a3',\n textDisabled: '#d4d4d4',\n // Border\n borderLight: '#dee2e6',\n borderMedium: '#ced4da',\n borderStrong: '#adb5bd',\n borderInverse: 'rgba(255,255,255,0.2)',\n // Focus\n focus: '#0059b3',\n focusRing: 'rgba(0,89,179,0.25)',\n // Neutral\n neutral: '#6c757d',\n};\n\n/**\n * Dark mode preset (standard reference).\n */\nexport const defaultColorPresetDark: ColorPreset = {\n // Brand\n primary: '#4dabf7',\n primaryLight: '#74c0fc',\n primaryDark: '#339af0',\n onPrimary: '#121212',\n secondary: '#343a40',\n secondaryLight: '#495057',\n secondaryDark: '#2b3035',\n // Status\n success: '#51cf66',\n successLight: '#1a3d20',\n successDark: '#40c057',\n warning: '#ffd43b',\n warningLight: '#3d3a1a',\n warningDark: '#fab005',\n error: '#ff6b6b',\n errorLight: '#3d1a1c',\n errorDark: '#fa5252',\n info: '#4dabf7',\n infoLight: '#1a2e3d',\n infoDark: '#339af0',\n // Surface\n background: '#121212',\n backgroundAlt: '#1a1a1a',\n surface: '#1e1e1e',\n surfaceAlt: '#252525',\n surfaceRaised: '#2a2a2a',\n surfaceOverlay: 'rgba(30,30,30,0.95)',\n modalBackdrop: 'rgba(0,0,0,0.7)',\n // Text\n text: '#ffffff',\n textSecondary: '#b0b0b0',\n textTertiary: '#808080',\n textInverse: '#121212',\n textPlaceholder: '#666666',\n textDisabled: '#4a4a4a',\n // Border\n borderLight: '#404040',\n borderMedium: '#505050',\n borderStrong: '#606060',\n borderInverse: 'rgba(0,0,0,0.3)',\n // Focus\n focus: '#4dabf7',\n focusRing: 'rgba(77,171,247,0.25)',\n // Neutral\n neutral: '#9e9e9e',\n};\n\n/**\n * 8px base unit spacing system.\n * All values are multiples of the 8px grid (4px = 0.5×, 8px = 1×, 16px = 2×, etc.).\n * Web: used as rem via CSS custom properties (--space-*).\n * React Native: convert to numbers (4, 8, 16, 24, 32, 48, 64, 80).\n */\nexport const defaultSpacing = {\n xs: '0.25rem', // 4px — 0.5× base\n sm: '0.5rem', // 8px — 1× base\n md: '1rem', // 16px — 2× base\n lg: '1.5rem', // 24px — 3× base\n xl: '2rem', // 32px — 4× base\n '2xl': '3rem', // 48px — 6× base\n '3xl': '4rem', // 64px — 8× base\n '4xl': '6rem', // 96px — 12× base\n} as const;\n\nexport const defaultTypography = {\n fontFamily: {\n base: \"'IBM Plex Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif\",\n heading:\n \"'IBM Plex Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif\",\n mono: \"'IBM Plex Mono', 'Courier New', monospace\",\n },\n fontSize: {\n xs: '0.75rem',\n sm: '0.875rem',\n base: '1rem',\n lg: '1.125rem',\n xl: '1.25rem',\n '2xl': '1.5rem',\n '3xl': '1.875rem',\n '4xl': '2.25rem',\n '5xl': '3rem',\n },\n fontWeight: {\n thin: 100,\n light: 300,\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n extrabold: 800,\n },\n lineHeight: {\n none: 1,\n tight: 1.25,\n snug: 1.375,\n normal: 1.5,\n relaxed: 1.625,\n loose: 2,\n },\n} as const;\n\n/**\n * Structured shadow definitions — single source of truth.\n * Web: converted to CSS box-shadow strings via shadowLayersToCSS().\n * React Native: converted to iOS/Android shadow styles via shadowToRN().\n */\nexport const defaultShadowDefinitions: Record<string, ShadowLayer[]> = {\n xs: [{ x: 0, y: 1, blur: 2, spread: 0, color: '#000000', opacity: 0.05 }],\n sm: [\n { x: 0, y: 1, blur: 3, spread: 0, color: '#000000', opacity: 0.1 },\n { x: 0, y: 1, blur: 2, spread: 0, color: '#000000', opacity: 0.06 },\n ],\n md: [\n { x: 0, y: 4, blur: 6, spread: -1, color: '#000000', opacity: 0.1 },\n { x: 0, y: 2, blur: 4, spread: -1, color: '#000000', opacity: 0.06 },\n ],\n lg: [\n { x: 0, y: 10, blur: 15, spread: -3, color: '#000000', opacity: 0.1 },\n { x: 0, y: 4, blur: 6, spread: -2, color: '#000000', opacity: 0.05 },\n ],\n xl: [\n { x: 0, y: 20, blur: 25, spread: -5, color: '#000000', opacity: 0.1 },\n { x: 0, y: 10, blur: 10, spread: -5, color: '#000000', opacity: 0.04 },\n ],\n '2xl': [\n { x: 0, y: 25, blur: 50, spread: -12, color: '#000000', opacity: 0.25 },\n ],\n inner: [\n {\n x: 0,\n y: 2,\n blur: 4,\n spread: 0,\n color: '#000000',\n opacity: 0.06,\n inset: true,\n },\n ],\n};\n\n/** Parse a hex color string (#RGB or #RRGGBB) to { r, g, b }. */\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } {\n const h = hex.replace('#', '');\n const full = h.length === 3 ? h[0] + h[0] + h[1] + h[1] + h[2] + h[2] : h;\n return {\n r: parseInt(full.slice(0, 2), 16),\n g: parseInt(full.slice(2, 4), 16),\n b: parseInt(full.slice(4, 6), 16),\n };\n}\n\n/** Convert structured shadow layers to a CSS box-shadow string. */\nexport function shadowLayersToCSS(layers: ShadowLayer[]): string {\n return layers\n .map(l => {\n const inset = l.inset ? 'inset ' : '';\n const px = (n: number) => (n === 0 ? '0' : `${n}px`);\n const { r, g, b } = hexToRgb(l.color);\n return `${inset}${px(l.x)} ${px(l.y)} ${px(l.blur)} ${px(l.spread)} rgba(${r}, ${g}, ${b}, ${l.opacity})`;\n })\n .join(', ');\n}\n\n/** CSS shadow strings derived from structured definitions. */\nexport const defaultShadows: ThemeShadows = {\n ...(Object.fromEntries(\n Object.entries(defaultShadowDefinitions).map(([k, layers]) => [\n k,\n shadowLayersToCSS(layers),\n ]),\n ) as Omit<ThemeShadows, 'none'>),\n none: 'none',\n};\n\nexport const defaultRadius = {\n none: '0',\n xs: '0.125rem',\n sm: '0.25rem',\n md: '0.375rem',\n lg: '0.5rem',\n xl: '0.75rem',\n '2xl': '1rem',\n '3xl': '1.5rem',\n full: '9999px',\n} as const;\n\nexport const defaultTransitions = {\n duration: { fast: '150ms', base: '300ms', slow: '500ms' },\n timing: {\n ease: 'cubic-bezier(0.4, 0, 0.2, 1)',\n easeIn: 'cubic-bezier(0.4, 0, 1, 1)',\n easeOut: 'cubic-bezier(0, 0, 0.2, 1)',\n easeInOut: 'cubic-bezier(0.4, 0, 0.2, 1)',\n linear: 'linear',\n },\n} as const;\n\nexport const defaultZIndex = {\n dropdown: 1000,\n sticky: 1020,\n fixed: 1030,\n modalBackdrop: 1040,\n modal: 1050,\n popover: 1060,\n tooltip: 1070,\n toast: 1080,\n} as const;\n\nfunction buildLightTheme(colors: Partial<ColorPreset>): Theme {\n const c = { ...defaultColorPreset, ...colors };\n return {\n mode: 'light',\n colors: c as Theme['colors'],\n spacing: { ...defaultSpacing },\n typography: { ...defaultTypography },\n shadows: { ...defaultShadows },\n shadowDefinitions: { ...defaultShadowDefinitions },\n radius: { ...defaultRadius },\n transitions: { ...defaultTransitions },\n zIndex: { ...defaultZIndex },\n };\n}\n\nfunction buildDarkTheme(colors: Partial<ColorPreset>): Theme {\n const base = buildLightTheme(defaultColorPresetDark);\n const c = { ...defaultColorPresetDark, ...colors };\n return { ...base, mode: 'dark', colors: c as Theme['colors'] };\n}\n\n/**\n * Create a theme with your brand colors.\n * Override only what you need – rest uses standard defaults.\n */\nexport function createTheme(overrides: {\n light?: Partial<ColorPreset>;\n dark?: Partial<ColorPreset>;\n}): { light: Theme; dark: Theme } {\n return {\n light: buildLightTheme(overrides.light ?? {}),\n dark: buildDarkTheme(overrides.dark ?? {}),\n };\n}\n\n/**\n * Default theme (standard colors).\n * Use createTheme() to customize – do not ship without reviewing colors.\n */\nexport const defaultTheme = buildLightTheme({});\n","/**\n * Toggle switch dimensions — single source of truth for all platforms.\n * Track width/height and thumb diameter in pixels.\n */\nexport const TOGGLE_SIZES = {\n sm: { width: 36, height: 20, thumb: 16 },\n md: { width: 44, height: 24, thumb: 20 },\n lg: { width: 52, height: 28, thumb: 24 },\n} as const;\n\nexport type ToggleSize = keyof typeof TOGGLE_SIZES;\n","/**\n * Grundtone Branding System\n *\n * Central branding definition — one source of truth for logo assets\n * and brand identity across web and React Native.\n *\n * @example\n * // Use defaults\n * import { defaultBranding } from '@grundtone/core';\n *\n * @example\n * // Override for your brand\n * import { createBranding } from '@grundtone/core';\n * const branding = createBranding({\n * name: 'My App',\n * tagline: 'Build something great',\n * logos: { primary: '/my-logo.png' },\n * });\n */\n\n/** Asset path for a single logo variant. */\nexport interface LogoVariants {\n /** Primary logo (1080×1080) */\n primary: string;\n /** Favicon 32×32 */\n favicon32: string;\n /** Favicon 16×16 */\n favicon16: string;\n /** Apple touch icon (180×180) */\n appleTouchIcon: string;\n /** PWA manifest icon (192×192) */\n pwa192: string;\n /** PWA manifest icon (512×512) */\n pwa512: string;\n}\n\nexport interface BrandingConfig {\n /** Brand name */\n name: string;\n /** Short tagline / description */\n tagline: string;\n /** Logo asset paths per variant */\n logos: LogoVariants;\n}\n\n/** Width and height metadata for each logo variant. */\nexport const LOGO_VARIANT_SIZES: Record<\n keyof LogoVariants,\n { width: number; height: number }\n> = {\n primary: { width: 1080, height: 1080 },\n favicon32: { width: 32, height: 32 },\n favicon16: { width: 16, height: 16 },\n appleTouchIcon: { width: 180, height: 180 },\n pwa192: { width: 192, height: 192 },\n pwa512: { width: 512, height: 512 },\n} as const;\n\n/**\n * Default branding — Grundtone reference assets.\n * Paths are relative to `@grundtone/core/assets/`.\n */\nexport const defaultBranding: BrandingConfig = {\n name: 'Grundtone',\n tagline: 'A cross-platform design system',\n logos: {\n primary: '@grundtone/core/assets/logo.png',\n favicon32: '@grundtone/core/assets/logo-32x32.png',\n favicon16: '@grundtone/core/assets/logo-16x16.png',\n appleTouchIcon: '@grundtone/core/assets/logo-180x180.png',\n pwa192: '@grundtone/core/assets/logo-192x192.png',\n pwa512: '@grundtone/core/assets/logo-512x512.png',\n },\n};\n\n/**\n * Create a branding config with your brand identity.\n * Override only what you need — the rest uses Grundtone defaults.\n */\nexport function createBranding(\n overrides?: Partial<BrandingConfig>,\n): BrandingConfig {\n if (!overrides) return { ...defaultBranding };\n\n return {\n name: overrides.name ?? defaultBranding.name,\n tagline: overrides.tagline ?? defaultBranding.tagline,\n logos: {\n ...defaultBranding.logos,\n ...overrides.logos,\n },\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grundtone/core",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "Core types and utilities for Grundtone",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -28,6 +28,14 @@
28
28
  "publishConfig": {
29
29
  "access": "public"
30
30
  },
31
+ "scripts": {
32
+ "build": "tsup",
33
+ "dev": "tsup --watch",
34
+ "lint": "eslint src",
35
+ "test": "vitest --passWithNoTests",
36
+ "clean": "rimraf .turbo node_modules dist",
37
+ "prepublishOnly": "test -d dist || pnpm run build"
38
+ },
31
39
  "devDependencies": {
32
40
  "@types/node": "^20.17.45",
33
41
  "@typescript-eslint/eslint-plugin": "^6.21.0",
@@ -35,16 +43,10 @@
35
43
  "@vitejs/plugin-vue": "^5.0.3",
36
44
  "eslint": "^8.56.0",
37
45
  "rimraf": "^5.0.5",
38
- "tsup": "^8.0.2"
46
+ "tsup": "^8.0.2",
47
+ "tsx": "^4.19.4"
39
48
  },
40
49
  "peerDependencies": {
41
50
  "vue": "^3.5.13"
42
- },
43
- "scripts": {
44
- "build": "tsup",
45
- "dev": "tsup --watch",
46
- "lint": "eslint src",
47
- "test": "vitest --passWithNoTests",
48
- "clean": "rimraf .turbo node_modules dist"
49
51
  }
50
- }
52
+ }