@aibloom/core 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +16 -0
  2. package/dist/design-docs/ConflictDetector.d.ts +21 -0
  3. package/dist/design-docs/ConflictDetector.d.ts.map +1 -0
  4. package/dist/design-docs/ConflictDetector.js +221 -0
  5. package/dist/design-docs/ConflictDetector.js.map +1 -0
  6. package/dist/design-docs/DesignDocParser.d.ts +17 -0
  7. package/dist/design-docs/DesignDocParser.d.ts.map +1 -0
  8. package/dist/design-docs/DesignDocParser.js +112 -0
  9. package/dist/design-docs/DesignDocParser.js.map +1 -0
  10. package/dist/design-docs/DesignSystemSynthesizer.d.ts +9 -0
  11. package/dist/design-docs/DesignSystemSynthesizer.d.ts.map +1 -0
  12. package/dist/design-docs/DesignSystemSynthesizer.js +141 -0
  13. package/dist/design-docs/DesignSystemSynthesizer.js.map +1 -0
  14. package/dist/design-docs/FusionOptionGenerator.d.ts +11 -0
  15. package/dist/design-docs/FusionOptionGenerator.d.ts.map +1 -0
  16. package/dist/design-docs/FusionOptionGenerator.js +157 -0
  17. package/dist/design-docs/FusionOptionGenerator.js.map +1 -0
  18. package/dist/design-docs/StyleFingerprintExtractor.d.ts +32 -0
  19. package/dist/design-docs/StyleFingerprintExtractor.d.ts.map +1 -0
  20. package/dist/design-docs/StyleFingerprintExtractor.js +365 -0
  21. package/dist/design-docs/StyleFingerprintExtractor.js.map +1 -0
  22. package/dist/design-docs/TokenNormalizer.d.ts +13 -0
  23. package/dist/design-docs/TokenNormalizer.d.ts.map +1 -0
  24. package/dist/design-docs/TokenNormalizer.js +97 -0
  25. package/dist/design-docs/TokenNormalizer.js.map +1 -0
  26. package/dist/errors.d.ts +7 -0
  27. package/dist/errors.d.ts.map +1 -0
  28. package/dist/errors.js +11 -0
  29. package/dist/errors.js.map +1 -0
  30. package/dist/framework/FrameworkAdapter.d.ts +10 -0
  31. package/dist/framework/FrameworkAdapter.d.ts.map +1 -0
  32. package/dist/framework/FrameworkAdapter.js +2 -0
  33. package/dist/framework/FrameworkAdapter.js.map +1 -0
  34. package/dist/framework/package.d.ts +8 -0
  35. package/dist/framework/package.d.ts.map +1 -0
  36. package/dist/framework/package.js +32 -0
  37. package/dist/framework/package.js.map +1 -0
  38. package/dist/index.d.ts +15 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +15 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/json.d.ts +5 -0
  43. package/dist/json.d.ts.map +1 -0
  44. package/dist/json.js +43 -0
  45. package/dist/json.js.map +1 -0
  46. package/dist/safety/FileChangeApplier.d.ts +8 -0
  47. package/dist/safety/FileChangeApplier.d.ts.map +1 -0
  48. package/dist/safety/FileChangeApplier.js +73 -0
  49. package/dist/safety/FileChangeApplier.js.map +1 -0
  50. package/dist/state/ProjectStateStore.d.ts +16 -0
  51. package/dist/state/ProjectStateStore.d.ts.map +1 -0
  52. package/dist/state/ProjectStateStore.js +164 -0
  53. package/dist/state/ProjectStateStore.js.map +1 -0
  54. package/dist/state/RunRecordStore.d.ts +10 -0
  55. package/dist/state/RunRecordStore.d.ts.map +1 -0
  56. package/dist/state/RunRecordStore.js +39 -0
  57. package/dist/state/RunRecordStore.js.map +1 -0
  58. package/dist/tasks/TaskStore.d.ts +12 -0
  59. package/dist/tasks/TaskStore.d.ts.map +1 -0
  60. package/dist/tasks/TaskStore.js +48 -0
  61. package/dist/tasks/TaskStore.js.map +1 -0
  62. package/package.json +24 -0
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Generates 3-5 user-selectable fusion options when multiple design references
3
+ * have conflicts. Supports: primary-accent, page-type-split, layered-fusion,
4
+ * contextual-fusion, new-derived-system.
5
+ */
6
+ export class FusionOptionGenerator {
7
+ generate(fingerprints, conflictReport) {
8
+ const options = [];
9
+ const [a, b] = fingerprints;
10
+ if (!a || !b)
11
+ return options;
12
+ const labelA = a.name;
13
+ const labelB = b.name;
14
+ // 1. Primary + Accent (A primary)
15
+ options.push(this.buildOption({
16
+ id: "A",
17
+ label: `${labelA} primary + ${labelB} accent`,
18
+ strategy: "primary-plus-accent",
19
+ description: `Use ${labelA} as the primary design system. Borrow only the accent color and select decorative elements from ${labelB}.`,
20
+ primaryReference: a.id,
21
+ secondaryReferences: [b.id],
22
+ adoptedRules: [
23
+ `Full ${labelA} design system (canvas, typography, radius, layout)`,
24
+ `${labelB} accent color for CTAs`,
25
+ ],
26
+ rejectedRules: [
27
+ `${labelB} display typography`,
28
+ `${labelB} canvas and surface rules`,
29
+ `${labelB} radius system`,
30
+ ],
31
+ risks: [
32
+ `The ${labelB} accent may feel out of place against the ${labelA} backdrop.`,
33
+ ],
34
+ recommendedFor: [
35
+ "Low-risk option",
36
+ `Teams that prefer ${labelA}'s design language`,
37
+ ],
38
+ }));
39
+ // 2. Primary + Accent (B primary)
40
+ options.push(this.buildOption({
41
+ id: "B",
42
+ label: `${labelB} primary + ${labelA} accent`,
43
+ strategy: "primary-plus-accent",
44
+ description: `Use ${labelB} as the primary design system. Borrow only layout organization and data display patterns from ${labelA}.`,
45
+ primaryReference: b.id,
46
+ secondaryReferences: [a.id],
47
+ adoptedRules: [
48
+ `Full ${labelB} design system (canvas, typography, radius, layout)`,
49
+ `${labelA} dashboard card organization and data display patterns`,
50
+ ],
51
+ rejectedRules: [
52
+ `${labelA} display typography`,
53
+ `${labelA} canvas and surface rules`,
54
+ `${labelA} radius system`,
55
+ ],
56
+ risks: [
57
+ `${labelA}'s calm data-focused approach may clash with ${labelB}'s bold visual language.`,
58
+ ],
59
+ recommendedFor: [
60
+ `Teams that prefer ${labelB}'s design language`,
61
+ "Crypto, developer infra, brand landing pages",
62
+ ],
63
+ }));
64
+ // 3. Page-type split
65
+ if (fingerprints.length === 2) {
66
+ options.push(this.buildOption({
67
+ id: "C",
68
+ label: `Page-type split: Marketing = ${labelB}, Product = ${labelA}`,
69
+ strategy: "page-type-split",
70
+ description: `Marketing/landing pages use ${labelB}'s bold, editorial style. Product dashboard and app pages use ${labelA}'s calm, data-focused system.`,
71
+ primaryReference: undefined,
72
+ secondaryReferences: [],
73
+ adoptedRules: [
74
+ `Landing/hero: ${labelB} typography, ${labelB} canvas, ${labelB} accent`,
75
+ `Dashboard/app: ${labelA} typography, ${labelA} cards, ${labelA} layout`,
76
+ `Shared: CTA accent color, spacing scale, motion principles`,
77
+ ],
78
+ rejectedRules: [
79
+ `${labelB} display typography on product pages`,
80
+ `${labelA} canvas on marketing pages`,
81
+ ],
82
+ risks: [
83
+ "Pages may feel like two different products without shared core tokens.",
84
+ "Need explicit shared rules: text colors, spacing, CTA, motion.",
85
+ ],
86
+ recommendedFor: [
87
+ "Products with both marketing and dashboard/app pages",
88
+ "AI tools, SaaS platforms, developer tools",
89
+ ],
90
+ }));
91
+ }
92
+ // 4. Layered fusion
93
+ options.push(this.buildOption({
94
+ id: "D",
95
+ label: `Layered fusion: Type from ${labelA}, Color from ${labelB}`,
96
+ strategy: "layered-fusion",
97
+ description: `Typography system from ${labelA}, color palette from ${labelB}, components drawn from both.`,
98
+ primaryReference: undefined,
99
+ secondaryReferences: [],
100
+ adoptedRules: [
101
+ `Typography: ${labelA} display/body system`,
102
+ `Color: ${labelB} canvas + accent palette`,
103
+ `Components: best-fit from each reference`,
104
+ ],
105
+ rejectedRules: [],
106
+ risks: [
107
+ `Typography and color from different systems may not naturally harmonize.`,
108
+ "Requires careful design review to verify coherence.",
109
+ ],
110
+ recommendedFor: [
111
+ "When the typography of one reference and color of another are the best aspects.",
112
+ ],
113
+ }));
114
+ // 5. New derived system (if strong conflicts)
115
+ if (conflictReport.compatibilityScore < 60 || conflictReport.fusionRisk === "high") {
116
+ options.push(this.buildOption({
117
+ id: "E",
118
+ label: `New derived system from ${labelA} + ${labelB}`,
119
+ strategy: "new-derived-system",
120
+ description: `Extract the shared design DNA from both references and create a third, independent design system. Retains ${labelA}'s data clarity and ${labelB}'s brand energy.`,
121
+ primaryReference: undefined,
122
+ secondaryReferences: [],
123
+ adoptedRules: [
124
+ `Extracted DNA: data clarity (${labelA}), brand confidence (${labelB})`,
125
+ "New color system derived from shared hues",
126
+ "New typography system balancing readability and impact",
127
+ "New component library synthesizing best elements",
128
+ ],
129
+ rejectedRules: [],
130
+ risks: [
131
+ "Highest effort — requires a full design system from scratch.",
132
+ "Risk of losing the distinctive character of both references.",
133
+ ],
134
+ recommendedFor: [
135
+ "When neither reference should dominate",
136
+ "When a fresh brand identity is desired",
137
+ ],
138
+ }));
139
+ }
140
+ return options;
141
+ }
142
+ buildOption(input) {
143
+ return {
144
+ id: input.id,
145
+ label: input.label,
146
+ strategy: input.strategy,
147
+ description: input.description,
148
+ primaryReference: input.primaryReference,
149
+ secondaryReferences: input.secondaryReferences,
150
+ adoptedRules: input.adoptedRules,
151
+ rejectedRules: input.rejectedRules,
152
+ risks: input.risks,
153
+ recommendedFor: input.recommendedFor,
154
+ };
155
+ }
156
+ }
157
+ //# sourceMappingURL=FusionOptionGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FusionOptionGenerator.js","sourceRoot":"","sources":["../../src/design-docs/FusionOptionGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { type DesignReferenceDocument, type StyleFingerprint } from "@aibloom/schemas";
2
+ /**
3
+ * Extracts a structured StyleFingerprint from a parsed DesignReferenceDocument.
4
+ * Uses heuristics to detect colors, typography rules, spacing, shape language,
5
+ * component patterns, and anti-patterns from the markdown content.
6
+ */
7
+ export declare class StyleFingerprintExtractor {
8
+ extract(doc: DesignReferenceDocument): StyleFingerprint;
9
+ private extractTheme;
10
+ private extractStyleDna;
11
+ private extractPersonality;
12
+ private extractVisualMetaphor;
13
+ private extractProductFit;
14
+ private extractColorSystem;
15
+ private extractTypography;
16
+ private extractFamily;
17
+ private extractSubstitutes;
18
+ private extractWeights;
19
+ private extractSizes;
20
+ private extractTone;
21
+ private extractSpacing;
22
+ private extractShapeLanguage;
23
+ private extractLayout;
24
+ private extractComponents;
25
+ private extractImagery;
26
+ private extractMotion;
27
+ private extractAntiPatterns;
28
+ private findSection;
29
+ private extractListFromSection;
30
+ private extractFirstMatch;
31
+ }
32
+ //# sourceMappingURL=StyleFingerprintExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StyleFingerprintExtractor.d.ts","sourceRoot":"","sources":["../../src/design-docs/StyleFingerprintExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,uBAAuB,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEvG;;;;GAIG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,GAAG,EAAE,uBAAuB,GAAG,gBAAgB;IA8BvD,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,kBAAkB;IAwB1B,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,kBAAkB;IAoD1B,OAAO,CAAC,iBAAiB;IAoCzB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,iBAAiB;IAqBzB,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,sBAAsB;IAc9B,OAAO,CAAC,iBAAiB;CAI1B"}
@@ -0,0 +1,365 @@
1
+ import { SCHEMA_VERSION } from "@aibloom/schemas";
2
+ /**
3
+ * Extracts a structured StyleFingerprint from a parsed DesignReferenceDocument.
4
+ * Uses heuristics to detect colors, typography rules, spacing, shape language,
5
+ * component patterns, and anti-patterns from the markdown content.
6
+ */
7
+ export class StyleFingerprintExtractor {
8
+ extract(doc) {
9
+ const allContent = doc.sections.map((s) => s.content).join("\n");
10
+ const allTables = doc.sections.flatMap((s) => s.tables ?? []);
11
+ return {
12
+ schemaVersion: SCHEMA_VERSION,
13
+ id: doc.id,
14
+ name: doc.name,
15
+ theme: this.extractTheme(allContent),
16
+ styleSummary: this.extractStyleDna(doc),
17
+ personality: this.extractPersonality(allContent),
18
+ visualMetaphor: this.extractVisualMetaphor(allContent),
19
+ productFit: this.extractProductFit(allContent),
20
+ productMisfit: [],
21
+ colorSystem: this.extractColorSystem(allTables, allContent),
22
+ typography: this.extractTypography(doc),
23
+ spacing: this.extractSpacing(allContent),
24
+ shapeLanguage: this.extractShapeLanguage(allContent),
25
+ layoutLanguage: this.extractLayout(allContent),
26
+ componentLanguage: this.extractComponents(doc),
27
+ imagery: this.extractImagery(doc),
28
+ motion: this.extractMotion(allContent),
29
+ hardConstraints: this.extractListFromSection(doc, /constraint|hard/i, allContent),
30
+ antiPatterns: this.extractAntiPatterns(doc),
31
+ rawEvidence: [
32
+ { sourceId: doc.id, section: "full", quote: doc.sections[0]?.content.slice(0, 200) ?? "" },
33
+ ],
34
+ };
35
+ }
36
+ extractTheme(content) {
37
+ if (/dark\s*(mode|theme)/i.test(content))
38
+ return "dark";
39
+ if (/adaptive/i.test(content))
40
+ return "adaptive";
41
+ if (/light\s*(theme|mode)/i.test(content))
42
+ return "light";
43
+ // Infer from canvas colors
44
+ if (/#fff|#ffffff|white|#f[78]/i.test(content))
45
+ return "light";
46
+ if (/#000|#1[1-9a-f]/i.test(content))
47
+ return "dark";
48
+ return "unknown";
49
+ }
50
+ extractStyleDna(doc) {
51
+ const dnaSection = doc.sections.find((s) => /style\s*dna|one.?line/i.test(s.heading));
52
+ if (dnaSection)
53
+ return dnaSection.content.trim().split("\n")[0] ?? "";
54
+ // Combine personality + visual metaphor
55
+ const personality = this.extractPersonality(doc.sections.map((s) => s.content).join("\n"));
56
+ const metaphor = this.extractVisualMetaphor(doc.sections.map((s) => s.content).join("\n"));
57
+ return [metaphor, ...personality].filter(Boolean).join(". ") || doc.name;
58
+ }
59
+ extractPersonality(content) {
60
+ const traits = [];
61
+ const personalityKeywords = [
62
+ "calm", "editorial", "confident", "data-focused",
63
+ "bold", "brutalist", "raw", "high-contrast",
64
+ "clean", "minimal", "technical", "playful",
65
+ "corporate", "luxury", "warm", "cold",
66
+ ];
67
+ for (const kw of personalityKeywords) {
68
+ if (content.toLowerCase().includes(kw)) {
69
+ traits.push(kw);
70
+ }
71
+ }
72
+ // Also look for personality in sections
73
+ const match = content.match(/personality[:\s]*([^\n]+)/i);
74
+ if (match) {
75
+ const words = match[1].split(/[,;]/).map((w) => w.trim()).filter(Boolean);
76
+ for (const w of words) {
77
+ if (!traits.includes(w))
78
+ traits.push(w);
79
+ }
80
+ }
81
+ return traits.length > 0 ? traits : ["unknown"];
82
+ }
83
+ extractVisualMetaphor(content) {
84
+ const match = content.match(/(?:visual|design)\s*metaphor[:\s]+([^\n]+)/i);
85
+ return match ? match[1].trim() : undefined;
86
+ }
87
+ extractProductFit(content) {
88
+ const fits = [];
89
+ const productTypes = [
90
+ "SaaS dashboard", "Analytics platform", "Crypto",
91
+ "Developer tool", "Marketing site", "E-commerce",
92
+ "Admin panel", "Portfolio", "Documentation",
93
+ ];
94
+ for (const pt of productTypes) {
95
+ if (content.toLowerCase().includes(pt.toLowerCase())) {
96
+ fits.push(pt);
97
+ }
98
+ }
99
+ return fits;
100
+ }
101
+ extractColorSystem(tables, content) {
102
+ const system = {
103
+ canvas: [],
104
+ surface: [],
105
+ text: [],
106
+ mutedText: [],
107
+ accent: [],
108
+ decorative: [],
109
+ saturationLevel: "medium",
110
+ };
111
+ // Parse color tables
112
+ for (const table of tables) {
113
+ const rows = table.split("\n").filter((r) => r.includes("|"));
114
+ for (const row of rows) {
115
+ const cells = row.split("|").map((c) => c.trim()).filter(Boolean);
116
+ if (cells.length < 2)
117
+ continue;
118
+ const hexMatch = cells.find((c) => /^#[0-9a-fA-F]{3,8}$/.test(c));
119
+ if (!hexMatch)
120
+ continue;
121
+ const hex = hexMatch;
122
+ const label = cells[0].toLowerCase();
123
+ if (/canvas|page|background/i.test(label))
124
+ system.canvas.push(hex);
125
+ else if (/surface|card.*bg|elevated/i.test(label))
126
+ system.surface.push(hex);
127
+ else if (/text.*primary|heading|body/i.test(label) && !/muted/i.test(label))
128
+ system.text.push(hex);
129
+ else if (/muted|subtle|secondary/i.test(label))
130
+ system.mutedText.push(hex);
131
+ else if (/accent|primary|cta/i.test(label))
132
+ system.accent.push(hex);
133
+ else if (/decorative|highlight|alt/i.test(label))
134
+ system.decorative.push(hex);
135
+ else if (/danger|error|destruct/i.test(label)) {
136
+ system.danger = system.danger ?? [];
137
+ system.danger.push(hex);
138
+ }
139
+ else if (/success|green/i.test(label)) {
140
+ system.success = system.success ?? [];
141
+ system.success.push(hex);
142
+ }
143
+ }
144
+ }
145
+ // Infer saturation from keywords
146
+ const satMatch = content.match(/saturation[^:]*[:\s]*(\w+)/i);
147
+ if (satMatch) {
148
+ const s = satMatch[1].toLowerCase();
149
+ if (["low", "medium", "high", "mixed"].includes(s)) {
150
+ system.saturationLevel = s;
151
+ }
152
+ }
153
+ return system;
154
+ }
155
+ extractTypography(doc) {
156
+ const content = doc.sections.map((s) => s.content).join("\n");
157
+ const rules = [];
158
+ const displayFamily = this.extractFamily(content, /display[:\s]+.*family[:\s]*([^\n,]+)/i)
159
+ ?? this.extractFamily(content, /display/i);
160
+ const bodyFamily = this.extractFamily(content, /body[:\s]+.*family[:\s]*([^\n,]+)/i)
161
+ ?? this.extractFamily(content, /body/i);
162
+ const monoFamily = this.extractFamily(content, /mono/i);
163
+ return {
164
+ display: displayFamily ? {
165
+ family: displayFamily,
166
+ substitutes: this.extractSubstitutes(content, displayFamily),
167
+ weights: this.extractWeights(content, /display/i),
168
+ sizes: this.extractSizes(content, /display|headline/i),
169
+ tone: this.extractTone(content, /display/i),
170
+ } : undefined,
171
+ body: bodyFamily ? {
172
+ family: bodyFamily,
173
+ substitutes: this.extractSubstitutes(content, bodyFamily),
174
+ weights: this.extractWeights(content, /body/i),
175
+ sizes: this.extractSizes(content, /body|ui/i),
176
+ tone: this.extractTone(content, /body/i),
177
+ } : undefined,
178
+ mono: monoFamily ? {
179
+ family: monoFamily,
180
+ substitutes: [],
181
+ weights: [],
182
+ sizes: [],
183
+ tone: "",
184
+ } : undefined,
185
+ rules: rules.length > 0 ? rules : this.extractListFromSection(doc, /typography|font/i, content),
186
+ };
187
+ }
188
+ extractFamily(content, context) {
189
+ const lines = content.split("\n");
190
+ for (let i = 0; i < lines.length; i++) {
191
+ if (context.test(lines[i])) {
192
+ // Check for family pattern in nearby lines
193
+ for (let j = i; j < Math.min(i + 5, lines.length); j++) {
194
+ const fm = lines[j].match(/(?:family|font)[:\s]*"?([A-Z][A-Za-z\s]+)"?/i);
195
+ if (fm)
196
+ return fm[1].trim();
197
+ }
198
+ }
199
+ }
200
+ return undefined;
201
+ }
202
+ extractSubstitutes(content, _family) {
203
+ const subMatch = content.match(/substitut[^:]*[:\s]*([^\n]+)/i);
204
+ if (subMatch) {
205
+ return subMatch[1].split(/[,;]/).map((s) => s.trim()).filter(Boolean);
206
+ }
207
+ return [];
208
+ }
209
+ extractWeights(content, _context) {
210
+ const match = content.match(/weights?[:\s]*([^\n]+)/i);
211
+ if (match)
212
+ return match[1].split(/[,;\s]+/).filter((w) => /^\d+$/.test(w));
213
+ return [];
214
+ }
215
+ extractSizes(content, _context) {
216
+ const sizeMatch = content.match(/sizes?[:\s]*([^\n]+)/i);
217
+ if (sizeMatch) {
218
+ return sizeMatch[1].split(/[,;]/).map((s) => s.trim()).filter((s) => /\d/.test(s));
219
+ }
220
+ return [];
221
+ }
222
+ extractTone(content, _context) {
223
+ const match = content.match(/tone[:\s]*([^\n]+)/i);
224
+ return match ? match[1].trim() : "";
225
+ }
226
+ extractSpacing(content) {
227
+ const baseMatch = content.match(/base\s*unit[:\s]*(\d+px)/i);
228
+ const scaleMatch = content.match(/scale[:\s]*([^\n]+)/i);
229
+ const scale = scaleMatch
230
+ ? scaleMatch[1].split(/[,;]/).map((s) => s.trim()).filter((s) => /\d/.test(s))
231
+ : [];
232
+ let density = "unknown";
233
+ if (/comfortable|generous|spacious/i.test(content))
234
+ density = "comfortable";
235
+ if (/compact|tight|dense/i.test(content))
236
+ density = "compact";
237
+ if (/mixed/i.test(content))
238
+ density = "mixed";
239
+ return {
240
+ baseUnit: baseMatch ? baseMatch[1] : undefined,
241
+ scale,
242
+ density,
243
+ };
244
+ }
245
+ extractShapeLanguage(content) {
246
+ const cardRadius = this.extractFirstMatch(content, /card\s*radius[:\s]*(\d+px)/i);
247
+ const buttonRadius = this.extractFirstMatch(content, /button\s*radius[:\s]*(\d+px)/i);
248
+ const inputRadius = this.extractFirstMatch(content, /input\s*radius[:\s]*(\d+px)/i);
249
+ const borderWeight = this.extractFirstMatch(content, /border\s*(?:weight|width)[:\s]*(\d+px)/i);
250
+ let shadowStyle = "mixed";
251
+ if (/no\s*(shadow|elevation)|shadowless|flat\s*(design|print|aesthetic)/i.test(content))
252
+ shadowStyle = "none";
253
+ if (/soft\s*(layered|shadow)/i.test(content))
254
+ shadowStyle = "soft";
255
+ if (/subtle\s*(shadow)/i.test(content))
256
+ shadowStyle = "subtle";
257
+ if (/dramatic/i.test(content))
258
+ shadowStyle = "dramatic";
259
+ return { cardRadius, buttonRadius, inputRadius, borderWeight, shadowStyle };
260
+ }
261
+ extractLayout(content) {
262
+ return {
263
+ maxWidth: this.extractFirstMatch(content, /max\s*width[:\s]*(\d+px)/i),
264
+ sectionGap: this.extractFirstMatch(content, /section\s*gap[:\s]*(\d+px)/i),
265
+ heroPattern: this.extractFirstMatch(content, /hero\s*pattern[:\s]*([^\n]+)/i),
266
+ gridPattern: this.extractFirstMatch(content, /grid[:\s]*([^\n]+)/i),
267
+ density: /comfortable|spacious/i.test(content) ? "comfortable" : /compact/i.test(content) ? "compact" : undefined,
268
+ };
269
+ }
270
+ extractComponents(doc) {
271
+ const components = [];
272
+ const content = doc.sections.map((s) => s.content).join("\n");
273
+ // Look for button patterns
274
+ const btnMatch = content.match(/primary[:\s]*(filled[^\n]+)/i);
275
+ if (btnMatch)
276
+ components.push(btnMatch[1].trim());
277
+ // Look for card patterns
278
+ const cardMatch = content.match(/card[:\s]*([^\n]+)/gi);
279
+ if (cardMatch) {
280
+ for (const c of cardMatch)
281
+ components.push(c.trim());
282
+ }
283
+ // Look for navigation patterns
284
+ if (/sidebar/i.test(content))
285
+ components.push("sidebar navigation");
286
+ if (/top\s*nav/i.test(content))
287
+ components.push("top navigation");
288
+ return components.length > 0 ? components : ["standard components"];
289
+ }
290
+ extractImagery(doc) {
291
+ const content = doc.sections.map((s) => s.content).join("\n");
292
+ const allowed = [];
293
+ const forbidden = [];
294
+ const allowedSection = this.findSection(doc, /imagery|image/i);
295
+ if (allowedSection) {
296
+ const text = allowedSection.content;
297
+ const allowMatch = text.match(/allow[^:]*[:\s]*([^\n]+)/i);
298
+ if (allowMatch) {
299
+ allowed.push(...allowMatch[1].split(/[,;]/).map((s) => s.trim()).filter(Boolean));
300
+ }
301
+ const forbidMatch = text.match(/forbid[^:]*[:\s]*([^\n]+)/i);
302
+ if (forbidMatch) {
303
+ forbidden.push(...forbidMatch[1].split(/[,;]/).map((s) => s.trim()).filter(Boolean));
304
+ }
305
+ }
306
+ // Also check for photography mentions
307
+ if (/photography/i.test(content) && /no|forbidden|don't/i.test(content)) {
308
+ forbidden.push("photography");
309
+ }
310
+ return { allowed, forbidden };
311
+ }
312
+ extractMotion(content) {
313
+ const explicitRules = [];
314
+ const ruleLines = content.match(/explicit\s*rules?[:\s]*([^\n]+(?:\n[^\n#]+)*)/i);
315
+ if (ruleLines) {
316
+ explicitRules.push(...ruleLines[1].split(/\n-|\n•/).map((s) => s.trim()).filter(Boolean));
317
+ }
318
+ let inferredTone = "unknown";
319
+ if (/subtle|minimal|calm|low.?amplitude/i.test(content))
320
+ inferredTone = "subtle";
321
+ if (/bold|confident|punchy|visible/i.test(content))
322
+ inferredTone = "bold";
323
+ if (/none|no.*(motion|animate)/i.test(content))
324
+ inferredTone = "static";
325
+ return { explicitRules, inferredTone };
326
+ }
327
+ extractAntiPatterns(doc) {
328
+ const content = doc.sections.map((s) => s.content).join("\n");
329
+ const antiPatterns = this.extractListFromSection(doc, /anti.?pattern|don['']?t/i, content);
330
+ // Also check for don't patterns
331
+ const dontSection = this.findSection(doc, /don['']?t|forbidden/i);
332
+ if (dontSection) {
333
+ const lines = dontSection.content.split("\n");
334
+ for (const line of lines) {
335
+ const trimmed = line.trim().replace(/^[-*•]\s*/, "");
336
+ if (trimmed && !trimmed.startsWith("#")) {
337
+ antiPatterns.push(trimmed);
338
+ }
339
+ }
340
+ }
341
+ return antiPatterns;
342
+ }
343
+ // ── Helpers ──
344
+ findSection(doc, pattern) {
345
+ return doc.sections.find((s) => pattern.test(s.heading));
346
+ }
347
+ extractListFromSection(doc, headingPattern, fallbackContent) {
348
+ const section = this.findSection(doc, headingPattern);
349
+ const content = section?.content ?? fallbackContent;
350
+ const items = [];
351
+ const lines = content.split("\n");
352
+ for (const line of lines) {
353
+ const trimmed = line.trim().replace(/^[-*•]\s*/, "");
354
+ if (trimmed && !trimmed.startsWith("#") && trimmed.length > 3) {
355
+ items.push(trimmed);
356
+ }
357
+ }
358
+ return items;
359
+ }
360
+ extractFirstMatch(content, pattern) {
361
+ const match = content.match(pattern);
362
+ return match ? match[1] : undefined;
363
+ }
364
+ }
365
+ //# sourceMappingURL=StyleFingerprintExtractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StyleFingerprintExtractor.js","sourceRoot":"","sources":["../../src/design-docs/StyleFingerprintExtractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { StyleFingerprint, NormalizedToken } from "@aibloom/schemas";
2
+ /**
3
+ * Normalizes tokens across multiple StyleFingerprints for comparison.
4
+ * Merges synonymous color names, unifies spacing/radius units, detects conflicts.
5
+ */
6
+ export declare class TokenNormalizer {
7
+ normalize(fingerprints: StyleFingerprint[]): NormalizedToken[];
8
+ private makeToken;
9
+ private standardize;
10
+ /** Detect conflicts between normalized tokens */
11
+ detectConflicts(tokens: NormalizedToken[]): NormalizedToken[];
12
+ }
13
+ //# sourceMappingURL=TokenNormalizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenNormalizer.d.ts","sourceRoot":"","sources":["../../src/design-docs/TokenNormalizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE1E;;;GAGG;AACH,qBAAa,eAAe;IAC1B,SAAS,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,eAAe,EAAE;IAoD9D,OAAO,CAAC,SAAS;IAejB,OAAO,CAAC,WAAW;IAenB,iDAAiD;IACjD,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE;CAqB9D"}