design-brain-memory 0.9.3 → 0.9.4

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 (125) hide show
  1. package/README.md +273 -0
  2. package/dist/agentBrowser.d.ts +0 -1
  3. package/dist/agentBrowser.js +13 -31
  4. package/dist/agentBrowser.js.map +1 -1
  5. package/dist/aggregate.d.ts +9 -0
  6. package/dist/aggregate.js +53 -0
  7. package/dist/aggregate.js.map +1 -0
  8. package/dist/batch.d.ts +16 -0
  9. package/dist/batch.js +44 -0
  10. package/dist/batch.js.map +1 -0
  11. package/dist/cli.js +250 -216
  12. package/dist/cli.js.map +1 -1
  13. package/dist/commands.d.ts +60 -1
  14. package/dist/commands.js +323 -10
  15. package/dist/commands.js.map +1 -1
  16. package/dist/compare.d.ts +33 -0
  17. package/dist/compare.js +83 -0
  18. package/dist/compare.js.map +1 -0
  19. package/dist/componentGraph.d.ts +22 -0
  20. package/dist/componentGraph.js +106 -0
  21. package/dist/componentGraph.js.map +1 -0
  22. package/dist/contextLayer.d.ts +12 -0
  23. package/dist/contextLayer.js +263 -0
  24. package/dist/contextLayer.js.map +1 -0
  25. package/dist/cssInJs.d.ts +9 -0
  26. package/dist/cssInJs.js +124 -0
  27. package/dist/cssInJs.js.map +1 -0
  28. package/dist/extractFromUrl.d.ts +8 -0
  29. package/dist/extractFromUrl.js +508 -414
  30. package/dist/extractFromUrl.js.map +1 -1
  31. package/dist/graphView.d.ts +21 -0
  32. package/dist/graphView.js +492 -0
  33. package/dist/graphView.js.map +1 -0
  34. package/dist/index.d.ts +26 -11
  35. package/dist/index.js +17 -10
  36. package/dist/index.js.map +1 -1
  37. package/dist/knowledge.d.ts +20 -0
  38. package/dist/knowledge.js +208 -0
  39. package/dist/knowledge.js.map +1 -0
  40. package/dist/liveView.d.ts +15 -0
  41. package/dist/liveView.js +475 -0
  42. package/dist/liveView.js.map +1 -0
  43. package/dist/llm.js +1 -9
  44. package/dist/llm.js.map +1 -1
  45. package/dist/moodboard.d.ts +3 -0
  46. package/dist/moodboard.js +152 -0
  47. package/dist/moodboard.js.map +1 -0
  48. package/dist/persona.d.ts +2 -2
  49. package/dist/persona.js +82 -210
  50. package/dist/persona.js.map +1 -1
  51. package/dist/query.js +1 -6
  52. package/dist/query.js.map +1 -1
  53. package/dist/render.d.ts +2 -10
  54. package/dist/render.js +80 -175
  55. package/dist/render.js.map +1 -1
  56. package/dist/reviewChecklist.d.ts +17 -0
  57. package/dist/reviewChecklist.js +126 -0
  58. package/dist/reviewChecklist.js.map +1 -0
  59. package/dist/scan.d.ts +19 -7
  60. package/dist/scan.js +132 -374
  61. package/dist/scan.js.map +1 -1
  62. package/dist/scorecard.d.ts +53 -0
  63. package/dist/scorecard.js +325 -0
  64. package/dist/scorecard.js.map +1 -0
  65. package/dist/skillPrompt.d.ts +1 -3
  66. package/dist/skillPrompt.js +22 -148
  67. package/dist/skillPrompt.js.map +1 -1
  68. package/dist/store.d.ts +2 -2
  69. package/dist/store.js +7 -9
  70. package/dist/store.js.map +1 -1
  71. package/dist/styleDictionary.d.ts +16 -0
  72. package/dist/styleDictionary.js +89 -0
  73. package/dist/styleDictionary.js.map +1 -0
  74. package/dist/svg.d.ts +5 -0
  75. package/dist/svg.js +162 -0
  76. package/dist/svg.js.map +1 -0
  77. package/dist/systemDiff.d.ts +28 -0
  78. package/dist/systemDiff.js +107 -0
  79. package/dist/systemDiff.js.map +1 -0
  80. package/dist/tailwind.d.ts +2 -0
  81. package/dist/tailwind.js +122 -0
  82. package/dist/tailwind.js.map +1 -0
  83. package/dist/taste.d.ts +3 -2
  84. package/dist/taste.js +349 -536
  85. package/dist/taste.js.map +1 -1
  86. package/dist/tasteRenderer.d.ts +2 -3
  87. package/dist/tasteRenderer.js +123 -119
  88. package/dist/tasteRenderer.js.map +1 -1
  89. package/dist/tokenNaming.d.ts +5 -0
  90. package/dist/tokenNaming.js +229 -0
  91. package/dist/tokenNaming.js.map +1 -0
  92. package/dist/tokens.d.ts +17 -0
  93. package/dist/tokens.js +44 -0
  94. package/dist/tokens.js.map +1 -0
  95. package/dist/trends.d.ts +12 -0
  96. package/dist/trends.js +178 -0
  97. package/dist/trends.js.map +1 -0
  98. package/dist/types.d.ts +47 -101
  99. package/dist/wiki.d.ts +10 -0
  100. package/dist/wiki.js +346 -0
  101. package/dist/wiki.js.map +1 -0
  102. package/dist/writingStyle.d.ts +38 -0
  103. package/dist/writingStyle.js +224 -0
  104. package/dist/writingStyle.js.map +1 -0
  105. package/package.json +5 -4
  106. package/dist/classify.d.ts +0 -21
  107. package/dist/classify.js +0 -205
  108. package/dist/classify.js.map +0 -1
  109. package/dist/scanRenderer.d.ts +0 -2
  110. package/dist/scanRenderer.js +0 -155
  111. package/dist/scanRenderer.js.map +0 -1
  112. package/dist/tasteDiff.d.ts +0 -19
  113. package/dist/tasteDiff.js +0 -340
  114. package/dist/tasteDiff.js.map +0 -1
  115. package/dist/tasteGenerate.d.ts +0 -12
  116. package/dist/tasteGenerate.js +0 -140
  117. package/dist/tasteGenerate.js.map +0 -1
  118. package/dist/tasteRefine.d.ts +0 -13
  119. package/dist/tasteRefine.js +0 -351
  120. package/dist/tasteRefine.js.map +0 -1
  121. package/dist/theatrical.d.ts +0 -5
  122. package/dist/theatrical.js +0 -258
  123. package/dist/theatrical.js.map +0 -1
  124. package/skills/SKILL.md +0 -36
  125. package/skills/design-brain/SKILL.md +0 -77
