@tekton-ui/core 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +758 -0
- package/dist/blueprint.d.ts +44 -0
- package/dist/blueprint.d.ts.map +1 -0
- package/dist/blueprint.js +163 -0
- package/dist/blueprint.js.map +1 -0
- package/dist/component-schemas.d.ts +78 -0
- package/dist/component-schemas.d.ts.map +1 -0
- package/dist/component-schemas.js +1037 -0
- package/dist/component-schemas.js.map +1 -0
- package/dist/css-generator.d.ts +42 -0
- package/dist/css-generator.d.ts.map +1 -0
- package/dist/css-generator.js +339 -0
- package/dist/css-generator.js.map +1 -0
- package/dist/icon-library.d.ts +109 -0
- package/dist/icon-library.d.ts.map +1 -0
- package/dist/icon-library.js +204 -0
- package/dist/icon-library.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/layout-css-generator.d.ts +158 -0
- package/dist/layout-css-generator.d.ts.map +1 -0
- package/dist/layout-css-generator.js +901 -0
- package/dist/layout-css-generator.js.map +1 -0
- package/dist/layout-resolver.d.ts +92 -0
- package/dist/layout-resolver.d.ts.map +1 -0
- package/dist/layout-resolver.js +275 -0
- package/dist/layout-resolver.js.map +1 -0
- package/dist/layout-tokens/index.d.ts +16 -0
- package/dist/layout-tokens/index.d.ts.map +1 -0
- package/dist/layout-tokens/index.js +16 -0
- package/dist/layout-tokens/index.js.map +1 -0
- package/dist/layout-tokens/keyboard.d.ts +254 -0
- package/dist/layout-tokens/keyboard.d.ts.map +1 -0
- package/dist/layout-tokens/keyboard.js +407 -0
- package/dist/layout-tokens/keyboard.js.map +1 -0
- package/dist/layout-tokens/mobile-shells.d.ts +78 -0
- package/dist/layout-tokens/mobile-shells.d.ts.map +1 -0
- package/dist/layout-tokens/mobile-shells.js +635 -0
- package/dist/layout-tokens/mobile-shells.js.map +1 -0
- package/dist/layout-tokens/pages.d.ts +100 -0
- package/dist/layout-tokens/pages.d.ts.map +1 -0
- package/dist/layout-tokens/pages.js +576 -0
- package/dist/layout-tokens/pages.js.map +1 -0
- package/dist/layout-tokens/responsive.d.ts +109 -0
- package/dist/layout-tokens/responsive.d.ts.map +1 -0
- package/dist/layout-tokens/responsive.js +167 -0
- package/dist/layout-tokens/responsive.js.map +1 -0
- package/dist/layout-tokens/safe-area.d.ts +156 -0
- package/dist/layout-tokens/safe-area.d.ts.map +1 -0
- package/dist/layout-tokens/safe-area.js +316 -0
- package/dist/layout-tokens/safe-area.js.map +1 -0
- package/dist/layout-tokens/sections-advanced.d.ts +277 -0
- package/dist/layout-tokens/sections-advanced.d.ts.map +1 -0
- package/dist/layout-tokens/sections-advanced.js +593 -0
- package/dist/layout-tokens/sections-advanced.js.map +1 -0
- package/dist/layout-tokens/sections.d.ts +137 -0
- package/dist/layout-tokens/sections.d.ts.map +1 -0
- package/dist/layout-tokens/sections.js +694 -0
- package/dist/layout-tokens/sections.js.map +1 -0
- package/dist/layout-tokens/shells.d.ts +77 -0
- package/dist/layout-tokens/shells.d.ts.map +1 -0
- package/dist/layout-tokens/shells.js +408 -0
- package/dist/layout-tokens/shells.js.map +1 -0
- package/dist/layout-tokens/touch-target.d.ts +119 -0
- package/dist/layout-tokens/touch-target.d.ts.map +1 -0
- package/dist/layout-tokens/touch-target.js +156 -0
- package/dist/layout-tokens/touch-target.js.map +1 -0
- package/dist/layout-tokens/types.d.ts +632 -0
- package/dist/layout-tokens/types.d.ts.map +1 -0
- package/dist/layout-tokens/types.js +49 -0
- package/dist/layout-tokens/types.js.map +1 -0
- package/dist/layout-validation.d.ts +1547 -0
- package/dist/layout-validation.d.ts.map +1 -0
- package/dist/layout-validation.js +628 -0
- package/dist/layout-validation.js.map +1 -0
- package/dist/render.d.ts +23 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +244 -0
- package/dist/render.js.map +1 -0
- package/dist/schema-validation.d.ts +208 -0
- package/dist/schema-validation.d.ts.map +1 -0
- package/dist/schema-validation.js +205 -0
- package/dist/schema-validation.js.map +1 -0
- package/dist/screen-generation/generators/css-in-js-generator.d.ts +82 -0
- package/dist/screen-generation/generators/css-in-js-generator.d.ts.map +1 -0
- package/dist/screen-generation/generators/css-in-js-generator.js +335 -0
- package/dist/screen-generation/generators/css-in-js-generator.js.map +1 -0
- package/dist/screen-generation/generators/index.d.ts +13 -0
- package/dist/screen-generation/generators/index.d.ts.map +1 -0
- package/dist/screen-generation/generators/index.js +32 -0
- package/dist/screen-generation/generators/index.js.map +1 -0
- package/dist/screen-generation/generators/react-generator.d.ts +100 -0
- package/dist/screen-generation/generators/react-generator.d.ts.map +1 -0
- package/dist/screen-generation/generators/react-generator.js +379 -0
- package/dist/screen-generation/generators/react-generator.js.map +1 -0
- package/dist/screen-generation/generators/tailwind-generator.d.ts +105 -0
- package/dist/screen-generation/generators/tailwind-generator.d.ts.map +1 -0
- package/dist/screen-generation/generators/tailwind-generator.js +355 -0
- package/dist/screen-generation/generators/tailwind-generator.js.map +1 -0
- package/dist/screen-generation/generators/types.d.ts +136 -0
- package/dist/screen-generation/generators/types.d.ts.map +1 -0
- package/dist/screen-generation/generators/types.js +18 -0
- package/dist/screen-generation/generators/types.js.map +1 -0
- package/dist/screen-generation/generators/utils.d.ts +187 -0
- package/dist/screen-generation/generators/utils.d.ts.map +1 -0
- package/dist/screen-generation/generators/utils.js +312 -0
- package/dist/screen-generation/generators/utils.js.map +1 -0
- package/dist/screen-generation/index.d.ts +14 -0
- package/dist/screen-generation/index.d.ts.map +1 -0
- package/dist/screen-generation/index.js +33 -0
- package/dist/screen-generation/index.js.map +1 -0
- package/dist/screen-generation/resolver/component-resolver.d.ts +157 -0
- package/dist/screen-generation/resolver/component-resolver.d.ts.map +1 -0
- package/dist/screen-generation/resolver/component-resolver.js +295 -0
- package/dist/screen-generation/resolver/component-resolver.js.map +1 -0
- package/dist/screen-generation/resolver/index.d.ts +10 -0
- package/dist/screen-generation/resolver/index.d.ts.map +1 -0
- package/dist/screen-generation/resolver/index.js +46 -0
- package/dist/screen-generation/resolver/index.js.map +1 -0
- package/dist/screen-generation/resolver/layout-resolver.d.ts +155 -0
- package/dist/screen-generation/resolver/layout-resolver.d.ts.map +1 -0
- package/dist/screen-generation/resolver/layout-resolver.js +193 -0
- package/dist/screen-generation/resolver/layout-resolver.js.map +1 -0
- package/dist/screen-generation/resolver/screen-resolver.d.ts +174 -0
- package/dist/screen-generation/resolver/screen-resolver.d.ts.map +1 -0
- package/dist/screen-generation/resolver/screen-resolver.js +373 -0
- package/dist/screen-generation/resolver/screen-resolver.js.map +1 -0
- package/dist/screen-generation/resolver/token-resolver.d.ts +170 -0
- package/dist/screen-generation/resolver/token-resolver.d.ts.map +1 -0
- package/dist/screen-generation/resolver/token-resolver.js +260 -0
- package/dist/screen-generation/resolver/token-resolver.js.map +1 -0
- package/dist/screen-generation/types.d.ts +116 -0
- package/dist/screen-generation/types.d.ts.map +1 -0
- package/dist/screen-generation/types.js +33 -0
- package/dist/screen-generation/types.js.map +1 -0
- package/dist/screen-generation/validators.d.ts +286 -0
- package/dist/screen-generation/validators.d.ts.map +1 -0
- package/dist/screen-generation/validators.js +323 -0
- package/dist/screen-generation/validators.js.map +1 -0
- package/dist/screen-templates/__tests__/registry.test.d.ts +6 -0
- package/dist/screen-templates/__tests__/registry.test.d.ts.map +1 -0
- package/dist/screen-templates/__tests__/registry.test.js +247 -0
- package/dist/screen-templates/__tests__/registry.test.js.map +1 -0
- package/dist/screen-templates/__tests__/templates.test.d.ts +6 -0
- package/dist/screen-templates/__tests__/templates.test.d.ts.map +1 -0
- package/dist/screen-templates/__tests__/templates.test.js +179 -0
- package/dist/screen-templates/__tests__/templates.test.js.map +1 -0
- package/dist/screen-templates/index.d.ts +39 -0
- package/dist/screen-templates/index.d.ts.map +1 -0
- package/dist/screen-templates/index.js +79 -0
- package/dist/screen-templates/index.js.map +1 -0
- package/dist/screen-templates/registry.d.ts +177 -0
- package/dist/screen-templates/registry.d.ts.map +1 -0
- package/dist/screen-templates/registry.js +274 -0
- package/dist/screen-templates/registry.js.map +1 -0
- package/dist/screen-templates/templates/account/index.d.ts +6 -0
- package/dist/screen-templates/templates/account/index.d.ts.map +1 -0
- package/dist/screen-templates/templates/account/index.js +6 -0
- package/dist/screen-templates/templates/account/index.js.map +1 -0
- package/dist/screen-templates/templates/account/profile.d.ts +23 -0
- package/dist/screen-templates/templates/account/profile.d.ts.map +1 -0
- package/dist/screen-templates/templates/account/profile.js +249 -0
- package/dist/screen-templates/templates/account/profile.js.map +1 -0
- package/dist/screen-templates/templates/auth/forgot-password.d.ts +23 -0
- package/dist/screen-templates/templates/auth/forgot-password.d.ts.map +1 -0
- package/dist/screen-templates/templates/auth/forgot-password.js +203 -0
- package/dist/screen-templates/templates/auth/forgot-password.js.map +1 -0
- package/dist/screen-templates/templates/auth/index.d.ts +9 -0
- package/dist/screen-templates/templates/auth/index.d.ts.map +1 -0
- package/dist/screen-templates/templates/auth/index.js +9 -0
- package/dist/screen-templates/templates/auth/index.js.map +1 -0
- package/dist/screen-templates/templates/auth/login.d.ts +24 -0
- package/dist/screen-templates/templates/auth/login.d.ts.map +1 -0
- package/dist/screen-templates/templates/auth/login.js +254 -0
- package/dist/screen-templates/templates/auth/login.js.map +1 -0
- package/dist/screen-templates/templates/auth/signup.d.ts +24 -0
- package/dist/screen-templates/templates/auth/signup.d.ts.map +1 -0
- package/dist/screen-templates/templates/auth/signup.js +315 -0
- package/dist/screen-templates/templates/auth/signup.js.map +1 -0
- package/dist/screen-templates/templates/auth/verification.d.ts +23 -0
- package/dist/screen-templates/templates/auth/verification.d.ts.map +1 -0
- package/dist/screen-templates/templates/auth/verification.js +239 -0
- package/dist/screen-templates/templates/auth/verification.js.map +1 -0
- package/dist/screen-templates/templates/feedback/confirmation.d.ts +9 -0
- package/dist/screen-templates/templates/feedback/confirmation.d.ts.map +1 -0
- package/dist/screen-templates/templates/feedback/confirmation.js +107 -0
- package/dist/screen-templates/templates/feedback/confirmation.js.map +1 -0
- package/dist/screen-templates/templates/feedback/empty.d.ts +9 -0
- package/dist/screen-templates/templates/feedback/empty.d.ts.map +1 -0
- package/dist/screen-templates/templates/feedback/empty.js +90 -0
- package/dist/screen-templates/templates/feedback/empty.js.map +1 -0
- package/dist/screen-templates/templates/feedback/error.d.ts +9 -0
- package/dist/screen-templates/templates/feedback/error.d.ts.map +1 -0
- package/dist/screen-templates/templates/feedback/error.js +99 -0
- package/dist/screen-templates/templates/feedback/error.js.map +1 -0
- package/dist/screen-templates/templates/feedback/index.d.ts +10 -0
- package/dist/screen-templates/templates/feedback/index.d.ts.map +1 -0
- package/dist/screen-templates/templates/feedback/index.js +10 -0
- package/dist/screen-templates/templates/feedback/index.js.map +1 -0
- package/dist/screen-templates/templates/feedback/loading.d.ts +9 -0
- package/dist/screen-templates/templates/feedback/loading.d.ts.map +1 -0
- package/dist/screen-templates/templates/feedback/loading.js +77 -0
- package/dist/screen-templates/templates/feedback/loading.js.map +1 -0
- package/dist/screen-templates/templates/feedback/success.d.ts +9 -0
- package/dist/screen-templates/templates/feedback/success.d.ts.map +1 -0
- package/dist/screen-templates/templates/feedback/success.js +99 -0
- package/dist/screen-templates/templates/feedback/success.js.map +1 -0
- package/dist/screen-templates/templates/home/index.d.ts +6 -0
- package/dist/screen-templates/templates/home/index.d.ts.map +1 -0
- package/dist/screen-templates/templates/home/index.js +6 -0
- package/dist/screen-templates/templates/home/index.js.map +1 -0
- package/dist/screen-templates/templates/home/landing.d.ts +24 -0
- package/dist/screen-templates/templates/home/landing.d.ts.map +1 -0
- package/dist/screen-templates/templates/home/landing.js +197 -0
- package/dist/screen-templates/templates/home/landing.js.map +1 -0
- package/dist/screen-templates/templates/settings/index.d.ts +6 -0
- package/dist/screen-templates/templates/settings/index.d.ts.map +1 -0
- package/dist/screen-templates/templates/settings/index.js +6 -0
- package/dist/screen-templates/templates/settings/index.js.map +1 -0
- package/dist/screen-templates/templates/settings/preferences.d.ts +24 -0
- package/dist/screen-templates/templates/settings/preferences.d.ts.map +1 -0
- package/dist/screen-templates/templates/settings/preferences.js +265 -0
- package/dist/screen-templates/templates/settings/preferences.js.map +1 -0
- package/dist/screen-templates/types.d.ts +229 -0
- package/dist/screen-templates/types.d.ts.map +1 -0
- package/dist/screen-templates/types.js +7 -0
- package/dist/screen-templates/types.js.map +1 -0
- package/dist/theme-v2.d.ts +228 -0
- package/dist/theme-v2.d.ts.map +1 -0
- package/dist/theme-v2.js +158 -0
- package/dist/theme-v2.js.map +1 -0
- package/dist/theme.d.ts +60 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +76 -0
- package/dist/theme.js.map +1 -0
- package/dist/token-resolver.d.ts +69 -0
- package/dist/token-resolver.d.ts.map +1 -0
- package/dist/token-resolver.js +122 -0
- package/dist/token-resolver.js.map +1 -0
- package/dist/token-validation.d.ts +432 -0
- package/dist/token-validation.d.ts.map +1 -0
- package/dist/token-validation.js +140 -0
- package/dist/token-validation.js.map +1 -0
- package/dist/tokens.d.ts +158 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +10 -0
- package/dist/tokens.js.map +1 -0
- package/dist/types.d.ts +77 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @tekton-ui/core - Token Resolution Engine
|
|
3
|
+
* Resolves token references to final values with fallback chain support
|
|
4
|
+
* [SPEC-COMPONENT-001-A] [TOKEN-RESOLUTION]
|
|
5
|
+
*/
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// Token Resolution Functions
|
|
8
|
+
// ============================================================================
|
|
9
|
+
/**
|
|
10
|
+
* Resolves a token reference to its final value
|
|
11
|
+
*
|
|
12
|
+
* Supports:
|
|
13
|
+
* - Dot-notation references: "atomic.color.blue.500"
|
|
14
|
+
* - Multi-level references: "component.button.primary.background" → "semantic.foreground.accent" → "atomic.color.blue.500"
|
|
15
|
+
* - Direct values: "#3b82f6" (returned as-is)
|
|
16
|
+
* - Circular reference detection
|
|
17
|
+
*
|
|
18
|
+
* @param ref - Token reference or direct value
|
|
19
|
+
* @param tokens - Theme token structure
|
|
20
|
+
* @param visited - Internal tracking for circular reference detection
|
|
21
|
+
* @returns Resolved token value
|
|
22
|
+
* @throws Error if token not found or circular reference detected
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* resolveToken('atomic.color.blue.500', tokens) // → '#3b82f6'
|
|
27
|
+
* resolveToken('semantic.background.page', tokens) // → '#f9fafb' (via atomic.color.neutral.50)
|
|
28
|
+
* resolveToken('#3b82f6', tokens) // → '#3b82f6' (direct value)
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export function resolveToken(ref, tokens, visited = new Set()) {
|
|
32
|
+
// Prevent circular references
|
|
33
|
+
if (visited.has(ref)) {
|
|
34
|
+
throw new Error(`Circular token reference detected: ${ref}`);
|
|
35
|
+
}
|
|
36
|
+
visited.add(ref);
|
|
37
|
+
// If not a reference (doesn't contain dot or doesn't start with layer name), return as-is
|
|
38
|
+
if (!ref.includes('.')) {
|
|
39
|
+
return ref;
|
|
40
|
+
}
|
|
41
|
+
// Check if it's a token reference (starts with atomic, semantic, or component)
|
|
42
|
+
const startsWithLayer = ref.startsWith('atomic.') || ref.startsWith('semantic.') || ref.startsWith('component.');
|
|
43
|
+
if (!startsWithLayer) {
|
|
44
|
+
return ref; // Return direct value like "#3b82f6"
|
|
45
|
+
}
|
|
46
|
+
// Parse reference path
|
|
47
|
+
const parts = ref.split('.');
|
|
48
|
+
const [layer, ...path] = parts;
|
|
49
|
+
// Navigate token tree
|
|
50
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
51
|
+
let value = tokens;
|
|
52
|
+
for (const part of [layer, ...path]) {
|
|
53
|
+
value = value?.[part];
|
|
54
|
+
if (value === undefined) {
|
|
55
|
+
throw new Error(`Token not found: ${ref}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// If value is another reference, resolve recursively
|
|
59
|
+
if (typeof value === 'string' &&
|
|
60
|
+
(value.startsWith('atomic.') || value.startsWith('semantic.') || value.startsWith('component.'))) {
|
|
61
|
+
return resolveToken(value, tokens, visited);
|
|
62
|
+
}
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Resolves token with fallback chain: Component → Semantic → Atomic
|
|
67
|
+
*
|
|
68
|
+
* Attempts to resolve tokens in order of specificity:
|
|
69
|
+
* 1. Component-level token (most specific)
|
|
70
|
+
* 2. Semantic-level token (medium specificity)
|
|
71
|
+
* 3. Atomic-level token (least specific, guaranteed to exist)
|
|
72
|
+
*
|
|
73
|
+
* This enables graceful degradation when component or semantic tokens are missing.
|
|
74
|
+
*
|
|
75
|
+
* @param componentRef - Component-level token reference
|
|
76
|
+
* @param semanticRef - Semantic-level token reference (fallback)
|
|
77
|
+
* @param atomicRef - Atomic-level token reference (final fallback)
|
|
78
|
+
* @param tokens - Theme token structure
|
|
79
|
+
* @returns Resolved token value from first successful resolution
|
|
80
|
+
* @throws Error if all fallback attempts fail
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* // Returns component token if exists
|
|
85
|
+
* resolveWithFallback(
|
|
86
|
+
* 'component.button.primary.background',
|
|
87
|
+
* 'semantic.foreground.accent',
|
|
88
|
+
* 'atomic.color.blue.500',
|
|
89
|
+
* tokens
|
|
90
|
+
* ) // → '#3b82f6'
|
|
91
|
+
*
|
|
92
|
+
* // Falls back to semantic if component missing
|
|
93
|
+
* resolveWithFallback(
|
|
94
|
+
* 'component.button.nonexistent.background',
|
|
95
|
+
* 'semantic.foreground.accent',
|
|
96
|
+
* 'atomic.color.blue.500',
|
|
97
|
+
* tokens
|
|
98
|
+
* ) // → '#3b82f6' (via semantic)
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
export function resolveWithFallback(componentRef, semanticRef, atomicRef, tokens) {
|
|
102
|
+
// Try component token first
|
|
103
|
+
try {
|
|
104
|
+
return resolveToken(componentRef, tokens);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Fallback to semantic token
|
|
108
|
+
try {
|
|
109
|
+
return resolveToken(semanticRef, tokens);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Final fallback to atomic token
|
|
113
|
+
try {
|
|
114
|
+
return resolveToken(atomicRef, tokens);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
throw new Error(`Failed to resolve token with fallback: ${componentRef} → ${semanticRef} → ${atomicRef}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=token-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-resolver.js","sourceRoot":"","sources":["../src/token-resolver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,+EAA+E;AAC/E,6BAA6B;AAC7B,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,YAAY,CAC1B,GAAmB,EACnB,MAAiC,EACjC,UAAuB,IAAI,GAAG,EAAE;IAEhC,8BAA8B;IAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,sCAAsC,GAAG,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEjB,0FAA0F;IAC1F,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,+EAA+E;IAC/E,MAAM,eAAe,GACnB,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAC3F,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,GAAG,CAAC,CAAC,qCAAqC;IACnD,CAAC;IAED,uBAAuB;IACvB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;IAE/B,sBAAsB;IACtB,8DAA8D;IAC9D,IAAI,KAAK,GAAQ,MAAM,CAAC;IACxB,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACpC,KAAK,GAAG,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAChG,CAAC;QACD,OAAO,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,UAAU,mBAAmB,CACjC,YAAoB,EACpB,WAAmB,EACnB,SAAiB,EACjB,MAAiC;IAEjC,4BAA4B;IAC5B,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;QAC7B,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;YACjC,IAAI,CAAC;gBACH,OAAO,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACzC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,KAAK,CACb,0CAA0C,YAAY,MAAM,WAAW,MAAM,SAAS,EAAE,CACzF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @tekton-ui/core - Token Validation
|
|
3
|
+
* Runtime validation using Zod schemas for 3-layer token architecture
|
|
4
|
+
* [SPEC-COMPONENT-001-A] [TOKEN-VALIDATION]
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
/**
|
|
8
|
+
* Theme with Tokens Schema
|
|
9
|
+
* Validates complete 3-layer token structure with optional dark mode
|
|
10
|
+
*/
|
|
11
|
+
export declare const ThemeWithTokensSchema: z.ZodObject<{
|
|
12
|
+
/** 3-layer token structure */
|
|
13
|
+
tokens: z.ZodObject<{
|
|
14
|
+
atomic: z.ZodObject<{
|
|
15
|
+
/** Color palettes with shades */
|
|
16
|
+
color: z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
17
|
+
/** Spacing scale */
|
|
18
|
+
spacing: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
19
|
+
/** Border radius values */
|
|
20
|
+
radius: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
21
|
+
/** Typography definitions */
|
|
22
|
+
typography: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
23
|
+
fontSize: z.ZodString;
|
|
24
|
+
lineHeight: z.ZodString;
|
|
25
|
+
fontWeight: z.ZodString;
|
|
26
|
+
}, "strip", z.ZodTypeAny, {
|
|
27
|
+
fontSize: string;
|
|
28
|
+
fontWeight: string;
|
|
29
|
+
lineHeight: string;
|
|
30
|
+
}, {
|
|
31
|
+
fontSize: string;
|
|
32
|
+
fontWeight: string;
|
|
33
|
+
lineHeight: string;
|
|
34
|
+
}>>;
|
|
35
|
+
/** Shadow definitions */
|
|
36
|
+
shadow: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
37
|
+
/** Transition definitions (optional) */
|
|
38
|
+
transition: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
39
|
+
}, "strip", z.ZodTypeAny, {
|
|
40
|
+
spacing: Record<string, string>;
|
|
41
|
+
color: Record<string, Record<string, string>>;
|
|
42
|
+
shadow: Record<string, string>;
|
|
43
|
+
typography: Record<string, {
|
|
44
|
+
fontSize: string;
|
|
45
|
+
fontWeight: string;
|
|
46
|
+
lineHeight: string;
|
|
47
|
+
}>;
|
|
48
|
+
radius: Record<string, string>;
|
|
49
|
+
transition?: Record<string, string> | undefined;
|
|
50
|
+
}, {
|
|
51
|
+
spacing: Record<string, string>;
|
|
52
|
+
color: Record<string, Record<string, string>>;
|
|
53
|
+
shadow: Record<string, string>;
|
|
54
|
+
typography: Record<string, {
|
|
55
|
+
fontSize: string;
|
|
56
|
+
fontWeight: string;
|
|
57
|
+
lineHeight: string;
|
|
58
|
+
}>;
|
|
59
|
+
radius: Record<string, string>;
|
|
60
|
+
transition?: Record<string, string> | undefined;
|
|
61
|
+
}>;
|
|
62
|
+
semantic: z.ZodObject<{
|
|
63
|
+
/** Background colors with semantic meaning */
|
|
64
|
+
background: z.ZodObject<{
|
|
65
|
+
page: z.ZodString;
|
|
66
|
+
surface: z.ZodString;
|
|
67
|
+
elevated: z.ZodString;
|
|
68
|
+
muted: z.ZodString;
|
|
69
|
+
inverse: z.ZodString;
|
|
70
|
+
}, "strip", z.ZodTypeAny, {
|
|
71
|
+
page: string;
|
|
72
|
+
muted: string;
|
|
73
|
+
inverse: string;
|
|
74
|
+
elevated: string;
|
|
75
|
+
surface: string;
|
|
76
|
+
}, {
|
|
77
|
+
page: string;
|
|
78
|
+
muted: string;
|
|
79
|
+
inverse: string;
|
|
80
|
+
elevated: string;
|
|
81
|
+
surface: string;
|
|
82
|
+
}>;
|
|
83
|
+
/** Foreground (text) colors with semantic meaning */
|
|
84
|
+
foreground: z.ZodObject<{
|
|
85
|
+
primary: z.ZodString;
|
|
86
|
+
secondary: z.ZodString;
|
|
87
|
+
muted: z.ZodString;
|
|
88
|
+
inverse: z.ZodString;
|
|
89
|
+
accent: z.ZodString;
|
|
90
|
+
}, "strip", z.ZodTypeAny, {
|
|
91
|
+
primary: string;
|
|
92
|
+
secondary: string;
|
|
93
|
+
muted: string;
|
|
94
|
+
accent: string;
|
|
95
|
+
inverse: string;
|
|
96
|
+
}, {
|
|
97
|
+
primary: string;
|
|
98
|
+
secondary: string;
|
|
99
|
+
muted: string;
|
|
100
|
+
accent: string;
|
|
101
|
+
inverse: string;
|
|
102
|
+
}>;
|
|
103
|
+
/** Border colors with semantic meaning */
|
|
104
|
+
border: z.ZodObject<{
|
|
105
|
+
default: z.ZodString;
|
|
106
|
+
muted: z.ZodString;
|
|
107
|
+
focus: z.ZodString;
|
|
108
|
+
error: z.ZodString;
|
|
109
|
+
}, "strip", z.ZodTypeAny, {
|
|
110
|
+
focus: string;
|
|
111
|
+
default: string;
|
|
112
|
+
error: string;
|
|
113
|
+
muted: string;
|
|
114
|
+
}, {
|
|
115
|
+
focus: string;
|
|
116
|
+
default: string;
|
|
117
|
+
error: string;
|
|
118
|
+
muted: string;
|
|
119
|
+
}>;
|
|
120
|
+
/** Surface colors with semantic meaning */
|
|
121
|
+
surface: z.ZodObject<{
|
|
122
|
+
primary: z.ZodString;
|
|
123
|
+
secondary: z.ZodString;
|
|
124
|
+
tertiary: z.ZodString;
|
|
125
|
+
inverse: z.ZodString;
|
|
126
|
+
}, "strip", z.ZodTypeAny, {
|
|
127
|
+
primary: string;
|
|
128
|
+
secondary: string;
|
|
129
|
+
inverse: string;
|
|
130
|
+
tertiary: string;
|
|
131
|
+
}, {
|
|
132
|
+
primary: string;
|
|
133
|
+
secondary: string;
|
|
134
|
+
inverse: string;
|
|
135
|
+
tertiary: string;
|
|
136
|
+
}>;
|
|
137
|
+
}, "strip", z.ZodTypeAny, {
|
|
138
|
+
background: {
|
|
139
|
+
page: string;
|
|
140
|
+
muted: string;
|
|
141
|
+
inverse: string;
|
|
142
|
+
elevated: string;
|
|
143
|
+
surface: string;
|
|
144
|
+
};
|
|
145
|
+
foreground: {
|
|
146
|
+
primary: string;
|
|
147
|
+
secondary: string;
|
|
148
|
+
muted: string;
|
|
149
|
+
accent: string;
|
|
150
|
+
inverse: string;
|
|
151
|
+
};
|
|
152
|
+
border: {
|
|
153
|
+
focus: string;
|
|
154
|
+
default: string;
|
|
155
|
+
error: string;
|
|
156
|
+
muted: string;
|
|
157
|
+
};
|
|
158
|
+
surface: {
|
|
159
|
+
primary: string;
|
|
160
|
+
secondary: string;
|
|
161
|
+
inverse: string;
|
|
162
|
+
tertiary: string;
|
|
163
|
+
};
|
|
164
|
+
}, {
|
|
165
|
+
background: {
|
|
166
|
+
page: string;
|
|
167
|
+
muted: string;
|
|
168
|
+
inverse: string;
|
|
169
|
+
elevated: string;
|
|
170
|
+
surface: string;
|
|
171
|
+
};
|
|
172
|
+
foreground: {
|
|
173
|
+
primary: string;
|
|
174
|
+
secondary: string;
|
|
175
|
+
muted: string;
|
|
176
|
+
accent: string;
|
|
177
|
+
inverse: string;
|
|
178
|
+
};
|
|
179
|
+
border: {
|
|
180
|
+
focus: string;
|
|
181
|
+
default: string;
|
|
182
|
+
error: string;
|
|
183
|
+
muted: string;
|
|
184
|
+
};
|
|
185
|
+
surface: {
|
|
186
|
+
primary: string;
|
|
187
|
+
secondary: string;
|
|
188
|
+
inverse: string;
|
|
189
|
+
tertiary: string;
|
|
190
|
+
};
|
|
191
|
+
}>;
|
|
192
|
+
component: z.ZodRecord<z.ZodString, z.ZodAny>;
|
|
193
|
+
}, "strip", z.ZodTypeAny, {
|
|
194
|
+
component: Record<string, any>;
|
|
195
|
+
semantic: {
|
|
196
|
+
background: {
|
|
197
|
+
page: string;
|
|
198
|
+
muted: string;
|
|
199
|
+
inverse: string;
|
|
200
|
+
elevated: string;
|
|
201
|
+
surface: string;
|
|
202
|
+
};
|
|
203
|
+
foreground: {
|
|
204
|
+
primary: string;
|
|
205
|
+
secondary: string;
|
|
206
|
+
muted: string;
|
|
207
|
+
accent: string;
|
|
208
|
+
inverse: string;
|
|
209
|
+
};
|
|
210
|
+
border: {
|
|
211
|
+
focus: string;
|
|
212
|
+
default: string;
|
|
213
|
+
error: string;
|
|
214
|
+
muted: string;
|
|
215
|
+
};
|
|
216
|
+
surface: {
|
|
217
|
+
primary: string;
|
|
218
|
+
secondary: string;
|
|
219
|
+
inverse: string;
|
|
220
|
+
tertiary: string;
|
|
221
|
+
};
|
|
222
|
+
};
|
|
223
|
+
atomic: {
|
|
224
|
+
spacing: Record<string, string>;
|
|
225
|
+
color: Record<string, Record<string, string>>;
|
|
226
|
+
shadow: Record<string, string>;
|
|
227
|
+
typography: Record<string, {
|
|
228
|
+
fontSize: string;
|
|
229
|
+
fontWeight: string;
|
|
230
|
+
lineHeight: string;
|
|
231
|
+
}>;
|
|
232
|
+
radius: Record<string, string>;
|
|
233
|
+
transition?: Record<string, string> | undefined;
|
|
234
|
+
};
|
|
235
|
+
}, {
|
|
236
|
+
component: Record<string, any>;
|
|
237
|
+
semantic: {
|
|
238
|
+
background: {
|
|
239
|
+
page: string;
|
|
240
|
+
muted: string;
|
|
241
|
+
inverse: string;
|
|
242
|
+
elevated: string;
|
|
243
|
+
surface: string;
|
|
244
|
+
};
|
|
245
|
+
foreground: {
|
|
246
|
+
primary: string;
|
|
247
|
+
secondary: string;
|
|
248
|
+
muted: string;
|
|
249
|
+
accent: string;
|
|
250
|
+
inverse: string;
|
|
251
|
+
};
|
|
252
|
+
border: {
|
|
253
|
+
focus: string;
|
|
254
|
+
default: string;
|
|
255
|
+
error: string;
|
|
256
|
+
muted: string;
|
|
257
|
+
};
|
|
258
|
+
surface: {
|
|
259
|
+
primary: string;
|
|
260
|
+
secondary: string;
|
|
261
|
+
inverse: string;
|
|
262
|
+
tertiary: string;
|
|
263
|
+
};
|
|
264
|
+
};
|
|
265
|
+
atomic: {
|
|
266
|
+
spacing: Record<string, string>;
|
|
267
|
+
color: Record<string, Record<string, string>>;
|
|
268
|
+
shadow: Record<string, string>;
|
|
269
|
+
typography: Record<string, {
|
|
270
|
+
fontSize: string;
|
|
271
|
+
fontWeight: string;
|
|
272
|
+
lineHeight: string;
|
|
273
|
+
}>;
|
|
274
|
+
radius: Record<string, string>;
|
|
275
|
+
transition?: Record<string, string> | undefined;
|
|
276
|
+
};
|
|
277
|
+
}>;
|
|
278
|
+
/** Optional dark mode token overrides */
|
|
279
|
+
darkMode: z.ZodOptional<z.ZodObject<{
|
|
280
|
+
tokens: z.ZodObject<{
|
|
281
|
+
semantic: z.ZodRecord<z.ZodString, z.ZodAny>;
|
|
282
|
+
component: z.ZodRecord<z.ZodString, z.ZodAny>;
|
|
283
|
+
}, "strip", z.ZodTypeAny, {
|
|
284
|
+
component: Record<string, any>;
|
|
285
|
+
semantic: Record<string, any>;
|
|
286
|
+
}, {
|
|
287
|
+
component: Record<string, any>;
|
|
288
|
+
semantic: Record<string, any>;
|
|
289
|
+
}>;
|
|
290
|
+
}, "strip", z.ZodTypeAny, {
|
|
291
|
+
tokens: {
|
|
292
|
+
component: Record<string, any>;
|
|
293
|
+
semantic: Record<string, any>;
|
|
294
|
+
};
|
|
295
|
+
}, {
|
|
296
|
+
tokens: {
|
|
297
|
+
component: Record<string, any>;
|
|
298
|
+
semantic: Record<string, any>;
|
|
299
|
+
};
|
|
300
|
+
}>>;
|
|
301
|
+
}, "strip", z.ZodTypeAny, {
|
|
302
|
+
tokens: {
|
|
303
|
+
component: Record<string, any>;
|
|
304
|
+
semantic: {
|
|
305
|
+
background: {
|
|
306
|
+
page: string;
|
|
307
|
+
muted: string;
|
|
308
|
+
inverse: string;
|
|
309
|
+
elevated: string;
|
|
310
|
+
surface: string;
|
|
311
|
+
};
|
|
312
|
+
foreground: {
|
|
313
|
+
primary: string;
|
|
314
|
+
secondary: string;
|
|
315
|
+
muted: string;
|
|
316
|
+
accent: string;
|
|
317
|
+
inverse: string;
|
|
318
|
+
};
|
|
319
|
+
border: {
|
|
320
|
+
focus: string;
|
|
321
|
+
default: string;
|
|
322
|
+
error: string;
|
|
323
|
+
muted: string;
|
|
324
|
+
};
|
|
325
|
+
surface: {
|
|
326
|
+
primary: string;
|
|
327
|
+
secondary: string;
|
|
328
|
+
inverse: string;
|
|
329
|
+
tertiary: string;
|
|
330
|
+
};
|
|
331
|
+
};
|
|
332
|
+
atomic: {
|
|
333
|
+
spacing: Record<string, string>;
|
|
334
|
+
color: Record<string, Record<string, string>>;
|
|
335
|
+
shadow: Record<string, string>;
|
|
336
|
+
typography: Record<string, {
|
|
337
|
+
fontSize: string;
|
|
338
|
+
fontWeight: string;
|
|
339
|
+
lineHeight: string;
|
|
340
|
+
}>;
|
|
341
|
+
radius: Record<string, string>;
|
|
342
|
+
transition?: Record<string, string> | undefined;
|
|
343
|
+
};
|
|
344
|
+
};
|
|
345
|
+
darkMode?: {
|
|
346
|
+
tokens: {
|
|
347
|
+
component: Record<string, any>;
|
|
348
|
+
semantic: Record<string, any>;
|
|
349
|
+
};
|
|
350
|
+
} | undefined;
|
|
351
|
+
}, {
|
|
352
|
+
tokens: {
|
|
353
|
+
component: Record<string, any>;
|
|
354
|
+
semantic: {
|
|
355
|
+
background: {
|
|
356
|
+
page: string;
|
|
357
|
+
muted: string;
|
|
358
|
+
inverse: string;
|
|
359
|
+
elevated: string;
|
|
360
|
+
surface: string;
|
|
361
|
+
};
|
|
362
|
+
foreground: {
|
|
363
|
+
primary: string;
|
|
364
|
+
secondary: string;
|
|
365
|
+
muted: string;
|
|
366
|
+
accent: string;
|
|
367
|
+
inverse: string;
|
|
368
|
+
};
|
|
369
|
+
border: {
|
|
370
|
+
focus: string;
|
|
371
|
+
default: string;
|
|
372
|
+
error: string;
|
|
373
|
+
muted: string;
|
|
374
|
+
};
|
|
375
|
+
surface: {
|
|
376
|
+
primary: string;
|
|
377
|
+
secondary: string;
|
|
378
|
+
inverse: string;
|
|
379
|
+
tertiary: string;
|
|
380
|
+
};
|
|
381
|
+
};
|
|
382
|
+
atomic: {
|
|
383
|
+
spacing: Record<string, string>;
|
|
384
|
+
color: Record<string, Record<string, string>>;
|
|
385
|
+
shadow: Record<string, string>;
|
|
386
|
+
typography: Record<string, {
|
|
387
|
+
fontSize: string;
|
|
388
|
+
fontWeight: string;
|
|
389
|
+
lineHeight: string;
|
|
390
|
+
}>;
|
|
391
|
+
radius: Record<string, string>;
|
|
392
|
+
transition?: Record<string, string> | undefined;
|
|
393
|
+
};
|
|
394
|
+
};
|
|
395
|
+
darkMode?: {
|
|
396
|
+
tokens: {
|
|
397
|
+
component: Record<string, any>;
|
|
398
|
+
semantic: Record<string, any>;
|
|
399
|
+
};
|
|
400
|
+
} | undefined;
|
|
401
|
+
}>;
|
|
402
|
+
/**
|
|
403
|
+
* Validation result with detailed error information
|
|
404
|
+
*/
|
|
405
|
+
export interface ValidationResult {
|
|
406
|
+
/** Whether validation passed */
|
|
407
|
+
valid: boolean;
|
|
408
|
+
/** Error messages if validation failed (undefined if valid) */
|
|
409
|
+
errors?: string[];
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Validates a theme with token structure
|
|
413
|
+
*
|
|
414
|
+
* Uses Zod schema validation to ensure:
|
|
415
|
+
* - All required atomic tokens are present
|
|
416
|
+
* - All required semantic tokens are defined
|
|
417
|
+
* - Component tokens structure is valid
|
|
418
|
+
* - Dark mode tokens (if present) follow correct structure
|
|
419
|
+
*
|
|
420
|
+
* @param theme - Theme object to validate
|
|
421
|
+
* @returns Validation result with success status and error messages
|
|
422
|
+
*
|
|
423
|
+
* @example
|
|
424
|
+
* ```typescript
|
|
425
|
+
* const result = validateTheme(myTheme);
|
|
426
|
+
* if (!result.valid) {
|
|
427
|
+
* console.error('Validation errors:', result.errors);
|
|
428
|
+
* }
|
|
429
|
+
* ```
|
|
430
|
+
*/
|
|
431
|
+
export declare function validateTheme(theme: unknown): ValidationResult;
|
|
432
|
+
//# sourceMappingURL=token-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-validation.d.ts","sourceRoot":"","sources":["../src/token-validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAiGxB;;;GAGG;AACH,eAAO,MAAM,qBAAqB;IAChC,8BAA8B;;;YA3F9B,iCAAiC;;YAGjC,oBAAoB;;YAGpB,2BAA2B;;YAG3B,6BAA6B;;;;;;;;;;;;;;YAS7B,yBAAyB;;YAGzB,wCAAwC;;;;;;;;;;;;;;;;;;;;;;;;;;YASxC,8CAA8C;;;;;;;;;;;;;;;;;;;;YAS9C,qDAAqD;;;;;;;;;;;;;;;;;;;;YASrD,0CAA0C;;;;;;;;;;;;;;;;;YAQ1C,2CAA2C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA0C3C,yCAAyC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASzC,CAAC;AAMH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,KAAK,EAAE,OAAO,CAAC;IAEf,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAc9D"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @tekton-ui/core - Token Validation
|
|
3
|
+
* Runtime validation using Zod schemas for 3-layer token architecture
|
|
4
|
+
* [SPEC-COMPONENT-001-A] [TOKEN-VALIDATION]
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Zod Schema Definitions
|
|
9
|
+
// ============================================================================
|
|
10
|
+
/**
|
|
11
|
+
* Atomic Tokens Schema - Layer 1
|
|
12
|
+
* Validates raw design values (colors, spacing, typography, etc.)
|
|
13
|
+
*/
|
|
14
|
+
const AtomicTokensSchema = z.object({
|
|
15
|
+
/** Color palettes with shades */
|
|
16
|
+
color: z.record(z.record(z.string())),
|
|
17
|
+
/** Spacing scale */
|
|
18
|
+
spacing: z.record(z.string()),
|
|
19
|
+
/** Border radius values */
|
|
20
|
+
radius: z.record(z.string()),
|
|
21
|
+
/** Typography definitions */
|
|
22
|
+
typography: z.record(z.object({
|
|
23
|
+
fontSize: z.string(),
|
|
24
|
+
lineHeight: z.string(),
|
|
25
|
+
fontWeight: z.string(),
|
|
26
|
+
})),
|
|
27
|
+
/** Shadow definitions */
|
|
28
|
+
shadow: z.record(z.string()),
|
|
29
|
+
/** Transition definitions (optional) */
|
|
30
|
+
transition: z.record(z.string()).optional(),
|
|
31
|
+
});
|
|
32
|
+
/**
|
|
33
|
+
* Semantic Tokens Schema - Layer 2
|
|
34
|
+
* Validates meaning-based token mappings
|
|
35
|
+
*/
|
|
36
|
+
const SemanticTokensSchema = z.object({
|
|
37
|
+
/** Background colors with semantic meaning */
|
|
38
|
+
background: z.object({
|
|
39
|
+
page: z.string(),
|
|
40
|
+
surface: z.string(),
|
|
41
|
+
elevated: z.string(),
|
|
42
|
+
muted: z.string(),
|
|
43
|
+
inverse: z.string(),
|
|
44
|
+
}),
|
|
45
|
+
/** Foreground (text) colors with semantic meaning */
|
|
46
|
+
foreground: z.object({
|
|
47
|
+
primary: z.string(),
|
|
48
|
+
secondary: z.string(),
|
|
49
|
+
muted: z.string(),
|
|
50
|
+
inverse: z.string(),
|
|
51
|
+
accent: z.string(),
|
|
52
|
+
}),
|
|
53
|
+
/** Border colors with semantic meaning */
|
|
54
|
+
border: z.object({
|
|
55
|
+
default: z.string(),
|
|
56
|
+
muted: z.string(),
|
|
57
|
+
focus: z.string(),
|
|
58
|
+
error: z.string(),
|
|
59
|
+
}),
|
|
60
|
+
/** Surface colors with semantic meaning */
|
|
61
|
+
surface: z.object({
|
|
62
|
+
primary: z.string(),
|
|
63
|
+
secondary: z.string(),
|
|
64
|
+
tertiary: z.string(),
|
|
65
|
+
inverse: z.string(),
|
|
66
|
+
}),
|
|
67
|
+
});
|
|
68
|
+
/**
|
|
69
|
+
* Component Tokens Schema - Layer 3
|
|
70
|
+
* Validates component-specific token bindings
|
|
71
|
+
* Flexible to allow extensible component definitions
|
|
72
|
+
*/
|
|
73
|
+
const ComponentTokensSchema = z.record(z.any());
|
|
74
|
+
/**
|
|
75
|
+
* Dark Mode Semantic Tokens Schema
|
|
76
|
+
* Allows partial overrides of semantic tokens for dark mode
|
|
77
|
+
* Uses flexible validation since dark mode is opt-in and can override any semantic token
|
|
78
|
+
*/
|
|
79
|
+
const DarkModeSemanticTokensSchema = z.record(z.any());
|
|
80
|
+
/**
|
|
81
|
+
* Dark Mode Component Tokens Schema
|
|
82
|
+
* Allows partial overrides of component tokens for dark mode
|
|
83
|
+
* Uses flexible validation for extensibility
|
|
84
|
+
*/
|
|
85
|
+
const DarkModeComponentTokensSchema = z.record(z.any());
|
|
86
|
+
/**
|
|
87
|
+
* Theme with Tokens Schema
|
|
88
|
+
* Validates complete 3-layer token structure with optional dark mode
|
|
89
|
+
*/
|
|
90
|
+
export const ThemeWithTokensSchema = z.object({
|
|
91
|
+
/** 3-layer token structure */
|
|
92
|
+
tokens: z.object({
|
|
93
|
+
atomic: AtomicTokensSchema,
|
|
94
|
+
semantic: SemanticTokensSchema,
|
|
95
|
+
component: ComponentTokensSchema,
|
|
96
|
+
}),
|
|
97
|
+
/** Optional dark mode token overrides */
|
|
98
|
+
darkMode: z
|
|
99
|
+
.object({
|
|
100
|
+
tokens: z.object({
|
|
101
|
+
semantic: DarkModeSemanticTokensSchema,
|
|
102
|
+
component: DarkModeComponentTokensSchema,
|
|
103
|
+
}),
|
|
104
|
+
})
|
|
105
|
+
.optional(),
|
|
106
|
+
});
|
|
107
|
+
/**
|
|
108
|
+
* Validates a theme with token structure
|
|
109
|
+
*
|
|
110
|
+
* Uses Zod schema validation to ensure:
|
|
111
|
+
* - All required atomic tokens are present
|
|
112
|
+
* - All required semantic tokens are defined
|
|
113
|
+
* - Component tokens structure is valid
|
|
114
|
+
* - Dark mode tokens (if present) follow correct structure
|
|
115
|
+
*
|
|
116
|
+
* @param theme - Theme object to validate
|
|
117
|
+
* @returns Validation result with success status and error messages
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```typescript
|
|
121
|
+
* const result = validateTheme(myTheme);
|
|
122
|
+
* if (!result.valid) {
|
|
123
|
+
* console.error('Validation errors:', result.errors);
|
|
124
|
+
* }
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
export function validateTheme(theme) {
|
|
128
|
+
const result = ThemeWithTokensSchema.safeParse(theme);
|
|
129
|
+
if (!result.success) {
|
|
130
|
+
return {
|
|
131
|
+
valid: false,
|
|
132
|
+
errors: result.error.errors.map(e => {
|
|
133
|
+
const path = e.path.join('.');
|
|
134
|
+
return `${path}: ${e.message}`;
|
|
135
|
+
}),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
return { valid: true };
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=token-validation.js.map
|