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,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,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.
|