makersclaw 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (475) hide show
  1. package/THIRD-PARTY-NOTICES.md +180 -0
  2. package/package.json +3 -2
  3. package/r/annotate.json +62 -0
  4. package/r/approval-request.json +52 -0
  5. package/r/audio-player.json +74 -0
  6. package/r/auth-form.json +55 -0
  7. package/r/board.json +10 -6
  8. package/r/calendar-view.json +105 -0
  9. package/r/cart.json +62 -0
  10. package/r/chart.json +83 -0
  11. package/r/chat.json +95 -0
  12. package/r/code-editor.json +94 -0
  13. package/r/comment-box.json +64 -0
  14. package/r/contact-section.json +53 -0
  15. package/r/core.json +205 -8
  16. package/r/csv-import.json +63 -0
  17. package/r/data-table.json +69 -0
  18. package/r/diagram.json +74 -0
  19. package/r/doc-editor.json +82 -0
  20. package/r/doc-page.json +61 -0
  21. package/r/email-render.json +73 -0
  22. package/r/faq.json +50 -0
  23. package/r/file-upload.json +54 -0
  24. package/r/flow-canvas.json +93 -0
  25. package/r/footer.json +52 -0
  26. package/r/gantt.json +70 -0
  27. package/r/job-panel.json +12 -7
  28. package/r/json-editor.json +66 -0
  29. package/r/map.json +89 -0
  30. package/r/menubar.json +52 -0
  31. package/r/mind-map.json +67 -0
  32. package/r/navigation-menu.json +52 -0
  33. package/r/order-detail.json +54 -0
  34. package/r/org-chart.json +66 -0
  35. package/r/page-builder.json +105 -0
  36. package/r/payment-methods.json +51 -0
  37. package/r/pdf-document.json +79 -0
  38. package/r/pdf-viewer.json +88 -0
  39. package/r/product-detail.json +76 -0
  40. package/r/product-grid.json +65 -0
  41. package/r/record-form.json +67 -0
  42. package/r/record-notes.json +55 -0
  43. package/r/registry.json +3411 -29
  44. package/r/search-dialog.json +51 -0
  45. package/r/settings-list.json +66 -0
  46. package/r/setup-checklist.json +51 -0
  47. package/r/share-dialog.json +52 -0
  48. package/r/sidebar.json +69 -0
  49. package/r/signature-pad.json +72 -0
  50. package/r/sketch-canvas.json +99 -0
  51. package/r/spreadsheet.json +90 -0
  52. package/r/stat-cards.json +66 -0
  53. package/r/task-list.json +63 -0
  54. package/r/task-model.json +98 -0
  55. package/r/testimonials.json +52 -0
  56. package/r/transaction-list.json +53 -0
  57. package/r/whiteboard.json +66 -0
  58. package/registry/blocks/annotate/README.md +179 -0
  59. package/registry/blocks/annotate/annotate-data.js +250 -0
  60. package/registry/blocks/annotate/annotate.jsx +646 -0
  61. package/registry/blocks/annotate/block.json +10 -0
  62. package/registry/blocks/annotate/demo.jsx +135 -0
  63. package/registry/blocks/annotate/index.js +15 -0
  64. package/registry/blocks/approval-request/README.md +116 -0
  65. package/registry/blocks/approval-request/approval-request.jsx +386 -0
  66. package/registry/blocks/approval-request/block.json +10 -0
  67. package/registry/blocks/approval-request/demo.jsx +127 -0
  68. package/registry/blocks/approval-request/index.js +4 -0
  69. package/registry/blocks/audio-player/README.md +167 -0
  70. package/registry/blocks/audio-player/audio-player.jsx +623 -0
  71. package/registry/blocks/audio-player/block.json +14 -0
  72. package/registry/blocks/audio-player/colors.js +109 -0
  73. package/registry/blocks/audio-player/demo.jsx +209 -0
  74. package/registry/blocks/audio-player/index.js +6 -0
  75. package/registry/blocks/audio-player/time.js +67 -0
  76. package/registry/blocks/audio-player/wavesurfer.js +9 -0
  77. package/registry/blocks/auth-form/README.md +126 -0
  78. package/registry/blocks/auth-form/auth-form.jsx +568 -0
  79. package/registry/blocks/auth-form/block.json +10 -0
  80. package/registry/blocks/auth-form/demo.jsx +131 -0
  81. package/registry/blocks/auth-form/index.js +3 -0
  82. package/registry/blocks/board/README.md +55 -5
  83. package/registry/blocks/board/block.json +2 -2
  84. package/registry/blocks/board/board.jsx +230 -86
  85. package/registry/blocks/board/demo.jsx +103 -24
  86. package/registry/blocks/calendar-view/README.md +180 -0
  87. package/registry/blocks/calendar-view/agenda.jsx +147 -0
  88. package/registry/blocks/calendar-view/block.json +76 -0
  89. package/registry/blocks/calendar-view/calendar-model.js +442 -0
  90. package/registry/blocks/calendar-view/calendar.jsx +627 -0
  91. package/registry/blocks/calendar-view/demo.jsx +195 -0
  92. package/registry/blocks/calendar-view/draft.jsx +49 -0
  93. package/registry/blocks/calendar-view/index.js +39 -0
  94. package/registry/blocks/calendar-view/month.jsx +346 -0
  95. package/registry/blocks/calendar-view/paint.js +69 -0
  96. package/registry/blocks/calendar-view/time-grid.jsx +527 -0
  97. package/registry/blocks/calendar-view/tray.jsx +87 -0
  98. package/registry/blocks/cart/README.md +146 -0
  99. package/registry/blocks/cart/block.json +10 -0
  100. package/registry/blocks/cart/cart.jsx +597 -0
  101. package/registry/blocks/cart/demo.jsx +98 -0
  102. package/registry/blocks/cart/index.js +4 -0
  103. package/registry/blocks/cart/money.js +28 -0
  104. package/registry/blocks/chart/README.md +316 -0
  105. package/registry/blocks/chart/block.json +10 -0
  106. package/registry/blocks/chart/cartesian.jsx +642 -0
  107. package/registry/blocks/chart/core.jsx +262 -0
  108. package/registry/blocks/chart/demo.jsx +357 -0
  109. package/registry/blocks/chart/heatmap.jsx +336 -0
  110. package/registry/blocks/chart/index.js +8 -0
  111. package/registry/blocks/chart/pie.jsx +245 -0
  112. package/registry/blocks/chart/sparkline.jsx +88 -0
  113. package/registry/blocks/chat/README.md +273 -0
  114. package/registry/blocks/chat/attachment.jsx +95 -0
  115. package/registry/blocks/chat/block.json +10 -0
  116. package/registry/blocks/chat/chat.jsx +132 -0
  117. package/registry/blocks/chat/composer.jsx +364 -0
  118. package/registry/blocks/chat/demo.jsx +578 -0
  119. package/registry/blocks/chat/header.jsx +34 -0
  120. package/registry/blocks/chat/index.js +9 -0
  121. package/registry/blocks/chat/message.jsx +450 -0
  122. package/registry/blocks/chat/scroller.jsx +247 -0
  123. package/registry/blocks/chat/text.jsx +104 -0
  124. package/registry/blocks/code-editor/README.md +210 -0
  125. package/registry/blocks/code-editor/block.json +22 -0
  126. package/registry/blocks/code-editor/code-editor.jsx +534 -0
  127. package/registry/blocks/code-editor/codemirror.js +38 -0
  128. package/registry/blocks/code-editor/demo.jsx +205 -0
  129. package/registry/blocks/code-editor/index.js +8 -0
  130. package/registry/blocks/code-editor/json.js +317 -0
  131. package/registry/blocks/code-editor/sql.js +136 -0
  132. package/registry/blocks/code-editor/text.js +101 -0
  133. package/registry/blocks/code-editor/theme.js +186 -0
  134. package/registry/blocks/comment-box/README.md +123 -0
  135. package/registry/blocks/comment-box/block.json +10 -0
  136. package/registry/blocks/comment-box/comment-body.jsx +217 -0
  137. package/registry/blocks/comment-box/comment-box.jsx +198 -0
  138. package/registry/blocks/comment-box/comment-time.jsx +77 -0
  139. package/registry/blocks/comment-box/demo.jsx +141 -0
  140. package/registry/blocks/comment-box/index.js +8 -0
  141. package/registry/blocks/contact-section/README.md +152 -0
  142. package/registry/blocks/contact-section/block.json +11 -0
  143. package/registry/blocks/contact-section/contact-section.jsx +509 -0
  144. package/registry/blocks/contact-section/demo.jsx +93 -0
  145. package/registry/blocks/contact-section/index.js +4 -0
  146. package/registry/blocks/csv-import/README.md +133 -0
  147. package/registry/blocks/csv-import/block.json +13 -0
  148. package/registry/blocks/csv-import/csv-import.jsx +479 -0
  149. package/registry/blocks/csv-import/demo.jsx +106 -0
  150. package/registry/blocks/csv-import/import.js +200 -0
  151. package/registry/blocks/csv-import/index.js +7 -0
  152. package/registry/blocks/data-table/README.md +386 -0
  153. package/registry/blocks/data-table/block.json +10 -0
  154. package/registry/blocks/data-table/data-table.jsx +1164 -0
  155. package/registry/blocks/data-table/demo.jsx +588 -0
  156. package/registry/blocks/data-table/index.js +5 -0
  157. package/registry/blocks/data-table/model.js +169 -0
  158. package/registry/blocks/diagram/README.md +108 -0
  159. package/registry/blocks/diagram/block.json +13 -0
  160. package/registry/blocks/diagram/demo.jsx +113 -0
  161. package/registry/blocks/diagram/diagram.jsx +481 -0
  162. package/registry/blocks/diagram/index.js +7 -0
  163. package/registry/blocks/diagram/mermaid.js +52 -0
  164. package/registry/blocks/diagram/palette.js +313 -0
  165. package/registry/blocks/diagram/source.js +98 -0
  166. package/registry/blocks/doc-editor/README.md +215 -0
  167. package/registry/blocks/doc-editor/block.json +15 -0
  168. package/registry/blocks/doc-editor/demo.jsx +225 -0
  169. package/registry/blocks/doc-editor/doc-editor.jsx +291 -0
  170. package/registry/blocks/doc-editor/doc.js +309 -0
  171. package/registry/blocks/doc-editor/index.js +7 -0
  172. package/registry/blocks/doc-editor/schema.jsx +56 -0
  173. package/registry/blocks/doc-editor/shadcn-classes.js +110 -0
  174. package/registry/blocks/doc-editor/theme.js +82 -0
  175. package/registry/blocks/doc-page/README.md +119 -0
  176. package/registry/blocks/doc-page/autosave.js +104 -0
  177. package/registry/blocks/doc-page/block.json +10 -0
  178. package/registry/blocks/doc-page/demo.jsx +137 -0
  179. package/registry/blocks/doc-page/doc-page.jsx +276 -0
  180. package/registry/blocks/doc-page/index.js +4 -0
  181. package/registry/blocks/email-render/README.md +151 -0
  182. package/registry/blocks/email-render/block.json +14 -0
  183. package/registry/blocks/email-render/demo.jsx +153 -0
  184. package/registry/blocks/email-render/doc-email.jsx +210 -0
  185. package/registry/blocks/email-render/email.jsx +221 -0
  186. package/registry/blocks/email-render/index.js +10 -0
  187. package/registry/blocks/email-render/render.js +50 -0
  188. package/registry/blocks/email-render/theme.js +215 -0
  189. package/registry/blocks/faq/README.md +101 -0
  190. package/registry/blocks/faq/block.json +11 -0
  191. package/registry/blocks/faq/demo.jsx +89 -0
  192. package/registry/blocks/faq/faq.jsx +220 -0
  193. package/registry/blocks/faq/index.js +4 -0
  194. package/registry/blocks/file-upload/README.md +138 -0
  195. package/registry/blocks/file-upload/block.json +10 -0
  196. package/registry/blocks/file-upload/demo.jsx +204 -0
  197. package/registry/blocks/file-upload/file-upload.jsx +635 -0
  198. package/registry/blocks/file-upload/index.js +4 -0
  199. package/registry/blocks/flow-canvas/README.md +420 -0
  200. package/registry/blocks/flow-canvas/block.json +13 -0
  201. package/registry/blocks/flow-canvas/board.js +819 -0
  202. package/registry/blocks/flow-canvas/chrome.jsx +649 -0
  203. package/registry/blocks/flow-canvas/context.jsx +35 -0
  204. package/registry/blocks/flow-canvas/demo.jsx +249 -0
  205. package/registry/blocks/flow-canvas/edges.jsx +107 -0
  206. package/registry/blocks/flow-canvas/flow-canvas.jsx +1329 -0
  207. package/registry/blocks/flow-canvas/index.js +41 -0
  208. package/registry/blocks/flow-canvas/nodes.jsx +392 -0
  209. package/registry/blocks/flow-canvas/theme.js +174 -0
  210. package/registry/blocks/footer/README.md +133 -0
  211. package/registry/blocks/footer/block.json +11 -0
  212. package/registry/blocks/footer/demo.jsx +119 -0
  213. package/registry/blocks/footer/footer.jsx +406 -0
  214. package/registry/blocks/footer/index.js +4 -0
  215. package/registry/blocks/gantt/README.md +220 -0
  216. package/registry/blocks/gantt/block.json +10 -0
  217. package/registry/blocks/gantt/demo.jsx +148 -0
  218. package/registry/blocks/gantt/gantt.jsx +923 -0
  219. package/registry/blocks/gantt/index.js +7 -0
  220. package/registry/blocks/gantt/rows.jsx +468 -0
  221. package/registry/blocks/gantt/schedule.js +278 -0
  222. package/registry/blocks/job-panel/README.md +80 -0
  223. package/registry/blocks/job-panel/block.json +3 -3
  224. package/registry/blocks/job-panel/demo.jsx +230 -3
  225. package/registry/blocks/job-panel/job-panel.jsx +169 -3
  226. package/registry/blocks/json-editor/README.md +133 -0
  227. package/registry/blocks/json-editor/block.json +10 -0
  228. package/registry/blocks/json-editor/demo.jsx +92 -0
  229. package/registry/blocks/json-editor/index.js +7 -0
  230. package/registry/blocks/json-editor/json-editor.jsx +305 -0
  231. package/registry/blocks/json-editor/json-tree.jsx +393 -0
  232. package/registry/blocks/json-editor/tree.js +225 -0
  233. package/registry/blocks/map/README.md +221 -0
  234. package/registry/blocks/map/block.json +14 -0
  235. package/registry/blocks/map/demo.jsx +201 -0
  236. package/registry/blocks/map/geo.js +198 -0
  237. package/registry/blocks/map/index.js +8 -0
  238. package/registry/blocks/map/list.jsx +128 -0
  239. package/registry/blocks/map/map-view.jsx +715 -0
  240. package/registry/blocks/map/maplibre.js +30 -0
  241. package/registry/blocks/map/marks.jsx +146 -0
  242. package/registry/blocks/map/theme.js +142 -0
  243. package/registry/blocks/menubar/README.md +109 -0
  244. package/registry/blocks/menubar/block.json +10 -0
  245. package/registry/blocks/menubar/demo.jsx +128 -0
  246. package/registry/blocks/menubar/index.js +4 -0
  247. package/registry/blocks/menubar/menubar.jsx +199 -0
  248. package/registry/blocks/mind-map/README.md +206 -0
  249. package/registry/blocks/mind-map/block.json +10 -0
  250. package/registry/blocks/mind-map/demo.jsx +103 -0
  251. package/registry/blocks/mind-map/index.js +31 -0
  252. package/registry/blocks/mind-map/mind-map.jsx +1125 -0
  253. package/registry/blocks/mind-map/topic.jsx +143 -0
  254. package/registry/blocks/mind-map/tree.js +645 -0
  255. package/registry/blocks/navigation-menu/README.md +124 -0
  256. package/registry/blocks/navigation-menu/block.json +10 -0
  257. package/registry/blocks/navigation-menu/demo.jsx +84 -0
  258. package/registry/blocks/navigation-menu/index.js +4 -0
  259. package/registry/blocks/navigation-menu/navigation-menu.jsx +448 -0
  260. package/registry/blocks/order-detail/README.md +109 -0
  261. package/registry/blocks/order-detail/block.json +10 -0
  262. package/registry/blocks/order-detail/demo.jsx +88 -0
  263. package/registry/blocks/order-detail/index.js +4 -0
  264. package/registry/blocks/order-detail/order-detail.jsx +354 -0
  265. package/registry/blocks/org-chart/README.md +145 -0
  266. package/registry/blocks/org-chart/block.json +10 -0
  267. package/registry/blocks/org-chart/demo.jsx +94 -0
  268. package/registry/blocks/org-chart/index.js +7 -0
  269. package/registry/blocks/org-chart/org-chart.jsx +631 -0
  270. package/registry/blocks/org-chart/org.js +245 -0
  271. package/registry/blocks/org-chart/person.jsx +96 -0
  272. package/registry/blocks/page-builder/README.md +257 -0
  273. package/registry/blocks/page-builder/block.json +14 -0
  274. package/registry/blocks/page-builder/demo.jsx +145 -0
  275. package/registry/blocks/page-builder/grapes.js +18 -0
  276. package/registry/blocks/page-builder/index.js +11 -0
  277. package/registry/blocks/page-builder/page-builder.jsx +704 -0
  278. package/registry/blocks/page-builder/page-view.jsx +33 -0
  279. package/registry/blocks/page-builder/page.js +118 -0
  280. package/registry/blocks/page-builder/panels.jsx +588 -0
  281. package/registry/blocks/page-builder/sections.js +209 -0
  282. package/registry/blocks/page-builder/theme.js +87 -0
  283. package/registry/blocks/page-builder/thumbs.jsx +189 -0
  284. package/registry/blocks/page-builder/tokens.js +329 -0
  285. package/registry/blocks/payment-methods/README.md +104 -0
  286. package/registry/blocks/payment-methods/block.json +10 -0
  287. package/registry/blocks/payment-methods/demo.jsx +71 -0
  288. package/registry/blocks/payment-methods/index.js +4 -0
  289. package/registry/blocks/payment-methods/payment-methods.jsx +302 -0
  290. package/registry/blocks/pdf-document/README.md +213 -0
  291. package/registry/blocks/pdf-document/block.json +13 -0
  292. package/registry/blocks/pdf-document/demo.jsx +136 -0
  293. package/registry/blocks/pdf-document/index.js +33 -0
  294. package/registry/blocks/pdf-document/money.js +83 -0
  295. package/registry/blocks/pdf-document/pdf-document.jsx +144 -0
  296. package/registry/blocks/pdf-document/primitives.jsx +271 -0
  297. package/registry/blocks/pdf-document/quote.jsx +179 -0
  298. package/registry/blocks/pdf-document/theme.js +193 -0
  299. package/registry/blocks/pdf-viewer/README.md +191 -0
  300. package/registry/blocks/pdf-viewer/block.json +14 -0
  301. package/registry/blocks/pdf-viewer/demo.jsx +252 -0
  302. package/registry/blocks/pdf-viewer/helpers.js +270 -0
  303. package/registry/blocks/pdf-viewer/index.js +8 -0
  304. package/registry/blocks/pdf-viewer/notes.jsx +195 -0
  305. package/registry/blocks/pdf-viewer/pdf-viewer.jsx +1368 -0
  306. package/registry/blocks/pdf-viewer/pdfjs.js +37 -0
  307. package/registry/blocks/pdf-viewer/ssr-shim-end.js +6 -0
  308. package/registry/blocks/pdf-viewer/ssr-shim.js +44 -0
  309. package/registry/blocks/product-detail/README.md +217 -0
  310. package/registry/blocks/product-detail/block.json +10 -0
  311. package/registry/blocks/product-detail/demo.jsx +233 -0
  312. package/registry/blocks/product-detail/index.js +7 -0
  313. package/registry/blocks/product-detail/price.jsx +115 -0
  314. package/registry/blocks/product-detail/product-detail.jsx +348 -0
  315. package/registry/blocks/product-detail/product-media.jsx +102 -0
  316. package/registry/blocks/product-detail/product-options.jsx +144 -0
  317. package/registry/blocks/product-grid/README.md +162 -0
  318. package/registry/blocks/product-grid/block.json +10 -0
  319. package/registry/blocks/product-grid/demo.jsx +255 -0
  320. package/registry/blocks/product-grid/index.js +5 -0
  321. package/registry/blocks/product-grid/product-card.jsx +232 -0
  322. package/registry/blocks/product-grid/product-grid.jsx +235 -0
  323. package/registry/blocks/record-form/README.md +196 -0
  324. package/registry/blocks/record-form/block.json +10 -0
  325. package/registry/blocks/record-form/demo.jsx +525 -0
  326. package/registry/blocks/record-form/index.js +4 -0
  327. package/registry/blocks/record-form/record-fields.jsx +457 -0
  328. package/registry/blocks/record-form/record-form.jsx +415 -0
  329. package/registry/blocks/record-form/rules.js +81 -0
  330. package/registry/blocks/record-notes/README.md +139 -0
  331. package/registry/blocks/record-notes/block.json +10 -0
  332. package/registry/blocks/record-notes/demo.jsx +179 -0
  333. package/registry/blocks/record-notes/index.js +4 -0
  334. package/registry/blocks/record-notes/record-notes.jsx +266 -0
  335. package/registry/blocks/search-dialog/README.md +108 -0
  336. package/registry/blocks/search-dialog/block.json +10 -0
  337. package/registry/blocks/search-dialog/demo.jsx +116 -0
  338. package/registry/blocks/search-dialog/index.js +3 -0
  339. package/registry/blocks/search-dialog/search-dialog.jsx +235 -0
  340. package/registry/blocks/settings-list/README.md +171 -0
  341. package/registry/blocks/settings-list/block.json +10 -0
  342. package/registry/blocks/settings-list/demo.jsx +333 -0
  343. package/registry/blocks/settings-list/index.js +4 -0
  344. package/registry/blocks/settings-list/row-state.jsx +93 -0
  345. package/registry/blocks/settings-list/settings-list.jsx +349 -0
  346. package/registry/blocks/settings-list/settings-matrix.jsx +118 -0
  347. package/registry/blocks/setup-checklist/README.md +142 -0
  348. package/registry/blocks/setup-checklist/block.json +10 -0
  349. package/registry/blocks/setup-checklist/demo.jsx +159 -0
  350. package/registry/blocks/setup-checklist/index.js +4 -0
  351. package/registry/blocks/setup-checklist/setup-checklist.jsx +446 -0
  352. package/registry/blocks/share-dialog/README.md +113 -0
  353. package/registry/blocks/share-dialog/block.json +10 -0
  354. package/registry/blocks/share-dialog/demo.jsx +140 -0
  355. package/registry/blocks/share-dialog/index.js +3 -0
  356. package/registry/blocks/share-dialog/share-dialog.jsx +384 -0
  357. package/registry/blocks/sidebar/README.md +190 -0
  358. package/registry/blocks/sidebar/block.json +43 -0
  359. package/registry/blocks/sidebar/demo.jsx +577 -0
  360. package/registry/blocks/sidebar/index.js +4 -0
  361. package/registry/blocks/sidebar/sidebar-panel.jsx +149 -0
  362. package/registry/blocks/sidebar/sidebar.jsx +864 -0
  363. package/registry/blocks/signature-pad/README.md +137 -0
  364. package/registry/blocks/signature-pad/block.json +13 -0
  365. package/registry/blocks/signature-pad/colors.js +115 -0
  366. package/registry/blocks/signature-pad/demo.jsx +94 -0
  367. package/registry/blocks/signature-pad/index.js +6 -0
  368. package/registry/blocks/signature-pad/pad.js +7 -0
  369. package/registry/blocks/signature-pad/signature-pad.jsx +434 -0
  370. package/registry/blocks/signature-pad/signature.js +68 -0
  371. package/registry/blocks/sketch-canvas/README.md +280 -0
  372. package/registry/blocks/sketch-canvas/block.json +13 -0
  373. package/registry/blocks/sketch-canvas/demo.jsx +159 -0
  374. package/registry/blocks/sketch-canvas/excalidraw.js +40 -0
  375. package/registry/blocks/sketch-canvas/index.js +9 -0
  376. package/registry/blocks/sketch-canvas/palette.js +226 -0
  377. package/registry/blocks/sketch-canvas/sketch-canvas.jsx +1188 -0
  378. package/registry/blocks/sketch-canvas/sketch.js +179 -0
  379. package/registry/blocks/sketch-canvas/ssr-shim-end.js +6 -0
  380. package/registry/blocks/sketch-canvas/ssr-shim.js +45 -0
  381. package/registry/blocks/sketch-canvas/stamps.js +104 -0
  382. package/registry/blocks/sketch-canvas/theme.js +131 -0
  383. package/registry/blocks/spreadsheet/README.md +307 -0
  384. package/registry/blocks/spreadsheet/block.json +13 -0
  385. package/registry/blocks/spreadsheet/cells.jsx +455 -0
  386. package/registry/blocks/spreadsheet/chrome.jsx +325 -0
  387. package/registry/blocks/spreadsheet/demo.jsx +177 -0
  388. package/registry/blocks/spreadsheet/grid.js +387 -0
  389. package/registry/blocks/spreadsheet/index.js +34 -0
  390. package/registry/blocks/spreadsheet/spreadsheet.jsx +1732 -0
  391. package/registry/blocks/spreadsheet/types.js +473 -0
  392. package/registry/blocks/stat-cards/README.md +173 -0
  393. package/registry/blocks/stat-cards/block.json +10 -0
  394. package/registry/blocks/stat-cards/demo.jsx +257 -0
  395. package/registry/blocks/stat-cards/index.js +4 -0
  396. package/registry/blocks/stat-cards/stat-cards.jsx +307 -0
  397. package/registry/blocks/stat-cards/usage.jsx +243 -0
  398. package/registry/blocks/task-list/README.md +176 -0
  399. package/registry/blocks/task-list/block.json +10 -0
  400. package/registry/blocks/task-list/demo.jsx +134 -0
  401. package/registry/blocks/task-list/index.js +5 -0
  402. package/registry/blocks/task-list/task-list.jsx +907 -0
  403. package/registry/blocks/task-model/README.md +455 -0
  404. package/registry/blocks/task-model/block.json +167 -0
  405. package/registry/blocks/task-model/changes.js +89 -0
  406. package/registry/blocks/task-model/dates.js +371 -0
  407. package/registry/blocks/task-model/demo.jsx +215 -0
  408. package/registry/blocks/task-model/dnd.jsx +240 -0
  409. package/registry/blocks/task-model/index.js +97 -0
  410. package/registry/blocks/task-model/model.js +919 -0
  411. package/registry/blocks/task-model/parts.jsx +449 -0
  412. package/registry/blocks/task-model/toolbar.jsx +271 -0
  413. package/registry/blocks/testimonials/README.md +139 -0
  414. package/registry/blocks/testimonials/block.json +11 -0
  415. package/registry/blocks/testimonials/demo.jsx +137 -0
  416. package/registry/blocks/testimonials/index.js +4 -0
  417. package/registry/blocks/testimonials/testimonials.jsx +430 -0
  418. package/registry/blocks/transaction-list/README.md +126 -0
  419. package/registry/blocks/transaction-list/block.json +10 -0
  420. package/registry/blocks/transaction-list/demo.jsx +79 -0
  421. package/registry/blocks/transaction-list/index.js +4 -0
  422. package/registry/blocks/transaction-list/transaction-list.jsx +383 -0
  423. package/registry/blocks/whiteboard/README.md +179 -0
  424. package/registry/blocks/whiteboard/block.json +10 -0
  425. package/registry/blocks/whiteboard/demo.jsx +169 -0
  426. package/registry/blocks/whiteboard/index.js +6 -0
  427. package/registry/blocks/whiteboard/templates.js +150 -0
  428. package/registry/blocks/whiteboard/whiteboard.jsx +721 -0
  429. package/src/cli.mjs +19 -6
  430. package/src/install.mjs +18 -0
  431. package/src/registry.mjs +38 -4
  432. package/src/shadcn.mjs +14 -1
  433. package/templates/next/files/README.md +145 -11
  434. package/templates/next/files/app/globals.css +55 -4
  435. package/templates/next/files/check/run.mjs +3 -3
  436. package/templates/next/files/components/ui/avatar.jsx +141 -0
  437. package/templates/next/files/components/ui/breadcrumb.jsx +149 -0
  438. package/templates/next/files/components/ui/button-group.jsx +70 -0
  439. package/templates/next/files/components/ui/button.jsx +132 -12
  440. package/templates/next/files/components/ui/calendar.jsx +609 -0
  441. package/templates/next/files/components/ui/carousel.jsx +281 -0
  442. package/templates/next/files/components/ui/collapsible.jsx +208 -0
  443. package/templates/next/files/components/ui/combobox.jsx +608 -0
  444. package/templates/next/files/components/ui/command.jsx +577 -0
  445. package/templates/next/files/components/ui/context-menu.jsx +191 -0
  446. package/templates/next/files/components/ui/date-picker.jsx +360 -0
  447. package/templates/next/files/components/ui/distribution.jsx +117 -0
  448. package/templates/next/files/components/ui/feedback.jsx +143 -0
  449. package/templates/next/files/components/ui/field.jsx +115 -3
  450. package/templates/next/files/components/ui/file-input.jsx +234 -0
  451. package/templates/next/files/components/ui/icon.jsx +130 -8
  452. package/templates/next/files/components/ui/image.jsx +143 -0
  453. package/templates/next/files/components/ui/index.js +47 -2
  454. package/templates/next/files/components/ui/input-group.jsx +213 -0
  455. package/templates/next/files/components/ui/input-otp.jsx +170 -0
  456. package/templates/next/files/components/ui/item.jsx +206 -0
  457. package/templates/next/files/components/ui/menu.jsx +454 -82
  458. package/templates/next/files/components/ui/notice.jsx +126 -14
  459. package/templates/next/files/components/ui/pagination.jsx +156 -0
  460. package/templates/next/files/components/ui/popover.jsx +284 -0
  461. package/templates/next/files/components/ui/radio.jsx +193 -0
  462. package/templates/next/files/components/ui/rating.jsx +131 -0
  463. package/templates/next/files/components/ui/resizable.jsx +338 -0
  464. package/templates/next/files/components/ui/scroll-area.jsx +123 -0
  465. package/templates/next/files/components/ui/separator.jsx +119 -0
  466. package/templates/next/files/components/ui/sheet.jsx +96 -11
  467. package/templates/next/files/components/ui/slider.jsx +174 -0
  468. package/templates/next/files/components/ui/stat.jsx +574 -0
  469. package/templates/next/files/components/ui/steps.jsx +338 -0
  470. package/templates/next/files/components/ui/swatch.jsx +33 -0
  471. package/templates/next/files/components/ui/table.jsx +130 -0
  472. package/templates/next/files/components/ui/toast.jsx +440 -0
  473. package/templates/next/files/components/ui/toggle.jsx +195 -0
  474. package/templates/next/files/components/ui/tooltip.jsx +270 -0
  475. package/templates/next/template.json +264 -8
