@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,373 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @tekton-ui/core - Screen Resolver
|
|
3
|
+
* Main entry point for resolving screen definitions to complete screen structures
|
|
4
|
+
* [SPEC-LAYOUT-002] [PHASE-2]
|
|
5
|
+
*/
|
|
6
|
+
import { resolveShell, resolvePage, resolveSection, } from './layout-resolver.js';
|
|
7
|
+
import { resolveComponent, } from './component-resolver.js';
|
|
8
|
+
import { tokenRefToCSSVar } from './token-resolver.js';
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Cache
|
|
11
|
+
// ============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* Screen resolution cache
|
|
14
|
+
* Key: `${screenId}:${themeId}`
|
|
15
|
+
*/
|
|
16
|
+
const screenCache = new Map();
|
|
17
|
+
/**
|
|
18
|
+
* Clear screen resolution cache
|
|
19
|
+
* Useful for testing or when screen definitions change
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* clearScreenCache();
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export function clearScreenCache() {
|
|
27
|
+
screenCache.clear();
|
|
28
|
+
}
|
|
29
|
+
// ============================================================================
|
|
30
|
+
// Component Tree Building
|
|
31
|
+
// ============================================================================
|
|
32
|
+
/**
|
|
33
|
+
* Build component tree node from resolved component
|
|
34
|
+
*
|
|
35
|
+
* @param component - Resolved component
|
|
36
|
+
* @returns Component tree node
|
|
37
|
+
*/
|
|
38
|
+
function buildComponentTreeNode(component) {
|
|
39
|
+
const node = {
|
|
40
|
+
type: component.type,
|
|
41
|
+
slot: component.slot,
|
|
42
|
+
};
|
|
43
|
+
if (component.children && component.children.length > 0) {
|
|
44
|
+
node.children = component.children
|
|
45
|
+
.filter((child) => typeof child !== 'string')
|
|
46
|
+
.map(child => buildComponentTreeNode(child));
|
|
47
|
+
}
|
|
48
|
+
return node;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Build complete component tree from resolved sections
|
|
52
|
+
*
|
|
53
|
+
* @param sections - Resolved sections with components
|
|
54
|
+
* @returns Component tree structure
|
|
55
|
+
*/
|
|
56
|
+
function buildComponentTree(sections) {
|
|
57
|
+
return {
|
|
58
|
+
sections: sections.map(section => ({
|
|
59
|
+
sectionId: section.id,
|
|
60
|
+
components: section.components.map(component => buildComponentTreeNode(component)),
|
|
61
|
+
})),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// ============================================================================
|
|
65
|
+
// CSS Variables Generation
|
|
66
|
+
// ============================================================================
|
|
67
|
+
/**
|
|
68
|
+
* Merge CSS variables from multiple layouts
|
|
69
|
+
*
|
|
70
|
+
* Combines CSS variables from shell, page, and section layouts
|
|
71
|
+
* into a single global CSS variable map.
|
|
72
|
+
*
|
|
73
|
+
* @param shell - Resolved shell layout
|
|
74
|
+
* @param page - Resolved page layout
|
|
75
|
+
* @param sections - Resolved sections
|
|
76
|
+
* @returns Merged CSS variables
|
|
77
|
+
*/
|
|
78
|
+
function mergeCSSVariables(shell, page, sections) {
|
|
79
|
+
const merged = {};
|
|
80
|
+
// Add shell CSS variables
|
|
81
|
+
Object.assign(merged, shell.cssVariables);
|
|
82
|
+
// Add page CSS variables
|
|
83
|
+
Object.assign(merged, page.cssVariables);
|
|
84
|
+
// Add section CSS variables
|
|
85
|
+
for (const section of sections) {
|
|
86
|
+
Object.assign(merged, section.cssVariables);
|
|
87
|
+
}
|
|
88
|
+
return merged;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Generate CSS variables from token references in layout
|
|
92
|
+
*
|
|
93
|
+
* Extracts all token references from layout structure and
|
|
94
|
+
* generates CSS variable declarations.
|
|
95
|
+
*
|
|
96
|
+
* @param layout - Resolved layout
|
|
97
|
+
* @returns CSS variables map
|
|
98
|
+
*/
|
|
99
|
+
function generateLayoutCSSVariables(layout) {
|
|
100
|
+
const cssVars = {};
|
|
101
|
+
// Extract token references from layout
|
|
102
|
+
const extractTokens = (obj) => {
|
|
103
|
+
if (typeof obj === 'string' && /^[a-z]+\.[a-z-]+(\.[a-z0-9-]+)*$/.test(obj)) {
|
|
104
|
+
// This is a token reference
|
|
105
|
+
const cssVarName = tokenRefToCSSVar(obj);
|
|
106
|
+
cssVars[cssVarName] = obj;
|
|
107
|
+
}
|
|
108
|
+
else if (typeof obj === 'object' && obj !== null) {
|
|
109
|
+
for (const value of Object.values(obj)) {
|
|
110
|
+
extractTokens(value);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
extractTokens(layout);
|
|
115
|
+
return cssVars;
|
|
116
|
+
}
|
|
117
|
+
// ============================================================================
|
|
118
|
+
// Core Resolution Functions
|
|
119
|
+
// ============================================================================
|
|
120
|
+
/**
|
|
121
|
+
* Resolve section definition to complete resolved section
|
|
122
|
+
*
|
|
123
|
+
* Process:
|
|
124
|
+
* 1. Resolve section pattern layout
|
|
125
|
+
* 2. Resolve all components in section
|
|
126
|
+
* 3. Generate CSS variables
|
|
127
|
+
*
|
|
128
|
+
* @param section - Section definition to resolve
|
|
129
|
+
* @param screenId - Screen ID for error messages
|
|
130
|
+
* @param theme - Theme ID for token resolution
|
|
131
|
+
* @returns Resolved section with layout and components
|
|
132
|
+
*/
|
|
133
|
+
function resolveScreenSection(section, screenId, theme) {
|
|
134
|
+
// Create layout context
|
|
135
|
+
const layoutContext = {
|
|
136
|
+
screenId,
|
|
137
|
+
layoutType: 'section',
|
|
138
|
+
meta: {
|
|
139
|
+
sectionId: section.id,
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
// Resolve section pattern layout
|
|
143
|
+
let layout;
|
|
144
|
+
try {
|
|
145
|
+
layout = resolveSection(section.pattern, layoutContext);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
throw new Error(`Failed to resolve section '${section.id}' (pattern: ${section.pattern}): ${error instanceof Error ? error.message : String(error)}`);
|
|
149
|
+
}
|
|
150
|
+
// Create component context
|
|
151
|
+
const componentContext = {
|
|
152
|
+
theme,
|
|
153
|
+
screenId,
|
|
154
|
+
sectionId: section.id,
|
|
155
|
+
};
|
|
156
|
+
// Resolve all components in section
|
|
157
|
+
const components = [];
|
|
158
|
+
for (let i = 0; i < section.components.length; i++) {
|
|
159
|
+
try {
|
|
160
|
+
const resolved = resolveComponent(section.components[i], componentContext);
|
|
161
|
+
components.push(resolved);
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
throw new Error(`Failed to resolve component at index ${i} in section '${section.id}': ${error instanceof Error ? error.message : String(error)}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Generate CSS variables from layout
|
|
168
|
+
const cssVariables = generateLayoutCSSVariables(layout);
|
|
169
|
+
return {
|
|
170
|
+
id: section.id,
|
|
171
|
+
layout,
|
|
172
|
+
components,
|
|
173
|
+
cssVariables,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Resolve screen definition to complete resolved screen structure
|
|
178
|
+
*
|
|
179
|
+
* Main entry point for screen resolution. Performs complete resolution:
|
|
180
|
+
* 1. Validate screen definition
|
|
181
|
+
* 2. Resolve shell layout
|
|
182
|
+
* 3. Resolve page layout
|
|
183
|
+
* 4. Resolve all sections with layouts and components
|
|
184
|
+
* 5. Generate global CSS variables
|
|
185
|
+
* 6. Build component tree
|
|
186
|
+
*
|
|
187
|
+
* Performance: <5ms for typical screen resolution (cached after first call)
|
|
188
|
+
*
|
|
189
|
+
* @param screen - Screen definition to resolve
|
|
190
|
+
* @returns Complete resolved screen structure
|
|
191
|
+
* @throws Error if resolution fails at any stage
|
|
192
|
+
*
|
|
193
|
+
* @example
|
|
194
|
+
* ```typescript
|
|
195
|
+
* const screen = {
|
|
196
|
+
* id: 'dashboard-screen',
|
|
197
|
+
* name: 'Dashboard',
|
|
198
|
+
* shell: 'shell.web.dashboard',
|
|
199
|
+
* page: 'page.dashboard',
|
|
200
|
+
* themeId: 'default',
|
|
201
|
+
* sections: [
|
|
202
|
+
* {
|
|
203
|
+
* id: 'stats',
|
|
204
|
+
* pattern: 'section.grid-4',
|
|
205
|
+
* components: [
|
|
206
|
+
* { type: 'Card', props: { children: 'Stats' } }
|
|
207
|
+
* ]
|
|
208
|
+
* }
|
|
209
|
+
* ]
|
|
210
|
+
* };
|
|
211
|
+
*
|
|
212
|
+
* const resolved = resolveScreen(screen);
|
|
213
|
+
* console.log(resolved.shell.shell?.description);
|
|
214
|
+
* console.log(resolved.sections[0].components[0].tokenBindings);
|
|
215
|
+
* ```
|
|
216
|
+
*/
|
|
217
|
+
export function resolveScreen(screen) {
|
|
218
|
+
const startTime = performance.now();
|
|
219
|
+
// Use default theme if not specified
|
|
220
|
+
const themeId = screen.themeId || 'default';
|
|
221
|
+
// Check cache
|
|
222
|
+
const cacheKey = `${screen.id}:${themeId}`;
|
|
223
|
+
const cached = screenCache.get(cacheKey);
|
|
224
|
+
if (cached) {
|
|
225
|
+
return cached;
|
|
226
|
+
}
|
|
227
|
+
// Create layout context for shell
|
|
228
|
+
const shellContext = {
|
|
229
|
+
screenId: screen.id,
|
|
230
|
+
layoutType: 'shell',
|
|
231
|
+
};
|
|
232
|
+
// Resolve shell layout
|
|
233
|
+
let shell;
|
|
234
|
+
try {
|
|
235
|
+
shell = resolveShell(screen.shell, shellContext);
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
throw new Error(`Failed to resolve shell for screen '${screen.id}': ${error instanceof Error ? error.message : String(error)}`);
|
|
239
|
+
}
|
|
240
|
+
// Create layout context for page
|
|
241
|
+
const pageContext = {
|
|
242
|
+
screenId: screen.id,
|
|
243
|
+
layoutType: 'page',
|
|
244
|
+
};
|
|
245
|
+
// Resolve page layout
|
|
246
|
+
let page;
|
|
247
|
+
try {
|
|
248
|
+
page = resolvePage(screen.page, pageContext);
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
throw new Error(`Failed to resolve page for screen '${screen.id}': ${error instanceof Error ? error.message : String(error)}`);
|
|
252
|
+
}
|
|
253
|
+
// Resolve all sections
|
|
254
|
+
const sections = [];
|
|
255
|
+
for (let i = 0; i < screen.sections.length; i++) {
|
|
256
|
+
try {
|
|
257
|
+
const resolved = resolveScreenSection(screen.sections[i], screen.id, themeId);
|
|
258
|
+
sections.push(resolved);
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
throw new Error(`Failed to resolve section at index ${i}: ${error instanceof Error ? error.message : String(error)}`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// Merge CSS variables from all layouts
|
|
265
|
+
const cssVariables = mergeCSSVariables(shell, page, sections);
|
|
266
|
+
// Build component tree
|
|
267
|
+
const componentTree = buildComponentTree(sections);
|
|
268
|
+
// Create resolved screen
|
|
269
|
+
const resolved = {
|
|
270
|
+
id: screen.id,
|
|
271
|
+
name: screen.name,
|
|
272
|
+
description: screen.description,
|
|
273
|
+
shell,
|
|
274
|
+
page,
|
|
275
|
+
sections,
|
|
276
|
+
cssVariables,
|
|
277
|
+
componentTree,
|
|
278
|
+
meta: screen.meta,
|
|
279
|
+
themeId,
|
|
280
|
+
};
|
|
281
|
+
// Cache result
|
|
282
|
+
screenCache.set(cacheKey, resolved);
|
|
283
|
+
// Performance logging
|
|
284
|
+
const endTime = performance.now();
|
|
285
|
+
const duration = endTime - startTime;
|
|
286
|
+
if (duration > 5) {
|
|
287
|
+
console.warn(`Screen resolution for '${screen.id}' took ${duration.toFixed(2)}ms (target: <5ms). ` +
|
|
288
|
+
`Consider optimizing layout or component complexity.`);
|
|
289
|
+
}
|
|
290
|
+
return resolved;
|
|
291
|
+
}
|
|
292
|
+
// ============================================================================
|
|
293
|
+
// Validation Utilities
|
|
294
|
+
// ============================================================================
|
|
295
|
+
/**
|
|
296
|
+
* Validate resolved screen structure
|
|
297
|
+
*
|
|
298
|
+
* Checks:
|
|
299
|
+
* - Shell layout is present
|
|
300
|
+
* - Page layout is present
|
|
301
|
+
* - All sections have layouts and components
|
|
302
|
+
* - CSS variables are generated
|
|
303
|
+
* - Component tree is built
|
|
304
|
+
*
|
|
305
|
+
* @param resolved - Resolved screen to validate
|
|
306
|
+
* @returns True if valid, false otherwise
|
|
307
|
+
*
|
|
308
|
+
* @example
|
|
309
|
+
* ```typescript
|
|
310
|
+
* const resolved = resolveScreen(screenDefinition);
|
|
311
|
+
* if (isValidResolvedScreen(resolved)) {
|
|
312
|
+
* // Ready to render
|
|
313
|
+
* }
|
|
314
|
+
* ```
|
|
315
|
+
*/
|
|
316
|
+
export function isValidResolvedScreen(resolved) {
|
|
317
|
+
if (typeof resolved !== 'object' || resolved === null) {
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
const obj = resolved;
|
|
321
|
+
// Check required fields
|
|
322
|
+
if (typeof obj.id !== 'string' ||
|
|
323
|
+
typeof obj.name !== 'string' ||
|
|
324
|
+
typeof obj.shell !== 'object' ||
|
|
325
|
+
typeof obj.page !== 'object' ||
|
|
326
|
+
!Array.isArray(obj.sections) ||
|
|
327
|
+
typeof obj.cssVariables !== 'object' ||
|
|
328
|
+
typeof obj.componentTree !== 'object') {
|
|
329
|
+
return false;
|
|
330
|
+
}
|
|
331
|
+
return true;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Get screen resolution statistics
|
|
335
|
+
*
|
|
336
|
+
* Provides insights into resolved screen structure:
|
|
337
|
+
* - Total component count
|
|
338
|
+
* - Component types used
|
|
339
|
+
* - Section count
|
|
340
|
+
* - CSS variable count
|
|
341
|
+
*
|
|
342
|
+
* @param resolved - Resolved screen
|
|
343
|
+
* @returns Statistics object
|
|
344
|
+
*
|
|
345
|
+
* @example
|
|
346
|
+
* ```typescript
|
|
347
|
+
* const resolved = resolveScreen(screenDefinition);
|
|
348
|
+
* const stats = getScreenStats(resolved);
|
|
349
|
+
* console.log(`Components: ${stats.componentCount}`);
|
|
350
|
+
* console.log(`CSS Variables: ${stats.cssVariableCount}`);
|
|
351
|
+
* ```
|
|
352
|
+
*/
|
|
353
|
+
export function getScreenStats(resolved) {
|
|
354
|
+
let componentCount = 0;
|
|
355
|
+
const componentTypes = new Set();
|
|
356
|
+
const countComponents = (node) => {
|
|
357
|
+
componentCount++;
|
|
358
|
+
componentTypes.add(node.type);
|
|
359
|
+
if (node.children) {
|
|
360
|
+
node.children.forEach(countComponents);
|
|
361
|
+
}
|
|
362
|
+
};
|
|
363
|
+
resolved.componentTree.sections.forEach(section => {
|
|
364
|
+
section.components.forEach(countComponents);
|
|
365
|
+
});
|
|
366
|
+
return {
|
|
367
|
+
componentCount,
|
|
368
|
+
componentTypes,
|
|
369
|
+
sectionCount: resolved.sections.length,
|
|
370
|
+
cssVariableCount: Object.keys(resolved.cssVariables).length,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
//# sourceMappingURL=screen-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screen-resolver.js","sourceRoot":"","sources":["../../../src/screen-generation/resolver/screen-resolver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EACL,YAAY,EACZ,WAAW,EACX,cAAc,GAEf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,gBAAgB,GAGjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AA0FvD,+EAA+E;AAC/E,QAAQ;AACR,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,WAAW,GAAG,IAAI,GAAG,EAA0B,CAAC;AAEtD;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB;IAC9B,WAAW,CAAC,KAAK,EAAE,CAAC;AACtB,CAAC;AAED,+EAA+E;AAC/E,0BAA0B;AAC1B,+EAA+E;AAE/E;;;;;GAKG;AACH,SAAS,sBAAsB,CAAC,SAA4B;IAC1D,MAAM,IAAI,GAAsB;QAC9B,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,IAAI,EAAE,SAAS,CAAC,IAAI;KACrB,CAAC;IAEF,IAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ;aAC/B,MAAM,CAAC,CAAC,KAAK,EAA8B,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;aACxE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,QAA2B;IACrD,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACjC,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;SACnF,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,2BAA2B;AAC3B,+EAA+E;AAE/E;;;;;;;;;;GAUG;AACH,SAAS,iBAAiB,CACxB,KAAqB,EACrB,IAAoB,EACpB,QAA2B;IAE3B,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,0BAA0B;IAC1B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IAE1C,yBAAyB;IACzB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAEzC,4BAA4B;IAC5B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,0BAA0B,CAAC,MAAsB;IACxD,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,uCAAuC;IACvC,MAAM,aAAa,GAAG,CAAC,GAAY,EAAQ,EAAE;QAC3C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,kCAAkC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5E,4BAA4B;YAC5B,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;YACzC,OAAO,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC;QAC5B,CAAC;aAAM,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACnD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvC,aAAa,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,aAAa,CAAC,MAAM,CAAC,CAAC;IAEtB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,+EAA+E;AAC/E,4BAA4B;AAC5B,+EAA+E;AAE/E;;;;;;;;;;;;GAYG;AACH,SAAS,oBAAoB,CAC3B,OAA0B,EAC1B,QAAgB,EAChB,KAAa;IAEb,wBAAwB;IACxB,MAAM,aAAa,GAAkB;QACnC,QAAQ;QACR,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE;YACJ,SAAS,EAAE,OAAO,CAAC,EAAE;SACtB;KACF,CAAC;IAEF,iCAAiC;IACjC,IAAI,MAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,8BAA8B,OAAO,CAAC,EAAE,eAAe,OAAO,CAAC,OAAO,MACpE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE,CACH,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,MAAM,gBAAgB,GAAqB;QACzC,KAAK;QACL,QAAQ;QACR,SAAS,EAAE,OAAO,CAAC,EAAE;KACtB,CAAC;IAEF,oCAAoC;IACpC,MAAM,UAAU,GAAwB,EAAE,CAAC;IAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;YAC3E,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,wCAAwC,CAAC,gBAAgB,OAAO,CAAC,EAAE,MACjE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,MAAM,YAAY,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;IAExD,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,MAAM;QACN,UAAU;QACV,YAAY;KACb,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,MAAM,UAAU,aAAa,CAAC,MAAwB;IACpD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAEpC,qCAAqC;IACrC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC;IAE5C,cAAc;IACd,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,EAAE,IAAI,OAAO,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,kCAAkC;IAClC,MAAM,YAAY,GAAkB;QAClC,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,UAAU,EAAE,OAAO;KACpB,CAAC;IAEF,uBAAuB;IACvB,IAAI,KAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,uCAAuC,MAAM,CAAC,EAAE,MAC9C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE,CACH,CAAC;IACJ,CAAC;IAED,iCAAiC;IACjC,MAAM,WAAW,GAAkB;QACjC,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,UAAU,EAAE,MAAM;KACnB,CAAC;IAEF,sBAAsB;IACtB,IAAI,IAAoB,CAAC;IACzB,IAAI,CAAC;QACH,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,sCAAsC,MAAM,CAAC,EAAE,MAC7C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE,CACH,CAAC;IACJ,CAAC;IAED,uBAAuB;IACvB,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAC9E,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,sCAAsC,CAAC,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACrG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,MAAM,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE9D,uBAAuB;IACvB,MAAM,aAAa,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAEnD,yBAAyB;IACzB,MAAM,QAAQ,GAAmB;QAC/B,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,KAAK;QACL,IAAI;QACJ,QAAQ;QACR,YAAY;QACZ,aAAa;QACb,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO;KACR,CAAC;IAEF,eAAe;IACf,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEpC,sBAAsB;IACtB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;IACrC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CACV,0BAA0B,MAAM,CAAC,EAAE,UAAU,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB;YACnF,qDAAqD,CACxD,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAiB;IACrD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,GAAG,GAAG,QAAmC,CAAC;IAEhD,wBAAwB;IACxB,IACE,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,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC5B,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ;QACpC,OAAO,GAAG,CAAC,aAAa,KAAK,QAAQ,EACrC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,cAAc,CAAC,QAAwB;IAMrD,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,MAAM,eAAe,GAAG,CAAC,IAAuB,EAAQ,EAAE;QACxD,cAAc,EAAE,CAAC;QACjB,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC;IAEF,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QAChD,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,cAAc;QACd,cAAc;QACd,YAAY,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM;QACtC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,MAAM;KAC5D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @tekton-ui/core - Token Binding Resolver
|
|
3
|
+
* Resolves token bindings with template variable substitution
|
|
4
|
+
* [SPEC-LAYOUT-002] [PHASE-2]
|
|
5
|
+
*/
|
|
6
|
+
import type { TokenBindings } from '../../component-schemas.js';
|
|
7
|
+
/**
|
|
8
|
+
* Token binding resolution context
|
|
9
|
+
* Contains component props and theme for template variable substitution
|
|
10
|
+
*/
|
|
11
|
+
export interface TokenBindingContext {
|
|
12
|
+
/** Component props for template variable substitution */
|
|
13
|
+
props: Record<string, unknown>;
|
|
14
|
+
/** Theme ID for token resolution */
|
|
15
|
+
theme: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Resolved token bindings map
|
|
19
|
+
* Maps property names to CSS variable references
|
|
20
|
+
*/
|
|
21
|
+
export type ResolvedTokenBindings = Record<string, string>;
|
|
22
|
+
/**
|
|
23
|
+
* Clear token binding cache
|
|
24
|
+
* Useful for testing or when token definitions change
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* clearBindingCache();
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare function clearBindingCache(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Substitute template variables in token binding
|
|
34
|
+
*
|
|
35
|
+
* Template syntax: `{variableName}`
|
|
36
|
+
* Variables are resolved from component props
|
|
37
|
+
*
|
|
38
|
+
* @param binding - Token binding with template variables (e.g., "component.button.{variant}.background")
|
|
39
|
+
* @param props - Component props (e.g., { variant: "primary" })
|
|
40
|
+
* @returns Token reference with substituted variables (e.g., "component.button.primary.background")
|
|
41
|
+
* @throws Error if required template variable is missing from props
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* substituteTemplateVariables(
|
|
46
|
+
* 'component.button.{variant}.background',
|
|
47
|
+
* { variant: 'primary' }
|
|
48
|
+
* ); // → 'component.button.primary.background'
|
|
49
|
+
*
|
|
50
|
+
* substituteTemplateVariables(
|
|
51
|
+
* 'atomic.spacing.{size}',
|
|
52
|
+
* { size: 'large' }
|
|
53
|
+
* ); // → 'atomic.spacing.large'
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare function substituteTemplateVariables(binding: string, props: Record<string, unknown>): string;
|
|
57
|
+
/**
|
|
58
|
+
* Convert token reference to CSS variable reference
|
|
59
|
+
*
|
|
60
|
+
* Converts dot notation to CSS custom property format:
|
|
61
|
+
* - "atomic.spacing.16" → "var(--atomic-spacing-16)"
|
|
62
|
+
* - "semantic.color.primary" → "var(--semantic-color-primary)"
|
|
63
|
+
*
|
|
64
|
+
* @param tokenRef - Token reference in dot notation
|
|
65
|
+
* @returns CSS variable reference in var() format
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* tokenRefToCSSVar('atomic.spacing.16'); // → 'var(--atomic-spacing-16)'
|
|
70
|
+
* tokenRefToCSSVar('semantic.color.primary'); // → 'var(--semantic-color-primary)'
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export declare function tokenRefToCSSVar(tokenRef: string): string;
|
|
74
|
+
/**
|
|
75
|
+
* Resolve single token binding with caching
|
|
76
|
+
*
|
|
77
|
+
* Process:
|
|
78
|
+
* 1. Check cache for previously resolved binding
|
|
79
|
+
* 2. Substitute template variables from props
|
|
80
|
+
* 3. Convert to CSS variable reference
|
|
81
|
+
* 4. Cache the result
|
|
82
|
+
*
|
|
83
|
+
* @param binding - Token binding (may contain template variables)
|
|
84
|
+
* @param context - Resolution context with props and theme
|
|
85
|
+
* @returns CSS variable reference
|
|
86
|
+
* @throws Error if template variable substitution fails
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```typescript
|
|
90
|
+
* const context = {
|
|
91
|
+
* props: { variant: 'primary', size: 'medium' },
|
|
92
|
+
* theme: 'default'
|
|
93
|
+
* };
|
|
94
|
+
*
|
|
95
|
+
* resolveBinding('component.button.{variant}.background', context);
|
|
96
|
+
* // → 'var(--component-button-primary-background)'
|
|
97
|
+
*
|
|
98
|
+
* resolveBinding('atomic.spacing.{size}', context);
|
|
99
|
+
* // → 'var(--atomic-spacing-medium)'
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
export declare function resolveBinding(binding: string, context: TokenBindingContext): string;
|
|
103
|
+
/**
|
|
104
|
+
* Resolve all token bindings for a component
|
|
105
|
+
*
|
|
106
|
+
* Processes all token bindings in the component schema,
|
|
107
|
+
* substituting template variables and converting to CSS variables.
|
|
108
|
+
*
|
|
109
|
+
* @param bindings - Token bindings from component schema
|
|
110
|
+
* @param context - Resolution context with props and theme
|
|
111
|
+
* @returns Resolved token bindings map (property → CSS variable)
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```typescript
|
|
115
|
+
* const bindings = {
|
|
116
|
+
* background: 'component.button.{variant}.background',
|
|
117
|
+
* foreground: 'component.button.{variant}.foreground',
|
|
118
|
+
* padding: 'atomic.spacing.{size}'
|
|
119
|
+
* };
|
|
120
|
+
*
|
|
121
|
+
* const context = {
|
|
122
|
+
* props: { variant: 'primary', size: 'medium' },
|
|
123
|
+
* theme: 'default'
|
|
124
|
+
* };
|
|
125
|
+
*
|
|
126
|
+
* const resolved = resolveBindings(bindings, context);
|
|
127
|
+
* // {
|
|
128
|
+
* // background: 'var(--component-button-primary-background)',
|
|
129
|
+
* // foreground: 'var(--component-button-primary-foreground)',
|
|
130
|
+
* // padding: 'var(--atomic-spacing-medium)'
|
|
131
|
+
* // }
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
134
|
+
export declare function resolveBindings(bindings: TokenBindings, context: TokenBindingContext): ResolvedTokenBindings;
|
|
135
|
+
/**
|
|
136
|
+
* Validate token binding format
|
|
137
|
+
*
|
|
138
|
+
* Checks if a token binding string is valid:
|
|
139
|
+
* - Must be in dot notation (e.g., "atomic.spacing.16")
|
|
140
|
+
* - May contain template variables (e.g., "component.button.{variant}.background")
|
|
141
|
+
* - Must start with valid layer (atomic, semantic, component)
|
|
142
|
+
*
|
|
143
|
+
* @param binding - Token binding to validate
|
|
144
|
+
* @returns True if valid, false otherwise
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* ```typescript
|
|
148
|
+
* isValidTokenBinding('atomic.spacing.16'); // → true
|
|
149
|
+
* isValidTokenBinding('component.button.{variant}.background'); // → true
|
|
150
|
+
* isValidTokenBinding('invalid-format'); // → false
|
|
151
|
+
* ```
|
|
152
|
+
*/
|
|
153
|
+
export declare function isValidTokenBinding(binding: string): boolean;
|
|
154
|
+
/**
|
|
155
|
+
* Extract template variable names from binding
|
|
156
|
+
*
|
|
157
|
+
* @param binding - Token binding with template variables
|
|
158
|
+
* @returns Array of template variable names
|
|
159
|
+
*
|
|
160
|
+
* @example
|
|
161
|
+
* ```typescript
|
|
162
|
+
* extractTemplateVariables('component.button.{variant}.{size}.background');
|
|
163
|
+
* // → ['variant', 'size']
|
|
164
|
+
*
|
|
165
|
+
* extractTemplateVariables('atomic.spacing.16');
|
|
166
|
+
* // → []
|
|
167
|
+
* ```
|
|
168
|
+
*/
|
|
169
|
+
export declare function extractTemplateVariables(binding: string): string[];
|
|
170
|
+
//# sourceMappingURL=token-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-resolver.d.ts","sourceRoot":"","sources":["../../../src/screen-generation/resolver/token-resolver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAMhE;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE/B,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAY3D;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAMD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,MAAM,CAmCR;AAMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOzD;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAoBpF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,mBAAmB,GAC3B,qBAAqB,CAiBvB;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CA6B5D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAIlE"}
|