seedflip-mcp 0.1.4 → 0.1.5

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 CHANGED
@@ -77,7 +77,7 @@ Get a curated design system by reference, vibe, or style.
77
77
 
78
78
  - **Brand references:** "Stripe", "Vercel", "Linear", "GitHub", "Notion", "Supabase", "Spotify", "Framer", "Resend", "Superhuman", "Raycast", "Arc"
79
79
  - **Style descriptors:** "dark minimal", "brutalist", "warm editorial", "neon cyberpunk", "elegant luxury"
80
- - **Export formats:** `tokens` (default), `tailwind`, `css`, `shadcn`
80
+ - **Export formats:** `tokens` (default), `tailwind`, `css`, `shadcn`, `openclaw`
81
81
  - **Multiple results:** Set `count: 3` to get top 3 matches
82
82
 
83
83
  ```
@@ -107,6 +107,23 @@ Each seed includes production-ready values for:
107
107
  - **Depth:** Box shadows
108
108
  - **Design brief:** AI-ready prompt describing the full aesthetic
109
109
 
110
+ ## OpenClaw Dashboard Theming
111
+
112
+ SeedFlip includes a ready-made OpenClaw skill. Use the `openclaw` format to get CSS variables mapped directly to OpenClaw's dashboard:
113
+
114
+ ```
115
+ "theme my dashboard like Stripe" → format: "openclaw"
116
+ "dark cyberpunk dashboard" → format: "openclaw"
117
+ ```
118
+
119
+ The output includes:
120
+ - **CSS variables** ready to inject into `:root`
121
+ - **themes.json entry** for saving as a named theme
122
+ - **Console snippet** for instant preview
123
+ - **Google Fonts import** for the typography
124
+
125
+ See `SKILL.md` for the full OpenClaw skill definition.
126
+
110
127
  ## Why
111
128
 
112
129
  Every vibe-coded app looks the same because AI agents don't have design vocabulary. They default to the same zinc palette, the same rounded corners, the same "modern minimalist" output. SeedFlip gives them 100+ curated design directions pulled from real, proven brands.
@@ -8,4 +8,5 @@ import type { DesignSeed } from './search.js';
8
8
  export declare function formatTokens(seed: DesignSeed): string;
9
9
  export declare function formatTailwind(seed: DesignSeed): string;
10
10
  export declare function formatCSS(seed: DesignSeed): string;
11
+ export declare function formatOpenClaw(seed: DesignSeed): string;
11
12
  export declare function formatShadcn(seed: DesignSeed): string;
package/dist/exporters.js CHANGED
@@ -189,6 +189,126 @@ export function formatCSS(seed) {
189
189
  ${seed.aiPromptRules}
190
190
  */`;
191
191
  }
192
+ // ── OpenClaw dashboard theme ────────────────────────────────────
193
+ export function formatOpenClaw(seed) {
194
+ const isDark = hexLuminance(seed.bg) < 0.5;
195
+ const headingFF = fontFamily(seed.headingFont);
196
+ const bodyFF = fontFamily(seed.bodyFont);
197
+ // Derive shadow scale from seed's shadow tokens
198
+ const shadowSm = seed.shadowSm;
199
+ const shadowMd = seed.shadow;
200
+ // Scale up for lg/xl
201
+ const shadowLg = shadowMd.replace(/(\d+)px/g, (_, n) => `${Math.round(Number(n) * 1.5)}px`);
202
+ const shadowXl = shadowMd.replace(/(\d+)px/g, (_, n) => `${Math.round(Number(n) * 2.5)}px`);
203
+ // Derive radius scale
204
+ const rSm = seed.radiusSm;
205
+ const rMd = seed.radius;
206
+ const rLg = seed.radiusXl;
207
+ const rXl = `${Math.round(parseFloat(seed.radiusXl) * 1.5)}px`;
208
+ const cssBlock = `:root {
209
+ /* SeedFlip — ${seed.name} */
210
+ /* ${seed.vibe} */
211
+
212
+ /* Colors */
213
+ --bg: ${seed.bg};
214
+ --card: ${seed.surface};
215
+ --bg-elevated: ${seed.surfaceHover};
216
+ --accent: ${seed.accent};
217
+ --primary: ${seed.accent};
218
+ --text: ${seed.text};
219
+ --text-secondary: ${seed.textMuted};
220
+ --muted: ${seed.textMuted};
221
+ --border: ${seed.border};
222
+
223
+ /* Typography */
224
+ --font-body: ${bodyFF};
225
+ --font-heading: ${headingFF};
226
+ --mono: 'JetBrains Mono', 'Fira Code', monospace;
227
+
228
+ /* Shape */
229
+ --radius-sm: ${rSm};
230
+ --radius-md: ${rMd};
231
+ --radius-lg: ${rLg};
232
+ --radius-xl: ${rXl};
233
+
234
+ /* Depth */
235
+ --shadow-sm: ${shadowSm};
236
+ --shadow-md: ${shadowMd};
237
+ --shadow-lg: ${shadowLg};
238
+ --shadow-xl: ${shadowXl};
239
+ }`;
240
+ const themeJson = JSON.stringify({
241
+ name: seed.name,
242
+ vibe: seed.vibe,
243
+ mode: isDark ? 'dark' : 'light',
244
+ bg: seed.bg,
245
+ card: seed.surface,
246
+ 'bg-elevated': seed.surfaceHover,
247
+ accent: seed.accent,
248
+ primary: seed.accent,
249
+ text: seed.text,
250
+ 'text-secondary': seed.textMuted,
251
+ muted: seed.textMuted,
252
+ border: seed.border,
253
+ 'font-body': bodyFF,
254
+ 'font-heading': headingFF,
255
+ 'radius-sm': rSm,
256
+ 'radius-md': rMd,
257
+ 'radius-lg': rLg,
258
+ 'radius-xl': rXl,
259
+ 'shadow-sm': shadowSm,
260
+ 'shadow-md': shadowMd,
261
+ 'shadow-lg': shadowLg,
262
+ 'shadow-xl': shadowXl,
263
+ }, null, 2);
264
+ return `## SeedFlip — ${seed.name} (OpenClaw Theme)
265
+
266
+ **${seed.vibe}**
267
+ Mode: ${isDark ? 'Dark' : 'Light'} | Tags: ${seed.tags.join(', ')}
268
+
269
+ ### CSS Variables — paste into your OpenClaw dashboard
270
+
271
+ \`\`\`css
272
+ @import url('${googleFontsUrl(seed)}');
273
+
274
+ ${cssBlock}
275
+ \`\`\`
276
+
277
+ ### themes.json entry
278
+
279
+ \`\`\`json
280
+ ${themeJson}
281
+ \`\`\`
282
+
283
+ ### Quick inject (browser console)
284
+
285
+ \`\`\`js
286
+ // Paste this into your browser console to preview the theme instantly
287
+ const s = document.documentElement.style;
288
+ s.setProperty('--bg', '${seed.bg}');
289
+ s.setProperty('--card', '${seed.surface}');
290
+ s.setProperty('--bg-elevated', '${seed.surfaceHover}');
291
+ s.setProperty('--accent', '${seed.accent}');
292
+ s.setProperty('--primary', '${seed.accent}');
293
+ s.setProperty('--text', '${seed.text}');
294
+ s.setProperty('--text-secondary', '${seed.textMuted}');
295
+ s.setProperty('--muted', '${seed.textMuted}');
296
+ s.setProperty('--border', '${seed.border}');
297
+ s.setProperty('--font-body', "${bodyFF}");
298
+ s.setProperty('--font-heading', "${headingFF}");
299
+ s.setProperty('--radius-sm', '${rSm}');
300
+ s.setProperty('--radius-md', '${rMd}');
301
+ s.setProperty('--radius-lg', '${rLg}');
302
+ s.setProperty('--radius-xl', '${rXl}');
303
+ s.setProperty('--shadow-sm', '${shadowSm}');
304
+ s.setProperty('--shadow-md', '${shadowMd}');
305
+ document.body.style.background = '${seed.bg}';
306
+ document.body.style.color = '${seed.text}';
307
+ \`\`\`
308
+
309
+ ### Design Brief
310
+ ${seed.aiPromptRules}`;
311
+ }
192
312
  // ── shadcn/ui theme ─────────────────────────────────────────────
