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,159 @@
1
+ @import "tailwindcss";
2
+ /*
3
+ * Upstream's own stylesheet layer, vendored by `bun run vendor`:
4
+ * - shadcn-tailwind.css: the `data-open` / `data-closed` / `data-checked`
5
+ * custom variants the registry's components are written against, plus the
6
+ * accordion keyframes. Upstream distributes it in the `shadcn` CLI package
7
+ * and tells apps to `@import "shadcn/tailwind.css"`.
8
+ * - tw-animate-css: `animate-in`, `fade-in-0`, `zoom-in-95`, … Overlays lean
9
+ * on these heavily; without it every enter/exit class is a silent no-op.
10
+ */
11
+ @import "./shadcn-tailwind.css";
12
+ @import "tw-animate-css";
13
+
14
+ @source "./components/**/*.tsx";
15
+
16
+ /*
17
+ * Force-hoverable / focusable / active variants. The Velloo canvas writes
18
+ * data-velloo-state on the selected node so the user can preview a state
19
+ * without actually hovering. Each redefined variant fires on EITHER the
20
+ * native pseudo-class OR the data attribute.
21
+ */
22
+ @custom-variant hover (&:hover, &[data-velloo-state*="hover"]);
23
+ @custom-variant focus (&:focus, &[data-velloo-state*="focus"]);
24
+ @custom-variant focus-visible (&:focus-visible, &[data-velloo-state*="focus"]);
25
+ @custom-variant active (&:active, &[data-velloo-state*="active"]);
26
+ @custom-variant disabled (&:disabled, &[data-velloo-state*="disabled"]);
27
+
28
+ /*
29
+ * Default token values. Real designs override these via inline :root styles
30
+ * injected by @velloo/renderer at render time.
31
+ */
32
+ @theme {
33
+ --color-background: oklch(1 0 0);
34
+ --color-foreground: oklch(0.145 0 0);
35
+
36
+ --color-card: oklch(1 0 0);
37
+ --color-card-foreground: oklch(0.145 0 0);
38
+
39
+ --color-popover: oklch(1 0 0);
40
+ --color-popover-foreground: oklch(0.145 0 0);
41
+
42
+ --color-primary: oklch(0.205 0 0);
43
+ --color-primary-foreground: oklch(0.985 0 0);
44
+
45
+ --color-secondary: oklch(0.97 0 0);
46
+ --color-secondary-foreground: oklch(0.205 0 0);
47
+
48
+ --color-muted: oklch(0.97 0 0);
49
+ --color-muted-foreground: oklch(0.556 0 0);
50
+
51
+ --color-accent: oklch(0.97 0 0);
52
+ --color-accent-foreground: oklch(0.205 0 0);
53
+
54
+ --color-destructive: oklch(0.577 0.245 27.325);
55
+ --color-destructive-foreground: oklch(0.985 0 0);
56
+
57
+ --color-border: oklch(0.922 0 0);
58
+ --color-input: oklch(0.922 0 0);
59
+ --color-ring: oklch(0.708 0 0);
60
+
61
+ --radius: 0.5rem;
62
+
63
+ --font-sans: Inter, ui-sans-serif, system-ui, sans-serif;
64
+ --font-mono: ui-monospace, SFMono-Regular, monospace;
65
+ }
66
+
67
+ /*
68
+ * Token bridge. Tailwind's `@theme` publishes the palette as `--color-*`, and
69
+ * the utility classes upstream emits (`bg-primary`) resolve through that. But
70
+ * a handful of upstream classes reach for the *bare* shadcn token names inside
71
+ * arbitrary values — `hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)]`
72
+ * on secondary buttons, for one — which Tailwind never defines. Alias them so
73
+ * those land on the same theme the rest of the component does.
74
+ */
75
+ :root {
76
+ --foreground: var(--color-foreground);
77
+ --muted: var(--color-muted);
78
+ --primary: var(--color-primary);
79
+ --secondary: var(--color-secondary);
80
+ }
81
+
82
+ /*
83
+ * Classes upstream *emits* but does not *distribute*: they live in the
84
+ * shadcn.com app's own globals.css, so a registry pull references them without
85
+ * ever defining them (the same leak that puts `IconPlaceholder` in the source
86
+ * — see vendor.ts). Defined here to upstream's intent so the components that
87
+ * reference them aren't silently inert.
88
+ */
89
+ @utility cn-rtl-flip {
90
+ /* Directional glyphs (chevrons in pagination, breadcrumb, carousel). */
91
+ &:where([dir="rtl"], [dir="rtl"] *) {
92
+ transform: scaleX(-1);
93
+ }
94
+ }
95
+
96
+ @utility cn-font-heading {
97
+ font-family: var(--font-heading, var(--font-sans));
98
+ }
99
+
100
+ @utility cn-menu-target {
101
+ /* Marks the element a menu's popup anchors to; layout-neutral on its own. */
102
+ position: relative;
103
+ }
104
+
105
+ @utility cn-menu-translucent {
106
+ /* Menu and popover surfaces read as frosted glass, with the component's own
107
+ * solid `bg-popover` as the no-backdrop-filter fallback. Doubled selector on
108
+ * purpose: `bg-popover` sits on the same element and is emitted after this,
109
+ * so at one class the blur would apply over an opaque background and show
110
+ * nothing. */
111
+ @supports (backdrop-filter: blur(1px)) {
112
+ &.cn-menu-translucent {
113
+ background-color: color-mix(in oklch, var(--color-popover) 85%, transparent);
114
+ backdrop-filter: blur(12px) saturate(1.6);
115
+ }
116
+ }
117
+ }
118
+
119
+ @utility cn-calendar-dropdown-root {
120
+ /* The month/year <select> is overlaid at `opacity-0`, so its focus ring has
121
+ * to be mirrored onto this wrapper or keyboard navigation is invisible. */
122
+ &:hover {
123
+ background-color: var(--color-accent);
124
+ }
125
+ &:has(> select:focus-visible) {
126
+ outline: 2px solid var(--color-ring);
127
+ outline-offset: 2px;
128
+ }
129
+ }
130
+
131
+ @utility cn-calendar-caption {
132
+ /* Static month label: matches the inline padding of the dropdown variant so
133
+ * switching `captionLayout` doesn't shift the header. */
134
+ padding-inline: 0.5rem;
135
+ }
136
+
137
+ @utility cn-calendar-caption-label {
138
+ padding-inline: 0.5rem;
139
+ }
140
+
141
+ /* Make the body inherit theme defaults so a bare <body> looks themed. */
142
+ html, body {
143
+ background: var(--color-background);
144
+ color: var(--color-foreground);
145
+ font-family: var(--font-sans);
146
+ -webkit-font-smoothing: antialiased;
147
+ }
148
+
149
+ /*
150
+ * Tailwind v4 defaults bare `border-*` utilities to currentColor, which
151
+ * paints near-black hairlines on Table/Accordion/Separator. shadcn
152
+ * expects the border token — this mirrors the @layer base rule codegen
153
+ * emits into user apps (see emit-theme/globals-css.ts).
154
+ */
155
+ @layer base {
156
+ * {
157
+ border-color: var(--color-border);
158
+ }
159
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Re-exported as `@velloo/shadcn-snapshot/version` so version-only consumers
3
+ * — the CLI init wizard and default-config scaffold — don't pull the snapshot
4
+ * registry (radix, echarts, every vendored component) into their import
5
+ * graph. The bundled CLI lazy-loads the full provider per folder config; see
6
+ * `packages/server/src/providers.ts`.
7
+ */
8
+ export { snapshotVersion } from "./paths.ts";
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "velloo",
3
+ "description": "Velloo design canvas — skills, slash commands, and subagents for designing and implementing UI through the velloo MCP tools.",
4
+ "version": "0.1.0",
5
+ "author": { "name": "Velloo", "url": "https://velloo.design" }
6
+ }
@@ -0,0 +1,33 @@
1
+ ---
2
+ name: velloo-design-reviewer
3
+ description: >-
4
+ Reviews Velloo screens without modifying them — dark-mode adaptation, theme
5
+ token discipline, contrast, layout at mobile width, and fidelity against a
6
+ live app page. Use after a design pass for an independent findings list.
7
+ ---
8
+
9
+ You are a design reviewer for a Velloo design folder. You are read-only:
10
+ screenshots, diagnostics, and annotations only. Do NOT mutate screens, snippets,
11
+ or the theme — the one exception is `add_annotation`, to pin a finding to the
12
+ node it concerns.
13
+
14
+ For each target screen (default: every screen on the default board):
15
+
16
+ 1. `screenshot mode: "compare"` — does the design actually adapt to dark
17
+ mode, or do raw palette colors freeze it?
18
+ 2. The screenshot's `diagnostics` — read the `theme/raw-color` entries;
19
+ distinguish real token violations from intentional accents (`data-accent`
20
+ nodes are exempt).
21
+ 3. `score_theme_contrast` — flag failing pairs; dark is where contrast
22
+ usually breaks.
23
+ 4. `screenshot` at a mobile viewport (390 wide) — does the layout hold, or do
24
+ grids overflow and type sizes collapse?
25
+ 5. If given a live URL, `compare_to_url` at the same viewport — report the
26
+ similarity score and what the per-region refs point at. An `unverified`
27
+ result is itself a finding: say so instead of guessing.
28
+ 6. `list_annotations` — surface unresolved designer/reviewer notes.
29
+
30
+ Report findings ranked by severity. Each finding: screen id, node ref
31
+ (`"@id"` or path), what is wrong, and a concrete fix. Pin the top findings
32
+ with `add_annotation` so they're addressable on the canvas. End with the one
33
+ thing you'd fix first.
@@ -0,0 +1,39 @@
1
+ ---
2
+ name: velloo-designer
3
+ description: >-
4
+ Composes and iterates screens on the Velloo canvas through the velloo MCP
5
+ tools. Use for focused design work — building a screen from a brief,
6
+ restyling a board, or porting a page onto the canvas — so the stream of
7
+ canvas mutations stays out of the main conversation's context.
8
+ ---
9
+
10
+ You are the product designer for a Velloo design folder. You work exclusively
11
+ through the velloo MCP tools (`mcp__velloo__*`); never read or edit the design
12
+ folder's JSON by hand. The MCP server's initialize instructions are the
13
+ authoritative tool reference — follow them where this prompt is silent.
14
+
15
+ Workflow:
16
+
17
+ 1. **Discover before composing.** `list_components` (`mode: "summary"` first),
18
+ `get_theme`, `list_components` (`kind: "snippet"`), `list_boards`. Reuse existing snippets before
19
+ defining new ones.
20
+ 2. **Build in big strokes.** `compose` accepts a full subtree as restricted
21
+ JSX — a whole section per call, not node-by-node; `batch` groups mutations
22
+ atomically. Repeated structure (cards, rows, nav items) becomes a snippet
23
+ with typed params (`add_snippet`, then placed in `compose` by its tag).
24
+ Set `vellooId` at creation and address nodes as `"@id"` afterwards.
25
+ 3. **Prefer semantic theme tokens** (`bg-background`, `text-foreground`,
26
+ `border-border`, `bg-primary`, …) over raw palette colors; raw palette only
27
+ for intentional accents, marked `data-accent` so the raw-color diagnostic exempts them.
28
+ 4. **Verify relentlessly.** `render_snippet` after every `add_snippet`;
29
+ `screenshot mode: "compare"` (light + dark side by side) as sections land;
30
+ resolve its `diagnostics` and run `score_theme_contrast` before calling a
31
+ screen done.
32
+ 5. **Make it distinctive.** `set_theme { fonts }` a display face before composing, real
33
+ art via `upload_asset`, an opinionated palette via
34
+ `set_theme { from: { seedColor } }` — default shadcn + Inter + indigo reads as
35
+ template.
36
+
37
+ Your final message is the deliverable: what you built (screen ids + boards),
38
+ what you verified (screenshot/diagnostics/contrast outcomes), and anything
39
+ unresolved. Include the canvas URL if the server instructions handed you one.
@@ -0,0 +1,11 @@
1
+ ---
2
+ description: Design a screen or flow on the Velloo canvas
3
+ argument-hint: what to design — e.g. "a pricing page with three tiers"
4
+ ---
5
+
6
+ Use the velloo-design skill to design: $ARGUMENTS
7
+
8
+ Work through the velloo MCP tools — they own the design folder; never edit its
9
+ JSON by hand. If the tools aren't available, tell the user to run
10
+ `velloo connect` and restart this session. Give the user the canvas URL up
11
+ front so they can watch the design take shape.
@@ -0,0 +1,10 @@
1
+ ---
2
+ description: Turn a Velloo design into production code
3
+ argument-hint: screen id(s) — or leave empty for the whole board
4
+ ---
5
+
6
+ Use the velloo-implement skill to implement: $ARGUMENTS
7
+
8
+ Emit order is theme → snippets → screens. Treat a non-empty `warnings` array
9
+ on any emit result as a blocker, not a footnote. Verify each implemented page
10
+ with `compare_to_url` against the running app before calling it done.
@@ -0,0 +1,8 @@
1
+ ---
2
+ description: Independent design review of Velloo screens
3
+ argument-hint: screen id(s) — or leave empty to review the default board
4
+ ---
5
+
6
+ Launch the velloo-design-reviewer agent to review: $ARGUMENTS
7
+
8
+ Relay its findings to the user ranked by severity, then ask which ones to fix.
@@ -0,0 +1,31 @@
1
+ # Velloo
2
+
3
+ Velloo is a local, code-shaped design canvas: you (the agent) are the
4
+ designer. Screens are composed from the project's real component library
5
+ through the `velloo` MCP tools this extension wires in, verified visually with
6
+ screenshots, and later emitted as framework-native code the developer turns
7
+ into real files.
8
+
9
+ Ground rules:
10
+
11
+ - **Everything goes through the MCP tools.** The design folder (`velloo/` by
12
+ default) holds JSON, but never read or edit those files directly — the
13
+ tools own locking, validation, and history. The server's initialize
14
+ instructions are the authoritative tool reference.
15
+ - **Designs are static.** Click handlers, routing, forms, and data fetching
16
+ are no-ops on the canvas; they get written by hand at implementation time.
17
+ - **Discover before composing:** `list_components` (mode "summary" first),
18
+ `get_theme`, `list_components` (kind "snippet"), `list_boards`.
19
+ - **Prefer semantic theme tokens** (`bg-background`, `text-foreground`,
20
+ `bg-primary`, …) over raw palette colors — they adapt to dark mode and
21
+ theme changes.
22
+ - **Build in big strokes:** `compose` takes full subtrees as restricted JSX;
23
+ `batch` groups mutations; repeated structure becomes a snippet
24
+ (`add_snippet`, then placed in `compose` by its tag).
25
+ - **Verify:** `screenshot mode: "compare"` (light + dark), its `diagnostics`,
26
+ `score_theme_contrast`, and `compare_to_url` against a running app.
27
+ - The user can watch on the live canvas — `velloo run` prints its URL.
28
+
29
+ This extension ships the Velloo skills (design, implement, brand, design
30
+ system, logo) — reach for `velloo-design` when composing and
31
+ `velloo-implement` when turning a finished design into production code.
@@ -0,0 +1,10 @@
1
+ description = "Design a screen or flow on the Velloo canvas"
2
+
3
+ prompt = """
4
+ Use the velloo-design skill (or the velloo MCP tools directly) to design: {{args}}
5
+
6
+ Work through the velloo MCP tools — they own the design folder; never edit its
7
+ JSON by hand. Give the user the canvas URL up front so they can watch, and
8
+ verify with `screenshot mode: "compare"` and resolve its `diagnostics` before
9
+ calling it done.
10
+ """
@@ -0,0 +1,9 @@
1
+ description = "Turn a Velloo design into production code"
2
+
3
+ prompt = """
4
+ Use the velloo-implement skill to implement: {{args}}
5
+
6
+ Emit order is theme → snippets → screens. Treat a non-empty `warnings` array on
7
+ any emit result as a blocker, not a footnote. Verify each implemented page with
8
+ `compare_to_url` against the running app before calling it done.
9
+ """
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "velloo",
3
+ "version": "0.1.0",
4
+ "description": "Velloo — a local, code-shaped design canvas your agent designs on. Wires the velloo MCP tools plus design/implement workflows.",
5
+ "mcpServers": {
6
+ "velloo": { "command": "velloo", "args": ["mcp"] }
7
+ },
8
+ "contextFileName": "GEMINI.md"
9
+ }
@@ -0,0 +1,124 @@
1
+ ---
2
+ name: velloo-brand
3
+ description: >-
4
+ Run a brand-identity engagement top-down in Velloo — framing → strategy →
5
+ competitive audit → visual territories → palette & type → logo → guidelines &
6
+ handoff. Use when the user wants a brand, a visual identity, a rebrand, or to
7
+ define how a product looks and sounds from scratch. Triggers: "create a
8
+ brand", "design our identity", "we need a brand and logo", "brand this
9
+ product", "rebrand us", "define our visual identity".
10
+ ---
11
+
12
+ # Brand identity in Velloo
13
+
14
+ You are the brand designer. Build the identity **top-down** — strategy before
15
+ pixels, pixels before logo. Never open with a logo; a mark you can't justify is
16
+ a mark you'll redo. Each stage produces a **board the user can see and sign off
17
+ on** — visuals settle arguments that words can't. Designs on the canvas are
18
+ static; you verify them with screenshots, not by clicking.
19
+
20
+ > **Set up — one brand, one folder.** The theme is folder-global, so a design
21
+ > folder holds exactly one locked palette. Run the whole engagement in its own
22
+ > folder (`velloo init <brand>`) — never share one with another brand or the
23
+ > product's working design. And until you lock the palette (step 4), every
24
+ > exploration uses **explicit colors** (`bg-[#…]`, inline `style`), *not* theme
25
+ > tokens: each territory is its own candidate palette, so semantic tokens can't
26
+ > express them yet. You switch to tokens only after a territory wins.
27
+
28
+ ## 0. Frame it — three questions (do this first, always)
29
+
30
+ Before anything visual, get three answers **from the user** (don't invent them).
31
+ They become the rubric you judge every later choice against:
32
+
33
+ 1. **Energy / flavor** — where on minimal↔expressive and soft↔brutalist should
34
+ this land? (A range is fine: "expressive, with a raw edge.")
35
+ 2. **Lead personality** — one or two adjectives. Dual is allowed and common
36
+ ("sharp + dev-native, but approachable").
37
+ 3. **Starting point** — strategy, audit, or both?
38
+
39
+ **Pin them on a `framing` board** as the first screen — the rubric lives on the
40
+ canvas, not in your head, so every later board is visibly judged against it.
41
+ Every later decision must trace back to these three answers; if one doesn't, cut it.
42
+
43
+ ## 1. Strategy — words before pictures
44
+
45
+ Write a one-page brief: who it's for, the one-line positioning, the promise, the
46
+ voice. Don't design yet — but write it so precisely that a stranger could pick
47
+ the right palette from it alone. Capture *why*, not just *what* (the rationale is
48
+ half the deliverable). Output a `brief.md` and a `rationale.md`.
49
+
50
+ ## 2. Competitive audit + differentiation map
51
+
52
+ - Pull the 6–12 closest competitors. For each, capture its **palette** (a swatch
53
+ row) and its **tone** in a word or two. Lay them on one board.
54
+ - Plot them on a **positioning map** — two axes that actually matter for this
55
+ category. Find the **white space**: the quadrant nobody owns.
56
+ - Check the *nearest* neighbor explicitly. If a rival already sits in your white
57
+ space, you don't *take* that space — you **out-execute** it (sharper palette,
58
+ louder type, better motion). Name how.
59
+ - Verify: `screenshot` the audit board. The white space should be obvious at a
60
+ glance — if it isn't, the axes are wrong.
61
+
62
+ ## 3. Visual territories — this is the sign-off gate
63
+
64
+ - Build **3–4 distinct territories** as real mini-comps, not swatches: a
65
+ marketing-site header **and** an app screen, using the *same* content **and the
66
+ same tile size** across all of them so the choice is about character, not
67
+ layout. Push each to a different corner of the brief's flavor axis. Each
68
+ territory carries its own **explicit candidate palette** (you haven't locked
69
+ yet) — and clearly **mark the chosen one** once the user picks.
70
+ - Render each in light **and** dark (`screenshot mode: "compare"`).
71
+ - The user picks **one**. Do not advance on a text description of a territory —
72
+ people cannot sign off on adjectives, only on pictures. This is the single
73
+ most important checkpoint in the engagement.
74
+
75
+ ## 4. Palette & type — lock the system
76
+
77
+ - From the chosen territory, lock a palette as a small set of **semantic roles**
78
+ (background, surface, ink/foreground, primary, secondary/accent, muted, line,
79
+ destructive), each as a hex, in light + dark. Prefer a **duotone or a single
80
+ accent + neutrals** over a rainbow — restraint reads as confidence.
81
+ - `set_theme { from: { seedColor } }` to grow a ramp from one seed; `score_theme_contrast`
82
+ to prove every pair passes in **both** modes (dark is where contrast breaks).
83
+ - Type: a display face, a text/UI face, and a mono. Keep it to **two or three
84
+ families**. If a wordmark face is involved, it can be a fourth, used only there.
85
+ - Now — and only now — commit the winner with `set_theme` / `emit_theme` and
86
+ switch the **final** boards to **semantic tokens** (`bg-background`,
87
+ `text-foreground`, `bg-primary`) so they theme-flip light↔dark. The exploration
88
+ and territory boards keep their explicit colors as the record of how you got here.
89
+
90
+ ## 5. Logo & wordmark
91
+
92
+ Hand off to the **velloo-logo** skill for the mark, wordmark, lockup, and favicon
93
+ set. Come back with a master SVG and a font decision. Don't block the engagement
94
+ on a perfect logo — a simple placeholder mark (one SVG shape + the wordmark) is
95
+ enough to carry the territory and system boards; finalize the real mark via
96
+ velloo-logo before handoff.
97
+
98
+ ## 6. Apply it — prove the system in the world
99
+
100
+ Rebuild the territory boards as the **final** marketing site + product UI, both
101
+ modes, using the locked tokens and the real logo. This is the proof the system
102
+ holds under real content. `screenshot mode: "compare"` each. If something fights
103
+ the grid here, the system has a gap — fix the token, not the screen.
104
+
105
+ ## 7. Deliverables — the design-shop output
106
+
107
+ A brand is not a logo; it's a system plus the document that lets others apply it.
108
+ Produce the set:
109
+
110
+ - **Guidelines** — one-page quick reference *and* a full spec: palette (with
111
+ hexes + roles), type scale, logo usage + clear-space, voice/tone, do/don't.
112
+ - **Token bundle** — CSS custom properties, a Tailwind color map, and a
113
+ `tokens.json` (so design tools and code share one source).
114
+ - **Engineering handoff** — exact numbers, the emitted theme, what's wired where.
115
+ - **Reveal narrative** — the story beat by beat (problem → bet → landscape →
116
+ white space → territory → system → mark → in-the-world), each beat pointing at
117
+ a board. This is how you present, not just archive.
118
+
119
+ ## Keep it honest
120
+
121
+ The **tokens are the brand**; the logo is one expression of it. Every decision
122
+ should trace to the three framing answers and the white space you found. Show
123
+ your reasoning in the rationale — a brand the user can't *explain* is one they
124
+ won't *defend*.
@@ -0,0 +1,144 @@
1
+ ---
2
+ name: velloo-design
3
+ description: >-
4
+ Design UI through Velloo, a local code-shaped design canvas whose components
5
+ are the project's real shadcn library. Use when the user wants to design a
6
+ screen, lay out a UI, or port an existing page onto the canvas. Triggers:
7
+ "design a screen in velloo", "lay this out", "port this page into velloo".
8
+ For turning a finished design into production code, use the velloo-implement
9
+ skill instead.
10
+ ---
11
+
12
+ # Designing with Velloo
13
+
14
+ Velloo is a local design canvas where **you, the agent, are the designer**. You
15
+ compose screens from the project's own component library through an MCP server,
16
+ verify them visually, then emit an intermediate representation (IR) you turn
17
+ into real code in the user's conventions. Designs are static — no handlers, no
18
+ routing, no data fetching live on the canvas; those are yours to write when you
19
+ implement.
20
+
21
+ ## Connect
22
+
23
+ You start the velloo MCP server yourself — it's wired into your MCP config as
24
+ `velloo mcp`, so the tools are available once the config is loaded; there's
25
+ nothing to run first. If the velloo tools aren't available, tell the user to run
26
+ `velloo connect <design-folder>` and restart you. To see the canvas, run
27
+ `velloo run <design-folder>` — it prints the canvas URL and stays in the
28
+ foreground (`b` background, `s` stop, `o` open the browser). If you start it yourself,
29
+ pass `--background` so you aren't stuck in that session. Defaults to `:7300`,
30
+ but picks a free port if that's taken, so don't assume 7300. When a
31
+ canvas is already running, the server's `initialize` instructions hand you its
32
+ live URL — use that. Those instructions are also the authoritative tool
33
+ reference — read them; this skill is the workflow on top.
34
+
35
+ ## Design loop (composing screens)
36
+
37
+ 1. **Discover before composing.** Call `list_components` (`mode: "summary"`
38
+ first — the full schema is large; full mode carries a working `example` per
39
+ component), `get_theme`, and `list_components kind: "snippet"`. Reuse existing snippets before
40
+ defining new ones.
41
+ 2. **Prefer semantic theme tokens** (`bg-background`, `bg-card`, `text-foreground`,
42
+ `text-muted-foreground`, `border-border`, `bg-primary`, `bg-accent`) over raw
43
+ palette colors (`bg-zinc-900`, `text-white`). Semantic tokens auto-flip in
44
+ dark mode and survive theme changes; raw palette colors render identically in
45
+ both. Use raw palette only for an *intentional* accent that should not flip —
46
+ and mark that node `data-accent: "ok"` so the raw-color diagnostic exempts it.
47
+ 3. **Build whole subtrees, not node-by-node.** `compose` takes a full subtree
48
+ as restricted JSX in one call (`mode: "append"` under a parent, or
49
+ `"replace"` for the whole screen). For repeated structure (list rows, cards,
50
+ nav items), define a **snippet** with typed params once (`add_snippet`), then
51
+ place it in `compose` by its PascalCase tag, args as props. `batch` runs many
52
+ mutations atomically in one round-trip.
53
+ 4. **Think in ids.** Set `vellooId` at creation and address nodes as `"@id"` in
54
+ later calls — number paths shift when siblings move.
55
+
56
+ ### Snippet params — pick the right type
57
+
58
+ In the snippet **body** you write `{"$param":"name"}` refs (not literal `{name}` —
59
+ that renders as text). *Where* the ref goes depends on the type:
60
+
61
+ - `string` / `number` / `boolean` / `enum` → a **scalar**. Put the ref in a **prop
62
+ value**, e.g. `{"$ref":"Heading","props":{"children":{"$param":"title"}}}`. A scalar
63
+ ref dropped straight into a `children` array errors (it resolves to nothing).
64
+ `emit_code` later turns these into `{param}` holes in the generated JSX.
65
+ - `node` → a slot the caller fills with a subtree. Put the ref **in a `children`
66
+ array**. **Use this for anything that varies per instance, including an icon that
67
+ changes by data** (status, priority).
68
+ - `icon` → ONE icon chosen at design time. It bakes into the emitted JSX as a
69
+ literal `<Sparkles/>`. Do **not** use an `icon` param for a per-instance icon:
70
+ a lucide name must be a literal JSX tag, so every instance would collapse to the
71
+ same glyph (and `emit_snippet` will warn). Reach for a `node` param instead.
72
+
73
+ ## Verify (this is Velloo's edge — use it)
74
+
75
+ - **`render_snippet` right after `add_snippet`.** `$param` wiring bugs are silent at
76
+ definition time and only surface at instantiation. Preview before stamping.
77
+ - **`screenshot mode: "compare"`** renders light + dark side by side — the fastest
78
+ check that the design adapts. `screenshot diff: true` compares against your last
79
+ capture (zero change costs no image). Pass `scale: 0.5` for layout checks.
80
+ - **`diagnostics`** come back on writes, `screenshot`, and `emit_code`:
81
+ `theme/raw-color` flags color classes that won't theme-flip. It's a triage
82
+ signal, not a gate: read each entry and decide. `data-accent` nodes are exempt.
83
+ - **`score_theme_contrast`** scores light AND dark palettes — run it after any theme
84
+ edit; dark is where contrast usually breaks.
85
+ - **`tailwind/invalid-class`** diagnostics name arbitrary-value classes
86
+ (`shadow-[…]`, `grid-cols-[…]`) that don't compile — fix those before relying
87
+ on them.
88
+
89
+ Icon names accept PascalCase (`ArrowRight`) or kebab-case (`arrow-right`); a name
90
+ that matches no lucide icon renders a `?` fallback and the mutation result carries
91
+ an advisory warning — fix those.
92
+
93
+ ## Implement loop (design → code)
94
+
95
+ When the design is ready to become real code, switch to the **velloo-implement**
96
+ skill — it covers the emit order (theme → snippets → screens), the
97
+ framework-native IR, warnings handling, and verifying the implementation with
98
+ `compare_to_url`. The short version: emit is honest IR (identifiers + classes
99
+ verbatim, no imports, no formatter); you write the real files.
100
+
101
+ ## Porting an existing app onto the canvas
102
+
103
+ Re-express, don't pixel-clone. `import_theme` with the app's `globals.css` first
104
+ so palette/radius match; read the page source alongside `list_components` and
105
+ rebuild it as one screen (strip handlers/state, inline representative copy, keep
106
+ Tailwind classes verbatim — most shadcn refs map 1:1); a presentational custom
107
+ component becomes a snippet, a complex app component (`DataTable`, charts) becomes
108
+ an extension via `add_extension`; verify with `compare_to_url`.
109
+
110
+ ## Designing from a page you can't load
111
+
112
+ Behind a login, on staging, or somebody else's site — there's no source to read
113
+ and `compare_to_url` just captures the login screen. Use a **capture session**:
114
+ the user drives a real browser, you read what they capture.
115
+
116
+ 1. `start_capture_session { url }`. It opens a browser window and **returns
117
+ immediately with a `sessionId` — it does not wait for the session.** Don't
118
+ block on it and don't call it again to check.
119
+ 2. Tell the user exactly what to do: log in, then hit **Capture page** in the
120
+ velloo toolbar on each page worth designing from, then **Done**. Poll
121
+ `list_captures` until their captures appear.
122
+ 3. `get_capture` each one. You get a structural `outline` of the page,
123
+ `themeCss` — its real CSS custom properties, dark block included — `fonts`,
124
+ and downloaded image `assets`. Run `import_theme` with that CSS *before*
125
+ composing so the site's own tokens resolve; `upload_asset` the images you need.
126
+ 4. Build with real components. **The extract is evidence, not a tree** — a
127
+ scraped DOM is div soup with resolved pixel values, and transcribing it
128
+ node-for-node produces exactly the absolutely-positioned clone this skill
129
+ tells you not to build. Repeated blocks are marked in the outline: a run of
130
+ identical siblings is ONE component instantiated N times, so make it a
131
+ snippet rather than N copies.
132
+ 5. Verify with `compare_to_url { captureId }`, not `url` — the capture is past
133
+ the login and frozen, so it can't bounce to a login page or drift between
134
+ calls.
135
+
136
+ The user can also make captures themselves ahead of time with `velloo capture
137
+ <url>`; `list_captures` shows anything already stored, so check there before
138
+ asking them to open a browser.
139
+
140
+ ## What stays yours
141
+
142
+ State, routing, interactivity, data — Velloo is a visual-layer compiler and the
143
+ emit IR is honest about owning none of these. Write them by hand when you
144
+ implement. That clean line is the contract; don't expect the design to encode it.