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
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
# FlowCanvas
|
|
2
|
+
|
|
3
|
+
A Miro-like board in the workspace theme. Sticky notes, shapes, text,
|
|
4
|
+
frames, cards and images on an infinite dotted canvas. A tool rail on the
|
|
5
|
+
left (a bar along the bottom on a narrow canvas), double-click anywhere
|
|
6
|
+
for a sticky, drag from a card's dot to another card to connect them —
|
|
7
|
+
or drop on empty canvas to pick what to add there. A floating toolbar
|
|
8
|
+
over the selection, a right-click menu, undo/redo, copy/paste, snap to
|
|
9
|
+
grid, a minimap, a list view for keyboards and screen readers, and a
|
|
10
|
+
presentation mode that steps through the frames.
|
|
11
|
+
|
|
12
|
+
It is [React Flow](https://reactflow.dev) (`@xyflow/react`, MIT)
|
|
13
|
+
underneath, with its colours mapped onto the workspace's tokens. The
|
|
14
|
+
canvas blocks — `account-map`, `process-map`, `journey-map`, `idea-board`
|
|
15
|
+
— are built on this one: they import it, never `@xyflow/react`.
|
|
16
|
+
|
|
17
|
+
```jsx
|
|
18
|
+
import { FlowCanvas, boardToText } from "../components/blocks/flow-canvas"; // a Makersclaw app ("./blocks/flow-canvas" from components/)
|
|
19
|
+
import { FlowCanvas, boardToText } from "@/components/makersclaw/blocks/flow-canvas"; // a shadcn project
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`FlowCanvas` is a client component: render it from a `"use client"`
|
|
23
|
+
component. The helpers (`boardToText`, `autoLayout`, `createNode`…) are
|
|
24
|
+
plain functions and work on the server too.
|
|
25
|
+
|
|
26
|
+
`makersclaw add flow-canvas` adds `@xyflow/react` (pinned, exact) to
|
|
27
|
+
package.json: run `npm install` after. It loads with the page (no
|
|
28
|
+
`import()`): the board mounts after the first render; until then — on the
|
|
29
|
+
server — the box holds the board as text for a screen reader.
|
|
30
|
+
|
|
31
|
+
## The data
|
|
32
|
+
|
|
33
|
+
A board is plain JSON. Store it as it comes out of `onChange` (one `jsonb`
|
|
34
|
+
column).
|
|
35
|
+
|
|
36
|
+
```js
|
|
37
|
+
{
|
|
38
|
+
nodes: [
|
|
39
|
+
{ id: "s1", type: "sticky", position: { x: 40, y: 80 }, width: 200, height: 200,
|
|
40
|
+
data: { text: "Interview churned customers", color: "warning", badge: 3, meta: "Priya" } },
|
|
41
|
+
{ id: "f1", type: "frame", position: { x: 0, y: 0 }, width: 720, height: 420, zIndex: -1,
|
|
42
|
+
data: { title: "Discover", color: "chart-2" } },
|
|
43
|
+
],
|
|
44
|
+
edges: [
|
|
45
|
+
{ id: "e1", source: "s1", target: "s2", label: "feeds",
|
|
46
|
+
data: { line: "curved", arrow: "end", dashed: false } },
|
|
47
|
+
],
|
|
48
|
+
viewport: { x: 0, y: 0, zoom: 1 }, // where the person last looked; optional
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
- **Positions are absolute**, top-left corner, in board pixels. A card in a
|
|
53
|
+
frame is not stored relative to it: a frame holds whatever lies inside
|
|
54
|
+
its rectangle (`frameContents`, `frameOf`). Dragging a frame moves what
|
|
55
|
+
is inside it.
|
|
56
|
+
- **Colours are token names**, never colour values, so a board repaints
|
|
57
|
+
with the theme: `"warning"` (the yellow sticky), `"chart-1"` … `"chart-5"`,
|
|
58
|
+
`"success"`, `"info"`, `"destructive"`, `"muted"`. `COLORS` lists them;
|
|
59
|
+
`STICKY_COLORS` is the sticky palette.
|
|
60
|
+
- **Paint order is list order** (later is on top); frames always sit
|
|
61
|
+
under everything (`zIndex: -1`).
|
|
62
|
+
- `width`/`height` are set by resizing; `text` and `card` nodes leave
|
|
63
|
+
`height` out and grow with their content.
|
|
64
|
+
- A node may carry React Flow's own flags: `draggable: false`,
|
|
65
|
+
`deletable: false`, `selectable: false`, `connectable: false`. Locking
|
|
66
|
+
(the toolbar's lock) sets `data.locked: true` with `draggable` and
|
|
67
|
+
`deletable` false.
|
|
68
|
+
|
|
69
|
+
The built-in node types and their `data`:
|
|
70
|
+
|
|
71
|
+
| type | data |
|
|
72
|
+
| --- | --- |
|
|
73
|
+
| `sticky` | `text`, `color` (default `"warning"`), `badge?` (a count in the corner: votes), `meta?` (a small line at the foot: an author) |
|
|
74
|
+
| `shape` | `text`, `shape`: `rect` · `ellipse` · `diamond` · `pill`, `color` (default `"muted"`), `textSize`: `sm` · `md` · `lg` · `xl` |
|
|
75
|
+
| `text` | `text`, `textSize`, `align?`: `left` · `center` · `right` |
|
|
76
|
+
| `frame` | `title`, `color?` (a faint wash and edge; none = the card surface) |
|
|
77
|
+
| `card` | `title`, `body?`, `icon?` (a kit icon name), `badge?`, `color?` (a strip on top), `kind?`, anything else your `renderCard` reads |
|
|
78
|
+
| `image` | `src`, `alt` |
|
|
79
|
+
|
|
80
|
+
Connectors: `data.line` `curved` (default) · `straight` · `elbow`;
|
|
81
|
+
`data.arrow` `end` (default) · `both` · `none`; `data.dashed`. They leave
|
|
82
|
+
and enter by the sides of the two cards that face each other, so they
|
|
83
|
+
re-route as cards move; handle ids are not stored.
|
|
84
|
+
|
|
85
|
+
## Props
|
|
86
|
+
|
|
87
|
+
- `value` — the board, controlled. A new `value` that differs from what
|
|
88
|
+
the canvas last sent through `onChange` replaces it (loading another
|
|
89
|
+
board, or a change made elsewhere — a vote count); that replacement can
|
|
90
|
+
be undone. Pass back exactly what `onChange` gave you and nothing resets.
|
|
91
|
+
- `defaultValue` — the starting board, uncontrolled. With neither, it
|
|
92
|
+
starts empty (and shows the empty state).
|
|
93
|
+
- `onChange(board)` — after each committed change (a drag ends, a card is
|
|
94
|
+
placed, words stop being edited, a colour is picked), debounced by
|
|
95
|
+
`changeDelay` (default 400 ms). The board is clean JSON (see above).
|
|
96
|
+
Selection, typing in progress and panning never call it.
|
|
97
|
+
- `onSave(board)` — `async`, return `{ ok: true }` or `{ ok: false, error }`
|
|
98
|
+
(a throw counts as failed). Called after `onChange`, and on ⌘S. The
|
|
99
|
+
canvas shows "Saving…", "Saved", or the error with a Retry beside
|
|
100
|
+
undo/redo. Leave it out when `onChange` already saves.
|
|
101
|
+
- `changeDelay` — ms, default 400.
|
|
102
|
+
- `readOnly` — `false` (default). `true`: no rail, no editing, no
|
|
103
|
+
connecting; pan, zoom, fit, the list view and `onOpenNode` still work.
|
|
104
|
+
- `presentation` — `false` (default). `true`: read-only, and a bar steps
|
|
105
|
+
through the frames in reading order (← → or the buttons; each fills the
|
|
106
|
+
screen). `onExitPresentation()` — Esc and the bar's Exit call it; turn
|
|
107
|
+
`presentation` off there.
|
|
108
|
+
- `height` — the canvas's height, default `560` (px; any CSS length works:
|
|
109
|
+
`"70vh"`, `"100%"` inside a sized box).
|
|
110
|
+
- `bare` — `false` (default: rounded, bordered). `true`: no border or
|
|
111
|
+
radius, for a full-page board.
|
|
112
|
+
- `label` — the board's accessible name, default `"Board"`; also the list
|
|
113
|
+
view's heading.
|
|
114
|
+
- `className` — layout around it (margin, width). Never colour.
|
|
115
|
+
- `palette` — the sticky colours offered, token names, default
|
|
116
|
+
`STICKY_COLORS` (six). The toolbar adds a few more for shapes and frames.
|
|
117
|
+
- `snap` — `true` (default): positions and sizes snap to `grid` (default
|
|
118
|
+
`20` px — the dot spacing). The person can turn it off from the view menu.
|
|
119
|
+
- `minimap` — `false` (default): whether the minimap starts open (a toggle
|
|
120
|
+
in the zoom bar either way; hidden on a narrow canvas).
|
|
121
|
+
- `hideAttribution` — `false` (default). React Flow asks that its small
|
|
122
|
+
credit stays; its MIT licence allows hiding it.
|
|
123
|
+
- `canvasRef` — a ref (`useFlowCanvas()`) that receives the handle (below).
|
|
124
|
+
- `onSelectionChange(nodes, edges)` — the selection changed (a side panel
|
|
125
|
+
for the selected person).
|
|
126
|
+
- `onOpenNode(node)` — double-click or Enter on a node that has no words of
|
|
127
|
+
its own to edit: your own node types, cards drawn by `renderCard`, and
|
|
128
|
+
every node in read-only mode. Open your `Sheet` there. Without it,
|
|
129
|
+
double-click edits the words.
|
|
130
|
+
- `describeNode(node)` — a one-line description of one of YOUR node types,
|
|
131
|
+
for the list view, `boardToText` and the server placeholder; return
|
|
132
|
+
nothing for the default (`Sticky: "…"`).
|
|
133
|
+
|
|
134
|
+
Extending it — how a block makes the canvas its own:
|
|
135
|
+
|
|
136
|
+
- `nodeTypes` — `{ person: PersonNode, … }`: your own node components,
|
|
137
|
+
added to the built-in ones (a key that matches a built-in replaces it).
|
|
138
|
+
See "Your own node types".
|
|
139
|
+
- `renderCard(node, ctx)` — draws the inside of every `card` node; return
|
|
140
|
+
`undefined` for the default (title + body). `ctx`: `{ selected, editing,
|
|
141
|
+
update(patch), api }`. Kit parts only (Avatar, Badge, Stat…); give an
|
|
142
|
+
interactive part inside `className="nodrag"` so pressing it does not drag
|
|
143
|
+
the card. The simplest way to put your own card on the board.
|
|
144
|
+
- `tools` — more rail tools: `[{ id, label, icon, shortcut?, create?,
|
|
145
|
+
onSelect?, sizable?, connectable? }]`. See "Rail tools".
|
|
146
|
+
- `rail` — the rail's contents, in order: built-in ids (`"select"`,
|
|
147
|
+
`"hand"`, `"sticky"`, `"shape"`, `"text"`, `"connector"`, `"frame"`,
|
|
148
|
+
`"image"`), your tools' ids, and `"|"` for a divider. Default: all the
|
|
149
|
+
built-ins, then your tools (and `"image"` when `pickImage` is set). A
|
|
150
|
+
process map drops the sticky: `rail={["select", "hand", "|", "shape", "connector", "step"]}`.
|
|
151
|
+
- `pickImage()` — `async () => ({ src, alt, width?, height? }) | null`: turns
|
|
152
|
+
on the image tool (your upload, your picker). Without it there is no
|
|
153
|
+
image tool; image nodes in the data still show.
|
|
154
|
+
- `topBar` — a node shown floating at the top centre: a title, a save
|
|
155
|
+
button, a share menu, a timer.
|
|
156
|
+
- `toolbarExtra(selection, api)` — more controls at the end of the
|
|
157
|
+
floating toolbar over a selection (`selection.nodes`): kit
|
|
158
|
+
`IconButton size="sm"` / `Menu` parts. "Vote", "Assign owner".
|
|
159
|
+
- `contextMenuItems(selection, api)` — more right-click items, kit `Menu`
|
|
160
|
+
shape (`[{ label, onSelect, icon?, shortcut?, tone? }]`); `selection.nodes`
|
|
161
|
+
is empty for a right-click on the empty canvas.
|
|
162
|
+
- `emptyState` — a node in place of the first-run hint; `false` for none.
|
|
163
|
+
- `templates` — the starters on the empty state: `[{ id, label, icon?,
|
|
164
|
+
description?, board }]` (`board` a board or a function returning one).
|
|
165
|
+
Default `starterTemplates()` (Brainstorm, Flowchart, Retro); `[]` for none.
|
|
166
|
+
- `constrain(node, { reason, board })` — runs on every node a change
|
|
167
|
+
touched before it is committed (`reason`: `"move"` after a drag or a
|
|
168
|
+
nudge, `"create"`, `"paste"`, `"resize"`, `"align"`, `"layout"`). Return
|
|
169
|
+
the node adjusted (a new position, size or data), or nothing to keep it.
|
|
170
|
+
This is how a journey map snaps a sticky into its cell and records it.
|
|
171
|
+
- `beforeChange(next, prev, reason)` — runs on the whole board at every
|
|
172
|
+
commit (`next` and `prev` are clean boards). Return `false` to refuse the
|
|
173
|
+
change (the board goes back), a board to commit instead, or nothing to
|
|
174
|
+
accept it.
|
|
175
|
+
- `canConnect(connection, board)` — `false` refuses a connector
|
|
176
|
+
(`connection`: `{ source, target }`). A card never connects to itself.
|
|
177
|
+
|
|
178
|
+
## The handle
|
|
179
|
+
|
|
180
|
+
`const board = useFlowCanvas()`, `<FlowCanvas canvasRef={board} />`, then
|
|
181
|
+
`board.current?.…`. Tools' `create`/`onSelect`, `renderCard`,
|
|
182
|
+
`toolbarExtra` and `contextMenuItems` get the same object as `api`, and a
|
|
183
|
+
node component reaches it with `useCanvas().api`. Every change made through
|
|
184
|
+
it commits (undoable, then `onChange`) unless `{ commit: false }` says not.
|
|
185
|
+
|
|
186
|
+
- Read: `getBoard()` (clean JSON, with the viewport) · `getSelection()` →
|
|
187
|
+
`{ nodes, edges }` · `toText()` · `toMarkdown({ title })` · `canUndo()` ·
|
|
188
|
+
`canRedo()` · `getTool()` · `readOnly`
|
|
189
|
+
- Nodes: `addNodes(node | nodes, { select = true, edit = false, edges })` →
|
|
190
|
+
ids · `updateNode(id, patch | (node) => patch, { commit })` ·
|
|
191
|
+
`updateNodeData(id, patch | (data) => patch, { commit })` ·
|
|
192
|
+
`updateNodesData(ids, patch)` · `removeNodes(ids)` · `duplicate(ids)` ·
|
|
193
|
+
`lock(ids, on)` · `arrange(ids, "front" | "back")` · `align(ids, "left" |
|
|
194
|
+
"center" | "right" | "top" | "middle" | "bottom")` · `distribute(ids,
|
|
195
|
+
"horizontal" | "vertical")` · `frameSelection(ids)`
|
|
196
|
+
- Connectors: `addEdge({ source, target, label?, data? })` → id ·
|
|
197
|
+
`updateEdge(id, patch, { commit })` · `removeEdges(ids)`
|
|
198
|
+
- The whole board: `setBoard(board, { fit = true })` (undoable) ·
|
|
199
|
+
`autoLayout({ direction: "LR" | "TB", ids?, rankGap?, nodeGap? })` ·
|
|
200
|
+
`undo()` · `redo()` · `save()` (send now, skipping the debounce)
|
|
201
|
+
- Editing: `edit(id)` (start editing a node's words) · `editEdge(id)` ·
|
|
202
|
+
`stopEditing()` · `commit(reason, ids?)` (after `{ commit: false }` changes)
|
|
203
|
+
- View: `select(ids, edgeIds?)` · `focusNode(id)` (select, centre, focus) ·
|
|
204
|
+
`fitView({ nodes?: [{ id }] })` · `zoomIn()` · `zoomOut()` · `zoomTo(z)` ·
|
|
205
|
+
`centerPoint()` (the board point at the middle of the screen — where a
|
|
206
|
+
picker's choice lands) · `screenToFlow({ x, y })` · `setTool(id)`
|
|
207
|
+
|
|
208
|
+
## Your own node types
|
|
209
|
+
|
|
210
|
+
A node component gets React Flow's props: `{ id, type, data, selected,
|
|
211
|
+
width, height, dragging }`. Wrap its body in `NodeShell` — it draws the
|
|
212
|
+
selection box, the four connection dots (shown on hover), the resize
|
|
213
|
+
handles, the lock mark and the whole-card drop target while a connector is
|
|
214
|
+
dragged. Without it (or `NodeHandles`), connectors cannot reach the node.
|
|
215
|
+
Read the canvas with `useCanvas()`; change the node through `api`.
|
|
216
|
+
|
|
217
|
+
```jsx
|
|
218
|
+
import { FlowCanvas, NodeShell, EditableText, useCanvas, createNode } from "./blocks/flow-canvas";
|
|
219
|
+
import { Avatar, Badge } from "./ui";
|
|
220
|
+
|
|
221
|
+
function PersonNode({ id, data, selected }) {
|
|
222
|
+
const { api, editingNode, readOnly } = useCanvas();
|
|
223
|
+
return (
|
|
224
|
+
<NodeShell id={id} selected={selected} locked={data.locked} resizable={false}>
|
|
225
|
+
<div className="flex w-64 items-center gap-3 rounded-lg border border-border bg-card p-3 shadow-sm">
|
|
226
|
+
<Avatar name={data.name} src={data.avatar} />
|
|
227
|
+
<div className="min-w-0 flex-1">
|
|
228
|
+
<EditableText
|
|
229
|
+
singleLine
|
|
230
|
+
editing={!readOnly && editingNode === id}
|
|
231
|
+
value={data.name}
|
|
232
|
+
onChange={(v) => api.updateNodeData(id, { name: v }, { commit: false })}
|
|
233
|
+
onDone={() => api.stopEditing()}
|
|
234
|
+
label="Name"
|
|
235
|
+
className="truncate text-sm font-medium"
|
|
236
|
+
/>
|
|
237
|
+
<p className="truncate text-xs text-muted-foreground">{data.title}</p>
|
|
238
|
+
</div>
|
|
239
|
+
<Badge tone={data.role === "blocker" ? "danger" : "neutral"}>{data.role}</Badge>
|
|
240
|
+
</div>
|
|
241
|
+
</NodeShell>
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
const NODE_TYPES = { person: PersonNode }; // module level: a new object each render remounts every node
|
|
245
|
+
|
|
246
|
+
<FlowCanvas nodeTypes={NODE_TYPES} describeNode={(n) => n.type === "person" ? `Person: ${n.data.name} (${n.data.role})` : undefined} … />
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
- `NodeShell` props: `id`, `selected`, `locked`, `resizable` (default
|
|
250
|
+
true), `minWidth`/`minHeight` (40/30), `keepAspectRatio`, `autoHeight`
|
|
251
|
+
(height follows content), `handles` (false: nothing connects), `ring`
|
|
252
|
+
(false: draw your own selection), `className` (layout only).
|
|
253
|
+
- `EditableText` props: `value`, `editing`, `onChange(text)`, `onDone()`,
|
|
254
|
+
`placeholder`, `singleLine` (Enter finishes), `label`, `className`,
|
|
255
|
+
`style`. Shown and edited in the same box, so nothing jumps.
|
|
256
|
+
- Double-click and Enter call `onOpenNode(node)` for your types when you
|
|
257
|
+
pass it, else they set `editingNode` to the node's id (use it as above).
|
|
258
|
+
- Colour your node from a token in its data with `colorClasses(token)` →
|
|
259
|
+
`{ tint, solid, fill, stroke, wash, edge }` class strings
|
|
260
|
+
(`colorClasses("chart-3").tint` is `bg-chart-3/30`). `Palette`,
|
|
261
|
+
`StickySwatch`, `ColorDot` and `ShapeGlyph` are the canvas's own pickers
|
|
262
|
+
and swatches, for a legend or a side panel.
|
|
263
|
+
- An interactive kit part inside a node takes `className="nodrag"`.
|
|
264
|
+
- Put a node's actions in `toolbarExtra` or `contextMenuItems`, not in a
|
|
265
|
+
kit `Menu`/`Popover` inside the node: the node lives in the zoomed and
|
|
266
|
+
panned viewport (a CSS transform), and the kit's floating panels anchor
|
|
267
|
+
to their button without knowing about it. The canvas's own toolbars sit
|
|
268
|
+
outside the viewport for this reason.
|
|
269
|
+
|
|
270
|
+
## Rail tools
|
|
271
|
+
|
|
272
|
+
```js
|
|
273
|
+
const TOOLS = [
|
|
274
|
+
// A placing tool: pick it (or press P), click the canvas, a node appears there.
|
|
275
|
+
{ id: "person", label: "Person", icon: "user", shortcut: "P",
|
|
276
|
+
create: (point, { rect, api }) => createNode("person", point, { width: 256, data: { name: "", role: "user" } }) },
|
|
277
|
+
// An action: pressing it runs onSelect — open your picker, then add.
|
|
278
|
+
{ id: "pick", label: "Add from CRM", icon: "search",
|
|
279
|
+
onSelect: (api) => openPicker((p) => api.addNodes(createNode("person", api.centerPoint(), { data: p }))) },
|
|
280
|
+
];
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
- `create(point, { rect, api, grid })` returns a node or several (use
|
|
284
|
+
`createNode`: it centres on `point` and snaps). With `sizable: true` the
|
|
285
|
+
person can drag out a rectangle and you get it as `rect`.
|
|
286
|
+
- A tool with `create` is also offered in the menu that opens when a
|
|
287
|
+
connector is dropped on empty canvas (the new node arrives connected);
|
|
288
|
+
`connectable: false` leaves it out.
|
|
289
|
+
- The tool returns to Select after one placement. `shortcut` is one key.
|
|
290
|
+
|
|
291
|
+
## Constraining behaviour — recipes
|
|
292
|
+
|
|
293
|
+
- **Snap stickies into cells** (journey map): compute the cells from your
|
|
294
|
+
lanes, then
|
|
295
|
+
`constrain={(n) => { if (n.type !== "sticky") return; const r = nodeRect(n); const c = snapToCell(r, cells); return c && { position: { x: c.x, y: c.y }, data: { ...n.data, cell: c.cellId } }; }}`.
|
|
296
|
+
- **Lock the lanes**: lanes are `frame` nodes with `draggable: false,
|
|
297
|
+
deletable: false, selectable: false` (and `data.locked: true` to hide the
|
|
298
|
+
resize handles). They still hold what is dropped inside them.
|
|
299
|
+
- **Only steps connect** (process map): `canConnect={(c, b) => isStep(c.source) && isStep(c.target)}`.
|
|
300
|
+
- **At most N votes** (idea board): keep votes in `data.badge` (the sticky
|
|
301
|
+
shows it) and refuse extra ones in your own handler; or
|
|
302
|
+
`beforeChange={(next) => votesOk(next) || false}`.
|
|
303
|
+
- **Tidy a flow**: `api.autoLayout({ direction: "LR" })`, or in data
|
|
304
|
+
`autoLayout(nodes, edges, { direction: "TB" })` before passing `value`.
|
|
305
|
+
|
|
306
|
+
## The helpers
|
|
307
|
+
|
|
308
|
+
Import them from the block; they take a board and never throw on a partial
|
|
309
|
+
one.
|
|
310
|
+
|
|
311
|
+
- `emptyBoard()` — `{ nodes: [], edges: [] }`.
|
|
312
|
+
- `createNode(type, point, { id?, data?, width?, height?, rect?, grid = 20, … })`
|
|
313
|
+
— a node centred on `point` with its type's defaults, snapped. Extra keys
|
|
314
|
+
(`draggable`, `zIndex`…) go on the node.
|
|
315
|
+
- `createEdge(source, target, { id?, label?, data? })`.
|
|
316
|
+
- `cleanBoard(board)` — what is stored (React Flow's working fields gone).
|
|
317
|
+
- `boardToText(board, { describe? })` — plain text for an agent or a screen
|
|
318
|
+
reader: `Board: 12 items, 5 connectors.`, then each frame with what it
|
|
319
|
+
holds (reading order, nested), loose items, and `Connectors:` as
|
|
320
|
+
`"A" → "B" (label)`.
|
|
321
|
+
- `boardToMarkdown(board, { title?, describe? })` — a heading per frame, a
|
|
322
|
+
bullet per item, a Connections list.
|
|
323
|
+
- `autoLayout(nodes, edges, { direction = "LR", rankGap = 80, nodeGap = 40, ids?, grid = 20 })`
|
|
324
|
+
— a layered layout written here (no dagre/elk): cycles broken, ranks by
|
|
325
|
+
longest path, barycentre sweeps against crossings; unconnected nodes in
|
|
326
|
+
a row after; the top-left corner kept. Returns every node, the laid-out
|
|
327
|
+
ones moved. Frames are left alone unless named in `ids`.
|
|
328
|
+
- `alignNodes(nodes, ids, how)`, `distributeNodes(nodes, ids, axis)`,
|
|
329
|
+
`duplicateNodes(board, ids, { offset })` → `{ nodes, edges }`,
|
|
330
|
+
`removeNodes(board, ids)`.
|
|
331
|
+
- `frameContents(board, frameId)` → ids inside it; `frameOf(board)` →
|
|
332
|
+
Map(nodeId → the smallest frame holding it).
|
|
333
|
+
- `nodeRect(node)`, `boardBounds(nodes)`, `snapPoint(p, grid)`,
|
|
334
|
+
`snapToCell(rect, cells, { pad })` → `{ x, y, cellId }`,
|
|
335
|
+
`fitFontSize(text, width, height)` (the sticky's shrinking words).
|
|
336
|
+
- `historyInit(board)`, `historyReducer(state, { type: "push" | "undo" |
|
|
337
|
+
"redo" | "reset", present? })` — the undo stack the canvas uses, for a
|
|
338
|
+
block that keeps its own.
|
|
339
|
+
- `starterTemplates()`, `describeNode(node, describe?)`, `nodeText(node)`,
|
|
340
|
+
`COLORS`, `STICKY_COLORS`, `COLOR_NAMES`, `SHAPES`, `GRID`.
|
|
341
|
+
|
|
342
|
+
## Mouse and keyboard
|
|
343
|
+
|
|
344
|
+
- Scroll or Space + drag pans; pinch or Ctrl/⌘ + scroll zooms; the middle
|
|
345
|
+
button drags the canvas in any tool.
|
|
346
|
+
- Drag on empty canvas draws a selection box (what it fully encloses);
|
|
347
|
+
Shift-click adds to the selection; drag a frame by its title.
|
|
348
|
+
- Tools: V select, H hand, N sticky, S shape, T text, L connector, F frame,
|
|
349
|
+
and your tools' keys. Shapes, text and frames can be dragged out to a size.
|
|
350
|
+
- Enter edits the selected card's words, Esc stops; Delete/Backspace
|
|
351
|
+
deletes; ⌘D duplicates; ⌘C/⌘X/⌘V copy, cut, paste (paste lines of text
|
|
352
|
+
from elsewhere: a sticky each); ⌘A selects all; ⌘Z / ⇧⌘Z undo, redo;
|
|
353
|
+
arrows nudge 1 px (⇧ 10); ⌘] / ⌘[ front, back; ⇧⌘L lock; ⇧1 fit;
|
|
354
|
+
⇧2 zoom to selection; ⌘+ / ⌘− / ⌘0 zoom; ? the shortcuts sheet.
|
|
355
|
+
- Tab walks the cards (each selected as it gets focus); Shift+F10 or the
|
|
356
|
+
Menu key opens the actions menu; the List view (zoom bar) shows the board
|
|
357
|
+
as a list, and choosing a row goes back to that card.
|
|
358
|
+
|
|
359
|
+
## Example
|
|
360
|
+
|
|
361
|
+
```jsx
|
|
362
|
+
// components/LaunchBoard.jsx — client
|
|
363
|
+
"use client";
|
|
364
|
+
import { useState } from "react";
|
|
365
|
+
import { updateRow } from "../lib/actions";
|
|
366
|
+
import { FlowCanvas } from "./blocks/flow-canvas";
|
|
367
|
+
|
|
368
|
+
export default function LaunchBoard({ project }) {
|
|
369
|
+
const [board, setBoard] = useState(project.board); // jsonb, may be null
|
|
370
|
+
return (
|
|
371
|
+
<FlowCanvas
|
|
372
|
+
value={board ?? undefined}
|
|
373
|
+
onChange={setBoard}
|
|
374
|
+
onSave={(b) => updateRow({ source: "public.projects", id: project.id, patch: { board: b } })}
|
|
375
|
+
label={`${project.name} board`}
|
|
376
|
+
height="calc(100dvh - 8rem)"
|
|
377
|
+
/>
|
|
378
|
+
);
|
|
379
|
+
}
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
A card drawn with kit parts, and an agent reading the board:
|
|
383
|
+
|
|
384
|
+
```jsx
|
|
385
|
+
<FlowCanvas
|
|
386
|
+
value={board}
|
|
387
|
+
onChange={setBoard}
|
|
388
|
+
renderCard={(n) => n.data.kind === "deal" ? (
|
|
389
|
+
<div className="grid gap-1 p-3">
|
|
390
|
+
<p className="text-sm font-medium">{n.data.title}</p>
|
|
391
|
+
<Stat size="sm" label="Value" value={n.data.amount} />
|
|
392
|
+
</div>
|
|
393
|
+
) : undefined}
|
|
394
|
+
/>
|
|
395
|
+
|
|
396
|
+
const context = boardToText(board); // hand this to the agent
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
## What it will not do
|
|
400
|
+
|
|
401
|
+
- Collaborate live (several cursors at once). Saves are last-write-wins.
|
|
402
|
+
- Draw freehand (that is `sketch-canvas`), or export an image.
|
|
403
|
+
- Nest data under frames: membership is geometric, so a card dragged out
|
|
404
|
+
of a frame simply leaves it.
|
|
405
|
+
- Route connectors around cards; they take the shortest curve between the
|
|
406
|
+
facing sides.
|
|
407
|
+
- Upload images itself: pass `pickImage`.
|
|
408
|
+
- Render on the server: the server shows the board as text until the
|
|
409
|
+
canvas mounts. For a read-only page that must be rich in the HTML, render
|
|
410
|
+
`boardToMarkdown` yourself.
|
|
411
|
+
|
|
412
|
+
A board it cannot be is your own component in `components/` — not an edit
|
|
413
|
+
to this block. Its files are fixed: `npm run check` refuses a change, and
|
|
414
|
+
`makersclaw add flow-canvas` restores them.
|
|
415
|
+
|
|
416
|
+
## Credits
|
|
417
|
+
|
|
418
|
+
React Flow (https://github.com/xyflow/xyflow), MIT, by webkid GmbH —
|
|
419
|
+
installed from npm as a dependency, not copied here. Its attribution link
|
|
420
|
+
stays in the corner unless `hideAttribution`. See THIRD-PARTY-NOTICES.md.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "flow-canvas",
|
|
3
|
+
"title": "FlowCanvas",
|
|
4
|
+
"description": "A Miro-like board (React Flow) in the workspace theme: sticky notes, shapes, text, frames, cards and images on an infinite dotted canvas; a tool rail with shortcuts, double-click for a sticky, drag-out connectors that re-route as cards move, labels on connectors, a floating toolbar over the selection, right-click menu, undo/redo, copy/paste, snap to grid, minimap, list view and presentation mode. The board is plain JSON; helpers turn it into text or markdown and lay it out. Other blocks add their own node types and rail tools.",
|
|
5
|
+
"useWhen": "A screen where people arrange things spatially and connect them: a brainstorm, a flowchart or process map, an account or org map, a journey map, a retro, a planning board. The canvas blocks (account-map, process-map, journey-map, idea-board) are built on it. Not for freehand drawing (sketch-canvas), records in stage columns (board), or a chart of numbers (chart).",
|
|
6
|
+
"tags": ["canvas", "whiteboard", "miro", "flowchart", "diagram", "sticky notes", "mind map", "react flow", "nodes", "connectors", "frames", "brainstorm", "infinite canvas", "org chart", "process map"],
|
|
7
|
+
"exports": ["FlowCanvas", "useFlowCanvas", "useCanvas", "NodeShell", "NodeHandles", "EditableText", "Palette", "StickySwatch", "ColorDot", "ShapeGlyph", "colorClasses", "emptyBoard", "createNode", "createEdge", "cleanBoard", "boardToText", "boardToMarkdown", "autoLayout", "snapToCell", "frameContents", "historyReducer", "starterTemplates"],
|
|
8
|
+
"files": ["index.js", "flow-canvas.jsx", "nodes.jsx", "edges.jsx", "chrome.jsx", "context.jsx", "board.js", "theme.js"],
|
|
9
|
+
"requires": [],
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"@xyflow/react": "12.11.6"
|
|
12
|
+
}
|
|
13
|
+
}
|