193
313
  export function formatShadcn(seed) {
194
314
  const bg = hexToHSLString(seed.bg);
package/dist/index.js CHANGED
@@ -15,7 +15,7 @@ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
15
15
  import { z } from 'zod';
16
16
  import { createRequire } from 'module';
17
17
  import { searchSeeds } from './search.js';
18
- import { formatTokens, formatTailwind, formatCSS, formatShadcn, } from './exporters.js';
18
+ import { formatTokens, formatTailwind, formatCSS, formatShadcn, formatOpenClaw, } from './exporters.js';
19
19
  // ── Load seed data ───────────────────────────────────────────────
20
20
  // Dual ESM/CJS: createRequire works in ESM (normal usage).
21
21
  // Bare require() is the fallback for CJS (Smithery's esbuild scan)
@@ -44,15 +44,15 @@ Accepts:
44
44
  - Seed names: "Nightfall", "Ivory", "Concrete", etc.
45
45
  - Or no query for a random curated seed.
46
46
 
47
- Returns complete design tokens in your requested format (tokens, tailwind, css, or shadcn).`, {
47
+ Returns complete design tokens in your requested format (tokens, tailwind, css, shadcn, or openclaw).`, {
48
48
  query: z
49
49
  .string()
50
50
  .optional()
51
51
  .describe('What kind of design direction you want. Examples: "Stripe", "dark minimal", "warm editorial", "brutalist", "neon developer tool"'),
52
52
  format: z
53
- .enum(['tokens', 'tailwind', 'css', 'shadcn'])
53
+ .enum(['tokens', 'tailwind', 'css', 'shadcn', 'openclaw'])
54
54
  .optional()
55
- .describe('Output format. "tokens" = readable summary with all values and design brief. "tailwind" = tailwind.config.ts. "css" = CSS custom properties. "shadcn" = shadcn/ui theme globals.css. Defaults to tokens.'),
55
+ .describe('Output format. "tokens" = readable summary with all values and design brief. "tailwind" = tailwind.config.ts. "css" = CSS custom properties. "shadcn" = shadcn/ui theme globals.css. "openclaw" = OpenClaw dashboard theme. Defaults to tokens.'),
56
56
  count: z
57
57
  .number()
58
58
  .optional()
@@ -72,7 +72,9 @@ Returns complete design tokens in your requested format (tokens, tailwind, css,
72
72
  ? formatCSS
73
73
  : format === 'shadcn'
74
74
  ? formatShadcn
75
- : formatTokens;
75
+ : format === 'openclaw'
76
+ ? formatOpenClaw
77
+ : formatTokens;
76
78
  const sections = topSeeds.map((result, i) => {
77
79
  const header = limit > 1
78
80
  ? `### Option ${i + 1}: ${result.seed.name} (score: ${result.score}, matched: ${result.matchReasons.join(', ')})\n\n`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "seedflip-mcp",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "mcpName": "io.github.bockenstette1/seedflip",
5
5
  "description": "MCP server for SeedFlip — 100+ curated design systems for AI agents. When your agent needs a design direction, it calls SeedFlip instead of guessing.",
6
6
  "type": "module",