makersclaw 0.2.0 → 0.3.1

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 (475) hide show
  1. package/THIRD-PARTY-NOTICES.md +180 -0
  2. package/package.json +3 -2
  3. package/r/annotate.json +62 -0
  4. package/r/approval-request.json +52 -0
  5. package/r/audio-player.json +74 -0
  6. package/r/auth-form.json +55 -0
  7. package/r/board.json +10 -6
  8. package/r/calendar-view.json +105 -0
  9. package/r/cart.json +62 -0
  10. package/r/chart.json +83 -0
  11. package/r/chat.json +95 -0
  12. package/r/code-editor.json +94 -0
  13. package/r/comment-box.json +64 -0
  14. package/r/contact-section.json +53 -0
  15. package/r/core.json +205 -8
  16. package/r/csv-import.json +63 -0
  17. package/r/data-table.json +69 -0
  18. package/r/diagram.json +74 -0
  19. package/r/doc-editor.json +82 -0
  20. package/r/doc-page.json +61 -0
  21. package/r/email-render.json +73 -0
  22. package/r/faq.json +50 -0
  23. package/r/file-upload.json +54 -0
  24. package/r/flow-canvas.json +93 -0
  25. package/r/footer.json +52 -0
  26. package/r/gantt.json +70 -0
  27. package/r/job-panel.json +12 -7
  28. package/r/json-editor.json +66 -0
  29. package/r/map.json +89 -0
  30. package/r/menubar.json +52 -0
  31. package/r/mind-map.json +67 -0
  32. package/r/navigation-menu.json +52 -0
  33. package/r/order-detail.json +54 -0
  34. package/r/org-chart.json +66 -0
  35. package/r/page-builder.json +105 -0
  36. package/r/payment-methods.json +51 -0
  37. package/r/pdf-document.json +79 -0
  38. package/r/pdf-viewer.json +88 -0
  39. package/r/product-detail.json +76 -0
  40. package/r/product-grid.json +65 -0
  41. package/r/record-form.json +67 -0
  42. package/r/record-notes.json +55 -0
  43. package/r/registry.json +3411 -29
  44. package/r/search-dialog.json +51 -0
  45. package/r/settings-list.json +66 -0
  46. package/r/setup-checklist.json +51 -0
  47. package/r/share-dialog.json +52 -0
  48. package/r/sidebar.json +69 -0
  49. package/r/signature-pad.json +72 -0
  50. package/r/sketch-canvas.json +99 -0
  51. package/r/spreadsheet.json +90 -0
  52. package/r/stat-cards.json +66 -0
  53. package/r/task-list.json +63 -0
  54. package/r/task-model.json +98 -0
  55. package/r/testimonials.json +52 -0
  56. package/r/transaction-list.json +53 -0
  57. package/r/whiteboard.json +66 -0
  58. package/registry/blocks/annotate/README.md +179 -0
  59. package/registry/blocks/annotate/annotate-data.js +250 -0
  60. package/registry/blocks/annotate/annotate.jsx +646 -0
  61. package/registry/blocks/annotate/block.json +10 -0
  62. package/registry/blocks/annotate/demo.jsx +135 -0
  63. package/registry/blocks/annotate/index.js +15 -0
  64. package/registry/blocks/approval-request/README.md +116 -0
  65. package/registry/blocks/approval-request/approval-request.jsx +386 -0
  66. package/registry/blocks/approval-request/block.json +10 -0
  67. package/registry/blocks/approval-request/demo.jsx +127 -0
  68. package/registry/blocks/approval-request/index.js +4 -0
  69. package/registry/blocks/audio-player/README.md +167 -0
  70. package/registry/blocks/audio-player/audio-player.jsx +623 -0
  71. package/registry/blocks/audio-player/block.json +14 -0
  72. package/registry/blocks/audio-player/colors.js +109 -0
  73. package/registry/blocks/audio-player/demo.jsx +209 -0
  74. package/registry/blocks/audio-player/index.js +6 -0
  75. package/registry/blocks/audio-player/time.js +67 -0
  76. package/registry/blocks/audio-player/wavesurfer.js +9 -0
  77. package/registry/blocks/auth-form/README.md +126 -0
  78. package/registry/blocks/auth-form/auth-form.jsx +568 -0
  79. package/registry/blocks/auth-form/block.json +10 -0
  80. package/registry/blocks/auth-form/demo.jsx +131 -0
  81. package/registry/blocks/auth-form/index.js +3 -0
  82. package/registry/blocks/board/README.md +55 -5
  83. package/registry/blocks/board/block.json +2 -2
  84. package/registry/blocks/board/board.jsx +230 -86
  85. package/registry/blocks/board/demo.jsx +103 -24
  86. package/registry/blocks/calendar-view/README.md +180 -0
  87. package/registry/blocks/calendar-view/agenda.jsx +147 -0
  88. package/registry/blocks/calendar-view/block.json +76 -0
  89. package/registry/blocks/calendar-view/calendar-model.js +442 -0
  90. package/registry/blocks/calendar-view/calendar.jsx +627 -0
  91. package/registry/blocks/calendar-view/demo.jsx +195 -0
  92. package/registry/blocks/calendar-view/draft.jsx +49 -0
  93. package/registry/blocks/calendar-view/index.js +39 -0
  94. package/registry/blocks/calendar-view/month.jsx +346 -0
  95. package/registry/blocks/calendar-view/paint.js +69 -0
  96. package/registry/blocks/calendar-view/time-grid.jsx +527 -0
  97. package/registry/blocks/calendar-view/tray.jsx +87 -0
  98. package/registry/blocks/cart/README.md +146 -0
  99. package/registry/blocks/cart/block.json +10 -0
  100. package/registry/blocks/cart/cart.jsx +597 -0
  101. package/registry/blocks/cart/demo.jsx +98 -0
  102. package/registry/blocks/cart/index.js +4 -0
  103. package/registry/blocks/cart/money.js +28 -0
  104. package/registry/blocks/chart/README.md +316 -0
  105. package/registry/blocks/chart/block.json +10 -0
  106. package/registry/blocks/chart/cartesian.jsx +642 -0
  107. package/registry/blocks/chart/core.jsx +262 -0
  108. package/registry/blocks/chart/demo.jsx +357 -0
  109. package/registry/blocks/chart/heatmap.jsx +336 -0
  110. package/registry/blocks/chart/index.js +8 -0
  111. package/registry/blocks/chart/pie.jsx +245 -0
  112. package/registry/blocks/chart/sparkline.jsx +88 -0
  113. package/registry/blocks/chat/README.md +273 -0
  114. package/registry/blocks/chat/attachment.jsx +95 -0
  115. package/registry/blocks/chat/block.json +10 -0
  116. package/registry/blocks/chat/chat.jsx +132 -0
  117. package/registry/blocks/chat/composer.jsx +364 -0
  118. package/registry/blocks/chat/demo.jsx +578 -0
  119. package/registry/blocks/chat/header.jsx +34 -0
  120. package/registry/blocks/chat/index.js +9 -0
  121. package/registry/blocks/chat/message.jsx +450 -0
  122. package/registry/blocks/chat/scroller.jsx +247 -0
  123. package/registry/blocks/chat/text.jsx +104 -0
  124. package/registry/blocks/code-editor/README.md +210 -0
  125. package/registry/blocks/code-editor/block.json +22 -0
  126. package/registry/blocks/code-editor/code-editor.jsx +534 -0
  127. package/registry/blocks/code-editor/codemirror.js +38 -0
  128. package/registry/blocks/code-editor/demo.jsx +205 -0
  129. package/registry/blocks/code-editor/index.js +8 -0
  130. package/registry/blocks/code-editor/json.js +317 -0
  131. package/registry/blocks/code-editor/sql.js +136 -0
  132. package/registry/blocks/code-editor/text.js +101 -0
  133. package/registry/blocks/code-editor/theme.js +186 -0
  134. package/registry/blocks/comment-box/README.md +123 -0
  135. package/registry/blocks/comment-box/block.json +10 -0
  136. package/registry/blocks/comment-box/comment-body.jsx +217 -0
  137. package/registry/blocks/comment-box/comment-box.jsx +198 -0
  138. package/registry/blocks/comment-box/comment-time.jsx +77 -0
  139. package/registry/blocks/comment-box/demo.jsx +141 -0
  140. package/registry/blocks/comment-box/index.js +8 -0
  141. package/registry/blocks/contact-section/README.md +152 -0
  142. package/registry/blocks/contact-section/block.json +11 -0
  143. package/registry/blocks/contact-section/contact-section.jsx +509 -0
  144. package/registry/blocks/contact-section/demo.jsx +93 -0
  145. package/registry/blocks/contact-section/index.js +4 -0
  146. package/registry/blocks/csv-import/README.md +133 -0
  147. package/registry/blocks/csv-import/block.json +13 -0
  148. package/registry/blocks/csv-import/csv-import.jsx +479 -0
  149. package/registry/blocks/csv-import/demo.jsx +106 -0
  150. package/registry/blocks/csv-import/import.js +200 -0
  151. package/registry/blocks/csv-import/index.js +7 -0
  152. package/registry/blocks/data-table/README.md +386 -0
  153. package/registry/blocks/data-table/block.json +10 -0
  154. package/registry/blocks/data-table/data-table.jsx +1164 -0
  155. package/registry/blocks/data-table/demo.jsx +588 -0
  156. package/registry/blocks/data-table/index.js +5 -0
  157. package/registry/blocks/data-table/model.js +169 -0
  158. package/registry/blocks/diagram/README.md +108 -0
  159. package/registry/blocks/diagram/block.json +13 -0
  160. package/registry/blocks/diagram/demo.jsx +113 -0
  161. package/registry/blocks/diagram/diagram.jsx +481 -0
  162. package/registry/blocks/diagram/index.js +7 -0
  163. package/registry/blocks/diagram/mermaid.js +52 -0
  164. package/registry/blocks/diagram/palette.js +313 -0
  165. package/registry/blocks/diagram/source.js +98 -0
  166. package/registry/blocks/doc-editor/README.md +215 -0
  167. package/registry/blocks/doc-editor/block.json +15 -0
  168. package/registry/blocks/doc-editor/demo.jsx +225 -0
  169. package/registry/blocks/doc-editor/doc-editor.jsx +291 -0
  170. package/registry/blocks/doc-editor/doc.js +309 -0
  171. package/registry/blocks/doc-editor/index.js +7 -0
  172. package/registry/blocks/doc-editor/schema.jsx +56 -0
  173. package/registry/blocks/doc-editor/shadcn-classes.js +110 -0
  174. package/registry/blocks/doc-editor/theme.js +82 -0
  175. package/registry/blocks/doc-page/README.md +119 -0
  176. package/registry/blocks/doc-page/autosave.js +104 -0
  177. package/registry/blocks/doc-page/block.json +10 -0
  178. package/registry/blocks/doc-page/demo.jsx +137 -0
  179. package/registry/blocks/doc-page/doc-page.jsx +276 -0
  180. package/registry/blocks/doc-page/index.js +4 -0
  181. package/registry/blocks/email-render/README.md +151 -0
  182. package/registry/blocks/email-render/block.json +14 -0
  183. package/registry/blocks/email-render/demo.jsx +153 -0
  184. package/registry/blocks/email-render/doc-email.jsx +210 -0
  185. package/registry/blocks/email-render/email.jsx +221 -0
  186. package/registry/blocks/email-render/index.js +10 -0
  187. package/registry/blocks/email-render/render.js +50 -0
  188. package/registry/blocks/email-render/theme.js +215 -0
  189. package/registry/blocks/faq/README.md +101 -0
  190. package/registry/blocks/faq/block.json +11 -0
  191. package/registry/blocks/faq/demo.jsx +89 -0
  192. package/registry/blocks/faq/faq.jsx +220 -0
  193. package/registry/blocks/faq/index.js +4 -0
  194. package/registry/blocks/file-upload/README.md +138 -0
  195. package/registry/blocks/file-upload/block.json +10 -0
  196. package/registry/blocks/file-upload/demo.jsx +204 -0
  197. package/registry/blocks/file-upload/file-upload.jsx +635 -0
  198. package/registry/blocks/file-upload/index.js +4 -0
  199. package/registry/blocks/flow-canvas/README.md +420 -0
  200. package/registry/blocks/flow-canvas/block.json +13 -0
  201. package/registry/blocks/flow-canvas/board.js +819 -0
  202. package/registry/blocks/flow-canvas/chrome.jsx +649 -0
  203. package/registry/blocks/flow-canvas/context.jsx +35 -0
  204. package/registry/blocks/flow-canvas/demo.jsx +249 -0
  205. package/registry/blocks/flow-canvas/edges.jsx +107 -0
  206. package/registry/blocks/flow-canvas/flow-canvas.jsx +1329 -0
  207. package/registry/blocks/flow-canvas/index.js +41 -0
  208. package/registry/blocks/flow-canvas/nodes.jsx +392 -0
  209. package/registry/blocks/flow-canvas/theme.js +174 -0
  210. package/registry/blocks/footer/README.md +133 -0
  211. package/registry/blocks/footer/block.json +11 -0
  212. package/registry/blocks/footer/demo.jsx +119 -0
  213. package/registry/blocks/footer/footer.jsx +406 -0
  214. package/registry/blocks/footer/index.js +4 -0
  215. package/registry/blocks/gantt/README.md +220 -0
  216. package/registry/blocks/gantt/block.json +10 -0
  217. package/registry/blocks/gantt/demo.jsx +148 -0
  218. package/registry/blocks/gantt/gantt.jsx +923 -0
  219. package/registry/blocks/gantt/index.js +7 -0
  220. package/registry/blocks/gantt/rows.jsx +468 -0
  221. package/registry/blocks/gantt/schedule.js +278 -0
  222. package/registry/blocks/job-panel/README.md +80 -0
  223. package/registry/blocks/job-panel/block.json +3 -3
  224. package/registry/blocks/job-panel/demo.jsx +230 -3
  225. package/registry/blocks/job-panel/job-panel.jsx +169 -3
  226. package/registry/blocks/json-editor/README.md +133 -0
  227. package/registry/blocks/json-editor/block.json +10 -0
  228. package/registry/blocks/json-editor/demo.jsx +92 -0
  229. package/registry/blocks/json-editor/index.js +7 -0
  230. package/registry/blocks/json-editor/json-editor.jsx +305 -0
  231. package/registry/blocks/json-editor/json-tree.jsx +393 -0
  232. package/registry/blocks/json-editor/tree.js +225 -0
  233. package/registry/blocks/map/README.md +221 -0
  234. package/registry/blocks/map/block.json +14 -0
  235. package/registry/blocks/map/demo.jsx +201 -0
  236. package/registry/blocks/map/geo.js +198 -0
  237. package/registry/blocks/map/index.js +8 -0
  238. package/registry/blocks/map/list.jsx +128 -0
  239. package/registry/blocks/map/map-view.jsx +715 -0
  240. package/registry/blocks/map/maplibre.js +30 -0
  241. package/registry/blocks/map/marks.jsx +146 -0
  242. package/registry/blocks/map/theme.js +142 -0
  243. package/registry/blocks/menubar/README.md +109 -0
  244. package/registry/blocks/menubar/block.json +10 -0
  245. package/registry/blocks/menubar/demo.jsx +128 -0
  246. package/registry/blocks/menubar/index.js +4 -0
  247. package/registry/blocks/menubar/menubar.jsx +199 -0
  248. package/registry/blocks/mind-map/README.md +206 -0
  249. package/registry/blocks/mind-map/block.json +10 -0
  250. package/registry/blocks/mind-map/demo.jsx +103 -0
  251. package/registry/blocks/mind-map/index.js +31 -0
  252. package/registry/blocks/mind-map/mind-map.jsx +1125 -0
  253. package/registry/blocks/mind-map/topic.jsx +143 -0
  254. package/registry/blocks/mind-map/tree.js +645 -0
  255. package/registry/blocks/navigation-menu/README.md +124 -0
  256. package/registry/blocks/navigation-menu/block.json +10 -0
  257. package/registry/blocks/navigation-menu/demo.jsx +84 -0
  258. package/registry/blocks/navigation-menu/index.js +4 -0
  259. package/registry/blocks/navigation-menu/navigation-menu.jsx +448 -0
  260. package/registry/blocks/order-detail/README.md +109 -0
  261. package/registry/blocks/order-detail/block.json +10 -0
  262. package/registry/blocks/order-detail/demo.jsx +88 -0
  263. package/registry/blocks/order-detail/index.js +4 -0
  264. package/registry/blocks/order-detail/order-detail.jsx +354 -0
  265. package/registry/blocks/org-chart/README.md +145 -0
  266. package/registry/blocks/org-chart/block.json +10 -0
  267. package/registry/blocks/org-chart/demo.jsx +94 -0
  268. package/registry/blocks/org-chart/index.js +7 -0
  269. package/registry/blocks/org-chart/org-chart.jsx +631 -0
  270. package/registry/blocks/org-chart/org.js +245 -0
  271. package/registry/blocks/org-chart/person.jsx +96 -0
  272. package/registry/blocks/page-builder/README.md +257 -0
  273. package/registry/blocks/page-builder/block.json +14 -0
  274. package/registry/blocks/page-builder/demo.jsx +145 -0
  275. package/registry/blocks/page-builder/grapes.js +18 -0
  276. package/registry/blocks/page-builder/index.js +11 -0
  277. package/registry/blocks/page-builder/page-builder.jsx +704 -0
  278. package/registry/blocks/page-builder/page-view.jsx +33 -0
  279. package/registry/blocks/page-builder/page.js +118 -0
  280. package/registry/blocks/page-builder/panels.jsx +588 -0
  281. package/registry/blocks/page-builder/sections.js +209 -0
  282. package/registry/blocks/page-builder/theme.js +87 -0
  283. package/registry/blocks/page-builder/thumbs.jsx +189 -0
  284. package/registry/blocks/page-builder/tokens.js +329 -0
  285. package/registry/blocks/payment-methods/README.md +104 -0
  286. package/registry/blocks/payment-methods/block.json +10 -0
  287. package/registry/blocks/payment-methods/demo.jsx +71 -0
  288. package/registry/blocks/payment-methods/index.js +4 -0
  289. package/registry/blocks/payment-methods/payment-methods.jsx +302 -0
  290. package/registry/blocks/pdf-document/README.md +213 -0
  291. package/registry/blocks/pdf-document/block.json +13 -0
  292. package/registry/blocks/pdf-document/demo.jsx +136 -0
  293. package/registry/blocks/pdf-document/index.js +33 -0
  294. package/registry/blocks/pdf-document/money.js +83 -0
  295. package/registry/blocks/pdf-document/pdf-document.jsx +144 -0
  296. package/registry/blocks/pdf-document/primitives.jsx +271 -0
  297. package/registry/blocks/pdf-document/quote.jsx +179 -0
  298. package/registry/blocks/pdf-document/theme.js +193 -0
  299. package/registry/blocks/pdf-viewer/README.md +191 -0
  300. package/registry/blocks/pdf-viewer/block.json +14 -0
  301. package/registry/blocks/pdf-viewer/demo.jsx +252 -0
  302. package/registry/blocks/pdf-viewer/helpers.js +270 -0
  303. package/registry/blocks/pdf-viewer/index.js +8 -0
  304. package/registry/blocks/pdf-viewer/notes.jsx +195 -0
  305. package/registry/blocks/pdf-viewer/pdf-viewer.jsx +1368 -0
  306. package/registry/blocks/pdf-viewer/pdfjs.js +37 -0
  307. package/registry/blocks/pdf-viewer/ssr-shim-end.js +6 -0
  308. package/registry/blocks/pdf-viewer/ssr-shim.js +44 -0
  309. package/registry/blocks/product-detail/README.md +217 -0
  310. package/registry/blocks/product-detail/block.json +10 -0
  311. package/registry/blocks/product-detail/demo.jsx +233 -0
  312. package/registry/blocks/product-detail/index.js +7 -0
  313. package/registry/blocks/product-detail/price.jsx +115 -0
  314. package/registry/blocks/product-detail/product-detail.jsx +348 -0
  315. package/registry/blocks/product-detail/product-media.jsx +102 -0
  316. package/registry/blocks/product-detail/product-options.jsx +144 -0
  317. package/registry/blocks/product-grid/README.md +162 -0
  318. package/registry/blocks/product-grid/block.json +10 -0
  319. package/registry/blocks/product-grid/demo.jsx +255 -0
  320. package/registry/blocks/product-grid/index.js +5 -0
  321. package/registry/blocks/product-grid/product-card.jsx +232 -0
  322. package/registry/blocks/product-grid/product-grid.jsx +235 -0
  323. package/registry/blocks/record-form/README.md +196 -0
  324. package/registry/blocks/record-form/block.json +10 -0
  325. package/registry/blocks/record-form/demo.jsx +525 -0
  326. package/registry/blocks/record-form/index.js +4 -0
  327. package/registry/blocks/record-form/record-fields.jsx +457 -0
  328. package/registry/blocks/record-form/record-form.jsx +415 -0
  329. package/registry/blocks/record-form/rules.js +81 -0
  330. package/registry/blocks/record-notes/README.md +139 -0
  331. package/registry/blocks/record-notes/block.json +10 -0
  332. package/registry/blocks/record-notes/demo.jsx +179 -0
  333. package/registry/blocks/record-notes/index.js +4 -0
  334. package/registry/blocks/record-notes/record-notes.jsx +266 -0
  335. package/registry/blocks/search-dialog/README.md +108 -0
  336. package/registry/blocks/search-dialog/block.json +10 -0
  337. package/registry/blocks/search-dialog/demo.jsx +116 -0
  338. package/registry/blocks/search-dialog/index.js +3 -0
  339. package/registry/blocks/search-dialog/search-dialog.jsx +235 -0
  340. package/registry/blocks/settings-list/README.md +171 -0
  341. package/registry/blocks/settings-list/block.json +10 -0
  342. package/registry/blocks/settings-list/demo.jsx +333 -0
  343. package/registry/blocks/settings-list/index.js +4 -0
  344. package/registry/blocks/settings-list/row-state.jsx +93 -0
  345. package/registry/blocks/settings-list/settings-list.jsx +349 -0
  346. package/registry/blocks/settings-list/settings-matrix.jsx +118 -0
  347. package/registry/blocks/setup-checklist/README.md +142 -0
  348. package/registry/blocks/setup-checklist/block.json +10 -0
  349. package/registry/blocks/setup-checklist/demo.jsx +159 -0
  350. package/registry/blocks/setup-checklist/index.js +4 -0
  351. package/registry/blocks/setup-checklist/setup-checklist.jsx +446 -0
  352. package/registry/blocks/share-dialog/README.md +113 -0
  353. package/registry/blocks/share-dialog/block.json +10 -0
  354. package/registry/blocks/share-dialog/demo.jsx +140 -0
  355. package/registry/blocks/share-dialog/index.js +3 -0
  356. package/registry/blocks/share-dialog/share-dialog.jsx +384 -0
  357. package/registry/blocks/sidebar/README.md +190 -0
  358. package/registry/blocks/sidebar/block.json +43 -0
  359. package/registry/blocks/sidebar/demo.jsx +577 -0
  360. package/registry/blocks/sidebar/index.js +4 -0
  361. package/registry/blocks/sidebar/sidebar-panel.jsx +149 -0
  362. package/registry/blocks/sidebar/sidebar.jsx +864 -0
  363. package/registry/blocks/signature-pad/README.md +137 -0
  364. package/registry/blocks/signature-pad/block.json +13 -0
  365. package/registry/blocks/signature-pad/colors.js +115 -0
  366. package/registry/blocks/signature-pad/demo.jsx +94 -0
  367. package/registry/blocks/signature-pad/index.js +6 -0
  368. package/registry/blocks/signature-pad/pad.js +7 -0
  369. package/registry/blocks/signature-pad/signature-pad.jsx +434 -0
  370. package/registry/blocks/signature-pad/signature.js +68 -0
  371. package/registry/blocks/sketch-canvas/README.md +280 -0
  372. package/registry/blocks/sketch-canvas/block.json +13 -0
  373. package/registry/blocks/sketch-canvas/demo.jsx +159 -0
  374. package/registry/blocks/sketch-canvas/excalidraw.js +40 -0
  375. package/registry/blocks/sketch-canvas/index.js +9 -0
  376. package/registry/blocks/sketch-canvas/palette.js +226 -0
  377. package/registry/blocks/sketch-canvas/sketch-canvas.jsx +1188 -0
  378. package/registry/blocks/sketch-canvas/sketch.js +179 -0
  379. package/registry/blocks/sketch-canvas/ssr-shim-end.js +6 -0
  380. package/registry/blocks/sketch-canvas/ssr-shim.js +45 -0
  381. package/registry/blocks/sketch-canvas/stamps.js +104 -0
  382. package/registry/blocks/sketch-canvas/theme.js +131 -0
  383. package/registry/blocks/spreadsheet/README.md +307 -0
  384. package/registry/blocks/spreadsheet/block.json +13 -0
  385. package/registry/blocks/spreadsheet/cells.jsx +455 -0
  386. package/registry/blocks/spreadsheet/chrome.jsx +325 -0
  387. package/registry/blocks/spreadsheet/demo.jsx +177 -0
  388. package/registry/blocks/spreadsheet/grid.js +387 -0
  389. package/registry/blocks/spreadsheet/index.js +34 -0
  390. package/registry/blocks/spreadsheet/spreadsheet.jsx +1732 -0
  391. package/registry/blocks/spreadsheet/types.js +473 -0
  392. package/registry/blocks/stat-cards/README.md +173 -0
  393. package/registry/blocks/stat-cards/block.json +10 -0
  394. package/registry/blocks/stat-cards/demo.jsx +257 -0
  395. package/registry/blocks/stat-cards/index.js +4 -0
  396. package/registry/blocks/stat-cards/stat-cards.jsx +307 -0
  397. package/registry/blocks/stat-cards/usage.jsx +243 -0
  398. package/registry/blocks/task-list/README.md +176 -0
  399. package/registry/blocks/task-list/block.json +10 -0
  400. package/registry/blocks/task-list/demo.jsx +134 -0
  401. package/registry/blocks/task-list/index.js +5 -0
  402. package/registry/blocks/task-list/task-list.jsx +907 -0
  403. package/registry/blocks/task-model/README.md +455 -0
  404. package/registry/blocks/task-model/block.json +167 -0
  405. package/registry/blocks/task-model/changes.js +89 -0
  406. package/registry/blocks/task-model/dates.js +371 -0
  407. package/registry/blocks/task-model/demo.jsx +215 -0
  408. package/registry/blocks/task-model/dnd.jsx +240 -0
  409. package/registry/blocks/task-model/index.js +97 -0
  410. package/registry/blocks/task-model/model.js +919 -0
  411. package/registry/blocks/task-model/parts.jsx +449 -0
  412. package/registry/blocks/task-model/toolbar.jsx +271 -0
  413. package/registry/blocks/testimonials/README.md +139 -0
  414. package/registry/blocks/testimonials/block.json +11 -0
  415. package/registry/blocks/testimonials/demo.jsx +137 -0
  416. package/registry/blocks/testimonials/index.js +4 -0
  417. package/registry/blocks/testimonials/testimonials.jsx +430 -0
  418. package/registry/blocks/transaction-list/README.md +126 -0
  419. package/registry/blocks/transaction-list/block.json +10 -0
  420. package/registry/blocks/transaction-list/demo.jsx +79 -0
  421. package/registry/blocks/transaction-list/index.js +4 -0
  422. package/registry/blocks/transaction-list/transaction-list.jsx +383 -0
  423. package/registry/blocks/whiteboard/README.md +179 -0
  424. package/registry/blocks/whiteboard/block.json +10 -0
  425. package/registry/blocks/whiteboard/demo.jsx +169 -0
  426. package/registry/blocks/whiteboard/index.js +6 -0
  427. package/registry/blocks/whiteboard/templates.js +150 -0
  428. package/registry/blocks/whiteboard/whiteboard.jsx +721 -0
  429. package/src/cli.mjs +19 -6
  430. package/src/install.mjs +18 -0
  431. package/src/registry.mjs +38 -4
  432. package/src/shadcn.mjs +14 -1
  433. package/templates/next/files/README.md +145 -11
  434. package/templates/next/files/app/globals.css +55 -4
  435. package/templates/next/files/check/run.mjs +3 -3
  436. package/templates/next/files/components/ui/avatar.jsx +141 -0
  437. package/templates/next/files/components/ui/breadcrumb.jsx +149 -0
  438. package/templates/next/files/components/ui/button-group.jsx +70 -0
  439. package/templates/next/files/components/ui/button.jsx +132 -12
  440. package/templates/next/files/components/ui/calendar.jsx +609 -0
  441. package/templates/next/files/components/ui/carousel.jsx +281 -0
  442. package/templates/next/files/components/ui/collapsible.jsx +208 -0
  443. package/templates/next/files/components/ui/combobox.jsx +608 -0
  444. package/templates/next/files/components/ui/command.jsx +577 -0
  445. package/templates/next/files/components/ui/context-menu.jsx +191 -0
  446. package/templates/next/files/components/ui/date-picker.jsx +360 -0
  447. package/templates/next/files/components/ui/distribution.jsx +117 -0
  448. package/templates/next/files/components/ui/feedback.jsx +143 -0
  449. package/templates/next/files/components/ui/field.jsx +115 -3
  450. package/templates/next/files/components/ui/file-input.jsx +234 -0
  451. package/templates/next/files/components/ui/icon.jsx +130 -8
  452. package/templates/next/files/components/ui/image.jsx +143 -0
  453. package/templates/next/files/components/ui/index.js +47 -2
  454. package/templates/next/files/components/ui/input-group.jsx +213 -0
  455. package/templates/next/files/components/ui/input-otp.jsx +170 -0
  456. package/templates/next/files/components/ui/item.jsx +206 -0
  457. package/templates/next/files/components/ui/menu.jsx +454 -82
  458. package/templates/next/files/components/ui/notice.jsx +126 -14
  459. package/templates/next/files/components/ui/pagination.jsx +156 -0
  460. package/templates/next/files/components/ui/popover.jsx +284 -0
  461. package/templates/next/files/components/ui/radio.jsx +193 -0
  462. package/templates/next/files/components/ui/rating.jsx +131 -0
  463. package/templates/next/files/components/ui/resizable.jsx +338 -0
  464. package/templates/next/files/components/ui/scroll-area.jsx +123 -0
  465. package/templates/next/files/components/ui/separator.jsx +119 -0
  466. package/templates/next/files/components/ui/sheet.jsx +96 -11
  467. package/templates/next/files/components/ui/slider.jsx +174 -0
  468. package/templates/next/files/components/ui/stat.jsx +574 -0
  469. package/templates/next/files/components/ui/steps.jsx +338 -0
  470. package/templates/next/files/components/ui/swatch.jsx +33 -0
  471. package/templates/next/files/components/ui/table.jsx +130 -0
  472. package/templates/next/files/components/ui/toast.jsx +440 -0
  473. package/templates/next/files/components/ui/toggle.jsx +195 -0
  474. package/templates/next/files/components/ui/tooltip.jsx +270 -0
  475. package/templates/next/template.json +264 -8
