@design-guard/core 0.3.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 (133) hide show
  1. package/dist/index.d.ts +20 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +18 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/research/business-researcher.d.ts +42 -0
  6. package/dist/research/business-researcher.d.ts.map +1 -0
  7. package/dist/research/business-researcher.js +888 -0
  8. package/dist/research/business-researcher.js.map +1 -0
  9. package/dist/research/design-synthesizer.d.ts +47 -0
  10. package/dist/research/design-synthesizer.d.ts.map +1 -0
  11. package/dist/research/design-synthesizer.js +628 -0
  12. package/dist/research/design-synthesizer.js.map +1 -0
  13. package/dist/research/research-cache.d.ts +7 -0
  14. package/dist/research/research-cache.d.ts.map +1 -0
  15. package/dist/research/research-cache.js +62 -0
  16. package/dist/research/research-cache.js.map +1 -0
  17. package/dist/research/types.d.ts +99 -0
  18. package/dist/research/types.d.ts.map +1 -0
  19. package/dist/research/types.js +6 -0
  20. package/dist/research/types.js.map +1 -0
  21. package/dist/templates/design-md.d.ts +53 -0
  22. package/dist/templates/design-md.d.ts.map +1 -0
  23. package/dist/templates/design-md.js +315 -0
  24. package/dist/templates/design-md.js.map +1 -0
  25. package/dist/templates/prompts.d.ts +32 -0
  26. package/dist/templates/prompts.d.ts.map +1 -0
  27. package/dist/templates/prompts.js +39 -0
  28. package/dist/templates/prompts.js.map +1 -0
  29. package/dist/tokens/dtcg-converter.d.ts +62 -0
  30. package/dist/tokens/dtcg-converter.d.ts.map +1 -0
  31. package/dist/tokens/dtcg-converter.js +385 -0
  32. package/dist/tokens/dtcg-converter.js.map +1 -0
  33. package/dist/utils/prompt-enhancer.d.ts +22 -0
  34. package/dist/utils/prompt-enhancer.d.ts.map +1 -0
  35. package/dist/utils/prompt-enhancer.js +104 -0
  36. package/dist/utils/prompt-enhancer.js.map +1 -0
  37. package/dist/utils/validators.d.ts +126 -0
  38. package/dist/utils/validators.d.ts.map +1 -0
  39. package/dist/utils/validators.js +110 -0
  40. package/dist/utils/validators.js.map +1 -0
  41. package/dist/validation/design-validator.d.ts +45 -0
  42. package/dist/validation/design-validator.d.ts.map +1 -0
  43. package/dist/validation/design-validator.js +396 -0
  44. package/dist/validation/design-validator.js.map +1 -0
  45. package/dist/validation/output-validator.d.ts +46 -0
  46. package/dist/validation/output-validator.d.ts.map +1 -0
  47. package/dist/validation/output-validator.js +146 -0
  48. package/dist/validation/output-validator.js.map +1 -0
  49. package/dist/validation/rules/alt-text.d.ts +8 -0
  50. package/dist/validation/rules/alt-text.d.ts.map +1 -0
  51. package/dist/validation/rules/alt-text.js +35 -0
  52. package/dist/validation/rules/alt-text.js.map +1 -0
  53. package/dist/validation/rules/business-alignment.d.ts +7 -0
  54. package/dist/validation/rules/business-alignment.d.ts.map +1 -0
  55. package/dist/validation/rules/business-alignment.js +98 -0
  56. package/dist/validation/rules/business-alignment.js.map +1 -0
  57. package/dist/validation/rules/color-adherence.d.ts +8 -0
  58. package/dist/validation/rules/color-adherence.d.ts.map +1 -0
  59. package/dist/validation/rules/color-adherence.js +92 -0
  60. package/dist/validation/rules/color-adherence.js.map +1 -0
  61. package/dist/validation/rules/empty-body.d.ts +6 -0
  62. package/dist/validation/rules/empty-body.d.ts.map +1 -0
  63. package/dist/validation/rules/empty-body.js +24 -0
  64. package/dist/validation/rules/empty-body.js.map +1 -0
  65. package/dist/validation/rules/heading-hierarchy.d.ts +8 -0
  66. package/dist/validation/rules/heading-hierarchy.d.ts.map +1 -0
  67. package/dist/validation/rules/heading-hierarchy.js +48 -0
  68. package/dist/validation/rules/heading-hierarchy.js.map +1 -0
  69. package/dist/validation/rules/index.d.ts +21 -0
  70. package/dist/validation/rules/index.d.ts.map +1 -0
  71. package/dist/validation/rules/index.js +66 -0
  72. package/dist/validation/rules/index.js.map +1 -0
  73. package/dist/validation/rules/no-centered-everything.d.ts +6 -0
  74. package/dist/validation/rules/no-centered-everything.d.ts.map +1 -0
  75. package/dist/validation/rules/no-centered-everything.js +59 -0
  76. package/dist/validation/rules/no-centered-everything.js.map +1 -0
  77. package/dist/validation/rules/no-default-fonts.d.ts +8 -0
  78. package/dist/validation/rules/no-default-fonts.d.ts.map +1 -0
  79. package/dist/validation/rules/no-default-fonts.js +111 -0
  80. package/dist/validation/rules/no-default-fonts.js.map +1 -0
  81. package/dist/validation/rules/no-div-soup.d.ts +6 -0
  82. package/dist/validation/rules/no-div-soup.d.ts.map +1 -0
  83. package/dist/validation/rules/no-div-soup.js +45 -0
  84. package/dist/validation/rules/no-div-soup.js.map +1 -0
  85. package/dist/validation/rules/no-duplicate-ctas.d.ts +6 -0
  86. package/dist/validation/rules/no-duplicate-ctas.d.ts.map +1 -0
  87. package/dist/validation/rules/no-duplicate-ctas.js +32 -0
  88. package/dist/validation/rules/no-duplicate-ctas.js.map +1 -0
  89. package/dist/validation/rules/no-generic-hero.d.ts +7 -0
  90. package/dist/validation/rules/no-generic-hero.d.ts.map +1 -0
  91. package/dist/validation/rules/no-generic-hero.js +46 -0
  92. package/dist/validation/rules/no-generic-hero.js.map +1 -0
  93. package/dist/validation/rules/no-icon-grid.d.ts +8 -0
  94. package/dist/validation/rules/no-icon-grid.d.ts.map +1 -0
  95. package/dist/validation/rules/no-icon-grid.js +43 -0
  96. package/dist/validation/rules/no-icon-grid.js.map +1 -0
  97. package/dist/validation/rules/no-lorem-ipsum.d.ts +6 -0
  98. package/dist/validation/rules/no-lorem-ipsum.d.ts.map +1 -0
  99. package/dist/validation/rules/no-lorem-ipsum.js +66 -0
  100. package/dist/validation/rules/no-lorem-ipsum.js.map +1 -0
  101. package/dist/validation/rules/no-missing-meta.d.ts +6 -0
  102. package/dist/validation/rules/no-missing-meta.d.ts.map +1 -0
  103. package/dist/validation/rules/no-missing-meta.js +49 -0
  104. package/dist/validation/rules/no-missing-meta.js.map +1 -0
  105. package/dist/validation/rules/no-missing-responsive.d.ts +6 -0
  106. package/dist/validation/rules/no-missing-responsive.d.ts.map +1 -0
  107. package/dist/validation/rules/no-missing-responsive.js +30 -0
  108. package/dist/validation/rules/no-missing-responsive.js.map +1 -0
  109. package/dist/validation/rules/no-placeholder-images.d.ts +6 -0
  110. package/dist/validation/rules/no-placeholder-images.d.ts.map +1 -0
  111. package/dist/validation/rules/no-placeholder-images.js +73 -0
  112. package/dist/validation/rules/no-placeholder-images.js.map +1 -0
  113. package/dist/validation/rules/no-saas-speak.d.ts +6 -0
  114. package/dist/validation/rules/no-saas-speak.d.ts.map +1 -0
  115. package/dist/validation/rules/no-saas-speak.js +74 -0
  116. package/dist/validation/rules/no-saas-speak.js.map +1 -0
  117. package/dist/validation/rules/no-slop-gradients.d.ts +6 -0
  118. package/dist/validation/rules/no-slop-gradients.d.ts.map +1 -0
  119. package/dist/validation/rules/no-slop-gradients.js +24 -0
  120. package/dist/validation/rules/no-slop-gradients.js.map +1 -0
  121. package/dist/validation/rules/no-uniform-spacing.d.ts +6 -0
  122. package/dist/validation/rules/no-uniform-spacing.d.ts.map +1 -0
  123. package/dist/validation/rules/no-uniform-spacing.js +64 -0
  124. package/dist/validation/rules/no-uniform-spacing.js.map +1 -0
  125. package/dist/validation/rules/types.d.ts +36 -0
  126. package/dist/validation/rules/types.d.ts.map +1 -0
  127. package/dist/validation/rules/types.js +7 -0
  128. package/dist/validation/rules/types.js.map +1 -0
  129. package/dist/validation/tailwind-parser.d.ts +36 -0
  130. package/dist/validation/tailwind-parser.d.ts.map +1 -0
  131. package/dist/validation/tailwind-parser.js +214 -0
  132. package/dist/validation/tailwind-parser.js.map +1 -0
  133. package/package.json +45 -0
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Build an initial generation prompt using zoom-out-zoom-in framework.
3
+ */
4
+ export function buildInitialPrompt(spec) {
5
+ const designRef = spec.hasDesignMd
6
+ ? 'Following the imported design system, '
7
+ : '';
8
+ const sectionList = spec.sections
9
+ .map((s, i) => `${i + 1}. ${s}`)
10
+ .join('\n');
11
+ return `${designRef}A ${spec.visualTone} ${spec.pageType} for "${spec.productName}," a ${spec.productDescription}.
12
+ Designed for ${spec.targetUser}.
13
+
14
+ Include these sections:
15
+ ${sectionList}`;
16
+ }
17
+ /**
18
+ * Build a refinement prompt (one change at a time).
19
+ */
20
+ export function buildRefinementPrompt(spec) {
21
+ let prompt = `On the ${spec.sectionTarget} of ${spec.screenName}, ${spec.change}.`;
22
+ if (spec.details && spec.details.length > 0) {
23
+ prompt += '\n' + spec.details.map(d => `- ${d}`).join('\n');
24
+ }
25
+ return prompt;
26
+ }
27
+ /**
28
+ * Build a localization prompt (apply after layout is established).
29
+ */
30
+ export function buildLocalePrompt(language) {
31
+ return `Switch all text content to ${language}.`;
32
+ }
33
+ /**
34
+ * Build a multi-screen consistency prefix.
35
+ */
36
+ export function buildConsistencyPrefix(referenceScreen) {
37
+ return `Following the same design language as the ${referenceScreen}, `;
38
+ }
39
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/templates/prompts.ts"],"names":[],"mappings":"AAiBA;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAgB;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW;QAChC,CAAC,CAAC,wCAAwC;QAC1C,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;SAC/B,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,GAAG,SAAS,KAAK,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,SAAS,IAAI,CAAC,WAAW,QAAQ,IAAI,CAAC,kBAAkB;eACnG,IAAI,CAAC,UAAU;;;EAG5B,WAAW,EAAE,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAoB;IACxD,IAAI,MAAM,GAAG,UAAU,IAAI,CAAC,aAAa,OAAO,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC;IAEnF,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,OAAO,8BAA8B,QAAQ,GAAG,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,eAAuB;IAC5D,OAAO,6CAA6C,eAAe,IAAI,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * DTCG Token Converter
3
+ *
4
+ * Converts between DESIGN.md format and the W3C DTCG (Design Tokens Community Group)
5
+ * format. The DTCG spec (2025.10) defines tokens as { $value, $type, $description }.
6
+ *
7
+ * See: https://tr.designtokens.org/format/
8
+ */
9
+ export interface DTCGToken {
10
+ $value: string | number | Record<string, unknown>;
11
+ $type?: string;
12
+ $description?: string;
13
+ }
14
+ export interface DTCGTokenGroup {
15
+ [key: string]: DTCGToken | DTCGTokenGroup | string | undefined;
16
+ $description?: string;
17
+ }
18
+ export interface DTCGFile {
19
+ $description?: string;
20
+ color?: DTCGTokenGroup;
21
+ typography?: DTCGTokenGroup;
22
+ spacing?: DTCGTokenGroup;
23
+ [key: string]: DTCGTokenGroup | string | undefined;
24
+ }
25
+ /**
26
+ * Convert a DESIGN.md string to DTCG token format.
27
+ *
28
+ * Extracts:
29
+ * - Color palette (Section 2) → color tokens
30
+ * - Typography (Section 3) → typography tokens
31
+ * - Spacing (Section 4) → dimension tokens
32
+ */
33
+ export declare function designMdToDTCG(designMd: string): DTCGFile;
34
+ /**
35
+ * Convert DTCG tokens back to DESIGN.md format sections.
36
+ * This allows importing design tokens from Figma/Tokens Studio into DESIGN.md.
37
+ */
38
+ export declare function dtcgToDesignMd(tokens: DTCGFile): string;
39
+ /**
40
+ * Convert DTCG tokens to CSS custom properties.
41
+ */
42
+ export declare function dtcgToCSS(tokens: DTCGFile): string;
43
+ /**
44
+ * Convert DTCG tokens to flat key-value JSON.
45
+ */
46
+ export declare function dtcgToFlatJSON(tokens: DTCGFile): Record<string, string | number>;
47
+ /**
48
+ * Extract color tokens from Section 2 (Color Palette & Roles).
49
+ * Parses markdown table rows with hex values.
50
+ */
51
+ export declare function extractColorTokens(markdown: string): DTCGTokenGroup;
52
+ /**
53
+ * Extract typography tokens from Section 3 (Typography).
54
+ * Parses font-family declarations and size table.
55
+ */
56
+ export declare function extractTypographyTokens(markdown: string): DTCGTokenGroup;
57
+ /**
58
+ * Extract spacing tokens from Section 4 (Spacing & Layout).
59
+ * Parses base unit, scale, max-width, breakpoints.
60
+ */
61
+ export declare function extractSpacingTokens(markdown: string): DTCGTokenGroup;
62
+ //# sourceMappingURL=dtcg-converter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dtcg-converter.d.ts","sourceRoot":"","sources":["../../src/tokens/dtcg-converter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,MAAM,GAAG,SAAS,CAAC;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,MAAM,GAAG,SAAS,CAAC;CACpD;AAID;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAUzD;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAcvD;AAID;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CA4ClD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAsBhF;AAYD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CA0BnE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAgDxE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CA8DrE"}
@@ -0,0 +1,385 @@
1
+ /**
2
+ * DTCG Token Converter
3
+ *
4
+ * Converts between DESIGN.md format and the W3C DTCG (Design Tokens Community Group)
5
+ * format. The DTCG spec (2025.10) defines tokens as { $value, $type, $description }.
6
+ *
7
+ * See: https://tr.designtokens.org/format/
8
+ */
9
+ // ─── DESIGN.md → DTCG ─────────────────────────────────────────────
10
+ /**
11
+ * Convert a DESIGN.md string to DTCG token format.
12
+ *
13
+ * Extracts:
14
+ * - Color palette (Section 2) → color tokens
15
+ * - Typography (Section 3) → typography tokens
16
+ * - Spacing (Section 4) → dimension tokens
17
+ */
18
+ export function designMdToDTCG(designMd) {
19
+ const tokens = {
20
+ $description: 'Design tokens extracted from DESIGN.md',
21
+ };
22
+ tokens.color = extractColorTokens(designMd);
23
+ tokens.typography = extractTypographyTokens(designMd);
24
+ tokens.spacing = extractSpacingTokens(designMd);
25
+ return tokens;
26
+ }
27
+ // ─── DTCG → DESIGN.md ─────────────────────────────────────────────
28
+ /**
29
+ * Convert DTCG tokens back to DESIGN.md format sections.
30
+ * This allows importing design tokens from Figma/Tokens Studio into DESIGN.md.
31
+ */
32
+ export function dtcgToDesignMd(tokens) {
33
+ const sections = [];
34
+ if (tokens.color && Object.keys(tokens.color).some(k => !k.startsWith('$'))) {
35
+ sections.push(generateColorSection(tokens.color));
36
+ }
37
+ if (tokens.typography && Object.keys(tokens.typography).some(k => !k.startsWith('$'))) {
38
+ sections.push(generateTypographySection(tokens.typography));
39
+ }
40
+ if (tokens.spacing && Object.keys(tokens.spacing).some(k => !k.startsWith('$'))) {
41
+ sections.push(generateSpacingSection(tokens.spacing));
42
+ }
43
+ return sections.join('\n\n');
44
+ }
45
+ // ─── Format converters ─────────────────────────────────────────────
46
+ /**
47
+ * Convert DTCG tokens to CSS custom properties.
48
+ */
49
+ export function dtcgToCSS(tokens) {
50
+ const lines = [':root {'];
51
+ if (tokens.color) {
52
+ lines.push(' /* Colors */');
53
+ for (const [key, token] of Object.entries(tokens.color)) {
54
+ if (key.startsWith('$'))
55
+ continue;
56
+ if (isToken(token)) {
57
+ lines.push(` --color-${key}: ${token.$value};`);
58
+ }
59
+ }
60
+ }
61
+ if (tokens.typography) {
62
+ lines.push(' /* Typography */');
63
+ for (const [key, token] of Object.entries(tokens.typography)) {
64
+ if (key.startsWith('$'))
65
+ continue;
66
+ if (isToken(token)) {
67
+ // Simple value (font-family etc.)
68
+ lines.push(` --typography-${key}: ${token.$value};`);
69
+ }
70
+ else if (isTokenGroup(token)) {
71
+ // Composite: heading sizes, body sizes, etc.
72
+ for (const [subKey, subToken] of Object.entries(token)) {
73
+ if (subKey.startsWith('$'))
74
+ continue;
75
+ if (isToken(subToken)) {
76
+ lines.push(` --typography-${key}-${subKey}: ${typeof subToken.$value === 'object' ? JSON.stringify(subToken.$value) : subToken.$value};`);
77
+ }
78
+ }
79
+ }
80
+ }
81
+ }
82
+ if (tokens.spacing) {
83
+ lines.push(' /* Spacing */');
84
+ for (const [key, token] of Object.entries(tokens.spacing)) {
85
+ if (key.startsWith('$'))
86
+ continue;
87
+ if (isToken(token)) {
88
+ lines.push(` --spacing-${key}: ${token.$value};`);
89
+ }
90
+ }
91
+ }
92
+ lines.push('}');
93
+ return lines.join('\n');
94
+ }
95
+ /**
96
+ * Convert DTCG tokens to flat key-value JSON.
97
+ */
98
+ export function dtcgToFlatJSON(tokens) {
99
+ const flat = {};
100
+ function flatten(obj, prefix) {
101
+ for (const [key, value] of Object.entries(obj)) {
102
+ if (key.startsWith('$'))
103
+ continue;
104
+ const path = prefix ? `${prefix}.${key}` : key;
105
+ if (isToken(value)) {
106
+ flat[path] = typeof value.$value === 'object'
107
+ ? JSON.stringify(value.$value)
108
+ : value.$value;
109
+ }
110
+ else if (isTokenGroup(value)) {
111
+ flatten(value, path);
112
+ }
113
+ }
114
+ }
115
+ if (tokens.color)
116
+ flatten(tokens.color, 'color');
117
+ if (tokens.typography)
118
+ flatten(tokens.typography, 'typography');
119
+ if (tokens.spacing)
120
+ flatten(tokens.spacing, 'spacing');
121
+ return flat;
122
+ }
123
+ // ─── Extraction helpers ────────────────────────────────────────────
124
+ function extractSection(markdown, sectionNumber) {
125
+ const pattern = new RegExp(`## ${sectionNumber}\\..*?\n([\\s\\S]*?)(?=## \\d+\\.|$)`);
126
+ const match = markdown.match(pattern);
127
+ return match ? match[1].trim() : '';
128
+ }
129
+ /**
130
+ * Extract color tokens from Section 2 (Color Palette & Roles).
131
+ * Parses markdown table rows with hex values.
132
+ */
133
+ export function extractColorTokens(markdown) {
134
+ const section = extractSection(markdown, 2);
135
+ const group = {};
136
+ // Match table rows: | Role | Name | Hex | Usage |
137
+ const rowPattern = /\|\s*([^|]+)\s*\|\s*([^|]+)\s*\|\s*(#[0-9A-Fa-f]{6}|rgba?\([^)]+\))\s*\|\s*([^|]*)\s*\|/g;
138
+ let match;
139
+ while ((match = rowPattern.exec(section)) !== null) {
140
+ const role = match[1].trim();
141
+ const name = match[2].trim();
142
+ const hex = match[3].trim();
143
+ const usage = match[4].trim();
144
+ // Skip header row
145
+ if (role.toLowerCase() === 'role' || /^-+$/.test(role))
146
+ continue;
147
+ const tokenKey = toTokenKey(role);
148
+ group[tokenKey] = {
149
+ $value: hex,
150
+ $type: 'color',
151
+ $description: usage ? `${name} - ${usage}` : name,
152
+ };
153
+ }
154
+ return group;
155
+ }
156
+ /**
157
+ * Extract typography tokens from Section 3 (Typography).
158
+ * Parses font-family declarations and size table.
159
+ */
160
+ export function extractTypographyTokens(markdown) {
161
+ const section = extractSection(markdown, 3);
162
+ const group = {};
163
+ // Extract font families: **Heading**: "Font Name", fallback
164
+ const fontFamilyPattern = /\*\*(\w+)\*\*:\s*(.+)/g;
165
+ let match;
166
+ while ((match = fontFamilyPattern.exec(section)) !== null) {
167
+ const role = match[1].trim().toLowerCase();
168
+ const value = match[2].trim();
169
+ group[`fontFamily-${role}`] = {
170
+ $value: value,
171
+ $type: 'fontFamily',
172
+ $description: `${match[1].trim()} font family`,
173
+ };
174
+ }
175
+ // Extract size table: | Element | Size | Weight | Line Height |
176
+ const sizeGroup = {};
177
+ const rowPattern = /\|\s*([^|]+)\s*\|\s*([^|]+)\s*\|\s*([^|]+)\s*\|\s*([^|]+)\s*\|/g;
178
+ let rowMatch;
179
+ while ((rowMatch = rowPattern.exec(section)) !== null) {
180
+ const element = rowMatch[1].trim();
181
+ const size = rowMatch[2].trim();
182
+ const weight = rowMatch[3].trim();
183
+ const lineHeight = rowMatch[4].trim();
184
+ // Skip header and separator rows
185
+ if (element.toLowerCase() === 'element' || /^-+$/.test(element))
186
+ continue;
187
+ if (/^-+$/.test(size))
188
+ continue;
189
+ const key = toTokenKey(element);
190
+ sizeGroup[key] = {
191
+ $value: {
192
+ fontSize: size,
193
+ fontWeight: isNaN(Number(weight)) ? weight : Number(weight),
194
+ lineHeight: isNaN(Number(lineHeight)) ? lineHeight : Number(lineHeight),
195
+ },
196
+ $type: 'typography',
197
+ $description: `${element} typography preset`,
198
+ };
199
+ }
200
+ if (Object.keys(sizeGroup).length > 0) {
201
+ group.sizes = sizeGroup;
202
+ }
203
+ return group;
204
+ }
205
+ /**
206
+ * Extract spacing tokens from Section 4 (Spacing & Layout).
207
+ * Parses base unit, scale, max-width, breakpoints.
208
+ */
209
+ export function extractSpacingTokens(markdown) {
210
+ const section = extractSection(markdown, 4);
211
+ const group = {};
212
+ // Base unit: **Base unit**: 4px
213
+ const baseMatch = section.match(/base\s*unit[^:]*:\s*(\d+)(px|rem)/i);
214
+ if (baseMatch) {
215
+ group['base-unit'] = {
216
+ $value: `${baseMatch[1]}${baseMatch[2]}`,
217
+ $type: 'dimension',
218
+ $description: 'Base spacing unit',
219
+ };
220
+ }
221
+ // Scale: 4, 8, 12, 16, 24, ...
222
+ const scaleMatch = section.match(/scale[^:]*:\s*([\d,\s]+)/i);
223
+ if (scaleMatch) {
224
+ const unit = baseMatch ? baseMatch[2] : 'px';
225
+ const values = scaleMatch[1].split(',').map(s => s.trim()).filter(Boolean);
226
+ values.forEach((val, idx) => {
227
+ group[`scale-${idx + 1}`] = {
228
+ $value: `${val}${unit}`,
229
+ $type: 'dimension',
230
+ $description: `Spacing scale step ${idx + 1}`,
231
+ };
232
+ });
233
+ }
234
+ // Max content width
235
+ const maxWidthMatch = section.match(/max[- ]?(?:content[- ]?)?width[^:]*:\s*(\d+)(px|rem)/i);
236
+ if (maxWidthMatch) {
237
+ group['max-width'] = {
238
+ $value: `${maxWidthMatch[1]}${maxWidthMatch[2]}`,
239
+ $type: 'dimension',
240
+ $description: 'Maximum content width',
241
+ };
242
+ }
243
+ // Breakpoints
244
+ const breakpointPattern = /(\d+)(px|rem)\s*\((\w+)\)/g;
245
+ let bpMatch;
246
+ while ((bpMatch = breakpointPattern.exec(section)) !== null) {
247
+ const value = `${bpMatch[1]}${bpMatch[2]}`;
248
+ const name = bpMatch[3];
249
+ group[`breakpoint-${name}`] = {
250
+ $value: value,
251
+ $type: 'dimension',
252
+ $description: `Breakpoint ${name}`,
253
+ };
254
+ }
255
+ // Section vertical padding
256
+ const paddingMatch = section.match(/section\s*vertical\s*padding[^:]*:\s*(\d+)(px|rem)/i);
257
+ if (paddingMatch) {
258
+ group['section-padding'] = {
259
+ $value: `${paddingMatch[1]}${paddingMatch[2]}`,
260
+ $type: 'dimension',
261
+ $description: 'Section vertical padding (desktop)',
262
+ };
263
+ }
264
+ return group;
265
+ }
266
+ // ─── Section generators (DTCG → DESIGN.md) ─────────────────────────
267
+ function generateColorSection(colorGroup) {
268
+ const lines = [];
269
+ lines.push('## 2. Color Palette & Roles');
270
+ lines.push('');
271
+ lines.push('| Role | Name | Hex | Usage |');
272
+ lines.push('|------|------|-----|-------|');
273
+ for (const [key, token] of Object.entries(colorGroup)) {
274
+ if (key.startsWith('$') || !isToken(token))
275
+ continue;
276
+ const role = fromTokenKey(key);
277
+ const desc = token.$description || '';
278
+ const parts = desc.split(' - ');
279
+ const name = parts[0] || role;
280
+ const usage = parts[1] || '';
281
+ lines.push(`| ${role} | ${name} | ${token.$value} | ${usage} |`);
282
+ }
283
+ return lines.join('\n');
284
+ }
285
+ function generateTypographySection(typoGroup) {
286
+ const lines = [];
287
+ lines.push('## 3. Typography');
288
+ lines.push('');
289
+ // Font families
290
+ for (const [key, token] of Object.entries(typoGroup)) {
291
+ if (key.startsWith('$'))
292
+ continue;
293
+ if (key.startsWith('fontFamily-') && isToken(token)) {
294
+ const role = key.replace('fontFamily-', '');
295
+ const label = role.charAt(0).toUpperCase() + role.slice(1);
296
+ lines.push(`- **${label}**: ${token.$value}`);
297
+ }
298
+ }
299
+ // Size table
300
+ const sizes = typoGroup.sizes;
301
+ if (sizes && isTokenGroup(sizes)) {
302
+ lines.push('');
303
+ lines.push('| Element | Size | Weight | Line Height |');
304
+ lines.push('|---------|------|--------|-------------|');
305
+ for (const [key, token] of Object.entries(sizes)) {
306
+ if (key.startsWith('$') || !isToken(token))
307
+ continue;
308
+ const element = fromTokenKey(key);
309
+ const val = token.$value;
310
+ lines.push(`| ${element} | ${val.fontSize || ''} | ${val.fontWeight || ''} | ${val.lineHeight || ''} |`);
311
+ }
312
+ }
313
+ return lines.join('\n');
314
+ }
315
+ function generateSpacingSection(spacingGroup) {
316
+ const lines = [];
317
+ lines.push('## 4. Spacing & Layout');
318
+ lines.push('');
319
+ // Base unit
320
+ const baseUnit = spacingGroup['base-unit'];
321
+ if (isToken(baseUnit)) {
322
+ lines.push(`- **Base unit**: ${baseUnit.$value}`);
323
+ }
324
+ // Scale
325
+ const scaleTokens = [];
326
+ for (const [key, token] of Object.entries(spacingGroup)) {
327
+ if (key.startsWith('scale-') && isToken(token)) {
328
+ const idx = parseInt(key.replace('scale-', ''), 10);
329
+ scaleTokens.push({ idx, value: String(token.$value).replace(/px|rem/, '') });
330
+ }
331
+ }
332
+ if (scaleTokens.length > 0) {
333
+ scaleTokens.sort((a, b) => a.idx - b.idx);
334
+ lines.push(`- **Scale**: ${scaleTokens.map(s => s.value).join(', ')}`);
335
+ }
336
+ // Max width
337
+ const maxWidth = spacingGroup['max-width'];
338
+ if (isToken(maxWidth)) {
339
+ lines.push(`- **Max content width**: ${maxWidth.$value}`);
340
+ }
341
+ // Breakpoints
342
+ const breakpoints = [];
343
+ for (const [key, token] of Object.entries(spacingGroup)) {
344
+ if (key.startsWith('breakpoint-') && isToken(token)) {
345
+ breakpoints.push({
346
+ name: key.replace('breakpoint-', ''),
347
+ value: String(token.$value),
348
+ });
349
+ }
350
+ }
351
+ if (breakpoints.length > 0) {
352
+ const bpStr = breakpoints.map(b => `${b.value} (${b.name})`).join(', ');
353
+ lines.push(`- **Breakpoints**: ${bpStr}`);
354
+ }
355
+ // Section padding
356
+ const sectionPadding = spacingGroup['section-padding'];
357
+ if (isToken(sectionPadding)) {
358
+ lines.push(`- **Section vertical padding**: ${sectionPadding.$value} desktop`);
359
+ }
360
+ return lines.join('\n');
361
+ }
362
+ // ─── Utility helpers ───────────────────────────────────────────────
363
+ function toTokenKey(label) {
364
+ return label
365
+ .toLowerCase()
366
+ .replace(/[^a-z0-9]+/g, '-')
367
+ .replace(/^-|-$/g, '');
368
+ }
369
+ function fromTokenKey(key) {
370
+ return key
371
+ .split('-')
372
+ .map(w => w.charAt(0).toUpperCase() + w.slice(1))
373
+ .join('-');
374
+ }
375
+ function isToken(value) {
376
+ return (typeof value === 'object' &&
377
+ value !== null &&
378
+ '$value' in value);
379
+ }
380
+ function isTokenGroup(value) {
381
+ return (typeof value === 'object' &&
382
+ value !== null &&
383
+ !('$value' in value));
384
+ }
385
+ //# sourceMappingURL=dtcg-converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dtcg-converter.js","sourceRoot":"","sources":["../../src/tokens/dtcg-converter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface EnhancementResult {
2
+ original: string;
3
+ enhanced: string;
4
+ suggestions: string[];
5
+ slopRiskScore: number;
6
+ businessAlignmentIssues: string[];
7
+ }
8
+ /**
9
+ * Enhance a user prompt before sending to Stitch.
10
+ * Adds design context, replaces generic terms, and scores slop risk.
11
+ */
12
+ export declare function enhancePrompt(prompt: string): EnhancementResult;
13
+ /**
14
+ * Calculate AI slop risk score (0-10).
15
+ * Higher score = more likely to get generic AI output.
16
+ */
17
+ export declare function calculateSlopRisk(prompt: string): number;
18
+ /**
19
+ * Get human-readable risk level from score.
20
+ */
21
+ export declare function getSlopRiskLevel(score: number): 'low' | 'medium' | 'high';
22
+ //# sourceMappingURL=prompt-enhancer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-enhancer.d.ts","sourceRoot":"","sources":["../../src/utils/prompt-enhancer.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB,EAAE,MAAM,EAAE,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CA8E/D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA4BxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAIzE"}
@@ -0,0 +1,104 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ /**
3
+ * Enhance a user prompt before sending to Stitch.
4
+ * Adds design context, replaces generic terms, and scores slop risk.
5
+ */
6
+ export function enhancePrompt(prompt) {
7
+ const suggestions = [];
8
+ let enhanced = prompt;
9
+ // 1. Add DESIGN.md reference if available
10
+ if (existsSync('DESIGN.md')) {
11
+ if (!enhanced.toLowerCase().includes('design system') && !enhanced.toLowerCase().includes('design.md')) {
12
+ enhanced = `Following the imported design system, ${enhanced}`;
13
+ suggestions.push('Added DESIGN.md reference for visual consistency.');
14
+ }
15
+ }
16
+ // 2. Calculate slop risk score
17
+ const slopRiskScore = calculateSlopRisk(prompt);
18
+ // 3. Suggest replacements for generic terms
19
+ const genericReplacements = [
20
+ [/\bmodern\b/i, 'contemporary with sharp geometric accents', 'Replace "modern" with specific visual direction'],
21
+ [/\bclean\b/i, 'minimal with generous whitespace', 'Replace "clean" with concrete layout description'],
22
+ [/\bprofessional\b/i, 'corporate with structured grid layout', 'Replace "professional" with specific aesthetic'],
23
+ [/\bnice\b/i, 'polished with intentional typography', 'Replace "nice" with visual specifics'],
24
+ [/\bbeautiful\b/i, 'visually striking with bold color contrast', 'Replace "beautiful" with design attributes'],
25
+ ];
26
+ for (const [pattern, _replacement, suggestion] of genericReplacements) {
27
+ if (pattern.test(prompt)) {
28
+ suggestions.push(suggestion);
29
+ }
30
+ }
31
+ // 4. Check for missing specifics
32
+ if (!/\d+/.test(prompt)) {
33
+ suggestions.push('Add specific numbers (e.g., "3 pricing tiers", "4 testimonials") for better results.');
34
+ }
35
+ if (!/\b(grid|bento|card|layout|sticky|floating|sidebar|split|asymmetric)\b/i.test(prompt)) {
36
+ suggestions.push('Add UI layout terms (e.g., "bento grid", "split layout", "sticky header") for structural clarity.');
37
+ }
38
+ if (!/\b(section|hero|header|footer|nav|cta|testimonial|feature|pricing)\b/i.test(prompt)) {
39
+ suggestions.push('Describe specific sections for more targeted generation.');
40
+ }
41
+ // 5. Business alignment check
42
+ const businessAlignmentIssues = [];
43
+ if (existsSync('DESIGN.md')) {
44
+ const designContent = readFileSync('DESIGN.md', 'utf-8').toLowerCase();
45
+ // If DESIGN.md says NOT e-commerce, check for e-commerce terms in prompt
46
+ if (designContent.includes('not an e-commerce') || designContent.includes('not e-commerce') || designContent.includes('no online purchasing')) {
47
+ const ecommerceTerms = prompt.match(/\b(shopping cart|add to cart|checkout|buy now|purchase|order online|e-commerce|ecommerce|shop now)\b/gi);
48
+ if (ecommerceTerms) {
49
+ businessAlignmentIssues.push(`Prompt contains e-commerce terms (${ecommerceTerms.join(', ')}) but DESIGN.md specifies this is NOT an e-commerce site. Remove these elements.`);
50
+ }
51
+ }
52
+ // If DESIGN.md mentions store locator as key, check prompt includes it
53
+ if (designContent.includes('store locator') || designContent.includes('find nearest store')) {
54
+ if (!/\b(store|tienda|sucursal|location|ubicaci|locali|find|nearest|cerca)\b/i.test(prompt)) {
55
+ businessAlignmentIssues.push('DESIGN.md specifies store locator as a key element. Consider including a store finder section in this page.');
56
+ }
57
+ }
58
+ // If DESIGN.md mentions booking/contact as primary
59
+ if (designContent.includes('booking') || designContent.includes('appointment') || designContent.includes('contact form')) {
60
+ if (!/\b(book|contact|form|appointment|schedule|cita|agendar)\b/i.test(prompt)) {
61
+ businessAlignmentIssues.push('DESIGN.md specifies booking/contact as a primary feature. Consider including a contact or booking section.');
62
+ }
63
+ }
64
+ }
65
+ return { original: prompt, enhanced, suggestions, slopRiskScore, businessAlignmentIssues };
66
+ }
67
+ /**
68
+ * Calculate AI slop risk score (0-10).
69
+ * Higher score = more likely to get generic AI output.
70
+ */
71
+ export function calculateSlopRisk(prompt) {
72
+ let score = 0;
73
+ // No layout specifics
74
+ if (!/\b(grid|bento|card|layout|sticky|floating|sidebar|split|asymmetric|column|row)\b/i.test(prompt)) {
75
+ score += 2;
76
+ }
77
+ // No specific numbers
78
+ if (!/\b\d+\b/.test(prompt)) {
79
+ score += 2;
80
+ }
81
+ // No UI/UX vocabulary
82
+ if (!/\b(section|hero|header|footer|nav|cta|testimonial|feature|pricing|carousel|accordion|tab|modal)\b/i.test(prompt)) {
83
+ score += 2;
84
+ }
85
+ // No design system reference
86
+ if (!/\b(design system|design.md|palette|typography|font)\b/i.test(prompt)) {
87
+ score += 1;
88
+ }
89
+ // Uses generic adjectives
90
+ const genericCount = (prompt.match(/\b(modern|clean|professional|nice|beautiful|sleek|elegant|stunning)\b/gi) || []).length;
91
+ score += Math.min(genericCount, 3);
92
+ return Math.min(score, 10);
93
+ }
94
+ /**
95
+ * Get human-readable risk level from score.
96
+ */
97
+ export function getSlopRiskLevel(score) {
98
+ if (score <= 3)
99
+ return 'low';
100
+ if (score <= 6)
101
+ return 'medium';
102
+ return 'high';
103
+ }
104
+ //# sourceMappingURL=prompt-enhancer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-enhancer.js","sourceRoot":"","sources":["../../src/utils/prompt-enhancer.ts"],"names":[],"mappings":"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"}