velloo 0.5.0 → 0.6.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 (146) hide show
  1. package/canvas/assets/index-CnyI3aig.js +29 -0
  2. package/canvas/assets/index-GNLd0pCG.css +2 -0
  3. package/canvas/assets/lucide-all-CH8LmVh0.js +1 -0
  4. package/canvas/index.html +2 -2
  5. package/{chunk-j7tzbt3d.js → chunk-08mjtg1e.js} +1 -1
  6. package/{chunk-afe25dpr.js → chunk-1gkeepkm.js} +1 -1
  7. package/{chunk-5ma8zbty.js → chunk-1td6z6ey.js} +1 -1
  8. package/{chunk-wkqrb2tz.js → chunk-2ba6edh8.js} +1 -1
  9. package/chunk-2q561dec.js +2 -0
  10. package/chunk-2web93qz.js +2 -0
  11. package/{chunk-6ytv1v2r.js → chunk-3trkmgfr.js} +1 -1
  12. package/chunk-52m26hh4.js +3 -0
  13. package/{chunk-3ffs39e8.js → chunk-56vfy0db.js} +1 -1
  14. package/{chunk-qpv28z8d.js → chunk-56z5xd5b.js} +1 -1
  15. package/{chunk-d4r0myxr.js → chunk-63y5gdzw.js} +1 -1
  16. package/{chunk-5y9hem1j.js → chunk-6813v926.js} +257 -3
  17. package/{chunk-hr3gbak5.js → chunk-69qb8p8s.js} +1 -1
  18. package/chunk-74yxy75r.js +3 -0
  19. package/{chunk-4pkw6d9n.js → chunk-8cj4swpr.js} +5 -5
  20. package/chunk-8grzf8q1.js +2 -0
  21. package/chunk-8vam2893.js +3 -0
  22. package/{chunk-675tr675.js → chunk-8vgpffn7.js} +1 -1
  23. package/{chunk-z78c1kf8.js → chunk-96qhpth5.js} +1 -1
  24. package/{chunk-tw4kw4ps.js → chunk-ab8fga32.js} +1 -1
  25. package/{chunk-asvdqkdp.js → chunk-azeqkms7.js} +1 -1
  26. package/{chunk-df557bn4.js → chunk-bc7pkjcn.js} +1 -1
  27. package/{chunk-1h3gqy7w.js → chunk-c4spp880.js} +1 -1
  28. package/{chunk-ngbqd7kb.js → chunk-chtv0yj6.js} +184 -103
  29. package/{chunk-xzkczmgg.js → chunk-dar6wbf2.js} +1 -1
  30. package/{chunk-ryga3ny1.js → chunk-e2btp1wd.js} +1 -1
  31. package/{chunk-rd65xm6r.js → chunk-eqjtq673.js} +1 -1
  32. package/{chunk-vrvkvb0v.js → chunk-esb7n55g.js} +3 -3
  33. package/chunk-ey65err5.js +5 -0
  34. package/{chunk-cqt1dpxd.js → chunk-ff0jfn0v.js} +1 -1
  35. package/chunk-ff2vt7cz.js +12 -0
  36. package/{chunk-f45p6kcb.js → chunk-g185gx8a.js} +1 -1
  37. package/{chunk-d9kx7v12.js → chunk-h85hv05d.js} +1 -1
  38. package/{chunk-vryadew3.js → chunk-hf4adxe0.js} +2 -2
  39. package/{chunk-edgwx026.js → chunk-hjc5eg5c.js} +1 -1
  40. package/{chunk-gn9wcc1b.js → chunk-hsfpbjpc.js} +1 -1
  41. package/{chunk-4sjvdakg.js → chunk-jsvkqae2.js} +1 -1
  42. package/{chunk-b3x80jc1.js → chunk-k423dkjz.js} +1 -1
  43. package/{chunk-0wqxb8r9.js → chunk-mfch0b0t.js} +1 -1
  44. package/{chunk-cdqah1hy.js → chunk-nx09zqgs.js} +1 -1
  45. package/chunk-p93x4pn2.js +3 -0
  46. package/{chunk-ahm4zd56.js → chunk-pxaxgkaq.js} +1 -1
  47. package/{chunk-5f0xv80x.js → chunk-qwccndcd.js} +1 -1
  48. package/{chunk-33t0csxs.js → chunk-rjjc9vam.js} +1 -1
  49. package/{chunk-0wafc9aw.js → chunk-rk238m15.js} +1 -1
  50. package/chunk-t2x3mztc.js +2 -0
  51. package/{chunk-42bj6r30.js → chunk-t6qr2ay9.js} +1 -1
  52. package/chunk-ta84ehgg.js +2 -0
  53. package/chunk-tac2wvc7.js +2 -0
  54. package/chunk-tbd6wn3q.js +6 -0
  55. package/chunk-w2naqxqt.js +2 -0
  56. package/chunk-wfhv9jg4.js +2 -0
  57. package/chunk-wnj432fw.js +3 -0
  58. package/chunk-x02z2ccm.js +2 -0
  59. package/{chunk-a16mz9zf.js → chunk-xtwx2p9g.js} +1 -1
  60. package/chunk-yfvc8d2g.js +716 -0
  61. package/chunk-z73q4dq9.js +2 -0
  62. package/{chunk-ycrddh47.js → chunk-ztsckexy.js} +2 -2
  63. package/cli.js +1 -1
  64. package/package.json +1 -1
  65. package/pkgs/helpers/src/descriptors.ts +1 -0
  66. package/pkgs/helpers/src/index.ts +7 -4
  67. package/pkgs/helpers/src/lowering.ts +0 -24
  68. package/pkgs/helpers/src/primitive-classes.tsx +43 -0
  69. package/pkgs/provider-antd/src/intro.ts +3 -3
  70. package/pkgs/provider-antd/src/manifest.ts +478 -57
  71. package/pkgs/provider-antd/src/registry.ts +8 -5
  72. package/pkgs/provider-antd/src/render-pass.ts +10 -4
  73. package/pkgs/provider-antd/src/reset-css.d.ts +5 -0
  74. package/pkgs/provider-antd/src/theme.ts +54 -11
  75. package/pkgs/provider-chakra/src/manifest.ts +5 -1
  76. package/pkgs/provider-mui/src/index.ts +4 -2
  77. package/pkgs/provider-mui/src/manifest.ts +10 -1
  78. package/pkgs/provider-mui/src/render-pass.ts +15 -1
  79. package/pkgs/provider-mui/src/theme.ts +10 -4
  80. package/pkgs/provider-none/src/components.tsx +15 -50
  81. package/pkgs/provider-none/src/manifest.ts +1 -0
  82. package/pkgs/schema/src/annotation.ts +6 -3
  83. package/pkgs/schema/src/comment.ts +10 -1
  84. package/pkgs/schema/src/index.ts +13 -1
  85. package/pkgs/schema/src/node-identity.ts +92 -0
  86. package/pkgs/schema/src/node.ts +13 -4
  87. package/pkgs/schema/src/theme.ts +6 -1
  88. package/pkgs/schema/src/typeset.ts +24 -17
  89. package/pkgs/shadcn-snapshot/dist/manifest.json +1 -0
  90. package/pkgs/shadcn-snapshot/src/components/ui/alert.tsx +2 -4
  91. package/pkgs/shadcn-snapshot/src/components/ui/aspect-ratio.tsx +2 -3
  92. package/pkgs/shadcn-snapshot/src/components/ui/attachment.tsx +3 -4
  93. package/pkgs/shadcn-snapshot/src/components/ui/avatar.tsx +2 -4
  94. package/pkgs/shadcn-snapshot/src/components/ui/badge.tsx +2 -4
  95. package/pkgs/shadcn-snapshot/src/components/ui/breadcrumb.tsx +2 -4
  96. package/pkgs/shadcn-snapshot/src/components/ui/bubble.tsx +2 -4
  97. package/pkgs/shadcn-snapshot/src/components/ui/button-group.tsx +3 -4
  98. package/pkgs/shadcn-snapshot/src/components/ui/button.tsx +2 -4
  99. package/pkgs/shadcn-snapshot/src/components/ui/card.tsx +2 -4
  100. package/pkgs/shadcn-snapshot/src/components/ui/carousel.tsx +3 -4
  101. package/pkgs/shadcn-snapshot/src/components/ui/chart.tsx +1 -1
  102. package/pkgs/shadcn-snapshot/src/components/ui/direction.tsx +2 -3
  103. package/pkgs/shadcn-snapshot/src/components/ui/empty.tsx +2 -4
  104. package/pkgs/shadcn-snapshot/src/components/ui/field.tsx +3 -4
  105. package/pkgs/shadcn-snapshot/src/components/ui/input-group.tsx +3 -4
  106. package/pkgs/shadcn-snapshot/src/components/ui/item.tsx +3 -4
  107. package/pkgs/shadcn-snapshot/src/components/ui/kbd.tsx +2 -3
  108. package/pkgs/shadcn-snapshot/src/components/ui/label.tsx +2 -4
  109. package/pkgs/shadcn-snapshot/src/components/ui/marker.tsx +2 -4
  110. package/pkgs/shadcn-snapshot/src/components/ui/message.tsx +2 -4
  111. package/pkgs/shadcn-snapshot/src/components/ui/native-select.tsx +2 -4
  112. package/pkgs/shadcn-snapshot/src/components/ui/navigation-menu.tsx +2 -4
  113. package/pkgs/shadcn-snapshot/src/components/ui/pagination.tsx +3 -4
  114. package/pkgs/shadcn-snapshot/src/components/ui/progress.tsx +2 -4
  115. package/pkgs/shadcn-snapshot/src/components/ui/radio-group.tsx +2 -4
  116. package/pkgs/shadcn-snapshot/src/components/ui/scroll-area.tsx +2 -4
  117. package/pkgs/shadcn-snapshot/src/components/ui/separator.tsx +2 -4
  118. package/pkgs/shadcn-snapshot/src/components/ui/skeleton.tsx +2 -3
  119. package/pkgs/shadcn-snapshot/src/components/ui/spinner.tsx +2 -3
  120. package/pkgs/shadcn-snapshot/src/components/ui/table.tsx +2 -4
  121. package/pkgs/shadcn-snapshot/src/components/ui/tabs.tsx +2 -4
  122. package/pkgs/shadcn-snapshot/src/components/ui/toggle.tsx +2 -4
  123. package/pkgs/shadcn-snapshot/src/shadcn-tailwind.css +1 -1
  124. package/pkgs/shadcn-snapshot/src/tailwind-entry.css +1 -1
  125. package/canvas/assets/index-BDBBHdHH.css +0 -2
  126. package/canvas/assets/index-QdsLJNY9.js +0 -29
  127. package/canvas/assets/lucide-all-R8DUyY-B.js +0 -1
  128. package/chunk-0rdf6trc.js +0 -2
  129. package/chunk-10hap8kc.js +0 -6
  130. package/chunk-18eqh3s1.js +0 -2
  131. package/chunk-19xyzep8.js +0 -2
  132. package/chunk-49w26e94.js +0 -5
  133. package/chunk-66qgm91k.js +0 -708
  134. package/chunk-6cgvzwec.js +0 -3
  135. package/chunk-75sc3adm.js +0 -2
  136. package/chunk-7cexzg71.js +0 -2
  137. package/chunk-98rann8t.js +0 -2
  138. package/chunk-emv1j50t.js +0 -2
  139. package/chunk-ewgdcgrk.js +0 -2
  140. package/chunk-mm8wv3bg.js +0 -3
  141. package/chunk-nkqtnwzz.js +0 -2
  142. package/chunk-q3kf8243.js +0 -3
  143. package/chunk-sb5h27w9.js +0 -3
  144. package/chunk-vgx47anc.js +0 -3
  145. package/chunk-w6f40y2x.js +0 -11
  146. package/chunk-we8hvy6e.js +0 -2