@@ -0,0 +1,280 @@
1
+ # SketchCanvas
2
+
3
+ A freeform drawing canvas in the workspace theme, friendly like Miro. A
4
+ tool rail on the left (a bar along the bottom on a phone): select, pan,
5
+ draw, rectangle, ellipse, diamond, arrow, line, text, image, eraser, frame
6
+ — each with its one-key shortcut. Select something and a small toolbar
7
+ floats above it: colour and fill from the theme's palette, stroke, text
8
+ size, bring to front / send to back, duplicate, delete. Undo and redo sit
9
+ bottom left, zoom and fit-to-screen bottom right, a menu top right
10
+ (download PNG, snap to grid, shortcuts, clear). An empty canvas says how
11
+ to start. Stamp tools place ready-made drawings with one click — the six
12
+ UI wireframe pieces come built in.
13
+
14
+ It is [Excalidraw](https://github.com/excalidraw/excalidraw) (MIT)
15
+ underneath: its canvas, selection, text editing, history and shortcuts;
16
+ our rail, toolbars, palette and empty state, in the kit. Excalidraw's own
17
+ tool bar, properties panel, main menu, library, share / collaboration
18
+ buttons, welcome screen and sidebars are hidden. The blocks built on this
19
+ one — `whiteboard`, `annotate`, `sketch-to-app` — import it, never
20
+ `@excalidraw/excalidraw`.
21
+
22
+ ```jsx
23
+ import { SketchCanvas, sketchToText } from "../components/blocks/sketch-canvas"; // a Makersclaw app ("./blocks/sketch-canvas" from components/)
24
+ import { SketchCanvas, sketchToText } from "@/components/makersclaw/blocks/sketch-canvas"; // a shadcn project
25
+ ```
26
+
27
+ `SketchCanvas` is a client component: render it from a `"use client"`
28
+ component. The helpers (`sketchToText`, `sketchItems`, `emptySketch`,
29
+ `isSketchEmpty`, `toSketch`) are plain functions and work on the server.
30
+
31
+ `makersclaw add sketch-canvas` adds `@excalidraw/excalidraw` (pinned,
32
+ exact) to package.json: run `npm install` after. It loads with the page
33
+ (no `import()`); the canvas mounts after the first render, and until then
34
+ — on the server — the frame shows "Loading the canvas…", with the
35
+ sketch's words for a screen reader.
36
+
37
+ ## The data
38
+
39
+ A sketch is plain JSON. Store it as it comes out of `onChange` / `onSave`
40
+ (a `jsonb` column).
41
+
42
+ ```js
43
+ {
44
+ type: "sketch",
45
+ version: 1,
46
+ elements: [ /* Excalidraw elements, non-deleted, in paint order (first = back) */ ],
47
+ files: { "<fileId>": { id, mimeType: "image/png", dataURL: "data:image/png;base64,…", created } },
48
+ appState: { gridModeEnabled: false },
49
+ }
50
+ ```
51
+
52
+ - `elements` are Excalidraw's own element objects: `type` is `rectangle`,
53
+ `ellipse`, `diamond`, `arrow`, `line`, `freedraw`, `text`, `image` or
54
+ `frame`; each has `id`, `x`, `y`, `width`, `height`, `strokeColor`,
55
+ `backgroundColor`, `strokeWidth`, `roughness`, `groupIds`, `frameId`…
56
+ A `text` has `text`, `fontSize`, and `containerId` when it is the label
57
+ of a shape; a shape lists its label and arrows in `boundElements`.
58
+ - **Colours are tokens.** Every colour picked in the canvas is a theme
59
+ token, and the element keeps it in `customData.tokens`:
60
+ `{ strokeColor: "primary", backgroundColor: "chart-2:soft" }`. The
61
+ concrete colour beside it (`strokeColor`) is what the token resolved to
62
+ when it was saved; on load, and whenever the theme or light/dark
63
+ changes, the canvas resolves every token again and repaints. A colour
64
+ with no token (pasted from elsewhere) stays as it is.
65
+ Tokens: `foreground`, `muted-foreground`, `primary`, `destructive`,
66
+ `warning`, `success`, `info`, `chart-2` … `chart-5` (ink), and for
67
+ fills also `none`, `muted` and `<slot>:soft` (the slot mixed into the
68
+ page background — a sticky-note tint). `STROKES` and `FILLS` list them
69
+ with labels.
70
+ - **Stamps** mark what they place: every element of one stamp shares a
71
+ group and carries `customData: { stamp: "button", stampId }`.
72
+ - `files` holds the images the elements show (only those). Images are
73
+ data URLs inside the JSON — keep them small, or store the file
74
+ elsewhere and keep the sketch light.
75
+ - The `background` image is never in the value; it comes from the prop.
76
+ - Written by hand (a starter template, a seed), an element may leave out
77
+ what Excalidraw can default (`version`, `seed`, `strokeWidth`,
78
+ `roughness`…) and give its colours only as tokens:
79
+ `{ id: "a", type: "rectangle", x: 0, y: 0, width: 160, height: 72, customData: { tokens: { strokeColor: "foreground", backgroundColor: "chart-2:soft" } } }`.
80
+ A text needs `text`, `fontSize` and a rough `width`/`height` (it is
81
+ re-measured). Or skip hand-written elements: insert skeletons through
82
+ the handle (below).
83
+ - `sketchToText(sketch)` reads the words out for an agent; see Helpers.
84
+
85
+ ## Props
86
+
87
+ - `value` — the sketch, controlled. A new `value` that differs from what
88
+ the canvas last sent replaces the drawing (loading another record) and
89
+ clears undo. Pass back exactly what `onChange` gave you and nothing
90
+ resets. Also takes a bare element array or Excalidraw's own export
91
+ (`{ elements, files, appState }`).
92
+ - `defaultValue` — the starting sketch, uncontrolled. With neither, it
93
+ starts empty.
94
+ - `onChange(sketch)` — the whole sketch, after an edit settles
95
+ (debounced by `changeDelay`). Not called for pan, zoom or selection.
96
+ - `onSave(sketch)` — `async`, returns `{ ok: true }` or
97
+ `{ ok: false, error? }`. Called with the same sketch, right after
98
+ `onChange`, and on Cmd/Ctrl+S. The canvas shows "Saving…", "Saved",
99
+ or the error with a Retry. A throw counts as a failure.
100
+ - `changeDelay` — ms of quiet before `onChange` / `onSave` (default 600).
101
+ - `readOnly` — `false` (default). `true` shows the sketch to look at: pan
102
+ and zoom, no rail, no toolbar, no edits.
103
+ - `background` — `{ src, width?, height? }`: an image laid at the back,
104
+ locked (it cannot be selected, moved, erased or deleted), top-left at
105
+ (0, 0). For marking up a screenshot (annotate). `src` is a data URL, or
106
+ a same-origin URL (a cross-origin one draws, but spoils `exportImage`).
107
+ Without `width`/`height` the image's own size is used. When it first
108
+ lands on an empty sketch, the view fits it.
109
+ - `tools` — ids of the built-in tools to offer, in rail order:
110
+ `["select", "hand", "draw", "rectangle", "ellipse", "diamond", "arrow",
111
+ "line", "text", "image", "eraser", "frame"]` (all, the default). A tool
112
+ left out is also unreachable by its shortcut. `SKETCH_TOOLS` lists them
113
+ with labels, icons and keys.
114
+ - `stamps` — stamp tools after the built-ins:
115
+ `[{ id, label, icon, create() }]`. `create()` returns element
116
+ skeletons (below) laid out from (0, 0); a click on the canvas places
117
+ them centred on the pointer (Enter: the middle of the view; Esc
118
+ cancels), grouped, selected. `WIREFRAME_STAMPS` are button, input, card,
119
+ nav bar, table and image placeholder.
120
+ - `grid` — `true` (default): a dotted background that pans and zooms with
121
+ the drawing. `false`: plain.
122
+ - `empty` — what an empty, editable canvas shows in its middle. Omit for
123
+ the built-in hint ("Start sketching…"); `false` for nothing; or a node
124
+ (starter templates: give its buttons `pointer-events-auto`, the layer
125
+ lets clicks through to the canvas). Shown while nothing is drawn and the
126
+ select or pan tool is active.
127
+ - `actions` — nodes in the top-right corner, before the menu (a Share
128
+ button, a title chip).
129
+ - `canvasRef` — a ref (`useSketchCanvas()`) that receives the handle.
130
+ - `onReady(handle)` — once, when the canvas has mounted.
131
+ - `label` — the accessible name of the canvas region (default "Sketch").
132
+ - `className` — layout: width, margin, height. The default height is
133
+ `h-[32rem]`; a height class of yours (`h-dvh`, `h-full`, `min-h-…`,
134
+ `flex-1`) replaces it. Never colour.
135
+
136
+ ### The handle
137
+
138
+ `canvasRef.current` (and `onReady`'s argument):
139
+
140
+ - `getScene({ withBackground? })` — the sketch now (what `onChange`
141
+ sends), without waiting for the debounce.
142
+ - `setScene(sketch)` — replace the drawing (undoable).
143
+ - `insertElements(skeletons, opts?)` → the new element ids. Skeletons are
144
+ Excalidraw's `convertToExcalidrawElements` input:
145
+ `{ type: "rectangle" | "ellipse" | "diamond", x, y, width, height, label?: { text, fontSize?, textAlign? } }`,
146
+ `{ type: "text", x, y, text, fontSize? }`,
147
+ `{ type: "arrow" | "line", x, y, points: [[0, 0], [dx, dy]], start?: { id }, end?: { id } }`,
148
+ `{ type: "frame", children: [ids], name }`, `{ type: "image", fileId, x, y, width, height }`.
149
+ Colours may be token names (`strokeColor: "primary"`,
150
+ `backgroundColor: "warning:soft"`); a shape with no stroke gets
151
+ `foreground`; text is the system font. Options:
152
+ - `at` — `{ x, y }` in canvas coordinates; the skeletons' box is
153
+ centred there (or its top-left, with `anchor: "top-left"`). Default:
154
+ the middle of the view. `false`: keep the skeletons' own x/y.
155
+ - `group` — group them (move as one). `stamp: "<kind>"` groups too and
156
+ marks them for `sketchToText`.
157
+ - `customData` — merged into every new element's customData (annotate:
158
+ `{ note: 3 }`).
159
+ - `files` — `[{ id, dataURL, mimeType, created }]` to add first, for
160
+ image skeletons.
161
+ - `select` — `true` (default): select what was inserted.
162
+ - `exportImage(opts?)` → `Promise<Blob>`, a PNG made by Excalidraw's own
163
+ export, in the theme's colours now, on the theme's background. Options:
164
+ `scale` (default 2), `padding` (px, default 16), `transparent: true`
165
+ (no background), `withBackground: false` (leave the background image
166
+ out), `onlySelected: true`.
167
+ - `zoomToFit({ animate? })` — fit everything in view (Shift+1).
168
+ - `setTool(id)` — a built-in tool id or a stamp id.
169
+ - `undo()`, `redo()`, `clear()`, `focus()`.
170
+ - `save()` — send `onChange` / `onSave` now.
171
+ - `palette()` — token → the concrete colour it resolves to now.
172
+ - `repaint()` — re-read the theme and repaint (the canvas already does
173
+ this when `data-theme` changes or a theme stylesheet loads).
174
+ - `api` — Excalidraw's own imperative API, for anything else. Reaching for
175
+ it ties you to Excalidraw 0.18; prefer the methods above.
176
+
177
+ ### Helpers
178
+
179
+ Plain functions; they take a sketch (or an element array) and never throw
180
+ on a partial one:
181
+
182
+ - `emptySketch()` — `{ type: "sketch", version: 1, elements: [], files: {}, appState: {} }`.
183
+ - `isSketchEmpty(sketch)` — nothing drawn (deleted elements and the
184
+ background image do not count).
185
+ - `toSketch(value)` — any accepted input → a sketch.
186
+ - `sketchToText(sketch, { stamps = true })` — the words, for an agent or a
187
+ reader: one line per text or stamp in reading order (top to bottom,
188
+ then left to right), grouped under `# <frame name>` per frame (then
189
+ `# Outside frames`); a shape's label reads as its text; a stamp reads
190
+ `[button] Sign up`, an image `[image]`. `stamps: false` drops the
191
+ brackets. An empty sketch gives `""`.
192
+ - `sketchItems(sketch)` — the same, structured: `[{ kind: "frame" | "stamp" | "text" | "image", id, text?, name?, stamp?, container?, frame, x, y, width, height }]`.
193
+ - `STROKES`, `FILLS` — `[{ token, label }]`, the palette the toolbar offers.
194
+ - `SKETCH_TOOLS`, `WIREFRAME_STAMPS` — as above.
195
+
196
+ ## Theming, colours and fonts
197
+
198
+ - **Chrome.** Excalidraw's own CSS variables (its menus, dialogs, context
199
+ menu, hints) point at the workspace tokens (`theme.js`). Light or dark
200
+ follows the nearest `data-theme` (else `color-scheme`, else the OS).
201
+ - **Canvas colours.** Excalidraw needs concrete colours; they are read at
202
+ run time from the tokens' CSS variables and never written in source.
203
+ Excalidraw's dark mode (which inverts the whole canvas with a filter) is
204
+ switched off: the tokens are already the dark scheme's.
205
+ - **Fonts.** Every text is drawn in the device's own sans-serif
206
+ (Excalidraw's "Helvetica" family — Helvetica, Arial…), so no font is ever
207
+ fetched: Excalidraw's hand-drawn fonts would otherwise load from a
208
+ third-party CDN. Text pasted from another Excalidraw is moved into it.
209
+ The strokes keep their hand-drawn look (Sketchy / Clean in the toolbar).
210
+ - **Stylesheet.** The block imports `@excalidraw/excalidraw/index.css`
211
+ from the package; the app's bundler ships it like any CSS.
212
+
213
+ ## Example
214
+
215
+ A whiteboard that saves itself:
216
+
217
+ ```jsx
218
+ "use client";
219
+ import { SketchCanvas } from "./blocks/sketch-canvas";
220
+ import { updateRow } from "../lib/actions";
221
+
222
+ export default function Board({ board }) {
223
+ return (
224
+ <SketchCanvas
225
+ label={board.title}
226
+ defaultValue={board.sketch} // jsonb, may be null
227
+ onSave={(sketch) => updateRow({ source: "public.boards", id: board.id, patch: { sketch } })}
228
+ className="h-dvh rounded-none border-0"
229
+ />
230
+ );
231
+ }
232
+ ```
233
+
234
+ Marking up a screenshot, with numbered notes:
235
+
236
+ ```jsx
237
+ const canvas = useSketchCanvas();
238
+ const addNote = (n) =>
239
+ canvas.current?.insertElements(
240
+ [{ type: "ellipse", x: 0, y: 0, width: 32, height: 32, strokeColor: "destructive", backgroundColor: "destructive:soft", label: { text: String(n) } }],
241
+ { group: true, customData: { note: n } },
242
+ );
243
+
244
+ <SketchCanvas canvasRef={canvas} background={{ src: screenshotDataUrl }} tools={["select", "hand", "draw", "rectangle", "arrow", "text", "eraser"]} onChange={setSketch} />
245
+ const image = await canvas.current.exportImage(); // the screenshot with the marks, as a PNG
246
+ ```
247
+
248
+ A wireframe for an agent:
249
+
250
+ ```jsx
251
+ import { SketchCanvas, WIREFRAME_STAMPS, sketchToText, useSketchCanvas } from "./blocks/sketch-canvas";
252
+
253
+ const canvas = useSketchCanvas();
254
+ <SketchCanvas canvasRef={canvas} stamps={WIREFRAME_STAMPS} tools={["select", "hand", "draw", "rectangle", "arrow", "text", "eraser", "frame"]} onChange={setSketch} />
255
+
256
+ const build = async () => onBuild({ image: await canvas.current.exportImage(), sketch, text: sketchToText(sketch), prompt });
257
+ // sketchToText → "# Login\nWelcome back\n[input] Email\n[button] Sign in"
258
+ ```
259
+
260
+ ## What it will not do
261
+
262
+ - Collaborate live (several cursors): Excalidraw's collaboration is a
263
+ server of its own, not wired here. Saves are last-write-wins.
264
+ - Offer Excalidraw's library, share links, "text to diagram" / AI, or its
265
+ hand-drawn fonts. Its command palette (Cmd+/) and help dialog (?) still
266
+ open, themed; the palette may name actions that do nothing here.
267
+ - Show a minimap.
268
+ - Keep images out of the JSON: an image lives as a data URL in `files`.
269
+ - Render on the server: the server shows the frame and the sketch's
270
+ words; the drawing appears when the page runs.
271
+ - Pick an arbitrary colour: only the theme's tokens.
272
+
273
+ A canvas it cannot be is your own component in `components/` — not an edit
274
+ to this block. Its files are fixed: `npm run check` refuses a change, and
275
+ `makersclaw add sketch-canvas` restores them.
276
+
277
+ ## Credits
278
+
279
+ Excalidraw (https://github.com/excalidraw/excalidraw), MIT — installed from
280
+ npm as a dependency, not copied here. See THIRD-PARTY-NOTICES.md.
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "sketch-canvas",
3
+ "title": "SketchCanvas",
4
+ "description": "A freeform drawing canvas (Excalidraw) in the workspace theme: a Miro-style tool rail (select, pan, draw, shapes, arrows, text, image, eraser, frames), a floating toolbar over the selection with colours from the theme's tokens, zoom and undo controls, a friendly empty state, and stamp tools that place ready-made drawings (UI wireframe pieces built in). Optional locked background image for annotating a screenshot. The sketch is plain JSON; helpers read its words for an agent, and the handle exports a PNG.",
5
+ "useWhen": "A screen needs freehand drawing: a whiteboard, marking up a screenshot, sketching a UI wireframe, a diagram drawn by hand. The whiteboard, annotate and sketch-to-app blocks are built on it. Not for structured boards of cards and connectors (flow-canvas), charts (chart) or a kanban (board).",
6
+ "tags": ["sketch", "draw", "drawing", "whiteboard", "canvas", "excalidraw", "diagram", "annotate", "markup", "wireframe", "freehand", "shapes", "arrows", "miro", "png"],
7
+ "exports": ["SketchCanvas", "useSketchCanvas", "SKETCH_TOOLS", "WIREFRAME_STAMPS", "STROKES", "FILLS", "emptySketch", "isSketchEmpty", "sketchToText", "sketchItems", "toSketch"],
8
+ "files": ["index.js", "sketch-canvas.jsx", "excalidraw.js", "ssr-shim.js", "ssr-shim-end.js", "theme.js", "palette.js", "sketch.js", "stamps.js"],
9
+ "requires": [],
10
+ "dependencies": {
11
+ "@excalidraw/excalidraw": "0.18.1"
12
+ }
13
+ }
@@ -0,0 +1,159 @@
1
+ "use client";
2
+
3
+ // SketchCanvas three ways — the gallery's and the smoke test's surface. Not
4
+ // installed into apps.
5
+ // Drawing a small flow sketched by hand, saved through onSave (a
6
+ // switch makes the save fail), beside it what sketchToText
7
+ // reads and a PNG export through the handle.
8
+ // Wireframe the UI stamps (button, input, card, nav, table, image) and a
9
+ // trimmed tool set — what sketch-to-app builds on.
10
+ // Empty nothing drawn yet: the friendly first-run state; read-only
11
+ // behind a switch.
12
+ import { useState } from "react";
13
+ import { Button, Card, Switch, TabPanel, Tabs } from "../components/ui";
14
+ import { SketchCanvas, WIREFRAME_STAMPS, sketchToText, useSketchCanvas } from "../components/blocks/sketch-canvas";
15
+
16
+ // Written by hand: shapes, bound labels and arrows, colours as TOKENS only
17
+ // (customData.tokens). The canvas resolves them in the workspace theme.
18
+ const tok = (strokeColor, backgroundColor) => ({ tokens: { strokeColor, ...(backgroundColor ? { backgroundColor } : {}) } });
19
+ const box = (id, x, fill, text, arrows = []) => [
20
+ {
21
+ id,
22
+ type: "rectangle",
23
+ x,
24
+ y: 0,
25
+ width: 168,
26
+ height: 72,
27
+ fillStyle: "solid",
28
+ roundness: { type: 3 },
29
+ boundElements: [{ type: "text", id: `${id}-label` }, ...arrows.map((a) => ({ type: "arrow", id: a }))],
30
+ customData: tok("foreground", fill),
31
+ },
32
+ {
33
+ id: `${id}-label`,
34
+ type: "text",
35
+ x: x + 20,
36
+ y: 24,
37
+ width: 128,
38
+ height: 24,
39
+ text,
40
+ fontSize: 20,
41
+ containerId: id,
42
+ textAlign: "center",
43
+ verticalAlign: "middle",
44
+ customData: tok("foreground"),
45
+ },
46
+ ];
47
+ const arrow = (id, from, to, x) => ({
48
+ id,
49
+ type: "arrow",
50
+ x,
51
+ y: 36,
52
+ width: 64,
53
+ height: 0,
54
+ points: [
55
+ [0, 0],
56
+ [64, 0],
57
+ ],
58
+ startBinding: { elementId: from, focus: 0, gap: 6 },
59
+ endBinding: { elementId: to, focus: 0, gap: 6 },
60
+ endArrowhead: "arrow",
61
+ customData: tok("muted-foreground"),
62
+ });
63
+
64
+ const ONBOARDING_SKETCH = {
65
+ elements: [
66
+ { id: "title", type: "text", x: 0, y: -72, width: 300, height: 32, text: "Onboarding, first pass", fontSize: 28, customData: tok("foreground") },
67
+ ...box("signup", 0, "chart-2:soft", "Sign up", ["a1"]),
68
+ arrow("a1", "signup", "plan", 174),
69
+ ...box("plan", 244, "chart-3:soft", "Pick a plan", ["a1", "a2"]),
70
+ arrow("a2", "plan", "invite", 418),
71
+ ...box("invite", 488, "chart-4:soft", "Invite team", ["a2"]),
72
+ { id: "note", type: "text", x: 488, y: 104, width: 190, height: 24, text: "Skip this for solo founders?", fontSize: 16, customData: tok("destructive") },
73
+ ],
74
+ };
75
+
76
+ function DrawingDemo() {
77
+ const canvas = useSketchCanvas();
78
+ const [text, setText] = useState(() => sketchToText(ONBOARDING_SKETCH));
79
+ const [failSaves, setFailSaves] = useState(false);
80
+ const [png, setPng] = useState(null);
81
+ const save = async () => {
82
+ await new Promise((r) => setTimeout(r, 500));
83
+ return failSaves ? { ok: false, error: "The network dropped" } : { ok: true };
84
+ };
85
+ const exportPng = async () => {
86
+ const blob = await canvas.current?.exportImage();
87
+ setPng(blob ? `PNG, ${Math.max(1, Math.round(blob.size / 1024))} KB` : "Not ready yet");
88
+ };
89
+ return (
90
+ <div className="grid gap-4 lg:grid-cols-[minmax(0,1fr)_18rem]">
91
+ <SketchCanvas
92
+ label="Onboarding flow sketch"
93
+ defaultValue={ONBOARDING_SKETCH}
94
+ onChange={(v) => setText(sketchToText(v))}
95
+ onSave={save}
96
+ canvasRef={canvas}
97
+ className="h-[34rem]"
98
+ />
99
+ <div className="grid content-start gap-4">
100
+ <Card title="Saving">
101
+ <Switch id="sketch-fail" label="Make saves fail" checked={failSaves} onChange={(e) => setFailSaves(e.target.checked)} />
102
+ </Card>
103
+ <Card title="What an agent reads" actions={<Button size="sm" icon="download" onClick={exportPng}>PNG</Button>}>
104
+ <pre className="whitespace-pre-wrap break-words font-mono text-xs">{text || "Nothing yet."}</pre>
105
+ {png ? <p className="mt-2 text-xs text-muted-foreground">{png}</p> : null}
106
+ </Card>
107
+ </div>
108
+ </div>
109
+ );
110
+ }
111
+
112
+ function WireframeDemo() {
113
+ const [text, setText] = useState("");
114
+ return (
115
+ <div className="grid gap-4 lg:grid-cols-[minmax(0,1fr)_18rem]">
116
+ <SketchCanvas
117
+ label="Screen wireframe"
118
+ stamps={WIREFRAME_STAMPS}
119
+ tools={["select", "hand", "draw", "rectangle", "arrow", "text", "eraser", "frame"]}
120
+ onChange={(v) => setText(sketchToText(v))}
121
+ className="h-[34rem]"
122
+ />
123
+ <Card title="What an agent reads">
124
+ <pre className="whitespace-pre-wrap break-words font-mono text-xs">{text || "Place a stamp from the rail: a button, an input, a card…"}</pre>
125
+ </Card>
126
+ </div>
127
+ );
128
+ }
129
+
130
+ function EmptyDemo() {
131
+ const [readOnly, setReadOnly] = useState(false);
132
+ return (
133
+ <div className="grid gap-3">
134
+ <Switch id="sketch-ro" label="Read-only" checked={readOnly} onChange={(e) => setReadOnly(e.target.checked)} />
135
+ <SketchCanvas label="Blank sketch" readOnly={readOnly} className="h-[28rem]" />
136
+ </div>
137
+ );
138
+ }
139
+
140
+ export default function SketchCanvasDemo() {
141
+ const [tab, setTab] = useState("drawing");
142
+ return (
143
+ <div className="grid gap-4">
144
+ <Tabs
145
+ aria-label="SketchCanvas variants"
146
+ value={tab}
147
+ onChange={setTab}
148
+ tabs={[
149
+ { key: "drawing", label: "Drawing" },
150
+ { key: "wireframe", label: "Wireframe stamps" },
151
+ { key: "empty", label: "Empty" },
152
+ ]}
153
+ />
154
+ <TabPanel tab={tab} value={tab}>
155
+ {tab === "drawing" ? <DrawingDemo /> : tab === "wireframe" ? <WireframeDemo /> : <EmptyDemo />}
156
+ </TabPanel>
157
+ </div>
158
+ );
159
+ }
@@ -0,0 +1,40 @@
1
+ // The one door to Excalidraw (@excalidraw/excalidraw, MIT). Every file in
2
+ // this block reaches it through here, and the blocks built on this one
3
+ // reach it through SketchCanvas — never the package directly.
4
+ //
5
+ // The order of the imports below is the point: ssr-shim.js lays stand-ins
6
+ // for the browser globals Excalidraw reads while its modules load (only
7
+ // on the server, where they are missing), the package loads, and
8
+ // ssr-shim-end.js takes them away again. Keep the three together and in
9
+ // this order. Its stylesheet ships the same way doc-editor's does: an
10
+ // import of the package's CSS, which the app's bundler picks up.
11
+ import "@excalidraw/excalidraw/index.css";
12
+ import "./ssr-shim";
13
+ import {
14
+ CaptureUpdateAction,
15
+ Excalidraw,
16
+ FONT_FAMILY,
17
+ convertToExcalidrawElements,
18
+ exportToBlob,
19
+ getCommonBounds,
20
+ getSceneVersion,
21
+ newElementWith,
22
+ restoreElements,
23
+ sceneCoordsToViewportCoords,
24
+ viewportCoordsToSceneCoords,
25
+ } from "@excalidraw/excalidraw";
26
+ import "./ssr-shim-end";
27
+
28
+ export {
29
+ CaptureUpdateAction,
30
+ Excalidraw,
31
+ FONT_FAMILY,
32
+ convertToExcalidrawElements,
33
+ exportToBlob,
34
+ getCommonBounds,
35
+ getSceneVersion,
36
+ newElementWith,
37
+ restoreElements,
38
+ sceneCoordsToViewportCoords,
39
+ viewportCoordsToSceneCoords,
40
+ };
@@ -0,0 +1,9 @@
1
+ // The SketchCanvas block — `makersclaw add sketch-canvas`. Fixed: compose
2
+ // it through its props (README.md beside this file). The helpers read a
3
+ // sketch anywhere, the server included; the blocks built on this one
4
+ // (whiteboard, annotate, sketch-to-app…) import it, never
5
+ // @excalidraw/excalidraw directly.
6
+ export { SketchCanvas, useSketchCanvas, SKETCH_TOOLS } from "./sketch-canvas";
7
+ export { WIREFRAME_STAMPS } from "./stamps";
8
+ export { STROKES, FILLS } from "./palette";
9
+ export { emptySketch, isSketchEmpty, sketchToText, sketchItems, toSketch } from "./sketch";