velloo 0.0.0 → 0.2.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/BUN-LICENSE.md +91 -0
- package/LICENSE +202 -0
- package/NOTICE +9 -0
- package/README.md +288 -2
- package/THIRD-PARTY-NOTICES.md +467 -0
- package/assets/elsewhere-alps-9fqhv029.jpg +0 -0
- package/assets/elsewhere-bali-vp60g115.jpg +0 -0
- package/assets/elsewhere-forest-xgn23zrj.jpg +0 -0
- package/assets/elsewhere-japan-qs7qkbr2.jpg +0 -0
- package/assets/elsewhere-kyoto-map-n2bvkrya.svg +1 -0
- package/assets/elsewhere-kyoto-qemtn6nk.jpg +0 -0
- package/assets/elsewhere-room-g1gaw7cs.jpg +0 -0
- package/canvas/apple-touch-icon.png +0 -0
- package/canvas/assets/index-BCvDZiBo.css +2 -0
- package/canvas/assets/index-ClaBqcaS.js +28 -0
- package/canvas/assets/lucide-all-iIF-pmzN.js +1 -0
- package/canvas/assets/radix-C3HaOB-d.js +41 -0
- package/canvas/assets/react-D0Ec-185.js +9 -0
- package/canvas/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/canvas/assets/vendor-CKmQ-Zst.js +53 -0
- package/canvas/favicon.ico +0 -0
- package/canvas/favicon.svg +12 -0
- package/canvas/fonts/OFL-1.1.txt +93 -0
- package/canvas/fonts/poppins-700.woff2 +0 -0
- package/canvas/icon-192.png +0 -0
- package/canvas/icon-512.png +0 -0
- package/canvas/index.html +22 -0
- package/canvas/site.webmanifest +11 -0
- package/chunk-08sv3k41.js +4 -0
- package/chunk-0fe83yzt.js +2 -0
- package/chunk-0t68szgr.js +3 -0
- package/chunk-1h55s5he.js +2 -0
- package/chunk-2c7jbx46.js +2 -0
- package/chunk-2smsg2ct.js +7 -0
- package/chunk-308ynsxd.js +2 -0
- package/chunk-3e8vez4d.js +1229 -0
- package/chunk-40xgcth8.js +63 -0
- package/chunk-4dn75m6t.js +3 -0
- package/chunk-4fj5tahv.js +3 -0
- package/chunk-6nqghjda.js +3 -0
- package/chunk-6tx68d90.js +3 -0
- package/chunk-6w6ch4ce.js +2 -0
- package/chunk-735ezz23.js +86 -0
- package/chunk-7eq7nx37.js +7 -0
- package/chunk-7eyb8yrf.js +6 -0
- package/chunk-80fjfyha.js +86 -0
- package/chunk-80r93t2e.js +4 -0
- package/chunk-94vx1yb0.js +3 -0
- package/chunk-9vg3yafz.js +3 -0
- package/chunk-a84n72m2.js +4 -0
- package/chunk-ampmdzz4.js +10 -0
- package/chunk-avns4dbf.js +2 -0
- package/chunk-ayrb3qnm.js +3 -0
- package/chunk-bwnvcncx.js +3 -0
- package/chunk-ccszg02q.js +5 -0
- package/chunk-cvn689d5.js +3 -0
- package/chunk-cxe6jjwj.js +3 -0
- package/chunk-dg6z4vdd.js +3 -0
- package/chunk-dgwjpbp9.js +3 -0
- package/chunk-dy41n60j.js +52 -0
- package/chunk-ek71z2fv.js +226 -0
- package/chunk-er1fxb7d.js +2 -0
- package/chunk-eyr8hrzf.js +2 -0
- package/chunk-fjbzk4sw.js +3 -0
- package/chunk-fsbsksga.js +3 -0
- package/chunk-h6gchare.js +3 -0
- package/chunk-hcb68zt7.js +85 -0
- package/chunk-hggap8fq.js +3 -0
- package/chunk-j11fyeqh.js +2 -0
- package/chunk-jb21jkp1.js +8 -0
- package/chunk-jfx9xjmr.js +18 -0
- package/chunk-jr0ss0mm.js +303 -0
- package/chunk-jrsknzjt.js +3 -0
- package/chunk-jv0xggh0.js +2 -0
- package/chunk-k17gfwq3.js +2 -0
- package/chunk-mh2pr7cq.js +5 -0
- package/chunk-mnapdp1y.js +2 -0
- package/chunk-mzhdrawd.js +3 -0
- package/chunk-n9gs6yx9.js +2 -0
- package/chunk-ngnymg2q.js +3 -0
- package/chunk-nwx5700b.js +3 -0
- package/chunk-pjtg3wnm.js +4 -0
- package/chunk-pp86v6m6.js +3 -0
- package/chunk-r22epxz2.js +3 -0
- package/chunk-rgasy862.js +5 -0
- package/chunk-rpwpeph5.js +3 -0
- package/chunk-s23gtejf.js +3 -0
- package/chunk-sjgqnykd.js +6 -0
- package/chunk-sn3x2m0m.js +6 -0
- package/chunk-t448rrfr.js +2 -0
- package/chunk-tdsk5wxa.js +451 -0
- package/chunk-v40fn08f.js +442 -0
- package/chunk-vbk1qhdz.js +3 -0
- package/chunk-vdkrbzh1.js +2 -0
- package/chunk-vgmr98cv.js +40 -0
- package/chunk-vsv8z729.js +6 -0
- package/chunk-x4f4k9pp.js +26 -0
- package/chunk-xt5ayg7g.js +4 -0
- package/chunk-ydhwv29b.js +244 -0
- package/chunk-zb6hc1y0.js +2 -0
- package/cli.js +3 -0
- package/launcher.cjs +97 -0
- package/package.json +58 -5
- package/pkgs/helpers/src/box.tsx +21 -0
- package/pkgs/helpers/src/cn.ts +32 -0
- package/pkgs/helpers/src/descriptors.ts +270 -0
- package/pkgs/helpers/src/divider.tsx +123 -0
- package/pkgs/helpers/src/gradient.tsx +90 -0
- package/pkgs/helpers/src/heading.tsx +20 -0
- package/pkgs/helpers/src/icon-data.ts +8009 -0
- package/pkgs/helpers/src/icon.tsx +53 -0
- package/pkgs/helpers/src/image.tsx +111 -0
- package/pkgs/helpers/src/index.ts +29 -0
- package/pkgs/helpers/src/layer.tsx +61 -0
- package/pkgs/helpers/src/lowering.ts +53 -0
- package/pkgs/helpers/src/paths.ts +47 -0
- package/pkgs/helpers/src/placeholder.tsx +88 -0
- package/pkgs/helpers/src/prose.tsx +42 -0
- package/pkgs/helpers/src/registry.ts +41 -0
- package/pkgs/helpers/src/svg.tsx +62 -0
- package/pkgs/helpers/src/text.tsx +16 -0
- package/pkgs/provider-antd/src/index.ts +78 -0
- package/pkgs/provider-antd/src/intro.ts +14 -0
- package/pkgs/provider-antd/src/manifest.ts +439 -0
- package/pkgs/provider-antd/src/overlays.ts +176 -0
- package/pkgs/provider-antd/src/registry.ts +104 -0
- package/pkgs/provider-antd/src/render-pass.ts +43 -0
- package/pkgs/provider-antd/src/tailwind-entry.css +21 -0
- package/pkgs/provider-antd/src/theme.ts +132 -0
- package/pkgs/provider-antd/src/version.ts +8 -0
- package/pkgs/provider-chakra/src/index.ts +80 -0
- package/pkgs/provider-chakra/src/intro.ts +14 -0
- package/pkgs/provider-chakra/src/manifest.ts +421 -0
- package/pkgs/provider-chakra/src/overlays.ts +246 -0
- package/pkgs/provider-chakra/src/registry.ts +227 -0
- package/pkgs/provider-chakra/src/render-pass.ts +55 -0
- package/pkgs/provider-chakra/src/tailwind-entry.css +21 -0
- package/pkgs/provider-chakra/src/theme.ts +180 -0
- package/pkgs/provider-chakra/src/version.ts +8 -0
- package/pkgs/provider-mui/src/index.ts +117 -0
- package/pkgs/provider-mui/src/intro.ts +12 -0
- package/pkgs/provider-mui/src/manifest.ts +263 -0
- package/pkgs/provider-mui/src/overlays.ts +124 -0
- package/pkgs/provider-mui/src/registry.ts +120 -0
- package/pkgs/provider-mui/src/render-pass.ts +36 -0
- package/pkgs/provider-mui/src/tailwind-entry.css +21 -0
- package/pkgs/provider-mui/src/theme.ts +129 -0
- package/pkgs/provider-mui/src/version.ts +8 -0
- package/pkgs/provider-none/src/components-inline.tsx +204 -0
- package/pkgs/provider-none/src/components.tsx +155 -0
- package/pkgs/provider-none/src/index.ts +57 -0
- package/pkgs/provider-none/src/intro.ts +18 -0
- package/pkgs/provider-none/src/manifest.ts +163 -0
- package/pkgs/provider-none/src/registry-inline.ts +36 -0
- package/pkgs/provider-none/src/registry.ts +39 -0
- package/pkgs/provider-none/src/tailwind-entry.css +57 -0
- package/pkgs/provider-none/src/version.ts +10 -0
- package/pkgs/schema/src/annotation.ts +120 -0
- package/pkgs/schema/src/asset.ts +66 -0
- package/pkgs/schema/src/board.ts +71 -0
- package/pkgs/schema/src/comment.ts +107 -0
- package/pkgs/schema/src/config.ts +185 -0
- package/pkgs/schema/src/css-sanitize.ts +56 -0
- package/pkgs/schema/src/extension.ts +105 -0
- package/pkgs/schema/src/fonts.ts +690 -0
- package/pkgs/schema/src/frame.ts +40 -0
- package/pkgs/schema/src/icon-name.ts +21 -0
- package/pkgs/schema/src/ids.ts +14 -0
- package/pkgs/schema/src/index.ts +169 -0
- package/pkgs/schema/src/migrate.ts +297 -0
- package/pkgs/schema/src/node.ts +229 -0
- package/pkgs/schema/src/paths.ts +28 -0
- package/pkgs/schema/src/repo.ts +134 -0
- package/pkgs/schema/src/screen.ts +30 -0
- package/pkgs/schema/src/snippet-resolve.ts +193 -0
- package/pkgs/schema/src/snippet.ts +104 -0
- package/pkgs/schema/src/svg-sanitize.ts +487 -0
- package/pkgs/schema/src/theme.ts +218 -0
- package/pkgs/schema/src/typeset.ts +693 -0
- package/pkgs/schema/src/validate-ids.ts +46 -0
- package/pkgs/schema/src/viewport.ts +8 -0
- package/pkgs/shadcn-snapshot/dist/manifest.json +8109 -0
- package/pkgs/shadcn-snapshot/src/components/canvas-portal.tsx +55 -0
- package/pkgs/shadcn-snapshot/src/components/ui/accordion.tsx +122 -0
- package/pkgs/shadcn-snapshot/src/components/ui/alert-dialog.tsx +164 -0
- package/pkgs/shadcn-snapshot/src/components/ui/alert.tsx +74 -0
- package/pkgs/shadcn-snapshot/src/components/ui/aspect-ratio.tsx +13 -0
- package/pkgs/shadcn-snapshot/src/components/ui/attachment.tsx +197 -0
- package/pkgs/shadcn-snapshot/src/components/ui/avatar.tsx +100 -0
- package/pkgs/shadcn-snapshot/src/components/ui/badge.tsx +50 -0
- package/pkgs/shadcn-snapshot/src/components/ui/breadcrumb.tsx +109 -0
- package/pkgs/shadcn-snapshot/src/components/ui/bubble.tsx +130 -0
- package/pkgs/shadcn-snapshot/src/components/ui/button-group.tsx +82 -0
- package/pkgs/shadcn-snapshot/src/components/ui/button.tsx +72 -0
- package/pkgs/shadcn-snapshot/src/components/ui/calendar.tsx +229 -0
- package/pkgs/shadcn-snapshot/src/components/ui/card.tsx +92 -0
- package/pkgs/shadcn-snapshot/src/components/ui/carousel.tsx +235 -0
- package/pkgs/shadcn-snapshot/src/components/ui/chart-option.ts +250 -0
- package/pkgs/shadcn-snapshot/src/components/ui/chart.tsx +177 -0
- package/pkgs/shadcn-snapshot/src/components/ui/checkbox.tsx +41 -0
- package/pkgs/shadcn-snapshot/src/components/ui/collapsible.tsx +32 -0
- package/pkgs/shadcn-snapshot/src/components/ui/combobox.tsx +196 -0
- package/pkgs/shadcn-snapshot/src/components/ui/context-menu.tsx +227 -0
- package/pkgs/shadcn-snapshot/src/components/ui/dialog.tsx +131 -0
- package/pkgs/shadcn-snapshot/src/components/ui/direction.tsx +24 -0
- package/pkgs/shadcn-snapshot/src/components/ui/drawer.tsx +112 -0
- package/pkgs/shadcn-snapshot/src/components/ui/dropdown-menu.tsx +205 -0
- package/pkgs/shadcn-snapshot/src/components/ui/empty.tsx +98 -0
- package/pkgs/shadcn-snapshot/src/components/ui/field.tsx +228 -0
- package/pkgs/shadcn-snapshot/src/components/ui/hover-card.tsx +51 -0
- package/pkgs/shadcn-snapshot/src/components/ui/input-group.tsx +148 -0
- package/pkgs/shadcn-snapshot/src/components/ui/input.tsx +43 -0
- package/pkgs/shadcn-snapshot/src/components/ui/item.tsx +187 -0
- package/pkgs/shadcn-snapshot/src/components/ui/kbd.tsx +30 -0
- package/pkgs/shadcn-snapshot/src/components/ui/label.tsx +25 -0
- package/pkgs/shadcn-snapshot/src/components/ui/marker.tsx +71 -0
- package/pkgs/shadcn-snapshot/src/components/ui/menubar.tsx +243 -0
- package/pkgs/shadcn-snapshot/src/components/ui/message.tsx +89 -0
- package/pkgs/shadcn-snapshot/src/components/ui/native-select.tsx +60 -0
- package/pkgs/shadcn-snapshot/src/components/ui/navigation-menu.tsx +165 -0
- package/pkgs/shadcn-snapshot/src/components/ui/pagination.tsx +117 -0
- package/pkgs/shadcn-snapshot/src/components/ui/popover.tsx +66 -0
- package/pkgs/shadcn-snapshot/src/components/ui/progress.tsx +35 -0
- package/pkgs/shadcn-snapshot/src/components/ui/radio-group.tsx +48 -0
- package/pkgs/shadcn-snapshot/src/components/ui/scroll-area.tsx +59 -0
- package/pkgs/shadcn-snapshot/src/components/ui/select.tsx +180 -0
- package/pkgs/shadcn-snapshot/src/components/ui/separator.tsx +32 -0
- package/pkgs/shadcn-snapshot/src/components/ui/sheet.tsx +107 -0
- package/pkgs/shadcn-snapshot/src/components/ui/skeleton.tsx +17 -0
- package/pkgs/shadcn-snapshot/src/components/ui/slider.tsx +68 -0
- package/pkgs/shadcn-snapshot/src/components/ui/sonner.tsx +91 -0
- package/pkgs/shadcn-snapshot/src/components/ui/spinner.tsx +21 -0
- package/pkgs/shadcn-snapshot/src/components/ui/switch.tsx +41 -0
- package/pkgs/shadcn-snapshot/src/components/ui/table.tsx +93 -0
- package/pkgs/shadcn-snapshot/src/components/ui/tabs.tsx +84 -0
- package/pkgs/shadcn-snapshot/src/components/ui/textarea.tsx +24 -0
- package/pkgs/shadcn-snapshot/src/components/ui/toggle-group.tsx +94 -0
- package/pkgs/shadcn-snapshot/src/components/ui/toggle.tsx +50 -0
- package/pkgs/shadcn-snapshot/src/components/ui/tooltip.tsx +47 -0
- package/pkgs/shadcn-snapshot/src/examples.ts +36 -0
- package/pkgs/shadcn-snapshot/src/groups.ts +87 -0
- package/pkgs/shadcn-snapshot/src/index.ts +43 -0
- package/pkgs/shadcn-snapshot/src/lib/utils.ts +4 -0
- package/pkgs/shadcn-snapshot/src/manifest.ts +12 -0
- package/pkgs/shadcn-snapshot/src/notes.ts +97 -0
- package/pkgs/shadcn-snapshot/src/paths.ts +47 -0
- package/pkgs/shadcn-snapshot/src/registry-files.ts +293 -0
- package/pkgs/shadcn-snapshot/src/registry.ts +631 -0
- package/pkgs/shadcn-snapshot/src/shadcn-tailwind.css +632 -0
- package/pkgs/shadcn-snapshot/src/tailwind-entry.css +159 -0
- package/pkgs/shadcn-snapshot/src/version.ts +8 -0
- package/plugins/claude/velloo/.claude-plugin/plugin.json +6 -0
- package/plugins/claude/velloo/agents/velloo-design-reviewer.md +33 -0
- package/plugins/claude/velloo/agents/velloo-designer.md +39 -0
- package/plugins/claude/velloo/commands/design.md +11 -0
- package/plugins/claude/velloo/commands/implement.md +10 -0
- package/plugins/claude/velloo/commands/review.md +8 -0
- package/plugins/gemini/GEMINI.md +31 -0
- package/plugins/gemini/commands/velloo/design.toml +10 -0
- package/plugins/gemini/commands/velloo/implement.toml +9 -0
- package/plugins/gemini/gemini-extension.json +9 -0
- package/skills/velloo-brand/SKILL.md +124 -0
- package/skills/velloo-design/SKILL.md +144 -0
- package/skills/velloo-design-system/SKILL.md +90 -0
- package/skills/velloo-implement/SKILL.md +101 -0
- package/skills/velloo-logo/SKILL.md +93 -0
- package/skills/velloo-setup/SKILL.md +156 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: velloo-design-system
|
|
3
|
+
description: >-
|
|
4
|
+
Turn a brand into a working design system in Velloo — token scales (color,
|
|
5
|
+
type, spacing, radius), a themed component inventory, reusable snippets, and a
|
|
6
|
+
living style guide emitted into the real app. Use when the user wants a design
|
|
7
|
+
system, design tokens, a component library styled to their brand, a style
|
|
8
|
+
guide, or to theme an app coherently. Triggers: "set up a design system",
|
|
9
|
+
"define our tokens", "build/style our component library", "make a style
|
|
10
|
+
guide", "theme the app", "do we need a design system?".
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Design systems in Velloo
|
|
14
|
+
|
|
15
|
+
A design system is **tokens + components + the rules that bind them**. Velloo
|
|
16
|
+
already speaks both — the theme *is* your tokens, the shadcn snapshot *is* your
|
|
17
|
+
components — so your job is to make them coherent, prove they hold, and **emit
|
|
18
|
+
them into the real app**. The canvas re-renders against the tokens live, so you
|
|
19
|
+
*see* the system instead of describing it.
|
|
20
|
+
|
|
21
|
+
## Do you even need one? (answer this honestly first)
|
|
22
|
+
|
|
23
|
+
- **One product, one brand:** the theme (tokens) + the component snapshot usually
|
|
24
|
+
*is* the system. Don't build a 200-page portal for a single app — formalize the
|
|
25
|
+
tokens, build a style-guide screen, ship. Over-building a system is a way to
|
|
26
|
+
avoid shipping the product.
|
|
27
|
+
- **Multiple products/surfaces, a team, or a public component library:** yes,
|
|
28
|
+
formalize it — shared tokens, documented patterns, versioning.
|
|
29
|
+
|
|
30
|
+
State which case you're in before you start; it sets the scope.
|
|
31
|
+
|
|
32
|
+
## 1. Tokens — the foundation
|
|
33
|
+
|
|
34
|
+
Define the **whole** scale, not just brand colors:
|
|
35
|
+
|
|
36
|
+
- **Color roles**, each in light + dark: background, surface(s), foreground/ink,
|
|
37
|
+
primary, accent, muted, line/border, destructive. Use *semantic roles*, never
|
|
38
|
+
raw palette values scattered through screens.
|
|
39
|
+
- **Radius** scale, **spacing** rhythm, **type** scale (sizes + weights + line
|
|
40
|
+
heights), and a **mono**.
|
|
41
|
+
|
|
42
|
+
`set_theme { from: { seedColor } }` grows ramps from a seed; `score_theme_contrast`
|
|
43
|
+
proves every foreground/background pair passes in **both** modes (dark breaks
|
|
44
|
+
first). `set_theme { tokens }` makes them live — the canvas reflows so you can judge the
|
|
45
|
+
system, not a spec sheet.
|
|
46
|
+
|
|
47
|
+
## 2. Component inventory — the system's audit
|
|
48
|
+
|
|
49
|
+
Build one board that shows **every component the product actually uses**, themed:
|
|
50
|
+
buttons (all variants + states), inputs, selects, cards, nav, tables, badges,
|
|
51
|
+
empty states, toasts, dialogs. One screen, sectioned by kind.
|
|
52
|
+
|
|
53
|
+
This board *is* the audit. Anything that looks wrong here is a token bug, not a
|
|
54
|
+
component bug. Read the `theme/raw-color` diagnostics (on writes and `screenshot`)
|
|
55
|
+
for color classes that won't theme-flip and fix
|
|
56
|
+
them to semantic tokens (mark intentional fixed accents `data-accent: "ok"`).
|
|
57
|
+
|
|
58
|
+
## 3. Patterns — snippets with typed params
|
|
59
|
+
|
|
60
|
+
Recurring structures (a list row, a stat card, a form field, a nav item) become
|
|
61
|
+
**snippets** with typed params (`add_snippet`), verified with `render_snippet`
|
|
62
|
+
*before* you stamp them — `$param` wiring bugs are silent until instantiation.
|
|
63
|
+
These are your real components-to-be; define each once, instantiate per use.
|
|
64
|
+
|
|
65
|
+
## 4. The living style guide
|
|
66
|
+
|
|
67
|
+
Compose a **style-guide screen** rendered entirely from the same tokens: palette
|
|
68
|
+
swatches with role names + hexes, the type scale in situ, the spacing/radius
|
|
69
|
+
scale, the component inventory, and voice/tone notes. Because it's built from the
|
|
70
|
+
tokens, it can't drift — change a token and the guide changes with it. That's the
|
|
71
|
+
whole point: **one source of truth, zero stale docs.**
|
|
72
|
+
|
|
73
|
+
## 5. Emit into the app
|
|
74
|
+
|
|
75
|
+
Velloo's emit is honest IR — it owns the visual layer, not your state/routing:
|
|
76
|
+
|
|
77
|
+
- `emit_theme { apply: true }` → the Tailwind `globals.css` (the entire color
|
|
78
|
+
system) wired into the app's entry CSS. This is the keystone artifact.
|
|
79
|
+
- `emit_snippet` per pattern → a real component; map its `{param}` holes to your
|
|
80
|
+
props/data.
|
|
81
|
+
- `emit_code` per screen → the layout skeleton (and a `/styleguide` route if you
|
|
82
|
+
want the guide to live in the app).
|
|
83
|
+
- **Read the `warnings` array on every emit.** A non-empty `warnings` means
|
|
84
|
+
something couldn't transfer faithfully — handle it, don't ship it blind.
|
|
85
|
+
|
|
86
|
+
## Keep it honest
|
|
87
|
+
|
|
88
|
+
The system **is the tokens**; components are downstream. A change should happen
|
|
89
|
+
**once** — at the token — and propagate everywhere. If you find yourself editing
|
|
90
|
+
the same color in five places, the system has a hole; close it at the source.
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: velloo-implement
|
|
3
|
+
description: >-
|
|
4
|
+
Turn a Velloo design into production code — emit the theme, snippets, and
|
|
5
|
+
screens as framework-native IR (shadcn/Tailwind, MUI sx, or no-framework
|
|
6
|
+
inline styles), write real files in the app's conventions, then verify the
|
|
7
|
+
implementation against the canvas. Use when the user wants to implement a
|
|
8
|
+
Velloo design, generate code from the canvas, or sync an app with its
|
|
9
|
+
design. Triggers: "implement the velloo design", "build the page from the
|
|
10
|
+
design", "turn the design into code", "generate the code for this screen".
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Implementing a Velloo design
|
|
14
|
+
|
|
15
|
+
The Velloo canvas is the visual source of truth; **you write the production
|
|
16
|
+
code**. Emit gives you honest IR — library identifiers and native styling
|
|
17
|
+
verbatim, no imports, no formatter pass — and you translate it into real files
|
|
18
|
+
in the app's own conventions. Designs are static by construction, so state,
|
|
19
|
+
routing, handlers, and data are yours to add.
|
|
20
|
+
|
|
21
|
+
## Before you start
|
|
22
|
+
|
|
23
|
+
- The velloo MCP tools come from your MCP config (`velloo mcp`); the server's
|
|
24
|
+
`initialize` instructions are the authoritative tool reference.
|
|
25
|
+
- Scope the work: `list_screens` / `list_boards` for what exists,
|
|
26
|
+
`get_screen mode: "outline"` for a quick structure read, `list_components kind: "snippet"`
|
|
27
|
+
for the reusable pieces, `get_theme` for the token model.
|
|
28
|
+
- Read the app first: the router (Next/Vite/Astro/Remix), where components
|
|
29
|
+
live, the components import alias, how pages fetch data, and whether the
|
|
30
|
+
components the design uses actually exist in the app yet.
|
|
31
|
+
|
|
32
|
+
## Emit order: theme → snippets → screens
|
|
33
|
+
|
|
34
|
+
1. **`emit_theme { outputDir }` — dry-run first.** It returns per-file diffs
|
|
35
|
+
without writing; review them, then re-run with `apply: true`.
|
|
36
|
+
- shadcn folder → Tailwind v4 `globals.css` (the `@theme` block, `.dark`
|
|
37
|
+
overrides, base layer) plus `tailwind.config.ts` (`cssOnly` skips it).
|
|
38
|
+
`cssPath` defaults to `app/globals.css` — pass `src/index.css` (Vite) or
|
|
39
|
+
wherever the app's entry CSS actually lives.
|
|
40
|
+
- MUI folder → a `createTheme(...)` module (default `theme.ts`, dark theme
|
|
41
|
+
included when the design has one). Wire it into the app's ThemeProvider.
|
|
42
|
+
This is the one direct artifact — no agent translation needed.
|
|
43
|
+
2. **`emit_snippet` per snippet** → a PascalCase component name, typed params,
|
|
44
|
+
and a JSX body with `{param}` holes. Write each as a real component: params
|
|
45
|
+
become props, `node` params become children/slots, and keep the emitted
|
|
46
|
+
classes/`sx` verbatim — that's what makes the result match the design.
|
|
47
|
+
Snippets emit a `className?: string` passthrough — keep it.
|
|
48
|
+
3. **`emit_code` per screen** → the page's layout skeleton. Wrap it in the
|
|
49
|
+
framework's route/page shell, import the snippet components you just
|
|
50
|
+
wrote, and add what Velloo doesn't own. `componentsAlias` defaults from
|
|
51
|
+
the folder config (set at init); override per call if the app resolves
|
|
52
|
+
imports differently.
|
|
53
|
+
|
|
54
|
+
## The IR is framework-native — keep it that way
|
|
55
|
+
|
|
56
|
+
- **shadcn** → library ids map 1:1 to the app's shadcn components; Tailwind
|
|
57
|
+
classes transfer verbatim. The emit result lists every component used — if
|
|
58
|
+
the app is missing one, install it with `npx shadcn@latest add <name>`
|
|
59
|
+
rather than hand-rolling a lookalike.
|
|
60
|
+
- **MUI** → components import from `@mui/material`, styling stays in
|
|
61
|
+
`sx={{…}}`, and tokens ride the emitted `createTheme` module.
|
|
62
|
+
- **No-framework** → plain HTML elements; Tailwind classes when the folder's
|
|
63
|
+
CSS framework is tailwind, inline `style={{…}}` objects referencing the
|
|
64
|
+
`var(--…)` theme variables when it's none.
|
|
65
|
+
- **Extensions** emit as real imports from their declared `importPath` — the
|
|
66
|
+
design's `DataTable` / chart nodes come back as the app's own components
|
|
67
|
+
with the captured props. Don't re-implement them.
|
|
68
|
+
- Icons are lucide-react imports (`<ArrowRight className="…" />`).
|
|
69
|
+
|
|
70
|
+
## Warnings are part of the contract
|
|
71
|
+
|
|
72
|
+
Every emit result carries a `warnings` array (per-snippet warnings ride on
|
|
73
|
+
`snippetsUsed[].warnings`). Non-empty means something couldn't be expressed
|
|
74
|
+
faithfully — e.g. a dynamic icon-name param baked to a single glyph. Resolve
|
|
75
|
+
each one in the real component (usually a `node` param or a prop switch);
|
|
76
|
+
never ship a warning blind.
|
|
77
|
+
|
|
78
|
+
## Verify against the design
|
|
79
|
+
|
|
80
|
+
1. Run the app's dev server.
|
|
81
|
+
2. `compare_to_url { screenId, url }` at the same viewport for each
|
|
82
|
+
implemented page. 0.85+ similarity is a faithful structural port; the
|
|
83
|
+
per-region node refs name what's off. Don't chase 1.0 — fonts, imagery,
|
|
84
|
+
and live data legitimately differ.
|
|
85
|
+
3. An `unverified` result means STOP — don't iterate against a page you
|
|
86
|
+
never actually captured. If it's a login wall, `start_capture_session
|
|
87
|
+
{ url }` opens a browser the *user* drives (it returns immediately; tell
|
|
88
|
+
them to log in, hit **Capture page**, then **Done**, and poll
|
|
89
|
+
`list_captures`), then verify with `compare_to_url { captureId }`. If it's
|
|
90
|
+
the dev server, fix that first. `storageStatePath` / `cookies` remain the
|
|
91
|
+
option when you already hold a session.
|
|
92
|
+
4. When implementation drifted from the design, fix the code. When the design
|
|
93
|
+
itself should change, fix it in Velloo (through the MCP tools — never edit
|
|
94
|
+
the design folder's JSON by hand), then re-emit and diff.
|
|
95
|
+
|
|
96
|
+
## App conventions win
|
|
97
|
+
|
|
98
|
+
Match the codebase: file naming, the server/client component split
|
|
99
|
+
(`"use client"` only where interactivity needs it), the app's data-fetching
|
|
100
|
+
layer, its test patterns. The IR provides structure and styling; everything
|
|
101
|
+
else should read like the user wrote it.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: velloo-logo
|
|
3
|
+
description: >-
|
|
4
|
+
Design a logo, wordmark, and full favicon/app-icon set in Velloo — explore
|
|
5
|
+
marks across directions, converge on one idea, make the geometry exact with a
|
|
6
|
+
live adjuster, compose the lockup, and export every icon size from one source
|
|
7
|
+
SVG. Use when the user wants a logo, a mark, a wordmark, an app icon, or a
|
|
8
|
+
favicon. Triggers: "design a logo", "make a mark/symbol", "create a wordmark",
|
|
9
|
+
"we need a favicon", "app icon", "icon for the product".
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Logos & marks in Velloo
|
|
13
|
+
|
|
14
|
+
A logo is **geometry, not a render**. Explore widely, converge on **one** idea,
|
|
15
|
+
then make it exact. The non-negotiable test: the mark must read at **16px** (a
|
|
16
|
+
favicon) *and* at hero size, in **light and dark**. If it dies at 16px, it's
|
|
17
|
+
decoration, not a mark.
|
|
18
|
+
|
|
19
|
+
## 1. Diverge — explore mark directions
|
|
20
|
+
|
|
21
|
+
Generate candidates across genuinely different directions, a few each:
|
|
22
|
+
|
|
23
|
+
- **Monogram / letterform** (the initial, stylized).
|
|
24
|
+
- **Abstract symbol** (a metaphor for what the product does).
|
|
25
|
+
- **Geometric / 3D** (a form with depth — extract a clear silhouette from it).
|
|
26
|
+
- **Wordmark-only** (the name *is* the logo).
|
|
27
|
+
|
|
28
|
+
Two ways to make candidates, and you'll mix them:
|
|
29
|
+
|
|
30
|
+
- **Author SVG directly.** Clean, adjustable, diff-able, scales perfectly —
|
|
31
|
+
always the path for the *final* mark.
|
|
32
|
+
- **Image generation for inspiration** *(optional; needs image-gen access or an
|
|
33
|
+
API key)*. Use a vector-flat model for logos, a typographic model for
|
|
34
|
+
wordmarks, an illustrative model for 3D/expressive forms — then **vectorize**
|
|
35
|
+
the raster you like into a clean SVG you can refine. Treat gen output as a
|
|
36
|
+
sketch, not a deliverable.
|
|
37
|
+
|
|
38
|
+
Lay the candidates on an **exploration board** as a numbered grid so the user can
|
|
39
|
+
pin favorites (`import_assets` pulls generated rasters straight in by path — no
|
|
40
|
+
base64). Keep the rounds; they're the decision log.
|
|
41
|
+
|
|
42
|
+
## 2. Converge — name the idea in one line
|
|
43
|
+
|
|
44
|
+
Before you refine anything, state the chosen idea in a single sentence —
|
|
45
|
+
"*two forms interlinked = X meets Y*", "*a path that's also a checkmark*". If you
|
|
46
|
+
can't say what it *means* in one line, it isn't a logo yet; it's a shape.
|
|
47
|
+
|
|
48
|
+
## 3. Make it exact — the adjuster loop
|
|
49
|
+
|
|
50
|
+
Logo geometry is a back-and-forth over a handful of numbers (offset, stroke
|
|
51
|
+
weight, corner radius, the crossing/overlap, optical centering). **Do not eyeball
|
|
52
|
+
this across dozens of screenshots** — that loop is slow and never converges.
|
|
53
|
+
|
|
54
|
+
Instead, stand up a **throwaway live adjuster**: a tiny standalone HTML page with
|
|
55
|
+
a slider per numeric value and **toggleable guide lines** (baseline, x-height,
|
|
56
|
+
centerline), rendering the SVG live with copy-paste output. The moment the user
|
|
57
|
+
has sliders and a guide line, the back-and-forth collapses to a single pass.
|
|
58
|
+
Bake the final numbers back into the master SVG.
|
|
59
|
+
|
|
60
|
+
## 4. The wordmark
|
|
61
|
+
|
|
62
|
+
- **Lowercase vs uppercase** is a real decision, not a default: lowercase reads
|
|
63
|
+
modern/approachable, uppercase reads authoritative/established. Show both and
|
|
64
|
+
choose deliberately — note the implication.
|
|
65
|
+
- Pick **one** family for the wordmark. Tune **tracking** until the spacing is
|
|
66
|
+
optically even (tight negative tracking is normal on geometric sans). Use the
|
|
67
|
+
adjuster's guide lines to lock baseline and x-height.
|
|
68
|
+
- Give it **one** ownable detail — a colored letter, a dot, a ligature, a cut.
|
|
69
|
+
One. A wordmark with three gimmicks has none.
|
|
70
|
+
|
|
71
|
+
## 5. The lockup
|
|
72
|
+
|
|
73
|
+
Compose mark + wordmark with a gap defined **as a ratio of the wordmark size**,
|
|
74
|
+
so the lockup scales as one unit. Produce the standard variants a brand system
|
|
75
|
+
needs: **horizontal, stacked, mark-only, monochrome, inverse**, plus a
|
|
76
|
+
**clear-space** spec. Bundle the font locally if the wordmark ships in a UI (so
|
|
77
|
+
it renders offline, not just where the font happens to be installed).
|
|
78
|
+
|
|
79
|
+
## 6. Favicon & app-icon set — one source, every size
|
|
80
|
+
|
|
81
|
+
From the master SVG, export the whole set and wire it up:
|
|
82
|
+
|
|
83
|
+
- `favicon.svg`, `favicon.ico` (16/32/48 multi-res), `apple-touch-icon` (180),
|
|
84
|
+
PWA icons (192/512), and an OG/social image.
|
|
85
|
+
- Add the `<link>` tags + the web manifest; set a `theme-color`.
|
|
86
|
+
- **Re-test the 16px crop.** If the mark is illegible small, *simplify it* (fewer
|
|
87
|
+
strokes, more contrast) rather than shrinking detail nobody can see.
|
|
88
|
+
|
|
89
|
+
## Verify
|
|
90
|
+
|
|
91
|
+
`screenshot` the mark at **16, 24, 48, and hero**, in **light and dark**. It must
|
|
92
|
+
survive every size and both modes. The favicon is the honest test — pass that and
|
|
93
|
+
the rest is easy.
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: velloo-setup
|
|
3
|
+
description: >-
|
|
4
|
+
Calibrate a Velloo design folder to an existing codebase before designing —
|
|
5
|
+
import the app's real theme and fonts, match its custom components, and
|
|
6
|
+
verify the canvas against the running app. Use once per repo before the first
|
|
7
|
+
design task, and again when the app's design language changes. Triggers:
|
|
8
|
+
"set up velloo for this repo", "make the preview match my app", "why doesn't
|
|
9
|
+
the canvas look like my app", or the setup step of an init handoff prompt.
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Calibrating Velloo to an existing app
|
|
13
|
+
|
|
14
|
+
For shadcn folders, the canvas can import client-safe components directly from
|
|
15
|
+
the app's configured `components/ui` directory. That is a bounded capability,
|
|
16
|
+
not a promise that arbitrary application React can run inside a design iframe:
|
|
17
|
+
portal/state-heavy families use named canvas-safe adaptations, and a missing or
|
|
18
|
+
unbuildable file falls back independently. Other providers follow their own
|
|
19
|
+
adapter contract. The fidelity is observable through `component_status`; never
|
|
20
|
+
infer it from `installedInApp` or from a component merely appearing on screen.
|
|
21
|
+
|
|
22
|
+
Your job here is to close that gap **before** you start designing, and to say
|
|
23
|
+
honestly what's left open. Do this once per design folder. Skip it only for a
|
|
24
|
+
greenfield folder with no app to match.
|
|
25
|
+
|
|
26
|
+
## 1. Theme first — it buys the most
|
|
27
|
+
|
|
28
|
+
`import_theme { cssPath, apply: true }` against the app's stylesheet. This is
|
|
29
|
+
not just colors: it ingests `--radius`, `--font-*` roles, the non-semantic
|
|
30
|
+
palette (`--primary-600`, `--ink`), and — when it finds a `tailwind.config`
|
|
31
|
+
nearby — that config's `theme.extend` spacing, shadows, fonts, keyframes, and
|
|
32
|
+
`container` settings. Run it dry first (the default) and read the reported
|
|
33
|
+
changes; `apply: true` when they look like the app.
|
|
34
|
+
|
|
35
|
+
Init records the stylesheet it found in the folder config, so check there
|
|
36
|
+
before hunting. If there's no stylesheet (a `none`-CSS folder, an MUI app),
|
|
37
|
+
`import_theme` still takes raw `css` text, and an MUI app's `createTheme` call
|
|
38
|
+
is the equivalent source.
|
|
39
|
+
|
|
40
|
+
**Fonts are the highest-leverage single token.** A design in the wrong typeface
|
|
41
|
+
reads as wrong no matter how correct the layout is. If `import_theme` didn't
|
|
42
|
+
resolve real families, set them with `set_theme { fonts }` — read the app's font loading
|
|
43
|
+
(next/font, a `@font-face`, a Google Fonts link) to get the actual names.
|
|
44
|
+
|
|
45
|
+
Then `score_theme_contrast` to confirm the imported palette holds up in both
|
|
46
|
+
modes; an app that only ever ships light mode often imports into a dark palette
|
|
47
|
+
that fails.
|
|
48
|
+
|
|
49
|
+
## 2. Verify against the real thing, early
|
|
50
|
+
|
|
51
|
+
Do not wait until a design is finished to discover the baseline was wrong.
|
|
52
|
+
Recreate one representative screen — or use whatever init scaffolded — and run
|
|
53
|
+
`compare_to_url` against the running app.
|
|
54
|
+
|
|
55
|
+
- Get the app running first. Start its dev server yourself if the package
|
|
56
|
+
scripts make it obvious; otherwise ask the user for the command, a running
|
|
57
|
+
URL, or a deployed preview. Ask once, plainly, rather than guessing ports.
|
|
58
|
+
- **Read `unverified` on every result.** `redirected` / `authWall` means you
|
|
59
|
+
captured a login page, so the similarity number is meaningless.
|
|
60
|
+
- **For a login wall, use a capture session.** `start_capture_session { url }`
|
|
61
|
+
opens a real browser the *user* drives. It returns immediately — it does not
|
|
62
|
+
wait — so say plainly what you need ("log in, then hit **Capture page** in the
|
|
63
|
+
velloo toolbar on each page, then **Done**") and poll `list_captures` until
|
|
64
|
+
their captures land. Then verify with `compare_to_url { captureId }` instead
|
|
65
|
+
of `url`: the capture is already past the login and frozen, so it can't bounce
|
|
66
|
+
to a login page or drift between runs. `storageStatePath` / `cookies` /
|
|
67
|
+
`localStorage` stay available for when you already hold a session.
|
|
68
|
+
- If you cannot get a real capture, **leave it unverified and say so.** Tuning a
|
|
69
|
+
design toward a page you never saw is worse than admitting the gap.
|
|
70
|
+
- For a dashboard or feed whose content shifts between loads, pass
|
|
71
|
+
`cacheUrl: true` so you diff against one frozen capture instead of drifting
|
|
72
|
+
content.
|
|
73
|
+
|
|
74
|
+
0.85+ similarity is a faithful structural port. Don't chase 1.0 — fonts and
|
|
75
|
+
live data legitimately differ.
|
|
76
|
+
|
|
77
|
+
## 3. Establish component fidelity before adapting anything
|
|
78
|
+
|
|
79
|
+
Only after theme parity, call `component_status { screen: "<id>" }` for each
|
|
80
|
+
screen you're about to design or verify (or `{ ids: [...] }` before a screen
|
|
81
|
+
exists). Check `mounted` first: the mount is all-or-nothing, so a single
|
|
82
|
+
`unavailable` component keeps the whole screen — and every screenshot and
|
|
83
|
+
`compare_to_url` of it — on Velloo's bundled components, whatever the other
|
|
84
|
+
statuses say. Fix or replace the blocking component before trusting any
|
|
85
|
+
`exact`. Treat the statuses as part of the design brief:
|
|
86
|
+
|
|
87
|
+
- **`exact`** — Velloo compile-checked and selected the app's source file for
|
|
88
|
+
the whole-screen canvas mount. Custom CVA variants and ordinary explicit
|
|
89
|
+
props are also reflected into discovery when their syntax is recognizable.
|
|
90
|
+
- **`adapted`** — the real family depends on portals, runtime state, browser
|
|
91
|
+
layout, or another interaction that conflicts with a static selectable
|
|
92
|
+
canvas. Velloo deliberately renders a canvas-safe counterpart. Preserve the
|
|
93
|
+
component identity and props, but do not claim pixel-identical behavior.
|
|
94
|
+
- **`fallback`** — the app file is absent or failed the browser preflight, so a
|
|
95
|
+
bundled provider component or Velloo helper is rendering. Read the returned
|
|
96
|
+
note/errors before deciding whether the visual difference matters.
|
|
97
|
+
- **`unavailable`** — there is no usable canvas source, so a screen using it
|
|
98
|
+
does not mount at all (`mounted: false`); read its errors — a resolution
|
|
99
|
+
failure usually means the recorded app root is wrong
|
|
100
|
+
(`velloo design set-app-root`).
|
|
101
|
+
|
|
102
|
+
Host-source edits invalidate the canvas bundle automatically. After changing a
|
|
103
|
+
component, wait for the frame to reload and call `component_status` again; do
|
|
104
|
+
not restart the daemon merely to pick up a normal source edit.
|
|
105
|
+
|
|
106
|
+
## 4. Close only the important remaining gaps
|
|
107
|
+
|
|
108
|
+
If an on-screen component is not `exact` and the difference is load-bearing,
|
|
109
|
+
read its source and choose the smallest honest adaptation:
|
|
110
|
+
|
|
111
|
+
- **A snippet** (`add_snippet`) that composes library primitives to match the
|
|
112
|
+
component's appearance. It stays editable on the canvas and is the preferred
|
|
113
|
+
answer for a bespoke compound component that is outside the shadcn library.
|
|
114
|
+
Library compound components whose files are `exact` already preserve their
|
|
115
|
+
children in the whole-screen mount and do not need a snippet. `render_snippet`
|
|
116
|
+
immediately after defining one.
|
|
117
|
+
- **`$emitAs { name, importPath }`** on the node when the preview can be an
|
|
118
|
+
approximation but the generated code must import the real component. Design
|
|
119
|
+
with primitives, emit `<DataTable />`. Use this for anything whose appearance
|
|
120
|
+
you cannot reasonably rebuild but whose identity in the code matters.
|
|
121
|
+
- **A live extension** (`add_extension` with `render: "live"`) only for the
|
|
122
|
+
genuinely dynamic minority — charts above all. It bundles the real host file
|
|
123
|
+
and client-mounts it, so it is the one path that renders the user's actual
|
|
124
|
+
code. Know its limits before reaching for it: children are stripped, the
|
|
125
|
+
mount is visual-only, and it breaks whenever the host file doesn't compile.
|
|
126
|
+
Never the default for library components, and never use it to work around a
|
|
127
|
+
compound component with children.
|
|
128
|
+
|
|
129
|
+
Do not replace an `adapted` overlay merely because its status is not `exact`;
|
|
130
|
+
the adaptation is what keeps dialogs, menus, popovers, and similar components
|
|
131
|
+
visible and selectable on a static canvas. Adapt only when the visual contract
|
|
132
|
+
the user cares about is materially different.
|
|
133
|
+
|
|
134
|
+
## 5. Leave a record
|
|
135
|
+
|
|
136
|
+
Write what you found as a note on the main board (`add_note`) so the next
|
|
137
|
+
session — and the user — knows where things stand. Three headings, honest:
|
|
138
|
+
|
|
139
|
+
- **Exact** — theme imported from `<path>`, fonts, and the components reported
|
|
140
|
+
`exact` by `component_status`.
|
|
141
|
+
- **Adapted / fallback** — the status, reason, and any snippet / `$emitAs` / live
|
|
142
|
+
decision made to close a load-bearing difference.
|
|
143
|
+
- **Unverified** — screens behind auth you couldn't reach, pages whose dev
|
|
144
|
+
server wouldn't start, tokens the stylesheet didn't declare.
|
|
145
|
+
|
|
146
|
+
Re-running this skill updates that note (`list_notes` → `update_note`) rather
|
|
147
|
+
than adding a second one.
|
|
148
|
+
|
|
149
|
+
## Then design
|
|
150
|
+
|
|
151
|
+
Calibration is not the deliverable — it's what makes the deliverable
|
|
152
|
+
trustworthy. Hand off to **velloo-design** for the actual screen work,
|
|
153
|
+
**velloo-brand** or **velloo-design-system** for identity and token work, and
|
|
154
|
+
**velloo-implement** when a design becomes code. Tell the user in one line what
|
|
155
|
+
you matched and what stayed unverified, then get on with the design task they
|
|
156
|
+
asked for.
|