makersclaw 0.1.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 (478) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +41 -1
  3. package/THIRD-PARTY-NOTICES.md +180 -0
  4. package/package.json +15 -8
  5. package/r/annotate.json +62 -0
  6. package/r/approval-request.json +52 -0
  7. package/r/audio-player.json +74 -0
  8. package/r/auth-form.json +55 -0
  9. package/r/board.json +55 -0
  10. package/r/calendar-view.json +105 -0
  11. package/r/cart.json +62 -0
  12. package/r/chart.json +83 -0
  13. package/r/chat.json +95 -0
  14. package/r/code-editor.json +94 -0
  15. package/r/comment-box.json +64 -0
  16. package/r/contact-section.json +53 -0
  17. package/r/core.json +341 -0
  18. package/r/csv-import.json +63 -0
  19. package/r/data-table.json +69 -0
  20. package/r/diagram.json +74 -0
  21. package/r/doc-editor.json +82 -0
  22. package/r/doc-page.json +61 -0
  23. package/r/email-render.json +73 -0
  24. package/r/faq.json +50 -0
  25. package/r/file-upload.json +54 -0
  26. package/r/flow-canvas.json +93 -0
  27. package/r/footer.json +52 -0
  28. package/r/gantt.json +70 -0
  29. package/r/job-panel.json +56 -0
  30. package/r/json-editor.json +66 -0
  31. package/r/map.json +89 -0
  32. package/r/menubar.json +52 -0
  33. package/r/mind-map.json +67 -0
  34. package/r/navigation-menu.json +52 -0
  35. package/r/order-detail.json +54 -0
  36. package/r/org-chart.json +66 -0
  37. package/r/page-builder.json +105 -0
  38. package/r/payment-methods.json +51 -0
  39. package/r/pdf-document.json +79 -0
  40. package/r/pdf-viewer.json +88 -0
  41. package/r/product-detail.json +76 -0
  42. package/r/product-grid.json +65 -0
  43. package/r/record-form.json +67 -0
  44. package/r/record-notes.json +55 -0
  45. package/r/registry.json +3612 -0
  46. package/r/search-dialog.json +51 -0
  47. package/r/settings-list.json +66 -0
  48. package/r/setup-checklist.json +51 -0
  49. package/r/share-dialog.json +52 -0
  50. package/r/sidebar.json +69 -0
  51. package/r/signature-pad.json +72 -0
  52. package/r/sketch-canvas.json +99 -0
  53. package/r/spreadsheet.json +90 -0
  54. package/r/stat-cards.json +66 -0
  55. package/r/task-list.json +63 -0
  56. package/r/task-model.json +98 -0
  57. package/r/testimonials.json +52 -0
  58. package/r/transaction-list.json +53 -0
  59. package/r/whiteboard.json +66 -0
  60. package/registry/blocks/annotate/README.md +179 -0
  61. package/registry/blocks/annotate/annotate-data.js +250 -0
  62. package/registry/blocks/annotate/annotate.jsx +646 -0
  63. package/registry/blocks/annotate/block.json +10 -0
  64. package/registry/blocks/annotate/demo.jsx +135 -0
  65. package/registry/blocks/annotate/index.js +15 -0
  66. package/registry/blocks/approval-request/README.md +116 -0
  67. package/registry/blocks/approval-request/approval-request.jsx +386 -0
  68. package/registry/blocks/approval-request/block.json +10 -0
  69. package/registry/blocks/approval-request/demo.jsx +127 -0
  70. package/registry/blocks/approval-request/index.js +4 -0
  71. package/registry/blocks/audio-player/README.md +167 -0
  72. package/registry/blocks/audio-player/audio-player.jsx +623 -0
  73. package/registry/blocks/audio-player/block.json +14 -0
  74. package/registry/blocks/audio-player/colors.js +109 -0
  75. package/registry/blocks/audio-player/demo.jsx +209 -0
  76. package/registry/blocks/audio-player/index.js +6 -0
  77. package/registry/blocks/audio-player/time.js +67 -0
  78. package/registry/blocks/audio-player/wavesurfer.js +9 -0
  79. package/registry/blocks/auth-form/README.md +126 -0
  80. package/registry/blocks/auth-form/auth-form.jsx +568 -0
  81. package/registry/blocks/auth-form/block.json +10 -0
  82. package/registry/blocks/auth-form/demo.jsx +131 -0
  83. package/registry/blocks/auth-form/index.js +3 -0
  84. package/registry/blocks/board/README.md +64 -13
  85. package/registry/blocks/board/block.json +2 -2
  86. package/registry/blocks/board/board.jsx +237 -94
  87. package/registry/blocks/board/demo.jsx +103 -24
  88. package/registry/blocks/calendar-view/README.md +180 -0
  89. package/registry/blocks/calendar-view/agenda.jsx +147 -0
  90. package/registry/blocks/calendar-view/block.json +76 -0
  91. package/registry/blocks/calendar-view/calendar-model.js +442 -0
  92. package/registry/blocks/calendar-view/calendar.jsx +627 -0
  93. package/registry/blocks/calendar-view/demo.jsx +195 -0
  94. package/registry/blocks/calendar-view/draft.jsx +49 -0
  95. package/registry/blocks/calendar-view/index.js +39 -0
  96. package/registry/blocks/calendar-view/month.jsx +346 -0
  97. package/registry/blocks/calendar-view/paint.js +69 -0
  98. package/registry/blocks/calendar-view/time-grid.jsx +527 -0
  99. package/registry/blocks/calendar-view/tray.jsx +87 -0
  100. package/registry/blocks/cart/README.md +146 -0
  101. package/registry/blocks/cart/block.json +10 -0
  102. package/registry/blocks/cart/cart.jsx +597 -0
  103. package/registry/blocks/cart/demo.jsx +98 -0
  104. package/registry/blocks/cart/index.js +4 -0
  105. package/registry/blocks/cart/money.js +28 -0
  106. package/registry/blocks/chart/README.md +316 -0
  107. package/registry/blocks/chart/block.json +10 -0
  108. package/registry/blocks/chart/cartesian.jsx +642 -0
  109. package/registry/blocks/chart/core.jsx +262 -0
  110. package/registry/blocks/chart/demo.jsx +357 -0
  111. package/registry/blocks/chart/heatmap.jsx +336 -0
  112. package/registry/blocks/chart/index.js +8 -0
  113. package/registry/blocks/chart/pie.jsx +245 -0
  114. package/registry/blocks/chart/sparkline.jsx +88 -0
  115. package/registry/blocks/chat/README.md +273 -0
  116. package/registry/blocks/chat/attachment.jsx +95 -0
  117. package/registry/blocks/chat/block.json +10 -0
  118. package/registry/blocks/chat/chat.jsx +132 -0
  119. package/registry/blocks/chat/composer.jsx +364 -0
  120. package/registry/blocks/chat/demo.jsx +578 -0
  121. package/registry/blocks/chat/header.jsx +34 -0
  122. package/registry/blocks/chat/index.js +9 -0
  123. package/registry/blocks/chat/message.jsx +450 -0
  124. package/registry/blocks/chat/scroller.jsx +247 -0
  125. package/registry/blocks/chat/text.jsx +104 -0
  126. package/registry/blocks/code-editor/README.md +210 -0
  127. package/registry/blocks/code-editor/block.json +22 -0
  128. package/registry/blocks/code-editor/code-editor.jsx +534 -0
  129. package/registry/blocks/code-editor/codemirror.js +38 -0
  130. package/registry/blocks/code-editor/demo.jsx +205 -0
  131. package/registry/blocks/code-editor/index.js +8 -0
  132. package/registry/blocks/code-editor/json.js +317 -0
  133. package/registry/blocks/code-editor/sql.js +136 -0
  134. package/registry/blocks/code-editor/text.js +101 -0
  135. package/registry/blocks/code-editor/theme.js +186 -0
  136. package/registry/blocks/comment-box/README.md +123 -0
  137. package/registry/blocks/comment-box/block.json +10 -0
  138. package/registry/blocks/comment-box/comment-body.jsx +217 -0
  139. package/registry/blocks/comment-box/comment-box.jsx +198 -0
  140. package/registry/blocks/comment-box/comment-time.jsx +77 -0
  141. package/registry/blocks/comment-box/demo.jsx +141 -0
  142. package/registry/blocks/comment-box/index.js +8 -0
  143. package/registry/blocks/contact-section/README.md +152 -0
  144. package/registry/blocks/contact-section/block.json +11 -0
  145. package/registry/blocks/contact-section/contact-section.jsx +509 -0
  146. package/registry/blocks/contact-section/demo.jsx +93 -0
  147. package/registry/blocks/contact-section/index.js +4 -0
  148. package/registry/blocks/csv-import/README.md +133 -0
  149. package/registry/blocks/csv-import/block.json +13 -0
  150. package/registry/blocks/csv-import/csv-import.jsx +479 -0
  151. package/registry/blocks/csv-import/demo.jsx +106 -0
  152. package/registry/blocks/csv-import/import.js +200 -0
  153. package/registry/blocks/csv-import/index.js +7 -0
  154. package/registry/blocks/data-table/README.md +386 -0
  155. package/registry/blocks/data-table/block.json +10 -0
  156. package/registry/blocks/data-table/data-table.jsx +1164 -0
  157. package/registry/blocks/data-table/demo.jsx +588 -0
  158. package/registry/blocks/data-table/index.js +5 -0
  159. package/registry/blocks/data-table/model.js +169 -0
  160. package/registry/blocks/diagram/README.md +108 -0
  161. package/registry/blocks/diagram/block.json +13 -0
  162. package/registry/blocks/diagram/demo.jsx +113 -0
  163. package/registry/blocks/diagram/diagram.jsx +481 -0
  164. package/registry/blocks/diagram/index.js +7 -0
  165. package/registry/blocks/diagram/mermaid.js +52 -0
  166. package/registry/blocks/diagram/palette.js +313 -0
  167. package/registry/blocks/diagram/source.js +98 -0
  168. package/registry/blocks/doc-editor/README.md +215 -0
  169. package/registry/blocks/doc-editor/block.json +15 -0
  170. package/registry/blocks/doc-editor/demo.jsx +225 -0
  171. package/registry/blocks/doc-editor/doc-editor.jsx +291 -0
  172. package/registry/blocks/doc-editor/doc.js +309 -0
  173. package/registry/blocks/doc-editor/index.js +7 -0
  174. package/registry/blocks/doc-editor/schema.jsx +56 -0
  175. package/registry/blocks/doc-editor/shadcn-classes.js +110 -0
  176. package/registry/blocks/doc-editor/theme.js +82 -0
  177. package/registry/blocks/doc-page/README.md +119 -0
  178. package/registry/blocks/doc-page/autosave.js +104 -0
  179. package/registry/blocks/doc-page/block.json +10 -0
  180. package/registry/blocks/doc-page/demo.jsx +137 -0
  181. package/registry/blocks/doc-page/doc-page.jsx +276 -0
  182. package/registry/blocks/doc-page/index.js +4 -0
  183. package/registry/blocks/email-render/README.md +151 -0
  184. package/registry/blocks/email-render/block.json +14 -0
  185. package/registry/blocks/email-render/demo.jsx +153 -0
  186. package/registry/blocks/email-render/doc-email.jsx +210 -0
  187. package/registry/blocks/email-render/email.jsx +221 -0
  188. package/registry/blocks/email-render/index.js +10 -0
  189. package/registry/blocks/email-render/render.js +50 -0
  190. package/registry/blocks/email-render/theme.js +215 -0
  191. package/registry/blocks/faq/README.md +101 -0
  192. package/registry/blocks/faq/block.json +11 -0
  193. package/registry/blocks/faq/demo.jsx +89 -0
  194. package/registry/blocks/faq/faq.jsx +220 -0
  195. package/registry/blocks/faq/index.js +4 -0
  196. package/registry/blocks/file-upload/README.md +138 -0
  197. package/registry/blocks/file-upload/block.json +10 -0
  198. package/registry/blocks/file-upload/demo.jsx +204 -0
  199. package/registry/blocks/file-upload/file-upload.jsx +635 -0
  200. package/registry/blocks/file-upload/index.js +4 -0
  201. package/registry/blocks/flow-canvas/README.md +420 -0
  202. package/registry/blocks/flow-canvas/block.json +13 -0
  203. package/registry/blocks/flow-canvas/board.js +819 -0
  204. package/registry/blocks/flow-canvas/chrome.jsx +649 -0
  205. package/registry/blocks/flow-canvas/context.jsx +35 -0
  206. package/registry/blocks/flow-canvas/demo.jsx +249 -0
  207. package/registry/blocks/flow-canvas/edges.jsx +107 -0
  208. package/registry/blocks/flow-canvas/flow-canvas.jsx +1329 -0
  209. package/registry/blocks/flow-canvas/index.js +41 -0
  210. package/registry/blocks/flow-canvas/nodes.jsx +392 -0
  211. package/registry/blocks/flow-canvas/theme.js +174 -0
  212. package/registry/blocks/footer/README.md +133 -0
  213. package/registry/blocks/footer/block.json +11 -0
  214. package/registry/blocks/footer/demo.jsx +119 -0
  215. package/registry/blocks/footer/footer.jsx +406 -0
  216. package/registry/blocks/footer/index.js +4 -0
  217. package/registry/blocks/gantt/README.md +220 -0
  218. package/registry/blocks/gantt/block.json +10 -0
  219. package/registry/blocks/gantt/demo.jsx +148 -0
  220. package/registry/blocks/gantt/gantt.jsx +923 -0
  221. package/registry/blocks/gantt/index.js +7 -0
  222. package/registry/blocks/gantt/rows.jsx +468 -0
  223. package/registry/blocks/gantt/schedule.js +278 -0
  224. package/registry/blocks/job-panel/README.md +86 -2
  225. package/registry/blocks/job-panel/block.json +3 -3
  226. package/registry/blocks/job-panel/demo.jsx +230 -3
  227. package/registry/blocks/job-panel/job-panel.jsx +169 -3
  228. package/registry/blocks/json-editor/README.md +133 -0
  229. package/registry/blocks/json-editor/block.json +10 -0
  230. package/registry/blocks/json-editor/demo.jsx +92 -0
  231. package/registry/blocks/json-editor/index.js +7 -0
  232. package/registry/blocks/json-editor/json-editor.jsx +305 -0
  233. package/registry/blocks/json-editor/json-tree.jsx +393 -0
  234. package/registry/blocks/json-editor/tree.js +225 -0
  235. package/registry/blocks/map/README.md +221 -0
  236. package/registry/blocks/map/block.json +14 -0
  237. package/registry/blocks/map/demo.jsx +201 -0
  238. package/registry/blocks/map/geo.js +198 -0
  239. package/registry/blocks/map/index.js +8 -0
  240. package/registry/blocks/map/list.jsx +128 -0
  241. package/registry/blocks/map/map-view.jsx +715 -0
  242. package/registry/blocks/map/maplibre.js +30 -0
  243. package/registry/blocks/map/marks.jsx +146 -0
  244. package/registry/blocks/map/theme.js +142 -0
  245. package/registry/blocks/menubar/README.md +109 -0
  246. package/registry/blocks/menubar/block.json +10 -0
  247. package/registry/blocks/menubar/demo.jsx +128 -0
  248. package/registry/blocks/menubar/index.js +4 -0
  249. package/registry/blocks/menubar/menubar.jsx +199 -0
  250. package/registry/blocks/mind-map/README.md +206 -0
  251. package/registry/blocks/mind-map/block.json +10 -0
  252. package/registry/blocks/mind-map/demo.jsx +103 -0
  253. package/registry/blocks/mind-map/index.js +31 -0
  254. package/registry/blocks/mind-map/mind-map.jsx +1125 -0
  255. package/registry/blocks/mind-map/topic.jsx +143 -0
  256. package/registry/blocks/mind-map/tree.js +645 -0
  257. package/registry/blocks/navigation-menu/README.md +124 -0
  258. package/registry/blocks/navigation-menu/block.json +10 -0
  259. package/registry/blocks/navigation-menu/demo.jsx +84 -0
  260. package/registry/blocks/navigation-menu/index.js +4 -0
  261. package/registry/blocks/navigation-menu/navigation-menu.jsx +448 -0
  262. package/registry/blocks/order-detail/README.md +109 -0
  263. package/registry/blocks/order-detail/block.json +10 -0
  264. package/registry/blocks/order-detail/demo.jsx +88 -0
  265. package/registry/blocks/order-detail/index.js +4 -0
  266. package/registry/blocks/order-detail/order-detail.jsx +354 -0
  267. package/registry/blocks/org-chart/README.md +145 -0
  268. package/registry/blocks/org-chart/block.json +10 -0
  269. package/registry/blocks/org-chart/demo.jsx +94 -0
  270. package/registry/blocks/org-chart/index.js +7 -0
  271. package/registry/blocks/org-chart/org-chart.jsx +631 -0
  272. package/registry/blocks/org-chart/org.js +245 -0
  273. package/registry/blocks/org-chart/person.jsx +96 -0
  274. package/registry/blocks/page-builder/README.md +257 -0
  275. package/registry/blocks/page-builder/block.json +14 -0
  276. package/registry/blocks/page-builder/demo.jsx +145 -0
  277. package/registry/blocks/page-builder/grapes.js +18 -0
  278. package/registry/blocks/page-builder/index.js +11 -0
  279. package/registry/blocks/page-builder/page-builder.jsx +704 -0
  280. package/registry/blocks/page-builder/page-view.jsx +33 -0
  281. package/registry/blocks/page-builder/page.js +118 -0
  282. package/registry/blocks/page-builder/panels.jsx +588 -0
  283. package/registry/blocks/page-builder/sections.js +209 -0
  284. package/registry/blocks/page-builder/theme.js +87 -0
  285. package/registry/blocks/page-builder/thumbs.jsx +189 -0
  286. package/registry/blocks/page-builder/tokens.js +329 -0
  287. package/registry/blocks/payment-methods/README.md +104 -0
  288. package/registry/blocks/payment-methods/block.json +10 -0
  289. package/registry/blocks/payment-methods/demo.jsx +71 -0
  290. package/registry/blocks/payment-methods/index.js +4 -0
  291. package/registry/blocks/payment-methods/payment-methods.jsx +302 -0
  292. package/registry/blocks/pdf-document/README.md +213 -0
  293. package/registry/blocks/pdf-document/block.json +13 -0
  294. package/registry/blocks/pdf-document/demo.jsx +136 -0
  295. package/registry/blocks/pdf-document/index.js +33 -0
  296. package/registry/blocks/pdf-document/money.js +83 -0
  297. package/registry/blocks/pdf-document/pdf-document.jsx +144 -0
  298. package/registry/blocks/pdf-document/primitives.jsx +271 -0
  299. package/registry/blocks/pdf-document/quote.jsx +179 -0
  300. package/registry/blocks/pdf-document/theme.js +193 -0
  301. package/registry/blocks/pdf-viewer/README.md +191 -0
  302. package/registry/blocks/pdf-viewer/block.json +14 -0
  303. package/registry/blocks/pdf-viewer/demo.jsx +252 -0
  304. package/registry/blocks/pdf-viewer/helpers.js +270 -0
  305. package/registry/blocks/pdf-viewer/index.js +8 -0
  306. package/registry/blocks/pdf-viewer/notes.jsx +195 -0
  307. package/registry/blocks/pdf-viewer/pdf-viewer.jsx +1368 -0
  308. package/registry/blocks/pdf-viewer/pdfjs.js +37 -0
  309. package/registry/blocks/pdf-viewer/ssr-shim-end.js +6 -0
  310. package/registry/blocks/pdf-viewer/ssr-shim.js +44 -0
  311. package/registry/blocks/product-detail/README.md +217 -0
  312. package/registry/blocks/product-detail/block.json +10 -0
  313. package/registry/blocks/product-detail/demo.jsx +233 -0
  314. package/registry/blocks/product-detail/index.js +7 -0
  315. package/registry/blocks/product-detail/price.jsx +115 -0
  316. package/registry/blocks/product-detail/product-detail.jsx +348 -0
  317. package/registry/blocks/product-detail/product-media.jsx +102 -0
  318. package/registry/blocks/product-detail/product-options.jsx +144 -0
  319. package/registry/blocks/product-grid/README.md +162 -0
  320. package/registry/blocks/product-grid/block.json +10 -0
  321. package/registry/blocks/product-grid/demo.jsx +255 -0
  322. package/registry/blocks/product-grid/index.js +5 -0
  323. package/registry/blocks/product-grid/product-card.jsx +232 -0
  324. package/registry/blocks/product-grid/product-grid.jsx +235 -0
  325. package/registry/blocks/record-form/README.md +196 -0
  326. package/registry/blocks/record-form/block.json +10 -0
  327. package/registry/blocks/record-form/demo.jsx +525 -0
  328. package/registry/blocks/record-form/index.js +4 -0
  329. package/registry/blocks/record-form/record-fields.jsx +457 -0
  330. package/registry/blocks/record-form/record-form.jsx +415 -0
  331. package/registry/blocks/record-form/rules.js +81 -0
  332. package/registry/blocks/record-notes/README.md +139 -0
  333. package/registry/blocks/record-notes/block.json +10 -0
  334. package/registry/blocks/record-notes/demo.jsx +179 -0
  335. package/registry/blocks/record-notes/index.js +4 -0
  336. package/registry/blocks/record-notes/record-notes.jsx +266 -0
  337. package/registry/blocks/search-dialog/README.md +108 -0
  338. package/registry/blocks/search-dialog/block.json +10 -0
  339. package/registry/blocks/search-dialog/demo.jsx +116 -0
  340. package/registry/blocks/search-dialog/index.js +3 -0
  341. package/registry/blocks/search-dialog/search-dialog.jsx +235 -0
  342. package/registry/blocks/settings-list/README.md +171 -0
  343. package/registry/blocks/settings-list/block.json +10 -0
  344. package/registry/blocks/settings-list/demo.jsx +333 -0
  345. package/registry/blocks/settings-list/index.js +4 -0
  346. package/registry/blocks/settings-list/row-state.jsx +93 -0
  347. package/registry/blocks/settings-list/settings-list.jsx +349 -0
  348. package/registry/blocks/settings-list/settings-matrix.jsx +118 -0
  349. package/registry/blocks/setup-checklist/README.md +142 -0
  350. package/registry/blocks/setup-checklist/block.json +10 -0
  351. package/registry/blocks/setup-checklist/demo.jsx +159 -0
  352. package/registry/blocks/setup-checklist/index.js +4 -0
  353. package/registry/blocks/setup-checklist/setup-checklist.jsx +446 -0
  354. package/registry/blocks/share-dialog/README.md +113 -0
  355. package/registry/blocks/share-dialog/block.json +10 -0
  356. package/registry/blocks/share-dialog/demo.jsx +140 -0
  357. package/registry/blocks/share-dialog/index.js +3 -0
  358. package/registry/blocks/share-dialog/share-dialog.jsx +384 -0
  359. package/registry/blocks/sidebar/README.md +190 -0
  360. package/registry/blocks/sidebar/block.json +43 -0
  361. package/registry/blocks/sidebar/demo.jsx +577 -0
  362. package/registry/blocks/sidebar/index.js +4 -0
  363. package/registry/blocks/sidebar/sidebar-panel.jsx +149 -0
  364. package/registry/blocks/sidebar/sidebar.jsx +864 -0
  365. package/registry/blocks/signature-pad/README.md +137 -0
  366. package/registry/blocks/signature-pad/block.json +13 -0
  367. package/registry/blocks/signature-pad/colors.js +115 -0
  368. package/registry/blocks/signature-pad/demo.jsx +94 -0
  369. package/registry/blocks/signature-pad/index.js +6 -0
  370. package/registry/blocks/signature-pad/pad.js +7 -0
  371. package/registry/blocks/signature-pad/signature-pad.jsx +434 -0
  372. package/registry/blocks/signature-pad/signature.js +68 -0
  373. package/registry/blocks/sketch-canvas/README.md +280 -0
  374. package/registry/blocks/sketch-canvas/block.json +13 -0
  375. package/registry/blocks/sketch-canvas/demo.jsx +159 -0
  376. package/registry/blocks/sketch-canvas/excalidraw.js +40 -0
  377. package/registry/blocks/sketch-canvas/index.js +9 -0
  378. package/registry/blocks/sketch-canvas/palette.js +226 -0
  379. package/registry/blocks/sketch-canvas/sketch-canvas.jsx +1188 -0
  380. package/registry/blocks/sketch-canvas/sketch.js +179 -0
  381. package/registry/blocks/sketch-canvas/ssr-shim-end.js +6 -0
  382. package/registry/blocks/sketch-canvas/ssr-shim.js +45 -0
  383. package/registry/blocks/sketch-canvas/stamps.js +104 -0
  384. package/registry/blocks/sketch-canvas/theme.js +131 -0
  385. package/registry/blocks/spreadsheet/README.md +307 -0
  386. package/registry/blocks/spreadsheet/block.json +13 -0
  387. package/registry/blocks/spreadsheet/cells.jsx +455 -0
  388. package/registry/blocks/spreadsheet/chrome.jsx +325 -0
  389. package/registry/blocks/spreadsheet/demo.jsx +177 -0
  390. package/registry/blocks/spreadsheet/grid.js +387 -0
  391. package/registry/blocks/spreadsheet/index.js +34 -0
  392. package/registry/blocks/spreadsheet/spreadsheet.jsx +1732 -0
  393. package/registry/blocks/spreadsheet/types.js +473 -0
  394. package/registry/blocks/stat-cards/README.md +173 -0
  395. package/registry/blocks/stat-cards/block.json +10 -0
  396. package/registry/blocks/stat-cards/demo.jsx +257 -0
  397. package/registry/blocks/stat-cards/index.js +4 -0
  398. package/registry/blocks/stat-cards/stat-cards.jsx +307 -0
  399. package/registry/blocks/stat-cards/usage.jsx +243 -0
  400. package/registry/blocks/task-list/README.md +176 -0
  401. package/registry/blocks/task-list/block.json +10 -0
  402. package/registry/blocks/task-list/demo.jsx +134 -0
  403. package/registry/blocks/task-list/index.js +5 -0
  404. package/registry/blocks/task-list/task-list.jsx +907 -0
  405. package/registry/blocks/task-model/README.md +455 -0
  406. package/registry/blocks/task-model/block.json +167 -0
  407. package/registry/blocks/task-model/changes.js +89 -0
  408. package/registry/blocks/task-model/dates.js +371 -0
  409. package/registry/blocks/task-model/demo.jsx +215 -0
  410. package/registry/blocks/task-model/dnd.jsx +240 -0
  411. package/registry/blocks/task-model/index.js +97 -0
  412. package/registry/blocks/task-model/model.js +919 -0
  413. package/registry/blocks/task-model/parts.jsx +449 -0
  414. package/registry/blocks/task-model/toolbar.jsx +271 -0
  415. package/registry/blocks/testimonials/README.md +139 -0
  416. package/registry/blocks/testimonials/block.json +11 -0
  417. package/registry/blocks/testimonials/demo.jsx +137 -0
  418. package/registry/blocks/testimonials/index.js +4 -0
  419. package/registry/blocks/testimonials/testimonials.jsx +430 -0
  420. package/registry/blocks/transaction-list/README.md +126 -0
  421. package/registry/blocks/transaction-list/block.json +10 -0
  422. package/registry/blocks/transaction-list/demo.jsx +79 -0
  423. package/registry/blocks/transaction-list/index.js +4 -0
  424. package/registry/blocks/transaction-list/transaction-list.jsx +383 -0
  425. package/registry/blocks/whiteboard/README.md +179 -0
  426. package/registry/blocks/whiteboard/block.json +10 -0
  427. package/registry/blocks/whiteboard/demo.jsx +169 -0
  428. package/registry/blocks/whiteboard/index.js +6 -0
  429. package/registry/blocks/whiteboard/templates.js +150 -0
  430. package/registry/blocks/whiteboard/whiteboard.jsx +721 -0
  431. package/src/install.mjs +18 -0
  432. package/src/shadcn.mjs +171 -0
  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/parts/fixture.jsx +1 -1
  437. package/templates/next/files/components/parts/sample.js +15 -0
  438. package/templates/next/files/components/ui/avatar.jsx +141 -0
  439. package/templates/next/files/components/ui/breadcrumb.jsx +149 -0
  440. package/templates/next/files/components/ui/button-group.jsx +70 -0
  441. package/templates/next/files/components/ui/button.jsx +132 -12
  442. package/templates/next/files/components/ui/calendar.jsx +609 -0
  443. package/templates/next/files/components/ui/carousel.jsx +281 -0
  444. package/templates/next/files/components/ui/collapsible.jsx +208 -0
  445. package/templates/next/files/components/ui/combobox.jsx +608 -0
  446. package/templates/next/files/components/ui/command.jsx +577 -0
  447. package/templates/next/files/components/ui/context-menu.jsx +191 -0
  448. package/templates/next/files/components/ui/date-picker.jsx +360 -0
  449. package/templates/next/files/components/ui/distribution.jsx +117 -0
  450. package/templates/next/files/components/ui/feedback.jsx +143 -0
  451. package/templates/next/files/components/ui/field.jsx +115 -3
  452. package/templates/next/files/components/ui/file-input.jsx +234 -0
  453. package/templates/next/files/components/ui/icon.jsx +130 -8
  454. package/templates/next/files/components/ui/image.jsx +143 -0
  455. package/templates/next/files/components/ui/index.js +47 -2
  456. package/templates/next/files/components/ui/input-group.jsx +213 -0
  457. package/templates/next/files/components/ui/input-otp.jsx +170 -0
  458. package/templates/next/files/components/ui/item.jsx +206 -0
  459. package/templates/next/files/components/ui/menu.jsx +454 -82
  460. package/templates/next/files/components/ui/notice.jsx +126 -14
  461. package/templates/next/files/components/ui/pagination.jsx +156 -0
  462. package/templates/next/files/components/ui/popover.jsx +284 -0
  463. package/templates/next/files/components/ui/radio.jsx +193 -0
  464. package/templates/next/files/components/ui/rating.jsx +131 -0
  465. package/templates/next/files/components/ui/resizable.jsx +338 -0
  466. package/templates/next/files/components/ui/scroll-area.jsx +123 -0
  467. package/templates/next/files/components/ui/separator.jsx +119 -0
  468. package/templates/next/files/components/ui/sheet.jsx +96 -11
  469. package/templates/next/files/components/ui/slider.jsx +174 -0
  470. package/templates/next/files/components/ui/stat.jsx +574 -0
  471. package/templates/next/files/components/ui/steps.jsx +338 -0
  472. package/templates/next/files/components/ui/swatch.jsx +33 -0
  473. package/templates/next/files/components/ui/table.jsx +130 -0
  474. package/templates/next/files/components/ui/toast.jsx +440 -0
  475. package/templates/next/files/components/ui/toggle.jsx +195 -0
  476. package/templates/next/files/components/ui/tooltip.jsx +270 -0
  477. package/templates/next/files/lib/sample.js +4 -12
  478. package/templates/next/template.json +264 -8
