makersclaw 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD-PARTY-NOTICES.md +180 -0
- package/package.json +3 -2
- package/r/annotate.json +62 -0
- package/r/approval-request.json +52 -0
- package/r/audio-player.json +74 -0
- package/r/auth-form.json +55 -0
- package/r/board.json +10 -6
- package/r/calendar-view.json +105 -0
- package/r/cart.json +62 -0
- package/r/chart.json +83 -0
- package/r/chat.json +95 -0
- package/r/code-editor.json +94 -0
- package/r/comment-box.json +64 -0
- package/r/contact-section.json +53 -0
- package/r/core.json +205 -8
- package/r/csv-import.json +63 -0
- package/r/data-table.json +69 -0
- package/r/diagram.json +74 -0
- package/r/doc-editor.json +82 -0
- package/r/doc-page.json +61 -0
- package/r/email-render.json +73 -0
- package/r/faq.json +50 -0
- package/r/file-upload.json +54 -0
- package/r/flow-canvas.json +93 -0
- package/r/footer.json +52 -0
- package/r/gantt.json +70 -0
- package/r/job-panel.json +12 -7
- package/r/json-editor.json +66 -0
- package/r/map.json +89 -0
- package/r/menubar.json +52 -0
- package/r/mind-map.json +67 -0
- package/r/navigation-menu.json +52 -0
- package/r/order-detail.json +54 -0
- package/r/org-chart.json +66 -0
- package/r/page-builder.json +105 -0
- package/r/payment-methods.json +51 -0
- package/r/pdf-document.json +79 -0
- package/r/pdf-viewer.json +88 -0
- package/r/product-detail.json +76 -0
- package/r/product-grid.json +65 -0
- package/r/record-form.json +67 -0
- package/r/record-notes.json +55 -0
- package/r/registry.json +3411 -29
- package/r/search-dialog.json +51 -0
- package/r/settings-list.json +66 -0
- package/r/setup-checklist.json +51 -0
- package/r/share-dialog.json +52 -0
- package/r/sidebar.json +69 -0
- package/r/signature-pad.json +72 -0
- package/r/sketch-canvas.json +99 -0
- package/r/spreadsheet.json +90 -0
- package/r/stat-cards.json +66 -0
- package/r/task-list.json +63 -0
- package/r/task-model.json +98 -0
- package/r/testimonials.json +52 -0
- package/r/transaction-list.json +53 -0
- package/r/whiteboard.json +66 -0
- package/registry/blocks/annotate/README.md +179 -0
- package/registry/blocks/annotate/annotate-data.js +250 -0
- package/registry/blocks/annotate/annotate.jsx +646 -0
- package/registry/blocks/annotate/block.json +10 -0
- package/registry/blocks/annotate/demo.jsx +135 -0
- package/registry/blocks/annotate/index.js +15 -0
- package/registry/blocks/approval-request/README.md +116 -0
- package/registry/blocks/approval-request/approval-request.jsx +386 -0
- package/registry/blocks/approval-request/block.json +10 -0
- package/registry/blocks/approval-request/demo.jsx +127 -0
- package/registry/blocks/approval-request/index.js +4 -0
- package/registry/blocks/audio-player/README.md +167 -0
- package/registry/blocks/audio-player/audio-player.jsx +623 -0
- package/registry/blocks/audio-player/block.json +14 -0
- package/registry/blocks/audio-player/colors.js +109 -0
- package/registry/blocks/audio-player/demo.jsx +209 -0
- package/registry/blocks/audio-player/index.js +6 -0
- package/registry/blocks/audio-player/time.js +67 -0
- package/registry/blocks/audio-player/wavesurfer.js +9 -0
- package/registry/blocks/auth-form/README.md +126 -0
- package/registry/blocks/auth-form/auth-form.jsx +568 -0
- package/registry/blocks/auth-form/block.json +10 -0
- package/registry/blocks/auth-form/demo.jsx +131 -0
- package/registry/blocks/auth-form/index.js +3 -0
- package/registry/blocks/board/README.md +55 -5
- package/registry/blocks/board/block.json +2 -2
- package/registry/blocks/board/board.jsx +230 -86
- package/registry/blocks/board/demo.jsx +103 -24
- package/registry/blocks/calendar-view/README.md +180 -0
- package/registry/blocks/calendar-view/agenda.jsx +147 -0
- package/registry/blocks/calendar-view/block.json +76 -0
- package/registry/blocks/calendar-view/calendar-model.js +442 -0
- package/registry/blocks/calendar-view/calendar.jsx +627 -0
- package/registry/blocks/calendar-view/demo.jsx +195 -0
- package/registry/blocks/calendar-view/draft.jsx +49 -0
- package/registry/blocks/calendar-view/index.js +39 -0
- package/registry/blocks/calendar-view/month.jsx +346 -0
- package/registry/blocks/calendar-view/paint.js +69 -0
- package/registry/blocks/calendar-view/time-grid.jsx +527 -0
- package/registry/blocks/calendar-view/tray.jsx +87 -0
- package/registry/blocks/cart/README.md +146 -0
- package/registry/blocks/cart/block.json +10 -0
- package/registry/blocks/cart/cart.jsx +597 -0
- package/registry/blocks/cart/demo.jsx +98 -0
- package/registry/blocks/cart/index.js +4 -0
- package/registry/blocks/cart/money.js +28 -0
- package/registry/blocks/chart/README.md +316 -0
- package/registry/blocks/chart/block.json +10 -0
- package/registry/blocks/chart/cartesian.jsx +642 -0
- package/registry/blocks/chart/core.jsx +262 -0
- package/registry/blocks/chart/demo.jsx +357 -0
- package/registry/blocks/chart/heatmap.jsx +336 -0
- package/registry/blocks/chart/index.js +8 -0
- package/registry/blocks/chart/pie.jsx +245 -0
- package/registry/blocks/chart/sparkline.jsx +88 -0
- package/registry/blocks/chat/README.md +273 -0
- package/registry/blocks/chat/attachment.jsx +95 -0
- package/registry/blocks/chat/block.json +10 -0
- package/registry/blocks/chat/chat.jsx +132 -0
- package/registry/blocks/chat/composer.jsx +364 -0
- package/registry/blocks/chat/demo.jsx +578 -0
- package/registry/blocks/chat/header.jsx +34 -0
- package/registry/blocks/chat/index.js +9 -0
- package/registry/blocks/chat/message.jsx +450 -0
- package/registry/blocks/chat/scroller.jsx +247 -0
- package/registry/blocks/chat/text.jsx +104 -0
- package/registry/blocks/code-editor/README.md +210 -0
- package/registry/blocks/code-editor/block.json +22 -0
- package/registry/blocks/code-editor/code-editor.jsx +534 -0
- package/registry/blocks/code-editor/codemirror.js +38 -0
- package/registry/blocks/code-editor/demo.jsx +205 -0
- package/registry/blocks/code-editor/index.js +8 -0
- package/registry/blocks/code-editor/json.js +317 -0
- package/registry/blocks/code-editor/sql.js +136 -0
- package/registry/blocks/code-editor/text.js +101 -0
- package/registry/blocks/code-editor/theme.js +186 -0
- package/registry/blocks/comment-box/README.md +123 -0
- package/registry/blocks/comment-box/block.json +10 -0
- package/registry/blocks/comment-box/comment-body.jsx +217 -0
- package/registry/blocks/comment-box/comment-box.jsx +198 -0
- package/registry/blocks/comment-box/comment-time.jsx +77 -0
- package/registry/blocks/comment-box/demo.jsx +141 -0
- package/registry/blocks/comment-box/index.js +8 -0
- package/registry/blocks/contact-section/README.md +152 -0
- package/registry/blocks/contact-section/block.json +11 -0
- package/registry/blocks/contact-section/contact-section.jsx +509 -0
- package/registry/blocks/contact-section/demo.jsx +93 -0
- package/registry/blocks/contact-section/index.js +4 -0
- package/registry/blocks/csv-import/README.md +133 -0
- package/registry/blocks/csv-import/block.json +13 -0
- package/registry/blocks/csv-import/csv-import.jsx +479 -0
- package/registry/blocks/csv-import/demo.jsx +106 -0
- package/registry/blocks/csv-import/import.js +200 -0
- package/registry/blocks/csv-import/index.js +7 -0
- package/registry/blocks/data-table/README.md +386 -0
- package/registry/blocks/data-table/block.json +10 -0
- package/registry/blocks/data-table/data-table.jsx +1164 -0
- package/registry/blocks/data-table/demo.jsx +588 -0
- package/registry/blocks/data-table/index.js +5 -0
- package/registry/blocks/data-table/model.js +169 -0
- package/registry/blocks/diagram/README.md +108 -0
- package/registry/blocks/diagram/block.json +13 -0
- package/registry/blocks/diagram/demo.jsx +113 -0
- package/registry/blocks/diagram/diagram.jsx +481 -0
- package/registry/blocks/diagram/index.js +7 -0
- package/registry/blocks/diagram/mermaid.js +52 -0
- package/registry/blocks/diagram/palette.js +313 -0
- package/registry/blocks/diagram/source.js +98 -0
- package/registry/blocks/doc-editor/README.md +215 -0
- package/registry/blocks/doc-editor/block.json +15 -0
- package/registry/blocks/doc-editor/demo.jsx +225 -0
- package/registry/blocks/doc-editor/doc-editor.jsx +291 -0
- package/registry/blocks/doc-editor/doc.js +309 -0
- package/registry/blocks/doc-editor/index.js +7 -0
- package/registry/blocks/doc-editor/schema.jsx +56 -0
- package/registry/blocks/doc-editor/shadcn-classes.js +110 -0
- package/registry/blocks/doc-editor/theme.js +82 -0
- package/registry/blocks/doc-page/README.md +119 -0
- package/registry/blocks/doc-page/autosave.js +104 -0
- package/registry/blocks/doc-page/block.json +10 -0
- package/registry/blocks/doc-page/demo.jsx +137 -0
- package/registry/blocks/doc-page/doc-page.jsx +276 -0
- package/registry/blocks/doc-page/index.js +4 -0
- package/registry/blocks/email-render/README.md +151 -0
- package/registry/blocks/email-render/block.json +14 -0
- package/registry/blocks/email-render/demo.jsx +153 -0
- package/registry/blocks/email-render/doc-email.jsx +210 -0
- package/registry/blocks/email-render/email.jsx +221 -0
- package/registry/blocks/email-render/index.js +10 -0
- package/registry/blocks/email-render/render.js +50 -0
- package/registry/blocks/email-render/theme.js +215 -0
- package/registry/blocks/faq/README.md +101 -0
- package/registry/blocks/faq/block.json +11 -0
- package/registry/blocks/faq/demo.jsx +89 -0
- package/registry/blocks/faq/faq.jsx +220 -0
- package/registry/blocks/faq/index.js +4 -0
- package/registry/blocks/file-upload/README.md +138 -0
- package/registry/blocks/file-upload/block.json +10 -0
- package/registry/blocks/file-upload/demo.jsx +204 -0
- package/registry/blocks/file-upload/file-upload.jsx +635 -0
- package/registry/blocks/file-upload/index.js +4 -0
- package/registry/blocks/flow-canvas/README.md +420 -0
- package/registry/blocks/flow-canvas/block.json +13 -0
- package/registry/blocks/flow-canvas/board.js +819 -0
- package/registry/blocks/flow-canvas/chrome.jsx +649 -0
- package/registry/blocks/flow-canvas/context.jsx +35 -0
- package/registry/blocks/flow-canvas/demo.jsx +249 -0
- package/registry/blocks/flow-canvas/edges.jsx +107 -0
- package/registry/blocks/flow-canvas/flow-canvas.jsx +1329 -0
- package/registry/blocks/flow-canvas/index.js +41 -0
- package/registry/blocks/flow-canvas/nodes.jsx +392 -0
- package/registry/blocks/flow-canvas/theme.js +174 -0
- package/registry/blocks/footer/README.md +133 -0
- package/registry/blocks/footer/block.json +11 -0
- package/registry/blocks/footer/demo.jsx +119 -0
- package/registry/blocks/footer/footer.jsx +406 -0
- package/registry/blocks/footer/index.js +4 -0
- package/registry/blocks/gantt/README.md +220 -0
- package/registry/blocks/gantt/block.json +10 -0
- package/registry/blocks/gantt/demo.jsx +148 -0
- package/registry/blocks/gantt/gantt.jsx +923 -0
- package/registry/blocks/gantt/index.js +7 -0
- package/registry/blocks/gantt/rows.jsx +468 -0
- package/registry/blocks/gantt/schedule.js +278 -0
- package/registry/blocks/job-panel/README.md +80 -0
- package/registry/blocks/job-panel/block.json +3 -3
- package/registry/blocks/job-panel/demo.jsx +230 -3
- package/registry/blocks/job-panel/job-panel.jsx +169 -3
- package/registry/blocks/json-editor/README.md +133 -0
- package/registry/blocks/json-editor/block.json +10 -0
- package/registry/blocks/json-editor/demo.jsx +92 -0
- package/registry/blocks/json-editor/index.js +7 -0
- package/registry/blocks/json-editor/json-editor.jsx +305 -0
- package/registry/blocks/json-editor/json-tree.jsx +393 -0
- package/registry/blocks/json-editor/tree.js +225 -0
- package/registry/blocks/map/README.md +221 -0
- package/registry/blocks/map/block.json +14 -0
- package/registry/blocks/map/demo.jsx +201 -0
- package/registry/blocks/map/geo.js +198 -0
- package/registry/blocks/map/index.js +8 -0
- package/registry/blocks/map/list.jsx +128 -0
- package/registry/blocks/map/map-view.jsx +715 -0
- package/registry/blocks/map/maplibre.js +30 -0
- package/registry/blocks/map/marks.jsx +146 -0
- package/registry/blocks/map/theme.js +142 -0
- package/registry/blocks/menubar/README.md +109 -0
- package/registry/blocks/menubar/block.json +10 -0
- package/registry/blocks/menubar/demo.jsx +128 -0
- package/registry/blocks/menubar/index.js +4 -0
- package/registry/blocks/menubar/menubar.jsx +199 -0
- package/registry/blocks/mind-map/README.md +206 -0
- package/registry/blocks/mind-map/block.json +10 -0
- package/registry/blocks/mind-map/demo.jsx +103 -0
- package/registry/blocks/mind-map/index.js +31 -0
- package/registry/blocks/mind-map/mind-map.jsx +1125 -0
- package/registry/blocks/mind-map/topic.jsx +143 -0
- package/registry/blocks/mind-map/tree.js +645 -0
- package/registry/blocks/navigation-menu/README.md +124 -0
- package/registry/blocks/navigation-menu/block.json +10 -0
- package/registry/blocks/navigation-menu/demo.jsx +84 -0
- package/registry/blocks/navigation-menu/index.js +4 -0
- package/registry/blocks/navigation-menu/navigation-menu.jsx +448 -0
- package/registry/blocks/order-detail/README.md +109 -0
- package/registry/blocks/order-detail/block.json +10 -0
- package/registry/blocks/order-detail/demo.jsx +88 -0
- package/registry/blocks/order-detail/index.js +4 -0
- package/registry/blocks/order-detail/order-detail.jsx +354 -0
- package/registry/blocks/org-chart/README.md +145 -0
- package/registry/blocks/org-chart/block.json +10 -0
- package/registry/blocks/org-chart/demo.jsx +94 -0
- package/registry/blocks/org-chart/index.js +7 -0
- package/registry/blocks/org-chart/org-chart.jsx +631 -0
- package/registry/blocks/org-chart/org.js +245 -0
- package/registry/blocks/org-chart/person.jsx +96 -0
- package/registry/blocks/page-builder/README.md +257 -0
- package/registry/blocks/page-builder/block.json +14 -0
- package/registry/blocks/page-builder/demo.jsx +145 -0
- package/registry/blocks/page-builder/grapes.js +18 -0
- package/registry/blocks/page-builder/index.js +11 -0
- package/registry/blocks/page-builder/page-builder.jsx +704 -0
- package/registry/blocks/page-builder/page-view.jsx +33 -0
- package/registry/blocks/page-builder/page.js +118 -0
- package/registry/blocks/page-builder/panels.jsx +588 -0
- package/registry/blocks/page-builder/sections.js +209 -0
- package/registry/blocks/page-builder/theme.js +87 -0
- package/registry/blocks/page-builder/thumbs.jsx +189 -0
- package/registry/blocks/page-builder/tokens.js +329 -0
- package/registry/blocks/payment-methods/README.md +104 -0
- package/registry/blocks/payment-methods/block.json +10 -0
- package/registry/blocks/payment-methods/demo.jsx +71 -0
- package/registry/blocks/payment-methods/index.js +4 -0
- package/registry/blocks/payment-methods/payment-methods.jsx +302 -0
- package/registry/blocks/pdf-document/README.md +213 -0
- package/registry/blocks/pdf-document/block.json +13 -0
- package/registry/blocks/pdf-document/demo.jsx +136 -0
- package/registry/blocks/pdf-document/index.js +33 -0
- package/registry/blocks/pdf-document/money.js +83 -0
- package/registry/blocks/pdf-document/pdf-document.jsx +144 -0
- package/registry/blocks/pdf-document/primitives.jsx +271 -0
- package/registry/blocks/pdf-document/quote.jsx +179 -0
- package/registry/blocks/pdf-document/theme.js +193 -0
- package/registry/blocks/pdf-viewer/README.md +191 -0
- package/registry/blocks/pdf-viewer/block.json +14 -0
- package/registry/blocks/pdf-viewer/demo.jsx +252 -0
- package/registry/blocks/pdf-viewer/helpers.js +270 -0
- package/registry/blocks/pdf-viewer/index.js +8 -0
- package/registry/blocks/pdf-viewer/notes.jsx +195 -0
- package/registry/blocks/pdf-viewer/pdf-viewer.jsx +1368 -0
- package/registry/blocks/pdf-viewer/pdfjs.js +37 -0
- package/registry/blocks/pdf-viewer/ssr-shim-end.js +6 -0
- package/registry/blocks/pdf-viewer/ssr-shim.js +44 -0
- package/registry/blocks/product-detail/README.md +217 -0
- package/registry/blocks/product-detail/block.json +10 -0
- package/registry/blocks/product-detail/demo.jsx +233 -0
- package/registry/blocks/product-detail/index.js +7 -0
- package/registry/blocks/product-detail/price.jsx +115 -0
- package/registry/blocks/product-detail/product-detail.jsx +348 -0
- package/registry/blocks/product-detail/product-media.jsx +102 -0
- package/registry/blocks/product-detail/product-options.jsx +144 -0
- package/registry/blocks/product-grid/README.md +162 -0
- package/registry/blocks/product-grid/block.json +10 -0
- package/registry/blocks/product-grid/demo.jsx +255 -0
- package/registry/blocks/product-grid/index.js +5 -0
- package/registry/blocks/product-grid/product-card.jsx +232 -0
- package/registry/blocks/product-grid/product-grid.jsx +235 -0
- package/registry/blocks/record-form/README.md +196 -0
- package/registry/blocks/record-form/block.json +10 -0
- package/registry/blocks/record-form/demo.jsx +525 -0
- package/registry/blocks/record-form/index.js +4 -0
- package/registry/blocks/record-form/record-fields.jsx +457 -0
- package/registry/blocks/record-form/record-form.jsx +415 -0
- package/registry/blocks/record-form/rules.js +81 -0
- package/registry/blocks/record-notes/README.md +139 -0
- package/registry/blocks/record-notes/block.json +10 -0
- package/registry/blocks/record-notes/demo.jsx +179 -0
- package/registry/blocks/record-notes/index.js +4 -0
- package/registry/blocks/record-notes/record-notes.jsx +266 -0
- package/registry/blocks/search-dialog/README.md +108 -0
- package/registry/blocks/search-dialog/block.json +10 -0
- package/registry/blocks/search-dialog/demo.jsx +116 -0
- package/registry/blocks/search-dialog/index.js +3 -0
- package/registry/blocks/search-dialog/search-dialog.jsx +235 -0
- package/registry/blocks/settings-list/README.md +171 -0
- package/registry/blocks/settings-list/block.json +10 -0
- package/registry/blocks/settings-list/demo.jsx +333 -0
- package/registry/blocks/settings-list/index.js +4 -0
- package/registry/blocks/settings-list/row-state.jsx +93 -0
- package/registry/blocks/settings-list/settings-list.jsx +349 -0
- package/registry/blocks/settings-list/settings-matrix.jsx +118 -0
- package/registry/blocks/setup-checklist/README.md +142 -0
- package/registry/blocks/setup-checklist/block.json +10 -0
- package/registry/blocks/setup-checklist/demo.jsx +159 -0
- package/registry/blocks/setup-checklist/index.js +4 -0
- package/registry/blocks/setup-checklist/setup-checklist.jsx +446 -0
- package/registry/blocks/share-dialog/README.md +113 -0
- package/registry/blocks/share-dialog/block.json +10 -0
- package/registry/blocks/share-dialog/demo.jsx +140 -0
- package/registry/blocks/share-dialog/index.js +3 -0
- package/registry/blocks/share-dialog/share-dialog.jsx +384 -0
- package/registry/blocks/sidebar/README.md +190 -0
- package/registry/blocks/sidebar/block.json +43 -0
- package/registry/blocks/sidebar/demo.jsx +577 -0
- package/registry/blocks/sidebar/index.js +4 -0
- package/registry/blocks/sidebar/sidebar-panel.jsx +149 -0
- package/registry/blocks/sidebar/sidebar.jsx +864 -0
- package/registry/blocks/signature-pad/README.md +137 -0
- package/registry/blocks/signature-pad/block.json +13 -0
- package/registry/blocks/signature-pad/colors.js +115 -0
- package/registry/blocks/signature-pad/demo.jsx +94 -0
- package/registry/blocks/signature-pad/index.js +6 -0
- package/registry/blocks/signature-pad/pad.js +7 -0
- package/registry/blocks/signature-pad/signature-pad.jsx +434 -0
- package/registry/blocks/signature-pad/signature.js +68 -0
- package/registry/blocks/sketch-canvas/README.md +280 -0
- package/registry/blocks/sketch-canvas/block.json +13 -0
- package/registry/blocks/sketch-canvas/demo.jsx +159 -0
- package/registry/blocks/sketch-canvas/excalidraw.js +40 -0
- package/registry/blocks/sketch-canvas/index.js +9 -0
- package/registry/blocks/sketch-canvas/palette.js +226 -0
- package/registry/blocks/sketch-canvas/sketch-canvas.jsx +1188 -0
- package/registry/blocks/sketch-canvas/sketch.js +179 -0
- package/registry/blocks/sketch-canvas/ssr-shim-end.js +6 -0
- package/registry/blocks/sketch-canvas/ssr-shim.js +45 -0
- package/registry/blocks/sketch-canvas/stamps.js +104 -0
- package/registry/blocks/sketch-canvas/theme.js +131 -0
- package/registry/blocks/spreadsheet/README.md +307 -0
- package/registry/blocks/spreadsheet/block.json +13 -0
- package/registry/blocks/spreadsheet/cells.jsx +455 -0
- package/registry/blocks/spreadsheet/chrome.jsx +325 -0
- package/registry/blocks/spreadsheet/demo.jsx +177 -0
- package/registry/blocks/spreadsheet/grid.js +387 -0
- package/registry/blocks/spreadsheet/index.js +34 -0
- package/registry/blocks/spreadsheet/spreadsheet.jsx +1732 -0
- package/registry/blocks/spreadsheet/types.js +473 -0
- package/registry/blocks/stat-cards/README.md +173 -0
- package/registry/blocks/stat-cards/block.json +10 -0
- package/registry/blocks/stat-cards/demo.jsx +257 -0
- package/registry/blocks/stat-cards/index.js +4 -0
- package/registry/blocks/stat-cards/stat-cards.jsx +307 -0
- package/registry/blocks/stat-cards/usage.jsx +243 -0
- package/registry/blocks/task-list/README.md +176 -0
- package/registry/blocks/task-list/block.json +10 -0
- package/registry/blocks/task-list/demo.jsx +134 -0
- package/registry/blocks/task-list/index.js +5 -0
- package/registry/blocks/task-list/task-list.jsx +907 -0
- package/registry/blocks/task-model/README.md +455 -0
- package/registry/blocks/task-model/block.json +167 -0
- package/registry/blocks/task-model/changes.js +89 -0
- package/registry/blocks/task-model/dates.js +371 -0
- package/registry/blocks/task-model/demo.jsx +215 -0
- package/registry/blocks/task-model/dnd.jsx +240 -0
- package/registry/blocks/task-model/index.js +97 -0
- package/registry/blocks/task-model/model.js +919 -0
- package/registry/blocks/task-model/parts.jsx +449 -0
- package/registry/blocks/task-model/toolbar.jsx +271 -0
- package/registry/blocks/testimonials/README.md +139 -0
- package/registry/blocks/testimonials/block.json +11 -0
- package/registry/blocks/testimonials/demo.jsx +137 -0
- package/registry/blocks/testimonials/index.js +4 -0
- package/registry/blocks/testimonials/testimonials.jsx +430 -0
- package/registry/blocks/transaction-list/README.md +126 -0
- package/registry/blocks/transaction-list/block.json +10 -0
- package/registry/blocks/transaction-list/demo.jsx +79 -0
- package/registry/blocks/transaction-list/index.js +4 -0
- package/registry/blocks/transaction-list/transaction-list.jsx +383 -0
- package/registry/blocks/whiteboard/README.md +179 -0
- package/registry/blocks/whiteboard/block.json +10 -0
- package/registry/blocks/whiteboard/demo.jsx +169 -0
- package/registry/blocks/whiteboard/index.js +6 -0
- package/registry/blocks/whiteboard/templates.js +150 -0
- package/registry/blocks/whiteboard/whiteboard.jsx +721 -0
- package/src/cli.mjs +19 -6
- package/src/install.mjs +18 -0
- package/src/registry.mjs +38 -4
- package/src/shadcn.mjs +14 -1
- package/templates/next/files/README.md +145 -11
- package/templates/next/files/app/globals.css +55 -4
- package/templates/next/files/check/run.mjs +3 -3
- package/templates/next/files/components/ui/avatar.jsx +141 -0
- package/templates/next/files/components/ui/breadcrumb.jsx +149 -0
- package/templates/next/files/components/ui/button-group.jsx +70 -0
- package/templates/next/files/components/ui/button.jsx +132 -12
- package/templates/next/files/components/ui/calendar.jsx +609 -0
- package/templates/next/files/components/ui/carousel.jsx +281 -0
- package/templates/next/files/components/ui/collapsible.jsx +208 -0
- package/templates/next/files/components/ui/combobox.jsx +608 -0
- package/templates/next/files/components/ui/command.jsx +577 -0
- package/templates/next/files/components/ui/context-menu.jsx +191 -0
- package/templates/next/files/components/ui/date-picker.jsx +360 -0
- package/templates/next/files/components/ui/distribution.jsx +117 -0
- package/templates/next/files/components/ui/feedback.jsx +143 -0
- package/templates/next/files/components/ui/field.jsx +115 -3
- package/templates/next/files/components/ui/file-input.jsx +234 -0
- package/templates/next/files/components/ui/icon.jsx +130 -8
- package/templates/next/files/components/ui/image.jsx +143 -0
- package/templates/next/files/components/ui/index.js +47 -2
- package/templates/next/files/components/ui/input-group.jsx +213 -0
- package/templates/next/files/components/ui/input-otp.jsx +170 -0
- package/templates/next/files/components/ui/item.jsx +206 -0
- package/templates/next/files/components/ui/menu.jsx +454 -82
- package/templates/next/files/components/ui/notice.jsx +126 -14
- package/templates/next/files/components/ui/pagination.jsx +156 -0
- package/templates/next/files/components/ui/popover.jsx +284 -0
- package/templates/next/files/components/ui/radio.jsx +193 -0
- package/templates/next/files/components/ui/rating.jsx +131 -0
- package/templates/next/files/components/ui/resizable.jsx +338 -0
- package/templates/next/files/components/ui/scroll-area.jsx +123 -0
- package/templates/next/files/components/ui/separator.jsx +119 -0
- package/templates/next/files/components/ui/sheet.jsx +96 -11
- package/templates/next/files/components/ui/slider.jsx +174 -0
- package/templates/next/files/components/ui/stat.jsx +574 -0
- package/templates/next/files/components/ui/steps.jsx +338 -0
- package/templates/next/files/components/ui/swatch.jsx +33 -0
- package/templates/next/files/components/ui/table.jsx +130 -0
- package/templates/next/files/components/ui/toast.jsx +440 -0
- package/templates/next/files/components/ui/toggle.jsx +195 -0
- package/templates/next/files/components/ui/tooltip.jsx +270 -0
- package/templates/next/template.json +264 -8
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
// The diagram's colours are the workspace's tokens.
|
|
2
|
+
//
|
|
3
|
+
// Mermaid draws with concrete colours and derives shades from them, so it
|
|
4
|
+
// cannot read var(--color-primary). At run time the block reads each token
|
|
5
|
+
// from the page (resolvePalette, the browser half at the bottom), and
|
|
6
|
+
// mermaidTheme turns that palette into Mermaid's `themeVariables`: node
|
|
7
|
+
// fills are soft tints of the primary and the chart hues on the card,
|
|
8
|
+
// lines are muted-foreground, text is the foreground, notes a warning tint,
|
|
9
|
+
// and the pie / git / mind-map colours are the chart hues. No colour value
|
|
10
|
+
// is written in this file: every one comes from the page.
|
|
11
|
+
//
|
|
12
|
+
// Everything but resolvePalette() is a plain function of plain objects,
|
|
13
|
+
// so it runs in node and on the server.
|
|
14
|
+
|
|
15
|
+
/** The tokens read from the page. */
|
|
16
|
+
export const SLOTS = [
|
|
17
|
+
"background",
|
|
18
|
+
"foreground",
|
|
19
|
+
"card",
|
|
20
|
+
"card-foreground",
|
|
21
|
+
"muted",
|
|
22
|
+
"muted-foreground",
|
|
23
|
+
"border",
|
|
24
|
+
"primary",
|
|
25
|
+
"primary-foreground",
|
|
26
|
+
"accent",
|
|
27
|
+
"destructive",
|
|
28
|
+
"success",
|
|
29
|
+
"warning",
|
|
30
|
+
"info",
|
|
31
|
+
"chart-1",
|
|
32
|
+
"chart-2",
|
|
33
|
+
"chart-3",
|
|
34
|
+
"chart-4",
|
|
35
|
+
"chart-5",
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
const HEXISH = /^#?([0-9a-f]{6})([0-9a-f]{2})?$/i;
|
|
39
|
+
|
|
40
|
+
/** "#rrggbb" → [r, g, b], or null. */
|
|
41
|
+
export function parseHex(value) {
|
|
42
|
+
const m = HEXISH.exec(String(value ?? "").trim());
|
|
43
|
+
if (!m) return null;
|
|
44
|
+
const n = parseInt(m[1], 16);
|
|
45
|
+
return [(n >> 16) & 255, (n >> 8) & 255, n & 255];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const byte = (n) => Math.max(0, Math.min(255, Math.round(n))).toString(16).padStart(2, "0");
|
|
49
|
+
export const toHex = ([r, g, b]) => "#" + byte(r) + byte(g) + byte(b);
|
|
50
|
+
|
|
51
|
+
/** `t` of colour a over (1 - t) of colour b, both hex. */
|
|
52
|
+
export function mix(a, b, t) {
|
|
53
|
+
const x = parseHex(a);
|
|
54
|
+
const y = parseHex(b);
|
|
55
|
+
if (!x || !y) return a ?? b ?? null;
|
|
56
|
+
const k = Math.max(0, Math.min(1, t));
|
|
57
|
+
return toHex([0, 1, 2].map((i) => x[i] * k + y[i] * (1 - k)));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Relative luminance, 0 (black) … 1 (white). */
|
|
61
|
+
export function luminance(hex) {
|
|
62
|
+
const c = parseHex(hex);
|
|
63
|
+
if (!c) return 0;
|
|
64
|
+
const [r, g, b] = c.map((v) => {
|
|
65
|
+
const s = v / 255;
|
|
66
|
+
return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;
|
|
67
|
+
});
|
|
68
|
+
return 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const contrast = (a, b) => {
|
|
72
|
+
const [x, y] = [luminance(a), luminance(b)].sort((p, q) => q - p);
|
|
73
|
+
return (x + 0.05) / (y + 0.05);
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
/** Of the theme's own ink and paper, whichever reads on `fill`. */
|
|
77
|
+
export function readableOn(fill, palette) {
|
|
78
|
+
const ink = palette.foreground;
|
|
79
|
+
const paper = palette.background;
|
|
80
|
+
if (!ink || !paper) return ink ?? paper;
|
|
81
|
+
return contrast(fill, ink) >= contrast(fill, paper) ? ink : paper;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** A stable fingerprint: equal strings, nothing to redraw. */
|
|
85
|
+
export const paletteKey = (p) =>
|
|
86
|
+
Object.keys(p ?? {})
|
|
87
|
+
.sort()
|
|
88
|
+
.map((k) => `${k}=${p[k]}`)
|
|
89
|
+
.join(";");
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Mermaid's `themeVariables` (theme "base") from a palette of hex colours.
|
|
93
|
+
* An empty palette gives {} — Mermaid's own base look — so a page without
|
|
94
|
+
* the tokens still draws.
|
|
95
|
+
*/
|
|
96
|
+
export function mermaidTheme(palette, { fontFamily } = {}) {
|
|
97
|
+
const p = palette ?? {};
|
|
98
|
+
if (!p.foreground || !p.card) return fontFamily ? { fontFamily } : {};
|
|
99
|
+
const card = p.card;
|
|
100
|
+
const fg = p["card-foreground"] ?? p.foreground;
|
|
101
|
+
const soft = (slot, t = 0.16) => mix(p[slot] ?? p.primary ?? fg, card, t);
|
|
102
|
+
const edge = (slot, t = 0.6) => mix(p[slot] ?? p.primary ?? fg, card, t);
|
|
103
|
+
const dark = luminance(card) < 0.4;
|
|
104
|
+
const hues = ["chart-1", "chart-2", "chart-3", "chart-4", "chart-5"].map((s) => p[s] ?? p.primary ?? fg);
|
|
105
|
+
const hueAt = (i) => hues[i % hues.length];
|
|
106
|
+
const softAt = (i) => mix(hueAt(i), card, i < 5 ? 0.22 : 0.4);
|
|
107
|
+
const out = {
|
|
108
|
+
darkMode: dark,
|
|
109
|
+
background: card,
|
|
110
|
+
fontFamily: fontFamily || undefined,
|
|
111
|
+
fontSize: "14px",
|
|
112
|
+
useGradient: false,
|
|
113
|
+
dropShadow: "none",
|
|
114
|
+
|
|
115
|
+
primaryColor: soft("primary"),
|
|
116
|
+
primaryTextColor: fg,
|
|
117
|
+
primaryBorderColor: edge("primary"),
|
|
118
|
+
secondaryColor: soft("chart-2"),
|
|
119
|
+
secondaryTextColor: fg,
|
|
120
|
+
secondaryBorderColor: edge("chart-2"),
|
|
121
|
+
tertiaryColor: p.muted ?? soft("primary", 0.08),
|
|
122
|
+
tertiaryTextColor: fg,
|
|
123
|
+
tertiaryBorderColor: p.border ?? edge("primary", 0.3),
|
|
124
|
+
lineColor: p["muted-foreground"] ?? fg,
|
|
125
|
+
arrowheadColor: p["muted-foreground"] ?? fg,
|
|
126
|
+
textColor: fg,
|
|
127
|
+
titleColor: fg,
|
|
128
|
+
mainBkg: soft("primary"),
|
|
129
|
+
nodeBkg: soft("primary"),
|
|
130
|
+
nodeBorder: edge("primary"),
|
|
131
|
+
nodeTextColor: fg,
|
|
132
|
+
clusterBkg: p.muted ?? card,
|
|
133
|
+
clusterBorder: p.border ?? edge("primary", 0.3),
|
|
134
|
+
defaultLinkColor: p["muted-foreground"] ?? fg,
|
|
135
|
+
edgeLabelBackground: card,
|
|
136
|
+
labelBackgroundColor: card,
|
|
137
|
+
|
|
138
|
+
noteBkgColor: soft("warning", 0.16),
|
|
139
|
+
noteTextColor: fg,
|
|
140
|
+
noteBorderColor: edge("warning", 0.5),
|
|
141
|
+
|
|
142
|
+
// sequence
|
|
143
|
+
actorBkg: soft("primary"),
|
|
144
|
+
actorBorder: edge("primary"),
|
|
145
|
+
actorTextColor: fg,
|
|
146
|
+
actorLineColor: p["muted-foreground"] ?? fg,
|
|
147
|
+
signalColor: fg,
|
|
148
|
+
signalTextColor: fg,
|
|
149
|
+
labelBoxBkgColor: p.muted ?? card,
|
|
150
|
+
labelBoxBorderColor: p.border ?? fg,
|
|
151
|
+
labelTextColor: fg,
|
|
152
|
+
loopTextColor: fg,
|
|
153
|
+
activationBkgColor: p.muted ?? card,
|
|
154
|
+
activationBorderColor: p.border ?? fg,
|
|
155
|
+
sequenceNumberColor: readableOn(p["muted-foreground"] ?? fg, p),
|
|
156
|
+
|
|
157
|
+
// gantt
|
|
158
|
+
sectionBkgColor: p.muted ?? card,
|
|
159
|
+
altSectionBkgColor: card,
|
|
160
|
+
sectionBkgColor2: p.muted ?? card,
|
|
161
|
+
gridColor: p.border ?? fg,
|
|
162
|
+
taskBkgColor: soft("primary", 0.3),
|
|
163
|
+
taskBorderColor: edge("primary"),
|
|
164
|
+
taskTextColor: fg,
|
|
165
|
+
taskTextLightColor: fg,
|
|
166
|
+
taskTextDarkColor: fg,
|
|
167
|
+
taskTextOutsideColor: fg,
|
|
168
|
+
taskTextClickableColor: p.primary ?? fg,
|
|
169
|
+
activeTaskBkgColor: soft("chart-2", 0.3),
|
|
170
|
+
activeTaskBorderColor: edge("chart-2"),
|
|
171
|
+
doneTaskBkgColor: p.muted ?? card,
|
|
172
|
+
doneTaskBorderColor: p.border ?? fg,
|
|
173
|
+
critBkgColor: soft("destructive", 0.24),
|
|
174
|
+
critBorderColor: p.destructive ?? fg,
|
|
175
|
+
todayLineColor: p.destructive ?? fg,
|
|
176
|
+
vertLineColor: p["muted-foreground"] ?? fg,
|
|
177
|
+
excludeBkgColor: p.muted ?? card,
|
|
178
|
+
|
|
179
|
+
// state, class, er
|
|
180
|
+
stateBkg: soft("primary"),
|
|
181
|
+
stateLabelColor: fg,
|
|
182
|
+
compositeBackground: p.muted ?? card,
|
|
183
|
+
compositeTitleBackground: p.muted ?? card,
|
|
184
|
+
compositeBorder: p.border ?? fg,
|
|
185
|
+
altBackground: p.muted ?? card,
|
|
186
|
+
innerEndBackground: fg,
|
|
187
|
+
specialStateColor: fg,
|
|
188
|
+
transitionColor: p["muted-foreground"] ?? fg,
|
|
189
|
+
transitionLabelColor: fg,
|
|
190
|
+
classText: fg,
|
|
191
|
+
rowOdd: card,
|
|
192
|
+
rowEven: p.muted ?? card,
|
|
193
|
+
relationColor: p["muted-foreground"] ?? fg,
|
|
194
|
+
relationLabelBackground: card,
|
|
195
|
+
relationLabelColor: fg,
|
|
196
|
+
requirementBackground: soft("primary"),
|
|
197
|
+
requirementBorderColor: edge("primary"),
|
|
198
|
+
requirementTextColor: fg,
|
|
199
|
+
|
|
200
|
+
errorBkgColor: soft("destructive", 0.2),
|
|
201
|
+
errorTextColor: p.destructive ?? fg,
|
|
202
|
+
|
|
203
|
+
// pie
|
|
204
|
+
pieTitleTextColor: fg,
|
|
205
|
+
pieSectionTextColor: readableOn(hueAt(1), p),
|
|
206
|
+
pieLegendTextColor: fg,
|
|
207
|
+
pieStrokeColor: card,
|
|
208
|
+
pieOuterStrokeColor: p.border ?? card,
|
|
209
|
+
pieOpacity: "1",
|
|
210
|
+
|
|
211
|
+
// quadrant
|
|
212
|
+
quadrant1Fill: softAt(0),
|
|
213
|
+
quadrant2Fill: softAt(1),
|
|
214
|
+
quadrant3Fill: softAt(2),
|
|
215
|
+
quadrant4Fill: softAt(3),
|
|
216
|
+
quadrant1TextFill: fg,
|
|
217
|
+
quadrant2TextFill: fg,
|
|
218
|
+
quadrant3TextFill: fg,
|
|
219
|
+
quadrant4TextFill: fg,
|
|
220
|
+
quadrantPointFill: p.primary ?? fg,
|
|
221
|
+
quadrantPointTextFill: fg,
|
|
222
|
+
quadrantXAxisTextFill: fg,
|
|
223
|
+
quadrantYAxisTextFill: fg,
|
|
224
|
+
quadrantTitleFill: fg,
|
|
225
|
+
quadrantInternalBorderStrokeFill: p.border ?? fg,
|
|
226
|
+
quadrantExternalBorderStrokeFill: p.border ?? fg,
|
|
227
|
+
|
|
228
|
+
// xy chart
|
|
229
|
+
xyChart: {
|
|
230
|
+
backgroundColor: card,
|
|
231
|
+
titleColor: fg,
|
|
232
|
+
xAxisLabelColor: fg,
|
|
233
|
+
xAxisTitleColor: fg,
|
|
234
|
+
xAxisTickColor: p["muted-foreground"] ?? fg,
|
|
235
|
+
xAxisLineColor: p.border ?? fg,
|
|
236
|
+
yAxisLabelColor: fg,
|
|
237
|
+
yAxisTitleColor: fg,
|
|
238
|
+
yAxisTickColor: p["muted-foreground"] ?? fg,
|
|
239
|
+
yAxisLineColor: p.border ?? fg,
|
|
240
|
+
plotColorPalette: hues.join(","),
|
|
241
|
+
},
|
|
242
|
+
scaleLabelColor: fg,
|
|
243
|
+
commitLabelColor: fg,
|
|
244
|
+
commitLabelBackground: p.muted ?? card,
|
|
245
|
+
tagLabelColor: fg,
|
|
246
|
+
tagLabelBackground: p.muted ?? card,
|
|
247
|
+
tagLabelBorder: p.border ?? fg,
|
|
248
|
+
};
|
|
249
|
+
for (let i = 0; i < 12; i++) {
|
|
250
|
+
out[`pie${i + 1}`] = i < 5 ? hueAt(i) : mix(hueAt(i), card, 0.55);
|
|
251
|
+
out[`cScale${i}`] = softAt(i);
|
|
252
|
+
out[`cScaleLabel${i}`] = fg;
|
|
253
|
+
}
|
|
254
|
+
for (let i = 0; i < 8; i++) {
|
|
255
|
+
out[`git${i}`] = hueAt(i);
|
|
256
|
+
out[`gitInv${i}`] = readableOn(hueAt(i), p);
|
|
257
|
+
out[`gitBranchLabel${i}`] = readableOn(hueAt(i), p);
|
|
258
|
+
}
|
|
259
|
+
for (let i = 0; i < 8; i++) out[`fillType${i}`] = softAt(i);
|
|
260
|
+
return out;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// ---- the browser half -------------------------------------------------------
|
|
264
|
+
|
|
265
|
+
/** Read every slot from the CSS variables in effect at `el` (so a theme
|
|
266
|
+
* scoped to an ancestor counts). A probe takes `color: var(--color-…)`;
|
|
267
|
+
* the browser resolves var(), light-dark(), mixes and relative colours
|
|
268
|
+
* into its computed colour, and a 1×1 canvas turns that into bytes
|
|
269
|
+
* whatever syntax it came back in. */
|
|
270
|
+
export function resolvePalette(el) {
|
|
271
|
+
if (typeof document === "undefined" || !el) return {};
|
|
272
|
+
const probe = document.createElement("span");
|
|
273
|
+
probe.setAttribute("aria-hidden", "true");
|
|
274
|
+
probe.style.position = "absolute";
|
|
275
|
+
probe.style.visibility = "hidden";
|
|
276
|
+
probe.style.pointerEvents = "none";
|
|
277
|
+
el.appendChild(probe);
|
|
278
|
+
const canvas = document.createElement("canvas");
|
|
279
|
+
canvas.width = 1;
|
|
280
|
+
canvas.height = 1;
|
|
281
|
+
const ctx = canvas.getContext?.("2d", { willReadFrequently: true });
|
|
282
|
+
const out = {};
|
|
283
|
+
// The card first: a see-through token (the border is 15% ink) is laid
|
|
284
|
+
// over it, so what Mermaid gets is the colour as it looks on the card.
|
|
285
|
+
const order = ["card", ...SLOTS.filter((s) => s !== "card")];
|
|
286
|
+
try {
|
|
287
|
+
for (const slot of order) {
|
|
288
|
+
probe.style.color = "";
|
|
289
|
+
probe.style.color = `var(--color-${slot})`;
|
|
290
|
+
const computed = getComputedStyle(probe).color;
|
|
291
|
+
if (!computed) continue;
|
|
292
|
+
if (!ctx) {
|
|
293
|
+
const hex = parseHex(computed);
|
|
294
|
+
if (hex) out[slot] = toHex(hex);
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
ctx.clearRect(0, 0, 1, 1);
|
|
298
|
+
if (out.card) {
|
|
299
|
+
ctx.fillStyle = out.card;
|
|
300
|
+
ctx.fillRect(0, 0, 1, 1);
|
|
301
|
+
}
|
|
302
|
+
ctx.fillStyle = "transparent";
|
|
303
|
+
ctx.fillStyle = computed;
|
|
304
|
+
ctx.fillRect(0, 0, 1, 1);
|
|
305
|
+
const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;
|
|
306
|
+
if (a === 0) continue;
|
|
307
|
+
out[slot] = toHex([r, g, b]);
|
|
308
|
+
}
|
|
309
|
+
} finally {
|
|
310
|
+
probe.remove();
|
|
311
|
+
}
|
|
312
|
+
return out;
|
|
313
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// Reading Mermaid text: what kind of diagram it is, and what went wrong.
|
|
2
|
+
// Plain functions of strings, so they run in node and on the server.
|
|
3
|
+
|
|
4
|
+
const KINDS = [
|
|
5
|
+
[/^flowchart\b|^graph\b/, "Flowchart"],
|
|
6
|
+
[/^sequenceDiagram\b/, "Sequence diagram"],
|
|
7
|
+
[/^classDiagram(?:-v2)?\b/, "Class diagram"],
|
|
8
|
+
[/^stateDiagram(?:-v2)?\b/, "State diagram"],
|
|
9
|
+
[/^erDiagram\b/, "Entity relationships"],
|
|
10
|
+
[/^journey\b/, "User journey"],
|
|
11
|
+
[/^gantt\b/, "Gantt chart"],
|
|
12
|
+
[/^pie\b/, "Pie chart"],
|
|
13
|
+
[/^quadrantChart\b/, "Quadrant chart"],
|
|
14
|
+
[/^requirementDiagram\b/, "Requirements"],
|
|
15
|
+
[/^gitGraph\b/, "Git graph"],
|
|
16
|
+
[/^mindmap\b/, "Mind map"],
|
|
17
|
+
[/^timeline\b/, "Timeline"],
|
|
18
|
+
[/^sankey(?:-beta)?\b/, "Sankey diagram"],
|
|
19
|
+
[/^xychart(?:-beta)?\b/, "XY chart"],
|
|
20
|
+
[/^block(?:-beta)?\b/, "Block diagram"],
|
|
21
|
+
[/^packet(?:-beta)?\b/, "Packet diagram"],
|
|
22
|
+
[/^kanban\b/, "Kanban"],
|
|
23
|
+
[/^architecture(?:-beta)?\b/, "Architecture"],
|
|
24
|
+
[/^radar(?:-beta)?\b/, "Radar chart"],
|
|
25
|
+
[/^C4\w*/, "C4 diagram"],
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
/** The first line that says something: past blank lines, %% comments and
|
|
29
|
+
* a --- front-matter block. */
|
|
30
|
+
export function firstStatement(source) {
|
|
31
|
+
const lines = String(source ?? "").split("\n");
|
|
32
|
+
let i = 0;
|
|
33
|
+
if (lines[0]?.trim() === "---") {
|
|
34
|
+
i = 1;
|
|
35
|
+
while (i < lines.length && lines[i].trim() !== "---") i++;
|
|
36
|
+
i++;
|
|
37
|
+
}
|
|
38
|
+
for (; i < lines.length; i++) {
|
|
39
|
+
const t = lines[i].trim();
|
|
40
|
+
if (t && !t.startsWith("%%")) return { line: i + 1, text: t };
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** "Flowchart", "Sequence diagram"… or null when the text names no kind. */
|
|
46
|
+
export function diagramKind(source) {
|
|
47
|
+
const first = firstStatement(source);
|
|
48
|
+
if (!first) return null;
|
|
49
|
+
for (const [re, name] of KINDS) if (re.test(first.text)) return name;
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** The diagram's own title (`title …` in front matter or a line), or null. */
|
|
54
|
+
export function diagramTitle(source) {
|
|
55
|
+
const m = /^\s*(?:title\s*:?\s*)(.+)$/m.exec(String(source ?? ""));
|
|
56
|
+
return m ? m[1].trim().replace(/^["']|["']$/g, "") : null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* What a Mermaid error means, for people: { line, message, detail }.
|
|
61
|
+
* `line` is 1-based in the source, or null when Mermaid did not say.
|
|
62
|
+
* `message` is ours ("Line 3 has a mistake"), `detail` Mermaid's own
|
|
63
|
+
* words, trimmed of the ASCII art pointer.
|
|
64
|
+
*/
|
|
65
|
+
export function describeError(error, source) {
|
|
66
|
+
const raw = String(error?.message ?? error?.str ?? error ?? "").trim();
|
|
67
|
+
const hash = error?.hash;
|
|
68
|
+
let line = null;
|
|
69
|
+
if (Number.isFinite(hash?.loc?.first_line)) line = hash.loc.first_line;
|
|
70
|
+
else if (Number.isFinite(hash?.line)) line = hash.line + 1;
|
|
71
|
+
else {
|
|
72
|
+
const m = /\bline[:\s]+(\d+)/i.exec(raw);
|
|
73
|
+
if (m) line = Number(m[1]);
|
|
74
|
+
}
|
|
75
|
+
const lines = String(source ?? "").split("\n");
|
|
76
|
+
if (line != null) line = Math.max(1, Math.min(lines.length, line));
|
|
77
|
+
|
|
78
|
+
if (!firstStatement(source)) return { line: null, message: "There is no diagram here yet", detail: "Start with a type on the first line: flowchart LR, sequenceDiagram, gantt, pie…" };
|
|
79
|
+
if (/No diagram type detected|UnknownDiagramError/i.test(raw) || (!diagramKind(source) && !line)) {
|
|
80
|
+
const first = firstStatement(source);
|
|
81
|
+
return {
|
|
82
|
+
line: first.line,
|
|
83
|
+
message: "The first line should name the diagram type",
|
|
84
|
+
detail: `"${first.text.slice(0, 40)}" is not one Mermaid knows. Try flowchart LR, sequenceDiagram, classDiagram, stateDiagram-v2, erDiagram, gantt, pie, mindmap or timeline.`,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
const detail = raw
|
|
88
|
+
.split("\n")
|
|
89
|
+
.filter((l) => !/^\s*-*\^\s*$/.test(l) && !/^\.\.\./.test(l.trim()))
|
|
90
|
+
.filter((l) => !/^Parse error on line \d+:?$/i.test(l.trim()))
|
|
91
|
+
.join(" ")
|
|
92
|
+
.replace(/\s+/g, " ")
|
|
93
|
+
.replace(/^Error:\s*/, "")
|
|
94
|
+
.replace(/^Parsing failed:\s*/, "")
|
|
95
|
+
.replace(/ at offset: \d+, skipped \d+ characters?\./g, ".")
|
|
96
|
+
.trim();
|
|
97
|
+
return { line, message: line ? `Line ${line} has a mistake` : "Mermaid could not read this diagram", detail: detail || null };
|
|
98
|
+
}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# DocEditor
|
|
2
|
+
|
|
3
|
+
A Notion-style rich-text editor in the workspace theme. Type `/` for a
|
|
4
|
+
block (headings, lists, checklists, quotes, code, tables, images,
|
|
5
|
+
dividers), or use markdown shortcuts (`#`, `-`, `1.`, `[]`, `>`). Select
|
|
6
|
+
text for the formatting toolbar; hover a block for its drag handle. `@`
|
|
7
|
+
mentions a person, `{` inserts a merge field; both sit in the text as
|
|
8
|
+
chips. In `minimal` mode it is a comment box: no side menu, no `/` menu,
|
|
9
|
+
and Cmd/Ctrl+Enter submits.
|
|
10
|
+
|
|
11
|
+
It is [BlockNote](https://www.blocknotejs.org) (MPL-2.0) underneath, with
|
|
12
|
+
its colours, face and radius mapped onto the workspace's tokens. The
|
|
13
|
+
other text blocks — `doc-page`, `comment-box`, `record-notes`,
|
|
14
|
+
`email-composer`, `meeting-notes`, `brief-doc`, `knowledge-base` — are
|
|
15
|
+
built on this one: they import it, never `@blocknote/*`.
|
|
16
|
+
|
|
17
|
+
```jsx
|
|
18
|
+
import { DocEditor, docToMarkdown } from "../components/blocks/doc-editor"; // a Makersclaw app ("./blocks/doc-editor" from components/)
|
|
19
|
+
import { DocEditor, docToMarkdown } from "@/components/makersclaw/blocks/doc-editor"; // a shadcn project
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`DocEditor` is a client component: render it from a `"use client"`
|
|
23
|
+
component. The helpers (`docToMarkdown`, `docToText`, `docChecklist`…) are
|
|
24
|
+
plain functions and work on the server too.
|
|
25
|
+
|
|
26
|
+
`makersclaw add doc-editor` adds `@blocknote/core`, `@blocknote/react` and
|
|
27
|
+
`@blocknote/shadcn` (pinned, exact) to package.json: run `npm install`
|
|
28
|
+
after. It loads with the page (no `import()`): the editor is created
|
|
29
|
+
after the first render, and until then — on the server — the box shows
|
|
30
|
+
the doc's words as plain text.
|
|
31
|
+
|
|
32
|
+
## The data
|
|
33
|
+
|
|
34
|
+
The document is BlockNote's JSON: an array of blocks. Store it as it
|
|
35
|
+
comes out of `onChange` (a `jsonb` column).
|
|
36
|
+
|
|
37
|
+
```js
|
|
38
|
+
[
|
|
39
|
+
{ id: "…", type: "heading", props: { level: 2 }, content: [{ type: "text", text: "Launch", styles: {} }], children: [] },
|
|
40
|
+
{ id: "…", type: "paragraph", content: [
|
|
41
|
+
{ type: "text", text: "Hi ", styles: {} },
|
|
42
|
+
{ type: "field", props: { key: "first_name", label: "First name" } },
|
|
43
|
+
{ type: "text", text: ", ", styles: {} },
|
|
44
|
+
{ type: "mention", props: { id: "u-42", label: "Priya Raman" } },
|
|
45
|
+
{ type: "text", text: " will call.", styles: { bold: true } },
|
|
46
|
+
], children: [] },
|
|
47
|
+
{ id: "…", type: "checkListItem", props: { checked: false }, content: [{ type: "text", text: "Send the deck", styles: {} }], children: [] },
|
|
48
|
+
]
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
- Block types: `paragraph`, `heading` (`props.level` 1–3), `bulletListItem`,
|
|
52
|
+
`numberedListItem`, `checkListItem` (`props.checked`), `toggleListItem`,
|
|
53
|
+
`quote`, `codeBlock` (`props.language`), `table`, `image` (`props.url`,
|
|
54
|
+
`caption`), `divider`. Blocks nest through `children`.
|
|
55
|
+
- Inline content: `text` (`styles`: `bold`, `italic`, `underline`,
|
|
56
|
+
`strike`, `code`), `link` (`href`, `content`), and two of ours:
|
|
57
|
+
- `{ type: "mention", props: { id, label } }` — a person, drawn `@Label`.
|
|
58
|
+
- `{ type: "field", props: { key, label } }` — a merge field, drawn as a
|
|
59
|
+
chip with its label, written out as `{key}` or its value.
|
|
60
|
+
- When you write a doc by hand (a starter doc, a template), ids, `props`
|
|
61
|
+
and `children` may be left out and `content` may be a string:
|
|
62
|
+
`[{ type: "paragraph", content: "Hello" }]`. The editor gives blocks
|
|
63
|
+
ids on the first edit; give them ids yourself when something reads
|
|
64
|
+
them before that (`setChecklistItem` on a starter checklist).
|
|
65
|
+
|
|
66
|
+
## Props
|
|
67
|
+
|
|
68
|
+
- `value` — the doc, controlled. A new `value` that differs from what the
|
|
69
|
+
editor last sent through `onChange` replaces the document (loading
|
|
70
|
+
another record). Pass back exactly what `onChange` gave you and nothing
|
|
71
|
+
resets.
|
|
72
|
+
- `defaultValue` — the starting doc, uncontrolled. With neither, the doc
|
|
73
|
+
starts empty.
|
|
74
|
+
- `onChange(doc)` — every edit, with the whole doc. Debounce a save
|
|
75
|
+
yourself (doc-page does).
|
|
76
|
+
- `editable` — `true` (default). `false` shows the doc read-only: no
|
|
77
|
+
caret, no menus.
|
|
78
|
+
- `placeholder` — shown while the doc is empty (and on the server while
|
|
79
|
+
it is).
|
|
80
|
+
- `minimal` — `false` (default). `true` for a comment box: no side menu
|
|
81
|
+
(drag handles, +), no `/` menu, no emoji picker, smaller text, no
|
|
82
|
+
padding of its own. Mentions, fields and the formatting toolbar still
|
|
83
|
+
work.
|
|
84
|
+
- `compact` — `false` (default). `true` keeps the full editor (menus,
|
|
85
|
+
handles) in a short box: 4rem at least instead of 10rem. For a doc cut
|
|
86
|
+
into many small sections (brief-doc).
|
|
87
|
+
- `autoFocus` — put the caret in it when it mounts.
|
|
88
|
+
- `onSubmit(doc)` — called on Cmd/Ctrl+Enter (and not passed to the
|
|
89
|
+
editor). Post a comment, send a reply. Clear the box yourself through
|
|
90
|
+
the handle (below).
|
|
91
|
+
- `onKeyDown(event)` — every other key, before the editor sees it
|
|
92
|
+
(`event.preventDefault()` stops it).
|
|
93
|
+
- `mentions` — `async (query) => [{ id, label, description? }]`: turns on
|
|
94
|
+
`@`. Called as the person types after `@` (`query` is the text after
|
|
95
|
+
it, `""` at first); return at most 20. A throw shows nothing. The chosen
|
|
96
|
+
person goes in as a mention chip.
|
|
97
|
+
- `fields` — `[{ key, label }]`: turns on merge fields. `{` opens a menu of
|
|
98
|
+
them, filtered as you type; the `/` menu lists them under "Fields".
|
|
99
|
+
Each goes in as a field chip showing its label.
|
|
100
|
+
- `slashItems` — more entries for the `/` menu: `[{ title, onSelect(handle),
|
|
101
|
+
subtext?, aliases?, group?, icon? }]`. `onSelect` gets the handle
|
|
102
|
+
(below); `group` puts it under a heading ("Other" when left out);
|
|
103
|
+
`icon` is a kit icon name. BlockNote's own entries come first.
|
|
104
|
+
- `uploadFile` — `async (file) => url`: lets an image block upload a
|
|
105
|
+
file (without it, an image is added by URL).
|
|
106
|
+
- `editorRef` — a ref (`useDocEditor()`) that receives the handle.
|
|
107
|
+
- `label` — the accessible name of the editing area ("Meeting notes").
|
|
108
|
+
- `className` — layout around it (width, margin, min-height). Never colour.
|
|
109
|
+
|
|
110
|
+
The handle (`editorRef.current`, and what a slash item's `onSelect` gets):
|
|
111
|
+
|
|
112
|
+
- `focus()` · `clear()` · `isEmpty()` · `getDoc()` · `setDoc(doc)`
|
|
113
|
+
- `insertText(text)` · `insertField(key, label?)` · `insertMention({ id, label })`
|
|
114
|
+
— at the caret.
|
|
115
|
+
- `editor` — the BlockNote editor itself, for anything else
|
|
116
|
+
(`editor.insertBlocks(…)`, `editor.getTextCursorPosition()`). Reaching
|
|
117
|
+
for it ties you to BlockNote's API; prefer the methods above.
|
|
118
|
+
|
|
119
|
+
The helpers (import them from the block; they take a doc and never throw
|
|
120
|
+
on a partial one):
|
|
121
|
+
|
|
122
|
+
- `emptyDoc()` — `[{ type: "paragraph", content: [] }]`.
|
|
123
|
+
- `isDocEmpty(doc)` — no text, chip or non-paragraph block. Use it to
|
|
124
|
+
disable Post.
|
|
125
|
+
- `docToText(doc, { fields? })` — plain text: one line per block (an empty
|
|
126
|
+
paragraph is an empty line), children indented, list markers kept
|
|
127
|
+
(`- `, `1. `, `[ ] `/`[x] `), a mention as `@Label`, a field as its value
|
|
128
|
+
or `{key}`. `fields` is `{ key: value }` or `(key, props) => value`; an
|
|
129
|
+
empty value leaves `{key}` in place.
|
|
130
|
+
- `docToMarkdown(doc, { fields? })` — GitHub markdown: headings, nested
|
|
131
|
+
lists, `- [ ]` checklists, quotes, fenced code, tables, images, dividers,
|
|
132
|
+
bold/italic/strike/code, links; mentions and fields as in `docToText`.
|
|
133
|
+
Lossy where markdown has no word: underline, colours, alignment.
|
|
134
|
+
- `docChecklist(doc)` — `[{ id, text, checked, depth, mentions: [{ id,
|
|
135
|
+
label }] }]`, every checklist item in order, nested ones too. Read an
|
|
136
|
+
owner off its mentions.
|
|
137
|
+
- `setChecklistItem(doc, id, checked)` — a new doc with that item ticked
|
|
138
|
+
or not (for a side list of action items).
|
|
139
|
+
- `docFields(doc)` — `[{ key, label, count }]`, the merge fields the doc
|
|
140
|
+
uses, in order of first use. Compare with a recipient's values to warn
|
|
141
|
+
of a missing one.
|
|
142
|
+
- `docMentions(doc)` — `[{ id, label, count }]`, the people it mentions.
|
|
143
|
+
|
|
144
|
+
## Example
|
|
145
|
+
|
|
146
|
+
```jsx
|
|
147
|
+
// components/DealNotes.jsx — client
|
|
148
|
+
"use client";
|
|
149
|
+
import { useState } from "react";
|
|
150
|
+
import { updateRow } from "../lib/actions";
|
|
151
|
+
import { DocEditor } from "./blocks/doc-editor";
|
|
152
|
+
|
|
153
|
+
export default function DealNotes({ deal, team }) {
|
|
154
|
+
const [doc, setDoc] = useState(deal.notes); // jsonb, may be null
|
|
155
|
+
return (
|
|
156
|
+
<DocEditor
|
|
157
|
+
value={doc}
|
|
158
|
+
onChange={(d) => {
|
|
159
|
+
setDoc(d);
|
|
160
|
+
updateRow({ source: "public.deals", id: deal.id, patch: { notes: d } }); // debounce this in a real app
|
|
161
|
+
}}
|
|
162
|
+
mentions={async (q) => team.filter((p) => p.name.toLowerCase().includes(q.toLowerCase())).map((p) => ({ id: p.id, label: p.name }))}
|
|
163
|
+
placeholder="Notes on this deal…"
|
|
164
|
+
label="Deal notes"
|
|
165
|
+
/>
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
A comment box that posts on Cmd/Ctrl+Enter and clears itself:
|
|
171
|
+
|
|
172
|
+
```jsx
|
|
173
|
+
const box = useDocEditor();
|
|
174
|
+
const post = async (doc) => {
|
|
175
|
+
if (isDocEmpty(doc)) return;
|
|
176
|
+
const res = await insertRow({ source: "public.comments", values: { body: doc, body_text: docToText(doc) } });
|
|
177
|
+
if (res.ok) box.current?.clear();
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
<DocEditor minimal editorRef={box} onSubmit={post} mentions={findPeople} placeholder="Write a comment…" />
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
An email body with merge fields, filled per recipient:
|
|
184
|
+
|
|
185
|
+
```jsx
|
|
186
|
+
const FIELDS = [{ key: "first_name", label: "First name" }, { key: "company", label: "Company" }];
|
|
187
|
+
|
|
188
|
+
<DocEditor value={body} onChange={setBody} fields={FIELDS} />
|
|
189
|
+
const text = docToText(body, { fields: contact }); // "Hi Ana, …"
|
|
190
|
+
const missing = docFields(body).filter((f) => !contact[f.key]); // warn before sending
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## What it will not do
|
|
194
|
+
|
|
195
|
+
- Collaborate live (several carets at once): that is BlockNote's Yjs
|
|
196
|
+
mode, not wired here. Saves are last-write-wins.
|
|
197
|
+
- Export to PDF or Word, multi-column layouts or AI writing: those are
|
|
198
|
+
BlockNote's `xl-` packages (GPL / commercial), which never come here.
|
|
199
|
+
- Colour text: the toolbar has no colour picker (the theme has no red or
|
|
200
|
+
purple to offer). Coloured text pasted in is shown in status and chart
|
|
201
|
+
tokens.
|
|
202
|
+
- Upload files, audio or video: an image by URL, or through your
|
|
203
|
+
`uploadFile`.
|
|
204
|
+
- Render on the server as rich text: the server shows the plain text
|
|
205
|
+
(`docToText`) until the editor mounts. For a read-only page that must
|
|
206
|
+
be rich in the HTML, render `docToMarkdown` yourself.
|
|
207
|
+
|
|
208
|
+
An editor it cannot be is your own component in `components/` — not an
|
|
209
|
+
edit to this block. Its files are fixed: `npm run check` refuses a change,
|
|
210
|
+
and `makersclaw add doc-editor` restores them.
|
|
211
|
+
|
|
212
|
+
## Credits
|
|
213
|
+
|
|
214
|
+
BlockNote (https://github.com/TypeCellOS/BlockNote), MPL-2.0 — installed
|
|
215
|
+
from npm as a dependency, not copied here. See THIRD-PARTY-NOTICES.md.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "doc-editor",
|
|
3
|
+
"title": "DocEditor",
|
|
4
|
+
"description": "A Notion-style rich-text editor (BlockNote) painted in the workspace theme: headings, lists, checklists, quotes, code, tables, images and dividers from a / menu or markdown shortcuts, a formatting toolbar, drag handles; @mentions and {merge fields} as inline chips; a minimal mode for comment boxes with Cmd/Ctrl+Enter to submit. The document is BlockNote JSON; helpers turn it into markdown or plain text and read its checklist, fields and mentions.",
|
|
5
|
+
"useWhen": "A screen edits rich text: a wiki or doc page, notes on a record, a brief, meeting notes, an email body with merge fields, a comment field with mentions. The other text blocks (doc-page, record-notes, comment-box…) are built on it. Not for one line of plain text (the kit's Input) or a form of fields (record-form).",
|
|
6
|
+
"tags": ["editor", "rich text", "document", "notion", "blocknote", "markdown", "notes", "wiki", "mention", "merge field", "slash", "comment", "checklist", "wysiwyg"],
|
|
7
|
+
"exports": ["DocEditor", "useDocEditor", "docToMarkdown", "docToText", "emptyDoc", "isDocEmpty", "docChecklist", "setChecklistItem", "docFields", "docMentions"],
|
|
8
|
+
"files": ["index.js", "doc-editor.jsx", "schema.jsx", "theme.js", "doc.js", "shadcn-classes.js"],
|
|
9
|
+
"requires": [],
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"@blocknote/core": "0.55.0",
|
|
12
|
+
"@blocknote/react": "0.55.0",
|
|
13
|
+
"@blocknote/shadcn": "0.55.0"
|
|
14
|
+
}
|
|
15
|
+
}
|