makersclaw 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD-PARTY-NOTICES.md +180 -0
- package/package.json +3 -2
- package/r/annotate.json +62 -0
- package/r/approval-request.json +52 -0
- package/r/audio-player.json +74 -0
- package/r/auth-form.json +55 -0
- package/r/board.json +10 -6
- package/r/calendar-view.json +105 -0
- package/r/cart.json +62 -0
- package/r/chart.json +83 -0
- package/r/chat.json +95 -0
- package/r/code-editor.json +94 -0
- package/r/comment-box.json +64 -0
- package/r/contact-section.json +53 -0
- package/r/core.json +205 -8
- package/r/csv-import.json +63 -0
- package/r/data-table.json +69 -0
- package/r/diagram.json +74 -0
- package/r/doc-editor.json +82 -0
- package/r/doc-page.json +61 -0
- package/r/email-render.json +73 -0
- package/r/faq.json +50 -0
- package/r/file-upload.json +54 -0
- package/r/flow-canvas.json +93 -0
- package/r/footer.json +52 -0
- package/r/gantt.json +70 -0
- package/r/job-panel.json +12 -7
- package/r/json-editor.json +66 -0
- package/r/map.json +89 -0
- package/r/menubar.json +52 -0
- package/r/mind-map.json +67 -0
- package/r/navigation-menu.json +52 -0
- package/r/order-detail.json +54 -0
- package/r/org-chart.json +66 -0
- package/r/page-builder.json +105 -0
- package/r/payment-methods.json +51 -0
- package/r/pdf-document.json +79 -0
- package/r/pdf-viewer.json +88 -0
- package/r/product-detail.json +76 -0
- package/r/product-grid.json +65 -0
- package/r/record-form.json +67 -0
- package/r/record-notes.json +55 -0
- package/r/registry.json +3411 -29
- package/r/search-dialog.json +51 -0
- package/r/settings-list.json +66 -0
- package/r/setup-checklist.json +51 -0
- package/r/share-dialog.json +52 -0
- package/r/sidebar.json +69 -0
- package/r/signature-pad.json +72 -0
- package/r/sketch-canvas.json +99 -0
- package/r/spreadsheet.json +90 -0
- package/r/stat-cards.json +66 -0
- package/r/task-list.json +63 -0
- package/r/task-model.json +98 -0
- package/r/testimonials.json +52 -0
- package/r/transaction-list.json +53 -0
- package/r/whiteboard.json +66 -0
- package/registry/blocks/annotate/README.md +179 -0
- package/registry/blocks/annotate/annotate-data.js +250 -0
- package/registry/blocks/annotate/annotate.jsx +646 -0
- package/registry/blocks/annotate/block.json +10 -0
- package/registry/blocks/annotate/demo.jsx +135 -0
- package/registry/blocks/annotate/index.js +15 -0
- package/registry/blocks/approval-request/README.md +116 -0
- package/registry/blocks/approval-request/approval-request.jsx +386 -0
- package/registry/blocks/approval-request/block.json +10 -0
- package/registry/blocks/approval-request/demo.jsx +127 -0
- package/registry/blocks/approval-request/index.js +4 -0
- package/registry/blocks/audio-player/README.md +167 -0
- package/registry/blocks/audio-player/audio-player.jsx +623 -0
- package/registry/blocks/audio-player/block.json +14 -0
- package/registry/blocks/audio-player/colors.js +109 -0
- package/registry/blocks/audio-player/demo.jsx +209 -0
- package/registry/blocks/audio-player/index.js +6 -0
- package/registry/blocks/audio-player/time.js +67 -0
- package/registry/blocks/audio-player/wavesurfer.js +9 -0
- package/registry/blocks/auth-form/README.md +126 -0
- package/registry/blocks/auth-form/auth-form.jsx +568 -0
- package/registry/blocks/auth-form/block.json +10 -0
- package/registry/blocks/auth-form/demo.jsx +131 -0
- package/registry/blocks/auth-form/index.js +3 -0
- package/registry/blocks/board/README.md +55 -5
- package/registry/blocks/board/block.json +2 -2
- package/registry/blocks/board/board.jsx +230 -86
- package/registry/blocks/board/demo.jsx +103 -24
- package/registry/blocks/calendar-view/README.md +180 -0
- package/registry/blocks/calendar-view/agenda.jsx +147 -0
- package/registry/blocks/calendar-view/block.json +76 -0
- package/registry/blocks/calendar-view/calendar-model.js +442 -0
- package/registry/blocks/calendar-view/calendar.jsx +627 -0
- package/registry/blocks/calendar-view/demo.jsx +195 -0
- package/registry/blocks/calendar-view/draft.jsx +49 -0
- package/registry/blocks/calendar-view/index.js +39 -0
- package/registry/blocks/calendar-view/month.jsx +346 -0
- package/registry/blocks/calendar-view/paint.js +69 -0
- package/registry/blocks/calendar-view/time-grid.jsx +527 -0
- package/registry/blocks/calendar-view/tray.jsx +87 -0
- package/registry/blocks/cart/README.md +146 -0
- package/registry/blocks/cart/block.json +10 -0
- package/registry/blocks/cart/cart.jsx +597 -0
- package/registry/blocks/cart/demo.jsx +98 -0
- package/registry/blocks/cart/index.js +4 -0
- package/registry/blocks/cart/money.js +28 -0
- package/registry/blocks/chart/README.md +316 -0
- package/registry/blocks/chart/block.json +10 -0
- package/registry/blocks/chart/cartesian.jsx +642 -0
- package/registry/blocks/chart/core.jsx +262 -0
- package/registry/blocks/chart/demo.jsx +357 -0
- package/registry/blocks/chart/heatmap.jsx +336 -0
- package/registry/blocks/chart/index.js +8 -0
- package/registry/blocks/chart/pie.jsx +245 -0
- package/registry/blocks/chart/sparkline.jsx +88 -0
- package/registry/blocks/chat/README.md +273 -0
- package/registry/blocks/chat/attachment.jsx +95 -0
- package/registry/blocks/chat/block.json +10 -0
- package/registry/blocks/chat/chat.jsx +132 -0
- package/registry/blocks/chat/composer.jsx +364 -0
- package/registry/blocks/chat/demo.jsx +578 -0
- package/registry/blocks/chat/header.jsx +34 -0
- package/registry/blocks/chat/index.js +9 -0
- package/registry/blocks/chat/message.jsx +450 -0
- package/registry/blocks/chat/scroller.jsx +247 -0
- package/registry/blocks/chat/text.jsx +104 -0
- package/registry/blocks/code-editor/README.md +210 -0
- package/registry/blocks/code-editor/block.json +22 -0
- package/registry/blocks/code-editor/code-editor.jsx +534 -0
- package/registry/blocks/code-editor/codemirror.js +38 -0
- package/registry/blocks/code-editor/demo.jsx +205 -0
- package/registry/blocks/code-editor/index.js +8 -0
- package/registry/blocks/code-editor/json.js +317 -0
- package/registry/blocks/code-editor/sql.js +136 -0
- package/registry/blocks/code-editor/text.js +101 -0
- package/registry/blocks/code-editor/theme.js +186 -0
- package/registry/blocks/comment-box/README.md +123 -0
- package/registry/blocks/comment-box/block.json +10 -0
- package/registry/blocks/comment-box/comment-body.jsx +217 -0
- package/registry/blocks/comment-box/comment-box.jsx +198 -0
- package/registry/blocks/comment-box/comment-time.jsx +77 -0
- package/registry/blocks/comment-box/demo.jsx +141 -0
- package/registry/blocks/comment-box/index.js +8 -0
- package/registry/blocks/contact-section/README.md +152 -0
- package/registry/blocks/contact-section/block.json +11 -0
- package/registry/blocks/contact-section/contact-section.jsx +509 -0
- package/registry/blocks/contact-section/demo.jsx +93 -0
- package/registry/blocks/contact-section/index.js +4 -0
- package/registry/blocks/csv-import/README.md +133 -0
- package/registry/blocks/csv-import/block.json +13 -0
- package/registry/blocks/csv-import/csv-import.jsx +479 -0
- package/registry/blocks/csv-import/demo.jsx +106 -0
- package/registry/blocks/csv-import/import.js +200 -0
- package/registry/blocks/csv-import/index.js +7 -0
- package/registry/blocks/data-table/README.md +386 -0
- package/registry/blocks/data-table/block.json +10 -0
- package/registry/blocks/data-table/data-table.jsx +1164 -0
- package/registry/blocks/data-table/demo.jsx +588 -0
- package/registry/blocks/data-table/index.js +5 -0
- package/registry/blocks/data-table/model.js +169 -0
- package/registry/blocks/diagram/README.md +108 -0
- package/registry/blocks/diagram/block.json +13 -0
- package/registry/blocks/diagram/demo.jsx +113 -0
- package/registry/blocks/diagram/diagram.jsx +481 -0
- package/registry/blocks/diagram/index.js +7 -0
- package/registry/blocks/diagram/mermaid.js +52 -0
- package/registry/blocks/diagram/palette.js +313 -0
- package/registry/blocks/diagram/source.js +98 -0
- package/registry/blocks/doc-editor/README.md +215 -0
- package/registry/blocks/doc-editor/block.json +15 -0
- package/registry/blocks/doc-editor/demo.jsx +225 -0
- package/registry/blocks/doc-editor/doc-editor.jsx +291 -0
- package/registry/blocks/doc-editor/doc.js +309 -0
- package/registry/blocks/doc-editor/index.js +7 -0
- package/registry/blocks/doc-editor/schema.jsx +56 -0
- package/registry/blocks/doc-editor/shadcn-classes.js +110 -0
- package/registry/blocks/doc-editor/theme.js +82 -0
- package/registry/blocks/doc-page/README.md +119 -0
- package/registry/blocks/doc-page/autosave.js +104 -0
- package/registry/blocks/doc-page/block.json +10 -0
- package/registry/blocks/doc-page/demo.jsx +137 -0
- package/registry/blocks/doc-page/doc-page.jsx +276 -0
- package/registry/blocks/doc-page/index.js +4 -0
- package/registry/blocks/email-render/README.md +151 -0
- package/registry/blocks/email-render/block.json +14 -0
- package/registry/blocks/email-render/demo.jsx +153 -0
- package/registry/blocks/email-render/doc-email.jsx +210 -0
- package/registry/blocks/email-render/email.jsx +221 -0
- package/registry/blocks/email-render/index.js +10 -0
- package/registry/blocks/email-render/render.js +50 -0
- package/registry/blocks/email-render/theme.js +215 -0
- package/registry/blocks/faq/README.md +101 -0
- package/registry/blocks/faq/block.json +11 -0
- package/registry/blocks/faq/demo.jsx +89 -0
- package/registry/blocks/faq/faq.jsx +220 -0
- package/registry/blocks/faq/index.js +4 -0
- package/registry/blocks/file-upload/README.md +138 -0
- package/registry/blocks/file-upload/block.json +10 -0
- package/registry/blocks/file-upload/demo.jsx +204 -0
- package/registry/blocks/file-upload/file-upload.jsx +635 -0
- package/registry/blocks/file-upload/index.js +4 -0
- package/registry/blocks/flow-canvas/README.md +420 -0
- package/registry/blocks/flow-canvas/block.json +13 -0
- package/registry/blocks/flow-canvas/board.js +819 -0
- package/registry/blocks/flow-canvas/chrome.jsx +649 -0
- package/registry/blocks/flow-canvas/context.jsx +35 -0
- package/registry/blocks/flow-canvas/demo.jsx +249 -0
- package/registry/blocks/flow-canvas/edges.jsx +107 -0
- package/registry/blocks/flow-canvas/flow-canvas.jsx +1329 -0
- package/registry/blocks/flow-canvas/index.js +41 -0
- package/registry/blocks/flow-canvas/nodes.jsx +392 -0
- package/registry/blocks/flow-canvas/theme.js +174 -0
- package/registry/blocks/footer/README.md +133 -0
- package/registry/blocks/footer/block.json +11 -0
- package/registry/blocks/footer/demo.jsx +119 -0
- package/registry/blocks/footer/footer.jsx +406 -0
- package/registry/blocks/footer/index.js +4 -0
- package/registry/blocks/gantt/README.md +220 -0
- package/registry/blocks/gantt/block.json +10 -0
- package/registry/blocks/gantt/demo.jsx +148 -0
- package/registry/blocks/gantt/gantt.jsx +923 -0
- package/registry/blocks/gantt/index.js +7 -0
- package/registry/blocks/gantt/rows.jsx +468 -0
- package/registry/blocks/gantt/schedule.js +278 -0
- package/registry/blocks/job-panel/README.md +80 -0
- package/registry/blocks/job-panel/block.json +3 -3
- package/registry/blocks/job-panel/demo.jsx +230 -3
- package/registry/blocks/job-panel/job-panel.jsx +169 -3
- package/registry/blocks/json-editor/README.md +133 -0
- package/registry/blocks/json-editor/block.json +10 -0
- package/registry/blocks/json-editor/demo.jsx +92 -0
- package/registry/blocks/json-editor/index.js +7 -0
- package/registry/blocks/json-editor/json-editor.jsx +305 -0
- package/registry/blocks/json-editor/json-tree.jsx +393 -0
- package/registry/blocks/json-editor/tree.js +225 -0
- package/registry/blocks/map/README.md +221 -0
- package/registry/blocks/map/block.json +14 -0
- package/registry/blocks/map/demo.jsx +201 -0
- package/registry/blocks/map/geo.js +198 -0
- package/registry/blocks/map/index.js +8 -0
- package/registry/blocks/map/list.jsx +128 -0
- package/registry/blocks/map/map-view.jsx +715 -0
- package/registry/blocks/map/maplibre.js +30 -0
- package/registry/blocks/map/marks.jsx +146 -0
- package/registry/blocks/map/theme.js +142 -0
- package/registry/blocks/menubar/README.md +109 -0
- package/registry/blocks/menubar/block.json +10 -0
- package/registry/blocks/menubar/demo.jsx +128 -0
- package/registry/blocks/menubar/index.js +4 -0
- package/registry/blocks/menubar/menubar.jsx +199 -0
- package/registry/blocks/mind-map/README.md +206 -0
- package/registry/blocks/mind-map/block.json +10 -0
- package/registry/blocks/mind-map/demo.jsx +103 -0
- package/registry/blocks/mind-map/index.js +31 -0
- package/registry/blocks/mind-map/mind-map.jsx +1125 -0
- package/registry/blocks/mind-map/topic.jsx +143 -0
- package/registry/blocks/mind-map/tree.js +645 -0
- package/registry/blocks/navigation-menu/README.md +124 -0
- package/registry/blocks/navigation-menu/block.json +10 -0
- package/registry/blocks/navigation-menu/demo.jsx +84 -0
- package/registry/blocks/navigation-menu/index.js +4 -0
- package/registry/blocks/navigation-menu/navigation-menu.jsx +448 -0
- package/registry/blocks/order-detail/README.md +109 -0
- package/registry/blocks/order-detail/block.json +10 -0
- package/registry/blocks/order-detail/demo.jsx +88 -0
- package/registry/blocks/order-detail/index.js +4 -0
- package/registry/blocks/order-detail/order-detail.jsx +354 -0
- package/registry/blocks/org-chart/README.md +145 -0
- package/registry/blocks/org-chart/block.json +10 -0
- package/registry/blocks/org-chart/demo.jsx +94 -0
- package/registry/blocks/org-chart/index.js +7 -0
- package/registry/blocks/org-chart/org-chart.jsx +631 -0
- package/registry/blocks/org-chart/org.js +245 -0
- package/registry/blocks/org-chart/person.jsx +96 -0
- package/registry/blocks/page-builder/README.md +257 -0
- package/registry/blocks/page-builder/block.json +14 -0
- package/registry/blocks/page-builder/demo.jsx +145 -0
- package/registry/blocks/page-builder/grapes.js +18 -0
- package/registry/blocks/page-builder/index.js +11 -0
- package/registry/blocks/page-builder/page-builder.jsx +704 -0
- package/registry/blocks/page-builder/page-view.jsx +33 -0
- package/registry/blocks/page-builder/page.js +118 -0
- package/registry/blocks/page-builder/panels.jsx +588 -0
- package/registry/blocks/page-builder/sections.js +209 -0
- package/registry/blocks/page-builder/theme.js +87 -0
- package/registry/blocks/page-builder/thumbs.jsx +189 -0
- package/registry/blocks/page-builder/tokens.js +329 -0
- package/registry/blocks/payment-methods/README.md +104 -0
- package/registry/blocks/payment-methods/block.json +10 -0
- package/registry/blocks/payment-methods/demo.jsx +71 -0
- package/registry/blocks/payment-methods/index.js +4 -0
- package/registry/blocks/payment-methods/payment-methods.jsx +302 -0
- package/registry/blocks/pdf-document/README.md +213 -0
- package/registry/blocks/pdf-document/block.json +13 -0
- package/registry/blocks/pdf-document/demo.jsx +136 -0
- package/registry/blocks/pdf-document/index.js +33 -0
- package/registry/blocks/pdf-document/money.js +83 -0
- package/registry/blocks/pdf-document/pdf-document.jsx +144 -0
- package/registry/blocks/pdf-document/primitives.jsx +271 -0
- package/registry/blocks/pdf-document/quote.jsx +179 -0
- package/registry/blocks/pdf-document/theme.js +193 -0
- package/registry/blocks/pdf-viewer/README.md +191 -0
- package/registry/blocks/pdf-viewer/block.json +14 -0
- package/registry/blocks/pdf-viewer/demo.jsx +252 -0
- package/registry/blocks/pdf-viewer/helpers.js +270 -0
- package/registry/blocks/pdf-viewer/index.js +8 -0
- package/registry/blocks/pdf-viewer/notes.jsx +195 -0
- package/registry/blocks/pdf-viewer/pdf-viewer.jsx +1368 -0
- package/registry/blocks/pdf-viewer/pdfjs.js +37 -0
- package/registry/blocks/pdf-viewer/ssr-shim-end.js +6 -0
- package/registry/blocks/pdf-viewer/ssr-shim.js +44 -0
- package/registry/blocks/product-detail/README.md +217 -0
- package/registry/blocks/product-detail/block.json +10 -0
- package/registry/blocks/product-detail/demo.jsx +233 -0
- package/registry/blocks/product-detail/index.js +7 -0
- package/registry/blocks/product-detail/price.jsx +115 -0
- package/registry/blocks/product-detail/product-detail.jsx +348 -0
- package/registry/blocks/product-detail/product-media.jsx +102 -0
- package/registry/blocks/product-detail/product-options.jsx +144 -0
- package/registry/blocks/product-grid/README.md +162 -0
- package/registry/blocks/product-grid/block.json +10 -0
- package/registry/blocks/product-grid/demo.jsx +255 -0
- package/registry/blocks/product-grid/index.js +5 -0
- package/registry/blocks/product-grid/product-card.jsx +232 -0
- package/registry/blocks/product-grid/product-grid.jsx +235 -0
- package/registry/blocks/record-form/README.md +196 -0
- package/registry/blocks/record-form/block.json +10 -0
- package/registry/blocks/record-form/demo.jsx +525 -0
- package/registry/blocks/record-form/index.js +4 -0
- package/registry/blocks/record-form/record-fields.jsx +457 -0
- package/registry/blocks/record-form/record-form.jsx +415 -0
- package/registry/blocks/record-form/rules.js +81 -0
- package/registry/blocks/record-notes/README.md +139 -0
- package/registry/blocks/record-notes/block.json +10 -0
- package/registry/blocks/record-notes/demo.jsx +179 -0
- package/registry/blocks/record-notes/index.js +4 -0
- package/registry/blocks/record-notes/record-notes.jsx +266 -0
- package/registry/blocks/search-dialog/README.md +108 -0
- package/registry/blocks/search-dialog/block.json +10 -0
- package/registry/blocks/search-dialog/demo.jsx +116 -0
- package/registry/blocks/search-dialog/index.js +3 -0
- package/registry/blocks/search-dialog/search-dialog.jsx +235 -0
- package/registry/blocks/settings-list/README.md +171 -0
- package/registry/blocks/settings-list/block.json +10 -0
- package/registry/blocks/settings-list/demo.jsx +333 -0
- package/registry/blocks/settings-list/index.js +4 -0
- package/registry/blocks/settings-list/row-state.jsx +93 -0
- package/registry/blocks/settings-list/settings-list.jsx +349 -0
- package/registry/blocks/settings-list/settings-matrix.jsx +118 -0
- package/registry/blocks/setup-checklist/README.md +142 -0
- package/registry/blocks/setup-checklist/block.json +10 -0
- package/registry/blocks/setup-checklist/demo.jsx +159 -0
- package/registry/blocks/setup-checklist/index.js +4 -0
- package/registry/blocks/setup-checklist/setup-checklist.jsx +446 -0
- package/registry/blocks/share-dialog/README.md +113 -0
- package/registry/blocks/share-dialog/block.json +10 -0
- package/registry/blocks/share-dialog/demo.jsx +140 -0
- package/registry/blocks/share-dialog/index.js +3 -0
- package/registry/blocks/share-dialog/share-dialog.jsx +384 -0
- package/registry/blocks/sidebar/README.md +190 -0
- package/registry/blocks/sidebar/block.json +43 -0
- package/registry/blocks/sidebar/demo.jsx +577 -0
- package/registry/blocks/sidebar/index.js +4 -0
- package/registry/blocks/sidebar/sidebar-panel.jsx +149 -0
- package/registry/blocks/sidebar/sidebar.jsx +864 -0
- package/registry/blocks/signature-pad/README.md +137 -0
- package/registry/blocks/signature-pad/block.json +13 -0
- package/registry/blocks/signature-pad/colors.js +115 -0
- package/registry/blocks/signature-pad/demo.jsx +94 -0
- package/registry/blocks/signature-pad/index.js +6 -0
- package/registry/blocks/signature-pad/pad.js +7 -0
- package/registry/blocks/signature-pad/signature-pad.jsx +434 -0
- package/registry/blocks/signature-pad/signature.js +68 -0
- package/registry/blocks/sketch-canvas/README.md +280 -0
- package/registry/blocks/sketch-canvas/block.json +13 -0
- package/registry/blocks/sketch-canvas/demo.jsx +159 -0
- package/registry/blocks/sketch-canvas/excalidraw.js +40 -0
- package/registry/blocks/sketch-canvas/index.js +9 -0
- package/registry/blocks/sketch-canvas/palette.js +226 -0
- package/registry/blocks/sketch-canvas/sketch-canvas.jsx +1188 -0
- package/registry/blocks/sketch-canvas/sketch.js +179 -0
- package/registry/blocks/sketch-canvas/ssr-shim-end.js +6 -0
- package/registry/blocks/sketch-canvas/ssr-shim.js +45 -0
- package/registry/blocks/sketch-canvas/stamps.js +104 -0
- package/registry/blocks/sketch-canvas/theme.js +131 -0
- package/registry/blocks/spreadsheet/README.md +307 -0
- package/registry/blocks/spreadsheet/block.json +13 -0
- package/registry/blocks/spreadsheet/cells.jsx +455 -0
- package/registry/blocks/spreadsheet/chrome.jsx +325 -0
- package/registry/blocks/spreadsheet/demo.jsx +177 -0
- package/registry/blocks/spreadsheet/grid.js +387 -0
- package/registry/blocks/spreadsheet/index.js +34 -0
- package/registry/blocks/spreadsheet/spreadsheet.jsx +1732 -0
- package/registry/blocks/spreadsheet/types.js +473 -0
- package/registry/blocks/stat-cards/README.md +173 -0
- package/registry/blocks/stat-cards/block.json +10 -0
- package/registry/blocks/stat-cards/demo.jsx +257 -0
- package/registry/blocks/stat-cards/index.js +4 -0
- package/registry/blocks/stat-cards/stat-cards.jsx +307 -0
- package/registry/blocks/stat-cards/usage.jsx +243 -0
- package/registry/blocks/task-list/README.md +176 -0
- package/registry/blocks/task-list/block.json +10 -0
- package/registry/blocks/task-list/demo.jsx +134 -0
- package/registry/blocks/task-list/index.js +5 -0
- package/registry/blocks/task-list/task-list.jsx +907 -0
- package/registry/blocks/task-model/README.md +455 -0
- package/registry/blocks/task-model/block.json +167 -0
- package/registry/blocks/task-model/changes.js +89 -0
- package/registry/blocks/task-model/dates.js +371 -0
- package/registry/blocks/task-model/demo.jsx +215 -0
- package/registry/blocks/task-model/dnd.jsx +240 -0
- package/registry/blocks/task-model/index.js +97 -0
- package/registry/blocks/task-model/model.js +919 -0
- package/registry/blocks/task-model/parts.jsx +449 -0
- package/registry/blocks/task-model/toolbar.jsx +271 -0
- package/registry/blocks/testimonials/README.md +139 -0
- package/registry/blocks/testimonials/block.json +11 -0
- package/registry/blocks/testimonials/demo.jsx +137 -0
- package/registry/blocks/testimonials/index.js +4 -0
- package/registry/blocks/testimonials/testimonials.jsx +430 -0
- package/registry/blocks/transaction-list/README.md +126 -0
- package/registry/blocks/transaction-list/block.json +10 -0
- package/registry/blocks/transaction-list/demo.jsx +79 -0
- package/registry/blocks/transaction-list/index.js +4 -0
- package/registry/blocks/transaction-list/transaction-list.jsx +383 -0
- package/registry/blocks/whiteboard/README.md +179 -0
- package/registry/blocks/whiteboard/block.json +10 -0
- package/registry/blocks/whiteboard/demo.jsx +169 -0
- package/registry/blocks/whiteboard/index.js +6 -0
- package/registry/blocks/whiteboard/templates.js +150 -0
- package/registry/blocks/whiteboard/whiteboard.jsx +721 -0
- package/src/cli.mjs +19 -6
- package/src/install.mjs +18 -0
- package/src/registry.mjs +38 -4
- package/src/shadcn.mjs +14 -1
- package/templates/next/files/README.md +145 -11
- package/templates/next/files/app/globals.css +55 -4
- package/templates/next/files/check/run.mjs +3 -3
- package/templates/next/files/components/ui/avatar.jsx +141 -0
- package/templates/next/files/components/ui/breadcrumb.jsx +149 -0
- package/templates/next/files/components/ui/button-group.jsx +70 -0
- package/templates/next/files/components/ui/button.jsx +132 -12
- package/templates/next/files/components/ui/calendar.jsx +609 -0
- package/templates/next/files/components/ui/carousel.jsx +281 -0
- package/templates/next/files/components/ui/collapsible.jsx +208 -0
- package/templates/next/files/components/ui/combobox.jsx +608 -0
- package/templates/next/files/components/ui/command.jsx +577 -0
- package/templates/next/files/components/ui/context-menu.jsx +191 -0
- package/templates/next/files/components/ui/date-picker.jsx +360 -0
- package/templates/next/files/components/ui/distribution.jsx +117 -0
- package/templates/next/files/components/ui/feedback.jsx +143 -0
- package/templates/next/files/components/ui/field.jsx +115 -3
- package/templates/next/files/components/ui/file-input.jsx +234 -0
- package/templates/next/files/components/ui/icon.jsx +130 -8
- package/templates/next/files/components/ui/image.jsx +143 -0
- package/templates/next/files/components/ui/index.js +47 -2
- package/templates/next/files/components/ui/input-group.jsx +213 -0
- package/templates/next/files/components/ui/input-otp.jsx +170 -0
- package/templates/next/files/components/ui/item.jsx +206 -0
- package/templates/next/files/components/ui/menu.jsx +454 -82
- package/templates/next/files/components/ui/notice.jsx +126 -14
- package/templates/next/files/components/ui/pagination.jsx +156 -0
- package/templates/next/files/components/ui/popover.jsx +284 -0
- package/templates/next/files/components/ui/radio.jsx +193 -0
- package/templates/next/files/components/ui/rating.jsx +131 -0
- package/templates/next/files/components/ui/resizable.jsx +338 -0
- package/templates/next/files/components/ui/scroll-area.jsx +123 -0
- package/templates/next/files/components/ui/separator.jsx +119 -0
- package/templates/next/files/components/ui/sheet.jsx +96 -11
- package/templates/next/files/components/ui/slider.jsx +174 -0
- package/templates/next/files/components/ui/stat.jsx +574 -0
- package/templates/next/files/components/ui/steps.jsx +338 -0
- package/templates/next/files/components/ui/swatch.jsx +33 -0
- package/templates/next/files/components/ui/table.jsx +130 -0
- package/templates/next/files/components/ui/toast.jsx +440 -0
- package/templates/next/files/components/ui/toggle.jsx +195 -0
- package/templates/next/files/components/ui/tooltip.jsx +270 -0
- 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
|
+
}
|