@@ -2,9 +2,8 @@
2
2
 
3
3
  import { useEffect, useId, useMemo, useRef, useState } from "react";
4
4
  import { createPortal } from "react-dom";
5
- import { moveRow } from "../../../lib/actions";
6
5
  import { isSample } from "../../parts";
7
- import { Button, Icon, Input, Menu, Notice, cx } from "../../ui";
6
+ import { Button, Collapsible, Icon, Input, Menu, Notice, cx } from "../../ui";
8
7
 
9
8
  // Board — records as cards in columns, one column per stage, moved by
10
9
  // dragging or from the card's menu. The block owns the behaviour a board
@@ -13,15 +12,47 @@ import { Button, Icon, Input, Menu, Notice, cx } from "../../ui";
13
12
  // once and put back with a reason when the write fails, examples that
14
13
  // move on screen and save nothing, the count in every header, and cards
15
14
  // no stage claims kept in view instead of lost. The surface owns what a
16
- // card says under its title: renderDetails.
15
+ // card says under its title (renderDetails) and how a move is saved
16
+ // (onMove): the block imports nothing but React, the kit and the parts,
17
+ // so it runs in a Makersclaw app and in any shadcn project alike.
17
18
  //
18
- // <Board rows={deals} groupBy="stage" columns={STAGES} source="public.deals"
19
+ // <Board rows={deals} groupBy="stage" columns={STAGES}
20
+ // onMove={(d, to) => moveRow({ source: "public.deals", id: d.id, stateColumn: "stage", to })}
19
21
  // titleOf={(d) => d.name} renderDetails={(d) => <DealFacts deal={d} />}
