makersclaw 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +41 -1
- package/THIRD-PARTY-NOTICES.md +180 -0
- package/package.json +15 -8
- 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 +55 -0
- 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 +341 -0
- 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 +56 -0
- 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 +3612 -0
- 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 +64 -13
- package/registry/blocks/board/block.json +2 -2
- package/registry/blocks/board/board.jsx +237 -94
- 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 +86 -2
- 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/install.mjs +18 -0
- package/src/shadcn.mjs +171 -0
- 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/parts/fixture.jsx +1 -1
- package/templates/next/files/components/parts/sample.js +15 -0
- 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/files/lib/sample.js +4 -12
- package/templates/next/template.json +264 -8
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
import { useEffect, useId, useMemo, useRef, useState } from "react";
|
|
4
4
|
import { createPortal } from "react-dom";
|
|
5
|
-
import { moveRow } from "../../../lib/actions";
|
|
6
5
|
import { isSample } from "../../parts";
|
|
7
|
-
import { Button, Icon, Input, Menu, Notice, cx } from "../../ui";
|
|
6
|
+
import { Button, Collapsible, Icon, Input, Menu, Notice, cx } from "../../ui";
|
|
8
7
|
|
|
9
8
|
// Board — records as cards in columns, one column per stage, moved by
|
|
10
9
|
// dragging or from the card's menu. The block owns the behaviour a board
|
|
@@ -13,15 +12,47 @@ import { Button, Icon, Input, Menu, Notice, cx } from "../../ui";
|
|
|
13
12
|
// once and put back with a reason when the write fails, examples that
|
|
14
13
|
// move on screen and save nothing, the count in every header, and cards
|
|
15
14
|
// no stage claims kept in view instead of lost. The surface owns what a
|
|
16
|
-
// card says under its title
|
|
15
|
+
// card says under its title (renderDetails) and how a move is saved
|
|
16
|
+
// (onMove): the block imports nothing but React, the kit and the parts,
|
|
17
|
+
// so it runs in a Makersclaw app and in any shadcn project alike.
|
|
17
18
|
//
|
|
18
|
-
// <Board rows={deals} groupBy="stage" columns={STAGES}
|
|
19
|
+
// <Board rows={deals} groupBy="stage" columns={STAGES}
|
|
20
|
+
// onMove={(d, to) => moveRow({ source: "public.deals", id: d.id, stateColumn: "stage", to })}
|
|
19
21
|
// titleOf={(d) => d.name} renderDetails={(d) => <DealFacts deal={d} />}
|
|
20
22
|
// onOpen={setEditing} />
|
|
21
23
|
//
|
|
24
|
+
// Opt-in: an icon per column (`columns[].icon`), a figure beside each
|
|
25
|
+
// count (`aggregate(rows)` → "13pt"), a category's colour on each card's
|
|
26
|
+
// edge (`accentOf(row)` → 1…5, `accentEdge` top | start), and
|
|
27
|
+
// `layout="stacked"` — the stages as folding sections of compact rows.
|
|
28
|
+
//
|
|
22
29
|
// README.md beside this file lists every prop.
|
|
23
30
|
|
|
24
31
|
const OTHER = "__other";
|
|
32
|
+
|
|
33
|
+
// A card's accent: a category's colour on one edge, from the chart tokens
|
|
34
|
+
// (chart-1…5), written out whole so Tailwind finds every class.
|
|
35
|
+
const ACCENTS = {
|
|
36
|
+
top: {
|
|
37
|
+
1: "border-t-[3px] border-t-chart-1",
|
|
38
|
+
2: "border-t-[3px] border-t-chart-2",
|
|
39
|
+
3: "border-t-[3px] border-t-chart-3",
|
|
40
|
+
4: "border-t-[3px] border-t-chart-4",
|
|
41
|
+
5: "border-t-[3px] border-t-chart-5",
|
|
42
|
+
},
|
|
43
|
+
start: {
|
|
44
|
+
1: "border-s-[3px] border-s-chart-1",
|
|
45
|
+
2: "border-s-[3px] border-s-chart-2",
|
|
46
|
+
3: "border-s-[3px] border-s-chart-3",
|
|
47
|
+
4: "border-s-[3px] border-s-chart-4",
|
|
48
|
+
5: "border-s-[3px] border-s-chart-5",
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
function accentHue(value) {
|
|
53
|
+
const n = typeof value === "string" ? Number(value.replace(/^chart-/, "")) : value;
|
|
54
|
+
return Number.isInteger(n) && n >= 1 && n <= 5 ? n : null;
|
|
55
|
+
}
|
|
25
56
|
const DRAG_START_PX = { mouse: 5, pen: 6, touch: 8 };
|
|
26
57
|
|
|
27
58
|
function humanize(key) {
|
|
@@ -42,7 +73,6 @@ export function Board({
|
|
|
42
73
|
groupBy,
|
|
43
74
|
columns,
|
|
44
75
|
idColumn = "id",
|
|
45
|
-
source,
|
|
46
76
|
onMove,
|
|
47
77
|
renderDetails,
|
|
48
78
|
titleOf = (row) => row.title ?? row.name ?? String(row[idColumn] ?? ""),
|
|
@@ -53,6 +83,11 @@ export function Board({
|
|
|
53
83
|
addLabel = "Add",
|
|
54
84
|
createPlaceholder = "Title, then Enter",
|
|
55
85
|
limits,
|
|
86
|
+
aggregate,
|
|
87
|
+
accentOf,
|
|
88
|
+
accentEdge = "top",
|
|
89
|
+
layout = "columns",
|
|
90
|
+
defaultOpen,
|
|
56
91
|
label = "Board",
|
|
57
92
|
emptyLabel = "Nothing here yet",
|
|
58
93
|
otherLabel = "No stage",
|
|
@@ -71,7 +106,7 @@ export function Board({
|
|
|
71
106
|
const [busy, setBusy] = useState(false);
|
|
72
107
|
const [portal, setPortal] = useState(null);
|
|
73
108
|
|
|
74
|
-
const movable =
|
|
109
|
+
const movable = typeof onMove === "function";
|
|
75
110
|
const list = rows ?? [];
|
|
76
111
|
const keyOf = (row) => String(row?.[idColumn]);
|
|
77
112
|
const cols = useMemo(() => normalizeColumns(columns), [columns]);
|
|
@@ -106,6 +141,12 @@ export function Board({
|
|
|
106
141
|
return out;
|
|
107
142
|
}, [list, cols, overrides]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
108
143
|
|
|
144
|
+
const stacked = layout === "stacked";
|
|
145
|
+
const accent = (row, edge = accentEdge) => {
|
|
146
|
+
if (!accentOf) return null;
|
|
147
|
+
const hue = accentHue(accentOf(row));
|
|
148
|
+
return hue ? (ACCENTS[edge] ?? ACCENTS.top)[hue] : null;
|
|
149
|
+
};
|
|
109
150
|
const shown = byColumn.get(OTHER).length ? [...cols, { key: OTHER, label: otherLabel, other: true }] : cols;
|
|
110
151
|
const labelOf = (key) => shown.find((c) => c.key === key)?.label ?? humanize(key);
|
|
111
152
|
|
|
@@ -121,9 +162,7 @@ export function Board({
|
|
|
121
162
|
if (isSample(row)) return;
|
|
122
163
|
let result;
|
|
123
164
|
try {
|
|
124
|
-
result = onMove
|
|
125
|
-
? await onMove(row, to, from === OTHER ? null : from)
|
|
126
|
-
: await moveRow({ source, idColumn, id: row[idColumn], stateColumn: groupBy, to });
|
|
165
|
+
result = await onMove(row, to, from === OTHER ? null : from);
|
|
127
166
|
} catch (e) {
|
|
128
167
|
result = { ok: false, error: e?.message ?? String(e) };
|
|
129
168
|
}
|
|
@@ -245,34 +284,115 @@ export function Board({
|
|
|
245
284
|
}
|
|
246
285
|
}
|
|
247
286
|
|
|
287
|
+
// The "Add" at a stage's foot, and the inline field it opens.
|
|
288
|
+
function adder(col, headingId, pad = "px-2 pb-2") {
|
|
289
|
+
if (!onCreate || col.other) return null;
|
|
290
|
+
if (adding !== col.key) {
|
|
291
|
+
return (
|
|
292
|
+
<div className={pad}>
|
|
293
|
+
<Button
|
|
294
|
+
variant="quiet"
|
|
295
|
+
size="sm"
|
|
296
|
+
icon="plus"
|
|
297
|
+
align="start"
|
|
298
|
+
className="w-full"
|
|
299
|
+
onClick={() => {
|
|
300
|
+
setAdding(col.key);
|
|
301
|
+
setDraft("");
|
|
302
|
+
}}
|
|
303
|
+
>
|
|
304
|
+
{addLabel}
|
|
305
|
+
</Button>
|
|
306
|
+
</div>
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
return (
|
|
310
|
+
<form onSubmit={(e) => create(e, col.key)} className={pad}>
|
|
311
|
+
<label htmlFor={`${headingId}-new`} className="sr-only">
|
|
312
|
+
New in {col.label}
|
|
313
|
+
</label>
|
|
314
|
+
<Input
|
|
315
|
+
id={`${headingId}-new`}
|
|
316
|
+
autoFocus
|
|
317
|
+
value={draft}
|
|
318
|
+
disabled={busy}
|
|
319
|
+
placeholder={createPlaceholder}
|
|
320
|
+
onChange={(e) => setDraft(e.target.value)}
|
|
321
|
+
onKeyDown={(e) => {
|
|
322
|
+
// Enter adds here, not through the form's implicit submit: a
|
|
323
|
+
// synthetic Enter (an agent testing the app) has no keypress to
|
|
324
|
+
// submit with. Never while an input method is composing a word.
|
|
325
|
+
if (e.key === "Enter" && !e.nativeEvent.isComposing) create(e, col.key);
|
|
326
|
+
else if (e.key === "Escape") {
|
|
327
|
+
setAdding(null);
|
|
328
|
+
setDraft("");
|
|
329
|
+
}
|
|
330
|
+
}}
|
|
331
|
+
onBlur={() => {
|
|
332
|
+
if (!draft.trim()) setAdding(null);
|
|
333
|
+
}}
|
|
334
|
+
/>
|
|
335
|
+
</form>
|
|
336
|
+
);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
function header(col, cards) {
|
|
340
|
+
const limit = limits?.[col.key];
|
|
341
|
+
const over = typeof limit === "number" && cards.length > limit;
|
|
342
|
+
return {
|
|
343
|
+
icon: col.icon ? <Icon name={col.icon} size={16} className="shrink-0 text-muted-foreground" /> : null,
|
|
344
|
+
total: aggregate ? (
|
|
345
|
+
<span data-nums className="shrink-0 text-xs text-muted-foreground">
|
|
346
|
+
{aggregate(cards, col.other ? null : col.key)}
|
|
347
|
+
</span>
|
|
348
|
+
) : null,
|
|
349
|
+
count: (
|
|
350
|
+
<span
|
|
351
|
+
data-nums
|
|
352
|
+
className={cx("shrink-0 font-mono text-xs", over ? "font-semibold text-warning" : "text-muted-foreground")}
|
|
353
|
+
title={typeof limit === "number" ? `${cards.length} of a limit of ${limit}` : undefined}
|
|
354
|
+
>
|
|
355
|
+
{typeof limit === "number" ? `${cards.length}/${limit}` : cards.length}
|
|
356
|
+
</span>
|
|
357
|
+
),
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
function moveItems(row) {
|
|
362
|
+
return movable
|
|
363
|
+
? shown
|
|
364
|
+
.filter((c) => !c.other && c.key !== columnOf(row))
|
|
365
|
+
.map((c) => ({ label: `Move to ${c.label}`, icon: "arrow-right", onSelect: () => move(row, c.key) }))
|
|
366
|
+
: [];
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
function titleButton(row, title, extra) {
|
|
370
|
+
return onOpen ? (
|
|
371
|
+
<button
|
|
372
|
+
type="button"
|
|
373
|
+
onClick={() => onOpen(row)}
|
|
374
|
+
className={cx("block w-full rounded-sm text-left text-sm font-medium outline-none hover:underline focus-visible:ring-2 focus-visible:ring-ring", extra)}
|
|
375
|
+
>
|
|
376
|
+
{title}
|
|
377
|
+
</button>
|
|
378
|
+
) : (
|
|
379
|
+
<p className={cx("text-sm font-medium", extra)}>{title}</p>
|
|
380
|
+
);
|
|
381
|
+
}
|
|
382
|
+
|
|
248
383
|
function card(row, { ghost = false } = {}) {
|
|
249
384
|
const title = titleOf(row);
|
|
250
385
|
const body = (
|
|
251
386
|
<>
|
|
252
|
-
{
|
|
253
|
-
<button
|
|
254
|
-
type="button"
|
|
255
|
-
onClick={() => onOpen(row)}
|
|
256
|
-
className="block w-full rounded-sm text-left text-sm font-medium outline-none hover:underline focus-visible:ring-2 focus-visible:ring-ring"
|
|
257
|
-
>
|
|
258
|
-
{title}
|
|
259
|
-
</button>
|
|
260
|
-
) : (
|
|
261
|
-
<p className="text-sm font-medium">{title}</p>
|
|
262
|
-
)}
|
|
387
|
+
{titleButton(row, title)}
|
|
263
388
|
{renderDetails ? (
|
|
264
|
-
<div className="mt-2">{renderDetails(row, { column: columnOf(row) })}</div>
|
|
389
|
+
<div className="mt-2">{renderDetails(row, { column: columnOf(row), layout: "columns" })}</div>
|
|
265
390
|
) : metaOf ? (
|
|
266
391
|
<div className="mt-1 text-xs text-muted-foreground">{metaOf(row)}</div>
|
|
267
392
|
) : null}
|
|
268
393
|
</>
|
|
269
394
|
);
|
|
270
|
-
const
|
|
271
|
-
? shown
|
|
272
|
-
.filter((c) => !c.other && c.key !== columnOf(row))
|
|
273
|
-
.map((c) => ({ label: `Move to ${c.label}`, icon: "arrow-right", onSelect: () => move(row, c.key) }))
|
|
274
|
-
: [];
|
|
275
|
-
const items = [...(actionsOf?.(row) ?? []), ...moveTo];
|
|
395
|
+
const items = [...(actionsOf?.(row) ?? []), ...moveItems(row)];
|
|
276
396
|
return (
|
|
277
397
|
<div className="flex items-start gap-1">
|
|
278
398
|
{movable && !ghost ? (
|
|
@@ -286,18 +406,89 @@ export function Board({
|
|
|
286
406
|
</span>
|
|
287
407
|
) : null}
|
|
288
408
|
<div className="min-w-0 flex-1">{body}</div>
|
|
289
|
-
{!ghost ? <Menu items={items} label={`Actions for ${title}`} className="-mr-
|
|
409
|
+
{!ghost ? <Menu items={items} label={`Actions for ${title}`} size="md" className="-mr-2 -mt-2 -mb-2 shrink-0" /> : null}
|
|
410
|
+
</div>
|
|
411
|
+
);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
const notice = error ? (
|
|
415
|
+
<Notice tone="danger" onDismiss={() => setError(null)}>
|
|
416
|
+
{error}
|
|
417
|
+
</Notice>
|
|
418
|
+
) : null;
|
|
419
|
+
const live = (
|
|
420
|
+
<p aria-live="polite" className="sr-only">
|
|
421
|
+
{announce}
|
|
422
|
+
</p>
|
|
423
|
+
);
|
|
424
|
+
|
|
425
|
+
// Stacked: the stages one under another, each a section that folds, the
|
|
426
|
+
// records as compact rows. Nothing drags here — a row moves through its
|
|
427
|
+
// menu ("Move to …"), the same path the keyboard takes on the columns —
|
|
428
|
+
// so a phone scrolls the page, never a board sideways.
|
|
429
|
+
if (stacked) {
|
|
430
|
+
const opens = defaultOpen == null ? null : new Set((Array.isArray(defaultOpen) ? defaultOpen : [defaultOpen]).map(String));
|
|
431
|
+
return (
|
|
432
|
+
<div className={cx("grid gap-3", className)}>
|
|
433
|
+
{notice}
|
|
434
|
+
<div role="region" aria-label={label} className="overflow-hidden rounded-lg border border-border bg-card text-card-foreground">
|
|
435
|
+
{shown.map((col) => {
|
|
436
|
+
const rowsHere = byColumn.get(col.key) ?? [];
|
|
437
|
+
const head = header(col, rowsHere);
|
|
438
|
+
const headingId = `${uid}-${col.key}`;
|
|
439
|
+
return (
|
|
440
|
+
<Collapsible
|
|
441
|
+
key={col.key}
|
|
442
|
+
variant="flush"
|
|
443
|
+
defaultOpen={opens ? opens.has(col.key) : true}
|
|
444
|
+
title={
|
|
445
|
+
<span className="flex min-w-0 items-center gap-2">
|
|
446
|
+
{head.icon}
|
|
447
|
+
<span id={headingId} className="truncate font-semibold">
|
|
448
|
+
{col.label}
|
|
449
|
+
</span>
|
|
450
|
+
</span>
|
|
451
|
+
}
|
|
452
|
+
meta={
|
|
453
|
+
<span className="flex items-center gap-2">
|
|
454
|
+
{head.total}
|
|
455
|
+
{head.count}
|
|
456
|
+
</span>
|
|
457
|
+
}
|
|
458
|
+
>
|
|
459
|
+
<ul aria-labelledby={headingId} className={cx("-mx-4 divide-y divide-border border-t border-border", !onCreate || col.other ? "-mb-4" : "mb-2")}>
|
|
460
|
+
{rowsHere.map((row) => {
|
|
461
|
+
const id = keyOf(row);
|
|
462
|
+
const title = titleOf(row);
|
|
463
|
+
const items = [...(actionsOf?.(row) ?? []), ...moveItems(row)];
|
|
464
|
+
return (
|
|
465
|
+
<li key={id} data-board-card={id} className={cx("flex min-h-11 items-center gap-3 px-4 py-1.5", accent(row, "start"))}>
|
|
466
|
+
<div className="min-w-0 flex-1">
|
|
467
|
+
{titleButton(row, title, "truncate")}
|
|
468
|
+
{metaOf ? <div className="truncate text-xs text-muted-foreground">{metaOf(row)}</div> : null}
|
|
469
|
+
</div>
|
|
470
|
+
{renderDetails ? (
|
|
471
|
+
<div className="flex shrink-0 items-center gap-2">{renderDetails(row, { column: columnOf(row), layout: "stacked" })}</div>
|
|
472
|
+
) : null}
|
|
473
|
+
<Menu items={items} label={`Actions for ${title}`} size="md" className="-mr-2 shrink-0" />
|
|
474
|
+
</li>
|
|
475
|
+
);
|
|
476
|
+
})}
|
|
477
|
+
{rowsHere.length === 0 ? <li className="px-4 py-3 text-xs text-muted-foreground">{emptyLabel}</li> : null}
|
|
478
|
+
</ul>
|
|
479
|
+
{adder(col, headingId, "-mx-2")}
|
|
480
|
+
</Collapsible>
|
|
481
|
+
);
|
|
482
|
+
})}
|
|
483
|
+
</div>
|
|
484
|
+
{live}
|
|
290
485
|
</div>
|
|
291
486
|
);
|
|
292
487
|
}
|
|
293
488
|
|
|
294
489
|
return (
|
|
295
490
|
<div className={cx("grid gap-3", className)}>
|
|
296
|
-
{
|
|
297
|
-
<Notice tone="danger" onDismiss={() => setError(null)}>
|
|
298
|
-
{error}
|
|
299
|
-
</Notice>
|
|
300
|
-
) : null}
|
|
491
|
+
{notice}
|
|
301
492
|
<div
|
|
302
493
|
ref={boardRef}
|
|
303
494
|
role="region"
|
|
@@ -307,8 +498,7 @@ export function Board({
|
|
|
307
498
|
>
|
|
308
499
|
{shown.map((col) => {
|
|
309
500
|
const cards = byColumn.get(col.key) ?? [];
|
|
310
|
-
const
|
|
311
|
-
const over = typeof limit === "number" && cards.length > limit;
|
|
501
|
+
const head = header(col, cards);
|
|
312
502
|
const target = drag && drag.over === col.key && !col.other && columnOf(drag.row) !== col.key;
|
|
313
503
|
const headingId = `${uid}-${col.key}`;
|
|
314
504
|
return (
|
|
@@ -321,17 +511,13 @@ export function Board({
|
|
|
321
511
|
target && "bg-accent ring-2 ring-ring",
|
|
322
512
|
)}
|
|
323
513
|
>
|
|
324
|
-
<header className="flex min-h-11 items-center
|
|
325
|
-
|
|
514
|
+
<header className="flex min-h-11 items-center gap-2 px-3">
|
|
515
|
+
{head.icon}
|
|
516
|
+
<h3 id={headingId} className="min-w-0 flex-1 truncate text-sm font-semibold">
|
|
326
517
|
{col.label}
|
|
327
518
|
</h3>
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
className={cx("shrink-0 font-mono text-xs", over ? "font-semibold text-warning" : "text-muted-foreground")}
|
|
331
|
-
title={typeof limit === "number" ? `${cards.length} of a limit of ${limit}` : undefined}
|
|
332
|
-
>
|
|
333
|
-
{typeof limit === "number" ? `${cards.length}/${limit}` : cards.length}
|
|
334
|
-
</span>
|
|
519
|
+
{head.total}
|
|
520
|
+
{head.count}
|
|
335
521
|
</header>
|
|
336
522
|
<ul className="flex min-h-16 flex-1 flex-col gap-2 overflow-y-auto px-2 pb-2">
|
|
337
523
|
{cards.map((row) => {
|
|
@@ -353,6 +539,7 @@ export function Board({
|
|
|
353
539
|
}}
|
|
354
540
|
className={cx(
|
|
355
541
|
"rounded-md border border-border bg-card p-3 text-card-foreground shadow-sm",
|
|
542
|
+
accent(row),
|
|
356
543
|
movable && "sm:cursor-grab",
|
|
357
544
|
lifted && "opacity-40",
|
|
358
545
|
)}
|
|
@@ -365,64 +552,20 @@ export function Board({
|
|
|
365
552
|
<li className="rounded-md border border-dashed border-border p-3 text-xs text-muted-foreground">{emptyLabel}</li>
|
|
366
553
|
) : null}
|
|
367
554
|
</ul>
|
|
368
|
-
{
|
|
369
|
-
adding === col.key ? (
|
|
370
|
-
<form onSubmit={(e) => create(e, col.key)} className="px-2 pb-2">
|
|
371
|
-
<label htmlFor={`${headingId}-new`} className="sr-only">
|
|
372
|
-
New in {col.label}
|
|
373
|
-
</label>
|
|
374
|
-
<Input
|
|
375
|
-
id={`${headingId}-new`}
|
|
376
|
-
autoFocus
|
|
377
|
-
value={draft}
|
|
378
|
-
disabled={busy}
|
|
379
|
-
placeholder={createPlaceholder}
|
|
380
|
-
onChange={(e) => setDraft(e.target.value)}
|
|
381
|
-
onKeyDown={(e) => {
|
|
382
|
-
// Enter adds here, not through the form's implicit
|
|
383
|
-
// submit: a synthetic Enter (an agent testing the
|
|
384
|
-
// app) has no keypress to submit with. Never while
|
|
385
|
-
// an input method is composing a word.
|
|
386
|
-
if (e.key === "Enter" && !e.nativeEvent.isComposing) create(e, col.key);
|
|
387
|
-
else if (e.key === "Escape") {
|
|
388
|
-
setAdding(null);
|
|
389
|
-
setDraft("");
|
|
390
|
-
}
|
|
391
|
-
}}
|
|
392
|
-
onBlur={() => {
|
|
393
|
-
if (!draft.trim()) setAdding(null);
|
|
394
|
-
}}
|
|
395
|
-
/>
|
|
396
|
-
</form>
|
|
397
|
-
) : (
|
|
398
|
-
<div className="px-2 pb-2">
|
|
399
|
-
<Button
|
|
400
|
-
variant="quiet"
|
|
401
|
-
size="sm"
|
|
402
|
-
icon="plus"
|
|
403
|
-
className="w-full justify-start"
|
|
404
|
-
onClick={() => {
|
|
405
|
-
setAdding(col.key);
|
|
406
|
-
setDraft("");
|
|
407
|
-
}}
|
|
408
|
-
>
|
|
409
|
-
{addLabel}
|
|
410
|
-
</Button>
|
|
411
|
-
</div>
|
|
412
|
-
)
|
|
413
|
-
) : null}
|
|
555
|
+
{adder(col, headingId)}
|
|
414
556
|
</section>
|
|
415
557
|
);
|
|
416
558
|
})}
|
|
417
559
|
</div>
|
|
418
|
-
|
|
419
|
-
{announce}
|
|
420
|
-
</p>
|
|
560
|
+
{live}
|
|
421
561
|
{drag && portal
|
|
422
562
|
? createPortal(
|
|
423
563
|
<div
|
|
424
564
|
aria-hidden="true"
|
|
425
|
-
className=
|
|
565
|
+
className={cx(
|
|
566
|
+
"pointer-events-none fixed z-50 rotate-2 rounded-md border border-border bg-card p-3 text-card-foreground shadow-lg",
|
|
567
|
+
accent(drag.row),
|
|
568
|
+
)}
|
|
426
569
|
style={{ left: drag.x - drag.offsetX, top: drag.y - drag.offsetY, width: drag.width }}
|
|
427
570
|
>
|
|
428
571
|
{card(drag.row, { ghost: true })}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// surface. Not installed into apps: `makersclaw add board` lays index.js
|
|
5
5
|
// and board.jsx only.
|
|
6
6
|
import { useState } from "react";
|
|
7
|
-
import { Badge } from "../components/ui";
|
|
7
|
+
import { Badge, Card } from "../components/ui";
|
|
8
8
|
import { Board } from "../components/blocks/board";
|
|
9
9
|
|
|
10
10
|
const STAGES = [
|
|
@@ -21,30 +21,109 @@ const START = [
|
|
|
21
21
|
{ id: 5, name: "Umbrella", stage: "paused", owner: "Leon", value: 3000 },
|
|
22
22
|
];
|
|
23
23
|
|
|
24
|
+
// A sprint: an icon per column, points summed beside each count, the
|
|
25
|
+
// story's type as the card's top edge.
|
|
26
|
+
const SPRINT_STAGES = [
|
|
27
|
+
{ key: "todo", label: "To do", icon: "inbox" },
|
|
28
|
+
{ key: "doing", label: "In progress", icon: "zap" },
|
|
29
|
+
{ key: "review", label: "Review", icon: "eye" },
|
|
30
|
+
{ key: "done", label: "Done", icon: "circle-check" },
|
|
31
|
+
];
|
|
32
|
+
const TYPES = { feature: 1, bug: 4, task: 2 };
|
|
33
|
+
const SPRINT = [
|
|
34
|
+
{ id: "s1", title: "Invite teammates by email", status: "todo", type: "feature", points: 5 },
|
|
35
|
+
{ id: "s2", title: "Export fails on empty rows", status: "todo", type: "bug", points: 2 },
|
|
36
|
+
{ id: "s3", title: "Billing page copy", status: "doing", type: "task", points: 1 },
|
|
37
|
+
{ id: "s4", title: "Saved filters", status: "doing", type: "feature", points: 8 },
|
|
38
|
+
{ id: "s5", title: "Timezone drift in reports", status: "review", type: "bug", points: 3 },
|
|
39
|
+
{ id: "s6", title: "Onboarding checklist", status: "done", type: "feature", points: 5 },
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
// Chores, stacked: the stages fold, each record is a row.
|
|
43
|
+
const CHORE_STAGES = [
|
|
44
|
+
{ key: "todo", label: "To do", icon: "inbox" },
|
|
45
|
+
{ key: "doing", label: "Doing", icon: "clock" },
|
|
46
|
+
{ key: "done", label: "Done", icon: "circle-check" },
|
|
47
|
+
];
|
|
48
|
+
const ROOMS = { Kitchen: 2, Bathroom: 3, Garden: 5 };
|
|
49
|
+
const CHORES = [
|
|
50
|
+
{ id: "c1", title: "Clean the fridge", state: "todo", room: "Kitchen", every: "Weekly" },
|
|
51
|
+
{ id: "c2", title: "Scrub the shower", state: "todo", room: "Bathroom", every: "Weekly" },
|
|
52
|
+
{ id: "c3", title: "Water the plants", state: "doing", room: "Garden", every: "Daily" },
|
|
53
|
+
{ id: "c4", title: "Empty the dishwasher", state: "done", room: "Kitchen", every: "Daily" },
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
function useMoves(start, key) {
|
|
57
|
+
const [rows, setRows] = useState(start);
|
|
58
|
+
const onMove = async (row, to) => {
|
|
59
|
+
setRows((all) => all.map((r) => (r.id === row.id ? { ...r, [key]: to } : r)));
|
|
60
|
+
return { ok: true };
|
|
61
|
+
};
|
|
62
|
+
return [rows, setRows, onMove];
|
|
63
|
+
}
|
|
64
|
+
|
|
24
65
|
export default function BoardDemo() {
|
|
25
|
-
const [rows, setRows] =
|
|
66
|
+
const [rows, setRows, onMove] = useMoves(START, "stage");
|
|
67
|
+
const [sprint, , moveStory] = useMoves(SPRINT, "status");
|
|
68
|
+
const [chores, setChores, moveChore] = useMoves(CHORES, "state");
|
|
26
69
|
return (
|
|
27
|
-
<
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
70
|
+
<div className="grid gap-6">
|
|
71
|
+
<Board
|
|
72
|
+
rows={rows}
|
|
73
|
+
groupBy="stage"
|
|
74
|
+
columns={STAGES}
|
|
75
|
+
titleOf={(d) => d.name}
|
|
76
|
+
onMove={onMove}
|
|
77
|
+
onCreate={async (name, stage) => {
|
|
78
|
+
setRows((all) => [...all, { id: Date.now(), name, stage, owner: null, value: 0 }]);
|
|
79
|
+
return { ok: true };
|
|
80
|
+
}}
|
|
81
|
+
renderDetails={(d) => (
|
|
82
|
+
<div className="flex items-center justify-between text-xs text-muted-foreground">
|
|
83
|
+
<span>{d.owner ?? "Unowned"}</span>
|
|
84
|
+
<Badge>{Number(d.value ?? 0).toLocaleString()}</Badge>
|
|
85
|
+
</div>
|
|
86
|
+
)}
|
|
87
|
+
limits={{ call: 1 }}
|
|
88
|
+
label="Demo deals by stage"
|
|
89
|
+
/>
|
|
90
|
+
|
|
91
|
+
<Card title="Sprint 18" description="Icons, points per column, a top edge by type">
|
|
92
|
+
<Board
|
|
93
|
+
rows={sprint}
|
|
94
|
+
groupBy="status"
|
|
95
|
+
columns={SPRINT_STAGES}
|
|
96
|
+
onMove={moveStory}
|
|
97
|
+
aggregate={(list) => `${list.reduce((s, r) => s + r.points, 0)}pt`}
|
|
98
|
+
accentOf={(r) => TYPES[r.type] ?? null}
|
|
99
|
+
renderDetails={(r) => (
|
|
100
|
+
<div className="flex items-center justify-between text-xs text-muted-foreground">
|
|
101
|
+
<span className="capitalize">{r.type}</span>
|
|
102
|
+
<Badge>{r.points}pt</Badge>
|
|
103
|
+
</div>
|
|
104
|
+
)}
|
|
105
|
+
label="Sprint 18 stories by status"
|
|
106
|
+
/>
|
|
107
|
+
</Card>
|
|
108
|
+
|
|
109
|
+
<Card title="Chores" description="Stacked: stages fold, rows move from their menu">
|
|
110
|
+
<Board
|
|
111
|
+
layout="stacked"
|
|
112
|
+
rows={chores}
|
|
113
|
+
groupBy="state"
|
|
114
|
+
columns={CHORE_STAGES}
|
|
115
|
+
onMove={moveChore}
|
|
116
|
+
defaultOpen={["todo", "doing"]}
|
|
117
|
+
accentOf={(r) => ROOMS[r.room] ?? null}
|
|
118
|
+
metaOf={(r) => r.room}
|
|
119
|
+
renderDetails={(r) => <Badge tone={r.every === "Daily" ? "warning" : "info"}>{r.every}</Badge>}
|
|
120
|
+
onCreate={async (title, state) => {
|
|
121
|
+
setChores((all) => [...all, { id: `c${Date.now()}`, title, state, room: "Kitchen", every: "Weekly" }]);
|
|
122
|
+
return { ok: true };
|
|
123
|
+
}}
|
|
124
|
+
label="Chores by state"
|
|
125
|
+
/>
|
|
126
|
+
</Card>
|
|
127
|
+
</div>
|
|
49
128
|
);
|
|
50
129
|
}
|