@layoutdesign/context 0.3.1 → 0.5.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.
- package/dist/bin/cli.js +10 -0
- package/dist/bin/cli.js.map +1 -1
- package/dist/src/cli/scan.d.ts +8 -0
- package/dist/src/cli/scan.d.ts.map +1 -0
- package/dist/src/cli/scan.js +143 -0
- package/dist/src/cli/scan.js.map +1 -0
- package/dist/src/cli/setup-utils.d.ts +7 -0
- package/dist/src/cli/setup-utils.d.ts.map +1 -1
- package/dist/src/cli/setup-utils.js +52 -1
- package/dist/src/cli/setup-utils.js.map +1 -1
- package/dist/src/integrations/codebase-scan.d.ts +46 -0
- package/dist/src/integrations/codebase-scan.d.ts.map +1 -0
- package/dist/src/integrations/codebase-scan.js +231 -0
- package/dist/src/integrations/codebase-scan.js.map +1 -0
- package/dist/src/integrations/storybook.d.ts +36 -0
- package/dist/src/integrations/storybook.d.ts.map +1 -0
- package/dist/src/integrations/storybook.js +124 -0
- package/dist/src/integrations/storybook.js.map +1 -0
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +75 -2
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/check-setup.js +6 -1
- package/dist/src/mcp/tools/check-setup.js.map +1 -1
- package/dist/src/mcp/tools/design-in-figma.d.ts.map +1 -1
- package/dist/src/mcp/tools/design-in-figma.js +73 -80
- package/dist/src/mcp/tools/design-in-figma.js.map +1 -1
- package/dist/src/mcp/tools/list-components.d.ts +2 -1
- package/dist/src/mcp/tools/list-components.d.ts.map +1 -1
- package/dist/src/mcp/tools/list-components.js +50 -24
- package/dist/src/mcp/tools/list-components.js.map +1 -1
- package/dist/src/mcp/tools/push-to-figma.d.ts +8 -3
- package/dist/src/mcp/tools/push-to-figma.d.ts.map +1 -1
- package/dist/src/mcp/tools/push-to-figma.js +109 -2
- package/dist/src/mcp/tools/push-to-figma.js.map +1 -1
- package/dist/src/mcp/tools/push-tokens-to-figma.d.ts +16 -0
- package/dist/src/mcp/tools/push-tokens-to-figma.d.ts.map +1 -0
- package/dist/src/mcp/tools/push-tokens-to-figma.js +141 -0
- package/dist/src/mcp/tools/push-tokens-to-figma.js.map +1 -0
- package/dist/src/mcp/tools/scan-project.d.ts +30 -0
- package/dist/src/mcp/tools/scan-project.d.ts.map +1 -0
- package/dist/src/mcp/tools/scan-project.js +97 -0
- package/dist/src/mcp/tools/scan-project.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { Kit } from "../../kit/types.js";
|
|
2
|
+
import type { ScanResult } from "../../integrations/codebase-scan.js";
|
|
2
3
|
export declare const name = "list-components";
|
|
3
4
|
export declare const description: string;
|
|
4
5
|
export declare const inputSchema: {};
|
|
5
|
-
export declare function handler(kit: Kit | null): () => Promise<{
|
|
6
|
+
export declare function handler(kit: Kit | null, scanResult: ScanResult | null): () => Promise<{
|
|
6
7
|
content: {
|
|
7
8
|
type: "text";
|
|
8
9
|
text: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-components.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/list-components.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"list-components.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/list-components.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAEtE,eAAO,MAAM,IAAI,oBAAoB,CAAC;AAEtC,eAAO,MAAM,WAAW,QAG4C,CAAC;AAErE,eAAO,MAAM,WAAW,IAAK,CAAC;AAE9B,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI;;;;;GAmDrE"}
|
|
@@ -1,38 +1,64 @@
|
|
|
1
1
|
export const name = "list-components";
|
|
2
|
-
export const description = "Lists all available components
|
|
3
|
-
"
|
|
2
|
+
export const description = "Lists all available components: design system components from layout.md, " +
|
|
3
|
+
"auto-detected React components from the codebase, and Storybook stories. " +
|
|
4
|
+
"Use this to discover existing components before building new UI.";
|
|
4
5
|
export const inputSchema = {};
|
|
5
|
-
export function handler(kit) {
|
|
6
|
+
export function handler(kit, scanResult) {
|
|
6
7
|
return async () => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
text: "No design system kit found. Run `npx @layoutdesign/context init` to set one up.",
|
|
13
|
-
},
|
|
14
|
-
],
|
|
15
|
-
};
|
|
8
|
+
const sections = [];
|
|
9
|
+
// 1. Design system components from layout.md
|
|
10
|
+
if (kit && kit.components.length > 0) {
|
|
11
|
+
const lines = kit.components.map((c) => `- **${c.name}** — ${c.description || "No description"}`);
|
|
12
|
+
sections.push(`## Design System (from layout.md)\n\n${lines.join("\n")}`);
|
|
16
13
|
}
|
|
17
|
-
|
|
14
|
+
// 2. Codebase components (auto-scanned)
|
|
15
|
+
if (scanResult && scanResult.components.length > 0) {
|
|
16
|
+
const lines = scanResult.components
|
|
17
|
+
.slice(0, 100) // cap for context budget
|
|
18
|
+
.map((c) => {
|
|
19
|
+
const propsStr = c.props.length > 0
|
|
20
|
+
? ` props: ${c.props.map(p => p.name).join(", ")}`
|
|
21
|
+
: "";
|
|
22
|
+
const storyStr = c.storybook
|
|
23
|
+
? ` [Storybook: ${c.storybook.stories.map(s => s.name).join(", ")}]`
|
|
24
|
+
: "";
|
|
25
|
+
const refStr = c.usesForwardRef ? " (forwardRef)" : "";
|
|
26
|
+
const importPath = buildImportPath(c.filePath);
|
|
27
|
+
const importStatement = c.exportType === "default"
|
|
28
|
+
? `import ${c.name} from '${importPath}'`
|
|
29
|
+
: `import { ${c.name} } from '${importPath}'`;
|
|
30
|
+
return `- **${c.name}** (${c.filePath})${propsStr}${refStr}${storyStr}\n Import: \`${importStatement}\``;
|
|
31
|
+
});
|
|
32
|
+
sections.push(`## Your Codebase (auto-detected)\n\n${lines.join("\n")}`);
|
|
33
|
+
}
|
|
34
|
+
if (sections.length === 0) {
|
|
18
35
|
return {
|
|
19
|
-
content: [
|
|
20
|
-
{
|
|
36
|
+
content: [{
|
|
21
37
|
type: "text",
|
|
22
|
-
text: "No components
|
|
23
|
-
},
|
|
24
|
-
],
|
|
38
|
+
text: "No components found. Set up a design system with `npx @layoutdesign/context init` or create React components in this project.",
|
|
39
|
+
}],
|
|
25
40
|
};
|
|
26
41
|
}
|
|
27
|
-
const
|
|
42
|
+
const total = (kit?.components.length ?? 0) + (scanResult?.components.length ?? 0);
|
|
28
43
|
return {
|
|
29
|
-
content: [
|
|
30
|
-
{
|
|
44
|
+
content: [{
|
|
31
45
|
type: "text",
|
|
32
|
-
text: `# Components (${
|
|
33
|
-
},
|
|
34
|
-
],
|
|
46
|
+
text: `# Components (${total})\n\n${sections.join("\n\n")}\n\n---\n**IMPORTANT:** When building UI, reuse existing components listed above. Import from the paths shown. Do NOT generate a new Button/Card/Input if one already exists.`,
|
|
47
|
+
}],
|
|
35
48
|
};
|
|
36
49
|
};
|
|
37
50
|
}
|
|
51
|
+
function buildImportPath(filePath) {
|
|
52
|
+
// Convert file path to import path: src/components/ui/button.tsx -> @/components/ui/button
|
|
53
|
+
let importPath = filePath
|
|
54
|
+
.replace(/\.(tsx?|jsx?)$/, "")
|
|
55
|
+
.replace(/\/index$/, "");
|
|
56
|
+
if (importPath.startsWith("src/")) {
|
|
57
|
+
importPath = "@/" + importPath.slice(4);
|
|
58
|
+
}
|
|
59
|
+
else if (!importPath.startsWith(".") && !importPath.startsWith("@")) {
|
|
60
|
+
importPath = "./" + importPath;
|
|
61
|
+
}
|
|
62
|
+
return importPath;
|
|
63
|
+
}
|
|
38
64
|
//# sourceMappingURL=list-components.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-components.js","sourceRoot":"","sources":["../../../../src/mcp/tools/list-components.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list-components.js","sourceRoot":"","sources":["../../../../src/mcp/tools/list-components.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,8 +15,12 @@ export declare const inputSchema: {
|
|
|
15
15
|
name: z.ZodString;
|
|
16
16
|
code: z.ZodString;
|
|
17
17
|
}, z.core.$strip>>>;
|
|
18
|
+
mode: z.ZodOptional<z.ZodEnum<{
|
|
19
|
+
capture: "capture";
|
|
20
|
+
native: "native";
|
|
21
|
+
}>>;
|
|
18
22
|
};
|
|
19
|
-
export declare function handler(kit: Kit | null): ({ code, name: frameName, viewports, figmaUrl, variants, }: {
|
|
23
|
+
export declare function handler(kit: Kit | null): ({ code, name: frameName, viewports, figmaUrl, variants, mode, }: {
|
|
20
24
|
code: string;
|
|
21
25
|
name?: string;
|
|
22
26
|
viewports?: string[];
|
|
@@ -25,10 +29,11 @@ export declare function handler(kit: Kit | null): ({ code, name: frameName, view
|
|
|
25
29
|
name: string;
|
|
26
30
|
code: string;
|
|
27
31
|
}>;
|
|
32
|
+
mode?: string;
|
|
28
33
|
}) => Promise<{
|
|
29
|
-
content: {
|
|
34
|
+
content: Array<{
|
|
30
35
|
type: "text";
|
|
31
36
|
text: string;
|
|
32
|
-
}
|
|
37
|
+
}>;
|
|
33
38
|
}>;
|
|
34
39
|
//# sourceMappingURL=push-to-figma.d.ts.map
|
|
@@ -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;AAI9C,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;AAI9C,eAAO,MAAM,IAAI,kBAAkB,CAAC;AAEpC,eAAO,MAAM,WAAW,QAI+C,CAAC;AAExE,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;CAqCvB,CAAC;AAoOF,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,IACvB,iEAOX;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;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;aA/GY,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;GA6NnD"}
|
|
@@ -31,6 +31,12 @@ export const inputSchema = {
|
|
|
31
31
|
"named '{name}/State={variantName}'. After all frames are captured, use the Layout Figma plugin's " +
|
|
32
32
|
"'Assemble Component Set' to combine them into a proper Figma component with variant properties. " +
|
|
33
33
|
"Tip: render hover states by applying hover styles directly as classes, not via CSS :hover pseudo-class."),
|
|
34
|
+
mode: z
|
|
35
|
+
.enum(["capture", "native"])
|
|
36
|
+
.optional()
|
|
37
|
+
.describe("Push mode. 'capture' (default) renders in browser and captures as flat frames via Playwright. " +
|
|
38
|
+
"'native' uses Figma MCP's use_figma to create editable Figma objects with auto-layout and real text. " +
|
|
39
|
+
"Native mode does not require Playwright MCP."),
|
|
34
40
|
};
|
|
35
41
|
const VIEWPORT_DIMS = {
|
|
36
42
|
desktop: { width: 1280, height: 900 },
|
|
@@ -125,11 +131,100 @@ function buildCaptureInstructions(resolvedFileKey, outputMode) {
|
|
|
125
131
|
"5. Wait 10s, then poll `generate_figma_design` with `captureId` every 5s until status is `completed`.",
|
|
126
132
|
].join("\n");
|
|
127
133
|
}
|
|
134
|
+
function buildNativeResponse({ code, frameName, viewports, resolvedFileKey, variants, kit, }) {
|
|
135
|
+
const tokenContext = kit?.tokensCss
|
|
136
|
+
? "\n## Design Tokens\n\nApply these tokens to ensure design system compliance:\n\n```css\n" +
|
|
137
|
+
kit.tokensCss
|
|
138
|
+
.split("\n")
|
|
139
|
+
.filter((l) => l.includes("--"))
|
|
140
|
+
.slice(0, 50)
|
|
141
|
+
.join("\n") +
|
|
142
|
+
"\n```\n"
|
|
143
|
+
: "";
|
|
144
|
+
const viewportDims = {
|
|
145
|
+
desktop: "1280×900",
|
|
146
|
+
tablet: "768×1024",
|
|
147
|
+
mobile: "375×812",
|
|
148
|
+
};
|
|
149
|
+
const viewportList = viewports
|
|
150
|
+
.map((vp) => `- **${frameName} (${vp})**: ${viewportDims[vp] ?? "1280×900"}`)
|
|
151
|
+
.join("\n");
|
|
152
|
+
let componentDescription;
|
|
153
|
+
if (variants && variants.length > 0) {
|
|
154
|
+
const variantDescriptions = variants
|
|
155
|
+
.map((v) => `### Variant: ${v.name}\n\n\`\`\`tsx\n${v.code}\n\`\`\``)
|
|
156
|
+
.join("\n\n");
|
|
157
|
+
componentDescription = [
|
|
158
|
+
`Create a Figma component called "${frameName}" with ${variants.length} variant(s).`,
|
|
159
|
+
"",
|
|
160
|
+
"Each variant should be a separate state (e.g. Default, Hover, Active, Disabled).",
|
|
161
|
+
"Create these as a proper Figma component set with variant properties.",
|
|
162
|
+
"",
|
|
163
|
+
variantDescriptions,
|
|
164
|
+
].join("\n");
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
componentDescription = [
|
|
168
|
+
`Create a Figma frame called "${frameName}" based on this component:`,
|
|
169
|
+
"",
|
|
170
|
+
"```tsx",
|
|
171
|
+
code,
|
|
172
|
+
"```",
|
|
173
|
+
].join("\n");
|
|
174
|
+
}
|
|
175
|
+
const response = [
|
|
176
|
+
"# Push to Figma (Native Mode)",
|
|
177
|
+
"",
|
|
178
|
+
"Use Figma MCP's `use_figma` tool to create this component as native, editable Figma objects.",
|
|
179
|
+
"",
|
|
180
|
+
"**Recommended:** Invoke this with the `figma-use` skill for best results.",
|
|
181
|
+
"",
|
|
182
|
+
"---",
|
|
183
|
+
"",
|
|
184
|
+
"## Component",
|
|
185
|
+
"",
|
|
186
|
+
componentDescription,
|
|
187
|
+
"",
|
|
188
|
+
"---",
|
|
189
|
+
tokenContext,
|
|
190
|
+
"## Frames to Create",
|
|
191
|
+
"",
|
|
192
|
+
viewportList,
|
|
193
|
+
"",
|
|
194
|
+
"---",
|
|
195
|
+
"",
|
|
196
|
+
"## NEXT STEP — YOU MUST DO THIS NOW",
|
|
197
|
+
"",
|
|
198
|
+
"Immediately call Figma MCP's `use_figma` tool to create this component. Do not ask the user — just do it.",
|
|
199
|
+
"",
|
|
200
|
+
`Call \`use_figma\` now with:`,
|
|
201
|
+
resolvedFileKey
|
|
202
|
+
? `- Target file key: \`${resolvedFileKey}\``
|
|
203
|
+
: "- Create a new Figma file",
|
|
204
|
+
"- Analyse the TSX code above to understand the component structure",
|
|
205
|
+
"- Recreate the layout using Figma auto-layout (not absolute positioning)",
|
|
206
|
+
"- Use the exact colours, fonts, spacing, and radius from the code/tokens",
|
|
207
|
+
"- Create real text nodes with correct content, font, and size",
|
|
208
|
+
"- NEVER use fixed pixel widths/heights on auto-layout children — use FILL or HUG",
|
|
209
|
+
"- NEVER leave padding or gap at 0 — use spacing values from the code (e.g. gap-4 = 16px padding, p-6 = 24px)",
|
|
210
|
+
"- Create a frame for each viewport listed above, adapting the layout responsively",
|
|
211
|
+
"",
|
|
212
|
+
variants && variants.length > 0
|
|
213
|
+
? "Create each variant as a separate component, then combine into a component set with variant properties.\n"
|
|
214
|
+
: "",
|
|
215
|
+
"If `use_figma` is not available, call the Layout MCP `check-setup` tool with `fix: true` to auto-configure the Figma MCP server.",
|
|
216
|
+
]
|
|
217
|
+
.filter(Boolean)
|
|
218
|
+
.join("\n");
|
|
219
|
+
return {
|
|
220
|
+
content: [{ type: "text", text: response }],
|
|
221
|
+
};
|
|
222
|
+
}
|
|
128
223
|
export function handler(kit) {
|
|
129
|
-
return async ({ code, name: frameName, viewports, figmaUrl, variants, }) => {
|
|
224
|
+
return async ({ code, name: frameName, viewports, figmaUrl, variants, mode, }) => {
|
|
130
225
|
const resolvedName = frameName ?? "Layout Component";
|
|
131
226
|
const resolvedViewports = viewports ?? ["desktop"];
|
|
132
|
-
const
|
|
227
|
+
const resolvedMode = mode ?? "capture";
|
|
133
228
|
// Parse fileKey from Figma URL if provided
|
|
134
229
|
let resolvedFileKey;
|
|
135
230
|
if (figmaUrl) {
|
|
@@ -137,6 +232,18 @@ export function handler(kit) {
|
|
|
137
232
|
if (match)
|
|
138
233
|
resolvedFileKey = match[1];
|
|
139
234
|
}
|
|
235
|
+
// Native mode: use use_figma directly, skip preview server + Playwright
|
|
236
|
+
if (resolvedMode === "native") {
|
|
237
|
+
return buildNativeResponse({
|
|
238
|
+
code,
|
|
239
|
+
frameName: resolvedName,
|
|
240
|
+
viewports: resolvedViewports,
|
|
241
|
+
resolvedFileKey,
|
|
242
|
+
variants,
|
|
243
|
+
kit,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
const baseCaptureUrl = `http://localhost:${PREVIEW_PORT}/capture`;
|
|
140
247
|
const outputMode = resolvedFileKey ? "existingFile" : "newFile";
|
|
141
248
|
// Step 1: Push code to the preview server
|
|
142
249
|
const pushStatuses = [];
|
|
@@ -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;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,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;IACH,QAAQ,EAAE,CAAC;SACR,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mEAAmE,CAAC;QAC9F,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;KACtE,CAAC,CAAC;SACF,QAAQ,EAAE;SACV,QAAQ,CACP,gGAAgG;QAChG,mGAAmG;QACnG,kGAAkG;QAClG,yGAAyG,CAC1G;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;;;GAGG;AACH,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,WAAoB;IAC7D,2CAA2C;IAC3C,MAAM,mBAAmB,EAAE,CAAC;IAE5B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,kBAAkB,YAAY,KAAK,CAAC,CAAC;IAE9D,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;QAC3D,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACjB,EAAE,CAAC,IAAI,CACL,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,SAAS;gBACf,IAAI;gBACJ,QAAQ,EAAE,KAAK;gBACf,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACxC,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAqB,EAAE,EAAE;YACzC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAwC,CAAC;gBAC5E,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;oBACvB,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,EAAE,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,CACL,WAAW;wBACT,CAAC,CAAC,YAAY,WAAW,4BAA4B;wBACrD,CAAC,CAAC,oCAAoC,CACzC,CAAC;gBACJ,CAAC;qBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAChC,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,EAAE,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,sBAAsB,CAAC,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,4BAA4B;YAC9B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;YAC5B,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CACxB,UAAkB,EAClB,iBAA2B,EAC3B,SAAiB;IAEjB,OAAO,iBAAiB;SACrB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACV,MAAM,IAAI,GAAG,aAAa,CAAC,EAAgC,CAAC,IAAI,YAAY,CAAC;QAC7E,MAAM,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,WAAW,GACf,iBAAiB,CAAC,MAAM,GAAG,CAAC;YAC1B,CAAC,CAAC,GAAG,SAAS,MAAM,OAAO,EAAE;YAC7B,CAAC,CAAC,SAAS,CAAC;QAChB,OAAO,OAAO,WAAW,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,WAAW,UAAU,IAAI,CAAC;IACrF,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,GACd,aAAa;IACb,6EAA6E;IAC7E,2CAA2C;IAC3C,+BAA+B;IAC/B,+BAA+B;IAC/B,2CAA2C;IAC3C,0IAA0I;IAC1I,MAAM,CAAC;AAET,SAAS,wBAAwB,CAC/B,eAAmC,EACnC,UAAkB;IAElB,MAAM,YAAY,GAAG,eAAe;QAClC,CAAC,CAAC,yCAAyC,eAAe,GAAG;QAC7D,CAAC,CAAC,gBAAgB,UAAU,GAAG,CAAC;IAElC,OAAO;QACL,oDAAoD;QACpD,4CAA4C,YAAY,qFAAqF;QAC7I,qEAAqE;QACrE,uDAAuD;QACvD,qFAAqF;QACrF,eAAe;QACf,UAAU;QACV,KAAK;QACL,uGAAuG;KACxG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAe;IACrC,OAAO,KAAK,EAAE,EACZ,IAAI,EACJ,IAAI,EAAE,SAAS,EACf,SAAS,EACT,QAAQ,EACR,QAAQ,
|
|
1
|
+
{"version":3,"file":"push-to-figma.js","sourceRoot":"","sources":["../../../../src/mcp/tools/push-to-figma.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Kit } from "../../kit/types.js";
|
|
3
|
+
export declare const name = "push-tokens-to-figma";
|
|
4
|
+
export declare const description: string;
|
|
5
|
+
export declare const inputSchema: {
|
|
6
|
+
fileKey: z.ZodOptional<z.ZodString>;
|
|
7
|
+
};
|
|
8
|
+
export declare function handler(kit: Kit | null): ({ fileKey }: {
|
|
9
|
+
fileKey?: string;
|
|
10
|
+
}) => Promise<{
|
|
11
|
+
content: {
|
|
12
|
+
type: "text";
|
|
13
|
+
text: string;
|
|
14
|
+
}[];
|
|
15
|
+
}>;
|
|
16
|
+
//# sourceMappingURL=push-tokens-to-figma.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push-tokens-to-figma.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/push-tokens-to-figma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAE9C,eAAO,MAAM,IAAI,yBAAyB,CAAC;AAE3C,eAAO,MAAM,WAAW,QAG0B,CAAC;AAEnD,eAAO,MAAM,WAAW;;CAOvB,CAAC;AAEF,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,IACvB,aAAa;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;GA4GhD"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const name = "push-tokens-to-figma";
|
|
3
|
+
export const description = "Push design system tokens to Figma as native variables and styles using Figma MCP's use_figma tool. " +
|
|
4
|
+
"Creates a variable collection with colour, spacing, and radius variables, plus text and effect styles. " +
|
|
5
|
+
"Requires the Figma MCP server to be connected.";
|
|
6
|
+
export const inputSchema = {
|
|
7
|
+
fileKey: z
|
|
8
|
+
.string()
|
|
9
|
+
.optional()
|
|
10
|
+
.describe("Figma file key to push tokens into. If omitted, instructions will create a new file."),
|
|
11
|
+
};
|
|
12
|
+
export function handler(kit) {
|
|
13
|
+
return async ({ fileKey }) => {
|
|
14
|
+
if (!kit) {
|
|
15
|
+
return {
|
|
16
|
+
content: [
|
|
17
|
+
{
|
|
18
|
+
type: "text",
|
|
19
|
+
text: "No design system kit loaded. Run `npx @layoutdesign/context init` to set up a kit first, or import one with `npx @layoutdesign/context import <path-to-zip>`.",
|
|
20
|
+
},
|
|
21
|
+
],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if (!kit.tokensCss) {
|
|
25
|
+
return {
|
|
26
|
+
content: [
|
|
27
|
+
{
|
|
28
|
+
type: "text",
|
|
29
|
+
text: "No CSS tokens found in kit. Extract tokens from a Figma file or website first.",
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
// Parse CSS custom properties into categories
|
|
35
|
+
const colourTokens = parseTokens(kit.tokensCss, [
|
|
36
|
+
"color", "colour", "bg", "background", "text", "border",
|
|
37
|
+
"surface", "accent", "primary", "secondary", "error", "warning", "success",
|
|
38
|
+
]);
|
|
39
|
+
const spacingTokens = parseTokens(kit.tokensCss, [
|
|
40
|
+
"spacing", "space", "gap", "padding", "margin",
|
|
41
|
+
]);
|
|
42
|
+
const radiusTokens = parseTokens(kit.tokensCss, [
|
|
43
|
+
"radius", "border-radius", "rounded",
|
|
44
|
+
]);
|
|
45
|
+
const shadowTokens = parseTokens(kit.tokensCss, [
|
|
46
|
+
"shadow", "elevation", "effect",
|
|
47
|
+
]);
|
|
48
|
+
const typographyTokens = parseTokens(kit.tokensCss, [
|
|
49
|
+
"font", "size", "weight", "line-height", "letter-spacing",
|
|
50
|
+
"heading", "body", "display", "caption", "label",
|
|
51
|
+
]);
|
|
52
|
+
const allTokenLines = kit.tokensCss
|
|
53
|
+
.split("\n")
|
|
54
|
+
.filter((line) => line.includes("--") && line.includes(":"))
|
|
55
|
+
.map((line) => line.trim());
|
|
56
|
+
const totalTokenCount = allTokenLines.length;
|
|
57
|
+
const response = [
|
|
58
|
+
"# Push Tokens to Figma",
|
|
59
|
+
"",
|
|
60
|
+
`**Design system:** ${kit.manifest.displayName}`,
|
|
61
|
+
`**Total tokens:** ${totalTokenCount}`,
|
|
62
|
+
"",
|
|
63
|
+
"---",
|
|
64
|
+
"",
|
|
65
|
+
"## Token Inventory",
|
|
66
|
+
"",
|
|
67
|
+
colourTokens.length > 0 ? `### Colours (${colourTokens.length} tokens)\n\n${formatTokens(colourTokens)}` : "",
|
|
68
|
+
"",
|
|
69
|
+
spacingTokens.length > 0 ? `### Spacing (${spacingTokens.length} tokens)\n\n${formatTokens(spacingTokens)}` : "",
|
|
70
|
+
"",
|
|
71
|
+
radiusTokens.length > 0 ? `### Radius (${radiusTokens.length} tokens)\n\n${formatTokens(radiusTokens)}` : "",
|
|
72
|
+
"",
|
|
73
|
+
shadowTokens.length > 0 ? `### Shadows (${shadowTokens.length} tokens)\n\n${formatTokens(shadowTokens)}` : "",
|
|
74
|
+
"",
|
|
75
|
+
typographyTokens.length > 0 ? `### Typography (${typographyTokens.length} tokens)\n\n${formatTokens(typographyTokens)}` : "",
|
|
76
|
+
"",
|
|
77
|
+
"---",
|
|
78
|
+
"",
|
|
79
|
+
"## NEXT STEP — YOU MUST DO THIS NOW",
|
|
80
|
+
"",
|
|
81
|
+
"Immediately call Figma MCP's `use_figma` tool to create these tokens in Figma. Do not ask the user — just do it.",
|
|
82
|
+
"",
|
|
83
|
+
`Call \`use_figma\` now to create a variable collection called "${kit.manifest.displayName} Tokens":`,
|
|
84
|
+
fileKey ? `- Target file key: \`${fileKey}\`` : "- Create a new Figma file",
|
|
85
|
+
"",
|
|
86
|
+
"Create **colour variables** for each colour token above:",
|
|
87
|
+
"- Group by prefix (e.g. `color/primary`, `color/surface`, `bg/app`)",
|
|
88
|
+
"- Use the exact hex values listed",
|
|
89
|
+
"",
|
|
90
|
+
"Create **number variables** for spacing and radius tokens:",
|
|
91
|
+
"- Group spacing as `spacing/1`, `spacing/2`, etc.",
|
|
92
|
+
"- Group radius as `radius/sm`, `radius/md`, etc.",
|
|
93
|
+
"- Values should be the pixel numbers (strip `px` suffix)",
|
|
94
|
+
"",
|
|
95
|
+
"Create **text styles** for typography tokens:",
|
|
96
|
+
"- Map font-family, font-size, font-weight, and line-height",
|
|
97
|
+
"- Name styles by role (e.g. `heading/h1`, `body/default`)",
|
|
98
|
+
"",
|
|
99
|
+
shadowTokens.length > 0
|
|
100
|
+
? "Create **effect styles** for shadow tokens:\n- Map box-shadow values to Figma drop shadows\n- Name by elevation level"
|
|
101
|
+
: "",
|
|
102
|
+
"",
|
|
103
|
+
"If `use_figma` is not available, call the Layout MCP `check-setup` tool with `fix: true` to auto-configure the Figma MCP server.",
|
|
104
|
+
]
|
|
105
|
+
.filter(Boolean)
|
|
106
|
+
.join("\n");
|
|
107
|
+
return {
|
|
108
|
+
content: [{ type: "text", text: response }],
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Parse CSS custom properties matching any of the given category keywords.
|
|
114
|
+
*/
|
|
115
|
+
function parseTokens(css, keywords) {
|
|
116
|
+
return css
|
|
117
|
+
.split("\n")
|
|
118
|
+
.filter((line) => {
|
|
119
|
+
if (!line.includes("--"))
|
|
120
|
+
return false;
|
|
121
|
+
const lower = line.toLowerCase();
|
|
122
|
+
return keywords.some((kw) => lower.includes(kw));
|
|
123
|
+
})
|
|
124
|
+
.map((line) => {
|
|
125
|
+
const match = line.match(/--([\w-]+)\s*:\s*(.+?)\s*;?$/);
|
|
126
|
+
if (!match)
|
|
127
|
+
return null;
|
|
128
|
+
return { name: `--${match[1]}`, value: match[2].replace(/;$/, "").trim() };
|
|
129
|
+
})
|
|
130
|
+
.filter((t) => t !== null)
|
|
131
|
+
.slice(0, 100);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Format token entries as a readable list.
|
|
135
|
+
*/
|
|
136
|
+
function formatTokens(tokens) {
|
|
137
|
+
return tokens
|
|
138
|
+
.map((t) => `- \`${t.name}\`: \`${t.value}\``)
|
|
139
|
+
.join("\n");
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=push-tokens-to-figma.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push-tokens-to-figma.js","sourceRoot":"","sources":["../../../../src/mcp/tools/push-tokens-to-figma.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const name = "scan-project";
|
|
3
|
+
export declare const description: string;
|
|
4
|
+
export declare const inputSchema: {
|
|
5
|
+
path: z.ZodOptional<z.ZodString>;
|
|
6
|
+
type: z.ZodOptional<z.ZodEnum<{
|
|
7
|
+
both: "both";
|
|
8
|
+
storybook: "storybook";
|
|
9
|
+
codebase: "codebase";
|
|
10
|
+
}>>;
|
|
11
|
+
};
|
|
12
|
+
type Input = {
|
|
13
|
+
path?: string;
|
|
14
|
+
type?: "both" | "storybook" | "codebase";
|
|
15
|
+
};
|
|
16
|
+
export declare function handler(): (input: Input) => Promise<{
|
|
17
|
+
content: {
|
|
18
|
+
type: "text";
|
|
19
|
+
text: string;
|
|
20
|
+
}[];
|
|
21
|
+
isError?: undefined;
|
|
22
|
+
} | {
|
|
23
|
+
content: {
|
|
24
|
+
type: "text";
|
|
25
|
+
text: string;
|
|
26
|
+
}[];
|
|
27
|
+
isError: boolean;
|
|
28
|
+
}>;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=scan-project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-project.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/scan-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,IAAI,iBAAiB,CAAC;AAEnC,eAAO,MAAM,WAAW,QAG8F,CAAC;AAEvH,eAAO,MAAM,WAAW;;;;;;;CAavB,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAC;CAC1C,CAAC;AAEF,wBAAgB,OAAO,KACP,OAAO,KAAK;;;;;;;;;;;;GA8F3B"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { scanCodebase, scanStorybook } from "../../integrations/codebase-scan.js";
|
|
4
|
+
export const name = "scan-project";
|
|
5
|
+
export const description = "Scan the current project for React components and Storybook stories. " +
|
|
6
|
+
"Returns structured data about component names, props, export types, and story associations. " +
|
|
7
|
+
"Use this to understand the existing component inventory before generating new components or design system context.";
|
|
8
|
+
export const inputSchema = {
|
|
9
|
+
path: z
|
|
10
|
+
.string()
|
|
11
|
+
.optional()
|
|
12
|
+
.describe("Directory to scan. Defaults to the current working directory."),
|
|
13
|
+
type: z
|
|
14
|
+
.enum(["both", "storybook", "codebase"])
|
|
15
|
+
.optional()
|
|
16
|
+
.describe("What to scan: 'both' (default) scans components and stories, 'storybook' scans only stories, 'codebase' scans only components."),
|
|
17
|
+
};
|
|
18
|
+
export function handler() {
|
|
19
|
+
return async (input) => {
|
|
20
|
+
const rootPath = resolve(input.path ?? process.cwd());
|
|
21
|
+
const scanType = input.type ?? "both";
|
|
22
|
+
try {
|
|
23
|
+
if (scanType === "storybook") {
|
|
24
|
+
const stories = await scanStorybook(rootPath);
|
|
25
|
+
return {
|
|
26
|
+
content: [
|
|
27
|
+
{
|
|
28
|
+
type: "text",
|
|
29
|
+
text: JSON.stringify({
|
|
30
|
+
type: "storybook-scan",
|
|
31
|
+
rootPath,
|
|
32
|
+
storiesFound: stories.length,
|
|
33
|
+
stories,
|
|
34
|
+
}, null, 2),
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const result = await scanCodebase(rootPath);
|
|
40
|
+
// For "codebase" type, strip storybook data
|
|
41
|
+
if (scanType === "codebase") {
|
|
42
|
+
const components = result.components.map(({ storybook: _sb, ...rest }) => rest);
|
|
43
|
+
return {
|
|
44
|
+
content: [
|
|
45
|
+
{
|
|
46
|
+
type: "text",
|
|
47
|
+
text: JSON.stringify({
|
|
48
|
+
type: "codebase-scan",
|
|
49
|
+
rootPath,
|
|
50
|
+
componentsFound: components.length,
|
|
51
|
+
filesScanned: result.filesScanned,
|
|
52
|
+
durationMs: result.durationMs,
|
|
53
|
+
components,
|
|
54
|
+
}, null, 2),
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Default: both
|
|
60
|
+
const withStories = result.components.filter((c) => c.storybook);
|
|
61
|
+
return {
|
|
62
|
+
content: [
|
|
63
|
+
{
|
|
64
|
+
type: "text",
|
|
65
|
+
text: JSON.stringify({
|
|
66
|
+
type: "full-scan",
|
|
67
|
+
rootPath,
|
|
68
|
+
summary: {
|
|
69
|
+
componentsFound: result.components.length,
|
|
70
|
+
storiesFound: result.storybookStories.length,
|
|
71
|
+
componentsWithStories: withStories.length,
|
|
72
|
+
unmatchedStories: result.unmatchedStories.length,
|
|
73
|
+
filesScanned: result.filesScanned,
|
|
74
|
+
durationMs: result.durationMs,
|
|
75
|
+
},
|
|
76
|
+
components: result.components,
|
|
77
|
+
unmatchedStories: result.unmatchedStories,
|
|
78
|
+
}, null, 2),
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
85
|
+
return {
|
|
86
|
+
content: [
|
|
87
|
+
{
|
|
88
|
+
type: "text",
|
|
89
|
+
text: `Error scanning project: ${msg}`,
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
isError: true,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=scan-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-project.js","sourceRoot":"","sources":["../../../../src/mcp/tools/scan-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAElF,MAAM,CAAC,MAAM,IAAI,GAAG,cAAc,CAAC;AAEnC,MAAM,CAAC,MAAM,WAAW,GACtB,uEAAuE;IACvE,8FAA8F;IAC9F,oHAAoH,CAAC;AAEvH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,+DAA+D,CAChE;IACH,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;SACvC,QAAQ,EAAE;SACV,QAAQ,CACP,gIAAgI,CACjI;CACJ,CAAC;AAOF,MAAM,UAAU,OAAO;IACrB,OAAO,KAAK,EAAE,KAAY,EAAE,EAAE;QAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC;QAEtC,IAAI,CAAC;YACH,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAC9C,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;gCACE,IAAI,EAAE,gBAAgB;gCACtB,QAAQ;gCACR,YAAY,EAAE,OAAO,CAAC,MAAM;gCAC5B,OAAO;6BACR,EACD,IAAI,EACJ,CAAC,CACF;yBACF;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;YAE5C,4CAA4C;YAC5C,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;gBAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CACtC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CACtC,CAAC;gBACF,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;gCACE,IAAI,EAAE,eAAe;gCACrB,QAAQ;gCACR,eAAe,EAAE,UAAU,CAAC,MAAM;gCAClC,YAAY,EAAE,MAAM,CAAC,YAAY;gCACjC,UAAU,EAAE,MAAM,CAAC,UAAU;gCAC7B,UAAU;6BACX,EACD,IAAI,EACJ,CAAC,CACF;yBACF;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,gBAAgB;YAChB,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACjE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,IAAI,EAAE,WAAW;4BACjB,QAAQ;4BACR,OAAO,EAAE;gCACP,eAAe,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM;gCACzC,YAAY,EAAE,MAAM,CAAC,gBAAgB,CAAC,MAAM;gCAC5C,qBAAqB,EAAE,WAAW,CAAC,MAAM;gCACzC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,CAAC,MAAM;gCAChD,YAAY,EAAE,MAAM,CAAC,YAAY;gCACjC,UAAU,EAAE,MAAM,CAAC,UAAU;6BAC9B;4BACD,UAAU,EAAE,MAAM,CAAC,UAAU;4BAC7B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;yBAC1C,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,2BAA2B,GAAG,EAAE;qBACvC;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|