@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,260 @@
1
+ /**
2
+ * @tekton-ui/core - Token Binding Resolver
3
+ * Resolves token bindings with template variable substitution
4
+ * [SPEC-LAYOUT-002] [PHASE-2]
5
+ */
6
+ // ============================================================================
7
+ // Cache
8
+ // ============================================================================
9
+ /**
10
+ * Token binding cache for performance optimization
11
+ * Key: `${binding}:${JSON.stringify(props)}:${theme}`
12
+ */
13
+ const bindingCache = new Map();
14
+ /**
15
+ * Clear token binding cache
16
+ * Useful for testing or when token definitions change
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * clearBindingCache();
21
+ * ```
22
+ */
23
+ export function clearBindingCache() {
24
+ bindingCache.clear();
25
+ }
26
+ // ============================================================================
27
+ // Template Variable Substitution
28
+ // ============================================================================
29
+ /**
30
+ * Substitute template variables in token binding
31
+ *
32
+ * Template syntax: `{variableName}`
33
+ * Variables are resolved from component props
34
+ *
35
+ * @param binding - Token binding with template variables (e.g., "component.button.{variant}.background")
36
+ * @param props - Component props (e.g., { variant: "primary" })
37
+ * @returns Token reference with substituted variables (e.g., "component.button.primary.background")
38
+ * @throws Error if required template variable is missing from props
39
+ *
40
+ * @example
41
+ * ```typescript
42
+ * substituteTemplateVariables(
43
+ * 'component.button.{variant}.background',
44
+ * { variant: 'primary' }
45
+ * ); // → 'component.button.primary.background'
46
+ *
47
+ * substituteTemplateVariables(
48
+ * 'atomic.spacing.{size}',
49
+ * { size: 'large' }
50
+ * ); // → 'atomic.spacing.large'
51
+ * ```
52
+ */
53
+ export function substituteTemplateVariables(binding, props) {
54
+ // Match template variables: {variableName}
55
+ const templateVarRegex = /\{([^}]+)\}/g;
56
+ const matches = [...binding.matchAll(templateVarRegex)];
57
+ if (matches.length === 0) {
58
+ // No template variables, return as-is
59
+ return binding;
60
+ }
61
+ let result = binding;
62
+ for (const match of matches) {
63
+ const variableName = match[1];
64
+ const variableValue = props[variableName];
65
+ if (variableValue === undefined) {
66
+ throw new Error(`Template variable '${variableName}' not found in props. ` +
67
+ `Available props: ${Object.keys(props).join(', ')}`);
68
+ }
69
+ if (typeof variableValue !== 'string' && typeof variableValue !== 'number') {
70
+ throw new Error(`Template variable '${variableName}' must be string or number, ` +
71
+ `got ${typeof variableValue}`);
72
+ }
73
+ // Replace template variable with prop value
74
+ result = result.replace(`{${variableName}}`, String(variableValue));
75
+ }
76
+ return result;
77
+ }
78
+ // ============================================================================
79
+ // Token Reference to CSS Variable Conversion
80
+ // ============================================================================
81
+ /**
82
+ * Convert token reference to CSS variable reference
83
+ *
84
+ * Converts dot notation to CSS custom property format:
85
+ * - "atomic.spacing.16" → "var(--atomic-spacing-16)"
86
+ * - "semantic.color.primary" → "var(--semantic-color-primary)"
87
+ *
88
+ * @param tokenRef - Token reference in dot notation
89
+ * @returns CSS variable reference in var() format
90
+ *
91
+ * @example
92
+ * ```typescript
93
+ * tokenRefToCSSVar('atomic.spacing.16'); // → 'var(--atomic-spacing-16)'
94
+ * tokenRefToCSSVar('semantic.color.primary'); // → 'var(--semantic-color-primary)'
95
+ * ```
96
+ */
97
+ export function tokenRefToCSSVar(tokenRef) {
98
+ // Convert dot notation to CSS variable format
99
+ // "atomic.spacing.16" → "--atomic-spacing-16"
100
+ const cssVarName = `--${tokenRef.replace(/\./g, '-')}`;
101
+ // Wrap in var() function
102
+ return `var(${cssVarName})`;
103
+ }
104
+ // ============================================================================
105
+ // Core Resolution Functions
106
+ // ============================================================================
107
+ /**
108
+ * Resolve single token binding with caching
109
+ *
110
+ * Process:
111
+ * 1. Check cache for previously resolved binding
112
+ * 2. Substitute template variables from props
113
+ * 3. Convert to CSS variable reference
114
+ * 4. Cache the result
115
+ *
116
+ * @param binding - Token binding (may contain template variables)
117
+ * @param context - Resolution context with props and theme
118
+ * @returns CSS variable reference
119
+ * @throws Error if template variable substitution fails
120
+ *
121
+ * @example
122
+ * ```typescript
123
+ * const context = {
124
+ * props: { variant: 'primary', size: 'medium' },
125
+ * theme: 'default'
126
+ * };
127
+ *
128
+ * resolveBinding('component.button.{variant}.background', context);
129
+ * // → 'var(--component-button-primary-background)'
130
+ *
131
+ * resolveBinding('atomic.spacing.{size}', context);
132
+ * // → 'var(--atomic-spacing-medium)'
133
+ * ```
134
+ */
135
+ export function resolveBinding(binding, context) {
136
+ // Generate cache key
137
+ const cacheKey = `${binding}:${JSON.stringify(context.props)}:${context.theme}`;
138
+ // Check cache
139
+ const cached = bindingCache.get(cacheKey);
140
+ if (cached) {
141
+ return cached;
142
+ }
143
+ // Substitute template variables
144
+ const tokenRef = substituteTemplateVariables(binding, context.props);
145
+ // Convert to CSS variable
146
+ const cssVar = tokenRefToCSSVar(tokenRef);
147
+ // Cache result
148
+ bindingCache.set(cacheKey, cssVar);
149
+ return cssVar;
150
+ }
151
+ /**
152
+ * Resolve all token bindings for a component
153
+ *
154
+ * Processes all token bindings in the component schema,
155
+ * substituting template variables and converting to CSS variables.
156
+ *
157
+ * @param bindings - Token bindings from component schema
158
+ * @param context - Resolution context with props and theme
159
+ * @returns Resolved token bindings map (property → CSS variable)
160
+ *
161
+ * @example
162
+ * ```typescript
163
+ * const bindings = {
164
+ * background: 'component.button.{variant}.background',
165
+ * foreground: 'component.button.{variant}.foreground',
166
+ * padding: 'atomic.spacing.{size}'
167
+ * };
168
+ *
169
+ * const context = {
170
+ * props: { variant: 'primary', size: 'medium' },
171
+ * theme: 'default'
172
+ * };
173
+ *
174
+ * const resolved = resolveBindings(bindings, context);
175
+ * // {
176
+ * // background: 'var(--component-button-primary-background)',
177
+ * // foreground: 'var(--component-button-primary-foreground)',
178
+ * // padding: 'var(--atomic-spacing-medium)'
179
+ * // }
180
+ * ```
181
+ */
182
+ export function resolveBindings(bindings, context) {
183
+ const resolved = {};
184
+ for (const [propName, binding] of Object.entries(bindings)) {
185
+ try {
186
+ resolved[propName] = resolveBinding(binding, context);
187
+ }
188
+ catch (error) {
189
+ // Provide helpful error message with context
190
+ throw new Error(`Failed to resolve token binding for property '${propName}': ${error instanceof Error ? error.message : String(error)}`);
191
+ }
192
+ }
193
+ return resolved;
194
+ }
195
+ // ============================================================================
196
+ // Validation Utilities
197
+ // ============================================================================
198
+ /**
199
+ * Validate token binding format
200
+ *
201
+ * Checks if a token binding string is valid:
202
+ * - Must be in dot notation (e.g., "atomic.spacing.16")
203
+ * - May contain template variables (e.g., "component.button.{variant}.background")
204
+ * - Must start with valid layer (atomic, semantic, component)
205
+ *
206
+ * @param binding - Token binding to validate
207
+ * @returns True if valid, false otherwise
208
+ *
209
+ * @example
210
+ * ```typescript
211
+ * isValidTokenBinding('atomic.spacing.16'); // → true
212
+ * isValidTokenBinding('component.button.{variant}.background'); // → true
213
+ * isValidTokenBinding('invalid-format'); // → false
214
+ * ```
215
+ */
216
+ export function isValidTokenBinding(binding) {
217
+ // Check if binding starts with valid layer
218
+ const startsWithLayer = binding.startsWith('atomic.') ||
219
+ binding.startsWith('semantic.') ||
220
+ binding.startsWith('component.');
221
+ if (!startsWithLayer) {
222
+ return false;
223
+ }
224
+ // Check if binding contains at least one dot
225
+ if (!binding.includes('.')) {
226
+ return false;
227
+ }
228
+ // Check if template variables are properly formatted
229
+ const templateVarRegex = /\{([^}]+)\}/g;
230
+ const matches = [...binding.matchAll(templateVarRegex)];
231
+ for (const match of matches) {
232
+ const variableName = match[1];
233
+ // Variable name should be alphanumeric with underscores
234
+ if (!/^[a-zA-Z0-9_]+$/.test(variableName)) {
235
+ return false;
236
+ }
237
+ }
238
+ return true;
239
+ }
240
+ /**
241
+ * Extract template variable names from binding
242
+ *
243
+ * @param binding - Token binding with template variables
244
+ * @returns Array of template variable names
245
+ *
246
+ * @example
247
+ * ```typescript
248
+ * extractTemplateVariables('component.button.{variant}.{size}.background');
249
+ * // → ['variant', 'size']
250
+ *
251
+ * extractTemplateVariables('atomic.spacing.16');
252
+ * // → []
253
+ * ```
254
+ */
255
+ export function extractTemplateVariables(binding) {
256
+ const templateVarRegex = /\{([^}]+)\}/g;
257
+ const matches = [...binding.matchAll(templateVarRegex)];
258
+ return matches.map(match => match[1]);
259
+ }
260
+ //# sourceMappingURL=token-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-resolver.js","sourceRoot":"","sources":["../../../src/screen-generation/resolver/token-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * @tekton-ui/core - Screen Definition Type Definitions
3
+ * Type-safe screen definition interfaces for declarative screen generation
4
+ * [SPEC-LAYOUT-002] [PHASE-1]
5
+ */
6
+ /**
7
+ * Component type enum - 20 component types from SPEC-COMPONENT-001-B
8
+ * Primitive: Button, Input, Text, Heading, Checkbox, Radio, Switch, Slider, Badge, Avatar
9
+ * Composed: Card, Modal, Tabs, Table, Link, List, Image, Form, Dropdown, Progress
10
+ */
11
+ export type ComponentType = 'Button' | 'Input' | 'Text' | 'Heading' | 'Checkbox' | 'Radio' | 'Switch' | 'Slider' | 'Badge' | 'Avatar' | 'Card' | 'Modal' | 'Tabs' | 'Table' | 'Link' | 'List' | 'Image' | 'Form' | 'Dropdown' | 'Progress';
12
+ /**
13
+ * Component Definition - Specifies a component instance
14
+ * Supports nested children and slot-based layout assignment
15
+ */
16
+ export interface ComponentDefinition {
17
+ /** Component type from the 20 available component types */
18
+ type: ComponentType;
19
+ /** Component props (key-value pairs) */
20
+ props: Record<string, unknown>;
21
+ /** Child components or text content */
22
+ children?: (ComponentDefinition | string)[];
23
+ /** Layout slot assignment for positioning within section */
24
+ slot?: string;
25
+ }
26
+ /**
27
+ * Responsive Overrides - Section-level responsive configuration
28
+ * Allows breakpoint-specific layout adjustments
29
+ */
30
+ export interface ResponsiveOverrides {
31
+ /** Small devices override (640px+) */
32
+ sm?: Record<string, unknown>;
33
+ /** Medium devices override (768px+) */
34
+ md?: Record<string, unknown>;
35
+ /** Large devices override (1024px+) */
36
+ lg?: Record<string, unknown>;
37
+ /** Extra large devices override (1280px+) */
38
+ xl?: Record<string, unknown>;
39
+ /** 2X large devices override (1536px+) */
40
+ '2xl'?: Record<string, unknown>;
41
+ }
42
+ /**
43
+ * Section Definition - Layout section with components
44
+ * Represents a section pattern instance with components
45
+ */
46
+ export interface SectionDefinition {
47
+ /** Section identifier (unique within screen) */
48
+ id: string;
49
+ /** Section pattern token ID (e.g., "section.grid-4") */
50
+ pattern: string;
51
+ /** Components within this section */
52
+ components: ComponentDefinition[];
53
+ /** Responsive overrides for this section */
54
+ responsive?: ResponsiveOverrides;
55
+ }
56
+ /**
57
+ * Screen Metadata - Optional metadata for screen definition
58
+ * Tracks authorship, versioning, and categorization
59
+ */
60
+ export interface ScreenMeta {
61
+ /** Screen author */
62
+ author?: string;
63
+ /** Creation timestamp (ISO 8601) */
64
+ createdAt?: string;
65
+ /** Screen version (semver) */
66
+ version?: string;
67
+ /** Categorization tags */
68
+ tags?: string[];
69
+ }
70
+ /**
71
+ * Screen Definition - Complete declarative screen specification
72
+ * Defines a screen using layout tokens and component definitions
73
+ */
74
+ export interface ScreenDefinition {
75
+ /** Unique screen identifier (kebab-case) */
76
+ id: string;
77
+ /** Human-readable screen name */
78
+ name: string;
79
+ /** Optional screen description */
80
+ description?: string;
81
+ /** Shell token ID (e.g., "shell.web.dashboard") */
82
+ shell: string;
83
+ /** Page layout token ID (e.g., "page.dashboard") */
84
+ page: string;
85
+ /** Theme ID for token resolution (default: "default") */
86
+ themeId?: string;
87
+ /** Section definitions that make up the screen */
88
+ sections: SectionDefinition[];
89
+ /** Optional metadata */
90
+ meta?: ScreenMeta;
91
+ }
92
+ /**
93
+ * Type guard to check if value is a ComponentDefinition
94
+ */
95
+ export declare function isComponentDefinition(value: unknown): value is ComponentDefinition;
96
+ /**
97
+ * Type guard to check if value is a ScreenDefinition
98
+ */
99
+ export declare function isScreenDefinition(value: unknown): value is ScreenDefinition;
100
+ /**
101
+ * Validation context for screen definitions
102
+ * Used during validation to provide additional context
103
+ */
104
+ export interface ValidationContext {
105
+ /** Available shell token IDs */
106
+ availableShells?: string[];
107
+ /** Available page token IDs */
108
+ availablePages?: string[];
109
+ /** Available section pattern token IDs */
110
+ availableSections?: string[];
111
+ /** Available theme IDs */
112
+ availableThemes?: string[];
113
+ /** Strict mode - fail on warnings */
114
+ strict?: boolean;
115
+ }
116
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/screen-generation/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAErB,QAAQ,GACR,OAAO,GACP,MAAM,GACN,SAAS,GACT,UAAU,GACV,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,QAAQ,GAER,MAAM,GACN,OAAO,GACP,MAAM,GACN,OAAO,GACP,MAAM,GACN,MAAM,GACN,OAAO,GACP,MAAM,GACN,UAAU,GACV,UAAU,CAAC;AAEf;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,IAAI,EAAE,aAAa,CAAC;IAEpB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE/B,uCAAuC;IACvC,QAAQ,CAAC,EAAE,CAAC,mBAAmB,GAAG,MAAM,CAAC,EAAE,CAAC;IAE5C,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,sCAAsC;IACtC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE7B,uCAAuC;IACvC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE7B,uCAAuC;IACvC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE7B,6CAA6C;IAC7C,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE7B,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAC;IAEX,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAEhB,qCAAqC;IACrC,UAAU,EAAE,mBAAmB,EAAE,CAAC;IAElC,4CAA4C;IAC5C,UAAU,CAAC,EAAE,mBAAmB,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,oBAAoB;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4CAA4C;IAC5C,EAAE,EAAE,MAAM,CAAC;IAEX,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IAEb,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IAEd,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IAEb,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,kDAAkD;IAClD,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAE9B,wBAAwB;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAMlF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAY5E;AAMD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,gCAAgC;IAChC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAE3B,+BAA+B;IAC/B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B,0CAA0C;IAC1C,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE7B,0BAA0B;IAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAE3B,qCAAqC;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @tekton-ui/core - Screen Definition Type Definitions
3
+ * Type-safe screen definition interfaces for declarative screen generation
4
+ * [SPEC-LAYOUT-002] [PHASE-1]
5
+ */
6
+ // ============================================================================
7
+ // Type Guards
8
+ // ============================================================================
9
+ /**
10
+ * Type guard to check if value is a ComponentDefinition
11
+ */
12
+ export function isComponentDefinition(value) {
13
+ if (typeof value !== 'object' || value === null) {
14
+ return false;
15
+ }
16
+ const obj = value;
17
+ return typeof obj.type === 'string' && typeof obj.props === 'object';
18
+ }
19
+ /**
20
+ * Type guard to check if value is a ScreenDefinition
21
+ */
22
+ export function isScreenDefinition(value) {
23
+ if (typeof value !== 'object' || value === null) {
24
+ return false;
25
+ }
26
+ const obj = value;
27
+ return (typeof obj.id === 'string' &&
28
+ typeof obj.name === 'string' &&
29
+ typeof obj.shell === 'string' &&
30
+ typeof obj.page === 'string' &&
31
+ Array.isArray(obj.sections));
32
+ }
33
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/screen-generation/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA4IH,+EAA+E;AAC/E,cAAc;AACd,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,OAAO,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,OAAO,CACL,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ;QAC1B,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;QAC5B,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;QAC7B,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;QAC5B,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAC5B,CAAC;AACJ,CAAC"}