@@ -1,351 +0,0 @@
1
- import { loadTasteProfile, saveTasteProfile } from './store.js';
2
- import { makeId, nowIso } from './util.js';
3
- function asAnimationToken(token) {
4
- return 'library' in token && 'motionIntent' in token;
5
- }
6
- function parseNumericValues(input) {
7
- if (!input) {
8
- return [];
9
- }
10
- return (input.match(/-?\d+(?:\.\d+)?/g) ?? [])
11
- .map((value) => Number.parseFloat(value))
12
- .filter((value) => Number.isFinite(value));
13
- }
14
- function hexToRgb(hex) {
15
- const clean = hex.replace('#', '').trim();
16
- if (!/^[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$/.test(clean)) {
17
- return null;
18
- }
19
- const full = clean.length === 3
20
- ? `${clean[0]}${clean[0]}${clean[1]}${clean[1]}${clean[2]}${clean[2]}`
21
- : clean;
22
- const r = Number.parseInt(full.slice(0, 2), 16);
23
- const g = Number.parseInt(full.slice(2, 4), 16);
24
- const b = Number.parseInt(full.slice(4, 6), 16);
25
- return { r, g, b };
26
- }
27
- function rgbToHsl(rgb) {
28
- const r = rgb.r / 255;
29
- const g = rgb.g / 255;
30
- const b = rgb.b / 255;
31
- const max = Math.max(r, g, b);
32
- const min = Math.min(r, g, b);
33
- const l = (max + min) / 2;
34
- if (max === min) {
35
- return { h: 0, s: 0, l };
36
- }
37
- const d = max - min;
38
- const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
39
- let h = 0;
40
- if (max === r) {
41
- h = ((g - b) / d + (g < b ? 6 : 0)) / 6;
42
- }
43
- else if (max === g) {
44
- h = ((b - r) / d + 2) / 6;
45
- }
46
- else {
47
- h = ((r - g) / d + 4) / 6;
48
- }
49
- return { h: h * 360, s, l };
50
- }
51
- function hslDistance(a, b) {
52
- const rgbA = hexToRgb(a);
53
- const rgbB = hexToRgb(b);
54
- if (!rgbA || !rgbB) {
55
- return 0;
56
- }
57
- const hslA = rgbToHsl(rgbA);
58
- const hslB = rgbToHsl(rgbB);
59
- const hueDelta = Math.min(Math.abs(hslA.h - hslB.h), 360 - Math.abs(hslA.h - hslB.h)) / 180;
60
- const satDelta = Math.abs(hslA.s - hslB.s);
61
- const lightDelta = Math.abs(hslA.l - hslB.l);
62
- return Math.round((hueDelta * 0.6 + satDelta * 0.2 + lightDelta * 0.2) * 100);
63
- }
64
- function sourceLabel(inspiration) {
65
- if (inspiration.url) {
66
- try {
67
- return new URL(inspiration.url).hostname;
68
- }
69
- catch {
70
- return inspiration.url;
71
- }
72
- }
73
- return inspiration.name;
74
- }
75
- function primaryFont(inspiration) {
76
- const byCount = [...inspiration.analysis.typography]
77
- .sort((a, b) => b.count - a.count);
78
- const token = byCount[0];
79
- return token?.fontFamily?.trim() || null;
80
- }
81
- function detectBaseUnit(inspiration) {
82
- const values = inspiration.analysis.components
83
- .flatMap((component) => [
84
- component.styles.padding,
85
- component.styles.margin,
86
- component.styles.gap,
87
- component.styles.rowGap,
88
- component.styles.columnGap,
89
- ])
90
- .flatMap(parseNumericValues)
91
- .filter((value) => value > 0);
92
- if (values.length === 0) {
93
- return null;
94
- }
95
- const aligned4 = values.filter((value) => value % 4 === 0).length;
96
- const aligned8 = values.filter((value) => value % 8 === 0).length;
97
- return aligned8 >= aligned4 ? 8 : 4;
98
- }
99
- function detectRadius(inspiration) {
100
- const radii = inspiration.analysis.components
101
- .flatMap((component) => parseNumericValues(component.styles.borderRadius))
102
- .filter((value) => value >= 0);
103
- if (radii.length === 0) {
104
- return null;
105
- }
106
- const rounded = radii.map((value) => Math.round(value));
107
- const counts = new Map();
108
- for (const value of rounded) {
109
- counts.set(value, (counts.get(value) ?? 0) + 1);
110
- }
111
- return [...counts.entries()].sort((a, b) => b[1] - a[1])[0]?.[0] ?? null;
112
- }
113
- function extractDurationMs(value) {
114
- const matches = value.match(/(\d+(?:\.\d+)?)\s*(ms|s)\b/gi) ?? [];
115
- return matches
116
- .map((match) => {
117
- const [, raw, unit] = match.match(/(\d+(?:\.\d+)?)\s*(ms|s)\b/i) ?? [];
118
- const num = Number.parseFloat(raw ?? '');
119
- if (!Number.isFinite(num)) {
120
- return null;
121
- }
122
- return unit?.toLowerCase() === 's' ? num * 1000 : num;
123
- })
124
- .filter((value) => value !== null);
125
- }
126
- function dominantDuration(inspiration) {
127
- const durations = inspiration.analysis.motion.flatMap((token) => {
128
- if (asAnimationToken(token)) {
129
- return token.timing ? [token.timing.duration] : [];
130
- }
131
- return [
132
- ...extractDurationMs(token.transition),
133
- ...extractDurationMs(token.animation),
134
- ];
135
- });
136
- if (durations.length === 0) {
137
- return null;
138
- }
139
- const rounded = durations.map((value) => Math.round(value / 10) * 10);
140
- const counts = new Map();
141
- for (const value of rounded) {
142
- counts.set(value, (counts.get(value) ?? 0) + 1);
143
- }
144
- return [...counts.entries()].sort((a, b) => b[1] - a[1])[0]?.[0] ?? null;
145
- }
146
- function hasSpread(values, threshold) {
147
- if (values.length < 2) {
148
- return false;
149
- }
150
- const min = Math.min(...values);
151
- const max = Math.max(...values);
152
- return max - min > threshold;
153
- }
154
- function toConflictOptionsBySource(entries) {
155
- return entries.map((entry) => `${entry.value} (from ${entry.source})`);
156
- }
157
- export function detectConflicts(inspirations) {
158
- if (inspirations.length < 2) {
159
- return [];
160
- }
161
- const conflicts = [];
162
- const topColors = inspirations
163
- .map((inspiration) => ({
164
- source: sourceLabel(inspiration),
165
- value: inspiration.analysis.colors[0]?.hex?.toUpperCase(),
166
- }))
167
- .filter((entry) => Boolean(entry.value));
168
- let hasColorConflict = false;
169
- for (let i = 0; i < topColors.length && !hasColorConflict; i += 1) {
170
- for (let j = i + 1; j < topColors.length; j += 1) {
171
- if (hslDistance(topColors[i].value, topColors[j].value) > 40) {
172
- hasColorConflict = true;
173
- break;
174
- }
175
- }
176
- }
177
- if (hasColorConflict) {
178
- conflicts.push({
179
- dimension: 'color',
180
- description: 'Your inspirations show different dominant colors',
181
- options: toConflictOptionsBySource(topColors.slice(0, 5)),
182
- resolved: false,
183
- });
184
- }
185
- const fontChoices = inspirations
186
- .map((inspiration) => ({
187
- source: sourceLabel(inspiration),
188
- value: primaryFont(inspiration),
189
- }))
190
- .filter((entry) => Boolean(entry.value));
191
- const uniqueFonts = new Set(fontChoices.map((entry) => entry.value.toLowerCase()));
192
- if (uniqueFonts.size > 1) {
193
- conflicts.push({
194
- dimension: 'typography',
195
- description: 'Different inspirations use different primary fonts',
196
- options: toConflictOptionsBySource(fontChoices.slice(0, 5)),
197
- resolved: false,
198
- });
199
- }
200
- const spacingChoices = inspirations
201
- .map((inspiration) => {
202
- const unit = detectBaseUnit(inspiration);
203
- return unit === null ? null : {
204
- label: `${unit}px (from ${sourceLabel(inspiration)})`,
205
- value: unit,
206
- };
207
- })
208
- .filter((entry) => entry !== null);
209
- const spacingValues = spacingChoices
210
- .map((entry) => entry.value)
211
- .filter((value) => typeof value === 'number');
212
- if (new Set(spacingValues).size > 1) {
213
- conflicts.push({
214
- dimension: 'spacing',
215
- description: 'Your inspirations suggest different spacing base units',
216
- options: spacingChoices.map((entry) => entry.label),
217
- resolved: false,
218
- });
219
- }
220
- const shapeChoices = inspirations
221
- .map((inspiration) => {
222
- const radius = detectRadius(inspiration);
223
- return radius === null ? null : {
224
- label: `${radius}px (from ${sourceLabel(inspiration)})`,
225
- value: radius,
226
- };
227
- })
228
- .filter((entry) => entry !== null);
229
- const radiusValues = shapeChoices
230
- .map((entry) => entry.value)
231
- .filter((value) => typeof value === 'number');
232
- if (hasSpread(radiusValues, 2)) {
233
- conflicts.push({
234
- dimension: 'component',
235
- description: 'Your inspirations show different corner radiuses',
236
- options: shapeChoices.map((entry) => entry.label),
237
- resolved: false,
238
- });
239
- }
240
- const motionChoices = inspirations
241
- .map((inspiration) => {
242
- const duration = dominantDuration(inspiration);
243
- return duration === null ? null : {
244
- label: `${Math.round(duration)}ms (from ${sourceLabel(inspiration)})`,
245
- value: duration,
246
- };
247
- })
248
- .filter((entry) => entry !== null);
249
- const durationValues = motionChoices
250
- .map((entry) => entry.value)
251
- .filter((value) => typeof value === 'number');
252
- if (hasSpread(durationValues, 100)) {
253
- conflicts.push({
254
- dimension: 'motion',
255
- description: 'Your inspirations suggest different motion tempos',
256
- options: motionChoices.map((entry) => entry.label),
257
- resolved: false,
258
- });
259
- }
260
- return conflicts;
261
- }
262
- export function nextClarifyingQuestion(profile) {
263
- const conflict = profile.conflicts.find((entry) => !entry.resolved);
264
- if (!conflict) {
265
- return null;
266
- }
267
- const numberedOptions = conflict.options
268
- .map((option, index) => ` ${index + 1}. ${option}`)
269
- .join('\n');
270
- return {
271
- conflict,
272
- options: conflict.options,
273
- question: `${conflict.description}:\n${numberedOptions}\nWhich do you prefer? [1/${conflict.options.length}/custom]:`,
274
- };
275
- }
276
- function normalizeDecisionDimension(dimension) {
277
- if (dimension === 'color' || dimension === 'typography' || dimension === 'spacing' || dimension === 'motion' || dimension === 'component' || dimension === 'layout') {
278
- return dimension;
279
- }
280
- return 'general';
281
- }
282
- function applyAnswerToProfile(profile, conflict, answer) {
283
- const trimmed = answer.trim();
284
- if (!trimmed) {
285
- return;
286
- }
287
- if (conflict.dimension === 'color') {
288
- const hex = trimmed.match(/#[0-9a-fA-F]{3}(?:[0-9a-fA-F]{3})?/)?.[0];
289
- if (hex && profile.color.palette.length > 0) {
290
- profile.color.palette[0] = { ...profile.color.palette[0], hex: hex.toUpperCase(), source: 'decision' };
291
- }
292
- }
293
- if (conflict.dimension === 'typography') {
294
- const font = trimmed
295
- .replace(/\(from.*?\)/i, '')
296
- .replace(/^\d+\.\s*/, '')
297
- .trim();
298
- if (font) {
299
- profile.typography.primaryFont = font;
300
- }
301
- }
302
- if (conflict.dimension === 'spacing') {
303
- const unit = trimmed.match(/\b(4|8)\s*px\b/i)?.[1];
304
- if (unit) {
305
- profile.spacing.baseUnit = Number.parseInt(unit, 10);
306
- }
307
- }
308
- if (conflict.dimension === 'motion') {
309
- const duration = trimmed.match(/(\d+(?:\.\d+)?)\s*(ms|s)\b/i);
310
- if (duration) {
311
- const value = Number.parseFloat(duration[1]);
312
- const unit = duration[2].toLowerCase();
313
- const durationMs = unit === 's' ? `${Math.round(value * 1000)}ms` : `${Math.round(value)}ms`;
314
- profile.motion.durations = [durationMs, ...profile.motion.durations.filter((d) => d !== durationMs)].slice(0, 6);
315
- }
316
- }
317
- if (conflict.dimension === 'component') {
318
- const radius = trimmed.match(/(\d+(?:\.\d+)?)\s*px\b/i);
319
- if (radius) {
320
- profile.components.borderRadius = `${Math.round(Number.parseFloat(radius[1]))}px`;
321
- }
322
- }
323
- }
324
- export async function applyDecision(options) {
325
- const profile = await loadTasteProfile(options.rootDir, options.projectId);
326
- if (!profile) {
327
- throw new Error(`Taste profile not found for project: ${options.projectId}`);
328
- }
329
- const conflict = profile.conflicts[options.conflictIndex];
330
- if (!conflict) {
331
- throw new Error(`Conflict index out of range: ${options.conflictIndex}`);
332
- }
333
- if (conflict.resolved) {
334
- throw new Error(`Conflict ${options.conflictIndex} is already resolved`);
335
- }
336
- const decision = {
337
- id: makeId('decision', `${profile.id}-${conflict.dimension}-${options.conflictIndex}`),
338
- question: conflict.description,
339
- answer: options.answer.trim(),
340
- dimension: normalizeDecisionDimension(conflict.dimension),
341
- decidedAt: nowIso(),
342
- };
343
- profile.decisions.push(decision);
344
- conflict.resolved = true;
345
- conflict.resolvedByDecisionId = decision.id;
346
- applyAnswerToProfile(profile, conflict, decision.answer);
347
- profile.updatedAt = nowIso();
348
- await saveTasteProfile(options.rootDir, profile);
349
- return decision;
350
- }
351
- //# sourceMappingURL=tasteRefine.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasteRefine.js","sourceRoot":"","sources":["../src/tasteRefine.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- import type { DesignAnalysis } from './types.js';
2
- export declare function theatricalScan(url: string): Promise<{
3
- analysis: DesignAnalysis;
4
- screenshotPath: string;
5
- }>;
@@ -1,258 +0,0 @@
1
- import path from 'node:path';
2
- import os from 'node:os';
3
- import fs from 'fs-extra';
4
- import { runAgentBrowserJson } from './agentBrowser.js';
5
- const SESSION_NAME = 'design-brain-demo';
6
- /* ─── Highlight injection script ─── */
7
- const HIGHLIGHT_SCRIPT = String.raw `(() => {
8
- const style = document.createElement('style');
9
- style.id = 'design-brain-highlights';
10
- style.textContent = [
11
- '@keyframes db-pulse { 0%,100% { opacity: 0.7; } 50% { opacity: 1; } }',
12
- '.db-highlight-color { outline: 3px solid #00ff88 !important; animation: db-pulse 1s infinite; }',
13
- '.db-highlight-typo { text-decoration: underline wavy #ff6b00 !important; text-underline-offset: 4px; }',
14
- '.db-highlight-component { outline: 3px solid #6366f1 !important; outline-offset: 2px; box-shadow: 0 0 12px rgba(99,102,241,0.4) !important; }',
15
- ].join('\n');
16
- document.head.appendChild(style);
17
-
18
- const nodes = Array.from(document.querySelectorAll('body *')).slice(0, 500);
19
- let colorCount = 0, typoCount = 0, compCount = 0;
20
-
21
- nodes.forEach(el => {
22
- const s = getComputedStyle(el);
23
- const bg = s.backgroundColor;
24
- if (bg && bg !== 'rgba(0, 0, 0, 0)' && bg !== 'transparent' && colorCount < 15) {
25
- el.classList.add('db-highlight-color');
26
- colorCount++;
27
- }
28
- if (el.textContent?.trim().length > 3 && s.fontSize && parseInt(s.fontSize) >= 20 && typoCount < 10) {
29
- el.classList.add('db-highlight-typo');
30
- typoCount++;
31
- }
32
- const tag = el.tagName.toLowerCase();
33
- if ((tag === 'button' || tag === 'a' || el.getAttribute('role') === 'button') && compCount < 10) {
34
- el.classList.add('db-highlight-component');
35
- compCount++;
36
- }
37
- });
38
-
39
- return { colorCount, typoCount, compCount };
40
- })()`;
41
- /* ─── Cleanup script ─── */
42
- const CLEANUP_SCRIPT = String.raw `(() => {
43
- document.getElementById('design-brain-highlights')?.remove();
44
- document.querySelectorAll('.db-highlight-color,.db-highlight-typo,.db-highlight-component')
45
- .forEach(el => el.classList.remove('db-highlight-color','db-highlight-typo','db-highlight-component'));
46
- })()`;
47
- /* ─── Scroll script ─── */
48
- const SCROLL_SCRIPT = String.raw `(() => {
49
- window.scrollBy({ top: 400, behavior: 'smooth' });
50
- return { scrollY: window.scrollY };
51
- })()`;
52
- /* ─── Extraction script (same as extractFromUrl.ts) ─── */
53
- const EXTRACTION_SCRIPT = String.raw `(() => {
54
- const maxNodes = 2000;
55
- const nodes = Array.from(document.querySelectorAll('body *')).slice(0, maxNodes);
56
-
57
- const colorMap = new Map();
58
- const typographyMap = new Map();
59
- const componentList = [];
60
- const motionList = [];
61
- const layoutList = [];
62
- const variableMap = {};
63
-
64
- const componentTags = new Set(['button', 'a', 'input', 'select', 'textarea', 'nav', 'header', 'footer', 'form']);
65
- const maxComponents = 220;
66
- const maxMotion = 220;
67
-
68
- function normalizeWhitespace(text) {
69
- return (text || '').replace(/\s+/g, ' ').trim();
70
- }
71
-
72
- function pushColor(value, sample) {
73
- if (!value || value === 'transparent' || value === 'rgba(0, 0, 0, 0)') return;
74
- const parsed = parseCssColor(value);
75
- if (!parsed) return;
76
- const key = parsed.toUpperCase();
77
- const entry = colorMap.get(key) || { hex: key, count: 0, samples: [] };
78
- entry.count += 1;
79
- if (sample && entry.samples.length < 5 && !entry.samples.includes(sample)) {
80
- entry.samples.push(sample);
81
- }
82
- colorMap.set(key, entry);
83
- }
84
-
85
- function parseCssColor(input) {
86
- if (!input) return null;
87
- const value = input.toString().trim().toLowerCase();
88
- if (value.startsWith('#')) {
89
- if (value.length === 4) return '#' + value[1] + value[1] + value[2] + value[2] + value[3] + value[3];
90
- if (value.length === 7) return value;
91
- return null;
92
- }
93
- const rgbMatch = value.match(/rgba?\(([^)]+)\)/);
94
- if (rgbMatch) {
95
- const parts = rgbMatch[1].split(',').map(p => p.trim());
96
- const r = Number(parts[0]), g = Number(parts[1]), b = Number(parts[2]);
97
- if ([r, g, b].some(n => Number.isNaN(n))) return null;
98
- const toHex = n => Math.max(0, Math.min(255, n)).toString(16).padStart(2, '0');
99
- return '#' + toHex(r) + toHex(g) + toHex(b);
100
- }
101
- return null;
102
- }
103
-
104
- function buildSelector(el) {
105
- const tag = el.tagName.toLowerCase();
106
- if (el.id) return tag + '#' + el.id;
107
- if (typeof el.className === 'string' && el.className.trim()) {
108
- const firstClass = el.className.trim().split(/\s+/).slice(0, 2).join('.');
109
- if (firstClass) return tag + '.' + firstClass;
110
- }
111
- return tag;
112
- }
113
-
114
- function addTypography(style) {
115
- const key = [style.fontFamily, style.fontSize, style.fontWeight, style.lineHeight].join('|');
116
- const existing = typographyMap.get(key) || {
117
- fontFamily: style.fontFamily, fontSize: style.fontSize,
118
- fontWeight: style.fontWeight, lineHeight: style.lineHeight, count: 0,
119
- };
120
- existing.count += 1;
121
- typographyMap.set(key, existing);
122
- }
123
-
124
- function shouldCaptureAsComponent(el, selector) {
125
- const tag = el.tagName.toLowerCase();
126
- if (componentTags.has(tag)) return true;
127
- const className = typeof el.className === 'string' ? el.className.toLowerCase() : '';
128
- if (className.includes('btn') || className.includes('button') || className.includes('card') || className.includes('hero')) return true;
129
- if (el.getAttribute('role') === 'button' || el.getAttribute('role') === 'navigation') return true;
130
- return selector.startsWith('section.') || selector.startsWith('div.card');
131
- }
132
-
133
- function inferComponentKind(el) {
134
- const tag = el.tagName.toLowerCase();
135
- const className = typeof el.className === 'string' ? el.className.toLowerCase() : '';
136
- if (tag === 'button' || className.includes('btn')) return 'button';
137
- if (tag === 'a') return 'link';
138
- if (tag === 'input' || tag === 'textarea' || tag === 'select') return 'form-control';
139
- if (tag === 'nav' || className.includes('nav')) return 'navigation';
140
- if (className.includes('card')) return 'card';
141
- if (tag === 'header') return 'header';
142
- if (tag === 'footer') return 'footer';
143
- if (className.includes('hero')) return 'hero';
144
- return tag;
145
- }
146
-
147
- nodes.forEach(el => {
148
- const style = window.getComputedStyle(el);
149
- if (style.display === 'none' || style.visibility === 'hidden' || Number(style.opacity) === 0) return;
150
- const selector = buildSelector(el);
151
- pushColor(style.color, selector + ':color');
152
- pushColor(style.backgroundColor, selector + ':background');
153
- if (style.borderColor && style.borderColor !== 'rgba(0, 0, 0, 0)') {
154
- pushColor(style.borderColor, selector + ':border');
155
- }
156
- const hasText = normalizeWhitespace(el.textContent || '').length > 0;
157
- if (hasText) addTypography(style);
158
- if (shouldCaptureAsComponent(el, selector) && componentList.length < maxComponents) {
159
- componentList.push({
160
- kind: inferComponentKind(el), tag: el.tagName.toLowerCase(), selector,
161
- text: normalizeWhitespace(el.textContent || '').slice(0, 90),
162
- className: typeof el.className === 'string' ? normalizeWhitespace(el.className) : '',
163
- styles: {
164
- color: style.color, backgroundColor: style.backgroundColor,
165
- borderRadius: style.borderRadius, border: style.border,
166
- padding: style.padding, margin: style.margin,
167
- fontSize: style.fontSize, fontWeight: style.fontWeight, boxShadow: style.boxShadow,
168
- },
169
- });
170
- }
171
- const hasTransition = style.transitionDuration && style.transitionDuration !== '0s';
172
- const hasAnimation = style.animationName && style.animationName !== 'none';
173
- const hasTransform = style.transform && style.transform !== 'none';
174
- if ((hasTransition || hasAnimation || hasTransform) && motionList.length < maxMotion) {
175
- motionList.push({ selector, transition: style.transition, animation: style.animation, transform: style.transform });
176
- }
177
- });
178
-
179
- const layoutSelectors = Array.from(document.querySelectorAll('header, nav, main, section, article, aside, footer')).slice(0, 160);
180
- layoutSelectors.forEach(el => {
181
- layoutList.push({ tag: el.tagName.toLowerCase(), selector: buildSelector(el), role: el.getAttribute('role') || '', children: el.children.length });
182
- });
183
-
184
- [document.documentElement, document.body].forEach(root => {
185
- if (!root) return;
186
- const style = window.getComputedStyle(root);
187
- for (const propertyName of style) {
188
- if (!propertyName.startsWith('--')) continue;
189
- const value = style.getPropertyValue(propertyName).trim();
190
- if (value) variableMap[propertyName] = value;
191
- }
192
- });
193
-
194
- const colors = Array.from(colorMap.values()).sort((a, b) => b.count - a.count).slice(0, 70);
195
- const typography = Array.from(typographyMap.values()).sort((a, b) => b.count - a.count).slice(0, 90);
196
-
197
- return {
198
- pageTitle: document.title, pageUrl: window.location.href,
199
- viewport: { width: window.innerWidth, height: window.innerHeight },
200
- colors, typography, components: componentList, motion: motionList,
201
- layout: layoutList, cssVariables: variableMap,
202
- };
203
- })()`;
204
- /* ─── Normalize extraction result ─── */
205
- function normalizeResult(result) {
206
- return {
207
- pageTitle: result.pageTitle ?? undefined,
208
- pageUrl: result.pageUrl ?? undefined,
209
- viewport: result.viewport ?? undefined,
210
- colors: result.colors ?? [],
211
- typography: result.typography ?? [],
212
- components: result.components ?? [],
213
- motion: result.motion ?? [],
214
- layout: result.layout ?? [],
215
- cssVariables: result.cssVariables ?? {},
216
- };
217
- }
218
- /* ─── Theatrical scan sequence ─── */
219
- export async function theatricalScan(url) {
220
- const screenshotDir = path.join(os.tmpdir(), 'design-brain-theatrical');
221
- await fs.ensureDir(screenshotDir);
222
- const screenshotPath = path.join(screenshotDir, `scan-${Date.now()}.png`);
223
- const browserOpts = { session: SESSION_NAME, headed: true };
224
- // 1. Open the URL in a visible browser
225
- await runAgentBrowserJson(['open', url], browserOpts);
226
- try {
227
- // 2. Wait for page to settle
228
- await runAgentBrowserJson(['wait', '1500'], browserOpts);
229
- // 3. Slow scroll — 4 steps, ~600ms between each
230
- for (let i = 0; i < 4; i++) {
231
- await runAgentBrowserJson(['eval', SCROLL_SCRIPT], browserOpts);
232
- await runAgentBrowserJson(['wait', '600'], browserOpts);
233
- }
234
- // Scroll back to top for highlight injection
235
- await runAgentBrowserJson(['eval', 'window.scrollTo({ top: 0, behavior: "smooth" })'], browserOpts);
236
- await runAgentBrowserJson(['wait', '800'], browserOpts);
237
- // 4. Inject highlight overlays
238
- await runAgentBrowserJson(['eval', HIGHLIGHT_SCRIPT], browserOpts);
239
- // 5. Pause for visual impact
240
- await runAgentBrowserJson(['wait', '2000'], browserOpts);
241
- // 6. Take screenshot with overlays visible
242
- await runAgentBrowserJson(['screenshot', screenshotPath, '--full'], browserOpts);
243
- // 7. Clean overlays
244
- await runAgentBrowserJson(['eval', CLEANUP_SCRIPT], browserOpts);
245
- await runAgentBrowserJson(['wait', '300'], browserOpts);
246
- // 8. Extract design tokens (real extraction on clean page)
247
- const extraction = await runAgentBrowserJson(['eval', EXTRACTION_SCRIPT], browserOpts);
248
- if (!extraction.success) {
249
- throw new Error(`Extraction failed: ${extraction.error ?? 'Unknown error'}`);
250
- }
251
- const analysis = normalizeResult(extraction.data.result ?? {});
252
- return { analysis, screenshotPath };
253
- }
254
- finally {
255
- await runAgentBrowserJson(['close'], browserOpts).catch(() => undefined);
256
- }
257
- }
258
- //# sourceMappingURL=theatrical.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"theatrical.js","sourceRoot":"","sources":["../src/theatrical.ts"],"names":[],"mappings":"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"}