makersclaw 0.2.0 → 0.3.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 (473) 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/install.mjs +18 -0
  430. package/src/shadcn.mjs +8 -0
  431. package/templates/next/files/README.md +145 -11
  432. package/templates/next/files/app/globals.css +55 -4
  433. package/templates/next/files/check/run.mjs +3 -3
  434. package/templates/next/files/components/ui/avatar.jsx +141 -0
  435. package/templates/next/files/components/ui/breadcrumb.jsx +149 -0
  436. package/templates/next/files/components/ui/button-group.jsx +70 -0
  437. package/templates/next/files/components/ui/button.jsx +132 -12
  438. package/templates/next/files/components/ui/calendar.jsx +609 -0
  439. package/templates/next/files/components/ui/carousel.jsx +281 -0
  440. package/templates/next/files/components/ui/collapsible.jsx +208 -0
  441. package/templates/next/files/components/ui/combobox.jsx +608 -0
  442. package/templates/next/files/components/ui/command.jsx +577 -0
  443. package/templates/next/files/components/ui/context-menu.jsx +191 -0
  444. package/templates/next/files/components/ui/date-picker.jsx +360 -0
  445. package/templates/next/files/components/ui/distribution.jsx +117 -0
  446. package/templates/next/files/components/ui/feedback.jsx +143 -0
  447. package/templates/next/files/components/ui/field.jsx +115 -3
  448. package/templates/next/files/components/ui/file-input.jsx +234 -0
  449. package/templates/next/files/components/ui/icon.jsx +130 -8
  450. package/templates/next/files/components/ui/image.jsx +143 -0
  451. package/templates/next/files/components/ui/index.js +47 -2
  452. package/templates/next/files/components/ui/input-group.jsx +213 -0
  453. package/templates/next/files/components/ui/input-otp.jsx +170 -0
  454. package/templates/next/files/components/ui/item.jsx +206 -0
  455. package/templates/next/files/components/ui/menu.jsx +454 -82
  456. package/templates/next/files/components/ui/notice.jsx +126 -14
  457. package/templates/next/files/components/ui/pagination.jsx +156 -0
  458. package/templates/next/files/components/ui/popover.jsx +284 -0
  459. package/templates/next/files/components/ui/radio.jsx +193 -0
  460. package/templates/next/files/components/ui/rating.jsx +131 -0
  461. package/templates/next/files/components/ui/resizable.jsx +338 -0
  462. package/templates/next/files/components/ui/scroll-area.jsx +123 -0
  463. package/templates/next/files/components/ui/separator.jsx +119 -0
  464. package/templates/next/files/components/ui/sheet.jsx +96 -11
  465. package/templates/next/files/components/ui/slider.jsx +174 -0
  466. package/templates/next/files/components/ui/stat.jsx +574 -0
  467. package/templates/next/files/components/ui/steps.jsx +338 -0
  468. package/templates/next/files/components/ui/swatch.jsx +33 -0
  469. package/templates/next/files/components/ui/table.jsx +130 -0
  470. package/templates/next/files/components/ui/toast.jsx +440 -0
  471. package/templates/next/files/components/ui/toggle.jsx +195 -0
  472. package/templates/next/files/components/ui/tooltip.jsx +270 -0
  473. package/templates/next/template.json +264 -8
