gemini-design-mcp 3.4.0 → 3.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.
|
@@ -8,26 +8,31 @@ export declare const createFrontendSchema: {
|
|
|
8
8
|
vibe: z.ZodObject<{
|
|
9
9
|
name: z.ZodString;
|
|
10
10
|
description: z.ZodString;
|
|
11
|
+
scale: z.ZodEnum<["refined", "balanced", "zoomed"]>;
|
|
11
12
|
keywords: z.ZodArray<z.ZodString, "many">;
|
|
12
13
|
}, "strip", z.ZodTypeAny, {
|
|
13
14
|
name: string;
|
|
14
15
|
description: string;
|
|
16
|
+
scale: "refined" | "balanced" | "zoomed";
|
|
15
17
|
keywords: string[];
|
|
16
18
|
}, {
|
|
17
19
|
name: string;
|
|
18
20
|
description: string;
|
|
21
|
+
scale: "refined" | "balanced" | "zoomed";
|
|
19
22
|
keywords: string[];
|
|
20
23
|
}>;
|
|
21
24
|
}, "strip", z.ZodTypeAny, {
|
|
22
25
|
vibe: {
|
|
23
26
|
name: string;
|
|
24
27
|
description: string;
|
|
28
|
+
scale: "refined" | "balanced" | "zoomed";
|
|
25
29
|
keywords: string[];
|
|
26
30
|
};
|
|
27
31
|
}, {
|
|
28
32
|
vibe: {
|
|
29
33
|
name: string;
|
|
30
34
|
description: string;
|
|
35
|
+
scale: "refined" | "balanced" | "zoomed";
|
|
31
36
|
keywords: string[];
|
|
32
37
|
};
|
|
33
38
|
}>>;
|
|
@@ -41,6 +46,7 @@ export declare function createFrontend(params: {
|
|
|
41
46
|
vibe: {
|
|
42
47
|
name: string;
|
|
43
48
|
description: string;
|
|
49
|
+
scale: "refined" | "balanced" | "zoomed";
|
|
44
50
|
keywords: string[];
|
|
45
51
|
};
|
|
46
52
|
};
|
|
@@ -16,10 +16,11 @@ export const createFrontendSchema = {
|
|
|
16
16
|
vibe: z.object({
|
|
17
17
|
name: z.string().describe("Vibe name (e.g., 'Pristine Museum', 'Dark Luxe')"),
|
|
18
18
|
description: z.string().describe("Rich, evocative description of the mood (2-3 sentences)"),
|
|
19
|
+
scale: z.enum(["refined", "balanced", "zoomed"]).describe("Scale: 'refined' (small, elegant), 'balanced' (standard), 'zoomed' (large elements)"),
|
|
19
20
|
keywords: z.array(z.string()).describe("Style keywords (e.g., ['minimal', 'whitespace', 'gallery'])"),
|
|
20
21
|
}).describe("The selected design vibe"),
|
|
21
22
|
}).optional().describe("Design system with selected vibe. REQUIRED for new projects without existing design. " +
|
|
22
|
-
"
|
|
23
|
+
"Call generate_vibes first, user selects, then pass the selection here."),
|
|
23
24
|
};
|
|
24
25
|
export async function createFrontend(params) {
|
|
25
26
|
const { request, filePath, techStack, context, designSystem } = params;
|
|
@@ -27,19 +28,17 @@ export async function createFrontend(params) {
|
|
|
27
28
|
let designSystemInstructions = '';
|
|
28
29
|
if (designSystem?.vibe) {
|
|
29
30
|
const { vibe } = designSystem;
|
|
31
|
+
const scale = vibe.scale || "balanced";
|
|
30
32
|
designSystemInstructions = `
|
|
31
33
|
MANDATORY DESIGN SYSTEM (User Selected Vibe):
|
|
32
34
|
|
|
33
35
|
**Design Vibe: "${vibe.name}"**
|
|
34
36
|
${vibe.description}
|
|
35
37
|
|
|
36
|
-
|
|
38
|
+
**Scale: ${scale}**
|
|
39
|
+
Keywords: ${vibe.keywords.join(', ')}
|
|
37
40
|
|
|
38
|
-
Interpret this vibe creatively
|
|
39
|
-
- Choose colors, gradients, and visual styling that embody this atmosphere
|
|
40
|
-
- Select a font from Google Fonts that perfectly matches this vibe
|
|
41
|
-
- Apply consistent visual language throughout the entire interface
|
|
42
|
-
- You have freedom in the specific implementation, but the overall feel MUST match this vibe
|
|
41
|
+
Interpret this vibe creatively — choose colors, typography, and styling that embody this atmosphere.
|
|
43
42
|
`;
|
|
44
43
|
}
|
|
45
44
|
// Build context instructions (ignore empty strings and "null" strings)
|
|
@@ -14,6 +14,14 @@ Each vibe should represent a unique visual direction and feeling.
|
|
|
14
14
|
Describe the mood, not specific colors - let the designer interpret creatively.
|
|
15
15
|
Think: "Corporate & Trustworthy" vs "Playful & Vibrant" vs "Dark & Techy"
|
|
16
16
|
|
|
17
|
+
IMPORTANT - Each vibe MUST include a SCALE recommendation:
|
|
18
|
+
- "zoomed" = Large elements, big buttons, big text, full-width cards (e.g., kids apps, accessibility-focused)
|
|
19
|
+
- "refined" = Subtle scale, smaller typography, contained elements, elegant proportions (e.g., luxury, Linear.app, Raycast)
|
|
20
|
+
- "balanced" = Standard scale, middle ground
|
|
21
|
+
|
|
22
|
+
The scale is NOT about density (dense vs sparse), it's about the SIZE of elements.
|
|
23
|
+
A luxury watch e-commerce site has refined/small scale. A kids learning platform has zoomed/large scale.
|
|
24
|
+
|
|
17
25
|
OUTPUT FORMAT (JSON):
|
|
18
26
|
Return ONLY a valid JSON array with exactly 5 vibes. No markdown, no explanation.
|
|
19
27
|
|
|
@@ -22,6 +30,7 @@ Return ONLY a valid JSON array with exactly 5 vibes. No markdown, no explanation
|
|
|
22
30
|
"emoji": "🏛️",
|
|
23
31
|
"name": "Vibe Name",
|
|
24
32
|
"description": "2-3 sentences describing the mood and atmosphere.",
|
|
33
|
+
"scale": "refined" | "balanced" | "zoomed",
|
|
25
34
|
"keywords": ["keyword1", "keyword2", "keyword3"]
|
|
26
35
|
}
|
|
27
36
|
]`;
|
|
@@ -58,7 +67,7 @@ export async function generateVibes(params) {
|
|
|
58
67
|
const formattedVibes = vibes.map((vibe, index) => {
|
|
59
68
|
return `${index + 1}. ${vibe.emoji} "${vibe.name}"
|
|
60
69
|
${vibe.description}
|
|
61
|
-
Keywords: ${vibe.keywords.join(", ")}`;
|
|
70
|
+
Scale: ${vibe.scale} | Keywords: ${vibe.keywords.join(", ")}`;
|
|
62
71
|
}).join("\n\n");
|
|
63
72
|
return {
|
|
64
73
|
content: [
|