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,280 @@
|
|
|
1
|
+
# SketchCanvas
|
|
2
|
+
|
|
3
|
+
A freeform drawing canvas in the workspace theme, friendly like Miro. A
|
|
4
|
+
tool rail on the left (a bar along the bottom on a phone): select, pan,
|
|
5
|
+
draw, rectangle, ellipse, diamond, arrow, line, text, image, eraser, frame
|
|
6
|
+
— each with its one-key shortcut. Select something and a small toolbar
|
|
7
|
+
floats above it: colour and fill from the theme's palette, stroke, text
|
|
8
|
+
size, bring to front / send to back, duplicate, delete. Undo and redo sit
|
|
9
|
+
bottom left, zoom and fit-to-screen bottom right, a menu top right
|
|
10
|
+
(download PNG, snap to grid, shortcuts, clear). An empty canvas says how
|
|
11
|
+
to start. Stamp tools place ready-made drawings with one click — the six
|
|
12
|
+
UI wireframe pieces come built in.
|
|
13
|
+
|
|
14
|
+
It is [Excalidraw](https://github.com/excalidraw/excalidraw) (MIT)
|
|
15
|
+
underneath: its canvas, selection, text editing, history and shortcuts;
|
|
16
|
+
our rail, toolbars, palette and empty state, in the kit. Excalidraw's own
|
|
17
|
+
tool bar, properties panel, main menu, library, share / collaboration
|
|
18
|
+
buttons, welcome screen and sidebars are hidden. The blocks built on this
|
|
19
|
+
one — `whiteboard`, `annotate`, `sketch-to-app` — import it, never
|
|
20
|
+
`@excalidraw/excalidraw`.
|
|
21
|
+
|
|
22
|
+
```jsx
|
|
23
|
+
import { SketchCanvas, sketchToText } from "../components/blocks/sketch-canvas"; // a Makersclaw app ("./blocks/sketch-canvas" from components/)
|
|
24
|
+
import { SketchCanvas, sketchToText } from "@/components/makersclaw/blocks/sketch-canvas"; // a shadcn project
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
`SketchCanvas` is a client component: render it from a `"use client"`
|
|
28
|
+
component. The helpers (`sketchToText`, `sketchItems`, `emptySketch`,
|
|
29
|
+
`isSketchEmpty`, `toSketch`) are plain functions and work on the server.
|
|
30
|
+
|
|
31
|
+
`makersclaw add sketch-canvas` adds `@excalidraw/excalidraw` (pinned,
|
|
32
|
+
exact) to package.json: run `npm install` after. It loads with the page
|
|
33
|
+
(no `import()`); the canvas mounts after the first render, and until then
|
|
34
|
+
— on the server — the frame shows "Loading the canvas…", with the
|
|
35
|
+
sketch's words for a screen reader.
|
|
36
|
+
|
|
37
|
+
## The data
|
|
38
|
+
|
|
39
|
+
A sketch is plain JSON. Store it as it comes out of `onChange` / `onSave`
|
|
40
|
+
(a `jsonb` column).
|
|
41
|
+
|
|
42
|
+
```js
|
|
43
|
+
{
|
|
44
|
+
type: "sketch",
|
|
45
|
+
version: 1,
|
|
46
|
+
elements: [ /* Excalidraw elements, non-deleted, in paint order (first = back) */ ],
|
|
47
|
+
files: { "<fileId>": { id, mimeType: "image/png", dataURL: "data:image/png;base64,…", created } },
|
|
48
|
+
appState: { gridModeEnabled: false },
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
- `elements` are Excalidraw's own element objects: `type` is `rectangle`,
|
|
53
|
+
`ellipse`, `diamond`, `arrow`, `line`, `freedraw`, `text`, `image` or
|
|
54
|
+
`frame`; each has `id`, `x`, `y`, `width`, `height`, `strokeColor`,
|
|
55
|
+
`backgroundColor`, `strokeWidth`, `roughness`, `groupIds`, `frameId`…
|
|
56
|
+
A `text` has `text`, `fontSize`, and `containerId` when it is the label
|
|
57
|
+
of a shape; a shape lists its label and arrows in `boundElements`.
|
|
58
|
+
- **Colours are tokens.** Every colour picked in the canvas is a theme
|
|
59
|
+
token, and the element keeps it in `customData.tokens`:
|
|
60
|
+
`{ strokeColor: "primary", backgroundColor: "chart-2:soft" }`. The
|
|
61
|
+
concrete colour beside it (`strokeColor`) is what the token resolved to
|
|
62
|
+
when it was saved; on load, and whenever the theme or light/dark
|
|
63
|
+
changes, the canvas resolves every token again and repaints. A colour
|
|
64
|
+
with no token (pasted from elsewhere) stays as it is.
|
|
65
|
+
Tokens: `foreground`, `muted-foreground`, `primary`, `destructive`,
|
|
66
|
+
`warning`, `success`, `info`, `chart-2` … `chart-5` (ink), and for
|
|
67
|
+
fills also `none`, `muted` and `<slot>:soft` (the slot mixed into the
|
|
68
|
+
page background — a sticky-note tint). `STROKES` and `FILLS` list them
|
|
69
|
+
with labels.
|
|
70
|
+
- **Stamps** mark what they place: every element of one stamp shares a
|
|
71
|
+
group and carries `customData: { stamp: "button", stampId }`.
|
|
72
|
+
- `files` holds the images the elements show (only those). Images are
|
|
73
|
+
data URLs inside the JSON — keep them small, or store the file
|
|
74
|
+
elsewhere and keep the sketch light.
|
|
75
|
+
- The `background` image is never in the value; it comes from the prop.
|
|
76
|
+
- Written by hand (a starter template, a seed), an element may leave out
|
|
77
|
+
what Excalidraw can default (`version`, `seed`, `strokeWidth`,
|
|
78
|
+
`roughness`…) and give its colours only as tokens:
|
|
79
|
+
`{ id: "a", type: "rectangle", x: 0, y: 0, width: 160, height: 72, customData: { tokens: { strokeColor: "foreground", backgroundColor: "chart-2:soft" } } }`.
|
|
80
|
+
A text needs `text`, `fontSize` and a rough `width`/`height` (it is
|
|
81
|
+
re-measured). Or skip hand-written elements: insert skeletons through
|
|
82
|
+
the handle (below).
|
|
83
|
+
- `sketchToText(sketch)` reads the words out for an agent; see Helpers.
|
|
84
|
+
|
|
85
|
+
## Props
|
|
86
|
+
|
|
87
|
+
- `value` — the sketch, controlled. A new `value` that differs from what
|
|
88
|
+
the canvas last sent replaces the drawing (loading another record) and
|
|
89
|
+
clears undo. Pass back exactly what `onChange` gave you and nothing
|
|
90
|
+
resets. Also takes a bare element array or Excalidraw's own export
|
|
91
|
+
(`{ elements, files, appState }`).
|
|
92
|
+
- `defaultValue` — the starting sketch, uncontrolled. With neither, it
|
|
93
|
+
starts empty.
|
|
94
|
+
- `onChange(sketch)` — the whole sketch, after an edit settles
|
|
95
|
+
(debounced by `changeDelay`). Not called for pan, zoom or selection.
|
|
96
|
+
- `onSave(sketch)` — `async`, returns `{ ok: true }` or
|
|
97
|
+
`{ ok: false, error? }`. Called with the same sketch, right after
|
|
98
|
+
`onChange`, and on Cmd/Ctrl+S. The canvas shows "Saving…", "Saved",
|
|
99
|
+
or the error with a Retry. A throw counts as a failure.
|
|
100
|
+
- `changeDelay` — ms of quiet before `onChange` / `onSave` (default 600).
|
|
101
|
+
- `readOnly` — `false` (default). `true` shows the sketch to look at: pan
|
|
102
|
+
and zoom, no rail, no toolbar, no edits.
|
|
103
|
+
- `background` — `{ src, width?, height? }`: an image laid at the back,
|
|
104
|
+
locked (it cannot be selected, moved, erased or deleted), top-left at
|
|
105
|
+
(0, 0). For marking up a screenshot (annotate). `src` is a data URL, or
|
|
106
|
+
a same-origin URL (a cross-origin one draws, but spoils `exportImage`).
|
|
107
|
+
Without `width`/`height` the image's own size is used. When it first
|
|
108
|
+
lands on an empty sketch, the view fits it.
|
|
109
|
+
- `tools` — ids of the built-in tools to offer, in rail order:
|
|
110
|
+
`["select", "hand", "draw", "rectangle", "ellipse", "diamond", "arrow",
|
|
111
|
+
"line", "text", "image", "eraser", "frame"]` (all, the default). A tool
|
|
112
|
+
left out is also unreachable by its shortcut. `SKETCH_TOOLS` lists them
|
|
113
|
+
with labels, icons and keys.
|
|
114
|
+
- `stamps` — stamp tools after the built-ins:
|
|
115
|
+
`[{ id, label, icon, create() }]`. `create()` returns element
|
|
116
|
+
skeletons (below) laid out from (0, 0); a click on the canvas places
|
|
117
|
+
them centred on the pointer (Enter: the middle of the view; Esc
|
|
118
|
+
cancels), grouped, selected. `WIREFRAME_STAMPS` are button, input, card,
|
|
119
|
+
nav bar, table and image placeholder.
|
|
120
|
+
- `grid` — `true` (default): a dotted background that pans and zooms with
|
|
121
|
+
the drawing. `false`: plain.
|
|
122
|
+
- `empty` — what an empty, editable canvas shows in its middle. Omit for
|
|
123
|
+
the built-in hint ("Start sketching…"); `false` for nothing; or a node
|
|
124
|
+
(starter templates: give its buttons `pointer-events-auto`, the layer
|
|
125
|
+
lets clicks through to the canvas). Shown while nothing is drawn and the
|
|
126
|
+
select or pan tool is active.
|
|
127
|
+
- `actions` — nodes in the top-right corner, before the menu (a Share
|
|
128
|
+
button, a title chip).
|
|
129
|
+
- `canvasRef` — a ref (`useSketchCanvas()`) that receives the handle.
|
|
130
|
+
- `onReady(handle)` — once, when the canvas has mounted.
|
|
131
|
+
- `label` — the accessible name of the canvas region (default "Sketch").
|
|
132
|
+
- `className` — layout: width, margin, height. The default height is
|
|
133
|
+
`h-[32rem]`; a height class of yours (`h-dvh`, `h-full`, `min-h-…`,
|
|
134
|
+
`flex-1`) replaces it. Never colour.
|
|
135
|
+
|
|
136
|
+
### The handle
|
|
137
|
+
|
|
138
|
+
`canvasRef.current` (and `onReady`'s argument):
|
|
139
|
+
|
|
140
|
+
- `getScene({ withBackground? })` — the sketch now (what `onChange`
|
|
141
|
+
sends), without waiting for the debounce.
|
|
142
|
+
- `setScene(sketch)` — replace the drawing (undoable).
|
|
143
|
+
- `insertElements(skeletons, opts?)` → the new element ids. Skeletons are
|
|
144
|
+
Excalidraw's `convertToExcalidrawElements` input:
|
|
145
|
+
`{ type: "rectangle" | "ellipse" | "diamond", x, y, width, height, label?: { text, fontSize?, textAlign? } }`,
|
|
146
|
+
`{ type: "text", x, y, text, fontSize? }`,
|
|
147
|
+
`{ type: "arrow" | "line", x, y, points: [[0, 0], [dx, dy]], start?: { id }, end?: { id } }`,
|
|
148
|
+
`{ type: "frame", children: [ids], name }`, `{ type: "image", fileId, x, y, width, height }`.
|
|
149
|
+
Colours may be token names (`strokeColor: "primary"`,
|
|
150
|
+
`backgroundColor: "warning:soft"`); a shape with no stroke gets
|
|
151
|
+
`foreground`; text is the system font. Options:
|
|
152
|
+
- `at` — `{ x, y }` in canvas coordinates; the skeletons' box is
|
|
153
|
+
centred there (or its top-left, with `anchor: "top-left"`). Default:
|
|
154
|
+
the middle of the view. `false`: keep the skeletons' own x/y.
|
|
155
|
+
- `group` — group them (move as one). `stamp: "<kind>"` groups too and
|
|
156
|
+
marks them for `sketchToText`.
|
|
157
|
+
- `customData` — merged into every new element's customData (annotate:
|
|
158
|
+
`{ note: 3 }`).
|
|
159
|
+
- `files` — `[{ id, dataURL, mimeType, created }]` to add first, for
|
|
160
|
+
image skeletons.
|
|
161
|
+
- `select` — `true` (default): select what was inserted.
|
|
162
|
+
- `exportImage(opts?)` → `Promise<Blob>`, a PNG made by Excalidraw's own
|
|
163
|
+
export, in the theme's colours now, on the theme's background. Options:
|
|
164
|
+
`scale` (default 2), `padding` (px, default 16), `transparent: true`
|
|
165
|
+
(no background), `withBackground: false` (leave the background image
|
|
166
|
+
out), `onlySelected: true`.
|
|
167
|
+
- `zoomToFit({ animate? })` — fit everything in view (Shift+1).
|
|
168
|
+
- `setTool(id)` — a built-in tool id or a stamp id.
|
|
169
|
+
- `undo()`, `redo()`, `clear()`, `focus()`.
|
|
170
|
+
- `save()` — send `onChange` / `onSave` now.
|
|
171
|
+
- `palette()` — token → the concrete colour it resolves to now.
|
|
172
|
+
- `repaint()` — re-read the theme and repaint (the canvas already does
|
|
173
|
+
this when `data-theme` changes or a theme stylesheet loads).
|
|
174
|
+
- `api` — Excalidraw's own imperative API, for anything else. Reaching for
|
|
175
|
+
it ties you to Excalidraw 0.18; prefer the methods above.
|
|
176
|
+
|
|
177
|
+
### Helpers
|
|
178
|
+
|
|
179
|
+
Plain functions; they take a sketch (or an element array) and never throw
|
|
180
|
+
on a partial one:
|
|
181
|
+
|
|
182
|
+
- `emptySketch()` — `{ type: "sketch", version: 1, elements: [], files: {}, appState: {} }`.
|
|
183
|
+
- `isSketchEmpty(sketch)` — nothing drawn (deleted elements and the
|
|
184
|
+
background image do not count).
|
|
185
|
+
- `toSketch(value)` — any accepted input → a sketch.
|
|
186
|
+
- `sketchToText(sketch, { stamps = true })` — the words, for an agent or a
|
|
187
|
+
reader: one line per text or stamp in reading order (top to bottom,
|
|
188
|
+
then left to right), grouped under `# <frame name>` per frame (then
|
|
189
|
+
`# Outside frames`); a shape's label reads as its text; a stamp reads
|
|
190
|
+
`[button] Sign up`, an image `[image]`. `stamps: false` drops the
|
|
191
|
+
brackets. An empty sketch gives `""`.
|
|
192
|
+
- `sketchItems(sketch)` — the same, structured: `[{ kind: "frame" | "stamp" | "text" | "image", id, text?, name?, stamp?, container?, frame, x, y, width, height }]`.
|
|
193
|
+
- `STROKES`, `FILLS` — `[{ token, label }]`, the palette the toolbar offers.
|
|
194
|
+
- `SKETCH_TOOLS`, `WIREFRAME_STAMPS` — as above.
|
|
195
|
+
|
|
196
|
+
## Theming, colours and fonts
|
|
197
|
+
|
|
198
|
+
- **Chrome.** Excalidraw's own CSS variables (its menus, dialogs, context
|
|
199
|
+
menu, hints) point at the workspace tokens (`theme.js`). Light or dark
|
|
200
|
+
follows the nearest `data-theme` (else `color-scheme`, else the OS).
|
|
201
|
+
- **Canvas colours.** Excalidraw needs concrete colours; they are read at
|
|
202
|
+
run time from the tokens' CSS variables and never written in source.
|
|
203
|
+
Excalidraw's dark mode (which inverts the whole canvas with a filter) is
|
|
204
|
+
switched off: the tokens are already the dark scheme's.
|
|
205
|
+
- **Fonts.** Every text is drawn in the device's own sans-serif
|
|
206
|
+
(Excalidraw's "Helvetica" family — Helvetica, Arial…), so no font is ever
|
|
207
|
+
fetched: Excalidraw's hand-drawn fonts would otherwise load from a
|
|
208
|
+
third-party CDN. Text pasted from another Excalidraw is moved into it.
|
|
209
|
+
The strokes keep their hand-drawn look (Sketchy / Clean in the toolbar).
|
|
210
|
+
- **Stylesheet.** The block imports `@excalidraw/excalidraw/index.css`
|
|
211
|
+
from the package; the app's bundler ships it like any CSS.
|
|
212
|
+
|
|
213
|
+
## Example
|
|
214
|
+
|
|
215
|
+
A whiteboard that saves itself:
|
|
216
|
+
|
|
217
|
+
```jsx
|
|
218
|
+
"use client";
|
|
219
|
+
import { SketchCanvas } from "./blocks/sketch-canvas";
|
|
220
|
+
import { updateRow } from "../lib/actions";
|
|
221
|
+
|
|
222
|
+
export default function Board({ board }) {
|
|
223
|
+
return (
|
|
224
|
+
<SketchCanvas
|
|
225
|
+
label={board.title}
|
|
226
|
+
defaultValue={board.sketch} // jsonb, may be null
|
|
227
|
+
onSave={(sketch) => updateRow({ source: "public.boards", id: board.id, patch: { sketch } })}
|
|
228
|
+
className="h-dvh rounded-none border-0"
|
|
229
|
+
/>
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Marking up a screenshot, with numbered notes:
|
|
235
|
+
|
|
236
|
+
```jsx
|
|
237
|
+
const canvas = useSketchCanvas();
|
|
238
|
+
const addNote = (n) =>
|
|
239
|
+
canvas.current?.insertElements(
|
|
240
|
+
[{ type: "ellipse", x: 0, y: 0, width: 32, height: 32, strokeColor: "destructive", backgroundColor: "destructive:soft", label: { text: String(n) } }],
|
|
241
|
+
{ group: true, customData: { note: n } },
|
|
242
|
+
);
|
|
243
|
+
|
|
244
|
+
<SketchCanvas canvasRef={canvas} background={{ src: screenshotDataUrl }} tools={["select", "hand", "draw", "rectangle", "arrow", "text", "eraser"]} onChange={setSketch} />
|
|
245
|
+
const image = await canvas.current.exportImage(); // the screenshot with the marks, as a PNG
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
A wireframe for an agent:
|
|
249
|
+
|
|
250
|
+
```jsx
|
|
251
|
+
import { SketchCanvas, WIREFRAME_STAMPS, sketchToText, useSketchCanvas } from "./blocks/sketch-canvas";
|
|
252
|
+
|
|
253
|
+
const canvas = useSketchCanvas();
|
|
254
|
+
<SketchCanvas canvasRef={canvas} stamps={WIREFRAME_STAMPS} tools={["select", "hand", "draw", "rectangle", "arrow", "text", "eraser", "frame"]} onChange={setSketch} />
|
|
255
|
+
|
|
256
|
+
const build = async () => onBuild({ image: await canvas.current.exportImage(), sketch, text: sketchToText(sketch), prompt });
|
|
257
|
+
// sketchToText → "# Login\nWelcome back\n[input] Email\n[button] Sign in"
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## What it will not do
|
|
261
|
+
|
|
262
|
+
- Collaborate live (several cursors): Excalidraw's collaboration is a
|
|
263
|
+
server of its own, not wired here. Saves are last-write-wins.
|
|
264
|
+
- Offer Excalidraw's library, share links, "text to diagram" / AI, or its
|
|
265
|
+
hand-drawn fonts. Its command palette (Cmd+/) and help dialog (?) still
|
|
266
|
+
open, themed; the palette may name actions that do nothing here.
|
|
267
|
+
- Show a minimap.
|
|
268
|
+
- Keep images out of the JSON: an image lives as a data URL in `files`.
|
|
269
|
+
- Render on the server: the server shows the frame and the sketch's
|
|
270
|
+
words; the drawing appears when the page runs.
|
|
271
|
+
- Pick an arbitrary colour: only the theme's tokens.
|
|
272
|
+
|
|
273
|
+
A canvas it cannot be is your own component in `components/` — not an edit
|
|
274
|
+
to this block. Its files are fixed: `npm run check` refuses a change, and
|
|
275
|
+
`makersclaw add sketch-canvas` restores them.
|
|
276
|
+
|
|
277
|
+
## Credits
|
|
278
|
+
|
|
279
|
+
Excalidraw (https://github.com/excalidraw/excalidraw), MIT — installed from
|
|
280
|
+
npm as a dependency, not copied here. See THIRD-PARTY-NOTICES.md.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sketch-canvas",
|
|
3
|
+
"title": "SketchCanvas",
|
|
4
|
+
"description": "A freeform drawing canvas (Excalidraw) in the workspace theme: a Miro-style tool rail (select, pan, draw, shapes, arrows, text, image, eraser, frames), a floating toolbar over the selection with colours from the theme's tokens, zoom and undo controls, a friendly empty state, and stamp tools that place ready-made drawings (UI wireframe pieces built in). Optional locked background image for annotating a screenshot. The sketch is plain JSON; helpers read its words for an agent, and the handle exports a PNG.",
|
|
5
|
+
"useWhen": "A screen needs freehand drawing: a whiteboard, marking up a screenshot, sketching a UI wireframe, a diagram drawn by hand. The whiteboard, annotate and sketch-to-app blocks are built on it. Not for structured boards of cards and connectors (flow-canvas), charts (chart) or a kanban (board).",
|
|
6
|
+
"tags": ["sketch", "draw", "drawing", "whiteboard", "canvas", "excalidraw", "diagram", "annotate", "markup", "wireframe", "freehand", "shapes", "arrows", "miro", "png"],
|
|
7
|
+
"exports": ["SketchCanvas", "useSketchCanvas", "SKETCH_TOOLS", "WIREFRAME_STAMPS", "STROKES", "FILLS", "emptySketch", "isSketchEmpty", "sketchToText", "sketchItems", "toSketch"],
|
|
8
|
+
"files": ["index.js", "sketch-canvas.jsx", "excalidraw.js", "ssr-shim.js", "ssr-shim-end.js", "theme.js", "palette.js", "sketch.js", "stamps.js"],
|
|
9
|
+
"requires": [],
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"@excalidraw/excalidraw": "0.18.1"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// SketchCanvas three ways — the gallery's and the smoke test's surface. Not
|
|
4
|
+
// installed into apps.
|
|
5
|
+
// Drawing a small flow sketched by hand, saved through onSave (a
|
|
6
|
+
// switch makes the save fail), beside it what sketchToText
|
|
7
|
+
// reads and a PNG export through the handle.
|
|
8
|
+
// Wireframe the UI stamps (button, input, card, nav, table, image) and a
|
|
9
|
+
// trimmed tool set — what sketch-to-app builds on.
|
|
10
|
+
// Empty nothing drawn yet: the friendly first-run state; read-only
|
|
11
|
+
// behind a switch.
|
|
12
|
+
import { useState } from "react";
|
|
13
|
+
import { Button, Card, Switch, TabPanel, Tabs } from "../components/ui";
|
|
14
|
+
import { SketchCanvas, WIREFRAME_STAMPS, sketchToText, useSketchCanvas } from "../components/blocks/sketch-canvas";
|
|
15
|
+
|
|
16
|
+
// Written by hand: shapes, bound labels and arrows, colours as TOKENS only
|
|
17
|
+
// (customData.tokens). The canvas resolves them in the workspace theme.
|
|
18
|
+
const tok = (strokeColor, backgroundColor) => ({ tokens: { strokeColor, ...(backgroundColor ? { backgroundColor } : {}) } });
|
|
19
|
+
const box = (id, x, fill, text, arrows = []) => [
|
|
20
|
+
{
|
|
21
|
+
id,
|
|
22
|
+
type: "rectangle",
|
|
23
|
+
x,
|
|
24
|
+
y: 0,
|
|
25
|
+
width: 168,
|
|
26
|
+
height: 72,
|
|
27
|
+
fillStyle: "solid",
|
|
28
|
+
roundness: { type: 3 },
|
|
29
|
+
boundElements: [{ type: "text", id: `${id}-label` }, ...arrows.map((a) => ({ type: "arrow", id: a }))],
|
|
30
|
+
customData: tok("foreground", fill),
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
id: `${id}-label`,
|
|
34
|
+
type: "text",
|
|
35
|
+
x: x + 20,
|
|
36
|
+
y: 24,
|
|
37
|
+
width: 128,
|
|
38
|
+
height: 24,
|
|
39
|
+
text,
|
|
40
|
+
fontSize: 20,
|
|
41
|
+
containerId: id,
|
|
42
|
+
textAlign: "center",
|
|
43
|
+
verticalAlign: "middle",
|
|
44
|
+
customData: tok("foreground"),
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
const arrow = (id, from, to, x) => ({
|
|
48
|
+
id,
|
|
49
|
+
type: "arrow",
|
|
50
|
+
x,
|
|
51
|
+
y: 36,
|
|
52
|
+
width: 64,
|
|
53
|
+
height: 0,
|
|
54
|
+
points: [
|
|
55
|
+
[0, 0],
|
|
56
|
+
[64, 0],
|
|
57
|
+
],
|
|
58
|
+
startBinding: { elementId: from, focus: 0, gap: 6 },
|
|
59
|
+
endBinding: { elementId: to, focus: 0, gap: 6 },
|
|
60
|
+
endArrowhead: "arrow",
|
|
61
|
+
customData: tok("muted-foreground"),
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const ONBOARDING_SKETCH = {
|
|
65
|
+
elements: [
|
|
66
|
+
{ id: "title", type: "text", x: 0, y: -72, width: 300, height: 32, text: "Onboarding, first pass", fontSize: 28, customData: tok("foreground") },
|
|
67
|
+
...box("signup", 0, "chart-2:soft", "Sign up", ["a1"]),
|
|
68
|
+
arrow("a1", "signup", "plan", 174),
|
|
69
|
+
...box("plan", 244, "chart-3:soft", "Pick a plan", ["a1", "a2"]),
|
|
70
|
+
arrow("a2", "plan", "invite", 418),
|
|
71
|
+
...box("invite", 488, "chart-4:soft", "Invite team", ["a2"]),
|
|
72
|
+
{ id: "note", type: "text", x: 488, y: 104, width: 190, height: 24, text: "Skip this for solo founders?", fontSize: 16, customData: tok("destructive") },
|
|
73
|
+
],
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
function DrawingDemo() {
|
|
77
|
+
const canvas = useSketchCanvas();
|
|
78
|
+
const [text, setText] = useState(() => sketchToText(ONBOARDING_SKETCH));
|
|
79
|
+
const [failSaves, setFailSaves] = useState(false);
|
|
80
|
+
const [png, setPng] = useState(null);
|
|
81
|
+
const save = async () => {
|
|
82
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
83
|
+
return failSaves ? { ok: false, error: "The network dropped" } : { ok: true };
|
|
84
|
+
};
|
|
85
|
+
const exportPng = async () => {
|
|
86
|
+
const blob = await canvas.current?.exportImage();
|
|
87
|
+
setPng(blob ? `PNG, ${Math.max(1, Math.round(blob.size / 1024))} KB` : "Not ready yet");
|
|
88
|
+
};
|
|
89
|
+
return (
|
|
90
|
+
<div className="grid gap-4 lg:grid-cols-[minmax(0,1fr)_18rem]">
|
|
91
|
+
<SketchCanvas
|
|
92
|
+
label="Onboarding flow sketch"
|
|
93
|
+
defaultValue={ONBOARDING_SKETCH}
|
|
94
|
+
onChange={(v) => setText(sketchToText(v))}
|
|
95
|
+
onSave={save}
|
|
96
|
+
canvasRef={canvas}
|
|
97
|
+
className="h-[34rem]"
|
|
98
|
+
/>
|
|
99
|
+
<div className="grid content-start gap-4">
|
|
100
|
+
<Card title="Saving">
|
|
101
|
+
<Switch id="sketch-fail" label="Make saves fail" checked={failSaves} onChange={(e) => setFailSaves(e.target.checked)} />
|
|
102
|
+
</Card>
|
|
103
|
+
<Card title="What an agent reads" actions={<Button size="sm" icon="download" onClick={exportPng}>PNG</Button>}>
|
|
104
|
+
<pre className="whitespace-pre-wrap break-words font-mono text-xs">{text || "Nothing yet."}</pre>
|
|
105
|
+
{png ? <p className="mt-2 text-xs text-muted-foreground">{png}</p> : null}
|
|
106
|
+
</Card>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function WireframeDemo() {
|
|
113
|
+
const [text, setText] = useState("");
|
|
114
|
+
return (
|
|
115
|
+
<div className="grid gap-4 lg:grid-cols-[minmax(0,1fr)_18rem]">
|
|
116
|
+
<SketchCanvas
|
|
117
|
+
label="Screen wireframe"
|
|
118
|
+
stamps={WIREFRAME_STAMPS}
|
|
119
|
+
tools={["select", "hand", "draw", "rectangle", "arrow", "text", "eraser", "frame"]}
|
|
120
|
+
onChange={(v) => setText(sketchToText(v))}
|
|
121
|
+
className="h-[34rem]"
|
|
122
|
+
/>
|
|
123
|
+
<Card title="What an agent reads">
|
|
124
|
+
<pre className="whitespace-pre-wrap break-words font-mono text-xs">{text || "Place a stamp from the rail: a button, an input, a card…"}</pre>
|
|
125
|
+
</Card>
|
|
126
|
+
</div>
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function EmptyDemo() {
|
|
131
|
+
const [readOnly, setReadOnly] = useState(false);
|
|
132
|
+
return (
|
|
133
|
+
<div className="grid gap-3">
|
|
134
|
+
<Switch id="sketch-ro" label="Read-only" checked={readOnly} onChange={(e) => setReadOnly(e.target.checked)} />
|
|
135
|
+
<SketchCanvas label="Blank sketch" readOnly={readOnly} className="h-[28rem]" />
|
|
136
|
+
</div>
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export default function SketchCanvasDemo() {
|
|
141
|
+
const [tab, setTab] = useState("drawing");
|
|
142
|
+
return (
|
|
143
|
+
<div className="grid gap-4">
|
|
144
|
+
<Tabs
|
|
145
|
+
aria-label="SketchCanvas variants"
|
|
146
|
+
value={tab}
|
|
147
|
+
onChange={setTab}
|
|
148
|
+
tabs={[
|
|
149
|
+
{ key: "drawing", label: "Drawing" },
|
|
150
|
+
{ key: "wireframe", label: "Wireframe stamps" },
|
|
151
|
+
{ key: "empty", label: "Empty" },
|
|
152
|
+
]}
|
|
153
|
+
/>
|
|
154
|
+
<TabPanel tab={tab} value={tab}>
|
|
155
|
+
{tab === "drawing" ? <DrawingDemo /> : tab === "wireframe" ? <WireframeDemo /> : <EmptyDemo />}
|
|
156
|
+
</TabPanel>
|
|
157
|
+
</div>
|
|
158
|
+
);
|
|
159
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// The one door to Excalidraw (@excalidraw/excalidraw, MIT). Every file in
|
|
2
|
+
// this block reaches it through here, and the blocks built on this one
|
|
3
|
+
// reach it through SketchCanvas — never the package directly.
|
|
4
|
+
//
|
|
5
|
+
// The order of the imports below is the point: ssr-shim.js lays stand-ins
|
|
6
|
+
// for the browser globals Excalidraw reads while its modules load (only
|
|
7
|
+
// on the server, where they are missing), the package loads, and
|
|
8
|
+
// ssr-shim-end.js takes them away again. Keep the three together and in
|
|
9
|
+
// this order. Its stylesheet ships the same way doc-editor's does: an
|
|
10
|
+
// import of the package's CSS, which the app's bundler picks up.
|
|
11
|
+
import "@excalidraw/excalidraw/index.css";
|
|
12
|
+
import "./ssr-shim";
|
|
13
|
+
import {
|
|
14
|
+
CaptureUpdateAction,
|
|
15
|
+
Excalidraw,
|
|
16
|
+
FONT_FAMILY,
|
|
17
|
+
convertToExcalidrawElements,
|
|
18
|
+
exportToBlob,
|
|
19
|
+
getCommonBounds,
|
|
20
|
+
getSceneVersion,
|
|
21
|
+
newElementWith,
|
|
22
|
+
restoreElements,
|
|
23
|
+
sceneCoordsToViewportCoords,
|
|
24
|
+
viewportCoordsToSceneCoords,
|
|
25
|
+
} from "@excalidraw/excalidraw";
|
|
26
|
+
import "./ssr-shim-end";
|
|
27
|
+
|
|
28
|
+
export {
|
|
29
|
+
CaptureUpdateAction,
|
|
30
|
+
Excalidraw,
|
|
31
|
+
FONT_FAMILY,
|
|
32
|
+
convertToExcalidrawElements,
|
|
33
|
+
exportToBlob,
|
|
34
|
+
getCommonBounds,
|
|
35
|
+
getSceneVersion,
|
|
36
|
+
newElementWith,
|
|
37
|
+
restoreElements,
|
|
38
|
+
sceneCoordsToViewportCoords,
|
|
39
|
+
viewportCoordsToSceneCoords,
|
|
40
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// The SketchCanvas block — `makersclaw add sketch-canvas`. Fixed: compose
|
|
2
|
+
// it through its props (README.md beside this file). The helpers read a
|
|
3
|
+
// sketch anywhere, the server included; the blocks built on this one
|
|
4
|
+
// (whiteboard, annotate, sketch-to-app…) import it, never
|
|
5
|
+
// @excalidraw/excalidraw directly.
|
|
6
|
+
export { SketchCanvas, useSketchCanvas, SKETCH_TOOLS } from "./sketch-canvas";
|
|
7
|
+
export { WIREFRAME_STAMPS } from "./stamps";
|
|
8
|
+
export { STROKES, FILLS } from "./palette";
|
|
9
|
+
export { emptySketch, isSketchEmpty, sketchToText, sketchItems, toSketch } from "./sketch";
|