@@ -0,0 +1,588 @@
1
+ "use client";
2
+
3
+ // The DataTable over sixty invoices in memory — the gallery's and the
4
+ // smoke test's surface. Not installed into apps: `makersclaw add
5
+ // data-table` lays index.js, data-table.jsx and model.js only.
6
+ import { useMemo, useState } from "react";
7
+ import { Badge, Button, Card, Image, Kbd, Sheet, Stat, StatGroup, ToggleGroup, Tooltip, toast } from "../components/ui";
8
+ import { DataTable } from "../components/blocks/data-table";
9
+
10
+ const CUSTOMERS = [
11
+ ["Northwind Traders", "Maya Okafor"],
12
+ ["Acme Logistics", "Leon Brandt"],
13
+ ["Globex Studio", "Priya Raman"],
14
+ ["Initech Labs", "Tomás Ferreira"],
15
+ ["Umbrella Health", "Hana Sato"],
16
+ ["Hooli Partners", "Grace Mensah"],
17
+ ["Vandelay Imports", "Art Kowalski"],
18
+ ["Pied Piper Media", "Dinah Laurent"],
19
+ ["Stark Kitchens", "Noah Whitfield"],
20
+ ["Wayne Freight", "Ines Albrecht"],
21
+ ["Cyberdyne Retail", "Kofi Asante"],
22
+ ["Soylent Foods", "Ruth Adeyemi"],
23
+ ["Tyrell Design", "Oskar Lind"],
24
+ ["Monarch Dental", "Lucía Romero"],
25
+ ["Bluth Properties", "Sam Carter"],
26
+ ];
27
+ const OWNERS = ["Maya", "Leon", "Priya", "Tomás"];
28
+ const METHODS = ["Card", "Bank transfer", "Direct debit"];
29
+ const TODAY = "2026-09-23";
30
+
31
+ const ascii = (s) => s.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase();
32
+
33
+ function day(offset) {
34
+ const d = new Date(Date.UTC(2026, 4, 20) + offset * 86400000);
35
+ return d.toISOString().slice(0, 10);
36
+ }
37
+
38
+ // Sixty invoices, the same every render: a small seeded generator, so the
39
+ // gallery shot does not change between runs.
40
+ function makeInvoices() {
41
+ let seed = 7;
42
+ const rnd = () => {
43
+ seed = (seed * 16807) % 2147483647;
44
+ return seed / 2147483647;
45
+ };
46
+ return Array.from({ length: 60 }, (_, i) => {
47
+ const [customer, contact] = CUSTOMERS[Math.floor(rnd() * CUSTOMERS.length)];
48
+ const issued = day(i * 2 + Math.floor(rnd() * 2));
49
+ const due = new Date(Date.parse(issued) + 30 * 86400000).toISOString().slice(0, 10);
50
+ const r = rnd();
51
+ const status = i > 55 && r < 0.6 ? "draft" : r < 0.55 ? "paid" : due < TODAY ? (r < 0.8 ? "overdue" : "paid") : "pending";
52
+ return {
53
+ id: `inv-${2041 + i}`,
54
+ number: `INV-${2041 + i}`,
55
+ customer,
56
+ email: `${ascii(contact.split(" ")[0])}@${customer.split(" ")[0].toLowerCase()}.com`,
57
+ status,
58
+ amount: Math.round((200 + rnd() * 9800) / 5) * 5,
59
+ issued,
60
+ due,
61
+ owner: OWNERS[Math.floor(rnd() * OWNERS.length)],
62
+ method: METHODS[Math.floor(rnd() * METHODS.length)],
63
+ };
64
+ }).reverse();
65
+ }
66
+
67
+ const STATUS = {
68
+ paid: { label: "Paid", tone: "success" },
69
+ pending: { label: "Pending", tone: "info" },
70
+ overdue: { label: "Overdue", tone: "danger" },
71
+ draft: { label: "Draft", tone: "neutral" },
72
+ };
73
+ const money = (n) => `$${Number(n).toLocaleString("en-US", { minimumFractionDigits: 2 })}`;
74
+ const date = (s) => new Date(`${s}T00:00:00Z`).toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric", timeZone: "UTC" });
75
+
76
+ const COLUMNS = [
77
+ { key: "number", header: "Invoice", sortable: true, width: "8rem", hideable: false, cell: (r) => <span className="font-medium">{r.number}</span> },
78
+ {
79
+ key: "customer",
80
+ header: "Customer",
81
+ sortable: true,
82
+ searchValue: (r) => `${r.customer} ${r.email}`,
83
+ cell: (r) => (
84
+ <span className="block leading-tight">
85
+ <span className="block">{r.customer}</span>
86
+ <span className="block text-xs text-muted-foreground">{r.email}</span>
87
+ </span>
88
+ ),
89
+ },
90
+ {
91
+ key: "status",
92
+ header: "Status",
93
+ sortable: true,
94
+ sortValue: (r) => ["overdue", "pending", "draft", "paid"].indexOf(r.status),
95
+ searchValue: (r) => STATUS[r.status].label,
96
+ cell: (r) => <Badge tone={STATUS[r.status].tone}>{STATUS[r.status].label}</Badge>,
97
+ },
98
+ { key: "amount", header: "Amount", sortable: true, align: "end", cell: (r) => money(r.amount) },
99
+ { key: "issued", header: "Issued", sortable: true, cell: (r) => date(r.issued) },
100
+ { key: "due", header: "Due", sortable: true, cell: (r) => date(r.due) },
101
+ { key: "owner", header: "Owner", sortable: true },
102
+ { key: "method", header: "Method", hidden: true },
103
+ ];
104
+
105
+ const FACETS = [
106
+ { key: "status", label: "Status", options: Object.entries(STATUS).map(([value, s]) => ({ value, label: s.label })) },
107
+ { key: "owner", label: "Owner" },
108
+ ];
109
+
110
+ // A budget: line items filed under departments, six months wide — wider
111
+ // than the window, so it scrolls sideways under a sticky first column.
112
+ const MONTHS = ["jan", "feb", "mar", "apr", "may", "jun"];
113
+ const BUDGET = [
114
+ ["Engineering", "Cloud hosting", 4200, 180],
115
+ ["Engineering", "Contractors", 9000, -400],
116
+ ["Engineering", "Dev tools", 1300, 40],
117
+ ["Marketing", "Paid search", 6000, 350],
118
+ ["Marketing", "Events", 2500, 900],
119
+ ["Marketing", "Content", 1800, 0],
120
+ ["Operations", "Office", 3100, 0],
121
+ ["Operations", "Insurance", 900, 0],
122
+ ["Operations", "Legal", 1500, 250],
123
+ ].map(([department, item, base, step], i) => {
124
+ const months = Object.fromEntries(MONTHS.map((m, j) => [m, base + step * j]));
125
+ return { id: `b${i}`, department, item, ...months, total: MONTHS.reduce((s, m) => s + months[m], 0) };
126
+ });
127
+ const whole = (n) => `$${Number(n).toLocaleString("en-US")}`;
128
+ const sumOf = (rows, key) => rows.reduce((s, r) => s + r[key], 0);
129
+ const sums = (rows) => Object.fromEntries([...MONTHS, "total"].map((k) => [k, whole(sumOf(rows, k))]));
130
+ const BUDGET_COLUMNS = [
131
+ { key: "item", header: "Line item", sortable: true, hideable: false, cell: (r) => <span className="font-medium">{r.item}</span> },
132
+ ...MONTHS.map((m) => ({ key: m, header: m.charAt(0).toUpperCase() + m.slice(1), align: "end", sortable: true, cell: (r) => whole(r[m]) })),
133
+ { key: "total", header: "Six months", align: "end", sortable: true, cell: (r) => <span className="font-medium">{whole(r.total)}</span> },
134
+ ];
135
+
136
+ function Budget() {
137
+ return (
138
+ <DataTable
139
+ label="Budget"
140
+ noun="line item"
141
+ rows={BUDGET}
142
+ columns={BUDGET_COLUMNS}
143
+ searchable={false}
144
+ paginate={false}
145
+ keyboard
146
+ stickyFirstColumn
147
+ groupBy="department"
148
+ groupOrder={["Engineering", "Marketing"]}
149
+ groupSummary={(rows) => `${whole(sumOf(rows, "total"))} over six months`}
150
+ groupFooter={sums}
151
+ totals={sums}
152
+ defaultSort={[{ key: "total", dir: "desc" }]}
153
+ />
154
+ );
155
+ }
156
+
157
+ // Tasks with their actions as buttons in the row: what a task can do
158
+ // depends on its state, each press may take a moment, and one can fail.
159
+ const TASK_STATUS = {
160
+ todo: { label: "To do", tone: "warning" },
161
+ doing: { label: "In progress", tone: "info" },
162
+ done: { label: "Done", tone: "success" },
163
+ blocked: { label: "Blocked", tone: "danger" },
164
+ };
165
+ const TASKS = [
166
+ { id: "T-118", title: "Move billing to usage pricing", assignee: "Priya Raman", status: "doing", due: "2026-09-29", notes: "Metering is live on staging; the invoice template still shows seats." },
167
+ { id: "T-121", title: "Redesign the onboarding checklist", assignee: "Leon Brandt", status: "done", due: "2026-09-18", notes: "Shipped behind a flag to a tenth of new workspaces." },
168
+ { id: "T-124", title: "Cut cold start on the report page", assignee: "Hana Sato", status: "todo", due: "2026-10-02", notes: "Cache the chart queries per workspace for five minutes." },
169
+ { id: "T-127", title: "Write tests for the export job", assignee: "Tomás Ferreira", status: "doing", due: "2026-10-06", notes: "Cover the CSV and the PDF paths, and a job that times out." },
170
+ { id: "T-130", title: "Rotate the warehouse credentials", assignee: "Grace Mensah", status: "blocked", due: "2026-09-26", notes: "Waiting on the vendor to issue a second key." },
171
+ { id: "T-133", title: "Update the API changelog", assignee: "Oskar Lind", status: "todo", due: "2026-10-09", notes: "Three new endpoints and the pagination change." },
172
+ ];
173
+ const wait = (ms) => new Promise((r) => setTimeout(r, ms));
174
+
175
+ function Tasks() {
176
+ const [tasks, setTasks] = useState(TASKS);
177
+ const set = (id, status) => setTasks((all) => all.map((t) => (t.id === id ? { ...t, status } : t)));
178
+ return (
179
+ <DataTable
180
+ label="Tasks"
181
+ noun="task"
182
+ rows={tasks}
183
+ columns={[
184
+ { key: "title", header: "Task", sortable: true, hideable: false, cell: (r) => <span className="font-medium">{r.title}</span> },
185
+ { key: "assignee", header: "Assignee", sortable: true },
186
+ {
187
+ key: "status",
188
+ header: "Status",
189
+ sortable: true,
190
+ sortValue: (r) => ["blocked", "doing", "todo", "done"].indexOf(r.status),
191
+ cell: (r) => <Badge tone={TASK_STATUS[r.status].tone}>{TASK_STATUS[r.status].label}</Badge>,
192
+ },
193
+ { key: "due", header: "Due", sortable: true, cell: (r) => date(r.due) },
194
+ {
195
+ key: "notes",
196
+ header: "Notes",
197
+ searchable: true,
198
+ cell: (r) => (
199
+ <Tooltip label={r.notes}>
200
+ <span tabIndex={0} className="block max-w-56 truncate text-muted-foreground">
201
+ {r.notes}
202
+ </span>
203
+ </Tooltip>
204
+ ),
205
+ },
206
+ ]}
207
+ facets={[{ key: "status", label: "Status", options: Object.entries(TASK_STATUS).map(([value, s]) => ({ value, label: s.label })) }]}
208
+ paginate={false}
209
+ mobile="cards"
210
+ rowActions={(r) => [
211
+ (r.status === "todo" || r.status === "blocked") && {
212
+ label: "Start",
213
+ icon: "play",
214
+ inline: true,
215
+ onSelect: async () => {
216
+ await wait(600);
217
+ set(r.id, "doing");
218
+ },
219
+ },
220
+ r.status === "doing" && {
221
+ label: "Pause",
222
+ icon: "pause",
223
+ inline: true,
224
+ onSelect: async () => {
225
+ await wait(600);
226
+ set(r.id, "todo");
227
+ },
228
+ },
229
+ r.status === "doing" && {
230
+ label: "Complete",
231
+ icon: "check",
232
+ inline: true,
233
+ onSelect: async () => {
234
+ await wait(600);
235
+ set(r.id, "done");
236
+ toast.success(`${r.id} done`);
237
+ },
238
+ },
239
+ {
240
+ label: "Delete",
241
+ icon: "trash",
242
+ tone: "danger",
243
+ inline: true,
244
+ onSelect: async () => {
245
+ await wait(600);
246
+ if (r.status === "doing") return { ok: false, error: "pause it before deleting it." };
247
+ setTasks((all) => all.filter((t) => t.id !== r.id));
248
+ return { ok: true };
249
+ },
250
+ },
251
+ { label: "Copy ID", icon: "copy", onSelect: () => toast(`${r.id} copied`) },
252
+ { type: "separator" },
253
+ { label: "Open details", icon: "file", onSelect: () => toast(`Opening ${r.id}`) },
254
+ ]}
255
+ emptyTitle="No tasks"
256
+ />
257
+ );
258
+ }
259
+
260
+ // One order and its items: a summary above, the items as rows with a
261
+ // View button in each (a demo of the table, not a new prop).
262
+ const ORDER = { number: "#40318", placed: "2026-09-14", total: 1265 };
263
+ const ORDER_ITEMS = [
264
+ { id: "oi-1", product: "Walnut standing desk", variant: "140 × 70 cm", amount: 690, status: "delivered", date: "2026-09-17" },
265
+ { id: "oi-2", product: "Mesh task chair", variant: "Graphite", amount: 385, status: "shipped", date: "2026-09-19" },
266
+ { id: "oi-3", product: "Monitor arm", variant: "Dual, black", amount: 140, status: "processing", date: "2026-09-22" },
267
+ { id: "oi-4", product: "Felt desk mat", variant: "Large, stone", amount: 50, status: "returned", date: "2026-09-18" },
268
+ ];
269
+ const ORDER_STATUS = {
270
+ delivered: { label: "Delivered", tone: "success" },
271
+ shipped: { label: "Shipped", tone: "info" },
272
+ processing: { label: "Processing", tone: "neutral" },
273
+ returned: { label: "Returned", tone: "warning" },
274
+ };
275
+
276
+ function Orders() {
277
+ const [open, setOpen] = useState(null);
278
+ return (
279
+ <section className="grid gap-4">
280
+ <div>
281
+ <h2 className="text-lg font-semibold">Order history</h2>
282
+ <p className="mt-1 text-sm text-muted-foreground">Your recent orders, and the invoice for each.</p>
283
+ </div>
284
+ <Card padding="none" className="flex flex-wrap items-center justify-between gap-4 p-4">
285
+ <StatGroup variant="divided" columns={3} className="min-w-0 flex-1">
286
+ <Stat label="Order" value={ORDER.number} size="sm" />
287
+ <Stat label="Placed" value={date(ORDER.placed)} size="sm" />
288
+ <Stat label="Total" value={money(ORDER.total)} size="sm" />
289
+ </StatGroup>
290
+ <Button variant="primary" icon="download" onClick={() => toast(`Invoice for ${ORDER.number} downloaded`)}>
291
+ View invoice
292
+ </Button>
293
+ </Card>
294
+ <DataTable
295
+ label={`Items in order ${ORDER.number}`}
296
+ noun="item"
297
+ rows={ORDER_ITEMS}
298
+ searchable={false}
299
+ paginate={false}
300
+ mobile="cards"
301
+ columns={[
302
+ {
303
+ key: "product",
304
+ header: "Product",
305
+ hideable: false,
306
+ sortable: true,
307
+ cell: (r) => (
308
+ <span className="flex items-center gap-3">
309
+ <Image alt="" ratio="square" className="size-12 shrink-0" />
310
+ <span className="min-w-0 leading-tight">
311
+ <span className="block font-medium">{r.product}</span>
312
+ <span className="block text-xs text-muted-foreground">{r.variant}</span>
313
+ </span>
314
+ </span>
315
+ ),
316
+ },
317
+ { key: "amount", header: "Amount", align: "end", sortable: true, cell: (r) => money(r.amount) },
318
+ { key: "status", header: "Status", sortable: true, cell: (r) => <Badge tone={ORDER_STATUS[r.status].tone}>{ORDER_STATUS[r.status].label}</Badge> },
319
+ { key: "date", header: "Updated", sortable: true, cell: (r) => date(r.date) },
320
+ ]}
321
+ inlineActions={1}
322
+ rowActions={(r) => [
323
+ { label: "View", onSelect: () => setOpen(r) },
324
+ r.status === "shipped" && { label: "Track parcel", icon: "truck", onSelect: () => toast(`Tracking ${r.product}`) },
325
+ r.status === "delivered" && { label: "Return item", icon: "repeat", onSelect: () => toast(`Return started for ${r.product}`) },
326
+ { label: "Buy again", icon: "shopping-cart", onSelect: () => toast(`${r.product} added to cart`) },
327
+ ]}
328
+ totals={{ amount: money(ORDER_ITEMS.reduce((n, r) => n + r.amount, 0)) }}
329
+ />
330
+ <Sheet open={Boolean(open)} onClose={() => setOpen(null)} title={open?.product} description={open?.variant}>
331
+ {open ? (
332
+ <dl className="grid grid-cols-2 gap-3 text-sm">
333
+ <dt className="text-muted-foreground">Amount</dt>
334
+ <dd data-nums>{money(open.amount)}</dd>
335
+ <dt className="text-muted-foreground">Status</dt>
336
+ <dd>
337
+ <Badge tone={ORDER_STATUS[open.status].tone}>{ORDER_STATUS[open.status].label}</Badge>
338
+ </dd>
339
+ <dt className="text-muted-foreground">Updated</dt>
340
+ <dd>{date(open.date)}</dd>
341
+ </dl>
342
+ ) : null}
343
+ </Sheet>
344
+ </section>
345
+ );
346
+ }
347
+
348
+ export default function DataTableDemo() {
349
+ const [view, setView] = useState("invoices");
350
+ const views = (
351
+ <ToggleGroup
352
+ size="sm"
353
+ aria-label="Example"
354
+ value={view}
355
+ onChange={setView}
356
+ items={[
357
+ { value: "invoices", label: "Invoices" },
358
+ { value: "tasks", label: "Tasks" },
359
+ { value: "orders", label: "Orders" },
360
+ ]}
361
+ />
362
+ );
363
+ if (view === "tasks") {
364
+ return (
365
+ <div className="grid gap-4">
366
+ {views}
367
+ <Tasks />
368
+ </div>
369
+ );
370
+ }
371
+ if (view === "orders") {
372
+ return (
373
+ <div className="grid gap-4">
374
+ {views}
375
+ <Orders />
376
+ </div>
377
+ );
378
+ }
379
+ return (
380
+ <div className="grid gap-4">
381
+ {views}
382
+ <Invoices />
383
+ </div>
384
+ );
385
+ }
386
+
387
+ function Invoices() {
388
+ const [rows, setRows] = useState(makeInvoices);
389
+ const [state, setState] = useState("data");
390
+ const [mobile, setMobile] = useState("scroll");
391
+ const [open, setOpen] = useState(null);
392
+ const [group, setGroup] = useState("none");
393
+
394
+ const outstanding = useMemo(() => rows.filter((r) => r.status === "pending" || r.status === "overdue").reduce((s, r) => s + r.amount, 0), [rows]);
395
+
396
+ function markPaid(list) {
397
+ const ids = new Set(list.map((r) => r.id));
398
+ setRows((all) => all.map((r) => (ids.has(r.id) ? { ...r, status: "paid" } : r)));
399
+ }
400
+ function remove(list) {
401
+ const ids = new Set(list.map((r) => r.id));
402
+ setRows((all) => all.filter((r) => !ids.has(r.id)));
403
+ }
404
+
405
+ return (
406
+ <div className="grid gap-4">
407
+ <div className="flex flex-wrap items-center gap-2">
408
+ <ToggleGroup
409
+ size="sm"
410
+ aria-label="Demo state"
411
+ value={state}
412
+ onChange={setState}
413
+ items={[
414
+ { value: "data", label: "Invoices" },
415
+ { value: "loading", label: "Loading" },
416
+ { value: "empty", label: "Empty" },
417
+ ]}
418
+ />
419
+ <ToggleGroup
420
+ size="sm"
421
+ aria-label="On a phone"
422
+ value={mobile}
423
+ onChange={setMobile}
424
+ items={[
425
+ { value: "scroll", label: "Phone: scroll" },
426
+ { value: "cards", label: "Phone: cards" },
427
+ ]}
428
+ />
429
+ <ToggleGroup
430
+ size="sm"
431
+ aria-label="Group by"
432
+ value={group}
433
+ onChange={setGroup}
434
+ items={[
435
+ { value: "none", label: "No groups" },
436
+ { value: "status", label: "By status" },
437
+ { value: "owner", label: "By owner" },
438
+ ]}
439
+ />
440
+ </div>
441
+ <p className="flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground">
442
+ <span className="inline-flex items-center gap-1">
443
+ <Kbd>↑</Kbd>
444
+ <Kbd>↓</Kbd> move
445
+ </span>
446
+ <span className="inline-flex items-center gap-1">
447
+ <Kbd>Space</Kbd> select
448
+ </span>
449
+ <span className="inline-flex items-center gap-1">
450
+ <Kbd>→</Kbd>
451
+ <Kbd>←</Kbd> details
452
+ </span>
453
+ <span className="inline-flex items-center gap-1">
454
+ <Kbd>Enter</Kbd> open
455
+ </span>
456
+ <span className="inline-flex items-center gap-1">
457
+ <Kbd>Esc</Kbd> clear
458
+ </span>
459
+ </p>
460
+
461
+ <DataTable
462
+ label="Invoices"
463
+ noun="invoice"
464
+ rows={state === "empty" ? [] : rows}
465
+ loading={state === "loading"}
466
+ columns={COLUMNS}
467
+ facets={FACETS}
468
+ searchPlaceholder="Search invoices…"
469
+ defaultSort={[{ key: "issued", dir: "desc" }]}
470
+ mobile={mobile}
471
+ keyboard
472
+ stickyFirstColumn
473
+ groupBy={group === "none" ? undefined : group}
474
+ groupOrder={group === "status" ? ["overdue", "pending", "draft", "paid"] : undefined}
475
+ groupLabel={group === "status" ? (v) => STATUS[v]?.label ?? v : undefined}
476
+ groupSummary={(list) => money(sumOf(list, "amount"))}
477
+ groupFooter={(list) => ({ amount: money(sumOf(list, "amount")) })}
478
+ totals={(list) => ({ number: `${list.length} invoices`, amount: money(sumOf(list, "amount")) })}
479
+ defaultExpanded={["inv-2100"]}
480
+ renderExpanded={(r) => (
481
+ <dl className="grid grid-cols-2 gap-x-6 gap-y-2 text-sm sm:grid-cols-4">
482
+ <div>
483
+ <dt className="text-xs text-muted-foreground">Billing email</dt>
484
+ <dd className="truncate">{r.email}</dd>
485
+ </div>
486
+ <div>
487
+ <dt className="text-xs text-muted-foreground">Method</dt>
488
+ <dd>{r.method}</dd>
489
+ </div>
490
+ <div>
491
+ <dt className="text-xs text-muted-foreground">Owner</dt>
492
+ <dd>{r.owner}</dd>
493
+ </div>
494
+ <div>
495
+ <dt className="text-xs text-muted-foreground">Terms</dt>
496
+ <dd>Net 30</dd>
497
+ </div>
498
+ </dl>
499
+ )}
500
+ rowTone={(r) => (r.status === "overdue" ? "warning" : null)}
501
+ onRowClick={setOpen}
502
+ rowActions={(r) => [
503
+ { label: "Open", icon: "eye", onSelect: () => setOpen(r) },
504
+ r.status !== "paid" && r.status !== "draft" && { label: "Mark paid", icon: "check", onSelect: () => markPaid([r]) },
505
+ { label: "Copy number", icon: "copy", onSelect: () => toast(`${r.number} copied`) },
506
+ { type: "separator" },
507
+ { label: "Delete", icon: "trash", tone: "danger", onSelect: () => remove([r]) },
508
+ ]}
509
+ bulkActions={[
510
+ {
511
+ label: "Mark paid",
512
+ icon: "check",
513
+ onSelect: async (list) => {
514
+ await new Promise((r) => setTimeout(r, 400));
515
+ const drafts = list.filter((r) => r.status === "draft");
516
+ if (drafts.length) return { ok: false, error: `${drafts.map((d) => d.number).join(", ")} ${drafts.length === 1 ? "is a draft" : "are drafts"}; send before marking paid.` };
517
+ markPaid(list);
518
+ toast.success(`${list.length} marked paid`);
519
+ return { ok: true };
520
+ },
521
+ },
522
+ { label: "Export", icon: "download", keepSelection: true, onSelect: (list) => toast(`${list.length} invoices exported`) },
523
+ {
524
+ label: "Delete",
525
+ icon: "trash",
526
+ tone: "danger",
527
+ onSelect: (list) => {
528
+ remove(list);
529
+ toast(`${list.length} deleted`);
530
+ },
531
+ },
532
+ ]}
533
+ toolbar={
534
+ <Button
535
+ variant="primary"
536
+ icon="plus"
537
+ onClick={() => {
538
+ const n = 2041 + rows.length + Math.floor(Math.random() * 1000);
539
+ setRows((all) => [
540
+ { id: `inv-${n}`, number: `INV-${n}`, customer: "New customer", email: "billing@example.com", status: "draft", amount: 0, issued: TODAY, due: TODAY, owner: "Maya", method: "Card" },
541
+ ...all,
542
+ ]);
543
+ }}
544
+ >
545
+ New invoice
546
+ </Button>
547
+ }
548
+ footer={
549
+ state === "data" ? (
550
+ <p data-nums className="text-sm text-muted-foreground">
551
+ Outstanding across all invoices: <span className="font-medium text-foreground">{money(outstanding)}</span>
552
+ </p>
553
+ ) : null
554
+ }
555
+ emptyTitle="No invoices yet"
556
+ emptyBody="Invoices you send will be listed here."
557
+ emptyAction={
558
+ <Button variant="primary" icon="plus" onClick={() => setState("data")}>
559
+ New invoice
560
+ </Button>
561
+ }
562
+ />
563
+
564
+ <Budget />
565
+
566
+ <Sheet open={Boolean(open)} onClose={() => setOpen(null)} title={open?.number} description={open?.customer}>
567
+ {open ? (
568
+ <dl className="grid grid-cols-2 gap-3 text-sm">
569
+ <dt className="text-muted-foreground">Status</dt>
570
+ <dd>
571
+ <Badge tone={STATUS[open.status].tone}>{STATUS[open.status].label}</Badge>
572
+ </dd>
573
+ <dt className="text-muted-foreground">Amount</dt>
574
+ <dd data-nums>{money(open.amount)}</dd>
575
+ <dt className="text-muted-foreground">Issued</dt>
576
+ <dd>{date(open.issued)}</dd>
577
+ <dt className="text-muted-foreground">Due</dt>
578
+ <dd>{date(open.due)}</dd>
579
+ <dt className="text-muted-foreground">Owner</dt>
580
+ <dd>{open.owner}</dd>
581
+ <dt className="text-muted-foreground">Billing email</dt>
582
+ <dd className="truncate">{open.email}</dd>
583
+ </dl>
584
+ ) : null}
585
+ </Sheet>
586
+ </div>
587
+ );
588
+ }
@@ -0,0 +1,5 @@
1
+ // The DataTable block — `makersclaw add data-table`. Fixed: compose it
2
+ // through its props (README.md beside this file); a table it cannot be is
3
+ // your own component in components/, built from the kit's Table parts.
4
+ export { DataTable } from "./data-table";
5
+ export { useControllable, processRows, sortRows, searchRows, filterRows, facetOptions, nextSort, groupRows, groupValueOf } from "./model";