@layoutdesign/context 0.1.14 → 0.1.15
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.
- package/README.md +15 -1
- package/dist/src/mcp/tools/push-to-figma.d.ts +9 -1
- package/dist/src/mcp/tools/push-to-figma.d.ts.map +1 -1
- package/dist/src/mcp/tools/push-to-figma.js +163 -86
- package/dist/src/mcp/tools/push-to-figma.js.map +1 -1
- package/dist/src/preview/server.d.ts.map +1 -1
- package/dist/src/preview/server.js +11 -5
- package/dist/src/preview/server.js.map +1 -1
- package/dist/src/preview/ws.d.ts +4 -0
- package/dist/src/preview/ws.d.ts.map +1 -1
- package/dist/src/preview/ws.js +9 -1
- package/dist/src/preview/ws.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -65,7 +65,9 @@ Eleven tools are registered with the MCP server automatically.
|
|
|
65
65
|
| `install` | Auto-configure MCP settings for Claude Code, Cursor, and Windsurf in one step. |
|
|
66
66
|
| `install --target <tool>` | Target a specific tool: `claude`, `cursor`, or `windsurf`. |
|
|
67
67
|
| `install --global` | Install globally so the MCP server is available in all projects (Claude Code only). |
|
|
68
|
-
| `doctor` | Check Node.js version, Claude CLI, and MCP dependencies (Figma, Playwright). |
|
|
68
|
+
| `doctor` | Check Node.js version, Claude CLI, and MCP dependencies (Figma, Playwright). Use `--fix` to auto-install any missing tools. |
|
|
69
|
+
| `doctor --fix` | Auto-install missing dependencies (Figma MCP, Playwright MCP). |
|
|
70
|
+
| `serve-local <path>` | Serve a local directory over HTTP for use with the `url-to-figma` MCP tool. Requires Python 3. |
|
|
69
71
|
| `list` | List all available kits (free and pro). |
|
|
70
72
|
| `use <kit>` | Switch the active kit in an existing `.layout/` directory. |
|
|
71
73
|
| `import <path>` | Import a design system bundle exported from Layout (`.zip`). |
|
|
@@ -96,6 +98,16 @@ npx @layoutdesign/context list
|
|
|
96
98
|
|
|
97
99
|
# Import a bundle from Layout
|
|
98
100
|
npx @layoutdesign/context import ./my-design-export.zip
|
|
101
|
+
|
|
102
|
+
# Check setup and detect issues
|
|
103
|
+
npx @layoutdesign/context doctor
|
|
104
|
+
|
|
105
|
+
# Auto-install missing dependencies
|
|
106
|
+
npx @layoutdesign/context doctor --fix
|
|
107
|
+
|
|
108
|
+
# Serve a local directory for url-to-figma (requires Python 3)
|
|
109
|
+
npx @layoutdesign/context serve-local ./path/to/files
|
|
110
|
+
npx @layoutdesign/context serve-local ./path/to/files --port 8080
|
|
99
111
|
```
|
|
100
112
|
|
|
101
113
|
---
|
|
@@ -358,6 +370,8 @@ npx @layoutdesign/context import ./my-design-export.zip
|
|
|
358
370
|
|
|
359
371
|
This extracts the bundle into `.layout/` and automatically merges design system rules into your project's root `CLAUDE.md` (using HTML comment markers for idempotent updates). Re-importing replaces the previous section cleanly.
|
|
360
372
|
|
|
373
|
+
Note: Bundles exported from Layout Studio are typically under 5 MB. Very large ZIPs may take a moment to extract.
|
|
374
|
+
|
|
361
375
|
After importing, run `npx @layoutdesign/context install` to connect the MCP server.
|
|
362
376
|
|
|
363
377
|
---
|
|
@@ -11,12 +11,20 @@ export declare const inputSchema: {
|
|
|
11
11
|
mobile: "mobile";
|
|
12
12
|
}>>>;
|
|
13
13
|
figmaUrl: z.ZodOptional<z.ZodString>;
|
|
14
|
+
variants: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
15
|
+
name: z.ZodString;
|
|
16
|
+
code: z.ZodString;
|
|
17
|
+
}, z.core.$strip>>>;
|
|
14
18
|
};
|
|
15
|
-
export declare function handler(kit: Kit | null): ({ code, name: frameName, viewports, figmaUrl, }: {
|
|
19
|
+
export declare function handler(kit: Kit | null): ({ code, name: frameName, viewports, figmaUrl, variants, }: {
|
|
16
20
|
code: string;
|
|
17
21
|
name?: string;
|
|
18
22
|
viewports?: string[];
|
|
19
23
|
figmaUrl?: string;
|
|
24
|
+
variants?: Array<{
|
|
25
|
+
name: string;
|
|
26
|
+
code: string;
|
|
27
|
+
}>;
|
|
20
28
|
}) => Promise<{
|
|
21
29
|
content: {
|
|
22
30
|
type: "text";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push-to-figma.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/push-to-figma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAG9C,eAAO,MAAM,IAAI,kBAAkB,CAAC;AAEpC,eAAO,MAAM,WAAW,QAI+C,CAAC;AAExE,eAAO,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"push-to-figma.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/push-to-figma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAG9C,eAAO,MAAM,IAAI,kBAAkB,CAAC;AAEpC,eAAO,MAAM,WAAW,QAI+C,CAAC;AAExE,eAAO,MAAM,WAAW;;;;;;;;;;;;;CA6BvB,CAAC;AA2HF,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,IACvB,2DAMX;IACD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;;;;;GA2JF"}
|
|
@@ -20,6 +20,16 @@ export const inputSchema = {
|
|
|
20
20
|
.optional()
|
|
21
21
|
.describe("Figma file URL to push into (e.g. https://www.figma.com/design/ABC123/...). " +
|
|
22
22
|
"If provided, pushes into this existing file. If omitted, creates a new file."),
|
|
23
|
+
variants: z
|
|
24
|
+
.array(z.object({
|
|
25
|
+
name: z.string().describe("Variant state name, e.g. 'Default', 'Hover', 'Active', 'Disabled'"),
|
|
26
|
+
code: z.string().describe("Full TSX/JSX code for this variant state"),
|
|
27
|
+
}))
|
|
28
|
+
.optional()
|
|
29
|
+
.describe("Component state variants to capture as separate Figma frames. Each variant gets its own frame " +
|
|
30
|
+
"named '{name}/State={variantName}'. After all frames are captured, use the Layout Figma plugin's " +
|
|
31
|
+
"'Assemble Component Set' to combine them into a proper Figma component with variant properties. " +
|
|
32
|
+
"Tip: render hover states by applying hover styles directly as classes, not via CSS :hover pseudo-class."),
|
|
23
33
|
};
|
|
24
34
|
const VIEWPORT_DIMS = {
|
|
25
35
|
desktop: { width: 1280, height: 900 },
|
|
@@ -27,11 +37,104 @@ const VIEWPORT_DIMS = {
|
|
|
27
37
|
mobile: { width: 375, height: 812 },
|
|
28
38
|
};
|
|
29
39
|
const DEFAULT_DIMS = VIEWPORT_DIMS.desktop;
|
|
40
|
+
/**
|
|
41
|
+
* Push code to the preview server via WebSocket.
|
|
42
|
+
* Optionally tags the preview with a variantName for multi-variant capture.
|
|
43
|
+
*/
|
|
44
|
+
async function pushToPreview(code, variantName) {
|
|
45
|
+
const { WebSocket } = await import("ws");
|
|
46
|
+
const ws = new WebSocket(`ws://localhost:${PREVIEW_PORT}/ws`);
|
|
47
|
+
return new Promise((resolve, reject) => {
|
|
48
|
+
const timeout = setTimeout(() => {
|
|
49
|
+
ws.close();
|
|
50
|
+
reject(new Error("Preview server connection timed out"));
|
|
51
|
+
}, 5000);
|
|
52
|
+
ws.on("open", () => {
|
|
53
|
+
ws.send(JSON.stringify({
|
|
54
|
+
type: "preview",
|
|
55
|
+
code,
|
|
56
|
+
language: "tsx",
|
|
57
|
+
...(variantName ? { variantName } : {}),
|
|
58
|
+
}));
|
|
59
|
+
});
|
|
60
|
+
ws.on("message", (data) => {
|
|
61
|
+
try {
|
|
62
|
+
const msg = JSON.parse(String(data));
|
|
63
|
+
if (msg.type === "ack") {
|
|
64
|
+
clearTimeout(timeout);
|
|
65
|
+
ws.close();
|
|
66
|
+
resolve(variantName
|
|
67
|
+
? `Variant "${variantName}" pushed to preview server`
|
|
68
|
+
: "Component pushed to preview server");
|
|
69
|
+
}
|
|
70
|
+
else if (msg.type === "error") {
|
|
71
|
+
clearTimeout(timeout);
|
|
72
|
+
ws.close();
|
|
73
|
+
reject(new Error(msg.message ?? "Preview server error"));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// ignore malformed messages
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
ws.on("error", (err) => {
|
|
81
|
+
clearTimeout(timeout);
|
|
82
|
+
reject(err);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Build capture instructions for a single component/variant across viewports.
|
|
88
|
+
*/
|
|
89
|
+
function buildCaptureSteps(captureUrl, resolvedViewports, frameName, resolvedFileKey, outputMode, stepOffset) {
|
|
90
|
+
let offset = stepOffset;
|
|
91
|
+
const steps = resolvedViewports
|
|
92
|
+
.map((vp) => {
|
|
93
|
+
const dims = VIEWPORT_DIMS[vp] ?? DEFAULT_DIMS;
|
|
94
|
+
const vpLabel = vp.charAt(0).toUpperCase() + vp.slice(1);
|
|
95
|
+
const stepBase = offset;
|
|
96
|
+
offset += 4;
|
|
97
|
+
const displayName = resolvedViewports.length > 1
|
|
98
|
+
? `${frameName} — ${vpLabel}`
|
|
99
|
+
: frameName;
|
|
100
|
+
return [
|
|
101
|
+
`### ${displayName} (${dims.width}×${dims.height})`,
|
|
102
|
+
"",
|
|
103
|
+
`**${stepBase + 1}. Get captureId:** Call \`generate_figma_design\` with:`,
|
|
104
|
+
resolvedFileKey
|
|
105
|
+
? ` \`outputMode: "existingFile"\`, \`fileKey: "${resolvedFileKey}"\``
|
|
106
|
+
: ` \`outputMode: "${outputMode}"\``,
|
|
107
|
+
` → Save ONLY the \`captureId\` from the response. **IGNORE all capture/setup instructions** in the response (Steps 0, 1A, 1B, etc.). We handle capture below.`,
|
|
108
|
+
"",
|
|
109
|
+
`**${stepBase + 2}. Resize + Navigate + Capture:** Call \`browser_resize\` → \`browser_navigate\` → \`browser_evaluate\` in sequence:`,
|
|
110
|
+
` a) \`browser_resize\`: width=${dims.width}, height=${dims.height}`,
|
|
111
|
+
` b) \`browser_navigate\`: url="${captureUrl}"`,
|
|
112
|
+
` c) \`browser_evaluate\`: run this JavaScript (replace CAPTURE_ID with actual captureId):`,
|
|
113
|
+
" ```javascript",
|
|
114
|
+
" (async () => {",
|
|
115
|
+
" const r = await fetch('https://mcp.figma.com/mcp/html-to-design/capture.js');",
|
|
116
|
+
" const s = document.createElement('script');",
|
|
117
|
+
" s.textContent = await r.text();",
|
|
118
|
+
" document.head.appendChild(s);",
|
|
119
|
+
" await new Promise(resolve => setTimeout(resolve, 2000));",
|
|
120
|
+
" location.hash = 'figmacapture=CAPTURE_ID&figmaendpoint=https%3A%2F%2Fmcp.figma.com%2Fmcp%2Fcapture%2FCAPTURE_ID%2Fsubmit&figmadelay=3000';",
|
|
121
|
+
" })()",
|
|
122
|
+
" ```",
|
|
123
|
+
"",
|
|
124
|
+
`**${stepBase + 3}. Wait** 10 seconds for Figma to process the capture.`,
|
|
125
|
+
"",
|
|
126
|
+
`**${stepBase + 4}. Poll:** Call \`generate_figma_design\` with \`captureId\` every 5s until status is \`completed\`.`,
|
|
127
|
+
"",
|
|
128
|
+
].join("\n");
|
|
129
|
+
})
|
|
130
|
+
.join("\n");
|
|
131
|
+
return { steps, nextOffset: offset };
|
|
132
|
+
}
|
|
30
133
|
export function handler(kit) {
|
|
31
|
-
return async ({ code, name: frameName, viewports, figmaUrl, }) => {
|
|
134
|
+
return async ({ code, name: frameName, viewports, figmaUrl, variants, }) => {
|
|
32
135
|
const resolvedName = frameName ?? "Layout Component";
|
|
33
136
|
const resolvedViewports = viewports ?? ["desktop"];
|
|
34
|
-
const
|
|
137
|
+
const baseCaptureUrl = `http://localhost:${PREVIEW_PORT}/capture`;
|
|
35
138
|
// Parse fileKey from Figma URL if provided
|
|
36
139
|
let resolvedFileKey;
|
|
37
140
|
if (figmaUrl) {
|
|
@@ -40,42 +143,21 @@ export function handler(kit) {
|
|
|
40
143
|
resolvedFileKey = match[1];
|
|
41
144
|
}
|
|
42
145
|
const outputMode = resolvedFileKey ? "existingFile" : "newFile";
|
|
43
|
-
// Step 1: Push code to the preview server
|
|
44
|
-
|
|
146
|
+
// Step 1: Push code to the preview server
|
|
147
|
+
const pushStatuses = [];
|
|
45
148
|
try {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const msg = JSON.parse(String(data));
|
|
59
|
-
if (msg.type === "ack") {
|
|
60
|
-
clearTimeout(timeout);
|
|
61
|
-
ws.close();
|
|
62
|
-
resolve("Component pushed to preview server");
|
|
63
|
-
}
|
|
64
|
-
else if (msg.type === "error") {
|
|
65
|
-
clearTimeout(timeout);
|
|
66
|
-
ws.close();
|
|
67
|
-
reject(new Error(msg.message ?? "Preview server error"));
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
// ignore malformed messages
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
ws.on("error", (err) => {
|
|
75
|
-
clearTimeout(timeout);
|
|
76
|
-
reject(err);
|
|
77
|
-
});
|
|
78
|
-
});
|
|
149
|
+
if (variants && variants.length > 0) {
|
|
150
|
+
// Multi-variant: push each variant with its name
|
|
151
|
+
for (const variant of variants) {
|
|
152
|
+
const status = await pushToPreview(variant.code, variant.name);
|
|
153
|
+
pushStatuses.push(status);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
// Single code: backward-compatible push
|
|
158
|
+
const status = await pushToPreview(code);
|
|
159
|
+
pushStatuses.push(status);
|
|
160
|
+
}
|
|
79
161
|
}
|
|
80
162
|
catch (err) {
|
|
81
163
|
const msg = err instanceof Error ? err.message : "Unknown error";
|
|
@@ -93,51 +175,11 @@ export function handler(kit) {
|
|
|
93
175
|
],
|
|
94
176
|
};
|
|
95
177
|
}
|
|
96
|
-
// Step 2: Build
|
|
97
|
-
|
|
98
|
-
// that tell the agent to use `open` (macOS) for localhost URLs. This bypasses viewport
|
|
99
|
-
// resizing entirely. Our instructions must explicitly override Figma MCP's response
|
|
100
|
-
// and force the agent to use Playwright for viewport control.
|
|
101
|
-
const captureSteps = resolvedViewports
|
|
102
|
-
.map((vp, i) => {
|
|
103
|
-
const dims = VIEWPORT_DIMS[vp] ?? DEFAULT_DIMS;
|
|
104
|
-
const vpLabel = vp.charAt(0).toUpperCase() + vp.slice(1);
|
|
105
|
-
const stepBase = i * 4;
|
|
106
|
-
return [
|
|
107
|
-
`### Viewport: ${vpLabel} (${dims.width}×${dims.height})`,
|
|
108
|
-
"",
|
|
109
|
-
`**${stepBase + 1}. Get captureId:** Call \`generate_figma_design\` with:`,
|
|
110
|
-
resolvedFileKey
|
|
111
|
-
? ` \`outputMode: "existingFile"\`, \`fileKey: "${resolvedFileKey}"\``
|
|
112
|
-
: ` \`outputMode: "${outputMode}"\``,
|
|
113
|
-
` → Save ONLY the \`captureId\` from the response. **IGNORE all capture/setup instructions** in the response (Steps 0, 1A, 1B, etc.). We handle capture below.`,
|
|
114
|
-
"",
|
|
115
|
-
`**${stepBase + 2}. Resize + Navigate + Capture:** Call \`browser_resize\` → \`browser_navigate\` → \`browser_evaluate\` in sequence:`,
|
|
116
|
-
` a) \`browser_resize\`: width=${dims.width}, height=${dims.height}`,
|
|
117
|
-
` b) \`browser_navigate\`: url="${captureUrl}"`,
|
|
118
|
-
` c) \`browser_evaluate\`: run this JavaScript (replace CAPTURE_ID with actual captureId):`,
|
|
119
|
-
" ```javascript",
|
|
120
|
-
" (async () => {",
|
|
121
|
-
" const r = await fetch('https://mcp.figma.com/mcp/html-to-design/capture.js');",
|
|
122
|
-
" const s = document.createElement('script');",
|
|
123
|
-
" s.textContent = await r.text();",
|
|
124
|
-
" document.head.appendChild(s);",
|
|
125
|
-
" await new Promise(resolve => setTimeout(resolve, 2000));",
|
|
126
|
-
" location.hash = 'figmacapture=CAPTURE_ID&figmaendpoint=https%3A%2F%2Fmcp.figma.com%2Fmcp%2Fcapture%2FCAPTURE_ID%2Fsubmit&figmadelay=3000';",
|
|
127
|
-
" })()",
|
|
128
|
-
" ```",
|
|
129
|
-
"",
|
|
130
|
-
`**${stepBase + 3}. Wait** 10 seconds for Figma to process the capture.`,
|
|
131
|
-
"",
|
|
132
|
-
`**${stepBase + 4}. Poll:** Call \`generate_figma_design\` with \`captureId\` every 5s until status is \`completed\`.`,
|
|
133
|
-
"",
|
|
134
|
-
].join("\n");
|
|
135
|
-
})
|
|
136
|
-
.join("\n");
|
|
137
|
-
const response = [
|
|
178
|
+
// Step 2: Build capture instructions for Figma MCP + Playwright MCP
|
|
179
|
+
const preamble = [
|
|
138
180
|
"# Push to Figma — Execute These Steps Now",
|
|
139
181
|
"",
|
|
140
|
-
|
|
182
|
+
pushStatuses.map((s) => `- ${s}`).join("\n"),
|
|
141
183
|
"",
|
|
142
184
|
"## CRITICAL: How to capture (read before starting)",
|
|
143
185
|
"",
|
|
@@ -154,12 +196,46 @@ export function handler(kit) {
|
|
|
154
196
|
"- **Figma MCP**: `claude mcp add --transport http figma https://mcp.figma.com/mcp`",
|
|
155
197
|
"- **Playwright MCP**: For `browser_resize`, `browser_navigate`, `browser_evaluate`",
|
|
156
198
|
"",
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
199
|
+
].join("\n");
|
|
200
|
+
let captureSection;
|
|
201
|
+
if (variants && variants.length > 0) {
|
|
202
|
+
// Multi-variant capture: each variant × each viewport
|
|
203
|
+
const totalCaptures = variants.length * resolvedViewports.length;
|
|
204
|
+
const variantNames = variants.map((v) => v.name).join(", ");
|
|
205
|
+
const sections = [
|
|
206
|
+
"## Capture Steps",
|
|
207
|
+
"",
|
|
208
|
+
`Capturing ${variants.length} variant(s) (${variantNames}) × ${resolvedViewports.length} viewport(s) (${resolvedViewports.join(", ")}) = ${totalCaptures} frame(s)`,
|
|
209
|
+
"",
|
|
210
|
+
];
|
|
211
|
+
let stepOffset = 0;
|
|
212
|
+
for (const variant of variants) {
|
|
213
|
+
const variantCaptureUrl = `${baseCaptureUrl}?variant=${encodeURIComponent(variant.name)}`;
|
|
214
|
+
const variantFrameName = resolvedViewports.length > 1
|
|
215
|
+
? `${resolvedName}/State=${variant.name}`
|
|
216
|
+
: `${resolvedName}/State=${variant.name}`;
|
|
217
|
+
sections.push(`## Variant: ${variant.name}`, "");
|
|
218
|
+
const { steps, nextOffset } = buildCaptureSteps(variantCaptureUrl, resolvedViewports, variantFrameName, resolvedFileKey, outputMode, stepOffset);
|
|
219
|
+
stepOffset = nextOffset;
|
|
220
|
+
sections.push(steps);
|
|
221
|
+
}
|
|
222
|
+
// Assembly instructions
|
|
223
|
+
sections.push("## Assemble as Component Set", "", "All variant frames have been captured. To combine them into a proper Figma component set with hover interactions:", "", "1. Open the **Layout** Figma plugin", "2. Go to the **Canvas** tab", "3. Click **Assemble Component Set**", `4. The plugin will find all frames matching \`${resolvedName}/State=*\` and combine them into a ComponentSet with a \`State\` variant property`, "5. Hover prototype interactions (Default <-> Hover) will be wired automatically");
|
|
224
|
+
captureSection = sections.join("\n");
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
// Single-code capture: backward-compatible behaviour
|
|
228
|
+
const { steps } = buildCaptureSteps(baseCaptureUrl, resolvedViewports, resolvedName, resolvedFileKey, outputMode, 0);
|
|
229
|
+
captureSection = [
|
|
230
|
+
"## Capture Steps",
|
|
231
|
+
"",
|
|
232
|
+
`Capturing ${resolvedViewports.length} viewport(s): ${resolvedViewports.join(", ")}`,
|
|
233
|
+
`Frame name: **${resolvedName}**`,
|
|
234
|
+
"",
|
|
235
|
+
steps,
|
|
236
|
+
].join("\n");
|
|
237
|
+
}
|
|
238
|
+
const reminders = [
|
|
163
239
|
"## Reminders",
|
|
164
240
|
"",
|
|
165
241
|
"- Each viewport needs its own captureId — never reuse",
|
|
@@ -167,6 +243,7 @@ export function handler(kit) {
|
|
|
167
243
|
"- Always call `browser_resize` BEFORE `browser_navigate` for correct responsive rendering",
|
|
168
244
|
"- When `generate_figma_design` returns capture instructions, IGNORE them — use the steps above",
|
|
169
245
|
].join("\n");
|
|
246
|
+
const response = [preamble, captureSection, "", reminders].join("\n");
|
|
170
247
|
return {
|
|
171
248
|
content: [{ type: "text", text: response }],
|
|
172
249
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push-to-figma.js","sourceRoot":"","sources":["../../../../src/mcp/tools/push-to-figma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,CAAC,MAAM,IAAI,GAAG,eAAe,CAAC;AAEpC,MAAM,CAAC,MAAM,WAAW,GACtB,sFAAsF;IACtF,4FAA4F;IAC5F,+FAA+F;IAC/F,qEAAqE,CAAC;AAExE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kEAAkE,CAAC;IAC7F,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,+DAA+D,CAAC;IAC5E,SAAS,EAAE,CAAC;SACT,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;SAC9C,QAAQ,EAAE;SACV,QAAQ,CAAC,gFAAgF,CAAC;IAC7F,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,8EAA8E;QAC9E,8EAA8E,CAC/E;CACJ,CAAC;AAEF,MAAM,aAAa,GAAG;IACpB,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IACrC,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IACpC,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;CAC3B,CAAC;AAEX,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC;AAE3C,
|
|
1
|
+
{"version":3,"file":"push-to-figma.js","sourceRoot":"","sources":["../../../../src/mcp/tools/push-to-figma.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/preview/server.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAgDD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,GAAE,MAAqB,EAC3B,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,GACtC,OAAO,CAAC,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/preview/server.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAgDD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,GAAE,MAAqB,EAC3B,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,GACtC,OAAO,CAAC,aAAa,CAAC,CAkFxB"}
|
|
@@ -89,24 +89,30 @@ export function startPreviewServer(port = PREVIEW_PORT, options = {}) {
|
|
|
89
89
|
}
|
|
90
90
|
// Standalone capture page — renders component without preview chrome.
|
|
91
91
|
// Used by Figma MCP's generate_figma_design to capture the component.
|
|
92
|
+
// Supports ?variant=Name to capture a specific named variant.
|
|
92
93
|
if (req.method === "GET" && url === "/capture") {
|
|
93
|
-
const
|
|
94
|
-
|
|
94
|
+
const variantParam = parsedUrl.searchParams.get("variant");
|
|
95
|
+
const preview = variantParam
|
|
96
|
+
? getVariantPreview(variantParam)
|
|
97
|
+
: getLastPreview();
|
|
98
|
+
if (!preview) {
|
|
95
99
|
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
96
|
-
res.end(
|
|
100
|
+
res.end(variantParam
|
|
101
|
+
? `No preview found for variant "${variantParam}". Send code via the preview tool first.`
|
|
102
|
+
: "No component previewed yet. Send code via the preview tool first.");
|
|
97
103
|
return;
|
|
98
104
|
}
|
|
99
105
|
res.writeHead(200, {
|
|
100
106
|
"Content-Type": "text/html; charset=utf-8",
|
|
101
107
|
"Cache-Control": "no-cache",
|
|
102
108
|
});
|
|
103
|
-
res.end(buildCaptureHtml(
|
|
109
|
+
res.end(buildCaptureHtml(preview.compiledJs));
|
|
104
110
|
return;
|
|
105
111
|
}
|
|
106
112
|
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
107
113
|
res.end("Not Found");
|
|
108
114
|
});
|
|
109
|
-
const { broadcast, getLastPreview } = createWsServer(server);
|
|
115
|
+
const { broadcast, getLastPreview, getVariantPreview } = createWsServer(server);
|
|
110
116
|
server.on("error", (err) => {
|
|
111
117
|
if (err.code === "EADDRINUSE") {
|
|
112
118
|
reject(new Error(`Port ${port} is already in use. Stop the other process or use a different port.`));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/preview/server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE/D,sFAAsF;AACtF,SAAS,eAAe;IACtB,yEAAyE;IACzE,gEAAgE;IAChE,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,YAAY,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,CAAC;KACrE,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACb,iDAAiD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzE,CAAC;AACJ,CAAC;AAQD;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,UAAkB;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;SACzC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;SACxB,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAE5B,OAAO;QACL,iBAAiB;QACjB,cAAc;QACd,0BAA0B;QAC1B,0EAA0E;QAC1E,mFAAmF;QACnF,4FAA4F;QAC5F,oGAAoG;QACpG,qDAAqD;QACrD,oCAAoC;QACpC,eAAe;QACf,uBAAuB;QACvB,UAAU;QACV,OAAO;QACP,qBAAqB;QACrB,sCAAsC;QACtC,4BAA4B;QAC5B,6DAA6D;QAC7D,sGAAsG;QACtG,iDAAiD;QACjD,KAAK;QACL,6CAA6C;QAC7C,oBAAoB,GAAG,SAAS,GAAG,GAAG;QACtC,iCAAiC;QACjC,6DAA6D;QAC7D,0CAA0C;QAC1C,kGAAkG;QAClG,KAAK;QACL,cAAc;QACd,4DAA4D;QAC5D,GAAG;QACH,WAAW;QACX,gBAAgB;KACjB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAe,YAAY,EAC3B,UAAqC,EAAE;IAEvC,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAEvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;QACnC,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC5C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,oBAAoB,IAAI,EAAE,CAAC,CAAC;YACtE,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC;YAE/B,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;gBACxD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;oBACjB,cAAc,EAAE,0BAA0B;oBAC1C,eAAe,EAAE,UAAU;iBAC5B,CAAC,CAAC;gBACH,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,sEAAsE;YACtE,sEAAsE;YACtE,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;gBAC/C,MAAM,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/preview/server.ts"],"names":[],"mappings":"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"}
|
package/dist/src/preview/ws.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../../src/preview/ws.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAIlC,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,cAAc,EAAE,MAAM;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../../src/preview/ws.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAIlC,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,cAAc,EAAE,MAAM;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAClE,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAClF;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,aAAa,CAqFjE"}
|
package/dist/src/preview/ws.js
CHANGED
|
@@ -14,6 +14,7 @@ export function createWsServer(server) {
|
|
|
14
14
|
});
|
|
15
15
|
const clients = new Set();
|
|
16
16
|
let lastPreview = null;
|
|
17
|
+
const variantPreviews = new Map();
|
|
17
18
|
wss.on("connection", (ws) => {
|
|
18
19
|
clients.add(ws);
|
|
19
20
|
ws.on("message", (data) => {
|
|
@@ -34,6 +35,10 @@ export function createWsServer(server) {
|
|
|
34
35
|
}
|
|
35
36
|
compiledJs = result.js;
|
|
36
37
|
}
|
|
38
|
+
// Store in variant map if a variantName was provided
|
|
39
|
+
if (msg.variantName) {
|
|
40
|
+
variantPreviews.set(msg.variantName, { code: msg.code, compiledJs });
|
|
41
|
+
}
|
|
37
42
|
// Broadcast to all OTHER clients (the preview page)
|
|
38
43
|
broadcast(msg.code, compiledJs);
|
|
39
44
|
// Acknowledge so the sender knows the preview is ready
|
|
@@ -63,6 +68,9 @@ export function createWsServer(server) {
|
|
|
63
68
|
function getLastPreview() {
|
|
64
69
|
return lastPreview;
|
|
65
70
|
}
|
|
66
|
-
|
|
71
|
+
function getVariantPreview(variantName) {
|
|
72
|
+
return variantPreviews.get(variantName) ?? null;
|
|
73
|
+
}
|
|
74
|
+
return { broadcast, getLastPreview, getVariantPreview };
|
|
67
75
|
}
|
|
68
76
|
//# sourceMappingURL=ws.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws.js","sourceRoot":"","sources":["../../../src/preview/ws.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAkB,MAAM,IAAI,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"ws.js","sourceRoot":"","sources":["../../../src/preview/ws.ts"],"names":[],"mappings":"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"}
|