ilse-design 0.3.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/README.md +187 -0
  2. package/dist/agent/executor.d.ts +20 -0
  3. package/dist/agent/executor.d.ts.map +1 -0
  4. package/dist/agent/executor.js +130 -0
  5. package/dist/agent/executor.js.map +1 -0
  6. package/dist/ai/provider.d.ts +45 -0
  7. package/dist/ai/provider.d.ts.map +1 -0
  8. package/dist/ai/provider.js +374 -0
  9. package/dist/ai/provider.js.map +1 -0
  10. package/dist/analysis/classify-element.d.ts +23 -0
  11. package/dist/analysis/classify-element.d.ts.map +1 -0
  12. package/dist/analysis/classify-element.js +79 -0
  13. package/dist/analysis/classify-element.js.map +1 -0
  14. package/dist/analysis/compare-family.d.ts +22 -0
  15. package/dist/analysis/compare-family.d.ts.map +1 -0
  16. package/dist/analysis/compare-family.js +82 -0
  17. package/dist/analysis/compare-family.js.map +1 -0
  18. package/dist/analysis/profile-component.d.ts +32 -0
  19. package/dist/analysis/profile-component.d.ts.map +1 -0
  20. package/dist/analysis/profile-component.js +119 -0
  21. package/dist/analysis/profile-component.js.map +1 -0
  22. package/dist/bridge/augment.d.ts +20 -0
  23. package/dist/bridge/augment.d.ts.map +1 -0
  24. package/dist/bridge/augment.js +110 -0
  25. package/dist/bridge/augment.js.map +1 -0
  26. package/dist/bridge/store.d.ts +17 -0
  27. package/dist/bridge/store.d.ts.map +1 -0
  28. package/dist/bridge/store.js +70 -0
  29. package/dist/bridge/store.js.map +1 -0
  30. package/dist/bridge/ws-server.d.ts +12 -0
  31. package/dist/bridge/ws-server.d.ts.map +1 -0
  32. package/dist/bridge/ws-server.js +136 -0
  33. package/dist/bridge/ws-server.js.map +1 -0
  34. package/dist/cli/check.d.ts +8 -0
  35. package/dist/cli/check.d.ts.map +1 -0
  36. package/dist/cli/check.js +303 -0
  37. package/dist/cli/check.js.map +1 -0
  38. package/dist/cli/default.d.ts +2 -0
  39. package/dist/cli/default.d.ts.map +1 -0
  40. package/dist/cli/default.js +166 -0
  41. package/dist/cli/default.js.map +1 -0
  42. package/dist/cli/extract.d.ts +5 -0
  43. package/dist/cli/extract.d.ts.map +1 -0
  44. package/dist/cli/extract.js +62 -0
  45. package/dist/cli/extract.js.map +1 -0
  46. package/dist/cli/index.d.ts +3 -0
  47. package/dist/cli/index.d.ts.map +1 -0
  48. package/dist/cli/index.js +111 -0
  49. package/dist/cli/index.js.map +1 -0
  50. package/dist/cli/init.d.ts +5 -0
  51. package/dist/cli/init.d.ts.map +1 -0
  52. package/dist/cli/init.js +190 -0
  53. package/dist/cli/init.js.map +1 -0
  54. package/dist/cli/insight.d.ts +5 -0
  55. package/dist/cli/insight.d.ts.map +1 -0
  56. package/dist/cli/insight.js +141 -0
  57. package/dist/cli/insight.js.map +1 -0
  58. package/dist/cli/listen.d.ts +10 -0
  59. package/dist/cli/listen.d.ts.map +1 -0
  60. package/dist/cli/listen.js +94 -0
  61. package/dist/cli/listen.js.map +1 -0
  62. package/dist/cli/login.d.ts +15 -0
  63. package/dist/cli/login.d.ts.map +1 -0
  64. package/dist/cli/login.js +302 -0
  65. package/dist/cli/login.js.map +1 -0
  66. package/dist/config/limits.d.ts +13 -0
  67. package/dist/config/limits.d.ts.map +1 -0
  68. package/dist/config/limits.js +26 -0
  69. package/dist/config/limits.js.map +1 -0
  70. package/dist/config/mcp-register.d.ts +5 -0
  71. package/dist/config/mcp-register.d.ts.map +1 -0
  72. package/dist/config/mcp-register.js +50 -0
  73. package/dist/config/mcp-register.js.map +1 -0
  74. package/dist/config/preferences.d.ts +22 -0
  75. package/dist/config/preferences.d.ts.map +1 -0
  76. package/dist/config/preferences.js +159 -0
  77. package/dist/config/preferences.js.map +1 -0
  78. package/dist/config/user-config.d.ts +10 -0
  79. package/dist/config/user-config.d.ts.map +1 -0
  80. package/dist/config/user-config.js +32 -0
  81. package/dist/config/user-config.js.map +1 -0
  82. package/dist/constants.d.ts +11 -0
  83. package/dist/constants.d.ts.map +1 -0
  84. package/dist/constants.js +49 -0
  85. package/dist/constants.js.map +1 -0
  86. package/dist/extraction/find-inconsistencies.d.ts +17 -0
  87. package/dist/extraction/find-inconsistencies.d.ts.map +1 -0
  88. package/dist/extraction/find-inconsistencies.js +93 -0
  89. package/dist/extraction/find-inconsistencies.js.map +1 -0
  90. package/dist/extraction/find-patterns.d.ts +20 -0
  91. package/dist/extraction/find-patterns.d.ts.map +1 -0
  92. package/dist/extraction/find-patterns.js +179 -0
  93. package/dist/extraction/find-patterns.js.map +1 -0
  94. package/dist/extraction/index-tokens.d.ts +16 -0
  95. package/dist/extraction/index-tokens.d.ts.map +1 -0
  96. package/dist/extraction/index-tokens.js +103 -0
  97. package/dist/extraction/index-tokens.js.map +1 -0
  98. package/dist/fixer/autofix.d.ts +11 -0
  99. package/dist/fixer/autofix.d.ts.map +1 -0
  100. package/dist/fixer/autofix.js +202 -0
  101. package/dist/fixer/autofix.js.map +1 -0
  102. package/dist/mcp/server.d.ts +3 -0
  103. package/dist/mcp/server.d.ts.map +1 -0
  104. package/dist/mcp/server.js +271 -0
  105. package/dist/mcp/server.js.map +1 -0
  106. package/dist/parsers/repo.d.ts +22 -0
  107. package/dist/parsers/repo.d.ts.map +1 -0
  108. package/dist/parsers/repo.js +165 -0
  109. package/dist/parsers/repo.js.map +1 -0
  110. package/dist/parsers/snapshot.d.ts +15 -0
  111. package/dist/parsers/snapshot.d.ts.map +1 -0
  112. package/dist/parsers/snapshot.js +136 -0
  113. package/dist/parsers/snapshot.js.map +1 -0
  114. package/dist/parsers/tokens.d.ts +10 -0
  115. package/dist/parsers/tokens.d.ts.map +1 -0
  116. package/dist/parsers/tokens.js +119 -0
  117. package/dist/parsers/tokens.js.map +1 -0
  118. package/dist/react/annotator.d.ts +64 -0
  119. package/dist/react/annotator.d.ts.map +1 -0
  120. package/dist/react/annotator.js +279 -0
  121. package/dist/react/annotator.js.map +1 -0
  122. package/dist/react/area-selector.d.ts +14 -0
  123. package/dist/react/area-selector.d.ts.map +1 -0
  124. package/dist/react/area-selector.js +76 -0
  125. package/dist/react/area-selector.js.map +1 -0
  126. package/dist/react/freeze.d.ts +5 -0
  127. package/dist/react/freeze.d.ts.map +1 -0
  128. package/dist/react/freeze.js +109 -0
  129. package/dist/react/freeze.js.map +1 -0
  130. package/dist/react/image-input.d.ts +14 -0
  131. package/dist/react/image-input.d.ts.map +1 -0
  132. package/dist/react/image-input.js +100 -0
  133. package/dist/react/image-input.js.map +1 -0
  134. package/dist/react/index.d.ts +6 -0
  135. package/dist/react/index.d.ts.map +1 -0
  136. package/dist/react/index.js +13 -0
  137. package/dist/react/index.js.map +1 -0
  138. package/dist/react/toolbar.d.ts +2 -0
  139. package/dist/react/toolbar.d.ts.map +1 -0
  140. package/dist/react/toolbar.js +755 -0
  141. package/dist/react/toolbar.js.map +1 -0
  142. package/dist/react/ws-client.d.ts +8 -0
  143. package/dist/react/ws-client.d.ts.map +1 -0
  144. package/dist/react/ws-client.js +71 -0
  145. package/dist/react/ws-client.js.map +1 -0
  146. package/dist/reporters/coverage.d.ts +6 -0
  147. package/dist/reporters/coverage.d.ts.map +1 -0
  148. package/dist/reporters/coverage.js +74 -0
  149. package/dist/reporters/coverage.js.map +1 -0
  150. package/dist/reporters/ds-report.d.ts +8 -0
  151. package/dist/reporters/ds-report.d.ts.map +1 -0
  152. package/dist/reporters/ds-report.js +66 -0
  153. package/dist/reporters/ds-report.js.map +1 -0
  154. package/dist/reporters/terminal.d.ts +43 -0
  155. package/dist/reporters/terminal.d.ts.map +1 -0
  156. package/dist/reporters/terminal.js +361 -0
  157. package/dist/reporters/terminal.js.map +1 -0
  158. package/dist/setup/framework-detect.d.ts +8 -0
  159. package/dist/setup/framework-detect.d.ts.map +1 -0
  160. package/dist/setup/framework-detect.js +109 -0
  161. package/dist/setup/framework-detect.js.map +1 -0
  162. package/dist/setup/inject-component.d.ts +12 -0
  163. package/dist/setup/inject-component.d.ts.map +1 -0
  164. package/dist/setup/inject-component.js +98 -0
  165. package/dist/setup/inject-component.js.map +1 -0
  166. package/dist/types.d.ts +170 -0
  167. package/dist/types.d.ts.map +1 -0
  168. package/dist/types.js +5 -0
  169. package/dist/types.js.map +1 -0
  170. package/dist/utils/ast.d.ts +18 -0
  171. package/dist/utils/ast.d.ts.map +1 -0
  172. package/dist/utils/ast.js +57 -0
  173. package/dist/utils/ast.js.map +1 -0
  174. package/dist/utils/files.d.ts +6 -0
  175. package/dist/utils/files.d.ts.map +1 -0
  176. package/dist/utils/files.js +25 -0
  177. package/dist/utils/files.js.map +1 -0
  178. package/dist/utils/suggest.d.ts +37 -0
  179. package/dist/utils/suggest.d.ts.map +1 -0
  180. package/dist/utils/suggest.js +158 -0
  181. package/dist/utils/suggest.js.map +1 -0
  182. package/dist/validators/coverage.d.ts +24 -0
  183. package/dist/validators/coverage.d.ts.map +1 -0
  184. package/dist/validators/coverage.js +156 -0
  185. package/dist/validators/coverage.js.map +1 -0
  186. package/dist/validators/static.d.ts +14 -0
  187. package/dist/validators/static.d.ts.map +1 -0
  188. package/dist/validators/static.js +398 -0
  189. package/dist/validators/static.js.map +1 -0
  190. package/package.json +64 -0