package/chunk-6cgvzwec.js DELETED
@@ -1,3 +0,0 @@
1
- // @bun
2
- import{loadDesignFolder,resolveProviders,findHostTailwindConfig,TailwindJit,extraThemeBlock}from"./chunk-66qgm91k.js";import{join}from"path";async function loadPipeline(folderPath){let design=await loadDesignFolder(folderPath),config=design.config,{providers,defaultProvider}=await resolveProviders(config,folderPath),jit=new TailwindJit(Object.values(providers),join(folderPath,"screens"),void 0,()=>extraThemeBlock(design),void 0,()=>findHostTailwindConfig(folderPath,config.hostApp),config.styling?.framework),snapshotCss=await jit.build();return{folderPath,design,config,providers,defaultProvider,jit,snapshotCss}}
3
- export{loadPipeline};
package/chunk-75sc3adm.js DELETED
@@ -1,2 +0,0 @@
1
- // @bun
2
- import"./chunk-4pkw6d9n.js";import{recordedDesignName}from"./chunk-66qgm91k.js";import"./chunk-ngbqd7kb.js";import"./chunk-afe25dpr.js";import"./chunk-42bj6r30.js";import{assertLoopbackHost,daemonRoot,isLive,ensureDaemon,stopDaemon}from"./chunk-asvdqkdp.js";import"./chunk-80fjfyha.js";import{fail}from"./chunk-s23gtejf.js";import"./chunk-5ma8zbty.js";import"./chunk-cqt1dpxd.js";import"./chunk-sb5h27w9.js";import"./chunk-vryadew3.js";import{openUrl}from"./chunk-hggap8fq.js";import{createProgress}from"./chunk-pjtg3wnm.js";import{designWithFolder}from"./chunk-6ytv1v2r.js";import"./chunk-4sjvdakg.js";import{findDesigns,DESIGN_ARG_DESCRIPTION,resolveDesign}from"./chunk-675tr675.js";import"./chunk-edgwx026.js";import{traceEnabled}from"./chunk-6tx68d90.js";import{require_picocolors}from"./chunk-jrsknzjt.js";import{__toESM,defineCommand}from"./chunk-2smsg2ct.js";import{basename,join}from"path";var import_picocolors=__toESM(require_picocolors(),1);function actionForRunKey(key,targetCount=1){if(key==="b")return{kind:"background"};if(key==="q"||key==="\x03")return{kind:"stop"};if(targetCount<=1)return key==="o"?{kind:"open"}:null;if(key==="a"||key==="o")return{kind:"open"};if(/^[1-9]$/.test(key)){let index=Number(key);return index<=targetCount?{kind:"open",index}:null}return null}function shouldStayForeground(opts){return!opts.background&&opts.stdinIsTTY}function bindRunKeys(onKey){let stdin=process.stdin;if(!stdin.isTTY)return()=>{};stdin.setRawMode(!0),stdin.resume(),stdin.setEncoding("utf8");let onData=(chunk)=>{onKey(chunk)};return stdin.on("data",onData),()=>{if(stdin.off("data",onData),stdin.isTTY)stdin.setRawMode(!1);stdin.pause()}}var LIVE_POLL_MS=2000;async function waitInForeground(opts){return await new Promise((resolve)=>{let settled=!1,unbind=()=>{},timer,finish=(outcome)=>{if(settled)return;if(settled=!0,unbind(),timer!==void 0)clearInterval(timer);process.off("SIGINT",onStop),process.off("SIGTERM",onStop),resolve(outcome)},onStop=()=>finish("stop");unbind=bindRunKeys((key)=>{let action=actionForRunKey(key,opts.targetCount??1);if(!action)return;if(action.kind==="open")opts.onOpen(action.index);else finish(action.kind)}),process.on("SIGINT",onStop),process.on("SIGTERM",onStop),timer=setInterval(()=>{opts.isLive().then((live)=>{if(!live)finish("died")})},LIVE_POLL_MS)})}import{resolve}from"path";async function resolveRunTargets(arg,opts={}){let cwd=resolve(opts.cwd??"."),single=async()=>{let folder=await resolveDesign(arg,"run",{interactive:!0,requireConfig:!0,cwd});return[{name:recordedDesignName(folder)??void 0,folder}]};if(arg)return single();let found;try{found=await findDesigns(cwd)}catch{return single()}if(!found||found.designs.length<2)return single();let targets=[];for(let design of found.designs)if(design.exists&&!design.outsideRepo)targets.push({name:design.name,folder:design.root});if(targets.length===0)return single();if(targets.length===1)return targets;let defaultDesign=found.defaultDesign;if(defaultDesign)targets.sort((a,b)=>a.name===defaultDesign?-1:b.name===defaultDesign?1:0);return targets}function label(target){return recordedDesignName(target.folder)??target.name??basename(target.folder)}function printKeys(attached){if(console.log(""),attached.length>1)attached.forEach(({target},i)=>{console.log(` ${import_picocolors.default.cyan(String(i+1))} open ${label(target)}`)}),console.log(` ${import_picocolors.default.cyan("a")} open all`);else console.log(` ${import_picocolors.default.cyan("o")} open the browser`);console.log(` ${import_picocolors.default.cyan("b")} run in the background`),console.log(` ${import_picocolors.default.cyan("q")} stop`),console.log("")}function printBackgroundStay(designArg){console.log(`velloo: it keeps running in the background \u2014 awake while the canvas is open or an agent is connected. Stop it anytime with \`velloo stop${designArg}\`.`)}var run_default=defineCommand({meta:{name:"run",description:"Open the canvas for a design folder and stay in the foreground (starts a persistent canvas if none is running)"},args:{design:{type:"positional",required:!1,description:DESIGN_ARG_DESCRIPTION},port:{type:"string",description:"Preferred canvas port when starting fresh (default: the port this folder ran on last, else 7300)"},host:{type:"string",description:"Loopback bind hostname: 127.0.0.1 (default), localhost or ::1"},open:{type:"boolean",default:!1,description:"Open the canvas in your browser"},background:{type:"boolean",default:!1,description:"Leave the canvas running and return to the shell (the default when stdin is not a TTY)"}},async run({args}){assertLoopbackHost(args.host??"127.0.0.1");let targets=await resolveRunTargets(args.design,{}),preferredPort=args.port?Number(args.port):void 0;if(preferredPort!==void 0&&(!Number.isFinite(preferredPort)||preferredPort<0))fail("run",`invalid --port ${JSON.stringify(args.port)}`);let progress=createProgress();progress.start(targets.length>1?"starting canvases":"starting canvas");let spawned=0,running=[];try{for(let[index,target]of targets.entries()){if(targets.length>1)progress.step(`starting ${label(target)}`);let rec=await ensureDaemon(target.folder,{...preferredPort!==void 0&&index===0?{preferredPort}:{},host:args.host,onSpawn:()=>{spawned++,progress.step(`waiting for ${label(target)}`)}});running.push({target,rec})}progress.succeed(spawned===0?targets.length>1?"connected to running canvases":"connected to running canvas":targets.length>1?`started ${targets.length} canvases`:"started canvas")}catch(error){throw progress.fail("could not start canvas"),error}let designArg=args.design?` ${args.design}`:"",first=running[0];if(running.length===1)console.log(`velloo: design ${designWithFolder(first.target.folder,first.target.name)}`),console.log(`velloo: canvas at ${first.rec.canvasUrl}`);else{console.log("velloo: canvases");let rows=running.map(({target,rec})=>({design:designWithFolder(target.folder,target.name),url:rec.canvasUrl})),width=Math.max(...rows.map((row)=>row.design.length));for(let row of rows)console.log(` ${import_picocolors.default.bold(row.design.padEnd(width))} ${row.url}`)}if(traceEnabled())if(spawned>0)console.log(`velloo: \u29BF trace recording ON \u2014 agent MCP calls tape to ${join(first.target.folder,".velloo","trace")} (view with \`velloo trace\`)`);else console.log(`velloo: VELLOO_TRACE is set, but a canvas was already running \u2014 recording is NOT active on it. Run \`velloo stop${designArg}\`, then re-run to record. The agent must also connect through this same (trace-enabled) velloo.`);let foreground=shouldStayForeground({background:Boolean(args.background),stdinIsTTY:Boolean(process.stdin.isTTY)});if(foreground)printKeys(running);else printBackgroundStay(designArg);let attached=running,openTarget=(index)=>{let picked=index===void 0?attached:[attached[index-1]];for(let entry of picked)if(entry)openUrl(entry.rec.canvasUrl)};if(args.open)openTarget(running.length>1?void 0:1);if(!foreground)return;for(;;){let outcome=await waitInForeground({isLive:async()=>{for(let{rec}of attached)if(!await isLive(rec))return!1;return!0},onOpen:openTarget,targetCount:attached.length});if(outcome==="background"){printBackgroundStay(designArg);return}if(outcome==="died"){let alive=[];for(let entry of attached)if(await isLive(entry.rec))alive.push(entry);else console.log(`velloo: the canvas for "${label(entry.target)}" stopped.`);if(attached=alive,attached.length===0){console.log(`velloo: no canvases left. Start again with \`velloo run${designArg}\`.`);return}console.log(import_picocolors.default.dim(` Still running: ${attached.map(({target})=>label(target)).join(", ")}.`)),printKeys(attached);continue}for(let{target}of attached){let stopped=await stopDaemon(daemonRoot(target.folder));console.log(stopped?`velloo: stopped ${designWithFolder(target.folder)}`:`velloo: no canvas running for ${designWithFolder(target.folder)}`)}return}}});export{run_default as default};
package/chunk-7cexzg71.js DELETED
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{STYLE_PROP}from"./chunk-66qgm91k.js";import{styleObjectFromCss}from"./chunk-4pkw6d9n.js";import{NONE_MANIFEST2,inlineRegistry,entryCssPath2,componentsDir2}from"./chunk-mm8wv3bg.js";import{require_react_development}from"./chunk-ngbqd7kb.js";import{__toESM}from"./chunk-2smsg2ct.js";import{HTML_VERSION}from"./chunk-6k05kqnc.js";var import_react=__toESM(require_react_development(),1),SAFE_TAG=/^(?:a|abbr|address|article|aside|b|bdi|bdo|blockquote|br|button|caption|circle|cite|clipPath|code|col|colgroup|data|dd|defs|del|details|dfn|div|dl|dt|ellipse|em|fieldset|figcaption|figure|footer|form|g|h[1-6]|header|hr|i|img|input|ins|kbd|label|legend|li|line|linearGradient|main|mark|mask|meter|nav|ol|optgroup|option|output|p|path|picture|polygon|polyline|pre|progress|q|radialGradient|rect|s|samp|section|select|small|source|span|stop|strong|sub|summary|sup|svg|table|tbody|td|text|textarea|tfoot|th|thead|time|tr|tspan|u|ul|var|wbr)$/,URL_ATTRIBUTES=new Set(["href","src","action","formaction","poster","cite","xlinkhref","xlink:href"]),SCRIPT_URL=/^(?:javascript|vbscript):|^data:text\/html/i,withoutControls=(value)=>[...value].filter((char)=>char.charCodeAt(0)>32).join(""),REACT_PROP={class:"className",for:"htmlFor",autocomplete:"autoComplete",autofocus:"autoFocus",tabindex:"tabIndex",readonly:"readOnly",maxlength:"maxLength",minlength:"minLength",colspan:"colSpan",rowspan:"rowSpan",enctype:"encType",novalidate:"noValidate",datetime:"dateTime",srcset:"srcSet",crossorigin:"crossOrigin",accesskey:"accessKey",contenteditable:"contentEditable",spellcheck:"spellCheck",formaction:"formAction",formmethod:"formMethod",inputmode:"inputMode",referrerpolicy:"referrerPolicy"};function safeAttributeValue(name,value){let key=name.toLowerCase();if(key.startsWith("on")||key==="dangerouslysetinnerhtml")return!1;if(URL_ATTRIBUTES.has(key)&&typeof value==="string")return!SCRIPT_URL.test(withoutControls(value));return!0}function safeTag(component,as){if(!SAFE_TAG.test(as))throw Error(`${component}: unsupported HTML tag ${JSON.stringify(as)}`);return as}function nativeAttributes(props){return Object.fromEntries(Object.entries(props).map(([name,value])=>[REACT_PROP[name]??name,value]).filter(([name,value])=>safeAttributeValue(name,value)).flatMap(([name,value])=>{if(name!=="style"||typeof value!=="string")return[[name,value]];let style=styleObjectFromCss(value);return style?[[name,style]]:[]}))}function Html({as="div",children,...props}){return import_react.createElement(safeTag("Html",as),nativeAttributes(props),children)}var registry={...inlineRegistry,Html};var htmlDescriptors=[{id:"Html",category:"ui",source:"velloo",group:"layout",family:"Html",allowUnknownProps:!0,designModeNotes:"Use for a native HTML element. Set as to a semantic tag and pass ordinary HTML or hx-* attributes as props.",props:[{name:"as",type:"string",optional:!0,control:"string",defaultValue:"div"},{name:"className",type:"string",optional:!0,control:"string"},{name:"style",type:"CSSProperties",optional:!0,control:"string"},{name:"children",type:"ReactNode",optional:!0,control:"string"}]}],HTML_MANIFEST=[...NONE_MANIFEST2,...htmlDescriptors],HTML_INTRO=["**This is a server-rendered HTML/htmx app.** Compose semantic HTML with `Html` nodes (`as=\"form\"`, \u2026), styled by the app's own CSS classes or inline `style` \u2014 there is no Tailwind; new classes need CSS authored in the app. Give forms and controls the real `hx-*` attributes: the canvas never fires them, and `emit_code` keeps them in the native HTML it returns for the app's templates.","","A design never contacts the running app: it is styled by copies of the app's stylesheets, which `store_host_files` refreshes from source or from a capture (including built CSS a `screenshot` reports missing). Reference the app's files by their real paths (`src=\"/static/logo.png\"`), not as Velloo assets. Theme tokens are CSS variables (`var(--color-primary)`); `emit_theme` writes the stylesheet that defines them.","","To reproduce a page, capture it from the running app with `start_capture_session` (the user signs in if needed), rebuild it from `get_capture` with the content written into the nodes, and verify with `compare_to_url { captureId }`.","","On a form, a custom `hx-trigger` replaces htmx's default submit trigger \u2014 include `submit` when a submit button must swap a response instead of navigating.",""];function createProvider(){return{id:"html",version:HTML_VERSION,label:"HTML + htmx",componentsDir:componentsDir2,styleEntryPath:entryCssPath2,registry,loadManifest:async()=>HTML_MANIFEST,styleChannel:STYLE_PROP,styleChannels:["style"],registryForChannel:()=>registry,mcpIntro:()=>HTML_INTRO,hostStylesheets:!0,codegenFormat:"html",elementComponent:"Html"}}export{createProvider};
package/chunk-98rann8t.js DELETED
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{upgrade_default,migrateFolder2}from"./chunk-a16mz9zf.js";import"./chunk-33t0csxs.js";import"./chunk-pjtg3wnm.js";import"./chunk-b3x80jc1.js";import"./chunk-asvdqkdp.js";import"./chunk-675tr675.js";import"./chunk-80fjfyha.js";import"./chunk-66qgm91k.js";import"./chunk-ngbqd7kb.js";import"./chunk-edgwx026.js";import"./chunk-afe25dpr.js";import"./chunk-0wafc9aw.js";import"./chunk-42bj6r30.js";import"./chunk-s23gtejf.js";import"./chunk-4pkw6d9n.js";export{upgrade_default as default,migrateFolder2 as migrateFolder};
package/chunk-emv1j50t.js DELETED
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{registry2,loadManifest2}from"./chunk-hr3gbak5.js";import{snapshotVersion2,entryCssPath3,componentsDir3}from"./chunk-sb5h27w9.js";import"./chunk-qpv28z8d.js";export{componentsDir3 as componentsDir,entryCssPath3 as entryCssPath,loadManifest2 as loadManifest,registry2 as registry,snapshotVersion2 as snapshotVersion};
package/chunk-ewgdcgrk.js DELETED
@@ -1,2 +0,0 @@
1
- // @bun
2
- import"./chunk-afe25dpr.js";import"./chunk-4pkw6d9n.js";import{loadCredential,verifyCredential}from"./chunk-wkqrb2tz.js";import"./chunk-66qgm91k.js";import"./chunk-ngbqd7kb.js";import"./chunk-42bj6r30.js";import{listDaemons}from"./chunk-asvdqkdp.js";import"./chunk-80fjfyha.js";import"./chunk-s23gtejf.js";import"./chunk-5ma8zbty.js";import"./chunk-cqt1dpxd.js";import"./chunk-sb5h27w9.js";import"./chunk-vryadew3.js";import{designWithFolder}from"./chunk-6ytv1v2r.js";import"./chunk-4sjvdakg.js";import{defaultCloudUrl}from"./chunk-edgwx026.js";import{require_picocolors}from"./chunk-jrsknzjt.js";import{__toESM,defineCommand}from"./chunk-2smsg2ct.js";var import_picocolors=__toESM(require_picocolors(),1);var status_default=defineCommand({meta:{name:"status",description:"List the velloo canvas daemons running on this machine + cloud sign-in"},args:{},async run(){let daemons=await listDaemons();if(daemons.length===0)console.log("velloo: no canvas daemons running.");else for(let d of daemons)console.log(`${d.canvasUrl} ${designWithFolder(d.root,void 0,{absolute:!0})} (pid ${d.pid}, since ${d.startedAt})`);let cloudUrl=defaultCloudUrl(),cred=await loadCredential(cloudUrl);if(!cred){console.log(import_picocolors.default.dim(`cloud: not signed in (${cloudUrl}) \u2014 run \`velloo login\` to share.`));return}let email=await verifyCredential(cloudUrl,cred.token,3000);console.log(email?`cloud: signed in as ${email} (${cloudUrl})`:import_picocolors.default.dim(`cloud: stored credential for ${cred.email} (${cloudUrl}) \u2014 expired or cloud unreachable; \`velloo login\` to refresh.`))}});export{status_default as default};
package/chunk-mm8wv3bg.js DELETED
@@ -1,3 +0,0 @@
1
- // @bun
2
- import{helperDescriptors,require_react_jsx_dev_runtime_development,helpersRegistry,TAILWIND_CLASSNAME,helperSourcePath}from"./chunk-66qgm91k.js";import{headingInlineStyle,textInlineStyle}from"./chunk-4pkw6d9n.js";import{require_react_development}from"./chunk-ngbqd7kb.js";import{__toESM}from"./chunk-2smsg2ct.js";import{noLibVersion}from"./chunk-cxe6jjwj.js";import{resolveProviderSrcDir}from"./chunk-v6c3h9ft.js";import{dirname,join}from"path";import{fileURLToPath}from"url";var NONE_INTRO=["**This folder has no component library** \u2014 only bare primitives wrapping plain HTML: `Box`/`Stack`/`Container` for layout, `Card`, `Button`, `Input`, plus the velloo helpers (`Heading`/`Text`, `Image`, `Gradient`, `Layer`, `SVG`, `Divider`, `Placeholder`, `Icon`). The primitives stop there: for a `Badge`/`Tabs`/`Dialog`, use the app's own component when `list_components` shows one on a Repo shelf, else build it from primitives or a snippet. Call `list_components` for the exact set. Styling is **Tailwind classes**.",""],NONE_INLINE_INTRO=["**This folder has no component library and no CSS framework** \u2014 bare primitives wrapping plain HTML (`Box`/`Stack`/`Container`, `Card`, `Button`, `Input`) plus the velloo helpers (`Heading`/`Text`, `Image`, `Icon`, `SVG`, `Divider`, `Gradient`, `Layer`, `Placeholder`). The primitives stop there: for a `Badge`/`Tabs`/`Dialog`, use the app's own component when `list_components` shows one on a Repo shelf, else build it from primitives or a snippet. Call `list_components` for the exact set.","",'**Style through inline `style` objects.** `update_props { style: { display: "flex", gap: "16px", padding: "24px", borderRadius: "8px", color: "var(--color-foreground)" } }` \u2014 a plain React style object (merges shallowly; an inner `null` drops a key, `style: null` clears). Reference theme tokens as CSS variables (`var(--color-primary)`, `var(--radius)`) from `get_theme` so the design stays themable. `emit_code` emits `style={{\u2026}}` on plain elements \u2014 no imports, no Tailwind. Tailwind utility diagnostics do not apply.',""];var React=__toESM(require_react_development(),1),jsx_dev_runtime=__toESM(require_react_jsx_dev_runtime_development(),1);import{clsx}from"clsx";var BOX_TAG=/^[a-z][a-z0-9]*$/,Box=React.forwardRef(({as,className,...rest},ref)=>React.createElement(typeof as==="string"&&BOX_TAG.test(as)?as:"div",{ref,className:clsx(className),...rest}));Box.displayName="Box";var alignClass={start:"items-start",center:"items-center",end:"items-end",stretch:"items-stretch"},justifyClass={start:"justify-start",center:"justify-center",end:"justify-end",between:"justify-between",around:"justify-around"},Stack=React.forwardRef(({direction="col",gap=4,align,justify,className,...rest},ref)=>jsx_dev_runtime.jsxDEV("div",{ref,className:clsx("flex",direction==="row"?"flex-row":"flex-col",`gap-${gap}`,align?alignClass[align]:void 0,justify?justifyClass[justify]:void 0,className),...rest},void 0,!1,void 0,this));Stack.displayName="Stack";var containerWidth={sm:"max-w-screen-sm",md:"max-w-screen-md",lg:"max-w-screen-lg",xl:"max-w-screen-xl",full:"max-w-full"},Container=React.forwardRef(({size="md",className,...rest},ref)=>jsx_dev_runtime.jsxDEV("div",{ref,className:clsx("mx-auto w-full px-4",containerWidth[size],className),...rest},void 0,!1,void 0,this));Container.displayName="Container";var buttonVariant={default:"bg-foreground text-background hover:bg-foreground/90",ghost:"bg-transparent text-foreground hover:bg-muted",outline:"bg-transparent text-foreground border border-border hover:bg-muted"},Button=React.forwardRef(({variant="default",className,type,...rest},ref)=>jsx_dev_runtime.jsxDEV("button",{ref,type:type??"button",className:clsx("inline-flex items-center justify-center gap-2 rounded-md px-4 py-2 text-sm font-medium","focus-visible:outline-2 focus-visible:outline-offset-2",buttonVariant[variant],className),...rest},void 0,!1,void 0,this));Button.displayName="Button";var Input=React.forwardRef(({className,type="text",value,onChange,...rest},ref)=>jsx_dev_runtime.jsxDEV("input",{ref,type,value,onChange,readOnly:value!==void 0&&onChange===void 0||rest.readOnly,className:clsx("block w-full rounded-md border border-input bg-background px-3 py-2 text-sm","placeholder:text-muted-foreground focus-visible:outline-2 focus-visible:outline-offset-2",className),...rest},void 0,!1,void 0,this));Input.displayName="Input";var Card=React.forwardRef(({className,...rest},ref)=>jsx_dev_runtime.jsxDEV("div",{ref,className:clsx("rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm",className),...rest},void 0,!1,void 0,this));Card.displayName="Card";var REUSED_HELPER_IDS=["Heading","Text","Prose","Icon","SVG","Image","Layer","Divider","Gradient","Placeholder"],registry={Box,Stack,Container,Card,Button,Input,...helpersRegistry(REUSED_HELPER_IDS)};var PRIMITIVE_DESCRIPTORS=[{id:"Box",category:"ui",source:"velloo",props:[{name:"as",type:"string",optional:!0,control:"string"},{name:"className",type:"string | undefined",optional:!0,control:"string"}]},{id:"Stack",category:"ui",source:"velloo",props:[{name:"direction",type:'"row" | "col" | undefined',optional:!0,control:"enum",enumValues:["row","col"],defaultValue:"col"},{name:"gap",type:"number | undefined",optional:!0,control:"number",defaultValue:"4"},{name:"align",type:'"start" | "center" | "end" | "stretch" | undefined',optional:!0,control:"enum",enumValues:["start","center","end","stretch"]},{name:"justify",type:'"start" | "center" | "end" | "between" | "around" | undefined',optional:!0,control:"enum",enumValues:["start","center","end","between","around"]},{name:"className",type:"string | undefined",optional:!0,control:"string"}]},{id:"Container",category:"ui",source:"velloo",props:[{name:"size",type:'"sm" | "md" | "lg" | "xl" | "full" | undefined',optional:!0,control:"enum",enumValues:["sm","md","lg","xl","full"],defaultValue:"md"},{name:"className",type:"string | undefined",optional:!0,control:"string"}]},{id:"Card",category:"ui",source:"velloo",props:[{name:"className",type:"string | undefined",optional:!0,control:"string"}]},{id:"Button",category:"ui",source:"velloo",props:[{name:"variant",type:'"default" | "ghost" | "outline" | undefined',optional:!0,control:"enum",enumValues:["default","ghost","outline"],defaultValue:"default"},{name:"className",type:"string | undefined",optional:!0,control:"string"}]},{id:"Input",category:"ui",source:"velloo",props:[{name:"placeholder",type:"string | undefined",optional:!0,control:"string"},{name:"value",type:"string | undefined",optional:!0,control:"string"},{name:"type",type:"string | undefined",optional:!0,control:"string",defaultValue:"text"},{name:"className",type:"string | undefined",optional:!0,control:"string"}]}],NONE_MANIFEST2=[...PRIMITIVE_DESCRIPTORS,...helperDescriptors(REUSED_HELPER_IDS)];var React2=__toESM(require_react_development(),1);var jsx_dev_runtime2=__toESM(require_react_jsx_dev_runtime_development(),1);function merge(defaults,authored){return authored?{...defaults,...authored}:defaults}var space=(n)=>`${n*0.25}rem`,Box2=React2.forwardRef(({as,...rest},ref)=>React2.createElement(typeof as==="string"&&BOX_TAG.test(as)?as:"div",{ref,...rest}));Box2.displayName="Box";var alignStyle={start:"flex-start",center:"center",end:"flex-end",stretch:"stretch"},justifyStyle={start:"flex-start",center:"center",end:"flex-end",between:"space-between",around:"space-around"},Stack2=React2.forwardRef(({direction="col",gap=4,align,justify,style,...rest},ref)=>jsx_dev_runtime2.jsxDEV("div",{ref,style:merge({display:"flex",flexDirection:direction==="row"?"row":"column",gap:space(gap),...align?{alignItems:alignStyle[align]}:{},...justify?{justifyContent:justifyStyle[justify]}:{}},style),...rest},void 0,!1,void 0,this));Stack2.displayName="Stack";var containerMaxWidth={sm:"640px",md:"768px",lg:"1024px",xl:"1280px",full:"100%"},Container2=React2.forwardRef(({size="md",style,...rest},ref)=>jsx_dev_runtime2.jsxDEV("div",{ref,style:merge({marginInline:"auto",width:"100%",paddingInline:"1rem",maxWidth:containerMaxWidth[size]},style),...rest},void 0,!1,void 0,this));Container2.displayName="Container";var buttonVariantStyle={default:{background:"var(--color-foreground)",color:"var(--color-background)"},ghost:{background:"transparent",color:"var(--color-foreground)"},outline:{background:"transparent",color:"var(--color-foreground)",border:"1px solid var(--color-border)"}},Button2=React2.forwardRef(({variant="default",type,style,...rest},ref)=>jsx_dev_runtime2.jsxDEV("button",{ref,type:type??"button",style:merge({display:"inline-flex",alignItems:"center",justifyContent:"center",gap:"0.5rem",borderRadius:"var(--radius)",padding:"0.5rem 1rem",fontSize:"0.875rem",fontWeight:500,cursor:"pointer",...buttonVariantStyle[variant]},style),...rest},void 0,!1,void 0,this));Button2.displayName="Button";var Input2=React2.forwardRef(({type="text",value,onChange,style,...rest},ref)=>jsx_dev_runtime2.jsxDEV("input",{ref,type,value,onChange,readOnly:value!==void 0&&onChange===void 0||rest.readOnly,style:merge({display:"block",width:"100%",borderRadius:"var(--radius)",border:"1px solid var(--color-input)",background:"var(--color-background)",padding:"0.5rem 0.75rem",fontSize:"0.875rem"},style),...rest},void 0,!1,void 0,this));Input2.displayName="Input";var Card2=React2.forwardRef(({style,...rest},ref)=>jsx_dev_runtime2.jsxDEV("div",{ref,style:merge({borderRadius:"var(--radius)",border:"1px solid var(--color-border)",background:"var(--color-card)",color:"var(--color-card-foreground)",padding:"1.5rem",boxShadow:"0 1px 2px 0 rgb(0 0 0 / 0.05)"},style),...rest},void 0,!1,void 0,this));Card2.displayName="Card";var Heading=React2.forwardRef(({level=1,style,...rest},ref)=>{let Tag=`h${level}`;return jsx_dev_runtime2.jsxDEV(Tag,{ref,style:merge(headingInlineStyle(level),style),...rest},void 0,!1,void 0,this)});Heading.displayName="Heading";var Text=React2.forwardRef(({variant="default",style,...rest},ref)=>jsx_dev_runtime2.jsxDEV("p",{ref,style:merge(textInlineStyle(variant),style),...rest},void 0,!1,void 0,this));Text.displayName="Text";var REUSED_HELPER_IDS2=["Prose","Icon","SVG","Image","Layer","Divider","Gradient","Placeholder"],inlineRegistry={Box:Box2,Stack:Stack2,Container:Container2,Card:Card2,Button:Button2,Input:Input2,Heading,Text,...helpersRegistry(REUSED_HELPER_IDS2)};var PRIMITIVES=new Set(["Box","Stack","Container","Card","Button","Input"]),INLINE_TYPOGRAPHY=new Set(["Heading","Text"]),here=dirname(fileURLToPath(import.meta.url)),srcDir=resolveProviderSrcDir(here,"provider-none",process.env.VELLOO_NOLIB_SRC),entryCssPath2=join(srcDir,"tailwind-entry.css"),componentsDir2=srcDir;async function loadManifest(){return NONE_MANIFEST2}function createProvider2(){return{id:"none",version:noLibVersion,componentsDir:componentsDir2,styleEntryPath:entryCssPath2,registry,loadManifest,label:`none ${noLibVersion}`,styleChannel:TAILWIND_CLASSNAME,styleChannels:["tailwind-classname","style"],mcpIntro:(channel)=>[...channel==="style"?NONE_INLINE_INTRO:NONE_INTRO],registryForChannel:(kind)=>kind==="style"?inlineRegistry:registry,canvasBundleSpec:{styleRuntime:{kind:"none"},onlyWithRepository:!0,components:(ids,context)=>{let inline=context?.channel==="style";return ids.flatMap((id)=>{let own=PRIMITIVES.has(id)||inline&&INLINE_TYPOGRAPHY.has(id)?join(srcDir,inline?"components-inline.tsx":"components.tsx"):helperSourcePath(id);return own?[{id,sources:[{importPath:own,exportName:id,fidelity:"exact",note:"Velloo primitive, mounted beside the app's components."}]}]:[]})}}}}
3
- export{NONE_MANIFEST2,inlineRegistry,entryCssPath2,componentsDir2,createProvider2};
package/chunk-nkqtnwzz.js DELETED
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{NONE_MANIFEST2,entryCssPath2,componentsDir2,createProvider2}from"./chunk-mm8wv3bg.js";export{NONE_MANIFEST2 as NONE_MANIFEST,componentsDir2 as componentsDir,createProvider2 as createProvider,entryCssPath2 as entryCssPath};
package/chunk-q3kf8243.js DELETED
@@ -1,3 +0,0 @@
1
- // @bun
2
- import{isCancel,select}from"./chunk-80fjfyha.js";import"./chunk-4pkw6d9n.js";import"./chunk-66qgm91k.js";import"./chunk-ngbqd7kb.js";import"./chunk-afe25dpr.js";import"./chunk-42bj6r30.js";import{daemonRoot,listDaemons,stopDaemon}from"./chunk-asvdqkdp.js";import{fail}from"./chunk-s23gtejf.js";import"./chunk-5ma8zbty.js";import"./chunk-cqt1dpxd.js";import"./chunk-sb5h27w9.js";import"./chunk-vryadew3.js";import{designWithFolder}from"./chunk-6ytv1v2r.js";import"./chunk-4sjvdakg.js";import{DESIGN_ARG_DESCRIPTION,resolveDesign}from"./chunk-675tr675.js";import"./chunk-edgwx026.js";import{require_picocolors}from"./chunk-jrsknzjt.js";import{__toESM,defineCommand}from"./chunk-2smsg2ct.js";import{resolve}from"path";var import_picocolors=__toESM(require_picocolors(),1);var ALL="__all__",canvasLine=(d)=>`${designWithFolder(d.root,void 0,{absolute:!0})} \u2014 ${d.canvasUrl}`;async function stopEach(daemons){for(let d of daemons)await stopDaemon(d.root),console.log(`velloo: stopped ${canvasLine(d)}`)}async function designHere(){try{return await resolveDesign(void 0,"stop",{onFail:()=>{throw Error("no design here")}})}catch{return}}function runningFor(daemons,folder){if(!folder)return;let root=resolve(daemonRoot(folder));return daemons.find((d)=>resolve(d.root)===root)?.root}var stop_default=defineCommand({meta:{name:"stop",description:"Stop a running canvas (picks from the running ones when none is named)"},args:{design:{type:"positional",required:!1,description:DESIGN_ARG_DESCRIPTION},all:{type:"boolean",default:!1,description:"Stop every running velloo canvas on this machine"}},async run({args}){if(args.all){let daemons=await listDaemons();if(daemons.length===0)console.log("velloo: no canvas daemons running.");else await stopEach(daemons);return}if(!args.design&&process.stdin.isTTY){let daemons=await listDaemons();if(daemons.length===0){console.log("velloo: no canvas daemons running.");return}if(daemons.length===1){await stopEach(daemons);return}let here=runningFor(daemons,await designHere()),ordered=[...daemons].sort((a,b)=>a.root===here?-1:b.root===here?1:0),chosen=await select({message:"Stop which canvas?",options:[...ordered.map((d)=>({value:d.root,label:designWithFolder(d.root,void 0,{absolute:!0}),hint:d.root===here?`${d.canvasUrl} \xB7 this directory`:d.canvasUrl})),{value:ALL,label:`All ${daemons.length} canvases`}],...here?{initialValue:here}:{}});if(isCancel(chosen))fail("stop","cancelled.");await stopEach(chosen===ALL?daemons:daemons.filter((d)=>d.root===chosen));return}if(!args.design&&!await designHere()){let daemons=await listDaemons();if(daemons.length===0){console.log("velloo: no canvas daemons running.");return}fail("stop",[`there is no design in this directory. ${daemons.length} canvas${daemons.length===1?" is":"es are"} running \u2014 stop one by its design folder, or all of them with \`velloo stop --all\`:`,...daemons.map((d)=>` ${canvasLine(d)}`)].join(`
3
- `))}let folder=await resolveDesign(args.design,"stop"),root=daemonRoot(folder);if(await stopDaemon(root)){console.log(`velloo: stopped ${designWithFolder(folder)}`);return}console.log(`velloo: no canvas running for ${designWithFolder(folder)}`);let others=await listDaemons();if(others.length===0)return;console.log(import_picocolors.default.dim(` ${others.length} canvas${others.length===1?"":"es"} running elsewhere \u2014 run \`velloo stop\` to pick, or \`velloo stop --all\`:`));for(let d of others)console.log(import_picocolors.default.dim(` ${canvasLine(d)}`))}});export{stop_default as default};
package/chunk-sb5h27w9.js DELETED
@@ -1,3 +0,0 @@
1
- // @bun
2
- import{existsSync}from"fs";import{dirname,join}from"path";import{fileURLToPath}from"url";var package_default={name:"@velloo/shadcn-snapshot",version:"0.0.0",license:"Apache-2.0",private:!0,type:"module",description:"[internal] Canvas design-mode runtime for provider-shadcn-upstream \u2014 pinned shadcn snapshot, Tailwind v4 entry CSS, prop manifest. Not a user-facing provider.",snapshotVersion:"2026.09.03",shadcnStyle:"radix-nova",shadcnCliVersion:"4.20.1",exports:{".":"./src/index.ts","./tailwind-entry.css":"./src/tailwind-entry.css","./manifest.json":"./dist/manifest.json","./registry-files":"./src/registry-files.ts","./version":"./src/version.ts"},scripts:{build:"bun run build.ts",vendor:"bun run vendor.ts"},dependencies:{"@velloo/helpers":"workspace:*","@velloo/provider":"workspace:*","class-variance-authority":"0.7.1",echarts:"6.1.0","embla-carousel-react":"8.6.0","lucide-react":"1.40.0","radix-ui":"1.6.7",react:"19.2.8","react-day-picker":"10.0.1","react-dom":"19.2.8",sonner:"2.0.8",tailwindcss:"4.3.3","tw-animate-css":"1.4.0"},devDependencies:{"@types/react":"19.2.18","@types/react-dom":"19.2.7","ts-morph":"28.0.0"}};var snapshotVersion2=package_default.snapshotVersion,here=dirname(fileURLToPath(import.meta.url));function resolveRoot(){let dev=join(here,"..");return[process.env.VELLOO_SNAPSHOT_ROOT,join(here,"pkgs","shadcn-snapshot"),dev].filter((p)=>Boolean(p)).find((r)=>existsSync(join(r,"src","tailwind-entry.css")))??dev}var root=resolveRoot(),srcDir=join(root,"src"),distDir=join(root,"dist"),entryCssPath3=join(srcDir,"tailwind-entry.css"),componentsDir3=join(srcDir,"components"),manifestPath=join(distDir,"manifest.json");
3
- export{snapshotVersion2,entryCssPath3,componentsDir3,manifestPath};
package/chunk-vgx47anc.js DELETED
@@ -1,3 +0,0 @@
1
- // @bun
2
- import{hostAssetRequest}from"./chunk-66qgm91k.js";import{join,sep}from"path";async function withAssetServer(folder,liveCode,fn,routes={}){let{bundle,host}=routes,assetsRoot=join(folder,"assets"),server=Bun.serve({port:0,hostname:"127.0.0.1",async fetch(req){let url=new URL(req.url),stored=host?.(req);if(stored)return stored;let mounted=bundle?await bundle(url):null;if(mounted!==null)return new Response(mounted,{headers:{"Content-Type":"text/javascript","Access-Control-Allow-Origin":"*"}});if(liveCode!==null&&url.pathname==="/live/bundle.js")return new Response(liveCode,{headers:{"Content-Type":"text/javascript"}});if(url.pathname.startsWith("/assets/")){let fsPath=join(folder,decodeURIComponent(url.pathname));if(fsPath.startsWith(assetsRoot+sep)){let file=Bun.file(fsPath);if(await file.exists())return new Response(file)}}let hostAsset=host&&hostAssetRequest(req),fromHost=hostAsset?host(hostAsset):null;if(fromHost)return fromHost;return new Response("not found",{status:404})}});try{return await fn(`http://127.0.0.1:${server.port}/`)}finally{server.stop(!0)}}
3
- export{withAssetServer};
package/chunk-w6f40y2x.js DELETED
@@ -1,11 +0,0 @@
1
- // @bun
2
- import{ScreenSchema}from"./chunk-4pkw6d9n.js";import{detectTailwindMajor,emitCode,moduleTarget,emitHtml,v3ClassIssues,classNamesInJsx,styleChannelOf,loadDesignFolder,registryForScreen,hostAppRootFrom,resolveProviders}from"./chunk-66qgm91k.js";import"./chunk-ngbqd7kb.js";import"./chunk-afe25dpr.js";import"./chunk-80fjfyha.js";import{fail}from"./chunk-s23gtejf.js";import{findDesignConfig}from"./chunk-z78c1kf8.js";import{createProgress}from"./chunk-pjtg3wnm.js";import{DESIGN_ARG_DESCRIPTION,resolveDesign,pickScreen}from"./chunk-675tr675.js";import{defineCommand}from"./chunk-2smsg2ct.js";import{readFile,writeFile}from"fs/promises";import{extname,isAbsolute,resolve}from"path";import{stdout}from"process";async function folderEmitContext(screenPath,screen){let found=await findDesignConfig(screenPath);if(!found)return{};let design=await loadDesignFolder(found.folder),{providers,defaultProvider}=await resolveProviders(design.config,found.folder),provider=screen.library&&providers[screen.library]||defaultProvider,adapter=provider;if(adapter.codegenFormat==="html"){let registry=registryForScreen(screen,providers,defaultProvider,design.config.extensions??{},design.config.styling?.framework);return{html:await emitHtml(screen,{registry,snippets:design.snippets})}}let target;if(adapter.codegenModule){let manifest=await provider.loadManifest();target=moduleTarget(manifest.filter((c)=>c.source!=="velloo").map((c)=>c.id),adapter.codegenModule)}let inlineStyle=styleChannelOf(provider,design.config.styling?.framework).kind==="style";return{snippets:design.snippets,...design.config.extensions?{extensions:design.config.extensions}:{},...target?{target}:{},...inlineStyle?{inlineStyle:!0}:{}}}var emit_default=defineCommand({meta:{name:"emit",description:"Print or write agent-consumed IR for a screen."},args:{screen:{type:"positional",required:!1,description:"Screen id, or a path to a screen JSON. Omit to pick interactively."},design:{type:"string",description:DESIGN_ARG_DESCRIPTION},to:{type:"string",description:"Write IR as JSON to this path; for HTML screens, a .html path writes native markup. Omit to print the native body to stdout."},"components-alias":{type:"string",description:'Override the import prefix the IR mentions in snippet identifiers. Defaults to .design/config.json#codegen.componentsAlias, else "@/components/ui".'}},async run({args}){let interactive=Boolean(process.stdin.isTTY),screenArg=args.screen,screenPath=!!screenArg&&(screenArg.includes("/")||screenArg.endsWith(".json"))?resolve(screenArg):(await pickScreen(await resolveDesign(args.design,"emit",{designFlag:"--design"}),screenArg,interactive,"emit")).path,screenJson=JSON.parse(await readFile(screenPath,"utf8")),screen=ScreenSchema.parse(screenJson),progress=createProgress();progress.start("preparing code");try{let componentsAlias=args["components-alias"]??await readConfigAlias(screenPath),context=await folderEmitContext(screenPath,screen);if(progress.step("generating code"),context.html){let ir=context.html;if(progress.succeed("generated HTML"),args.to){let outPath=isAbsolute(args.to)?args.to:resolve(args.to),asMarkup=extname(outPath).toLowerCase()===".html";await writeFile(outPath,asMarkup?ir.html:JSON.stringify(ir,null,2),"utf8"),console.log(`velloo emit: wrote ${outPath}`);for(let warning of ir.warnings)console.log(` note: ${warning}`)}else stdout.write(`${ir.html}
3
- `);return}let result=await emitCode(screen,{...componentsAlias?{componentsAlias}:{},...context});if(!result.ok){progress.fail("code generation failed");let e=result.error;if(e.kind==="UnknownComponent")fail("emit",`unknown component: ${JSON.stringify(e.ref)}`);else if(e.kind==="SnippetNotFound")fail("emit",`snippet not found: ${JSON.stringify(e.snippetId)}`);else fail("emit",`screen not found: ${JSON.stringify(e.screenId)}`)}let found=await findDesignConfig(screenPath),tailwindV3Compat=found&&!context?.target&&!context?.inlineStyle?detectTailwindMajor(hostAppRootFrom(found.folder,found.config.hostApp))===3?v3ClassIssues([...result.value.classesUsed,...result.value.snippetsUsed.flatMap((s)=>classNamesInJsx(s.jsx))]):[]:[];if(args.to){progress.step("writing code");let outPath=isAbsolute(args.to)?args.to:resolve(args.to),ir=tailwindV3Compat.length>0?{...result.value,tailwindV3Compat}:result.value;await writeFile(outPath,JSON.stringify(ir,null,2),"utf8"),progress.succeed("generated code"),console.log(`velloo emit: wrote ${outPath}`);return}if(progress.succeed("generated code"),stdout.write(`// screen: ${result.value.screen.id} (${result.value.screen.name})
4
- `),stdout.write(`// components: ${result.value.componentsUsed.join(", ")||"(none)"}
5
- `),result.value.iconsUsed.length>0)stdout.write(`// icons (lucide): ${result.value.iconsUsed.join(", ")}
6
- `);if(result.value.snippetsUsed.length>0)stdout.write(`// snippets: ${result.value.snippetsUsed.map((s)=>`${s.componentName}(${s.id})`).join(", ")}
7
- `);for(let issue of tailwindV3Compat)stdout.write(issue.v3?`// tailwind v3 host: \`${issue.class}\` \u2192 \`${issue.v3}\` (${issue.note})
8
- `:`// tailwind v3 host: \`${issue.class}\` \u2014 ${issue.note}
9
- `);stdout.write(`
10
- `),stdout.write(`${result.value.jsx}
11
- `)}catch(error){throw progress.fail("code generation failed"),error}}});async function readConfigAlias(screenPath){return(await findDesignConfig(screenPath))?.config.codegen?.componentsAlias}export{emit_default as default};
package/chunk-we8hvy6e.js DELETED
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{TAILWIND_CLASSNAME,helperSourcePath}from"./chunk-66qgm91k.js";import{snapshotVersion2,entryCssPath3,componentsDir3}from"./chunk-sb5h27w9.js";import{registry2}from"./chunk-hr3gbak5.js";import"./chunk-qpv28z8d.js";import{readFile}from"fs/promises";import{join}from"path";async function readManifest(cacheDir){let raw=await readFile(join(cacheDir,"manifest.json"),"utf8");return JSON.parse(raw)}import{existsSync as existsSync4}from"fs";import{join as join5}from"path";import{existsSync as existsSync3,readFileSync as readFileSync3}from"fs";import{join as join4}from"path";import{existsSync,readFileSync}from"fs";import{join as join2}from"path";function exportsName(source,id){let name=id.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");if(new RegExp(`\\bexport\\s+(?:async\\s+)?(?:function|const|let|var|class)\\s+${name}\\b`).test(source))return!0;for(let match of source.matchAll(/\bexport\s*\{([^}]*)\}/g)){let clause=match[1]??"";for(let part of clause.split(",")){let local=part.trim().split(/\s+as\s+/);if((local.length>1?local[1]:local[0])?.trim()===id)return!0}}return/\bexport\s+\*\s+from\b/.test(source)}function hostComponentFile(uiDir,addName,id){for(let extension of["tsx","ts","jsx","js"]){let path=join2(uiDir,`${addName}.${extension}`);if(!existsSync(path))continue;try{return exportsName(readFileSync(path,"utf8"),id)?path:null}catch{return null}}return null}import{existsSync as existsSync2,readdirSync,readFileSync as readFileSync2}from"fs";import{join as join3,resolve}from"path";function kebab(id){return id.replace(/(?<!^)(?=[A-Z])/g,"-").toLowerCase()}function addNameIndex(manifest){let byId=new Map(manifest.flatMap((c)=>c.registryName?[[c.id,c.registryName]]:[]));return(id)=>byId.get(id)??kebab(id)}function findUiDir(hostAppRoot){let candidates=[];try{let cj=JSON.parse(readFileSync2(join3(hostAppRoot,"components.json"),"utf8")),fromAlias=(alias,suffix="")=>{if(!alias)return;let srcBase=existsSync2(join3(hostAppRoot,"src"))?"src":"",rel=alias.replace(/^@\//,srcBase?`${srcBase}/`:"")+suffix;candidates.push(resolve(hostAppRoot,rel))};fromAlias(cj.aliases?.ui),fromAlias(cj.aliases?.components,"/ui")}catch{}candidates.push(resolve(hostAppRoot,"src/components/ui"),resolve(hostAppRoot,"components/ui"),resolve(hostAppRoot,"app/components/ui"));for(let dir of candidates)if(existsSync2(dir))return dir;return null}function installedAddNames(hostAppRoot){let dir=findUiDir(hostAppRoot);if(!dir)return new Set;try{return new Set(readdirSync(dir).filter((f)=>f.endsWith(".tsx")||f.endsWith(".ts")).map((f)=>f.replace(/\.(tsx|ts)$/,"")))}catch{return new Set}}function enrichManifestFromHost(manifest,uiDir){if(!uiDir)return manifest;let addNameOf=addNameIndex(manifest),byFile=new Map,read=(addName)=>{if(byFile.has(addName))return byFile.get(addName)??null;for(let ext of["tsx","ts","jsx","js"]){let path=join4(uiDir,`${addName}.${ext}`);if(!existsSync3(path))continue;let source=readFileSync3(path,"utf8");return byFile.set(addName,source),source}return byFile.set(addName,""),null};return manifest.map((descriptor)=>{if(descriptor.source==="velloo")return descriptor;let source=read(addNameOf(descriptor.id));if(!source||!exportsName(source,descriptor.id))return descriptor;let additions=[...variantPropsFor(source,descriptor.id===descriptor.family),...declaredPropsFor(source,descriptor.id)];if(additions.length===0)return descriptor;let props=[...descriptor.props];for(let addition of additions){let index=props.findIndex((prop)=>prop.name===addition.name);if(index>=0)props[index]={...props[index],...addition};else props.push(addition)}return{...descriptor,props,designModeNotes:appendNote(descriptor.designModeNotes,"Props include variants detected from the app's component source.")}})}function appendNote(current,next){return current?`${current} ${next}`:next}function variantPropsFor(source,primary){let out=[];if(!primary)return out;let variantsAt=source.indexOf("variants:");if(variantsAt<0)return out;let open=source.indexOf("{",variantsAt),block=balancedBlock(source,open);if(!block)return out;for(let[name,value]of objectEntries(block.slice(1,-1))){let values=objectEntries(value.slice(1,-1)).map(([key])=>key);if(values.length===0)continue;out.push({name,type:`${values.map((value)=>JSON.stringify(value)).join(" | ")} | undefined`,optional:!0,control:"enum",enumValues:values,...defaultVariant(source,name)?{defaultValue:defaultVariant(source,name)}:{}})}return out}function defaultVariant(source,name){let at=source.indexOf("defaultVariants:");if(at<0)return;let open=source.indexOf("{",at),block=balancedBlock(source,open);if(!block)return;return objectEntries(block.slice(1,-1)).find(([key])=>key===name)?.[1].replace(/["'`\s]/g,"")}function declaredPropsFor(source,componentId){let match=[new RegExp(`interface\\s+${componentId}Props(?:\\s+extends[^\\{]+)?\\s*\\{`,"m"),new RegExp(`type\\s+${componentId}Props\\s*=.*?&\\s*\\{`,"m")].map((pattern)=>pattern.exec(source)).find(Boolean);if(!match||match.index===void 0)return[];let open=source.indexOf("{",match.index),block=balancedBlock(source,open);if(!block)return[];let out=[],property=/(?:^|[;{\n])\s*([A-Za-z_$][\w$]*)(\?)?\s*:\s*([^;\n}]+)/gm;for(let found of block.slice(1,-1).matchAll(property)){let name=found[1],raw=found[3]?.trim();if(!name||!raw||name==="children")continue;let enumValues=[...raw.matchAll(/["']([^"']+)["']/g)].map((value)=>value[1]),optional=found[2]==="?"||raw.includes("undefined");out.push({name,type:optional&&!raw.includes("undefined")?`${raw} | undefined`:raw,optional,control:enumValues.length>0?"enum":/boolean/.test(raw)?"boolean":/number/.test(raw)?"number":"string",...enumValues.length>0?{enumValues}:{}})}return out}function balancedBlock(source,open){if(open<0||source[open]!=="{")return null;let depth=0,quote="";for(let index=open;index<source.length;index++){let char=source[index],prev=source[index-1];if(quote){if(char===quote&&prev!=="\\")quote="";continue}if(char==='"'||char==="'"||char==="`"){quote=char;continue}if(char==="{")depth++;if(char==="}"&&--depth===0)return source.slice(open,index+1)}return null}function objectEntries(body){let out=[],index=0;while(index<body.length){while(index<body.length&&/[\s,]/.test(body[index]))index++;let keyMatch=/^(?:["']([^"']+)["']|([A-Za-z_$][\w$-]*))\s*:/.exec(body.slice(index));if(!keyMatch)break;let key=keyMatch[1]??keyMatch[2];if(!key)break;index+=keyMatch[0].length;while(/\s/.test(body[index]??""))index++;if(body[index]==="{"){let block=balancedBlock(body,index);if(!block)break;out.push([key,block]),index+=block.length;continue}let end=valueEnd(body,index);out.push([key,body.slice(index,end).trim()]),index=end+1}return out}function valueEnd(body,start){let quote="",depth=0;for(let index=start;index<body.length;index++){let char=body[index];if(quote){if(char===quote&&body[index-1]!=="\\")quote=""}else if(char==='"'||char==="'"||char==="`")quote=char;else if("([{".includes(char))depth++;else if(")]}".includes(char))depth--;else if(char===","&&depth===0)return index}return body.length}function createProvider(opts={}){let cacheDir=opts.cacheDir,plannedUiDir=cacheDir?join5(cacheDir,"ui"):void 0,hostUiDir=()=>plannedUiDir&&existsSync4(plannedUiDir)?plannedUiDir:opts.hostAppRoot?findUiDir(opts.hostAppRoot):null,componentsDir=componentsDir3,version=opts.version??snapshotVersion2,hostAppRoot=opts.hostAppRoot,loadManifest=async()=>{if(cacheDir&&existsSync4(join5(cacheDir,"manifest.json")))return enrichManifestFromHost(await readManifest(cacheDir),hostUiDir());let{loadManifest:snapshotManifest}=await import("./chunk-emv1j50t.js");return enrichManifestFromHost(await snapshotManifest(),hostUiDir())};return{id:"shadcn-upstream",version,componentsDir,styleEntryPath:entryCssPath3,registry:registry2,loadManifest,label:`shadcn (upstream @ ${version})`,styleChannel:TAILWIND_CLASSNAME,styleChannels:["tailwind-classname"],mcpIntro:()=>['**This folder targets shadcn/ui with Tailwind.** The canvas imports client-safe components directly from the app\'s `components/ui`, adapts overlay families to stay inline, and falls back per component when a file is missing \u2014 `component_status` says which, before you claim fidelity. Style with a className string: `update_props { style: "flex gap-4 p-6" }`.',""],catalog:async()=>{let manifest=await loadManifest(),addNameOf=addNameIndex(manifest),shadcn=manifest.filter((c)=>c.source!=="velloo"),present=hostAppRoot?installedAddNames(hostAppRoot):new Set;return shadcn.map((c)=>{let addName=addNameOf(c.id);return{id:c.id,installed:present.has(addName),importPath:`@/components/ui/${addName}`}})},ownedModules:{dirs:()=>{let uiDir=hostUiDir();return uiDir?[uiDir]:[]}},canvasBundleSpec:{styleRuntime:{kind:"none"},components:async(ids)=>{let manifest=await loadManifest(),addNameOf=addNameIndex(manifest),sourceById=new Map(manifest.map((entry)=>[entry.id,entry.source])),uiDir=hostUiDir();return ids.flatMap((id)=>{if(sourceById.get(id)==="velloo"){let path=helperSourcePath(id);return path?[{id,sources:[{importPath:path,exportName:id,fidelity:"fallback",note:"Velloo helper used alongside repo-backed shadcn components."}]}]:[]}if(!sourceById.has(id))return[];let addName=addNameOf(id),snapshotPath=join5(componentsDir3,"ui",`${addName}.tsx`);if(CANVAS_ADAPTED_FAMILIES.has(addName))return[{id,sources:[{importPath:snapshotPath,exportName:id,fidelity:"adapted",note:"The app component uses portals or runtime state; Velloo renders its canvas-safe counterpart inline."}]}];let hostPath=uiDir?hostComponentFile(uiDir,addName,id):null;return[{id,sources:[...hostPath?[{importPath:hostPath,exportName:id,fidelity:"exact",preflight:!0,note:"Rendered directly from the app's shadcn source file."}]:[],{importPath:snapshotPath,exportName:id,fidelity:"fallback",note:hostPath?"The app source did not compile for the browser canvas; using the bundled canvas fallback.":"The app does not install this component under this name (it may be renamed in its own file); using the bundled canvas fallback."}]}]})},sourceDirs:()=>{let uiDir=hostUiDir()??plannedUiDir;return uiDir?[uiDir]:[]}}}}var CANVAS_ADAPTED_FAMILIES=new Set(["alert-dialog","calendar","carousel","chart","dialog","dropdown-menu","popover","select","sheet","sonner","tooltip"]);export{createProvider};