makersclaw 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (473) hide show
  1. package/THIRD-PARTY-NOTICES.md +180 -0
  2. package/package.json +3 -2
  3. package/r/annotate.json +62 -0
  4. package/r/approval-request.json +52 -0
  5. package/r/audio-player.json +74 -0
  6. package/r/auth-form.json +55 -0
  7. package/r/board.json +10 -6
  8. package/r/calendar-view.json +105 -0
  9. package/r/cart.json +62 -0
  10. package/r/chart.json +83 -0
  11. package/r/chat.json +95 -0
  12. package/r/code-editor.json +94 -0
  13. package/r/comment-box.json +64 -0
  14. package/r/contact-section.json +53 -0
  15. package/r/core.json +205 -8
  16. package/r/csv-import.json +63 -0
  17. package/r/data-table.json +69 -0
  18. package/r/diagram.json +74 -0
  19. package/r/doc-editor.json +82 -0
  20. package/r/doc-page.json +61 -0
  21. package/r/email-render.json +73 -0
  22. package/r/faq.json +50 -0
  23. package/r/file-upload.json +54 -0
  24. package/r/flow-canvas.json +93 -0
  25. package/r/footer.json +52 -0
  26. package/r/gantt.json +70 -0
  27. package/r/job-panel.json +12 -7
  28. package/r/json-editor.json +66 -0
  29. package/r/map.json +89 -0
  30. package/r/menubar.json +52 -0
  31. package/r/mind-map.json +67 -0
  32. package/r/navigation-menu.json +52 -0
  33. package/r/order-detail.json +54 -0
  34. package/r/org-chart.json +66 -0
  35. package/r/page-builder.json +105 -0
  36. package/r/payment-methods.json +51 -0
  37. package/r/pdf-document.json +79 -0
  38. package/r/pdf-viewer.json +88 -0
  39. package/r/product-detail.json +76 -0
  40. package/r/product-grid.json +65 -0
  41. package/r/record-form.json +67 -0
  42. package/r/record-notes.json +55 -0
  43. package/r/registry.json +3411 -29
  44. package/r/search-dialog.json +51 -0
  45. package/r/settings-list.json +66 -0
  46. package/r/setup-checklist.json +51 -0
  47. package/r/share-dialog.json +52 -0
  48. package/r/sidebar.json +69 -0
  49. package/r/signature-pad.json +72 -0
  50. package/r/sketch-canvas.json +99 -0
  51. package/r/spreadsheet.json +90 -0
  52. package/r/stat-cards.json +66 -0
  53. package/r/task-list.json +63 -0
  54. package/r/task-model.json +98 -0
  55. package/r/testimonials.json +52 -0
  56. package/r/transaction-list.json +53 -0
  57. package/r/whiteboard.json +66 -0
  58. package/registry/blocks/annotate/README.md +179 -0
  59. package/registry/blocks/annotate/annotate-data.js +250 -0
  60. package/registry/blocks/annotate/annotate.jsx +646 -0
  61. package/registry/blocks/annotate/block.json +10 -0
  62. package/registry/blocks/annotate/demo.jsx +135 -0
  63. package/registry/blocks/annotate/index.js +15 -0
  64. package/registry/blocks/approval-request/README.md +116 -0
  65. package/registry/blocks/approval-request/approval-request.jsx +386 -0
  66. package/registry/blocks/approval-request/block.json +10 -0
  67. package/registry/blocks/approval-request/demo.jsx +127 -0
  68. package/registry/blocks/approval-request/index.js +4 -0
  69. package/registry/blocks/audio-player/README.md +167 -0
  70. package/registry/blocks/audio-player/audio-player.jsx +623 -0
  71. package/registry/blocks/audio-player/block.json +14 -0
  72. package/registry/blocks/audio-player/colors.js +109 -0
  73. package/registry/blocks/audio-player/demo.jsx +209 -0
  74. package/registry/blocks/audio-player/index.js +6 -0
  75. package/registry/blocks/audio-player/time.js +67 -0
  76. package/registry/blocks/audio-player/wavesurfer.js +9 -0
  77. package/registry/blocks/auth-form/README.md +126 -0
  78. package/registry/blocks/auth-form/auth-form.jsx +568 -0
  79. package/registry/blocks/auth-form/block.json +10 -0
  80. package/registry/blocks/auth-form/demo.jsx +131 -0
  81. package/registry/blocks/auth-form/index.js +3 -0
  82. package/registry/blocks/board/README.md +55 -5
  83. package/registry/blocks/board/block.json +2 -2
  84. package/registry/blocks/board/board.jsx +230 -86
  85. package/registry/blocks/board/demo.jsx +103 -24
  86. package/registry/blocks/calendar-view/README.md +180 -0
  87. package/registry/blocks/calendar-view/agenda.jsx +147 -0
  88. package/registry/blocks/calendar-view/block.json +76 -0
  89. package/registry/blocks/calendar-view/calendar-model.js +442 -0
  90. package/registry/blocks/calendar-view/calendar.jsx +627 -0
  91. package/registry/blocks/calendar-view/demo.jsx +195 -0
  92. package/registry/blocks/calendar-view/draft.jsx +49 -0
  93. package/registry/blocks/calendar-view/index.js +39 -0
  94. package/registry/blocks/calendar-view/month.jsx +346 -0
  95. package/registry/blocks/calendar-view/paint.js +69 -0
  96. package/registry/blocks/calendar-view/time-grid.jsx +527 -0
  97. package/registry/blocks/calendar-view/tray.jsx +87 -0
  98. package/registry/blocks/cart/README.md +146 -0
  99. package/registry/blocks/cart/block.json +10 -0
  100. package/registry/blocks/cart/cart.jsx +597 -0
  101. package/registry/blocks/cart/demo.jsx +98 -0
  102. package/registry/blocks/cart/index.js +4 -0
  103. package/registry/blocks/cart/money.js +28 -0
  104. package/registry/blocks/chart/README.md +316 -0
  105. package/registry/blocks/chart/block.json +10 -0
  106. package/registry/blocks/chart/cartesian.jsx +642 -0
  107. package/registry/blocks/chart/core.jsx +262 -0
  108. package/registry/blocks/chart/demo.jsx +357 -0
  109. package/registry/blocks/chart/heatmap.jsx +336 -0
  110. package/registry/blocks/chart/index.js +8 -0
  111. package/registry/blocks/chart/pie.jsx +245 -0
  112. package/registry/blocks/chart/sparkline.jsx +88 -0
  113. package/registry/blocks/chat/README.md +273 -0
  114. package/registry/blocks/chat/attachment.jsx +95 -0
  115. package/registry/blocks/chat/block.json +10 -0
  116. package/registry/blocks/chat/chat.jsx +132 -0
  117. package/registry/blocks/chat/composer.jsx +364 -0
  118. package/registry/blocks/chat/demo.jsx +578 -0
  119. package/registry/blocks/chat/header.jsx +34 -0
  120. package/registry/blocks/chat/index.js +9 -0
  121. package/registry/blocks/chat/message.jsx +450 -0
  122. package/registry/blocks/chat/scroller.jsx +247 -0
  123. package/registry/blocks/chat/text.jsx +104 -0
  124. package/registry/blocks/code-editor/README.md +210 -0
  125. package/registry/blocks/code-editor/block.json +22 -0
  126. package/registry/blocks/code-editor/code-editor.jsx +534 -0
  127. package/registry/blocks/code-editor/codemirror.js +38 -0
  128. package/registry/blocks/code-editor/demo.jsx +205 -0
  129. package/registry/blocks/code-editor/index.js +8 -0
  130. package/registry/blocks/code-editor/json.js +317 -0
  131. package/registry/blocks/code-editor/sql.js +136 -0
  132. package/registry/blocks/code-editor/text.js +101 -0
  133. package/registry/blocks/code-editor/theme.js +186 -0
  134. package/registry/blocks/comment-box/README.md +123 -0
  135. package/registry/blocks/comment-box/block.json +10 -0
  136. package/registry/blocks/comment-box/comment-body.jsx +217 -0
  137. package/registry/blocks/comment-box/comment-box.jsx +198 -0
  138. package/registry/blocks/comment-box/comment-time.jsx +77 -0
  139. package/registry/blocks/comment-box/demo.jsx +141 -0
  140. package/registry/blocks/comment-box/index.js +8 -0
  141. package/registry/blocks/contact-section/README.md +152 -0
  142. package/registry/blocks/contact-section/block.json +11 -0
  143. package/registry/blocks/contact-section/contact-section.jsx +509 -0
  144. package/registry/blocks/contact-section/demo.jsx +93 -0
  145. package/registry/blocks/contact-section/index.js +4 -0
  146. package/registry/blocks/csv-import/README.md +133 -0
  147. package/registry/blocks/csv-import/block.json +13 -0
  148. package/registry/blocks/csv-import/csv-import.jsx +479 -0
  149. package/registry/blocks/csv-import/demo.jsx +106 -0
  150. package/registry/blocks/csv-import/import.js +200 -0
  151. package/registry/blocks/csv-import/index.js +7 -0
  152. package/registry/blocks/data-table/README.md +386 -0
  153. package/registry/blocks/data-table/block.json +10 -0
  154. package/registry/blocks/data-table/data-table.jsx +1164 -0
  155. package/registry/blocks/data-table/demo.jsx +588 -0
  156. package/registry/blocks/data-table/index.js +5 -0
  157. package/registry/blocks/data-table/model.js +169 -0
  158. package/registry/blocks/diagram/README.md +108 -0
  159. package/registry/blocks/diagram/block.json +13 -0
  160. package/registry/blocks/diagram/demo.jsx +113 -0
  161. package/registry/blocks/diagram/diagram.jsx +481 -0
  162. package/registry/blocks/diagram/index.js +7 -0
  163. package/registry/blocks/diagram/mermaid.js +52 -0
  164. package/registry/blocks/diagram/palette.js +313 -0
  165. package/registry/blocks/diagram/source.js +98 -0
  166. package/registry/blocks/doc-editor/README.md +215 -0
  167. package/registry/blocks/doc-editor/block.json +15 -0
  168. package/registry/blocks/doc-editor/demo.jsx +225 -0
  169. package/registry/blocks/doc-editor/doc-editor.jsx +291 -0
  170. package/registry/blocks/doc-editor/doc.js +309 -0
  171. package/registry/blocks/doc-editor/index.js +7 -0
  172. package/registry/blocks/doc-editor/schema.jsx +56 -0
  173. package/registry/blocks/doc-editor/shadcn-classes.js +110 -0
  174. package/registry/blocks/doc-editor/theme.js +82 -0
  175. package/registry/blocks/doc-page/README.md +119 -0
  176. package/registry/blocks/doc-page/autosave.js +104 -0
  177. package/registry/blocks/doc-page/block.json +10 -0
  178. package/registry/blocks/doc-page/demo.jsx +137 -0
  179. package/registry/blocks/doc-page/doc-page.jsx +276 -0
  180. package/registry/blocks/doc-page/index.js +4 -0
  181. package/registry/blocks/email-render/README.md +151 -0
  182. package/registry/blocks/email-render/block.json +14 -0
  183. package/registry/blocks/email-render/demo.jsx +153 -0
  184. package/registry/blocks/email-render/doc-email.jsx +210 -0
  185. package/registry/blocks/email-render/email.jsx +221 -0
  186. package/registry/blocks/email-render/index.js +10 -0
  187. package/registry/blocks/email-render/render.js +50 -0
  188. package/registry/blocks/email-render/theme.js +215 -0
  189. package/registry/blocks/faq/README.md +101 -0
  190. package/registry/blocks/faq/block.json +11 -0
  191. package/registry/blocks/faq/demo.jsx +89 -0
  192. package/registry/blocks/faq/faq.jsx +220 -0
  193. package/registry/blocks/faq/index.js +4 -0
  194. package/registry/blocks/file-upload/README.md +138 -0
  195. package/registry/blocks/file-upload/block.json +10 -0
  196. package/registry/blocks/file-upload/demo.jsx +204 -0
  197. package/registry/blocks/file-upload/file-upload.jsx +635 -0
  198. package/registry/blocks/file-upload/index.js +4 -0
  199. package/registry/blocks/flow-canvas/README.md +420 -0
  200. package/registry/blocks/flow-canvas/block.json +13 -0
  201. package/registry/blocks/flow-canvas/board.js +819 -0
  202. package/registry/blocks/flow-canvas/chrome.jsx +649 -0
  203. package/registry/blocks/flow-canvas/context.jsx +35 -0
  204. package/registry/blocks/flow-canvas/demo.jsx +249 -0
  205. package/registry/blocks/flow-canvas/edges.jsx +107 -0
  206. package/registry/blocks/flow-canvas/flow-canvas.jsx +1329 -0
  207. package/registry/blocks/flow-canvas/index.js +41 -0
  208. package/registry/blocks/flow-canvas/nodes.jsx +392 -0
  209. package/registry/blocks/flow-canvas/theme.js +174 -0
  210. package/registry/blocks/footer/README.md +133 -0
  211. package/registry/blocks/footer/block.json +11 -0
  212. package/registry/blocks/footer/demo.jsx +119 -0
  213. package/registry/blocks/footer/footer.jsx +406 -0
  214. package/registry/blocks/footer/index.js +4 -0
  215. package/registry/blocks/gantt/README.md +220 -0
  216. package/registry/blocks/gantt/block.json +10 -0
  217. package/registry/blocks/gantt/demo.jsx +148 -0
  218. package/registry/blocks/gantt/gantt.jsx +923 -0
  219. package/registry/blocks/gantt/index.js +7 -0
  220. package/registry/blocks/gantt/rows.jsx +468 -0
  221. package/registry/blocks/gantt/schedule.js +278 -0
  222. package/registry/blocks/job-panel/README.md +80 -0
  223. package/registry/blocks/job-panel/block.json +3 -3
  224. package/registry/blocks/job-panel/demo.jsx +230 -3
  225. package/registry/blocks/job-panel/job-panel.jsx +169 -3
  226. package/registry/blocks/json-editor/README.md +133 -0
  227. package/registry/blocks/json-editor/block.json +10 -0
  228. package/registry/blocks/json-editor/demo.jsx +92 -0
  229. package/registry/blocks/json-editor/index.js +7 -0
  230. package/registry/blocks/json-editor/json-editor.jsx +305 -0
  231. package/registry/blocks/json-editor/json-tree.jsx +393 -0
  232. package/registry/blocks/json-editor/tree.js +225 -0
  233. package/registry/blocks/map/README.md +221 -0
  234. package/registry/blocks/map/block.json +14 -0
  235. package/registry/blocks/map/demo.jsx +201 -0
  236. package/registry/blocks/map/geo.js +198 -0
  237. package/registry/blocks/map/index.js +8 -0
  238. package/registry/blocks/map/list.jsx +128 -0
  239. package/registry/blocks/map/map-view.jsx +715 -0
  240. package/registry/blocks/map/maplibre.js +30 -0
  241. package/registry/blocks/map/marks.jsx +146 -0
  242. package/registry/blocks/map/theme.js +142 -0
  243. package/registry/blocks/menubar/README.md +109 -0
  244. package/registry/blocks/menubar/block.json +10 -0
  245. package/registry/blocks/menubar/demo.jsx +128 -0
  246. package/registry/blocks/menubar/index.js +4 -0
  247. package/registry/blocks/menubar/menubar.jsx +199 -0
  248. package/registry/blocks/mind-map/README.md +206 -0
  249. package/registry/blocks/mind-map/block.json +10 -0
  250. package/registry/blocks/mind-map/demo.jsx +103 -0
  251. package/registry/blocks/mind-map/index.js +31 -0
  252. package/registry/blocks/mind-map/mind-map.jsx +1125 -0
  253. package/registry/blocks/mind-map/topic.jsx +143 -0
  254. package/registry/blocks/mind-map/tree.js +645 -0
  255. package/registry/blocks/navigation-menu/README.md +124 -0
  256. package/registry/blocks/navigation-menu/block.json +10 -0
  257. package/registry/blocks/navigation-menu/demo.jsx +84 -0
  258. package/registry/blocks/navigation-menu/index.js +4 -0
  259. package/registry/blocks/navigation-menu/navigation-menu.jsx +448 -0
  260. package/registry/blocks/order-detail/README.md +109 -0
  261. package/registry/blocks/order-detail/block.json +10 -0
  262. package/registry/blocks/order-detail/demo.jsx +88 -0
  263. package/registry/blocks/order-detail/index.js +4 -0
  264. package/registry/blocks/order-detail/order-detail.jsx +354 -0
  265. package/registry/blocks/org-chart/README.md +145 -0
  266. package/registry/blocks/org-chart/block.json +10 -0
  267. package/registry/blocks/org-chart/demo.jsx +94 -0
  268. package/registry/blocks/org-chart/index.js +7 -0
  269. package/registry/blocks/org-chart/org-chart.jsx +631 -0
  270. package/registry/blocks/org-chart/org.js +245 -0
  271. package/registry/blocks/org-chart/person.jsx +96 -0
  272. package/registry/blocks/page-builder/README.md +257 -0
  273. package/registry/blocks/page-builder/block.json +14 -0
  274. package/registry/blocks/page-builder/demo.jsx +145 -0
  275. package/registry/blocks/page-builder/grapes.js +18 -0
  276. package/registry/blocks/page-builder/index.js +11 -0
  277. package/registry/blocks/page-builder/page-builder.jsx +704 -0
  278. package/registry/blocks/page-builder/page-view.jsx +33 -0
  279. package/registry/blocks/page-builder/page.js +118 -0
  280. package/registry/blocks/page-builder/panels.jsx +588 -0
  281. package/registry/blocks/page-builder/sections.js +209 -0
  282. package/registry/blocks/page-builder/theme.js +87 -0
  283. package/registry/blocks/page-builder/thumbs.jsx +189 -0
  284. package/registry/blocks/page-builder/tokens.js +329 -0
  285. package/registry/blocks/payment-methods/README.md +104 -0
  286. package/registry/blocks/payment-methods/block.json +10 -0
  287. package/registry/blocks/payment-methods/demo.jsx +71 -0
  288. package/registry/blocks/payment-methods/index.js +4 -0
  289. package/registry/blocks/payment-methods/payment-methods.jsx +302 -0
  290. package/registry/blocks/pdf-document/README.md +213 -0
  291. package/registry/blocks/pdf-document/block.json +13 -0
  292. package/registry/blocks/pdf-document/demo.jsx +136 -0
  293. package/registry/blocks/pdf-document/index.js +33 -0
  294. package/registry/blocks/pdf-document/money.js +83 -0
  295. package/registry/blocks/pdf-document/pdf-document.jsx +144 -0
  296. package/registry/blocks/pdf-document/primitives.jsx +271 -0
  297. package/registry/blocks/pdf-document/quote.jsx +179 -0
  298. package/registry/blocks/pdf-document/theme.js +193 -0
  299. package/registry/blocks/pdf-viewer/README.md +191 -0
  300. package/registry/blocks/pdf-viewer/block.json +14 -0
  301. package/registry/blocks/pdf-viewer/demo.jsx +252 -0
  302. package/registry/blocks/pdf-viewer/helpers.js +270 -0
  303. package/registry/blocks/pdf-viewer/index.js +8 -0
  304. package/registry/blocks/pdf-viewer/notes.jsx +195 -0
  305. package/registry/blocks/pdf-viewer/pdf-viewer.jsx +1368 -0
  306. package/registry/blocks/pdf-viewer/pdfjs.js +37 -0
  307. package/registry/blocks/pdf-viewer/ssr-shim-end.js +6 -0
  308. package/registry/blocks/pdf-viewer/ssr-shim.js +44 -0
  309. package/registry/blocks/product-detail/README.md +217 -0
  310. package/registry/blocks/product-detail/block.json +10 -0
  311. package/registry/blocks/product-detail/demo.jsx +233 -0
  312. package/registry/blocks/product-detail/index.js +7 -0
  313. package/registry/blocks/product-detail/price.jsx +115 -0
  314. package/registry/blocks/product-detail/product-detail.jsx +348 -0
  315. package/registry/blocks/product-detail/product-media.jsx +102 -0
  316. package/registry/blocks/product-detail/product-options.jsx +144 -0
  317. package/registry/blocks/product-grid/README.md +162 -0
  318. package/registry/blocks/product-grid/block.json +10 -0
  319. package/registry/blocks/product-grid/demo.jsx +255 -0
  320. package/registry/blocks/product-grid/index.js +5 -0
  321. package/registry/blocks/product-grid/product-card.jsx +232 -0
  322. package/registry/blocks/product-grid/product-grid.jsx +235 -0
  323. package/registry/blocks/record-form/README.md +196 -0
  324. package/registry/blocks/record-form/block.json +10 -0
  325. package/registry/blocks/record-form/demo.jsx +525 -0
  326. package/registry/blocks/record-form/index.js +4 -0
  327. package/registry/blocks/record-form/record-fields.jsx +457 -0
  328. package/registry/blocks/record-form/record-form.jsx +415 -0
  329. package/registry/blocks/record-form/rules.js +81 -0
  330. package/registry/blocks/record-notes/README.md +139 -0
  331. package/registry/blocks/record-notes/block.json +10 -0
  332. package/registry/blocks/record-notes/demo.jsx +179 -0
  333. package/registry/blocks/record-notes/index.js +4 -0
  334. package/registry/blocks/record-notes/record-notes.jsx +266 -0
  335. package/registry/blocks/search-dialog/README.md +108 -0
  336. package/registry/blocks/search-dialog/block.json +10 -0
  337. package/registry/blocks/search-dialog/demo.jsx +116 -0
  338. package/registry/blocks/search-dialog/index.js +3 -0
  339. package/registry/blocks/search-dialog/search-dialog.jsx +235 -0
  340. package/registry/blocks/settings-list/README.md +171 -0
  341. package/registry/blocks/settings-list/block.json +10 -0
  342. package/registry/blocks/settings-list/demo.jsx +333 -0
  343. package/registry/blocks/settings-list/index.js +4 -0
  344. package/registry/blocks/settings-list/row-state.jsx +93 -0
  345. package/registry/blocks/settings-list/settings-list.jsx +349 -0
  346. package/registry/blocks/settings-list/settings-matrix.jsx +118 -0
  347. package/registry/blocks/setup-checklist/README.md +142 -0
  348. package/registry/blocks/setup-checklist/block.json +10 -0
  349. package/registry/blocks/setup-checklist/demo.jsx +159 -0
  350. package/registry/blocks/setup-checklist/index.js +4 -0
  351. package/registry/blocks/setup-checklist/setup-checklist.jsx +446 -0
  352. package/registry/blocks/share-dialog/README.md +113 -0
  353. package/registry/blocks/share-dialog/block.json +10 -0
  354. package/registry/blocks/share-dialog/demo.jsx +140 -0
  355. package/registry/blocks/share-dialog/index.js +3 -0
  356. package/registry/blocks/share-dialog/share-dialog.jsx +384 -0
  357. package/registry/blocks/sidebar/README.md +190 -0
  358. package/registry/blocks/sidebar/block.json +43 -0
  359. package/registry/blocks/sidebar/demo.jsx +577 -0
  360. package/registry/blocks/sidebar/index.js +4 -0
  361. package/registry/blocks/sidebar/sidebar-panel.jsx +149 -0
  362. package/registry/blocks/sidebar/sidebar.jsx +864 -0
  363. package/registry/blocks/signature-pad/README.md +137 -0
  364. package/registry/blocks/signature-pad/block.json +13 -0
  365. package/registry/blocks/signature-pad/colors.js +115 -0
  366. package/registry/blocks/signature-pad/demo.jsx +94 -0
  367. package/registry/blocks/signature-pad/index.js +6 -0
  368. package/registry/blocks/signature-pad/pad.js +7 -0
  369. package/registry/blocks/signature-pad/signature-pad.jsx +434 -0
  370. package/registry/blocks/signature-pad/signature.js +68 -0
  371. package/registry/blocks/sketch-canvas/README.md +280 -0
  372. package/registry/blocks/sketch-canvas/block.json +13 -0
  373. package/registry/blocks/sketch-canvas/demo.jsx +159 -0
  374. package/registry/blocks/sketch-canvas/excalidraw.js +40 -0
  375. package/registry/blocks/sketch-canvas/index.js +9 -0
  376. package/registry/blocks/sketch-canvas/palette.js +226 -0
  377. package/registry/blocks/sketch-canvas/sketch-canvas.jsx +1188 -0
  378. package/registry/blocks/sketch-canvas/sketch.js +179 -0
  379. package/registry/blocks/sketch-canvas/ssr-shim-end.js +6 -0
  380. package/registry/blocks/sketch-canvas/ssr-shim.js +45 -0
  381. package/registry/blocks/sketch-canvas/stamps.js +104 -0
  382. package/registry/blocks/sketch-canvas/theme.js +131 -0
  383. package/registry/blocks/spreadsheet/README.md +307 -0
  384. package/registry/blocks/spreadsheet/block.json +13 -0
  385. package/registry/blocks/spreadsheet/cells.jsx +455 -0
  386. package/registry/blocks/spreadsheet/chrome.jsx +325 -0
  387. package/registry/blocks/spreadsheet/demo.jsx +177 -0
  388. package/registry/blocks/spreadsheet/grid.js +387 -0
  389. package/registry/blocks/spreadsheet/index.js +34 -0
  390. package/registry/blocks/spreadsheet/spreadsheet.jsx +1732 -0
  391. package/registry/blocks/spreadsheet/types.js +473 -0
  392. package/registry/blocks/stat-cards/README.md +173 -0
  393. package/registry/blocks/stat-cards/block.json +10 -0
  394. package/registry/blocks/stat-cards/demo.jsx +257 -0
  395. package/registry/blocks/stat-cards/index.js +4 -0
  396. package/registry/blocks/stat-cards/stat-cards.jsx +307 -0
  397. package/registry/blocks/stat-cards/usage.jsx +243 -0
  398. package/registry/blocks/task-list/README.md +176 -0
  399. package/registry/blocks/task-list/block.json +10 -0
  400. package/registry/blocks/task-list/demo.jsx +134 -0
  401. package/registry/blocks/task-list/index.js +5 -0
  402. package/registry/blocks/task-list/task-list.jsx +907 -0
  403. package/registry/blocks/task-model/README.md +455 -0
  404. package/registry/blocks/task-model/block.json +167 -0
  405. package/registry/blocks/task-model/changes.js +89 -0
  406. package/registry/blocks/task-model/dates.js +371 -0
  407. package/registry/blocks/task-model/demo.jsx +215 -0
  408. package/registry/blocks/task-model/dnd.jsx +240 -0
  409. package/registry/blocks/task-model/index.js +97 -0
  410. package/registry/blocks/task-model/model.js +919 -0
  411. package/registry/blocks/task-model/parts.jsx +449 -0
  412. package/registry/blocks/task-model/toolbar.jsx +271 -0
  413. package/registry/blocks/testimonials/README.md +139 -0
  414. package/registry/blocks/testimonials/block.json +11 -0
  415. package/registry/blocks/testimonials/demo.jsx +137 -0
  416. package/registry/blocks/testimonials/index.js +4 -0
  417. package/registry/blocks/testimonials/testimonials.jsx +430 -0
  418. package/registry/blocks/transaction-list/README.md +126 -0
  419. package/registry/blocks/transaction-list/block.json +10 -0
  420. package/registry/blocks/transaction-list/demo.jsx +79 -0
  421. package/registry/blocks/transaction-list/index.js +4 -0
  422. package/registry/blocks/transaction-list/transaction-list.jsx +383 -0
  423. package/registry/blocks/whiteboard/README.md +179 -0
  424. package/registry/blocks/whiteboard/block.json +10 -0
  425. package/registry/blocks/whiteboard/demo.jsx +169 -0
  426. package/registry/blocks/whiteboard/index.js +6 -0
  427. package/registry/blocks/whiteboard/templates.js +150 -0
  428. package/registry/blocks/whiteboard/whiteboard.jsx +721 -0
  429. package/src/install.mjs +18 -0
  430. package/src/shadcn.mjs +8 -0
  431. package/templates/next/files/README.md +145 -11
  432. package/templates/next/files/app/globals.css +55 -4
  433. package/templates/next/files/check/run.mjs +3 -3
  434. package/templates/next/files/components/ui/avatar.jsx +141 -0
  435. package/templates/next/files/components/ui/breadcrumb.jsx +149 -0
  436. package/templates/next/files/components/ui/button-group.jsx +70 -0
  437. package/templates/next/files/components/ui/button.jsx +132 -12
  438. package/templates/next/files/components/ui/calendar.jsx +609 -0
  439. package/templates/next/files/components/ui/carousel.jsx +281 -0
  440. package/templates/next/files/components/ui/collapsible.jsx +208 -0
  441. package/templates/next/files/components/ui/combobox.jsx +608 -0
  442. package/templates/next/files/components/ui/command.jsx +577 -0
  443. package/templates/next/files/components/ui/context-menu.jsx +191 -0
  444. package/templates/next/files/components/ui/date-picker.jsx +360 -0
  445. package/templates/next/files/components/ui/distribution.jsx +117 -0
  446. package/templates/next/files/components/ui/feedback.jsx +143 -0
  447. package/templates/next/files/components/ui/field.jsx +115 -3
  448. package/templates/next/files/components/ui/file-input.jsx +234 -0
  449. package/templates/next/files/components/ui/icon.jsx +130 -8
  450. package/templates/next/files/components/ui/image.jsx +143 -0
  451. package/templates/next/files/components/ui/index.js +47 -2
  452. package/templates/next/files/components/ui/input-group.jsx +213 -0
  453. package/templates/next/files/components/ui/input-otp.jsx +170 -0
  454. package/templates/next/files/components/ui/item.jsx +206 -0
  455. package/templates/next/files/components/ui/menu.jsx +454 -82
  456. package/templates/next/files/components/ui/notice.jsx +126 -14
  457. package/templates/next/files/components/ui/pagination.jsx +156 -0
  458. package/templates/next/files/components/ui/popover.jsx +284 -0
  459. package/templates/next/files/components/ui/radio.jsx +193 -0
  460. package/templates/next/files/components/ui/rating.jsx +131 -0
  461. package/templates/next/files/components/ui/resizable.jsx +338 -0
  462. package/templates/next/files/components/ui/scroll-area.jsx +123 -0
  463. package/templates/next/files/components/ui/separator.jsx +119 -0
  464. package/templates/next/files/components/ui/sheet.jsx +96 -11
  465. package/templates/next/files/components/ui/slider.jsx +174 -0
  466. package/templates/next/files/components/ui/stat.jsx +574 -0
  467. package/templates/next/files/components/ui/steps.jsx +338 -0
  468. package/templates/next/files/components/ui/swatch.jsx +33 -0
  469. package/templates/next/files/components/ui/table.jsx +130 -0
  470. package/templates/next/files/components/ui/toast.jsx +440 -0
  471. package/templates/next/files/components/ui/toggle.jsx +195 -0
  472. package/templates/next/files/components/ui/tooltip.jsx +270 -0
  473. package/templates/next/template.json +264 -8