@@ -0,0 +1,420 @@
1
+ # FlowCanvas
2
+
3
+ A Miro-like board in the workspace theme. Sticky notes, shapes, text,
4
+ frames, cards and images on an infinite dotted canvas. A tool rail on the
5
+ left (a bar along the bottom on a narrow canvas), double-click anywhere
6
+ for a sticky, drag from a card's dot to another card to connect them —
7
+ or drop on empty canvas to pick what to add there. A floating toolbar
8
+ over the selection, a right-click menu, undo/redo, copy/paste, snap to
9
+ grid, a minimap, a list view for keyboards and screen readers, and a
10
+ presentation mode that steps through the frames.
11
+
12
+ It is [React Flow](https://reactflow.dev) (`@xyflow/react`, MIT)
13
+ underneath, with its colours mapped onto the workspace's tokens. The
14
+ canvas blocks — `account-map`, `process-map`, `journey-map`, `idea-board`
15
+ — are built on this one: they import it, never `@xyflow/react`.
16
+
17
+ ```jsx
18
+ import { FlowCanvas, boardToText } from "../components/blocks/flow-canvas"; // a Makersclaw app ("./blocks/flow-canvas" from components/)
19
+ import { FlowCanvas, boardToText } from "@/components/makersclaw/blocks/flow-canvas"; // a shadcn project
20
+ ```
21
+
22
+ `FlowCanvas` is a client component: render it from a `"use client"`
23
+ component. The helpers (`boardToText`, `autoLayout`, `createNode`…) are
24
+ plain functions and work on the server too.
25
+
26
+ `makersclaw add flow-canvas` adds `@xyflow/react` (pinned, exact) to
27
+ package.json: run `npm install` after. It loads with the page (no
28
+ `import()`): the board mounts after the first render; until then — on the
29
+ server — the box holds the board as text for a screen reader.
30
+
31
+ ## The data
32
+
33
+ A board is plain JSON. Store it as it comes out of `onChange` (one `jsonb`
34
+ column).
35
+
36
+ ```js
37
+ {
38
+ nodes: [
39
+ { id: "s1", type: "sticky", position: { x: 40, y: 80 }, width: 200, height: 200,
40
+ data: { text: "Interview churned customers", color: "warning", badge: 3, meta: "Priya" } },
41
+ { id: "f1", type: "frame", position: { x: 0, y: 0 }, width: 720, height: 420, zIndex: -1,
42
+ data: { title: "Discover", color: "chart-2" } },
43
+ ],
44
+ edges: [
45
+ { id: "e1", source: "s1", target: "s2", label: "feeds",
46
+ data: { line: "curved", arrow: "end", dashed: false } },
47
+ ],
48
+ viewport: { x: 0, y: 0, zoom: 1 }, // where the person last looked; optional
49
+ }
50
+ ```
51
+
52
+ - **Positions are absolute**, top-left corner, in board pixels. A card in a
53
+ frame is not stored relative to it: a frame holds whatever lies inside
54
+ its rectangle (`frameContents`, `frameOf`). Dragging a frame moves what
55
+ is inside it.
56
+ - **Colours are token names**, never colour values, so a board repaints
57
+ with the theme: `"warning"` (the yellow sticky), `"chart-1"` … `"chart-5"`,
58
+ `"success"`, `"info"`, `"destructive"`, `"muted"`. `COLORS` lists them;
59
+ `STICKY_COLORS` is the sticky palette.
60
+ - **Paint order is list order** (later is on top); frames always sit
61
+ under everything (`zIndex: -1`).
62
+ - `width`/`height` are set by resizing; `text` and `card` nodes leave
63
+ `height` out and grow with their content.
64
+ - A node may carry React Flow's own flags: `draggable: false`,
65
+ `deletable: false`, `selectable: false`, `connectable: false`. Locking
66
+ (the toolbar's lock) sets `data.locked: true` with `draggable` and
67
+ `deletable` false.
68
+
69
+ The built-in node types and their `data`:
70
+
71
+ | type | data |
72
+ | --- | --- |
73
+ | `sticky` | `text`, `color` (default `"warning"`), `badge?` (a count in the corner: votes), `meta?` (a small line at the foot: an author) |
74
+ | `shape` | `text`, `shape`: `rect` · `ellipse` · `diamond` · `pill`, `color` (default `"muted"`), `textSize`: `sm` · `md` · `lg` · `xl` |
75
+ | `text` | `text`, `textSize`, `align?`: `left` · `center` · `right` |
76
+ | `frame` | `title`, `color?` (a faint wash and edge; none = the card surface) |
77
+ | `card` | `title`, `body?`, `icon?` (a kit icon name), `badge?`, `color?` (a strip on top), `kind?`, anything else your `renderCard` reads |
78
+ | `image` | `src`, `alt` |
79
+
80
+ Connectors: `data.line` `curved` (default) · `straight` · `elbow`;
81
+ `data.arrow` `end` (default) · `both` · `none`; `data.dashed`. They leave
82
+ and enter by the sides of the two cards that face each other, so they
83
+ re-route as cards move; handle ids are not stored.
84
+
85
+ ## Props
86
+
87
+ - `value` — the board, controlled. A new `value` that differs from what
88
+ the canvas last sent through `onChange` replaces it (loading another
89
+ board, or a change made elsewhere — a vote count); that replacement can
90
+ be undone. Pass back exactly what `onChange` gave you and nothing resets.
91
+ - `defaultValue` — the starting board, uncontrolled. With neither, it
92
+ starts empty (and shows the empty state).
93
+ - `onChange(board)` — after each committed change (a drag ends, a card is
94
+ placed, words stop being edited, a colour is picked), debounced by
95
+ `changeDelay` (default 400 ms). The board is clean JSON (see above).
96
+ Selection, typing in progress and panning never call it.
97
+ - `onSave(board)` — `async`, return `{ ok: true }` or `{ ok: false, error }`
98
+ (a throw counts as failed). Called after `onChange`, and on ⌘S. The
99
+ canvas shows "Saving…", "Saved", or the error with a Retry beside
100
+ undo/redo. Leave it out when `onChange` already saves.
101
+ - `changeDelay` — ms, default 400.
102
+ - `readOnly` — `false` (default). `true`: no rail, no editing, no
103
+ connecting; pan, zoom, fit, the list view and `onOpenNode` still work.
104
+ - `presentation` — `false` (default). `true`: read-only, and a bar steps
105
+ through the frames in reading order (← → or the buttons; each fills the
106
+ screen). `onExitPresentation()` — Esc and the bar's Exit call it; turn
107
+ `presentation` off there.
108
+ - `height` — the canvas's height, default `560` (px; any CSS length works:
109
+ `"70vh"`, `"100%"` inside a sized box).
110
+ - `bare` — `false` (default: rounded, bordered). `true`: no border or
111
+ radius, for a full-page board.
112
+ - `label` — the board's accessible name, default `"Board"`; also the list
113
+ view's heading.
114
+ - `className` — layout around it (margin, width). Never colour.
115
+ - `palette` — the sticky colours offered, token names, default
116
+ `STICKY_COLORS` (six). The toolbar adds a few more for shapes and frames.
117
+ - `snap` — `true` (default): positions and sizes snap to `grid` (default
118
+ `20` px — the dot spacing). The person can turn it off from the view menu.
119
+ - `minimap` — `false` (default): whether the minimap starts open (a toggle
120
+ in the zoom bar either way; hidden on a narrow canvas).
121
+ - `hideAttribution` — `false` (default). React Flow asks that its small
122
+ credit stays; its MIT licence allows hiding it.
123
+ - `canvasRef` — a ref (`useFlowCanvas()`) that receives the handle (below).
124
+ - `onSelectionChange(nodes, edges)` — the selection changed (a side panel
125
+ for the selected person).
126
+ - `onOpenNode(node)` — double-click or Enter on a node that has no words of
127
+ its own to edit: your own node types, cards drawn by `renderCard`, and
128
+ every node in read-only mode. Open your `Sheet` there. Without it,
129
+ double-click edits the words.
130
+ - `describeNode(node)` — a one-line description of one of YOUR node types,
131
+ for the list view, `boardToText` and the server placeholder; return
132
+ nothing for the default (`Sticky: "…"`).
133
+
134
+ Extending it — how a block makes the canvas its own:
135
+
136
+ - `nodeTypes` — `{ person: PersonNode, … }`: your own node components,
137
+ added to the built-in ones (a key that matches a built-in replaces it).
138
+ See "Your own node types".
139
+ - `renderCard(node, ctx)` — draws the inside of every `card` node; return
140
+ `undefined` for the default (title + body). `ctx`: `{ selected, editing,
141
+ update(patch), api }`. Kit parts only (Avatar, Badge, Stat…); give an
142
+ interactive part inside `className="nodrag"` so pressing it does not drag
143
+ the card. The simplest way to put your own card on the board.
144
+ - `tools` — more rail tools: `[{ id, label, icon, shortcut?, create?,
145
+ onSelect?, sizable?, connectable? }]`. See "Rail tools".
146
+ - `rail` — the rail's contents, in order: built-in ids (`"select"`,
147
+ `"hand"`, `"sticky"`, `"shape"`, `"text"`, `"connector"`, `"frame"`,
148
+ `"image"`), your tools' ids, and `"|"` for a divider. Default: all the
149
+ built-ins, then your tools (and `"image"` when `pickImage` is set). A
150
+ process map drops the sticky: `rail={["select", "hand", "|", "shape", "connector", "step"]}`.
151
+ - `pickImage()` — `async () => ({ src, alt, width?, height? }) | null`: turns
152
+ on the image tool (your upload, your picker). Without it there is no
153
+ image tool; image nodes in the data still show.
154
+ - `topBar` — a node shown floating at the top centre: a title, a save
155
+ button, a share menu, a timer.
156
+ - `toolbarExtra(selection, api)` — more controls at the end of the
157
+ floating toolbar over a selection (`selection.nodes`): kit
158
+ `IconButton size="sm"` / `Menu` parts. "Vote", "Assign owner".
159
+ - `contextMenuItems(selection, api)` — more right-click items, kit `Menu`
160
+ shape (`[{ label, onSelect, icon?, shortcut?, tone? }]`); `selection.nodes`
161
+ is empty for a right-click on the empty canvas.
162
+ - `emptyState` — a node in place of the first-run hint; `false` for none.
163
+ - `templates` — the starters on the empty state: `[{ id, label, icon?,
164
+ description?, board }]` (`board` a board or a function returning one).
165
+ Default `starterTemplates()` (Brainstorm, Flowchart, Retro); `[]` for none.
166
+ - `constrain(node, { reason, board })` — runs on every node a change
167
+ touched before it is committed (`reason`: `"move"` after a drag or a
168
+ nudge, `"create"`, `"paste"`, `"resize"`, `"align"`, `"layout"`). Return
169
+ the node adjusted (a new position, size or data), or nothing to keep it.
170
+ This is how a journey map snaps a sticky into its cell and records it.
171
+ - `beforeChange(next, prev, reason)` — runs on the whole board at every
172
+ commit (`next` and `prev` are clean boards). Return `false` to refuse the
173
+ change (the board goes back), a board to commit instead, or nothing to
174
+ accept it.
175
+ - `canConnect(connection, board)` — `false` refuses a connector
176
+ (`connection`: `{ source, target }`). A card never connects to itself.
177
+
178
+ ## The handle
179
+
180
+ `const board = useFlowCanvas()`, `<FlowCanvas canvasRef={board} />`, then
181
+ `board.current?.…`. Tools' `create`/`onSelect`, `renderCard`,
182
+ `toolbarExtra` and `contextMenuItems` get the same object as `api`, and a
183
+ node component reaches it with `useCanvas().api`. Every change made through
184
+ it commits (undoable, then `onChange`) unless `{ commit: false }` says not.
185
+
186
+ - Read: `getBoard()` (clean JSON, with the viewport) · `getSelection()` →
187
+ `{ nodes, edges }` · `toText()` · `toMarkdown({ title })` · `canUndo()` ·
188
+ `canRedo()` · `getTool()` · `readOnly`
189
+ - Nodes: `addNodes(node | nodes, { select = true, edit = false, edges })` →
190
+ ids · `updateNode(id, patch | (node) => patch, { commit })` ·
191
+ `updateNodeData(id, patch | (data) => patch, { commit })` ·
192
+ `updateNodesData(ids, patch)` · `removeNodes(ids)` · `duplicate(ids)` ·
193
+ `lock(ids, on)` · `arrange(ids, "front" | "back")` · `align(ids, "left" |
194
+ "center" | "right" | "top" | "middle" | "bottom")` · `distribute(ids,
195
+ "horizontal" | "vertical")` · `frameSelection(ids)`
196
+ - Connectors: `addEdge({ source, target, label?, data? })` → id ·
197
+ `updateEdge(id, patch, { commit })` · `removeEdges(ids)`
198
+ - The whole board: `setBoard(board, { fit = true })` (undoable) ·
199
+ `autoLayout({ direction: "LR" | "TB", ids?, rankGap?, nodeGap? })` ·
200
+ `undo()` · `redo()` · `save()` (send now, skipping the debounce)
201
+ - Editing: `edit(id)` (start editing a node's words) · `editEdge(id)` ·
202
+ `stopEditing()` · `commit(reason, ids?)` (after `{ commit: false }` changes)
203
+ - View: `select(ids, edgeIds?)` · `focusNode(id)` (select, centre, focus) ·
204
+ `fitView({ nodes?: [{ id }] })` · `zoomIn()` · `zoomOut()` · `zoomTo(z)` ·
205
+ `centerPoint()` (the board point at the middle of the screen — where a
206
+ picker's choice lands) · `screenToFlow({ x, y })` · `setTool(id)`
207
+
208
+ ## Your own node types
209
+
210
+ A node component gets React Flow's props: `{ id, type, data, selected,
211
+ width, height, dragging }`. Wrap its body in `NodeShell` — it draws the
212
+ selection box, the four connection dots (shown on hover), the resize
213
+ handles, the lock mark and the whole-card drop target while a connector is
214
+ dragged. Without it (or `NodeHandles`), connectors cannot reach the node.
215
+ Read the canvas with `useCanvas()`; change the node through `api`.
216
+
217
+ ```jsx
218
+ import { FlowCanvas, NodeShell, EditableText, useCanvas, createNode } from "./blocks/flow-canvas";
219
+ import { Avatar, Badge } from "./ui";
220
+
221
+ function PersonNode({ id, data, selected }) {
222
+ const { api, editingNode, readOnly } = useCanvas();
223
+ return (
224
+ <NodeShell id={id} selected={selected} locked={data.locked} resizable={false}>
225
+ <div className="flex w-64 items-center gap-3 rounded-lg border border-border bg-card p-3 shadow-sm">
226
+ <Avatar name={data.name} src={data.avatar} />
227
+ <div className="min-w-0 flex-1">
228
+ <EditableText
229
+ singleLine
230
+ editing={!readOnly && editingNode === id}
231
+ value={data.name}
232
+ onChange={(v) => api.updateNodeData(id, { name: v }, { commit: false })}
233
+ onDone={() => api.stopEditing()}
234
+ label="Name"
235
+ className="truncate text-sm font-medium"
236
+ />
237
+ <p className="truncate text-xs text-muted-foreground">{data.title}</p>
238
+ </div>
239
+ <Badge tone={data.role === "blocker" ? "danger" : "neutral"}>{data.role}</Badge>
240
+ </div>
241
+ </NodeShell>
242
+ );
243
+ }
244
+ const NODE_TYPES = { person: PersonNode }; // module level: a new object each render remounts every node
245
+
246
+ <FlowCanvas nodeTypes={NODE_TYPES} describeNode={(n) => n.type === "person" ? `Person: ${n.data.name} (${n.data.role})` : undefined} … />
247
+ ```
248
+
249
+ - `NodeShell` props: `id`, `selected`, `locked`, `resizable` (default
250
+ true), `minWidth`/`minHeight` (40/30), `keepAspectRatio`, `autoHeight`
251
+ (height follows content), `handles` (false: nothing connects), `ring`
252
+ (false: draw your own selection), `className` (layout only).
253
+ - `EditableText` props: `value`, `editing`, `onChange(text)`, `onDone()`,
254
+ `placeholder`, `singleLine` (Enter finishes), `label`, `className`,
255
+ `style`. Shown and edited in the same box, so nothing jumps.
256
+ - Double-click and Enter call `onOpenNode(node)` for your types when you
257
+ pass it, else they set `editingNode` to the node's id (use it as above).
258
+ - Colour your node from a token in its data with `colorClasses(token)` →
259
+ `{ tint, solid, fill, stroke, wash, edge }` class strings
260
+ (`colorClasses("chart-3").tint` is `bg-chart-3/30`). `Palette`,
261
+ `StickySwatch`, `ColorDot` and `ShapeGlyph` are the canvas's own pickers
262
+ and swatches, for a legend or a side panel.
263
+ - An interactive kit part inside a node takes `className="nodrag"`.
264
+ - Put a node's actions in `toolbarExtra` or `contextMenuItems`, not in a
265
+ kit `Menu`/`Popover` inside the node: the node lives in the zoomed and
266
+ panned viewport (a CSS transform), and the kit's floating panels anchor
267
+ to their button without knowing about it. The canvas's own toolbars sit
268
+ outside the viewport for this reason.
269
+
270
+ ## Rail tools
271
+
272
+ ```js
273
+ const TOOLS = [
274
+ // A placing tool: pick it (or press P), click the canvas, a node appears there.
275
+ { id: "person", label: "Person", icon: "user", shortcut: "P",
276
+ create: (point, { rect, api }) => createNode("person", point, { width: 256, data: { name: "", role: "user" } }) },
277
+ // An action: pressing it runs onSelect — open your picker, then add.
278
+ { id: "pick", label: "Add from CRM", icon: "search",
279
+ onSelect: (api) => openPicker((p) => api.addNodes(createNode("person", api.centerPoint(), { data: p }))) },
280
+ ];
281
+ ```
282
+
283
+ - `create(point, { rect, api, grid })` returns a node or several (use
284
+ `createNode`: it centres on `point` and snaps). With `sizable: true` the
285
+ person can drag out a rectangle and you get it as `rect`.
286
+ - A tool with `create` is also offered in the menu that opens when a
287
+ connector is dropped on empty canvas (the new node arrives connected);
288
+ `connectable: false` leaves it out.
289
+ - The tool returns to Select after one placement. `shortcut` is one key.
290
+
291
+ ## Constraining behaviour — recipes
292
+
293
+ - **Snap stickies into cells** (journey map): compute the cells from your
294
+ lanes, then
295
+ `constrain={(n) => { if (n.type !== "sticky") return; const r = nodeRect(n); const c = snapToCell(r, cells); return c && { position: { x: c.x, y: c.y }, data: { ...n.data, cell: c.cellId } }; }}`.
296
+ - **Lock the lanes**: lanes are `frame` nodes with `draggable: false,
297
+ deletable: false, selectable: false` (and `data.locked: true` to hide the
298
+ resize handles). They still hold what is dropped inside them.
299
+ - **Only steps connect** (process map): `canConnect={(c, b) => isStep(c.source) && isStep(c.target)}`.
300
+ - **At most N votes** (idea board): keep votes in `data.badge` (the sticky
301
+ shows it) and refuse extra ones in your own handler; or
302
+ `beforeChange={(next) => votesOk(next) || false}`.
303
+ - **Tidy a flow**: `api.autoLayout({ direction: "LR" })`, or in data
304
+ `autoLayout(nodes, edges, { direction: "TB" })` before passing `value`.
305
+
306
+ ## The helpers
307
+
308
+ Import them from the block; they take a board and never throw on a partial
309
+ one.
310
+
311
+ - `emptyBoard()` — `{ nodes: [], edges: [] }`.
312
+ - `createNode(type, point, { id?, data?, width?, height?, rect?, grid = 20, … })`
313
+ — a node centred on `point` with its type's defaults, snapped. Extra keys
314
+ (`draggable`, `zIndex`…) go on the node.
315
+ - `createEdge(source, target, { id?, label?, data? })`.
316
+ - `cleanBoard(board)` — what is stored (React Flow's working fields gone).
317
+ - `boardToText(board, { describe? })` — plain text for an agent or a screen
318
+ reader: `Board: 12 items, 5 connectors.`, then each frame with what it
319
+ holds (reading order, nested), loose items, and `Connectors:` as
320
+ `"A" → "B" (label)`.
321
+ - `boardToMarkdown(board, { title?, describe? })` — a heading per frame, a
322
+ bullet per item, a Connections list.
323
+ - `autoLayout(nodes, edges, { direction = "LR", rankGap = 80, nodeGap = 40, ids?, grid = 20 })`
324
+ — a layered layout written here (no dagre/elk): cycles broken, ranks by
325
+ longest path, barycentre sweeps against crossings; unconnected nodes in
326
+ a row after; the top-left corner kept. Returns every node, the laid-out
327
+ ones moved. Frames are left alone unless named in `ids`.
328
+ - `alignNodes(nodes, ids, how)`, `distributeNodes(nodes, ids, axis)`,
329
+ `duplicateNodes(board, ids, { offset })` → `{ nodes, edges }`,
330
+ `removeNodes(board, ids)`.
331
+ - `frameContents(board, frameId)` → ids inside it; `frameOf(board)` →
332
+ Map(nodeId → the smallest frame holding it).
333
+ - `nodeRect(node)`, `boardBounds(nodes)`, `snapPoint(p, grid)`,
334
+ `snapToCell(rect, cells, { pad })` → `{ x, y, cellId }`,
335
+ `fitFontSize(text, width, height)` (the sticky's shrinking words).
336
+ - `historyInit(board)`, `historyReducer(state, { type: "push" | "undo" |
337
+ "redo" | "reset", present? })` — the undo stack the canvas uses, for a
338
+ block that keeps its own.
339
+ - `starterTemplates()`, `describeNode(node, describe?)`, `nodeText(node)`,
340
+ `COLORS`, `STICKY_COLORS`, `COLOR_NAMES`, `SHAPES`, `GRID`.
341
+
342
+ ## Mouse and keyboard
343
+
344
+ - Scroll or Space + drag pans; pinch or Ctrl/⌘ + scroll zooms; the middle
345
+ button drags the canvas in any tool.
346
+ - Drag on empty canvas draws a selection box (what it fully encloses);
347
+ Shift-click adds to the selection; drag a frame by its title.
348
+ - Tools: V select, H hand, N sticky, S shape, T text, L connector, F frame,
349
+ and your tools' keys. Shapes, text and frames can be dragged out to a size.
350
+ - Enter edits the selected card's words, Esc stops; Delete/Backspace
351
+ deletes; ⌘D duplicates; ⌘C/⌘X/⌘V copy, cut, paste (paste lines of text
352
+ from elsewhere: a sticky each); ⌘A selects all; ⌘Z / ⇧⌘Z undo, redo;
353
+ arrows nudge 1 px (⇧ 10); ⌘] / ⌘[ front, back; ⇧⌘L lock; ⇧1 fit;
354
+ ⇧2 zoom to selection; ⌘+ / ⌘− / ⌘0 zoom; ? the shortcuts sheet.
355
+ - Tab walks the cards (each selected as it gets focus); Shift+F10 or the
356
+ Menu key opens the actions menu; the List view (zoom bar) shows the board
357
+ as a list, and choosing a row goes back to that card.
358
+
359
+ ## Example
360
+
361
+ ```jsx
362
+ // components/LaunchBoard.jsx — client
363
+ "use client";
364
+ import { useState } from "react";
365
+ import { updateRow } from "../lib/actions";
366
+ import { FlowCanvas } from "./blocks/flow-canvas";
367
+
368
+ export default function LaunchBoard({ project }) {
369
+ const [board, setBoard] = useState(project.board); // jsonb, may be null
370
+ return (
371
+ <FlowCanvas
372
+ value={board ?? undefined}
373
+ onChange={setBoard}
374
+ onSave={(b) => updateRow({ source: "public.projects", id: project.id, patch: { board: b } })}
375
+ label={`${project.name} board`}
376
+ height="calc(100dvh - 8rem)"
377
+ />
378
+ );
379
+ }
380
+ ```
381
+
382
+ A card drawn with kit parts, and an agent reading the board:
383
+
384
+ ```jsx
385
+ <FlowCanvas
386
+ value={board}
387
+ onChange={setBoard}
388
+ renderCard={(n) => n.data.kind === "deal" ? (
389
+ <div className="grid gap-1 p-3">
390
+ <p className="text-sm font-medium">{n.data.title}</p>
391
+ <Stat size="sm" label="Value" value={n.data.amount} />
392
+ </div>
393
+ ) : undefined}
394
+ />
395
+
396
+ const context = boardToText(board); // hand this to the agent
397
+ ```
398
+
399
+ ## What it will not do
400
+
401
+ - Collaborate live (several cursors at once). Saves are last-write-wins.
402
+ - Draw freehand (that is `sketch-canvas`), or export an image.
403
+ - Nest data under frames: membership is geometric, so a card dragged out
404
+ of a frame simply leaves it.
405
+ - Route connectors around cards; they take the shortest curve between the
406
+ facing sides.
407
+ - Upload images itself: pass `pickImage`.
408
+ - Render on the server: the server shows the board as text until the
409
+ canvas mounts. For a read-only page that must be rich in the HTML, render
410
+ `boardToMarkdown` yourself.
411
+
412
+ A board it cannot be is your own component in `components/` — not an edit
413
+ to this block. Its files are fixed: `npm run check` refuses a change, and
414
+ `makersclaw add flow-canvas` restores them.
415
+
416
+ ## Credits
417
+
418
+ React Flow (https://github.com/xyflow/xyflow), MIT, by webkid GmbH —
419
+ installed from npm as a dependency, not copied here. Its attribution link
420
+ stays in the corner unless `hideAttribution`. See THIRD-PARTY-NOTICES.md.
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "flow-canvas",
3
+ "title": "FlowCanvas",
4
+ "description": "A Miro-like board (React Flow) in the workspace theme: sticky notes, shapes, text, frames, cards and images on an infinite dotted canvas; a tool rail with shortcuts, double-click for a sticky, drag-out connectors that re-route as cards move, labels on connectors, a floating toolbar over the selection, right-click menu, undo/redo, copy/paste, snap to grid, minimap, list view and presentation mode. The board is plain JSON; helpers turn it into text or markdown and lay it out. Other blocks add their own node types and rail tools.",
5
+ "useWhen": "A screen where people arrange things spatially and connect them: a brainstorm, a flowchart or process map, an account or org map, a journey map, a retro, a planning board. The canvas blocks (account-map, process-map, journey-map, idea-board) are built on it. Not for freehand drawing (sketch-canvas), records in stage columns (board), or a chart of numbers (chart).",
6
+ "tags": ["canvas", "whiteboard", "miro", "flowchart", "diagram", "sticky notes", "mind map", "react flow", "nodes", "connectors", "frames", "brainstorm", "infinite canvas", "org chart", "process map"],
7
+ "exports": ["FlowCanvas", "useFlowCanvas", "useCanvas", "NodeShell", "NodeHandles", "EditableText", "Palette", "StickySwatch", "ColorDot", "ShapeGlyph", "colorClasses", "emptyBoard", "createNode", "createEdge", "cleanBoard", "boardToText", "boardToMarkdown", "autoLayout", "snapToCell", "frameContents", "historyReducer", "starterTemplates"],
8
+ "files": ["index.js", "flow-canvas.jsx", "nodes.jsx", "edges.jsx", "chrome.jsx", "context.jsx", "board.js", "theme.js"],
9
+ "requires": [],
10
+ "dependencies": {
11
+ "@xyflow/react": "12.11.6"
12
+ }
13
+ }