@mise-en-scene/server 0.1.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 (98) hide show
  1. package/README.md +221 -0
  2. package/dist/export/index.d.ts +10 -0
  3. package/dist/export/index.d.ts.map +1 -0
  4. package/dist/export/index.js +53 -0
  5. package/dist/export/index.js.map +1 -0
  6. package/dist/export/pdf-export.d.ts +8 -0
  7. package/dist/export/pdf-export.d.ts.map +1 -0
  8. package/dist/export/pdf-export.js +17 -0
  9. package/dist/export/pdf-export.js.map +1 -0
  10. package/dist/export/presets.d.ts +4 -0
  11. package/dist/export/presets.d.ts.map +1 -0
  12. package/dist/export/presets.js +22 -0
  13. package/dist/export/presets.js.map +1 -0
  14. package/dist/export/puppeteer-manager.d.ts +8 -0
  15. package/dist/export/puppeteer-manager.d.ts.map +1 -0
  16. package/dist/export/puppeteer-manager.js +23 -0
  17. package/dist/export/puppeteer-manager.js.map +1 -0
  18. package/dist/export/raster-export.d.ts +11 -0
  19. package/dist/export/raster-export.d.ts.map +1 -0
  20. package/dist/export/raster-export.js +22 -0
  21. package/dist/export/raster-export.js.map +1 -0
  22. package/dist/export/svg-export.d.ts +2 -0
  23. package/dist/export/svg-export.d.ts.map +1 -0
  24. package/dist/export/svg-export.js +24 -0
  25. package/dist/export/svg-export.js.map +1 -0
  26. package/dist/feedback.d.ts +4 -0
  27. package/dist/feedback.d.ts.map +1 -0
  28. package/dist/feedback.js +23 -0
  29. package/dist/feedback.js.map +1 -0
  30. package/dist/http-server.d.ts +15 -0
  31. package/dist/http-server.d.ts.map +1 -0
  32. package/dist/http-server.js +113 -0
  33. package/dist/http-server.js.map +1 -0
  34. package/dist/index.d.ts +3 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +30 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/mcp-server.d.ts +435 -0
  39. package/dist/mcp-server.d.ts.map +1 -0
  40. package/dist/mcp-server.js +220 -0
  41. package/dist/mcp-server.js.map +1 -0
  42. package/dist/preview.d.ts +2 -0
  43. package/dist/preview.d.ts.map +1 -0
  44. package/dist/preview.js +12 -0
  45. package/dist/preview.js.map +1 -0
  46. package/dist/screenshot.d.ts +7 -0
  47. package/dist/screenshot.d.ts.map +1 -0
  48. package/dist/screenshot.js +20 -0
  49. package/dist/screenshot.js.map +1 -0
  50. package/dist/types.d.ts +84 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +2 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/typography/analyze-url.d.ts +10 -0
  55. package/dist/typography/analyze-url.d.ts.map +1 -0
  56. package/dist/typography/analyze-url.js +28 -0
  57. package/dist/typography/analyze-url.js.map +1 -0
  58. package/dist/typography/classify.d.ts +9 -0
  59. package/dist/typography/classify.d.ts.map +1 -0
  60. package/dist/typography/classify.js +15 -0
  61. package/dist/typography/classify.js.map +1 -0
  62. package/dist/typography/embed.d.ts +5 -0
  63. package/dist/typography/embed.d.ts.map +1 -0
  64. package/dist/typography/embed.js +33 -0
  65. package/dist/typography/embed.js.map +1 -0
  66. package/dist/typography/mood-match.d.ts +3 -0
  67. package/dist/typography/mood-match.d.ts.map +1 -0
  68. package/dist/typography/mood-match.js +21 -0
  69. package/dist/typography/mood-match.js.map +1 -0
  70. package/dist/typography/registry.d.ts +23 -0
  71. package/dist/typography/registry.d.ts.map +1 -0
  72. package/dist/typography/registry.js +103 -0
  73. package/dist/typography/registry.js.map +1 -0
  74. package/dist/typography/scale.d.ts +3 -0
  75. package/dist/typography/scale.d.ts.map +1 -0
  76. package/dist/typography/scale.js +45 -0
  77. package/dist/typography/scale.js.map +1 -0
  78. package/dist/typography/suggest.d.ts +9 -0
  79. package/dist/typography/suggest.d.ts.map +1 -0
  80. package/dist/typography/suggest.js +21 -0
  81. package/dist/typography/suggest.js.map +1 -0
  82. package/dist/versioning/gallery.d.ts +3 -0
  83. package/dist/versioning/gallery.d.ts.map +1 -0
  84. package/dist/versioning/gallery.js +57 -0
  85. package/dist/versioning/gallery.js.map +1 -0
  86. package/dist/versioning/versions.d.ts +19 -0
  87. package/dist/versioning/versions.d.ts.map +1 -0
  88. package/dist/versioning/versions.js +91 -0
  89. package/dist/versioning/versions.js.map +1 -0
  90. package/dist/watcher.d.ts +6 -0
  91. package/dist/watcher.d.ts.map +1 -0
  92. package/dist/watcher.js +15 -0
  93. package/dist/watcher.js.map +1 -0
  94. package/dist/websocket.d.ts +13 -0
  95. package/dist/websocket.d.ts.map +1 -0
  96. package/dist/websocket.js +30 -0
  97. package/dist/websocket.js.map +1 -0
  98. package/package.json +50 -0
