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.
Files changed (267) hide show
  1. package/BUN-LICENSE.md +91 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +9 -0
  4. package/README.md +288 -2
  5. package/THIRD-PARTY-NOTICES.md +467 -0
  6. package/assets/elsewhere-alps-9fqhv029.jpg +0 -0
  7. package/assets/elsewhere-bali-vp60g115.jpg +0 -0
  8. package/assets/elsewhere-forest-xgn23zrj.jpg +0 -0
  9. package/assets/elsewhere-japan-qs7qkbr2.jpg +0 -0
  10. package/assets/elsewhere-kyoto-map-n2bvkrya.svg +1 -0
  11. package/assets/elsewhere-kyoto-qemtn6nk.jpg +0 -0
  12. package/assets/elsewhere-room-g1gaw7cs.jpg +0 -0
  13. package/canvas/apple-touch-icon.png +0 -0
  14. package/canvas/assets/index-BCvDZiBo.css +2 -0
  15. package/canvas/assets/index-ClaBqcaS.js +28 -0
  16. package/canvas/assets/lucide-all-iIF-pmzN.js +1 -0
  17. package/canvas/assets/radix-C3HaOB-d.js +41 -0
  18. package/canvas/assets/react-D0Ec-185.js +9 -0
  19. package/canvas/assets/rolldown-runtime-hePW80VL.js +1 -0
  20. package/canvas/assets/vendor-CKmQ-Zst.js +53 -0
  21. package/canvas/favicon.ico +0 -0
  22. package/canvas/favicon.svg +12 -0
  23. package/canvas/fonts/OFL-1.1.txt +93 -0
  24. package/canvas/fonts/poppins-700.woff2 +0 -0
  25. package/canvas/icon-192.png +0 -0
  26. package/canvas/icon-512.png +0 -0
  27. package/canvas/index.html +22 -0
  28. package/canvas/site.webmanifest +11 -0
  29. package/chunk-08sv3k41.js +4 -0
  30. package/chunk-0fe83yzt.js +2 -0
  31. package/chunk-0t68szgr.js +3 -0
  32. package/chunk-1h55s5he.js +2 -0
  33. package/chunk-2c7jbx46.js +2 -0
  34. package/chunk-2smsg2ct.js +7 -0
  35. package/chunk-308ynsxd.js +2 -0
  36. package/chunk-3e8vez4d.js +1229 -0
  37. package/chunk-40xgcth8.js +63 -0
  38. package/chunk-4dn75m6t.js +3 -0
  39. package/chunk-4fj5tahv.js +3 -0
  40. package/chunk-6nqghjda.js +3 -0
  41. package/chunk-6tx68d90.js +3 -0
  42. package/chunk-6w6ch4ce.js +2 -0
  43. package/chunk-735ezz23.js +86 -0
  44. package/chunk-7eq7nx37.js +7 -0
  45. package/chunk-7eyb8yrf.js +6 -0
  46. package/chunk-80fjfyha.js +86 -0
  47. package/chunk-80r93t2e.js +4 -0
  48. package/chunk-94vx1yb0.js +3 -0
  49. package/chunk-9vg3yafz.js +3 -0
  50. package/chunk-a84n72m2.js +4 -0
  51. package/chunk-ampmdzz4.js +10 -0
  52. package/chunk-avns4dbf.js +2 -0
  53. package/chunk-ayrb3qnm.js +3 -0
  54. package/chunk-bwnvcncx.js +3 -0
  55. package/chunk-ccszg02q.js +5 -0
  56. package/chunk-cvn689d5.js +3 -0
  57. package/chunk-cxe6jjwj.js +3 -0
  58. package/chunk-dg6z4vdd.js +3 -0
  59. package/chunk-dgwjpbp9.js +3 -0
  60. package/chunk-dy41n60j.js +52 -0
  61. package/chunk-ek71z2fv.js +226 -0
  62. package/chunk-er1fxb7d.js +2 -0
  63. package/chunk-eyr8hrzf.js +2 -0
  64. package/chunk-fjbzk4sw.js +3 -0
  65. package/chunk-fsbsksga.js +3 -0
  66. package/chunk-h6gchare.js +3 -0
  67. package/chunk-hcb68zt7.js +85 -0
  68. package/chunk-hggap8fq.js +3 -0
  69. package/chunk-j11fyeqh.js +2 -0
  70. package/chunk-jb21jkp1.js +8 -0
  71. package/chunk-jfx9xjmr.js +18 -0
  72. package/chunk-jr0ss0mm.js +303 -0
  73. package/chunk-jrsknzjt.js +3 -0
  74. package/chunk-jv0xggh0.js +2 -0
  75. package/chunk-k17gfwq3.js +2 -0
  76. package/chunk-mh2pr7cq.js +5 -0
  77. package/chunk-mnapdp1y.js +2 -0
  78. package/chunk-mzhdrawd.js +3 -0
  79. package/chunk-n9gs6yx9.js +2 -0
  80. package/chunk-ngnymg2q.js +3 -0
  81. package/chunk-nwx5700b.js +3 -0
  82. package/chunk-pjtg3wnm.js +4 -0
  83. package/chunk-pp86v6m6.js +3 -0
  84. package/chunk-r22epxz2.js +3 -0
  85. package/chunk-rgasy862.js +5 -0
  86. package/chunk-rpwpeph5.js +3 -0
  87. package/chunk-s23gtejf.js +3 -0
  88. package/chunk-sjgqnykd.js +6 -0
  89. package/chunk-sn3x2m0m.js +6 -0
  90. package/chunk-t448rrfr.js +2 -0
  91. package/chunk-tdsk5wxa.js +451 -0
  92. package/chunk-v40fn08f.js +442 -0
  93. package/chunk-vbk1qhdz.js +3 -0
  94. package/chunk-vdkrbzh1.js +2 -0
  95. package/chunk-vgmr98cv.js +40 -0
  96. package/chunk-vsv8z729.js +6 -0
  97. package/chunk-x4f4k9pp.js +26 -0
  98. package/chunk-xt5ayg7g.js +4 -0
  99. package/chunk-ydhwv29b.js +244 -0
  100. package/chunk-zb6hc1y0.js +2 -0
  101. package/cli.js +3 -0
  102. package/launcher.cjs +97 -0
  103. package/package.json +58 -5
  104. package/pkgs/helpers/src/box.tsx +21 -0
  105. package/pkgs/helpers/src/cn.ts +32 -0
  106. package/pkgs/helpers/src/descriptors.ts +270 -0
  107. package/pkgs/helpers/src/divider.tsx +123 -0
  108. package/pkgs/helpers/src/gradient.tsx +90 -0
  109. package/pkgs/helpers/src/heading.tsx +20 -0
  110. package/pkgs/helpers/src/icon-data.ts +8009 -0
  111. package/pkgs/helpers/src/icon.tsx +53 -0
  112. package/pkgs/helpers/src/image.tsx +111 -0
  113. package/pkgs/helpers/src/index.ts +29 -0
  114. package/pkgs/helpers/src/layer.tsx +61 -0
  115. package/pkgs/helpers/src/lowering.ts +53 -0
  116. package/pkgs/helpers/src/paths.ts +47 -0
  117. package/pkgs/helpers/src/placeholder.tsx +88 -0
  118. package/pkgs/helpers/src/prose.tsx +42 -0
  119. package/pkgs/helpers/src/registry.ts +41 -0
  120. package/pkgs/helpers/src/svg.tsx +62 -0
  121. package/pkgs/helpers/src/text.tsx +16 -0
  122. package/pkgs/provider-antd/src/index.ts +78 -0
  123. package/pkgs/provider-antd/src/intro.ts +14 -0
  124. package/pkgs/provider-antd/src/manifest.ts +439 -0
  125. package/pkgs/provider-antd/src/overlays.ts +176 -0
  126. package/pkgs/provider-antd/src/registry.ts +104 -0
  127. package/pkgs/provider-antd/src/render-pass.ts +43 -0
  128. package/pkgs/provider-antd/src/tailwind-entry.css +21 -0
  129. package/pkgs/provider-antd/src/theme.ts +132 -0
  130. package/pkgs/provider-antd/src/version.ts +8 -0
  131. package/pkgs/provider-chakra/src/index.ts +80 -0
  132. package/pkgs/provider-chakra/src/intro.ts +14 -0
  133. package/pkgs/provider-chakra/src/manifest.ts +421 -0
  134. package/pkgs/provider-chakra/src/overlays.ts +246 -0
  135. package/pkgs/provider-chakra/src/registry.ts +227 -0
  136. package/pkgs/provider-chakra/src/render-pass.ts +55 -0
  137. package/pkgs/provider-chakra/src/tailwind-entry.css +21 -0
  138. package/pkgs/provider-chakra/src/theme.ts +180 -0
  139. package/pkgs/provider-chakra/src/version.ts +8 -0
  140. package/pkgs/provider-mui/src/index.ts +117 -0
  141. package/pkgs/provider-mui/src/intro.ts +12 -0
  142. package/pkgs/provider-mui/src/manifest.ts +263 -0
  143. package/pkgs/provider-mui/src/overlays.ts +124 -0
  144. package/pkgs/provider-mui/src/registry.ts +120 -0
  145. package/pkgs/provider-mui/src/render-pass.ts +36 -0
  146. package/pkgs/provider-mui/src/tailwind-entry.css +21 -0
  147. package/pkgs/provider-mui/src/theme.ts +129 -0
  148. package/pkgs/provider-mui/src/version.ts +8 -0
  149. package/pkgs/provider-none/src/components-inline.tsx +204 -0
  150. package/pkgs/provider-none/src/components.tsx +155 -0
  151. package/pkgs/provider-none/src/index.ts +57 -0
  152. package/pkgs/provider-none/src/intro.ts +18 -0
  153. package/pkgs/provider-none/src/manifest.ts +163 -0
  154. package/pkgs/provider-none/src/registry-inline.ts +36 -0
  155. package/pkgs/provider-none/src/registry.ts +39 -0
  156. package/pkgs/provider-none/src/tailwind-entry.css +57 -0
  157. package/pkgs/provider-none/src/version.ts +10 -0
  158. package/pkgs/schema/src/annotation.ts +120 -0
  159. package/pkgs/schema/src/asset.ts +66 -0
  160. package/pkgs/schema/src/board.ts +71 -0
  161. package/pkgs/schema/src/comment.ts +107 -0
  162. package/pkgs/schema/src/config.ts +185 -0
  163. package/pkgs/schema/src/css-sanitize.ts +56 -0
  164. package/pkgs/schema/src/extension.ts +105 -0
  165. package/pkgs/schema/src/fonts.ts +690 -0
  166. package/pkgs/schema/src/frame.ts +40 -0
  167. package/pkgs/schema/src/icon-name.ts +21 -0
  168. package/pkgs/schema/src/ids.ts +14 -0
  169. package/pkgs/schema/src/index.ts +169 -0
  170. package/pkgs/schema/src/migrate.ts +297 -0
  171. package/pkgs/schema/src/node.ts +229 -0
  172. package/pkgs/schema/src/paths.ts +28 -0
  173. package/pkgs/schema/src/repo.ts +134 -0
  174. package/pkgs/schema/src/screen.ts +30 -0
  175. package/pkgs/schema/src/snippet-resolve.ts +193 -0
  176. package/pkgs/schema/src/snippet.ts +104 -0
  177. package/pkgs/schema/src/svg-sanitize.ts +487 -0
  178. package/pkgs/schema/src/theme.ts +218 -0
  179. package/pkgs/schema/src/typeset.ts +693 -0
  180. package/pkgs/schema/src/validate-ids.ts +46 -0
  181. package/pkgs/schema/src/viewport.ts +8 -0
  182. package/pkgs/shadcn-snapshot/dist/manifest.json +8109 -0
  183. package/pkgs/shadcn-snapshot/src/components/canvas-portal.tsx +55 -0
  184. package/pkgs/shadcn-snapshot/src/components/ui/accordion.tsx +122 -0
  185. package/pkgs/shadcn-snapshot/src/components/ui/alert-dialog.tsx +164 -0
  186. package/pkgs/shadcn-snapshot/src/components/ui/alert.tsx +74 -0
  187. package/pkgs/shadcn-snapshot/src/components/ui/aspect-ratio.tsx +13 -0
  188. package/pkgs/shadcn-snapshot/src/components/ui/attachment.tsx +197 -0
  189. package/pkgs/shadcn-snapshot/src/components/ui/avatar.tsx +100 -0
  190. package/pkgs/shadcn-snapshot/src/components/ui/badge.tsx +50 -0
  191. package/pkgs/shadcn-snapshot/src/components/ui/breadcrumb.tsx +109 -0
  192. package/pkgs/shadcn-snapshot/src/components/ui/bubble.tsx +130 -0
  193. package/pkgs/shadcn-snapshot/src/components/ui/button-group.tsx +82 -0
  194. package/pkgs/shadcn-snapshot/src/components/ui/button.tsx +72 -0
  195. package/pkgs/shadcn-snapshot/src/components/ui/calendar.tsx +229 -0
  196. package/pkgs/shadcn-snapshot/src/components/ui/card.tsx +92 -0
  197. package/pkgs/shadcn-snapshot/src/components/ui/carousel.tsx +235 -0
  198. package/pkgs/shadcn-snapshot/src/components/ui/chart-option.ts +250 -0
  199. package/pkgs/shadcn-snapshot/src/components/ui/chart.tsx +177 -0
  200. package/pkgs/shadcn-snapshot/src/components/ui/checkbox.tsx +41 -0
  201. package/pkgs/shadcn-snapshot/src/components/ui/collapsible.tsx +32 -0
  202. package/pkgs/shadcn-snapshot/src/components/ui/combobox.tsx +196 -0
  203. package/pkgs/shadcn-snapshot/src/components/ui/context-menu.tsx +227 -0
  204. package/pkgs/shadcn-snapshot/src/components/ui/dialog.tsx +131 -0
  205. package/pkgs/shadcn-snapshot/src/components/ui/direction.tsx +24 -0
  206. package/pkgs/shadcn-snapshot/src/components/ui/drawer.tsx +112 -0
  207. package/pkgs/shadcn-snapshot/src/components/ui/dropdown-menu.tsx +205 -0
  208. package/pkgs/shadcn-snapshot/src/components/ui/empty.tsx +98 -0
  209. package/pkgs/shadcn-snapshot/src/components/ui/field.tsx +228 -0
  210. package/pkgs/shadcn-snapshot/src/components/ui/hover-card.tsx +51 -0
  211. package/pkgs/shadcn-snapshot/src/components/ui/input-group.tsx +148 -0
  212. package/pkgs/shadcn-snapshot/src/components/ui/input.tsx +43 -0
  213. package/pkgs/shadcn-snapshot/src/components/ui/item.tsx +187 -0
  214. package/pkgs/shadcn-snapshot/src/components/ui/kbd.tsx +30 -0
  215. package/pkgs/shadcn-snapshot/src/components/ui/label.tsx +25 -0
  216. package/pkgs/shadcn-snapshot/src/components/ui/marker.tsx +71 -0
  217. package/pkgs/shadcn-snapshot/src/components/ui/menubar.tsx +243 -0
  218. package/pkgs/shadcn-snapshot/src/components/ui/message.tsx +89 -0
  219. package/pkgs/shadcn-snapshot/src/components/ui/native-select.tsx +60 -0
  220. package/pkgs/shadcn-snapshot/src/components/ui/navigation-menu.tsx +165 -0
  221. package/pkgs/shadcn-snapshot/src/components/ui/pagination.tsx +117 -0
  222. package/pkgs/shadcn-snapshot/src/components/ui/popover.tsx +66 -0
  223. package/pkgs/shadcn-snapshot/src/components/ui/progress.tsx +35 -0
  224. package/pkgs/shadcn-snapshot/src/components/ui/radio-group.tsx +48 -0
  225. package/pkgs/shadcn-snapshot/src/components/ui/scroll-area.tsx +59 -0
  226. package/pkgs/shadcn-snapshot/src/components/ui/select.tsx +180 -0
  227. package/pkgs/shadcn-snapshot/src/components/ui/separator.tsx +32 -0
  228. package/pkgs/shadcn-snapshot/src/components/ui/sheet.tsx +107 -0
  229. package/pkgs/shadcn-snapshot/src/components/ui/skeleton.tsx +17 -0
  230. package/pkgs/shadcn-snapshot/src/components/ui/slider.tsx +68 -0
  231. package/pkgs/shadcn-snapshot/src/components/ui/sonner.tsx +91 -0
  232. package/pkgs/shadcn-snapshot/src/components/ui/spinner.tsx +21 -0
  233. package/pkgs/shadcn-snapshot/src/components/ui/switch.tsx +41 -0
  234. package/pkgs/shadcn-snapshot/src/components/ui/table.tsx +93 -0
  235. package/pkgs/shadcn-snapshot/src/components/ui/tabs.tsx +84 -0
  236. package/pkgs/shadcn-snapshot/src/components/ui/textarea.tsx +24 -0
  237. package/pkgs/shadcn-snapshot/src/components/ui/toggle-group.tsx +94 -0
  238. package/pkgs/shadcn-snapshot/src/components/ui/toggle.tsx +50 -0
  239. package/pkgs/shadcn-snapshot/src/components/ui/tooltip.tsx +47 -0
  240. package/pkgs/shadcn-snapshot/src/examples.ts +36 -0
  241. package/pkgs/shadcn-snapshot/src/groups.ts +87 -0
  242. package/pkgs/shadcn-snapshot/src/index.ts +43 -0
  243. package/pkgs/shadcn-snapshot/src/lib/utils.ts +4 -0
  244. package/pkgs/shadcn-snapshot/src/manifest.ts +12 -0
  245. package/pkgs/shadcn-snapshot/src/notes.ts +97 -0
  246. package/pkgs/shadcn-snapshot/src/paths.ts +47 -0
  247. package/pkgs/shadcn-snapshot/src/registry-files.ts +293 -0
  248. package/pkgs/shadcn-snapshot/src/registry.ts +631 -0
  249. package/pkgs/shadcn-snapshot/src/shadcn-tailwind.css +632 -0
  250. package/pkgs/shadcn-snapshot/src/tailwind-entry.css +159 -0
  251. package/pkgs/shadcn-snapshot/src/version.ts +8 -0
  252. package/plugins/claude/velloo/.claude-plugin/plugin.json +6 -0
  253. package/plugins/claude/velloo/agents/velloo-design-reviewer.md +33 -0
  254. package/plugins/claude/velloo/agents/velloo-designer.md +39 -0
  255. package/plugins/claude/velloo/commands/design.md +11 -0
  256. package/plugins/claude/velloo/commands/implement.md +10 -0
  257. package/plugins/claude/velloo/commands/review.md +8 -0
  258. package/plugins/gemini/GEMINI.md +31 -0
  259. package/plugins/gemini/commands/velloo/design.toml +10 -0
  260. package/plugins/gemini/commands/velloo/implement.toml +9 -0
  261. package/plugins/gemini/gemini-extension.json +9 -0
  262. package/skills/velloo-brand/SKILL.md +124 -0
  263. package/skills/velloo-design/SKILL.md +144 -0
  264. package/skills/velloo-design-system/SKILL.md +90 -0
  265. package/skills/velloo-implement/SKILL.md +101 -0
  266. package/skills/velloo-logo/SKILL.md +93 -0
  267. 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.