@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.
Files changed (254) hide show
  1. package/README.md +758 -0
  2. package/dist/blueprint.d.ts +44 -0
  3. package/dist/blueprint.d.ts.map +1 -0
  4. package/dist/blueprint.js +163 -0
  5. package/dist/blueprint.js.map +1 -0
  6. package/dist/component-schemas.d.ts +78 -0
  7. package/dist/component-schemas.d.ts.map +1 -0
  8. package/dist/component-schemas.js +1037 -0
  9. package/dist/component-schemas.js.map +1 -0
  10. package/dist/css-generator.d.ts +42 -0
  11. package/dist/css-generator.d.ts.map +1 -0
  12. package/dist/css-generator.js +339 -0
  13. package/dist/css-generator.js.map +1 -0
  14. package/dist/icon-library.d.ts +109 -0
  15. package/dist/icon-library.d.ts.map +1 -0
  16. package/dist/icon-library.js +204 -0
  17. package/dist/icon-library.js.map +1 -0
  18. package/dist/index.d.ts +36 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +51 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/layout-css-generator.d.ts +158 -0
  23. package/dist/layout-css-generator.d.ts.map +1 -0
  24. package/dist/layout-css-generator.js +901 -0
  25. package/dist/layout-css-generator.js.map +1 -0
  26. package/dist/layout-resolver.d.ts +92 -0
  27. package/dist/layout-resolver.d.ts.map +1 -0
  28. package/dist/layout-resolver.js +275 -0
  29. package/dist/layout-resolver.js.map +1 -0
  30. package/dist/layout-tokens/index.d.ts +16 -0
  31. package/dist/layout-tokens/index.d.ts.map +1 -0
  32. package/dist/layout-tokens/index.js +16 -0
  33. package/dist/layout-tokens/index.js.map +1 -0
  34. package/dist/layout-tokens/keyboard.d.ts +254 -0
  35. package/dist/layout-tokens/keyboard.d.ts.map +1 -0
  36. package/dist/layout-tokens/keyboard.js +407 -0
  37. package/dist/layout-tokens/keyboard.js.map +1 -0
  38. package/dist/layout-tokens/mobile-shells.d.ts +78 -0
  39. package/dist/layout-tokens/mobile-shells.d.ts.map +1 -0
  40. package/dist/layout-tokens/mobile-shells.js +635 -0
  41. package/dist/layout-tokens/mobile-shells.js.map +1 -0
  42. package/dist/layout-tokens/pages.d.ts +100 -0
  43. package/dist/layout-tokens/pages.d.ts.map +1 -0
  44. package/dist/layout-tokens/pages.js +576 -0
  45. package/dist/layout-tokens/pages.js.map +1 -0
  46. package/dist/layout-tokens/responsive.d.ts +109 -0
  47. package/dist/layout-tokens/responsive.d.ts.map +1 -0
  48. package/dist/layout-tokens/responsive.js +167 -0
  49. package/dist/layout-tokens/responsive.js.map +1 -0
  50. package/dist/layout-tokens/safe-area.d.ts +156 -0
  51. package/dist/layout-tokens/safe-area.d.ts.map +1 -0
  52. package/dist/layout-tokens/safe-area.js +316 -0
  53. package/dist/layout-tokens/safe-area.js.map +1 -0
  54. package/dist/layout-tokens/sections-advanced.d.ts +277 -0
  55. package/dist/layout-tokens/sections-advanced.d.ts.map +1 -0
  56. package/dist/layout-tokens/sections-advanced.js +593 -0
  57. package/dist/layout-tokens/sections-advanced.js.map +1 -0
  58. package/dist/layout-tokens/sections.d.ts +137 -0
  59. package/dist/layout-tokens/sections.d.ts.map +1 -0
  60. package/dist/layout-tokens/sections.js +694 -0
  61. package/dist/layout-tokens/sections.js.map +1 -0
  62. package/dist/layout-tokens/shells.d.ts +77 -0
  63. package/dist/layout-tokens/shells.d.ts.map +1 -0
  64. package/dist/layout-tokens/shells.js +408 -0
  65. package/dist/layout-tokens/shells.js.map +1 -0
  66. package/dist/layout-tokens/touch-target.d.ts +119 -0
  67. package/dist/layout-tokens/touch-target.d.ts.map +1 -0
  68. package/dist/layout-tokens/touch-target.js +156 -0
  69. package/dist/layout-tokens/touch-target.js.map +1 -0
  70. package/dist/layout-tokens/types.d.ts +632 -0
  71. package/dist/layout-tokens/types.d.ts.map +1 -0
  72. package/dist/layout-tokens/types.js +49 -0
  73. package/dist/layout-tokens/types.js.map +1 -0
  74. package/dist/layout-validation.d.ts +1547 -0
  75. package/dist/layout-validation.d.ts.map +1 -0
  76. package/dist/layout-validation.js +628 -0
  77. package/dist/layout-validation.js.map +1 -0
  78. package/dist/render.d.ts +23 -0
  79. package/dist/render.d.ts.map +1 -0
  80. package/dist/render.js +244 -0
  81. package/dist/render.js.map +1 -0
  82. package/dist/schema-validation.d.ts +208 -0
  83. package/dist/schema-validation.d.ts.map +1 -0
  84. package/dist/schema-validation.js +205 -0
  85. package/dist/schema-validation.js.map +1 -0
  86. package/dist/screen-generation/generators/css-in-js-generator.d.ts +82 -0
  87. package/dist/screen-generation/generators/css-in-js-generator.d.ts.map +1 -0
  88. package/dist/screen-generation/generators/css-in-js-generator.js +335 -0
  89. package/dist/screen-generation/generators/css-in-js-generator.js.map +1 -0
  90. package/dist/screen-generation/generators/index.d.ts +13 -0
  91. package/dist/screen-generation/generators/index.d.ts.map +1 -0
  92. package/dist/screen-generation/generators/index.js +32 -0
  93. package/dist/screen-generation/generators/index.js.map +1 -0
  94. package/dist/screen-generation/generators/react-generator.d.ts +100 -0
  95. package/dist/screen-generation/generators/react-generator.d.ts.map +1 -0
  96. package/dist/screen-generation/generators/react-generator.js +379 -0
  97. package/dist/screen-generation/generators/react-generator.js.map +1 -0
  98. package/dist/screen-generation/generators/tailwind-generator.d.ts +105 -0
  99. package/dist/screen-generation/generators/tailwind-generator.d.ts.map +1 -0
  100. package/dist/screen-generation/generators/tailwind-generator.js +355 -0
  101. package/dist/screen-generation/generators/tailwind-generator.js.map +1 -0
  102. package/dist/screen-generation/generators/types.d.ts +136 -0
  103. package/dist/screen-generation/generators/types.d.ts.map +1 -0
  104. package/dist/screen-generation/generators/types.js +18 -0
  105. package/dist/screen-generation/generators/types.js.map +1 -0
  106. package/dist/screen-generation/generators/utils.d.ts +187 -0
  107. package/dist/screen-generation/generators/utils.d.ts.map +1 -0
  108. package/dist/screen-generation/generators/utils.js +312 -0
  109. package/dist/screen-generation/generators/utils.js.map +1 -0
  110. package/dist/screen-generation/index.d.ts +14 -0
  111. package/dist/screen-generation/index.d.ts.map +1 -0
  112. package/dist/screen-generation/index.js +33 -0
  113. package/dist/screen-generation/index.js.map +1 -0
  114. package/dist/screen-generation/resolver/component-resolver.d.ts +157 -0
  115. package/dist/screen-generation/resolver/component-resolver.d.ts.map +1 -0
  116. package/dist/screen-generation/resolver/component-resolver.js +295 -0
  117. package/dist/screen-generation/resolver/component-resolver.js.map +1 -0
  118. package/dist/screen-generation/resolver/index.d.ts +10 -0
  119. package/dist/screen-generation/resolver/index.d.ts.map +1 -0
  120. package/dist/screen-generation/resolver/index.js +46 -0
  121. package/dist/screen-generation/resolver/index.js.map +1 -0
  122. package/dist/screen-generation/resolver/layout-resolver.d.ts +155 -0
  123. package/dist/screen-generation/resolver/layout-resolver.d.ts.map +1 -0
  124. package/dist/screen-generation/resolver/layout-resolver.js +193 -0
  125. package/dist/screen-generation/resolver/layout-resolver.js.map +1 -0
  126. package/dist/screen-generation/resolver/screen-resolver.d.ts +174 -0
  127. package/dist/screen-generation/resolver/screen-resolver.d.ts.map +1 -0
  128. package/dist/screen-generation/resolver/screen-resolver.js +373 -0
  129. package/dist/screen-generation/resolver/screen-resolver.js.map +1 -0
  130. package/dist/screen-generation/resolver/token-resolver.d.ts +170 -0
  131. package/dist/screen-generation/resolver/token-resolver.d.ts.map +1 -0
  132. package/dist/screen-generation/resolver/token-resolver.js +260 -0
  133. package/dist/screen-generation/resolver/token-resolver.js.map +1 -0
  134. package/dist/screen-generation/types.d.ts +116 -0
  135. package/dist/screen-generation/types.d.ts.map +1 -0
  136. package/dist/screen-generation/types.js +33 -0
  137. package/dist/screen-generation/types.js.map +1 -0
  138. package/dist/screen-generation/validators.d.ts +286 -0
  139. package/dist/screen-generation/validators.d.ts.map +1 -0
  140. package/dist/screen-generation/validators.js +323 -0
  141. package/dist/screen-generation/validators.js.map +1 -0
  142. package/dist/screen-templates/__tests__/registry.test.d.ts +6 -0
  143. package/dist/screen-templates/__tests__/registry.test.d.ts.map +1 -0
  144. package/dist/screen-templates/__tests__/registry.test.js +247 -0
  145. package/dist/screen-templates/__tests__/registry.test.js.map +1 -0
  146. package/dist/screen-templates/__tests__/templates.test.d.ts +6 -0
  147. package/dist/screen-templates/__tests__/templates.test.d.ts.map +1 -0
  148. package/dist/screen-templates/__tests__/templates.test.js +179 -0
  149. package/dist/screen-templates/__tests__/templates.test.js.map +1 -0
  150. package/dist/screen-templates/index.d.ts +39 -0
  151. package/dist/screen-templates/index.d.ts.map +1 -0
  152. package/dist/screen-templates/index.js +79 -0
  153. package/dist/screen-templates/index.js.map +1 -0
  154. package/dist/screen-templates/registry.d.ts +177 -0
  155. package/dist/screen-templates/registry.d.ts.map +1 -0
  156. package/dist/screen-templates/registry.js +274 -0
  157. package/dist/screen-templates/registry.js.map +1 -0
  158. package/dist/screen-templates/templates/account/index.d.ts +6 -0
  159. package/dist/screen-templates/templates/account/index.d.ts.map +1 -0
  160. package/dist/screen-templates/templates/account/index.js +6 -0
  161. package/dist/screen-templates/templates/account/index.js.map +1 -0
  162. package/dist/screen-templates/templates/account/profile.d.ts +23 -0
  163. package/dist/screen-templates/templates/account/profile.d.ts.map +1 -0
  164. package/dist/screen-templates/templates/account/profile.js +249 -0
  165. package/dist/screen-templates/templates/account/profile.js.map +1 -0
  166. package/dist/screen-templates/templates/auth/forgot-password.d.ts +23 -0
  167. package/dist/screen-templates/templates/auth/forgot-password.d.ts.map +1 -0
  168. package/dist/screen-templates/templates/auth/forgot-password.js +203 -0
  169. package/dist/screen-templates/templates/auth/forgot-password.js.map +1 -0
  170. package/dist/screen-templates/templates/auth/index.d.ts +9 -0
  171. package/dist/screen-templates/templates/auth/index.d.ts.map +1 -0
  172. package/dist/screen-templates/templates/auth/index.js +9 -0
  173. package/dist/screen-templates/templates/auth/index.js.map +1 -0
  174. package/dist/screen-templates/templates/auth/login.d.ts +24 -0
  175. package/dist/screen-templates/templates/auth/login.d.ts.map +1 -0
  176. package/dist/screen-templates/templates/auth/login.js +254 -0
  177. package/dist/screen-templates/templates/auth/login.js.map +1 -0
  178. package/dist/screen-templates/templates/auth/signup.d.ts +24 -0
  179. package/dist/screen-templates/templates/auth/signup.d.ts.map +1 -0
  180. package/dist/screen-templates/templates/auth/signup.js +315 -0
  181. package/dist/screen-templates/templates/auth/signup.js.map +1 -0
  182. package/dist/screen-templates/templates/auth/verification.d.ts +23 -0
  183. package/dist/screen-templates/templates/auth/verification.d.ts.map +1 -0
  184. package/dist/screen-templates/templates/auth/verification.js +239 -0
  185. package/dist/screen-templates/templates/auth/verification.js.map +1 -0
  186. package/dist/screen-templates/templates/feedback/confirmation.d.ts +9 -0
  187. package/dist/screen-templates/templates/feedback/confirmation.d.ts.map +1 -0
  188. package/dist/screen-templates/templates/feedback/confirmation.js +107 -0
  189. package/dist/screen-templates/templates/feedback/confirmation.js.map +1 -0
  190. package/dist/screen-templates/templates/feedback/empty.d.ts +9 -0
  191. package/dist/screen-templates/templates/feedback/empty.d.ts.map +1 -0
  192. package/dist/screen-templates/templates/feedback/empty.js +90 -0
  193. package/dist/screen-templates/templates/feedback/empty.js.map +1 -0
  194. package/dist/screen-templates/templates/feedback/error.d.ts +9 -0
  195. package/dist/screen-templates/templates/feedback/error.d.ts.map +1 -0
  196. package/dist/screen-templates/templates/feedback/error.js +99 -0
  197. package/dist/screen-templates/templates/feedback/error.js.map +1 -0
  198. package/dist/screen-templates/templates/feedback/index.d.ts +10 -0
  199. package/dist/screen-templates/templates/feedback/index.d.ts.map +1 -0
  200. package/dist/screen-templates/templates/feedback/index.js +10 -0
  201. package/dist/screen-templates/templates/feedback/index.js.map +1 -0
  202. package/dist/screen-templates/templates/feedback/loading.d.ts +9 -0
  203. package/dist/screen-templates/templates/feedback/loading.d.ts.map +1 -0
  204. package/dist/screen-templates/templates/feedback/loading.js +77 -0
  205. package/dist/screen-templates/templates/feedback/loading.js.map +1 -0
  206. package/dist/screen-templates/templates/feedback/success.d.ts +9 -0
  207. package/dist/screen-templates/templates/feedback/success.d.ts.map +1 -0
  208. package/dist/screen-templates/templates/feedback/success.js +99 -0
  209. package/dist/screen-templates/templates/feedback/success.js.map +1 -0
  210. package/dist/screen-templates/templates/home/index.d.ts +6 -0
  211. package/dist/screen-templates/templates/home/index.d.ts.map +1 -0
  212. package/dist/screen-templates/templates/home/index.js +6 -0
  213. package/dist/screen-templates/templates/home/index.js.map +1 -0
  214. package/dist/screen-templates/templates/home/landing.d.ts +24 -0
  215. package/dist/screen-templates/templates/home/landing.d.ts.map +1 -0
  216. package/dist/screen-templates/templates/home/landing.js +197 -0
  217. package/dist/screen-templates/templates/home/landing.js.map +1 -0
  218. package/dist/screen-templates/templates/settings/index.d.ts +6 -0
  219. package/dist/screen-templates/templates/settings/index.d.ts.map +1 -0
  220. package/dist/screen-templates/templates/settings/index.js +6 -0
  221. package/dist/screen-templates/templates/settings/index.js.map +1 -0
  222. package/dist/screen-templates/templates/settings/preferences.d.ts +24 -0
  223. package/dist/screen-templates/templates/settings/preferences.d.ts.map +1 -0
  224. package/dist/screen-templates/templates/settings/preferences.js +265 -0
  225. package/dist/screen-templates/templates/settings/preferences.js.map +1 -0
  226. package/dist/screen-templates/types.d.ts +229 -0
  227. package/dist/screen-templates/types.d.ts.map +1 -0
  228. package/dist/screen-templates/types.js +7 -0
  229. package/dist/screen-templates/types.js.map +1 -0
  230. package/dist/theme-v2.d.ts +228 -0
  231. package/dist/theme-v2.d.ts.map +1 -0
  232. package/dist/theme-v2.js +158 -0
  233. package/dist/theme-v2.js.map +1 -0
  234. package/dist/theme.d.ts +60 -0
  235. package/dist/theme.d.ts.map +1 -0
  236. package/dist/theme.js +76 -0
  237. package/dist/theme.js.map +1 -0
  238. package/dist/token-resolver.d.ts +69 -0
  239. package/dist/token-resolver.d.ts.map +1 -0
  240. package/dist/token-resolver.js +122 -0
  241. package/dist/token-resolver.js.map +1 -0
  242. package/dist/token-validation.d.ts +432 -0
  243. package/dist/token-validation.d.ts.map +1 -0
  244. package/dist/token-validation.js +140 -0
  245. package/dist/token-validation.js.map +1 -0
  246. package/dist/tokens.d.ts +158 -0
  247. package/dist/tokens.d.ts.map +1 -0
  248. package/dist/tokens.js +10 -0
  249. package/dist/tokens.js.map +1 -0
  250. package/dist/types.d.ts +77 -0
  251. package/dist/types.d.ts.map +1 -0
  252. package/dist/types.js +7 -0
  253. package/dist/types.js.map +1 -0
  254. 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