@@ -0,0 +1,156 @@
1
+ import { parseCode, walkAST } from '../utils/ast.js';
2
+ import { COLOR_PREFIXES, SPACING_PREFIXES, TAILWIND_SPACING } from '../constants.js';
3
+ /**
4
+ * Build a Map<className, tokenName> for fast lookups.
5
+ * Maps Tailwind utility classes to their corresponding token names.
6
+ *
7
+ * E.g. token { name: "color.primary", path: ["color","primary"], type: "color" }
8
+ * → "bg-primary" → "color.primary"
9
+ * → "text-primary" → "color.primary"
10
+ *
11
+ * E.g. token { name: "spacing.md", path: ["spacing","md"], value: "16px", type: "spacing" }
12
+ * → "p-4" → "spacing.md" (via Tailwind scale)
13
+ * → "gap-md" → "spacing.md" (via token name)
14
+ */
15
+ export function buildTokenClassMap(tokens) {
16
+ const map = new Map();
17
+ for (const token of tokens) {
18
+ const lastSegment = token.path[token.path.length - 1];
19
+ if (token.type === 'color') {
20
+ for (const prefix of COLOR_PREFIXES) {
21
+ map.set(`${prefix}-${lastSegment}`, token.name);
22
+ }
23
+ }
24
+ if (token.type === 'spacing') {
25
+ // Map by token name: gap-md, p-md, etc.
26
+ for (const prefix of SPACING_PREFIXES) {
27
+ map.set(`${prefix}-${lastSegment}`, token.name);
28
+ }
29
+ // Map by Tailwind scale: p-4 for 16px, gap-3 for 12px, etc.
30
+ const pxMatch = token.value.match(/^(\d+(?:\.\d+)?)(px)?$/);
31
+ if (pxMatch) {
32
+ const pxValue = parseFloat(pxMatch[1]);
33
+ const suffix = TAILWIND_SPACING[pxValue];
34
+ if (suffix) {
35
+ for (const prefix of SPACING_PREFIXES) {
36
+ // Don't overwrite if already mapped by name
37
+ const key = `${prefix}-${suffix}`;
38
+ if (!map.has(key)) {
39
+ map.set(key, token.name);
40
+ }
41
+ }
42
+ }
43
+ }
44
+ // Handle rem values
45
+ const remMatch = token.value.match(/^(\d+(?:\.\d+)?)rem$/);
46
+ if (remMatch) {
47
+ const pxValue = parseFloat(remMatch[1]) * 16;
48
+ const suffix = TAILWIND_SPACING[pxValue];
49
+ if (suffix) {
50
+ for (const prefix of SPACING_PREFIXES) {
51
+ const key = `${prefix}-${suffix}`;
52
+ if (!map.has(key)) {
53
+ map.set(key, token.name);
54
+ }
55
+ }
56
+ }
57
+ }
58
+ }
59
+ if (token.type === 'typography') {
60
+ // Basic: text-{name} and font-{name}
61
+ map.set(`text-${lastSegment}`, token.name);
62
+ map.set(`font-${lastSegment}`, token.name);
63
+ }
64
+ }
65
+ return map;
66
+ }
67
+ /**
68
+ * Find token usages in a className string.
69
+ * Returns correct token usages (not violations).
70
+ */
71
+ export function findTokenUsages(className, line, column, filePath, classMap) {
72
+ const usages = [];
73
+ const classes = className.split(/\s+/).filter(Boolean);
74
+ for (const cls of classes) {
75
+ // Skip arbitrary values — those are violations, not usages
76
+ if (cls.includes('[') && cls.includes(']'))
77
+ continue;
78
+ // Strip responsive/state prefixes: sm:bg-primary → bg-primary
79
+ const baseCls = cls.replace(/^(?:\w+:)+/, '');
80
+ // Strip negative prefix: -m-4 → m-4
81
+ const normalizedCls = baseCls.startsWith('-') ? baseCls.slice(1) : baseCls;
82
+ const tokenName = classMap.get(normalizedCls);
83
+ if (tokenName) {
84
+ // Infer type from token name prefix
85
+ let type = 'color';
86
+ if (tokenName.startsWith('spacing') || SPACING_PREFIXES.some((p) => normalizedCls.startsWith(`${p}-`))) {
87
+ type = 'spacing';
88
+ }
89
+ else if (tokenName.startsWith('typography') || normalizedCls.startsWith('font-') || normalizedCls.startsWith('text-')) {
90
+ // text- can be color OR typography — check token name
91
+ if (tokenName.startsWith('color')) {
92
+ type = 'color';
93
+ }
94
+ else {
95
+ type = 'typography';
96
+ }
97
+ }
98
+ usages.push({
99
+ file: filePath,
100
+ line,
101
+ column,
102
+ className: cls,
103
+ tokenName,
104
+ type,
105
+ });
106
+ }
107
+ }
108
+ return usages;
109
+ }
110
+ /**
111
+ * Walk AST and collect all correct token usages in a file.
112
+ */
113
+ export async function scanFileUsages(code, filePath, classMap) {
114
+ const parseResult = parseCode(code, filePath);
115
+ if (!parseResult.ok) {
116
+ return parseResult;
117
+ }
118
+ const usages = [];
119
+ await walkAST(parseResult.value, {
120
+ JSXAttribute(path) {
121
+ const node = path.node;
122
+ if (node.name.type === 'JSXIdentifier' &&
123
+ (node.name.name === 'className' || node.name.name === 'class')) {
124
+ let classValue = '';
125
+ let valueLine = node.loc?.start.line || 1;
126
+ let valueCol = node.loc?.start.column || 0;
127
+ if (node.value?.type === 'StringLiteral') {
128
+ classValue = node.value.value;
129
+ valueLine = node.value.loc?.start.line || valueLine;
130
+ valueCol = (node.value.loc?.start.column || valueCol) + 1;
131
+ }
132
+ else if (node.value?.type === 'JSXExpressionContainer' &&
133
+ node.value.expression.type === 'StringLiteral') {
134
+ classValue = node.value.expression.value;
135
+ valueLine = node.value.expression.loc?.start.line || valueLine;
136
+ valueCol = (node.value.expression.loc?.start.column || valueCol) + 1;
137
+ }
138
+ else if (node.value?.type === 'JSXExpressionContainer' &&
139
+ node.value.expression.type === 'TemplateLiteral') {
140
+ for (const quasi of node.value.expression.quasis) {
141
+ const quasiValue = quasi.value.raw;
142
+ const quasiLine = quasi.loc?.start.line || valueLine;
143
+ const quasiCol = quasi.loc?.start.column || valueCol;
144
+ usages.push(...findTokenUsages(quasiValue, quasiLine, quasiCol, filePath, classMap));
145
+ }
146
+ return;
147
+ }
148
+ if (classValue) {
149
+ usages.push(...findTokenUsages(classValue, valueLine, valueCol, filePath, classMap));
150
+ }
151
+ }
152
+ },
153
+ });
154
+ return { ok: true, value: usages };
155
+ }
156
+ //# sourceMappingURL=coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../src/validators/coverage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Token, TokenViolation, Result } from '../types.js';
2
+ export interface ProjectContext {
3
+ dependencies: string[];
4
+ uiComponents: string[];
5
+ }
6
+ /**
7
+ * Validate a single file's source code against design tokens.
8
+ */
9
+ export declare function validateFile(code: string, filePath: string, tokens: Token[], projectContext?: ProjectContext): Promise<Result<TokenViolation[]>>;
10
+ /**
11
+ * Validate a file from disk.
12
+ */
13
+ export declare function validateFileFromPath(filePath: string, tokens: Token[], projectContext?: ProjectContext): Promise<Result<TokenViolation[]>>;
14
+ //# sourceMappingURL=static.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../../src/validators/static.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAajE,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAuRD;;GAEG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,KAAK,EAAE,EACf,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CA2MnC;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,KAAK,EAAE,EACf,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAOnC"}
@@ -0,0 +1,398 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { parseCode, walkAST } from '../utils/ast.js';
3
+ import { findClosestColor, findClosestSpacing } from '../utils/suggest.js';
4
+ import { classifyElement } from '../analysis/classify-element.js';
5
+ import { COLOR_PREFIXES, SPACING_PREFIXES, TAILWIND_SPACING } from '../constants.js';
6
+ /** Libraries that manage a11y internally — skip their trigger elements */
7
+ const A11Y_MANAGED_LIBS = ['@base-ui-components/react', '@base-ui/react', '@radix-ui'];
8
+ /** Known trigger components from managed libs */
9
+ const A11Y_MANAGED_TRIGGERS = new Set([
10
+ 'TooltipTrigger', 'PopoverTrigger', 'DropdownMenuTrigger',
11
+ 'MenuTrigger', 'DialogTrigger', 'SelectTrigger',
12
+ 'CollapsibleTrigger', 'HoverCardTrigger',
13
+ 'ContextMenuTrigger', 'AlertDialogTrigger',
14
+ ]);
15
+ // Regex patterns for Tailwind arbitrary values
16
+ const COLOR_ARBITRARY_RE = new RegExp(`(?:${COLOR_PREFIXES.join('|')})-\\[#([0-9a-fA-F]{3,8})\\]`, 'g');
17
+ const SPACING_ARBITRARY_RE = new RegExp(`(?:${SPACING_PREFIXES.join('|')})-\\[(\\d+(?:\\.\\d+)?)(px|rem|em)?\\]`, 'g');
18
+ // Inline style color patterns
19
+ const INLINE_COLOR_RE = /^#[0-9a-fA-F]{3,8}$|^rgb/;
20
+ const INLINE_SIZE_RE = /^\d+(?:\.\d+)?(px|rem|em)$/;
21
+ // CSS properties that hold color values
22
+ const COLOR_PROPERTIES = new Set([
23
+ 'color', 'backgroundColor', 'borderColor', 'outlineColor',
24
+ 'fill', 'stroke', 'caretColor', 'accentColor',
25
+ 'textDecorationColor', 'columnRuleColor',
26
+ ]);
27
+ // CSS properties that hold spacing values
28
+ const SPACING_PROPERTIES = new Set([
29
+ 'padding', 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft',
30
+ 'margin', 'marginTop', 'marginRight', 'marginBottom', 'marginLeft',
31
+ 'gap', 'rowGap', 'columnGap', 'width', 'height',
32
+ 'minWidth', 'minHeight', 'maxWidth', 'maxHeight',
33
+ 'top', 'right', 'bottom', 'left',
34
+ 'borderWidth', 'borderRadius', 'fontSize',
35
+ 'inset', 'insetBlock', 'insetInline',
36
+ ]);
37
+ /**
38
+ * Build the token name for a Tailwind utility suggestion.
39
+ * E.g. prefix="bg", token path=["color","primary"] → "bg-primary"
40
+ */
41
+ function buildTailwindSuggestion(prefix, token) {
42
+ // Use last segment of the path as the Tailwind class modifier
43
+ const modifier = token.path[token.path.length - 1];
44
+ return `${prefix}-${modifier}`;
45
+ }
46
+ /**
47
+ * Build a spacing suggestion using the Tailwind scale.
48
+ * E.g. prefix="gap", value=12 → "gap-3"
49
+ */
50
+ function buildSpacingSuggestion(prefix, pxValue, token) {
51
+ // Check if the value maps to a standard Tailwind scale
52
+ const suffix = TAILWIND_SPACING[pxValue];
53
+ if (suffix) {
54
+ return `${prefix}-${suffix}`;
55
+ }
56
+ // Fallback: use token name
57
+ const modifier = token.path[token.path.length - 1];
58
+ return `${prefix}-${modifier}`;
59
+ }
60
+ /**
61
+ * Find Tailwind arbitrary color values in className strings.
62
+ */
63
+ function findTailwindColorViolations(className, line, column, filePath, tokens) {
64
+ const violations = [];
65
+ let match;
66
+ // Reset regex
67
+ COLOR_ARBITRARY_RE.lastIndex = 0;
68
+ while ((match = COLOR_ARBITRARY_RE.exec(className)) !== null) {
69
+ const fullMatch = match[0]; // e.g. "bg-[#6366f1]"
70
+ const hexValue = `#${match[1]}`;
71
+ const prefix = fullMatch.split('-[')[0]; // e.g. "bg"
72
+ const suggestion = findClosestColor(hexValue, tokens);
73
+ const violation = {
74
+ file: filePath,
75
+ line,
76
+ column: column + match.index,
77
+ found: hexValue,
78
+ context: fullMatch,
79
+ type: 'color',
80
+ source: 'static',
81
+ severity: suggestion && suggestion.distance === 0 ? 'critical' : 'moderate',
82
+ suggestion: suggestion
83
+ ? buildTailwindSuggestion(prefix, suggestion.token)
84
+ : 'nenhum token próximo',
85
+ alternatives: suggestion?.alternatives?.map((t) => buildTailwindSuggestion(prefix, t)),
86
+ };
87
+ violations.push(violation);
88
+ }
89
+ return violations;
90
+ }
91
+ /**
92
+ * Find Tailwind arbitrary spacing values in className strings.
93
+ */
94
+ function findTailwindSpacingViolations(className, line, column, filePath, tokens) {
95
+ const violations = [];
96
+ let match;
97
+ // Reset regex
98
+ SPACING_ARBITRARY_RE.lastIndex = 0;
99
+ while ((match = SPACING_ARBITRARY_RE.exec(className)) !== null) {
100
+ const fullMatch = match[0]; // e.g. "gap-[13px]"
101
+ const numValue = parseFloat(match[1]);
102
+ const unit = match[2] || 'px';
103
+ const pxValue = unit === 'rem' || unit === 'em' ? numValue * 16 : numValue;
104
+ const sizeStr = `${numValue}${unit}`;
105
+ const prefix = fullMatch.split('-[')[0]; // e.g. "gap"
106
+ const suggestion = findClosestSpacing(sizeStr, tokens);
107
+ // Build alternatives with Tailwind scale values
108
+ const alts = [];
109
+ if (suggestion) {
110
+ // Primary suggestion
111
+ const mainPx = parseFloat(suggestion.token.value);
112
+ alts.push(`${buildSpacingSuggestion(prefix, mainPx, suggestion.token)} (${suggestion.token.value})`);
113
+ if (suggestion.alternatives) {
114
+ for (const alt of suggestion.alternatives) {
115
+ const altPx = parseFloat(alt.value);
116
+ alts.push(`${buildSpacingSuggestion(prefix, altPx, alt)} (${alt.value})`);
117
+ }
118
+ }
119
+ }
120
+ const violation = {
121
+ file: filePath,
122
+ line,
123
+ column: column + match.index,
124
+ found: sizeStr,
125
+ context: fullMatch,
126
+ type: 'spacing',
127
+ source: 'static',
128
+ severity: suggestion && suggestion.distance === 0 ? 'critical' : 'moderate',
129
+ suggestion: suggestion
130
+ ? buildSpacingSuggestion(prefix, pxValue, suggestion.token)
131
+ : 'nenhum token próximo',
132
+ alternatives: alts.length > 0 ? alts : undefined,
133
+ };
134
+ violations.push(violation);
135
+ }
136
+ return violations;
137
+ }
138
+ function checkAccessibility(ctx, filePath) {
139
+ const violations = [];
140
+ const { elementName, attributes, line, column } = ctx;
141
+ // Skip elements inside a11y-managed triggers (Base UI, Radix)
142
+ if (ctx.isInsideManagedTrigger)
143
+ return violations;
144
+ // <img> without alt
145
+ if (elementName === 'img' && !attributes.has('alt')) {
146
+ violations.push({
147
+ file: filePath,
148
+ line,
149
+ column,
150
+ found: '<img>',
151
+ context: '<img> sem atributo alt',
152
+ type: 'accessibility',
153
+ severity: 'serious',
154
+ source: 'static',
155
+ suggestion: 'adicione alt="texto descritivo"',
156
+ });
157
+ }
158
+ // <button> without text content or aria-label
159
+ if (elementName === 'button' && !attributes.has('aria-label') && !ctx.hasChildren) {
160
+ // Check if project has a Button component — suggest using it
161
+ const hasButtonComponent = ctx.projectContext?.uiComponents.some((c) => c.toLowerCase() === 'button');
162
+ violations.push({
163
+ file: filePath,
164
+ line,
165
+ column,
166
+ found: '<button>',
167
+ context: '<button> sem texto ou aria-label',
168
+ type: 'accessibility',
169
+ severity: 'serious',
170
+ source: 'static',
171
+ suggestion: hasButtonComponent
172
+ ? 'troque por <Button> com children visíveis'
173
+ : 'adicione aria-label descritivo',
174
+ });
175
+ }
176
+ // onClick on non-interactive elements without role + tabIndex
177
+ const nonInteractive = ['div', 'span', 'p', 'section', 'article', 'li'];
178
+ if (nonInteractive.includes(elementName) &&
179
+ attributes.has('onClick') &&
180
+ !attributes.has('role')) {
181
+ // Classify the element semantically before suggesting a fix
182
+ const role = classifyElement({
183
+ tag: elementName,
184
+ className: ctx.className,
185
+ attributes,
186
+ hasChildren: ctx.hasChildren,
187
+ onClickSource: ctx.onClickSource,
188
+ });
189
+ // Backdrops and containers don't need role="button"
190
+ if (role === 'backdrop' || role === 'container')
191
+ return violations;
192
+ // Check if project has a Button component
193
+ const hasButtonComponent = ctx.projectContext?.uiComponents.some((c) => c.toLowerCase() === 'button');
194
+ const suggestion = hasButtonComponent
195
+ ? `troque <${elementName}> por <Button>`
196
+ : `troque <${elementName}> por <button>, ou adicione role="button", tabIndex={0} e onKeyDown`;
197
+ violations.push({
198
+ file: filePath,
199
+ line,
200
+ column,
201
+ found: `<${elementName} onClick>`,
202
+ context: `<${elementName}> com onClick sem role e tabIndex`,
203
+ type: 'accessibility',
204
+ severity: 'serious',
205
+ source: 'static',
206
+ suggestion,
207
+ });
208
+ }
209
+ return violations;
210
+ }
211
+ /**
212
+ * Check if a project has a11y-managed libraries installed.
213
+ */
214
+ function hasA11yManagedLib(projectContext) {
215
+ if (!projectContext)
216
+ return false;
217
+ return projectContext.dependencies.some((dep) => A11Y_MANAGED_LIBS.some((lib) => dep.includes(lib) || dep.includes('radix')));
218
+ }
219
+ /**
220
+ * Validate a single file's source code against design tokens.
221
+ */
222
+ export async function validateFile(code, filePath, tokens, projectContext) {
223
+ const parseResult = parseCode(code, filePath);
224
+ if (!parseResult.ok) {
225
+ return parseResult;
226
+ }
227
+ const violations = [];
228
+ const hasManagedLib = hasA11yManagedLib(projectContext);
229
+ await walkAST(parseResult.value, {
230
+ // Check className attributes for Tailwind arbitrary values
231
+ JSXAttribute(path) {
232
+ const node = path.node;
233
+ if (node.name.type === 'JSXIdentifier' &&
234
+ (node.name.name === 'className' || node.name.name === 'class')) {
235
+ let classValue = '';
236
+ let valueLine = node.loc?.start.line || 1;
237
+ let valueCol = node.loc?.start.column || 0;
238
+ if (node.value?.type === 'StringLiteral') {
239
+ classValue = node.value.value;
240
+ valueLine = node.value.loc?.start.line || valueLine;
241
+ valueCol = (node.value.loc?.start.column || valueCol) + 1; // +1 for quote
242
+ }
243
+ else if (node.value?.type === 'JSXExpressionContainer' &&
244
+ node.value.expression.type === 'StringLiteral') {
245
+ classValue = node.value.expression.value;
246
+ valueLine = node.value.expression.loc?.start.line || valueLine;
247
+ valueCol = (node.value.expression.loc?.start.column || valueCol) + 1;
248
+ }
249
+ else if (node.value?.type === 'JSXExpressionContainer' &&
250
+ node.value.expression.type === 'TemplateLiteral') {
251
+ // Handle template literals: extract quasis
252
+ for (const quasi of node.value.expression.quasis) {
253
+ const quasiValue = quasi.value.raw;
254
+ const quasiLine = quasi.loc?.start.line || valueLine;
255
+ const quasiCol = quasi.loc?.start.column || valueCol;
256
+ violations.push(...findTailwindColorViolations(quasiValue, quasiLine, quasiCol, filePath, tokens), ...findTailwindSpacingViolations(quasiValue, quasiLine, quasiCol, filePath, tokens));
257
+ }
258
+ return;
259
+ }
260
+ if (classValue) {
261
+ violations.push(...findTailwindColorViolations(classValue, valueLine, valueCol, filePath, tokens), ...findTailwindSpacingViolations(classValue, valueLine, valueCol, filePath, tokens));
262
+ }
263
+ }
264
+ },
265
+ // Check inline style={{ }} for hardcoded values
266
+ JSXOpeningElement(path) {
267
+ const node = path.node;
268
+ const elementName = node.name.type === 'JSXIdentifier' ? node.name.name : '';
269
+ const line = node.loc?.start.line || 1;
270
+ const column = node.loc?.start.column || 0;
271
+ const attributeMap = new Map();
272
+ let className = '';
273
+ let onClickSource;
274
+ for (const attr of node.attributes) {
275
+ if (attr.type !== 'JSXAttribute' || attr.name.type !== 'JSXIdentifier')
276
+ continue;
277
+ attributeMap.set(attr.name.name, attr.value);
278
+ // Extract className string for classification
279
+ if (attr.name.name === 'className' || attr.name.name === 'class') {
280
+ if (attr.value?.type === 'StringLiteral') {
281
+ className = attr.value.value;
282
+ }
283
+ else if (attr.value?.type === 'JSXExpressionContainer' &&
284
+ attr.value.expression.type === 'StringLiteral') {
285
+ className = attr.value.expression.value;
286
+ }
287
+ }
288
+ // Extract onClick source for stopPropagation detection
289
+ if (attr.name.name === 'onClick' && attr.value?.type === 'JSXExpressionContainer') {
290
+ const expr = attr.value.expression;
291
+ if (expr.type === 'ArrowFunctionExpression' || expr.type === 'FunctionExpression') {
292
+ // Extract source from loc range
293
+ if (expr.start != null && expr.end != null) {
294
+ onClickSource = code.slice(expr.start, expr.end);
295
+ }
296
+ }
297
+ }
298
+ if (attr.name.name === 'style' &&
299
+ attr.value?.type === 'JSXExpressionContainer' &&
300
+ attr.value.expression.type === 'ObjectExpression') {
301
+ const objExpr = attr.value.expression;
302
+ for (const prop of objExpr.properties) {
303
+ if (prop.type !== 'ObjectProperty')
304
+ continue;
305
+ if (prop.key.type !== 'Identifier')
306
+ continue;
307
+ const propName = prop.key.name;
308
+ const propLine = prop.loc?.start.line || line;
309
+ const propCol = prop.loc?.start.column || column;
310
+ if (prop.value.type === 'StringLiteral') {
311
+ const val = prop.value.value;
312
+ if (COLOR_PROPERTIES.has(propName) && INLINE_COLOR_RE.test(val)) {
313
+ const suggestion = findClosestColor(val, tokens);
314
+ violations.push({
315
+ file: filePath,
316
+ line: propLine,
317
+ column: propCol,
318
+ found: val,
319
+ context: `${propName}: '${val}'`,
320
+ type: 'color',
321
+ severity: suggestion && suggestion.distance === 0 ? 'critical' : 'moderate',
322
+ source: 'static',
323
+ suggestion: suggestion
324
+ ? `usar token ${suggestion.token.name} (${suggestion.token.value})`
325
+ : 'nenhum token próximo',
326
+ alternatives: suggestion?.alternatives?.map((t) => `${t.name} (${t.value})`),
327
+ });
328
+ }
329
+ if (SPACING_PROPERTIES.has(propName) && INLINE_SIZE_RE.test(val)) {
330
+ const suggestion = findClosestSpacing(val, tokens);
331
+ violations.push({
332
+ file: filePath,
333
+ line: propLine,
334
+ column: propCol,
335
+ found: val,
336
+ context: `${propName}: '${val}'`,
337
+ type: 'spacing',
338
+ severity: suggestion && suggestion.distance === 0 ? 'critical' : 'moderate',
339
+ source: 'static',
340
+ suggestion: suggestion
341
+ ? `usar token ${suggestion.token.name} (${suggestion.token.value})`
342
+ : 'nenhum token próximo',
343
+ alternatives: suggestion?.alternatives?.map((t) => `${t.name} (${t.value})`),
344
+ });
345
+ }
346
+ }
347
+ }
348
+ }
349
+ }
350
+ // Detect if this element is inside a managed trigger (Base UI, Radix)
351
+ let isInsideManagedTrigger = false;
352
+ if (hasManagedLib) {
353
+ let ancestor = path.parentPath;
354
+ while (ancestor) {
355
+ if (ancestor.node.type === 'JSXElement') {
356
+ const openingName = ancestor.node.openingElement?.name;
357
+ if (openingName?.type === 'JSXIdentifier' && A11Y_MANAGED_TRIGGERS.has(openingName.name)) {
358
+ isInsideManagedTrigger = true;
359
+ break;
360
+ }
361
+ }
362
+ ancestor = ancestor.parentPath;
363
+ }
364
+ }
365
+ // Check accessibility (determine if element has children)
366
+ const parentNode = path.parent;
367
+ const hasChildren = parentNode?.type === 'JSXElement' &&
368
+ parentNode.children?.some((child) => (child.type === 'JSXText' && child.value?.trim()) ||
369
+ child.type === 'JSXElement' ||
370
+ child.type === 'JSXExpressionContainer');
371
+ violations.push(...checkAccessibility({
372
+ elementName,
373
+ attributes: attributeMap,
374
+ className,
375
+ onClickSource,
376
+ line,
377
+ column,
378
+ hasChildren: hasChildren || false,
379
+ isInsideManagedTrigger,
380
+ projectContext,
381
+ }, filePath));
382
+ },
383
+ });
384
+ return { ok: true, value: violations };
385
+ }
386
+ /**
387
+ * Validate a file from disk.
388
+ */
389
+ export async function validateFileFromPath(filePath, tokens, projectContext) {
390
+ try {
391
+ const code = readFileSync(filePath, 'utf-8');
392
+ return validateFile(code, filePath, tokens, projectContext);
393
+ }
394
+ catch (err) {
395
+ return { ok: false, error: `Failed to read file: ${err.message}` };
396
+ }
397
+ }
398
+ //# sourceMappingURL=static.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static.js","sourceRoot":"","sources":["../../src/validators/static.ts"],"names":[],"mappings":"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"}