@@ -0,0 +1,220 @@
1
+ import { createHttpServer, getNewestHtmlFile } from './http-server.js';
2
+ import { createWebSocketServer } from './websocket.js';
3
+ import { createWatcher } from './watcher.js';
4
+ import { writePreview } from './preview.js';
5
+ import { readFeedback, appendFeedback } from './feedback.js';
6
+ import { ExportPipeline } from './export/index.js';
7
+ import { VersionManager } from './versioning/versions.js';
8
+ import { suggestFonts } from './typography/suggest.js';
9
+ import { analyzeUrlFonts } from './typography/analyze-url.js';
10
+ import { generateTypeScale } from './typography/scale.js';
11
+ import { embedFontsAsBase64 } from './typography/embed.js';
12
+ import fs from 'fs';
13
+ import path from 'path';
14
+ function text(msg) { return { content: [{ type: 'text', text: msg }] }; }
15
+ function image(base64, mimeType = 'image/png') { return { content: [{ type: 'image', data: base64, mimeType }] }; }
16
+ export async function createStudioHandlers(opts) {
17
+ const { port, designDir, host } = opts;
18
+ const httpServer = await createHttpServer({ port, designDir, host });
19
+ const wsServer = await createWebSocketServer({ port: 0, host });
20
+ const watcher = createWatcher(designDir, () => { wsServer.broadcast({ type: 'reload' }); });
21
+ wsServer.onMessage((msg) => { if (msg.type === 'select')
22
+ appendFeedback(designDir, msg); });
23
+ const exportPipeline = new ExportPipeline();
24
+ const versionManager = new VersionManager(path.dirname(designDir));
25
+ const handlers = {
26
+ async studio_preview(args) {
27
+ writePreview(designDir, args.html, args.filename);
28
+ wsServer.broadcast({ type: 'reload' });
29
+ return text(`Design written to ${args.filename}. View at http://localhost:${httpServer.port}/`);
30
+ },
31
+ async studio_feedback() {
32
+ const events = readFeedback(designDir);
33
+ if (events.length === 0)
34
+ return text('No feedback events recorded.');
35
+ return text(JSON.stringify(events, null, 2));
36
+ },
37
+ async studio_export(args) {
38
+ const newest = getNewestHtmlFile(designDir);
39
+ if (!newest)
40
+ return text('No design files found to export.');
41
+ const html = fs.readFileSync(path.join(designDir, newest), 'utf-8');
42
+ const outputDir = path.join(designDir, 'exports');
43
+ const outPath = await exportPipeline.export(html, outputDir, args);
44
+ return text(`Exported to ${outPath}`);
45
+ },
46
+ async studio_screenshot(args) {
47
+ const buffer = await exportPipeline.screenshot(`http://localhost:${httpServer.port}/`, args?.selector);
48
+ return image(buffer.toString('base64'), 'image/png');
49
+ },
50
+ async studio_branch(args) {
51
+ versionManager.createBranch(args.name, args.from_branch, args.from_version);
52
+ return text(`Created branch "${args.name}"`);
53
+ },
54
+ async studio_checkout(args) {
55
+ versionManager.checkout(args.branch, args.version);
56
+ return text(`Switched to ${args.branch}${args.version ? `/v${args.version}` : ''}`);
57
+ },
58
+ async studio_gallery() {
59
+ return text(`Gallery available at http://localhost:${httpServer.port}/gallery`);
60
+ },
61
+ async studio_font_suggest(args) {
62
+ const suggestions = suggestFonts(args.mood, { cultural_context: args.context });
63
+ return text(JSON.stringify(suggestions, null, 2));
64
+ },
65
+ async studio_font_analyze_url(args) {
66
+ const fonts = await analyzeUrlFonts(exportPipeline.getPuppeteerManager(), args.url);
67
+ return text(JSON.stringify(fonts, null, 2));
68
+ },
69
+ async studio_font_scale(args) {
70
+ const scale = generateTypeScale(args.base_size ?? 16, args.ratio ?? 1.25);
71
+ return text(JSON.stringify(scale, null, 2));
72
+ },
73
+ async studio_font_embed(args) {
74
+ const css = await embedFontsAsBase64(args.fonts);
75
+ return text(css);
76
+ },
77
+ async shutdown() {
78
+ await exportPipeline.shutdown();
79
+ await watcher.close();
80
+ await wsServer.close();
81
+ await httpServer.close();
82
+ },
83
+ };
84
+ return { handlers, port: httpServer.port, wsPort: wsServer.port };
85
+ }
86
+ export function getStudioTools() {
87
+ return [
88
+ {
89
+ name: 'studio_preview',
90
+ description: 'Write an HTML+CSS+SVG design to the browser preview. Triggers hot-reload.',
91
+ inputSchema: {
92
+ type: 'object',
93
+ properties: {
94
+ html: { type: 'string', description: 'The full HTML content of the design' },
95
+ filename: { type: 'string', description: 'Filename for this version (e.g., poster-v1.html)' },
96
+ },
97
+ required: ['html', 'filename'],
98
+ },
99
+ },
100
+ {
101
+ name: 'studio_feedback',
102
+ description: 'Read user feedback events from the browser (element selections, annotations)',
103
+ inputSchema: { type: 'object', properties: {} },
104
+ },
105
+ {
106
+ name: 'studio_export',
107
+ description: 'Export the current design to SVG, PNG, JPG, or PDF',
108
+ inputSchema: {
109
+ type: 'object',
110
+ properties: {
111
+ format: { type: 'string', enum: ['svg', 'png', 'jpg', 'pdf'] },
112
+ width: { type: 'number' },
113
+ height: { type: 'number' },
114
+ dpi: { type: 'number' },
115
+ quality: { type: 'number' },
116
+ preset: { type: 'string' },
117
+ },
118
+ required: ['format'],
119
+ },
120
+ },
121
+ {
122
+ name: 'studio_screenshot',
123
+ description: 'Capture a screenshot of the current design for self-critique. Returns image data.',
124
+ inputSchema: {
125
+ type: 'object',
126
+ properties: {
127
+ selector: { type: 'string' },
128
+ },
129
+ },
130
+ },
131
+ {
132
+ name: 'studio_branch',
133
+ description: 'Create a new design branch',
134
+ inputSchema: {
135
+ type: 'object',
136
+ properties: {
137
+ name: { type: 'string', description: 'Branch name (e.g., "dark-theme")' },
138
+ from_branch: { type: 'string', description: 'Branch to fork from (defaults to current)' },
139
+ from_version: { type: 'number', description: 'Version number to fork from (defaults to latest)' },
140
+ },
141
+ required: ['name'],
142
+ },
143
+ },
144
+ {
145
+ name: 'studio_checkout',
146
+ description: 'Switch to a different branch or version',
147
+ inputSchema: {
148
+ type: 'object',
149
+ properties: {
150
+ branch: { type: 'string', description: 'Branch name' },
151
+ version: { type: 'number', description: 'Version number (defaults to latest)' },
152
+ },
153
+ required: ['branch'],
154
+ },
155
+ },
156
+ {
157
+ name: 'studio_gallery',
158
+ description: 'Open the version gallery showing all branches and versions',
159
+ inputSchema: { type: 'object', properties: {} },
160
+ },
161
+ {
162
+ name: 'studio_font_suggest',
163
+ description: 'Get curated font pairing suggestions based on mood and context',
164
+ inputSchema: {
165
+ type: 'object',
166
+ properties: {
167
+ mood: { type: 'string', description: 'Emotional tone (e.g., "editorial", "playful", "luxury")' },
168
+ context: { type: 'string', description: 'Design context (e.g., "wine label", "tech startup")' },
169
+ },
170
+ required: ['mood'],
171
+ },
172
+ },
173
+ {
174
+ name: 'studio_font_analyze_url',
175
+ description: 'Extract the font stack from any website URL',
176
+ inputSchema: {
177
+ type: 'object',
178
+ properties: {
179
+ url: { type: 'string', description: 'URL to analyze' },
180
+ },
181
+ required: ['url'],
182
+ },
183
+ },
184
+ {
185
+ name: 'studio_font_scale',
186
+ description: 'Generate a modular type scale as CSS custom properties',
187
+ inputSchema: {
188
+ type: 'object',
189
+ properties: {
190
+ base_size: { type: 'number', description: 'Base font size in pixels', default: 16 },
191
+ ratio: { type: 'number', description: 'Scale ratio (1.2=minor third, 1.25=major third, 1.333=perfect fourth, 1.618=golden)', default: 1.25 },
192
+ },
193
+ },
194
+ },
195
+ {
196
+ name: 'studio_font_embed',
197
+ description: 'Generate @font-face CSS with base64 woff2 for self-contained SVG export',
198
+ inputSchema: {
199
+ type: 'object',
200
+ properties: {
201
+ fonts: {
202
+ type: 'array',
203
+ items: {
204
+ type: 'object',
205
+ properties: {
206
+ family: { type: 'string' },
207
+ weight: { type: 'number' },
208
+ style: { type: 'string' },
209
+ url: { type: 'string', description: 'URL to the woff2 file' },
210
+ },
211
+ required: ['family', 'url'],
212
+ },
213
+ },
214
+ },
215
+ required: ['fonts'],
216
+ },
217
+ },
218
+ ];
219
+ }
220
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function writePreview(designDir: string, html: string, filename: string): string;
2
+ //# sourceMappingURL=preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../src/preview.ts"],"names":[],"mappings":"AAGA,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOtF"}
@@ -0,0 +1,12 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ export function writePreview(designDir, html, filename) {
4
+ fs.mkdirSync(designDir, { recursive: true });
5
+ const filePath = path.join(designDir, filename);
6
+ fs.writeFileSync(filePath, html, 'utf-8');
7
+ const feedbackPath = path.join(designDir, '.feedback');
8
+ if (fs.existsSync(feedbackPath))
9
+ fs.unlinkSync(feedbackPath);
10
+ return filePath;
11
+ }
12
+ //# sourceMappingURL=preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../src/preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,UAAU,YAAY,CAAC,SAAiB,EAAE,IAAY,EAAE,QAAgB;IAC5E,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACvD,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAC7D,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { PuppeteerManager } from './export/puppeteer-manager.js';
2
+ export declare function takeScreenshot(manager: PuppeteerManager, url: string, opts?: {
3
+ selector?: string;
4
+ width?: number;
5
+ height?: number;
6
+ }): Promise<Buffer>;
7
+ //# sourceMappingURL=screenshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../src/screenshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,wBAAsB,cAAc,CAClC,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5D,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
@@ -0,0 +1,20 @@
1
+ export async function takeScreenshot(manager, url, opts) {
2
+ const page = await manager.getPage();
3
+ try {
4
+ await page.setViewport({ width: opts?.width ?? 1200, height: opts?.height ?? 800 });
5
+ await page.goto(url, { waitUntil: 'networkidle0', timeout: 10000 });
6
+ if (opts?.selector) {
7
+ const element = await page.$(opts.selector);
8
+ if (element) {
9
+ const buffer = await element.screenshot();
10
+ return Buffer.from(buffer);
11
+ }
12
+ }
13
+ const buffer = await page.screenshot({ fullPage: true });
14
+ return Buffer.from(buffer);
15
+ }
16
+ finally {
17
+ await page.close();
18
+ }
19
+ }
20
+ //# sourceMappingURL=screenshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../src/screenshot.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAyB,EACzB,GAAW,EACX,IAA6D;IAE7D,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;QACpF,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC;YACnB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5C,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;gBAC1C,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;AACH,CAAC"}
@@ -0,0 +1,84 @@
1
+ export interface PreviewOptions {
2
+ html: string;
3
+ filename: string;
4
+ }
5
+ export interface ExportOptions {
6
+ format: 'svg' | 'png' | 'jpg' | 'pdf';
7
+ width?: number;
8
+ height?: number;
9
+ dpi?: number;
10
+ quality?: number;
11
+ preset?: string;
12
+ }
13
+ export interface ScreenshotOptions {
14
+ selector?: string;
15
+ fullPage?: boolean;
16
+ }
17
+ export interface BranchInfo {
18
+ name: string;
19
+ forkedFrom?: {
20
+ branch: string;
21
+ version: number;
22
+ };
23
+ versions: number[];
24
+ created_at: string;
25
+ }
26
+ export interface VersionMeta {
27
+ branches: Record<string, BranchInfo>;
28
+ stars: Array<{
29
+ branch: string;
30
+ version: number;
31
+ }>;
32
+ current: {
33
+ branch: string;
34
+ version: number;
35
+ };
36
+ }
37
+ export interface FeedbackEvent {
38
+ type: 'select';
39
+ element: {
40
+ tag: string;
41
+ classes: string[];
42
+ id?: string;
43
+ text?: string;
44
+ bbox: {
45
+ x: number;
46
+ y: number;
47
+ width: number;
48
+ height: number;
49
+ };
50
+ };
51
+ timestamp: number;
52
+ }
53
+ export interface FontSuggestion {
54
+ display: {
55
+ family: string;
56
+ weights: number[];
57
+ fallback: string;
58
+ };
59
+ body: {
60
+ family: string;
61
+ weights: number[];
62
+ fallback: string;
63
+ };
64
+ mood: string;
65
+ cultural_context?: string;
66
+ import_url: string;
67
+ }
68
+ export interface TypeScale {
69
+ ratio: number;
70
+ base_size: number;
71
+ steps: Record<string, {
72
+ size: string;
73
+ line_height: string;
74
+ letter_spacing: string;
75
+ }>;
76
+ css_variables: string;
77
+ }
78
+ export type DimensionPreset = {
79
+ name: string;
80
+ width: number;
81
+ height: number;
82
+ category: 'social' | 'print' | 'web';
83
+ };
84
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrC,KAAK,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE;QACP,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KAC/D,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrF,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;CACtC,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import type { PuppeteerManager } from '../export/puppeteer-manager.js';
2
+ interface FontUsage {
3
+ family: string;
4
+ weight: string;
5
+ style: string;
6
+ selector: string;
7
+ }
8
+ export declare function analyzeUrlFonts(manager: PuppeteerManager, url: string): Promise<FontUsage[]>;
9
+ export {};
10
+ //# sourceMappingURL=analyze-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-url.d.ts","sourceRoot":"","sources":["../../src/typography/analyze-url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,UAAU,SAAS;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,SAAS,EAAE,CAAC,CA+BtB"}
@@ -0,0 +1,28 @@
1
+ export async function analyzeUrlFonts(manager, url) {
2
+ const page = await manager.getPage();
3
+ try {
4
+ await page.goto(url, { waitUntil: 'networkidle0', timeout: 10000 });
5
+ const fonts = await page.evaluate(() => {
6
+ const results = [];
7
+ const seen = new Set();
8
+ const elements = document.querySelectorAll('h1, h2, h3, h4, h5, h6, p, a, span, li, td, th, button, label');
9
+ elements.forEach((el) => {
10
+ const computed = window.getComputedStyle(el);
11
+ const family = computed.fontFamily.split(',')[0].replace(/['"]/g, '').trim();
12
+ const weight = computed.fontWeight;
13
+ const style = computed.fontStyle;
14
+ const key = `${family}:${weight}:${style}`;
15
+ if (!seen.has(key)) {
16
+ seen.add(key);
17
+ results.push({ family, weight, style, selector: el.tagName.toLowerCase() });
18
+ }
19
+ });
20
+ return results;
21
+ });
22
+ return fonts;
23
+ }
24
+ finally {
25
+ await page.close();
26
+ }
27
+ }
28
+ //# sourceMappingURL=analyze-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-url.js","sourceRoot":"","sources":["../../src/typography/analyze-url.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAyB,EACzB,GAAW;IAEX,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAErC,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAEpE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;YACrC,MAAM,OAAO,GAA+E,EAAE,CAAC;YAC/F,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAE/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,CAAC,+DAA+D,CAAC,CAAC;YAC5G,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;gBACtB,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC7E,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC;gBACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC;gBACjC,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;gBAE3C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACd,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBAC9E,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ interface FontClassification {
2
+ category: 'serif' | 'sans-serif' | 'display' | 'monospace' | 'unknown';
3
+ subtype?: string;
4
+ era?: string;
5
+ mood?: string[];
6
+ }
7
+ export declare function classifyFont(fontName: string): FontClassification;
8
+ export {};
9
+ //# sourceMappingURL=classify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../src/typography/classify.ts"],"names":[],"mappings":"AAEA,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CAajE"}
@@ -0,0 +1,15 @@
1
+ import { FONT_REGISTRY } from './registry.js';
2
+ export function classifyFont(fontName) {
3
+ const normalized = fontName.toLowerCase().replace(/[^a-z\s]/g, '').trim();
4
+ const entry = FONT_REGISTRY[normalized];
5
+ if (entry)
6
+ return entry;
7
+ // Fuzzy match
8
+ for (const [key, value] of Object.entries(FONT_REGISTRY)) {
9
+ if (normalized.includes(key) || key.includes(normalized)) {
10
+ return value;
11
+ }
12
+ }
13
+ return { category: 'unknown' };
14
+ }
15
+ //# sourceMappingURL=classify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/typography/classify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAS9C,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1E,MAAM,KAAK,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IACxC,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IAExB,cAAc;IACd,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QACzD,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACzD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACjC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function embedFontsAsBase64(fonts: Array<{
2
+ family: string;
3
+ url: string;
4
+ }>): Promise<string>;
5
+ //# sourceMappingURL=embed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed.d.ts","sourceRoot":"","sources":["../../src/typography/embed.ts"],"names":[],"mappings":"AAeA,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5C,OAAO,CAAC,MAAM,CAAC,CAmBjB"}
@@ -0,0 +1,33 @@
1
+ import https from 'https';
2
+ import http from 'http';
3
+ async function fetchBuffer(url) {
4
+ return new Promise((resolve, reject) => {
5
+ const client = url.startsWith('https') ? https : http;
6
+ client.get(url, (res) => {
7
+ const chunks = [];
8
+ res.on('data', (chunk) => chunks.push(chunk));
9
+ res.on('end', () => resolve(Buffer.concat(chunks)));
10
+ res.on('error', reject);
11
+ }).on('error', reject);
12
+ });
13
+ }
14
+ export async function embedFontsAsBase64(fonts) {
15
+ const fontFaces = [];
16
+ for (const font of fonts) {
17
+ try {
18
+ const buffer = await fetchBuffer(font.url);
19
+ const base64 = buffer.toString('base64');
20
+ fontFaces.push(`
21
+ @font-face {
22
+ font-family: '${font.family}';
23
+ src: url(data:font/woff2;base64,${base64}) format('woff2');
24
+ font-display: swap;
25
+ }`);
26
+ }
27
+ catch {
28
+ // Skip fonts that fail to download
29
+ }
30
+ }
31
+ return fontFaces.join('\n');
32
+ }
33
+ //# sourceMappingURL=embed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed.js","sourceRoot":"","sources":["../../src/typography/embed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,KAAK,UAAU,WAAW,CAAC,GAAW;IACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE;YACtB,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9C,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACpD,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAA6C;IAE7C,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACzC,SAAS,CAAC,IAAI,CAAC;;kBAEH,IAAI,CAAC,MAAM;oCACO,MAAM;;EAExC,CAAC,CAAC;QACA,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function tokenize(text: string): string[];
2
+ export declare function textSimilarity(query: string, document: string): number;
3
+ //# sourceMappingURL=mood-match.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mood-match.d.ts","sourceRoot":"","sources":["../../src/typography/mood-match.ts"],"names":[],"mappings":"AAEA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAM/C;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUtE"}
@@ -0,0 +1,21 @@
1
+ // Reusable text similarity — same algorithm as taste-memory embeddings
2
+ export function tokenize(text) {
3
+ return text
4
+ .toLowerCase()
5
+ .replace(/[^a-z0-9\s\-]/g, ' ')
6
+ .split(/\s+/)
7
+ .filter((t) => t.length > 1);
8
+ }
9
+ export function textSimilarity(query, document) {
10
+ const queryTokens = new Set(tokenize(query));
11
+ const docTokens = new Set(tokenize(document));
12
+ if (queryTokens.size === 0 || docTokens.size === 0)
13
+ return 0;
14
+ let matches = 0;
15
+ for (const token of queryTokens) {
16
+ if (docTokens.has(token))
17
+ matches++;
18
+ }
19
+ return matches / queryTokens.size;
20
+ }
21
+ //# sourceMappingURL=mood-match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mood-match.js","sourceRoot":"","sources":["../../src/typography/mood-match.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAEvE,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;SAC9B,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,QAAgB;IAC5D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9C,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAE7D,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;IACtC,CAAC;IACD,OAAO,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC;AACpC,CAAC"}
@@ -0,0 +1,23 @@
1
+ interface FontEntry {
2
+ category: 'serif' | 'sans-serif' | 'display' | 'monospace' | 'unknown';
3
+ subtype?: string;
4
+ era?: string;
5
+ mood?: string[];
6
+ }
7
+ export declare const FONT_REGISTRY: Record<string, FontEntry>;
8
+ export declare const CURATED_PAIRINGS: Record<string, {
9
+ display: {
10
+ family: string;
11
+ weights: number[];
12
+ fallback: string;
13
+ };
14
+ body: {
15
+ family: string;
16
+ weights: number[];
17
+ fallback: string;
18
+ };
19
+ mood: string;
20
+ import_url: string;
21
+ }>;
22
+ export {};
23
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/typography/registry.ts"],"names":[],"mappings":"AAAA,UAAU,SAAS;IACjB,QAAQ,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CA2DnD,CAAC;AAGF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE;IAC5C,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,CAiDA,CAAC"}