@@ -0,0 +1,159 @@
1
+ "use client";
2
+
3
+ // SetupChecklist with its steps in memory — the gallery's and the smoke
4
+ // test's surface. Not installed into apps: `makersclaw add
5
+ // setup-checklist` lays index.js and setup-checklist.jsx only.
6
+ import { useState } from "react";
7
+ import { Button, Empty, Field, Select, Switch, ToggleGroup, toast } from "../components/ui";
8
+ import { SetupChecklist } from "../components/blocks/setup-checklist";
9
+
10
+ const VARIANTS = [
11
+ { value: "collapsible", label: "Collapsible — folding rows" },
12
+ { value: "cards", label: "Cards — numbered steps" },
13
+ { value: "list", label: "List — step n of N" },
14
+ { value: "accordion", label: "Accordion — locked in order" },
15
+ ];
16
+
17
+ const SETS = {
18
+ collapsible: {
19
+ title: "Get started with Northwind CRM",
20
+ steps: [
21
+ { key: "profile", title: "Complete your profile", description: "Your name, photo and role, so teammates know who they are talking to.", actionLabel: "Edit profile", done: true },
22
+ { key: "workspace", title: "Name your workspace", description: "Pick a name and an icon, and the currency your deals are in.", actionLabel: "Open settings" },
23
+ { key: "invite", title: "Invite your team", description: "Sales works better together: bring in the people who own accounts.", actionLabel: "Send invites" },
24
+ { key: "email", title: "Connect your inbox", description: "Emails with a contact land on their record without copying anything.", actionLabel: "Connect inbox" },
25
+ { key: "pipeline", title: "Build your first pipeline", description: "The stages a deal moves through, from first call to signed.", actionLabel: "Create pipeline" },
26
+ { key: "alerts", title: "Choose your alerts", description: "Hear about replies and stalled deals where you already work.", actionLabel: "Pick alerts" },
27
+ ],
28
+ },
29
+ cards: {
30
+ title: "Set up your team space",
31
+ description: "Four steps and your team can start planning here.",
32
+ steps: [
33
+ { key: "space", title: "Create the space", description: "A name and an address for everything your team shares.", icon: "sparkles", actionLabel: "Create it", done: true },
34
+ { key: "invite", title: "Invite your team", description: "Add teammates by email; they get a link to join.", icon: "users", actionLabel: "Send invites" },
35
+ { key: "project", title: "Start a project", description: "Tasks, notes and dates for one piece of work, in one place.", icon: "folder", actionLabel: "New project" },
36
+ { key: "tools", title: "Connect your tools", description: "Bring in your calendar and chat so updates find you.", icon: "zap", actionLabel: "Browse tools" },
37
+ ],
38
+ },
39
+ list: {
40
+ title: "Open your shop",
41
+ description: "Each step brings the shop closer to its first order.",
42
+ steps: [
43
+ { key: "name", title: "Name your shop", description: "The name buyers see, your address on the web, and your currency.", actionLabel: "Name it", done: true },
44
+ { key: "products", title: "Add your products", description: "Photos, prices and how many you have of each.", actionLabel: "Add a product" },
45
+ { key: "payments", title: "Turn on payments", description: "Checkout through Paddle, so cards and taxes are handled for you.", actionLabel: "Connect Paddle" },
46
+ { key: "launch", title: "Go live", description: "Look it over once more, then open the doors.", actionLabel: "Launch the shop" },
47
+ ],
48
+ },
49
+ accordion: {
50
+ title: "Quick start",
51
+ description: "Your backend in four steps, in order.",
52
+ steps: [
53
+ { key: "env", title: "Set up the environment", summary: "Environment ready", description: "Keys and defaults for development and production.", icon: "settings", actionLabel: "Edit settings", done: true },
54
+ { key: "db", title: "Connect a database", summary: "Add a connection", description: "Point it at your Postgres; the tables are read, never changed.", icon: "database", actionLabel: "Add database" },
55
+ { key: "schema", title: "Describe your data", summary: "Draw the schema", description: "Types, links between them, and the rules each field follows.", icon: "layers", actionLabel: "Open the editor" },
56
+ { key: "api", title: "Publish the API", summary: "Make endpoints", description: "Read and write endpoints from the schema, with keys for each app.", icon: "code", actionLabel: "Generate the API" },
57
+ ],
58
+ },
59
+ };
60
+
61
+ export default function SetupChecklistDemo() {
62
+ const [variant, setVariant] = useState("collapsible");
63
+ const [state, setState] = useState("steps");
64
+ const [failNext, setFailNext] = useState(false);
65
+ const [dismissed, setDismissed] = useState(false);
66
+ const [done, setDone] = useState(() =>
67
+ Object.fromEntries(Object.entries(SETS).map(([k, set]) => [k, set.steps.filter((s) => s.done).map((s) => s.key)])),
68
+ );
69
+
70
+ const set = SETS[variant];
71
+ const steps = set.steps.map((s) => ({ ...s, done: done[variant].includes(s.key) }));
72
+
73
+ async function onAction(step) {
74
+ await new Promise((r) => setTimeout(r, 700));
75
+ if (failNext) {
76
+ setFailNext(false);
77
+ return { ok: false, error: `"${step.title}" could not be saved. Check your connection and try again.` };
78
+ }
79
+ setDone((d) => ({ ...d, [variant]: d[variant].includes(step.key) ? d[variant] : [...d[variant], step.key] }));
80
+ return { ok: true };
81
+ }
82
+
83
+ function reset() {
84
+ setDone((d) => ({ ...d, [variant]: SETS[variant].steps.filter((s) => s.done).map((s) => s.key) }));
85
+ setDismissed(false);
86
+ }
87
+
88
+ let body;
89
+ if (dismissed) {
90
+ body = <Empty icon="archive" title="Checklist hidden" body="It stays out of the way until you bring it back." action={<Button onClick={() => setDismissed(false)}>Show it again</Button>} />;
91
+ } else {
92
+ body = (
93
+ <SetupChecklist
94
+ key={variant}
95
+ variant={variant}
96
+ title={set.title}
97
+ description={set.description}
98
+ steps={state === "empty" ? [] : steps}
99
+ loading={state === "loading"}
100
+ error={state === "error" ? "We could not reach the server. Your progress is safe." : undefined}
101
+ onRetry={() => setState("steps")}
102
+ onAction={onAction}
103
+ sequential={variant === "accordion"}
104
+ onDismiss={
105
+ variant === "collapsible"
106
+ ? async () => {
107
+ setDismissed(true);
108
+ return { ok: true };
109
+ }
110
+ : undefined
111
+ }
112
+ menuItems={variant === "collapsible" ? [{ label: "Send feedback", icon: "mail", onSelect: () => toast("Thanks — feedback opens here.") }] : undefined}
113
+ footer={
114
+ variant === "list" ? (
115
+ <>
116
+ <p className="font-medium text-foreground">Need a hand?</p>
117
+ <p className="mt-1 text-muted-foreground">
118
+ Write to{" "}
119
+ <Button variant="link" size="inherit" href="mailto:help@example.com">
120
+ help@example.com
121
+ </Button>{" "}
122
+ and a person answers within a day.
123
+ </p>
124
+ </>
125
+ ) : undefined
126
+ }
127
+ />
128
+ );
129
+ }
130
+
131
+ return (
132
+ <div className="grid gap-4">
133
+ <div className="flex flex-wrap items-end gap-x-4 gap-y-2">
134
+ <Field id="sc-variant" label="Variant" className="w-full sm:w-64">
135
+ <Select id="sc-variant" value={variant} onChange={(e) => setVariant(e.target.value)} options={VARIANTS} />
136
+ </Field>
137
+ <ToggleGroup
138
+ size="sm"
139
+ aria-label="Demo state"
140
+ value={state}
141
+ onChange={setState}
142
+ items={[
143
+ { value: "steps", label: "Steps" },
144
+ { value: "loading", label: "Loading" },
145
+ { value: "error", label: "Error" },
146
+ { value: "empty", label: "Empty" },
147
+ ]}
148
+ />
149
+ </div>
150
+ <div className="flex flex-wrap items-center gap-x-4">
151
+ <Switch id="sc-fail" checked={failNext} onChange={(e) => setFailNext(e.target.checked)} label="Fail the next step" />
152
+ <Button variant="quiet" size="sm" icon="refresh" onClick={reset}>
153
+ Start over
154
+ </Button>
155
+ </div>
156
+ <div className="mx-auto w-full max-w-lg">{body}</div>
157
+ </div>
158
+ );
159
+ }
@@ -0,0 +1,4 @@
1
+ // The SetupChecklist block — `makersclaw add setup-checklist`. Fixed:
2
+ // compose it through its props (README.md beside this file); a checklist
3
+ // it cannot be is your own component in components/.
4
+ export { SetupChecklist } from "./setup-checklist";
@@ -0,0 +1,446 @@
1
+ "use client";
2
+
3
+ import { useEffect, useId, useRef, useState } from "react";
4
+ import { Accordion, Button, Card, Collapsible, Empty, Icon, Menu, Meter, Notice, Progress, Skeleton, cx } from "../../ui";
5
+
6
+ // SetupChecklist — the steps to get set up: which are done, how far along
7
+ // the whole is, and the button for the next one. The steps are the app's
8
+ // (their `done` comes from its data); the block draws them and sends each
9
+ // step's button out through `onAction`, showing a failure on the step.
10
+
11
+ /* ------------------------------------------------------------------------
12
+ Pieces
13
+ ------------------------------------------------------------------------ */
14
+
15
+ function Marker({ state, index, shape }) {
16
+ if (state === "done") {
17
+ return <Icon name="circle-check" size={shape === "number" ? 24 : 20} className="shrink-0 text-success" />;
18
+ }
19
+ if (shape === "number") {
20
+ return (
21
+ <span
22
+ aria-hidden="true"
23
+ data-nums
24
+ className={cx(
25
+ "flex size-6 shrink-0 items-center justify-center rounded-full text-xs font-semibold",
26
+ state === "current" ? "bg-primary text-primary-foreground" : "bg-muted text-muted-foreground",
27
+ )}
28
+ >
29
+ {index + 1}
30
+ </span>
31
+ );
32
+ }
33
+ if (shape === "ring") {
34
+ return <span aria-hidden="true" className="size-5 shrink-0 rounded-full border border-border" />;
35
+ }
36
+ return <Icon name="circle-dashed" size={20} className="shrink-0 text-muted-foreground" />;
37
+ }
38
+
39
+ // What a reader hears after the title.
40
+ const SAID = { done: "done", current: "next", pending: "not started", locked: "not started" };
41
+
42
+ function StepTitle({ step, state }) {
43
+ return (
44
+ <span className={cx(state === "done" ? "text-muted-foreground line-through" : state === "locked" ? "text-muted-foreground" : "text-foreground")}>
45
+ {step.title}
46
+ <span className="sr-only">, {SAID[state]}</span>
47
+ </span>
48
+ );
49
+ }
50
+
51
+ function StepError({ message }) {
52
+ if (!message) return null;
53
+ return (
54
+ <p role="alert" className="mt-2 text-sm text-destructive">
55
+ {message}
56
+ </p>
57
+ );
58
+ }
59
+
60
+ /* ------------------------------------------------------------------------
61
+ SetupChecklist
62
+ ------------------------------------------------------------------------ */
63
+
64
+ export function SetupChecklist({
65
+ steps,
66
+ variant = "collapsible",
67
+ title = "Get set up",
68
+ description,
69
+ onAction,
70
+ onDismiss,
71
+ menuItems,
72
+ footer,
73
+ sequential = false,
74
+ doneLabel = "All set",
75
+ loading = false,
76
+ error,
77
+ onRetry,
78
+ className,
79
+ }) {
80
+ const list = (steps ?? []).filter(Boolean);
81
+ const total = list.length;
82
+ const doneCount = list.filter((s) => s.done).length;
83
+ const current = list.findIndex((s) => !s.done);
84
+ const allDone = total > 0 && current < 0;
85
+
86
+ const uid = useId();
87
+ const [busy, setBusy] = useState(null);
88
+ const [errors, setErrors] = useState({});
89
+ const [dismissError, setDismissError] = useState(null);
90
+ const [open, setOpen] = useState(() => list[current]?.key ?? null);
91
+
92
+ // When the open step gets done, the next one opens.
93
+ const doneSig = list.map((s) => (s.done ? 1 : 0)).join("");
94
+ const lastSig = useRef(doneSig);
95
+ useEffect(() => {
96
+ if (lastSig.current === doneSig) return;
97
+ lastSig.current = doneSig;
98
+ const openStep = list.find((s) => s.key === open);
99
+ if (!openStep || openStep.done) setOpen(list[current]?.key ?? null);
100
+ // The steps' done flags are what moved.
101
+ // eslint-disable-next-line react-hooks/exhaustive-deps
102
+ }, [doneSig]);
103
+
104
+ const stateOf = (i) => (list[i].done ? "done" : i === current ? "current" : sequential ? "locked" : "pending");
105
+
106
+ async function run(step) {
107
+ if (!onAction) return;
108
+ setBusy(step.key);
109
+ setErrors((e) => ({ ...e, [step.key]: null }));
110
+ let res;
111
+ try {
112
+ res = await onAction(step);
113
+ } catch (e) {
114
+ res = { ok: false, error: e?.message };
115
+ }
116
+ setBusy(null);
117
+ if (res && res.ok === false) setErrors((e) => ({ ...e, [step.key]: res.error || "That did not work. Try again." }));
118
+ }
119
+
120
+ async function dismiss() {
121
+ setDismissError(null);
122
+ let res;
123
+ try {
124
+ res = await onDismiss();
125
+ } catch (e) {
126
+ res = { ok: false, error: e?.message };
127
+ }
128
+ if (res && res.ok === false) setDismissError(res.error || "The checklist could not be hidden.");
129
+ }
130
+
131
+ // A render helper, not a component: a component declared in here would
132
+ // remount on every render and drop the focus from its button.
133
+ function action(step, i, look) {
134
+ const state = stateOf(i);
135
+ const label = step.actionLabel ?? (state === "done" ? "Open" : "Start");
136
+ const variant = state === "done" || look === "secondary" ? "secondary" : "primary";
137
+ const disabled = state === "locked";
138
+ if (!step.href && !onAction) return null;
139
+ return (
140
+ <Button
141
+ size="sm"
142
+ variant={variant}
143
+ icon={look === "icon" ? step.icon : undefined}
144
+ href={disabled ? undefined : step.href}
145
+ onClick={step.href ? () => onAction?.(step) : () => run(step)}
146
+ loading={busy === step.key}
147
+ disabled={disabled || (busy !== null && busy !== step.key)}
148
+ aria-describedby={disabled ? `${uid}-${step.key}-locked` : undefined}
149
+ >
150
+ {label}
151
+ </Button>
152
+ );
153
+ }
154
+
155
+ const menu = [onDismiss && { label: "Dismiss", icon: "archive", onSelect: dismiss }, ...(menuItems ?? [])].filter(Boolean);
156
+
157
+ /* ---- states that replace the steps -------------------------------- */
158
+
159
+ if (loading) {
160
+ return (
161
+ <div aria-busy="true" aria-label={title} className={cx("grid gap-3 rounded-lg border border-border bg-card p-4", className)}>
162
+ <Skeleton className="w-1/2" />
163
+ <Skeleton className="h-1.5 w-full" shape="rect" />
164
+ {[0, 1, 2, 3].map((i) => (
165
+ <div key={i} className="flex items-center gap-3 py-2">
166
+ <Skeleton shape="circle" className="size-5" />
167
+ <Skeleton className="w-2/3" />
168
+ </div>
169
+ ))}
170
+ </div>
171
+ );
172
+ }
173
+ if (error) {
174
+ return (
175
+ <Notice
176
+ tone="danger"
177
+ title="The checklist did not load"
178
+ className={className}
179
+ action={
180
+ onRetry ? (
181
+ <Button size="sm" icon="refresh" onClick={onRetry}>
182
+ Retry
183
+ </Button>
184
+ ) : null
185
+ }
186
+ >
187
+ {error}
188
+ </Notice>
189
+ );
190
+ }
191
+ if (total === 0) {
192
+ return <Empty icon="circle-check" title="Nothing to set up" body="Every step is taken care of." className={className} />;
193
+ }
194
+
195
+ const bar = (
196
+ <Progress
197
+ value={doneCount}
198
+ max={total}
199
+ tone={allDone ? "success" : "neutral"}
200
+ aria-label={`${title}: ${doneCount} of ${total} steps done`}
201
+ valueText={`${doneCount} of ${total}`}
202
+ />
203
+ );
204
+ const menuButton = menu.length ? <Menu items={menu} label={`${title} options`} /> : null;
205
+ const dismissNotice = dismissError ? (
206
+ <Notice tone="danger" onDismiss={() => setDismissError(null)}>
207
+ {dismissError}
208
+ </Notice>
209
+ ) : null;
210
+ const lockedNote = (step) =>
211
+ stateOf(list.indexOf(step)) === "locked" ? (
212
+ <p id={`${uid}-${step.key}-locked`} className="mt-2 text-xs text-muted-foreground">
213
+ Finish the steps before this one first.
214
+ </p>
215
+ ) : null;
216
+
217
+ /* ---- collapsible: a card of folding rows, a ring in the header ----- */
218
+
219
+ if (variant === "collapsible") {
220
+ return (
221
+ <Card className={cx("grid gap-2", className)}>
222
+ <div className="flex flex-wrap items-center justify-between gap-x-4 gap-y-2">
223
+ <div className="min-w-0">
224
+ <h2 className="font-semibold leading-tight">{title}</h2>
225
+ {description ? <p className="mt-0.5 text-sm text-muted-foreground">{description}</p> : null}
226
+ </div>
227
+ <div className="ml-auto flex items-center gap-1">
228
+ <Meter
229
+ shape="ring"
230
+ size="sm"
231
+ value={doneCount}
232
+ max={total}
233
+ tone={allDone ? "success" : "neutral"}
234
+ center={null}
235
+ valueText={null}
236
+ aria-label={`${doneCount} of ${total} steps done`}
237
+ />
238
+ <span data-nums className="ml-1.5 mr-1 text-sm text-muted-foreground">
239
+ {allDone ? (
240
+ doneLabel
241
+ ) : (
242
+ <>
243
+ <span className="font-medium text-foreground">{doneCount}</span> of <span className="font-medium text-foreground">{total}</span> done
244
+ </>
245
+ )}
246
+ </span>
247
+ {menuButton}
248
+ </div>
249
+ </div>
250
+ {dismissNotice}
251
+ <Accordion
252
+ aria-label={title}
253
+ chevron="right"
254
+ value={open}
255
+ onChange={setOpen}
256
+ items={list.map((step, i) => {
257
+ const state = stateOf(i);
258
+ return {
259
+ key: step.key,
260
+ title: (
261
+ <span className="flex items-center gap-3">
262
+ <Marker state={state} />
263
+ <StepTitle step={step} state={state} />
264
+ </span>
265
+ ),
266
+ content: (
267
+ <div className="pl-8">
268
+ {step.description ? <p className="max-w-prose text-muted-foreground">{step.description}</p> : null}
269
+ <div className="mt-3">
270
+ {action(step, i)}
271
+ </div>
272
+ {lockedNote(step)}
273
+ <StepError message={errors[step.key]} />
274
+ </div>
275
+ ),
276
+ };
277
+ })}
278
+ />
279
+ {footer ? <div className="border-t border-border pt-3 text-sm">{footer}</div> : null}
280
+ </Card>
281
+ );
282
+ }
283
+
284
+ const header = (right) => (
285
+ <div className="grid gap-3">
286
+ <div className="flex items-start justify-between gap-3">
287
+ <div className="min-w-0">
288
+ <h2 className="text-lg font-semibold leading-tight">{title}</h2>
289
+ {description ? <p className="mt-1 text-sm text-muted-foreground">{description}</p> : null}
290
+ </div>
291
+ {menuButton}
292
+ </div>
293
+ {right}
294
+ {dismissNotice}
295
+ </div>
296
+ );
297
+
298
+ /* ---- accordion: bordered folding rows, a panel in each ------------- */
299
+
300
+ if (variant === "accordion") {
301
+ return (
302
+ <div className={cx("grid gap-4", className)}>
303
+ {header(null)}
304
+ <div className="grid gap-2" role="list" aria-label={title}>
305
+ {list.map((step, i) => {
306
+ const state = stateOf(i);
307
+ return (
308
+ <div role="listitem" key={step.key}>
309
+ <Collapsible
310
+ variant="outline"
311
+ open={open === step.key}
312
+ onOpenChange={(next) => setOpen(next ? step.key : null)}
313
+ title={
314
+ <span className="flex items-center gap-3">
315
+ <Marker state={state} shape="ring" />
316
+ <StepTitle step={step} state={state} />
317
+ </span>
318
+ }
319
+ >
320
+ <div className="grid justify-items-center gap-1 rounded-md bg-muted px-4 py-5 text-center">
321
+ {step.icon ? <Icon name={step.icon} size={24} className="mb-2 text-muted-foreground" /> : null}
322
+ {step.summary ? <p className="font-medium text-foreground">{step.summary}</p> : null}
323
+ {step.description ? <p className="max-w-xs text-muted-foreground">{step.description}</p> : null}
324
+ <div className="mt-4">
325
+ {action(step, i)}
326
+ </div>
327
+ {lockedNote(step)}
328
+ <StepError message={errors[step.key]} />
329
+ </div>
330
+ </Collapsible>
331
+ </div>
332
+ );
333
+ })}
334
+ </div>
335
+ {footer ? <div className="text-sm">{footer}</div> : null}
336
+ </div>
337
+ );
338
+ }
339
+
340
+ /* ---- cards: numbered step cards, a bar over them ------------------- */
341
+
342
+ if (variant === "cards") {
343
+ return (
344
+ <div className={cx("grid gap-4", className)}>
345
+ {header(
346
+ <div className="grid gap-2">
347
+ <p data-nums className="text-sm text-muted-foreground">
348
+ {allDone ? (
349
+ <span className="font-medium text-success">{doneLabel}</span>
350
+ ) : (
351
+ <>
352
+ <span className="font-medium text-foreground">{doneCount}</span> of {total} done
353
+ </>
354
+ )}
355
+ </p>
356
+ {bar}
357
+ </div>,
358
+ )}
359
+ <ol className="grid gap-3" aria-label={title}>
360
+ {list.map((step, i) => {
361
+ const state = stateOf(i);
362
+ return (
363
+ <li
364
+ key={step.key}
365
+ aria-current={state === "current" ? "step" : undefined}
366
+ className={cx("rounded-lg border p-4", state === "current" ? "border-primary/40 bg-muted" : "border-border bg-card")}
367
+ >
368
+ <div className="flex gap-3">
369
+ <Marker state={state} index={i} shape="number" />
370
+ <div className="min-w-0 flex-1">
371
+ <p className="font-medium">
372
+ <StepTitle step={step} state={state} />
373
+ </p>
374
+ {step.description ? (
375
+ <p className={cx("mt-0.5 text-sm", state === "current" ? "text-muted-foreground" : "text-muted-foreground/80")}>{step.description}</p>
376
+ ) : null}
377
+ {state === "current" ? (
378
+ <div className="mt-3">
379
+ {action(step, i, "icon")}
380
+ </div>
381
+ ) : null}
382
+ <StepError message={errors[step.key]} />
383
+ </div>
384
+ {step.icon ? (
385
+ <Icon name={step.icon} size={20} className={cx("shrink-0", state === "current" ? "text-primary" : "text-muted-foreground/60")} />
386
+ ) : null}
387
+ </div>
388
+ </li>
389
+ );
390
+ })}
391
+ </ol>
392
+ {footer ? <div className="text-sm">{footer}</div> : null}
393
+ </div>
394
+ );
395
+ }
396
+
397
+ /* ---- list: plain step rows, "Step n of N" and a short bar ---------- */
398
+
399
+ return (
400
+ <div className={cx("grid gap-4", className)}>
401
+ {header(
402
+ <div className="flex items-center justify-end gap-3">
403
+ <span data-nums className="text-sm text-muted-foreground">
404
+ {allDone ? doneLabel : `Step ${current + 1} of ${total}`}
405
+ </span>
406
+ <div className="w-32">{bar}</div>
407
+ </div>,
408
+ )}
409
+ <ol className="grid gap-3" aria-label={title}>
410
+ {list.map((step, i) => {
411
+ const state = stateOf(i);
412
+ return (
413
+ <li
414
+ key={step.key}
415
+ aria-current={state === "current" ? "step" : undefined}
416
+ className={cx("rounded-lg border bg-card p-4", state === "current" ? "border-foreground/25" : "border-border")}
417
+ >
418
+ <div className="flex items-start gap-3">
419
+ {state === "done" ? (
420
+ <Marker state="done" />
421
+ ) : (
422
+ <span aria-hidden="true" data-nums className="flex size-5 shrink-0 items-center justify-center text-sm font-medium text-muted-foreground">
423
+ {i + 1}.
424
+ </span>
425
+ )}
426
+ <div className="min-w-0 flex-1">
427
+ <p className="font-medium">
428
+ <StepTitle step={step} state={state} />
429
+ </p>
430
+ {step.description ? <p className="mt-1 text-sm text-muted-foreground">{step.description}</p> : null}
431
+ {state === "current" ? (
432
+ <div className="mt-3">
433
+ {action(step, i)}
434
+ </div>
435
+ ) : null}
436
+ <StepError message={errors[step.key]} />
437
+ </div>
438
+ </div>
439
+ </li>
440
+ );
441
+ })}
442
+ </ol>
443
+ {footer ? <div className="rounded-lg bg-muted p-4 text-sm">{footer}</div> : null}
444
+ </div>
445
+ );
446
+ }