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,329 @@
1
+ // The token choices — the only styles the Design panel can set, and how a
2
+ // page keeps the workspace theme.
3
+ //
4
+ // A page's CSS never holds a colour. Every colour it can carry is a theme
5
+ // token written as `var(--color-<name>)`, the same variables the app's
6
+ // Tailwind utilities read; fonts and corners read `--theme-font-*` and
7
+ // `--theme-radius`. So a saved page repaints when the theme changes: the
8
+ // values live in the theme, the page only names them.
9
+ //
10
+ // Two places need the tokens defined:
11
+ // the app Tailwind emits a theme variable only when some source names
12
+ // it. KEEP_TOKENS below names every token a page can use (as
13
+ // no-op arbitrary properties on the editor and PageView roots),
14
+ // so installing this block is enough for them to exist.
15
+ // a frame the editor's canvas is an iframe and does not see the app's
16
+ // stylesheet. tokenCss(root) resolves each token where the
17
+ // editor sits (its own light/dark and [data-theme] scope) and
18
+ // the editor writes the result into the frame; it re-runs when
19
+ // the theme changes. pageDocument() uses the same string for a
20
+ // standalone HTML export.
21
+
22
+ /** Every colour token a page may name, in the order the pickers show. */
23
+ export const COLOR_TOKENS = [
24
+ "background",
25
+ "foreground",
26
+ "card",
27
+ "card-foreground",
28
+ "primary",
29
+ "primary-foreground",
30
+ "secondary",
31
+ "secondary-foreground",
32
+ "muted",
33
+ "muted-foreground",
34
+ "accent",
35
+ "accent-foreground",
36
+ "border",
37
+ "destructive",
38
+ "success",
39
+ "warning",
40
+ "info",
41
+ ];
42
+
43
+ /** The non-colour theme variables a page reads (always present: globals.css sets them). */
44
+ export const THEME_VARS = ["--theme-font-sans", "--theme-font-display", "--theme-font-mono", "--theme-radius"];
45
+
46
+ // Written out whole so Tailwind reads each var() and emits the variable.
47
+ export const KEEP_TOKENS = [
48
+ "[--pb-k1:var(--color-background)]",
49
+ "[--pb-k2:var(--color-foreground)]",
50
+ "[--pb-k3:var(--color-card)]",
51
+ "[--pb-k4:var(--color-card-foreground)]",
52
+ "[--pb-k5:var(--color-primary)]",
53
+ "[--pb-k6:var(--color-primary-foreground)]",
54
+ "[--pb-k7:var(--color-secondary)]",
55
+ "[--pb-k8:var(--color-secondary-foreground)]",
56
+ "[--pb-k9:var(--color-muted)]",
57
+ "[--pb-k10:var(--color-muted-foreground)]",
58
+ "[--pb-k11:var(--color-accent)]",
59
+ "[--pb-k12:var(--color-accent-foreground)]",
60
+ "[--pb-k13:var(--color-border)]",
61
+ "[--pb-k14:var(--color-destructive)]",
62
+ "[--pb-k15:var(--color-success)]",
63
+ "[--pb-k16:var(--color-warning)]",
64
+ "[--pb-k17:var(--color-info)]",
65
+ ].join(" ");
66
+
67
+ const v = (name) => `var(--color-${name})`;
68
+
69
+ /**
70
+ * The Design panel's groups. Each option is a plain CSS patch; `match`
71
+ * is the property read back to show which option is on. A consumer can
72
+ * pass its own list (the `styles` prop) built from the same shape; keep
73
+ * colours as tokens (`var(--color-…)`) so the page repaints with the theme.
74
+ */
75
+ export const STYLE_GROUPS = [
76
+ {
77
+ id: "color",
78
+ label: "Text colour",
79
+ kind: "swatch",
80
+ for: ["text", "link", "box"],
81
+ match: "color",
82
+ options: [
83
+ { value: "", label: "Default", css: { color: "" } },
84
+ { value: "foreground", label: "Text", css: { color: v("foreground") } },
85
+ { value: "muted-foreground", label: "Muted", css: { color: v("muted-foreground") } },
86
+ { value: "primary", label: "Primary", css: { color: v("primary") } },
87
+ { value: "primary-foreground", label: "On primary", css: { color: v("primary-foreground") } },
88
+ { value: "background", label: "Page", css: { color: v("background") } },
89
+ { value: "destructive", label: "Alert", css: { color: v("destructive") } },
90
+ ],
91
+ },
92
+ {
93
+ id: "fill",
94
+ label: "Background",
95
+ kind: "swatch",
96
+ for: ["link", "box"],
97
+ match: "background-color",
98
+ options: [
99
+ { value: "", label: "Default", css: { "background-color": "" } },
100
+ { value: "transparent", label: "None", css: { "background-color": "transparent" } },
101
+ { value: "background", label: "Page", css: { "background-color": v("background") } },
102
+ { value: "card", label: "Card", css: { "background-color": v("card") } },
103
+ { value: "muted", label: "Muted", css: { "background-color": v("muted") } },
104
+ { value: "accent", label: "Accent", css: { "background-color": v("accent") } },
105
+ { value: "primary", label: "Primary", css: { "background-color": v("primary") } },
106
+ { value: "foreground", label: "Inverted", css: { "background-color": v("foreground") } },
107
+ ],
108
+ },
109
+ {
110
+ id: "size",
111
+ label: "Text size",
112
+ kind: "select",
113
+ for: ["text", "link"],
114
+ match: "font-size",
115
+ options: [
116
+ { value: "", label: "Default", css: { "font-size": "", "line-height": "" } },
117
+ { value: "0.875rem", label: "Small", css: { "font-size": "0.875rem", "line-height": "1.5" } },
118
+ { value: "1rem", label: "Body", css: { "font-size": "1rem", "line-height": "1.6" } },
119
+ { value: "1.25rem", label: "Large", css: { "font-size": "1.25rem", "line-height": "1.5" } },
120
+ { value: "1.75rem", label: "Title", css: { "font-size": "1.75rem", "line-height": "1.25" } },
121
+ { value: "2.5rem", label: "Headline", css: { "font-size": "2.5rem", "line-height": "1.1" } },
122
+ { value: "3.5rem", label: "Display", css: { "font-size": "3.5rem", "line-height": "1.05" } },
123
+ ],
124
+ },
125
+ {
126
+ id: "weight",
127
+ label: "Weight",
128
+ kind: "segmented",
129
+ for: ["text", "link"],
130
+ match: "font-weight",
131
+ options: [
132
+ { value: "", label: "Default", css: { "font-weight": "" } },
133
+ { value: "400", label: "Regular", css: { "font-weight": "400" } },
134
+ { value: "500", label: "Medium", css: { "font-weight": "500" } },
135
+ { value: "700", label: "Bold", css: { "font-weight": "700" } },
136
+ ],
137
+ },
138
+ {
139
+ id: "font",
140
+ label: "Typeface",
141
+ kind: "segmented",
142
+ for: ["text"],
143
+ match: "font-family",
144
+ options: [
145
+ { value: "", label: "Default", css: { "font-family": "" } },
146
+ { value: "var(--theme-font-display)", label: "Display", css: { "font-family": "var(--theme-font-display)" } },
147
+ { value: "var(--theme-font-mono)", label: "Mono", css: { "font-family": "var(--theme-font-mono)" } },
148
+ ],
149
+ },
150
+ {
151
+ id: "align",
152
+ label: "Align",
153
+ kind: "segmented",
154
+ for: ["text", "box"],
155
+ match: "text-align",
156
+ options: [
157
+ { value: "", label: "Default", css: { "text-align": "" } },
158
+ { value: "left", label: "Left", icon: "align-left", css: { "text-align": "left" } },
159
+ { value: "center", label: "Centre", icon: "align-center", css: { "text-align": "center" } },
160
+ { value: "right", label: "Right", icon: "align-right", css: { "text-align": "right" } },
161
+ ],
162
+ },
163
+ {
164
+ id: "spaceY",
165
+ label: "Space above and below",
166
+ kind: "segmented",
167
+ for: ["text", "link", "box"],
168
+ match: "padding-top",
169
+ options: [
170
+ { value: "", label: "Default", css: { "padding-top": "", "padding-bottom": "" } },
171
+ { value: "0px", label: "None", css: { "padding-top": "0px", "padding-bottom": "0px" } },
172
+ { value: "12px", label: "S", css: { "padding-top": "12px", "padding-bottom": "12px" } },
173
+ { value: "32px", label: "M", css: { "padding-top": "32px", "padding-bottom": "32px" } },
174
+ { value: "64px", label: "L", css: { "padding-top": "64px", "padding-bottom": "64px" } },
175
+ { value: "112px", label: "XL", css: { "padding-top": "112px", "padding-bottom": "112px" } },
176
+ ],
177
+ },
178
+ {
179
+ id: "spaceX",
180
+ label: "Space at the sides",
181
+ kind: "segmented",
182
+ for: ["link", "box"],
183
+ match: "padding-left",
184
+ options: [
185
+ { value: "", label: "Default", css: { "padding-left": "", "padding-right": "" } },
186
+ { value: "0px", label: "None", css: { "padding-left": "0px", "padding-right": "0px" } },
187
+ { value: "12px", label: "S", css: { "padding-left": "12px", "padding-right": "12px" } },
188
+ { value: "24px", label: "M", css: { "padding-left": "24px", "padding-right": "24px" } },
189
+ { value: "48px", label: "L", css: { "padding-left": "48px", "padding-right": "48px" } },
190
+ ],
191
+ },
192
+ {
193
+ id: "width",
194
+ label: "Width",
195
+ kind: "segmented",
196
+ for: ["box", "image"],
197
+ match: "max-width",
198
+ options: [
199
+ { value: "", label: "Default", css: { "max-width": "", "margin-left": "", "margin-right": "" } },
200
+ { value: "640px", label: "Narrow", css: { "max-width": "640px", "margin-left": "auto", "margin-right": "auto" } },
201
+ { value: "960px", label: "Normal", css: { "max-width": "960px", "margin-left": "auto", "margin-right": "auto" } },
202
+ { value: "none", label: "Full", css: { "max-width": "none", "margin-left": "", "margin-right": "" } },
203
+ ],
204
+ },
205
+ {
206
+ id: "radius",
207
+ label: "Corners",
208
+ kind: "segmented",
209
+ for: ["link", "box", "image"],
210
+ match: "border-radius",
211
+ options: [
212
+ { value: "", label: "Default", css: { "border-radius": "" } },
213
+ { value: "0px", label: "Square", css: { "border-radius": "0px" } },
214
+ { value: "var(--theme-radius)", label: "Theme", css: { "border-radius": "var(--theme-radius)" } },
215
+ { value: "calc(var(--theme-radius) * 2.5)", label: "Soft", css: { "border-radius": "calc(var(--theme-radius) * 2.5)" } },
216
+ { value: "9999px", label: "Pill", css: { "border-radius": "9999px" } },
217
+ ],
218
+ },
219
+ {
220
+ id: "border",
221
+ label: "Border",
222
+ kind: "swatch",
223
+ for: ["link", "box", "image"],
224
+ match: "border-color",
225
+ options: [
226
+ { value: "", label: "Default", css: { "border-width": "", "border-style": "", "border-color": "" } },
227
+ { value: "transparent", label: "None", css: { "border-width": "0px", "border-style": "none", "border-color": "transparent" } },
228
+ { value: "border", label: "Hairline", css: { "border-width": "1px", "border-style": "solid", "border-color": v("border") } },
229
+ { value: "primary", label: "Primary", css: { "border-width": "1px", "border-style": "solid", "border-color": v("primary") } },
230
+ ],
231
+ },
232
+ ];
233
+
234
+ /** The token name a swatch option paints, for its colour dot ("" for
235
+ * Default and None). */
236
+ export function swatchVar(option) {
237
+ if (!option?.value || option.value === "transparent") return "";
238
+ return `var(--color-${option.value})`;
239
+ }
240
+
241
+ /** The groups that apply to a kind of element: text · link · image · box.
242
+ * A group with no `for` applies to every kind. */
243
+ export function groupsFor(groups, kind) {
244
+ return (groups ?? []).filter((g) => !g.for || g.for.includes(kind));
245
+ }
246
+
247
+ /** Which option of a group is on, from a component's own style object. */
248
+ export function currentOption(group, style = {}) {
249
+ const raw = String(style?.[group.match] ?? "").replace(/\s*!important\s*$/, "").trim();
250
+ if (!raw) return "";
251
+ for (const o of group.options) {
252
+ const css = o.css?.[group.match];
253
+ if (css && css === raw) return o.value;
254
+ }
255
+ return "custom";
256
+ }
257
+
258
+ /** The patch for choosing `value` in `group`: every prop the group owns,
259
+ * set or cleared ("" clears). */
260
+ export function patchFor(group, value) {
261
+ const option = group.options.find((o) => o.value === value) ?? group.options[0];
262
+ const props = new Set();
263
+ for (const o of group.options) for (const k of Object.keys(o.css ?? {})) props.add(k);
264
+ const patch = {};
265
+ for (const k of props) patch[k] = option.css?.[k] ?? "";
266
+ return patch;
267
+ }
268
+
269
+ /** Browser only: the tokens resolved where `root` sits, as one `:root{…}`
270
+ * rule — for the canvas frame and for a standalone export. Each colour is
271
+ * read off a hidden probe (`color: var(--color-x)`), so light-dark(),
272
+ * color-mix() and a [data-theme] scope all resolve as the app paints them. */
273
+ export function tokenCss(root) {
274
+ if (typeof document === "undefined") return "";
275
+ const host = root ?? document.body;
276
+ const probe = document.createElement("span");
277
+ probe.setAttribute("aria-hidden", "true");
278
+ probe.style.position = "absolute";
279
+ probe.style.visibility = "hidden";
280
+ probe.style.pointerEvents = "none";
281
+ host.appendChild(probe);
282
+ const lines = [];
283
+ try {
284
+ for (const name of COLOR_TOKENS) {
285
+ probe.style.color = "";
286
+ probe.style.color = `var(--color-${name})`;
287
+ const value = getComputedStyle(probe).color;
288
+ if (value) lines.push(`--color-${name}:${value}`);
289
+ }
290
+ const cs = getComputedStyle(host);
291
+ for (const name of THEME_VARS) {
292
+ const value = cs.getPropertyValue(name).trim();
293
+ if (value) lines.push(`${name}:${value}`);
294
+ }
295
+ const scheme = cs.colorScheme;
296
+ if (scheme && scheme !== "normal") lines.push(`color-scheme:${scheme}`);
297
+ } finally {
298
+ probe.remove();
299
+ }
300
+ return `:root{${lines.join(";")}}`;
301
+ }
302
+
303
+ /** Browser only: the @font-face rules the app has loaded (next/font and
304
+ * friends), so the canvas frame draws the theme's typefaces. Rules in a
305
+ * stylesheet from another origin cannot be read and are skipped. */
306
+ export function fontFaceCss() {
307
+ if (typeof document === "undefined") return "";
308
+ const out = [];
309
+ for (const sheet of Array.from(document.styleSheets)) {
310
+ let rules;
311
+ try {
312
+ rules = sheet.cssRules;
313
+ } catch {
314
+ continue;
315
+ }
316
+ for (const rule of Array.from(rules ?? [])) {
317
+ if (rule.type === 5 /* CSSRule.FONT_FACE_RULE */) out.push(rule.cssText);
318
+ }
319
+ }
320
+ return out.join("\n");
321
+ }
322
+
323
+ /** Browser only: the href of every font stylesheet link (Google Fonts…). */
324
+ export function fontLinks() {
325
+ if (typeof document === "undefined") return [];
326
+ return Array.from(document.querySelectorAll('link[rel="stylesheet"]'))
327
+ .map((l) => l.href)
328
+ .filter((h) => /fonts\.(googleapis|bunny)\.|typekit|fontshare/.test(h));
329
+ }
@@ -0,0 +1,104 @@
1
+ # PaymentMethods
2
+
3
+ The payment methods a customer has saved, as a grid of cards. Each card
4
+ shows the brand, the last four digits, the expiry and, on one of them, a
5
+ Default badge. An expired card is marked in the danger tone, one that
6
+ expires this month or next in the warning tone.
7
+
8
+ The actions are Make default, Remove (behind a Confirm) and Add. Add is
9
+ the app's: it opens the payment provider (Paddle), which collects the
10
+ card. **The block never shows a card-number field.** Every action goes out
11
+ through a callback that returns `{ ok }`, and a failed one is shown on the
12
+ card it was for.
13
+
14
+ ```jsx
15
+ import { PaymentMethods } from "../components/blocks/payment-methods"; // a Makersclaw app ("./blocks/payment-methods" from components/)
16
+ import { PaymentMethods } from "@/components/makersclaw/blocks/payment-methods"; // a shadcn project
17
+ ```
18
+
19
+ It is a client component: render it from a `"use client"` component, and
20
+ load the methods in the server surface (README §4).
21
+
22
+ ## The data
23
+
24
+ One saved method, as the provider reports it:
25
+
26
+ ```js
27
+ { id: "pm_1", brand: "visa", last4: "4242", expMonth: 8, expYear: 2028, isDefault: true, holder: "Maya Chen" }
28
+ ```
29
+
30
+ - `brand` — `visa`, `mastercard`, `amex`, `discover`, `jcb`, `unionpay`,
31
+ `maestro`, `paypal`, `apple_pay`, `google_pay`, `bank` or `card`. Any
32
+ other word is shown as written. Apple Pay and Google Pay get their
33
+ marks; every card brand gets the card glyph and its name in words (the
34
+ kit draws no card-brand logos).
35
+ - `last4` — the last four digits. Nothing more of the number ever comes in.
36
+ - `expMonth` (1–12) · `expYear` (2028 or 28) — optional; a wallet has none.
37
+ - `isDefault` — true on one method.
38
+ - `holder` — the name on it; `label` — call it something else ("Company
39
+ Amex"); `email` — for a wallet with no last four (PayPal).
40
+
41
+ ## Props
42
+
43
+ - `methods` — the saved methods. An empty list shows the empty state.
44
+ - `onAdd()` — the Add button (in the header, and in the empty state).
45
+ Open Paddle's update-payment-method checkout here; return
46
+ `{ ok: false, error }` if it could not open. Without it there is no Add.
47
+ - `onSetDefault(method)` — Make default on every other card; return
48
+ `{ ok: true }` or `{ ok: false, error }`. An expired card cannot be made
49
+ the default. Without it, no button.
50
+ - `onRemove(method)` — Remove, asked through a Confirm; same return. The
51
+ default cannot be removed while there are others: make another the
52
+ default first (the button says why on hover). Without it, no button.
53
+ - `loading` — skeleton cards. `error` — a line above the list (the
54
+ methods did not load).
55
+ - `title` · `description` · `addLabel` · `emptyTitle` · `emptyBody` — words.
56
+ - `today` — `"YYYY-MM-DD"`, the day expiry is judged against; default
57
+ today.
58
+ - `className` — layout around it (width, margin). Never colour.
59
+
60
+ ## Example
61
+
62
+ ```jsx
63
+ // components/Billing.jsx — client
64
+ "use client";
65
+ import { PaymentMethods } from "./blocks/payment-methods";
66
+
67
+ export default function Billing({ methods, error }) {
68
+ const post = (path, body) =>
69
+ fetch(path, { method: "POST", body: JSON.stringify(body) }).then((r) =>
70
+ r.ok ? { ok: true } : { ok: false, error: "That did not save. Try again." },
71
+ );
72
+ return (
73
+ <PaymentMethods
74
+ methods={methods}
75
+ error={error}
76
+ onAdd={async () => {
77
+ const res = await fetch("/api/billing/update-method", { method: "POST" });
78
+ if (!res.ok) return { ok: false, error: "Could not open the payment form." };
79
+ const { transactionId } = await res.json();
80
+ window.Paddle?.Checkout.open({ transactionId });
81
+ return { ok: true };
82
+ }}
83
+ onSetDefault={(m) => post("/api/billing/default-method", { id: m.id })}
84
+ onRemove={(m) => post("/api/billing/remove-method", { id: m.id })}
85
+ />
86
+ );
87
+ }
88
+ ```
89
+
90
+ ## What it will not do
91
+
92
+ - Take or show a full card number, a CVC or an expiry field. Adding and
93
+ editing a card is the provider's form, opened from `onAdd`.
94
+ - Draw card-brand logos: brands are named in words beside a card glyph.
95
+ - Edit a saved card in place: providers replace a card; add the new one,
96
+ make it the default, remove the old.
97
+
98
+ A list it cannot be is your own component in `components/`, built from
99
+ the kit — not an edit to this block. Its files are fixed: `npm run check`
100
+ refuses a change, and `makersclaw add payment-methods` restores them.
101
+
102
+ ## Credits
103
+
104
+ Shape and behaviour from Creative Tim UI (https://github.com/creativetimofficial/ui), MIT; this is a rewrite on the Makersclaw kit.
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "payment-methods",
3
+ "title": "PaymentMethods",
4
+ "description": "A customer's SAVED payment methods as cards: brand, last four digits, expiry (expired and expiring soon flagged) and a Default badge; Make default, Remove behind a Confirm, and Add, which hands off to the payment provider (Paddle). Never a card-number field. Empty, loading and error states built in.",
5
+ "useWhen": "A billing or account page where a customer manages the cards and wallets on file. Not for taking a payment (cart's checkout step hands off to Paddle) or for a list of charges (transaction-list).",
6
+ "tags": ["payment", "payment methods", "cards", "credit card", "wallet", "billing", "default card", "saved cards", "paddle", "account", "commerce"],
7
+ "exports": ["PaymentMethods"],
8
+ "files": ["index.js", "payment-methods.jsx"],
9
+ "requires": []
10
+ }
@@ -0,0 +1,71 @@
1
+ "use client";
2
+
3
+ // PaymentMethods with methods in memory — the gallery's and the smoke
4
+ // test's surface. Not installed into apps.
5
+ import { useState } from "react";
6
+ import { Switch, ToggleGroup } from "../components/ui";
7
+ import { PaymentMethods } from "../components/blocks/payment-methods";
8
+
9
+ const START = [
10
+ { id: "pm_1", brand: "visa", last4: "4242", expMonth: 8, expYear: 2028, isDefault: true, holder: "Maya Chen" },
11
+ { id: "pm_2", brand: "mastercard", last4: "5100", expMonth: 10, expYear: 2026, holder: "Maya Chen" },
12
+ { id: "pm_3", brand: "amex", last4: "0005", expMonth: 3, expYear: 2026, label: "Company Amex" },
13
+ { id: "pm_4", brand: "apple_pay" },
14
+ ];
15
+
16
+ const VIEWS = [
17
+ { value: "list", label: "Saved" },
18
+ { value: "empty", label: "Empty" },
19
+ { value: "loading", label: "Loading" },
20
+ ];
21
+
22
+ const wait = (ms) => new Promise((r) => setTimeout(r, ms));
23
+
24
+ export default function PaymentMethodsDemo() {
25
+ const [view, setView] = useState("list");
26
+ const [methods, setMethods] = useState(START);
27
+ const [failing, setFailing] = useState(false);
28
+ const [said, setSaid] = useState(null);
29
+
30
+ const settle = async () => {
31
+ await wait(500);
32
+ return failing ? { ok: false, error: "The payment provider did not answer. Try again." } : null;
33
+ };
34
+
35
+ return (
36
+ <div className="grid gap-6">
37
+ <div className="flex flex-wrap items-center justify-between gap-3">
38
+ <ToggleGroup items={VIEWS} value={view} onChange={setView} size="sm" aria-label="Which state to show" />
39
+ <Switch id="pm-fail" checked={failing} onChange={(e) => setFailing(e.target.checked)} label="Make saves fail" />
40
+ </div>
41
+ {said ? (
42
+ <p role="status" className="text-sm text-muted-foreground">
43
+ {said}
44
+ </p>
45
+ ) : null}
46
+ <PaymentMethods
47
+ methods={view === "empty" ? [] : methods}
48
+ loading={view === "loading"}
49
+ today="2026-09-23"
50
+ onAdd={async () => {
51
+ const failed = await settle();
52
+ if (failed) return failed;
53
+ setSaid("onAdd was called. The app would open Paddle's form to add a card now.");
54
+ return { ok: true };
55
+ }}
56
+ onSetDefault={async (m) => {
57
+ const failed = await settle();
58
+ if (failed) return failed;
59
+ setMethods((all) => all.map((x) => ({ ...x, isDefault: x.id === m.id })));
60
+ return { ok: true };
61
+ }}
62
+ onRemove={async (m) => {
63
+ const failed = await settle();
64
+ if (failed) return failed;
65
+ setMethods((all) => all.filter((x) => x.id !== m.id));
66
+ return { ok: true };
67
+ }}
68
+ />
69
+ </div>
70
+ );
71
+ }
@@ -0,0 +1,4 @@
1
+ // The PaymentMethods block — `makersclaw add payment-methods`. Fixed:
2
+ // compose it through its props (README.md beside this file); a list it
3
+ // cannot be is your own component in components/.
4
+ export { PaymentMethods } from "./payment-methods";