20
22
  // onOpen={setEditing} />
21
23
  //
24
+ // Opt-in: an icon per column (`columns[].icon`), a figure beside each
25
+ // count (`aggregate(rows)` → "13pt"), a category's colour on each card's
26
+ // edge (`accentOf(row)` → 1…5, `accentEdge` top | start), and
27
+ // `layout="stacked"` — the stages as folding sections of compact rows.
28
+ //
22
29
  // README.md beside this file lists every prop.
23
30
 
24
31
  const OTHER = "__other";
32
+
33
+ // A card's accent: a category's colour on one edge, from the chart tokens
34
+ // (chart-1…5), written out whole so Tailwind finds every class.
35
+ const ACCENTS = {
36
+ top: {
37
+ 1: "border-t-[3px] border-t-chart-1",
38
+ 2: "border-t-[3px] border-t-chart-2",
39
+ 3: "border-t-[3px] border-t-chart-3",
40
+ 4: "border-t-[3px] border-t-chart-4",
41
+ 5: "border-t-[3px] border-t-chart-5",
42
+ },
43
+ start: {
44
+ 1: "border-s-[3px] border-s-chart-1",
45
+ 2: "border-s-[3px] border-s-chart-2",
46
+ 3: "border-s-[3px] border-s-chart-3",
47
+ 4: "border-s-[3px] border-s-chart-4",
48
+ 5: "border-s-[3px] border-s-chart-5",
49
+ },
50
+ };
51
+
52
+ function accentHue(value) {
53
+ const n = typeof value === "string" ? Number(value.replace(/^chart-/, "")) : value;
54
+ return Number.isInteger(n) && n >= 1 && n <= 5 ? n : null;
55
+ }
25
56
  const DRAG_START_PX = { mouse: 5, pen: 6, touch: 8 };
26
57
 
27
58
  function humanize(key) {
@@ -42,7 +73,6 @@ export function Board({
42
73
  groupBy,
43
74
  columns,
44
75
  idColumn = "id",
45
- source,
46
76
  onMove,
47
77
  renderDetails,
48
78
  titleOf = (row) => row.title ?? row.name ?? String(row[idColumn] ?? ""),
@@ -53,6 +83,11 @@ export function Board({
53
83
  addLabel = "Add",
54
84
  createPlaceholder = "Title, then Enter",
55
85
  limits,
86
+ aggregate,
87
+ accentOf,
88
+ accentEdge = "top",
89
+ layout = "columns",
90
+ defaultOpen,
56
91
  label = "Board",
57
92
  emptyLabel = "Nothing here yet",
58
93
  otherLabel = "No stage",
@@ -71,7 +106,7 @@ export function Board({
71
106
  const [busy, setBusy] = useState(false);
72
107
  const [portal, setPortal] = useState(null);
73
108
 
74
- const movable = Boolean(onMove || source);
109
+ const movable = typeof onMove === "function";
75
110
  const list = rows ?? [];
76
111
  const keyOf = (row) => String(row?.[idColumn]);
77
112
  const cols = useMemo(() => normalizeColumns(columns), [columns]);
@@ -106,6 +141,12 @@ export function Board({
106
141
  return out;
107
142
  }, [list, cols, overrides]); // eslint-disable-line react-hooks/exhaustive-deps
108
143
 
144
+ const stacked = layout === "stacked";
145
+ const accent = (row, edge = accentEdge) => {
146
+ if (!accentOf) return null;
147
+ const hue = accentHue(accentOf(row));
148
+ return hue ? (ACCENTS[edge] ?? ACCENTS.top)[hue] : null;
149
+ };
109
150
  const shown = byColumn.get(OTHER).length ? [...cols, { key: OTHER, label: otherLabel, other: true }] : cols;
110
151
  const labelOf = (key) => shown.find((c) => c.key === key)?.label ?? humanize(key);
111
152
 
@@ -121,9 +162,7 @@ export function Board({
121
162
  if (isSample(row)) return;
122
163
  let result;
123
164
  try {
124
- result = onMove
125
- ? await onMove(row, to, from === OTHER ? null : from)
126
- : await moveRow({ source, idColumn, id: row[idColumn], stateColumn: groupBy, to });
165
+ result = await onMove(row, to, from === OTHER ? null : from);
127
166
  } catch (e) {
128
167
  result = { ok: false, error: e?.message ?? String(e) };
129
168
  }
@@ -245,34 +284,115 @@ export function Board({
245
284
  }
246
285
  }
247
286
 
287
+ // The "Add" at a stage's foot, and the inline field it opens.
288
+ function adder(col, headingId, pad = "px-2 pb-2") {
289
+ if (!onCreate || col.other) return null;
290
+ if (adding !== col.key) {
291
+ return (
292
+ <div className={pad}>
293
+ <Button
294
+ variant="quiet"
295
+ size="sm"
296
+ icon="plus"
297
+ align="start"
298
+ className="w-full"
299
+ onClick={() => {
300
+ setAdding(col.key);
301
+ setDraft("");
302
+ }}
303
+ >
304
+ {addLabel}
305
+ </Button>
306
+ </div>
307
+ );
308
+ }
309
+ return (
310
+ <form onSubmit={(e) => create(e, col.key)} className={pad}>
311
+ <label htmlFor={`${headingId}-new`} className="sr-only">
312
+ New in {col.label}
313
+ </label>
314
+ <Input
315
+ id={`${headingId}-new`}
316
+ autoFocus
317
+ value={draft}
318
+ disabled={busy}
319
+ placeholder={createPlaceholder}
320
+ onChange={(e) => setDraft(e.target.value)}
321
+ onKeyDown={(e) => {
322
+ // Enter adds here, not through the form's implicit submit: a
323
+ // synthetic Enter (an agent testing the app) has no keypress to
324
+ // submit with. Never while an input method is composing a word.
325
+ if (e.key === "Enter" && !e.nativeEvent.isComposing) create(e, col.key);
326
+ else if (e.key === "Escape") {
327
+ setAdding(null);
328
+ setDraft("");
329
+ }
330
+ }}
331
+ onBlur={() => {
332
+ if (!draft.trim()) setAdding(null);
333
+ }}
334
+ />
335
+ </form>
336
+ );
337
+ }
338
+
339
+ function header(col, cards) {
340
+ const limit = limits?.[col.key];
341
+ const over = typeof limit === "number" && cards.length > limit;
342
+ return {
343
+ icon: col.icon ? <Icon name={col.icon} size={16} className="shrink-0 text-muted-foreground" /> : null,
344
+ total: aggregate ? (
345
+ <span data-nums className="shrink-0 text-xs text-muted-foreground">
346
+ {aggregate(cards, col.other ? null : col.key)}
347
+ </span>
348
+ ) : null,
349
+ count: (
350
+ <span
351
+ data-nums
352
+ className={cx("shrink-0 font-mono text-xs", over ? "font-semibold text-warning" : "text-muted-foreground")}
353
+ title={typeof limit === "number" ? `${cards.length} of a limit of ${limit}` : undefined}
354
+ >
355
+ {typeof limit === "number" ? `${cards.length}/${limit}` : cards.length}
356
+ </span>
357
+ ),
358
+ };
359
+ }
360
+
361
+ function moveItems(row) {
362
+ return movable
363
+ ? shown
364
+ .filter((c) => !c.other && c.key !== columnOf(row))
365
+ .map((c) => ({ label: `Move to ${c.label}`, icon: "arrow-right", onSelect: () => move(row, c.key) }))
366
+ : [];
367
+ }
368
+
369
+ function titleButton(row, title, extra) {
370
+ return onOpen ? (
371
+ <button
372
+ type="button"
373
+ onClick={() => onOpen(row)}
374
+ className={cx("block w-full rounded-sm text-left text-sm font-medium outline-none hover:underline focus-visible:ring-2 focus-visible:ring-ring", extra)}
375
+ >
376
+ {title}
377
+ </button>
378
+ ) : (
379
+ <p className={cx("text-sm font-medium", extra)}>{title}</p>
380
+ );
381
+ }
382
+
248
383
  function card(row, { ghost = false } = {}) {
249
384
  const title = titleOf(row);
250
385
  const body = (
251
386
  <>
252
- {onOpen ? (
253
- <button
254
- type="button"
255
- onClick={() => onOpen(row)}
256
- className="block w-full rounded-sm text-left text-sm font-medium outline-none hover:underline focus-visible:ring-2 focus-visible:ring-ring"
257
- >
258
- {title}
259
- </button>
260
- ) : (
261
- <p className="text-sm font-medium">{title}</p>
262
- )}
387
+ {titleButton(row, title)}
263
388
  {renderDetails ? (
264
- <div className="mt-2">{renderDetails(row, { column: columnOf(row) })}</div>
389
+ <div className="mt-2">{renderDetails(row, { column: columnOf(row), layout: "columns" })}</div>
265
390
  ) : metaOf ? (
266
391
  <div className="mt-1 text-xs text-muted-foreground">{metaOf(row)}</div>
267
392
  ) : null}
268
393
  </>
269
394
  );
270
- const moveTo = movable
271
- ? shown
272
- .filter((c) => !c.other && c.key !== columnOf(row))
273
- .map((c) => ({ label: `Move to ${c.label}`, icon: "arrow-right", onSelect: () => move(row, c.key) }))
274
- : [];
275
- const items = [...(actionsOf?.(row) ?? []), ...moveTo];
395
+ const items = [...(actionsOf?.(row) ?? []), ...moveItems(row)];
276
396
  return (
277
397
  <div className="flex items-start gap-1">
278
398
  {movable && !ghost ? (
@@ -286,18 +406,89 @@ export function Board({
286
406
  </span>
287
407
  ) : null}
288
408
  <div className="min-w-0 flex-1">{body}</div>
289
- {!ghost ? <Menu items={items} label={`Actions for ${title}`} className="-mr-1 -mt-1 shrink-0" /> : null}
409
+ {!ghost ? <Menu items={items} label={`Actions for ${title}`} size="md" className="-mr-2 -mt-2 -mb-2 shrink-0" /> : null}
410
+ </div>
411
+ );
412
+ }
413
+
414
+ const notice = error ? (
415
+ <Notice tone="danger" onDismiss={() => setError(null)}>
416
+ {error}
417
+ </Notice>
418
+ ) : null;
419
+ const live = (
420
+ <p aria-live="polite" className="sr-only">
421
+ {announce}
422
+ </p>
423
+ );
424
+
425
+ // Stacked: the stages one under another, each a section that folds, the
426
+ // records as compact rows. Nothing drags here — a row moves through its
427
+ // menu ("Move to …"), the same path the keyboard takes on the columns —
428
+ // so a phone scrolls the page, never a board sideways.
429
+ if (stacked) {
430
+ const opens = defaultOpen == null ? null : new Set((Array.isArray(defaultOpen) ? defaultOpen : [defaultOpen]).map(String));
431
+ return (
432
+ <div className={cx("grid gap-3", className)}>
433
+ {notice}
434
+ <div role="region" aria-label={label} className="overflow-hidden rounded-lg border border-border bg-card text-card-foreground">
435
+ {shown.map((col) => {
436
+ const rowsHere = byColumn.get(col.key) ?? [];
437
+ const head = header(col, rowsHere);
438
+ const headingId = `${uid}-${col.key}`;
439
+ return (
440
+ <Collapsible
441
+ key={col.key}
442
+ variant="flush"
443
+ defaultOpen={opens ? opens.has(col.key) : true}
444
+ title={
445
+ <span className="flex min-w-0 items-center gap-2">
446
+ {head.icon}
447
+ <span id={headingId} className="truncate font-semibold">
448
+ {col.label}
449
+ </span>
450
+ </span>
451
+ }
452
+ meta={
453
+ <span className="flex items-center gap-2">
454
+ {head.total}
455
+ {head.count}
456
+ </span>
457
+ }
458
+ >
459
+ <ul aria-labelledby={headingId} className={cx("-mx-4 divide-y divide-border border-t border-border", !onCreate || col.other ? "-mb-4" : "mb-2")}>
460
+ {rowsHere.map((row) => {
461
+ const id = keyOf(row);
462
+ const title = titleOf(row);
463
+ const items = [...(actionsOf?.(row) ?? []), ...moveItems(row)];
464
+ return (
465
+ <li key={id} data-board-card={id} className={cx("flex min-h-11 items-center gap-3 px-4 py-1.5", accent(row, "start"))}>
466
+ <div className="min-w-0 flex-1">
467
+ {titleButton(row, title, "truncate")}
468
+ {metaOf ? <div className="truncate text-xs text-muted-foreground">{metaOf(row)}</div> : null}
469
+ </div>
470
+ {renderDetails ? (
471
+ <div className="flex shrink-0 items-center gap-2">{renderDetails(row, { column: columnOf(row), layout: "stacked" })}</div>
472
+ ) : null}
473
+ <Menu items={items} label={`Actions for ${title}`} size="md" className="-mr-2 shrink-0" />
474
+ </li>
475
+ );
476
+ })}
477
+ {rowsHere.length === 0 ? <li className="px-4 py-3 text-xs text-muted-foreground">{emptyLabel}</li> : null}
478
+ </ul>
479
+ {adder(col, headingId, "-mx-2")}
480
+ </Collapsible>
481
+ );
482
+ })}
483
+ </div>
484
+ {live}
290
485
  </div>
291
486
  );
292
487
  }
293
488
 
294
489
  return (
295
490
  <div className={cx("grid gap-3", className)}>
296
- {error ? (
297
- <Notice tone="danger" onDismiss={() => setError(null)}>
298
- {error}
299
- </Notice>
300
- ) : null}
491
+ {notice}
301
492
  <div
302
493
  ref={boardRef}
303
494
  role="region"
@@ -307,8 +498,7 @@ export function Board({
307
498
  >
308
499
  {shown.map((col) => {
309
500
  const cards = byColumn.get(col.key) ?? [];
310
- const limit = limits?.[col.key];
311
- const over = typeof limit === "number" && cards.length > limit;
501
+ const head = header(col, cards);
312
502
  const target = drag && drag.over === col.key && !col.other && columnOf(drag.row) !== col.key;
313
503
  const headingId = `${uid}-${col.key}`;
314
504
  return (
@@ -321,17 +511,13 @@ export function Board({
321
511
  target && "bg-accent ring-2 ring-ring",
322
512
  )}
323
513
  >
324
- <header className="flex min-h-11 items-center justify-between gap-2 px-3">
325
- <h3 id={headingId} className="truncate text-sm font-semibold">
514
+ <header className="flex min-h-11 items-center gap-2 px-3">
515
+ {head.icon}
516
+ <h3 id={headingId} className="min-w-0 flex-1 truncate text-sm font-semibold">
326
517
  {col.label}
327
518
  </h3>
328
- <span
329
- data-nums
330
- className={cx("shrink-0 font-mono text-xs", over ? "font-semibold text-warning" : "text-muted-foreground")}
331
- title={typeof limit === "number" ? `${cards.length} of a limit of ${limit}` : undefined}
332
- >
333
- {typeof limit === "number" ? `${cards.length}/${limit}` : cards.length}
334
- </span>
519
+ {head.total}
520
+ {head.count}
335
521
  </header>
336
522
  <ul className="flex min-h-16 flex-1 flex-col gap-2 overflow-y-auto px-2 pb-2">
337
523
  {cards.map((row) => {
@@ -353,6 +539,7 @@ export function Board({
353
539
  }}
354
540
  className={cx(
355
541
  "rounded-md border border-border bg-card p-3 text-card-foreground shadow-sm",
542
+ accent(row),
356
543
  movable && "sm:cursor-grab",
357
544
  lifted && "opacity-40",
358
545
  )}
@@ -365,64 +552,20 @@ export function Board({
365
552
  <li className="rounded-md border border-dashed border-border p-3 text-xs text-muted-foreground">{emptyLabel}</li>
366
553
  ) : null}
367
554
  </ul>
368
- {onCreate && !col.other ? (
369
- adding === col.key ? (
370
- <form onSubmit={(e) => create(e, col.key)} className="px-2 pb-2">
371
- <label htmlFor={`${headingId}-new`} className="sr-only">
372
- New in {col.label}
373
- </label>
374
- <Input
375
- id={`${headingId}-new`}
376
- autoFocus
377
- value={draft}
378
- disabled={busy}
379
- placeholder={createPlaceholder}
380
- onChange={(e) => setDraft(e.target.value)}
381
- onKeyDown={(e) => {
382
- // Enter adds here, not through the form's implicit
383
- // submit: a synthetic Enter (an agent testing the
384
- // app) has no keypress to submit with. Never while
385
- // an input method is composing a word.
386
- if (e.key === "Enter" && !e.nativeEvent.isComposing) create(e, col.key);
387
- else if (e.key === "Escape") {
388
- setAdding(null);
389
- setDraft("");
390
- }
391
- }}
392
- onBlur={() => {
393
- if (!draft.trim()) setAdding(null);
394
- }}
395
- />
396
- </form>
397
- ) : (
398
- <div className="px-2 pb-2">
399
- <Button
400
- variant="quiet"
401
- size="sm"
402
- icon="plus"
403
- className="w-full justify-start"
404
- onClick={() => {
405
- setAdding(col.key);
406
- setDraft("");
407
- }}
408
- >
409
- {addLabel}
410
- </Button>
411
- </div>
412
- )
413
- ) : null}
555
+ {adder(col, headingId)}
414
556
  </section>
415
557
  );
416
558
  })}
417
559
  </div>
418
- <p aria-live="polite" className="sr-only">
419
- {announce}
420
- </p>
560
+ {live}
421
561
  {drag && portal
422
562
  ? createPortal(
423
563
  <div
424
564
  aria-hidden="true"
425
- className="pointer-events-none fixed z-50 rotate-2 rounded-md border border-border bg-card p-3 text-card-foreground shadow-lg"
565
+ className={cx(
566
+ "pointer-events-none fixed z-50 rotate-2 rounded-md border border-border bg-card p-3 text-card-foreground shadow-lg",
567
+ accent(drag.row),
568
+ )}
426
569
  style={{ left: drag.x - drag.offsetX, top: drag.y - drag.offsetY, width: drag.width }}
427
570
  >
428
571
  {card(drag.row, { ghost: true })}
@@ -4,7 +4,7 @@
4
4
  // surface. Not installed into apps: `makersclaw add board` lays index.js
5
5
  // and board.jsx only.
6
6
  import { useState } from "react";
7
- import { Badge } from "../components/ui";
7
+ import { Badge, Card } from "../components/ui";
8
8
  import { Board } from "../components/blocks/board";
9
9
 
10
10
  const STAGES = [
@@ -21,30 +21,109 @@ const START = [
21
21
  { id: 5, name: "Umbrella", stage: "paused", owner: "Leon", value: 3000 },
22
22
  ];
23
23
 
24
+ // A sprint: an icon per column, points summed beside each count, the
25
+ // story's type as the card's top edge.
26
+ const SPRINT_STAGES = [
27
+ { key: "todo", label: "To do", icon: "inbox" },
28
+ { key: "doing", label: "In progress", icon: "zap" },
29
+ { key: "review", label: "Review", icon: "eye" },
30
+ { key: "done", label: "Done", icon: "circle-check" },
31
+ ];
32
+ const TYPES = { feature: 1, bug: 4, task: 2 };
33
+ const SPRINT = [
34
+ { id: "s1", title: "Invite teammates by email", status: "todo", type: "feature", points: 5 },
35
+ { id: "s2", title: "Export fails on empty rows", status: "todo", type: "bug", points: 2 },
36
+ { id: "s3", title: "Billing page copy", status: "doing", type: "task", points: 1 },
37
+ { id: "s4", title: "Saved filters", status: "doing", type: "feature", points: 8 },
38
+ { id: "s5", title: "Timezone drift in reports", status: "review", type: "bug", points: 3 },
39
+ { id: "s6", title: "Onboarding checklist", status: "done", type: "feature", points: 5 },
40
+ ];
41
+
42
+ // Chores, stacked: the stages fold, each record is a row.
43
+ const CHORE_STAGES = [
44
+ { key: "todo", label: "To do", icon: "inbox" },
45
+ { key: "doing", label: "Doing", icon: "clock" },
46
+ { key: "done", label: "Done", icon: "circle-check" },
47
+ ];
48
+ const ROOMS = { Kitchen: 2, Bathroom: 3, Garden: 5 };
49
+ const CHORES = [
50
+ { id: "c1", title: "Clean the fridge", state: "todo", room: "Kitchen", every: "Weekly" },
51
+ { id: "c2", title: "Scrub the shower", state: "todo", room: "Bathroom", every: "Weekly" },
52
+ { id: "c3", title: "Water the plants", state: "doing", room: "Garden", every: "Daily" },
53
+ { id: "c4", title: "Empty the dishwasher", state: "done", room: "Kitchen", every: "Daily" },
54
+ ];
55
+
56
+ function useMoves(start, key) {
57
+ const [rows, setRows] = useState(start);
58
+ const onMove = async (row, to) => {
59
+ setRows((all) => all.map((r) => (r.id === row.id ? { ...r, [key]: to } : r)));
60
+ return { ok: true };
61
+ };
62
+ return [rows, setRows, onMove];
63
+ }
64
+
24
65
  export default function BoardDemo() {
25
- const [rows, setRows] = useState(START);
66
+ const [rows, setRows, onMove] = useMoves(START, "stage");
67
+ const [sprint, , moveStory] = useMoves(SPRINT, "status");
68
+ const [chores, setChores, moveChore] = useMoves(CHORES, "state");
26
69
  return (
27
- <Board
28
- rows={rows}
29
- groupBy="stage"
30
- columns={STAGES}
31
- titleOf={(d) => d.name}
32
- onMove={async (row, to) => {
33
- setRows((all) => all.map((r) => (r.id === row.id ? { ...r, stage: to } : r)));
34
- return { ok: true };
35
- }}
36
- onCreate={async (name, stage) => {
37
- setRows((all) => [...all, { id: Date.now(), name, stage, owner: null, value: 0 }]);
38
- return { ok: true };
39
- }}
40
- renderDetails={(d) => (
41
- <div className="flex items-center justify-between text-xs text-muted-foreground">
42
- <span>{d.owner ?? "Unowned"}</span>
43
- <Badge>{Number(d.value ?? 0).toLocaleString()}</Badge>
44
- </div>
45
- )}
46
- limits={{ call: 1 }}
47
- label="Demo deals by stage"
48
- />
70
+ <div className="grid gap-6">
71
+ <Board
72
+ rows={rows}
73
+ groupBy="stage"
74
+ columns={STAGES}
75
+ titleOf={(d) => d.name}
76
+ onMove={onMove}
77
+ onCreate={async (name, stage) => {
78
+ setRows((all) => [...all, { id: Date.now(), name, stage, owner: null, value: 0 }]);
79
+ return { ok: true };
80
+ }}
81
+ renderDetails={(d) => (
82
+ <div className="flex items-center justify-between text-xs text-muted-foreground">
83
+ <span>{d.owner ?? "Unowned"}</span>
84
+ <Badge>{Number(d.value ?? 0).toLocaleString()}</Badge>
85
+ </div>
86
+ )}
87
+ limits={{ call: 1 }}
88
+ label="Demo deals by stage"
89
+ />
90
+
91
+ <Card title="Sprint 18" description="Icons, points per column, a top edge by type">
92
+ <Board
93
+ rows={sprint}
94
+ groupBy="status"
95
+ columns={SPRINT_STAGES}
96
+ onMove={moveStory}
97
+ aggregate={(list) => `${list.reduce((s, r) => s + r.points, 0)}pt`}
98
+ accentOf={(r) => TYPES[r.type] ?? null}
99
+ renderDetails={(r) => (
100
+ <div className="flex items-center justify-between text-xs text-muted-foreground">
101
+ <span className="capitalize">{r.type}</span>
102
+ <Badge>{r.points}pt</Badge>
103
+ </div>
104
+ )}
105
+ label="Sprint 18 stories by status"
106
+ />
107
+ </Card>
108
+
109
+ <Card title="Chores" description="Stacked: stages fold, rows move from their menu">
110
+ <Board
111
+ layout="stacked"
112
+ rows={chores}
113
+ groupBy="state"
114
+ columns={CHORE_STAGES}
115
+ onMove={moveChore}
116
+ defaultOpen={["todo", "doing"]}
117
+ accentOf={(r) => ROOMS[r.room] ?? null}
118
+ metaOf={(r) => r.room}
119
+ renderDetails={(r) => <Badge tone={r.every === "Daily" ? "warning" : "info"}>{r.every}</Badge>}
120
+ onCreate={async (title, state) => {
121
+ setChores((all) => [...all, { id: `c${Date.now()}`, title, state, room: "Kitchen", every: "Weekly" }]);
122
+ return { ok: true };
123
+ }}
124
+ label="Chores by state"
125
+ />
126
+ </Card>
127
+ </div>
49
128
  );
50
129
  }