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,7 @@
|
|
|
1
|
+
// The Gantt block — `makersclaw add gantt` (it brings task-model). Tasks
|
|
2
|
+
// on a timeline: drag, resize, link, zoom, the critical path. Fixed:
|
|
3
|
+
// compose it through its props (README.md beside this file); a timeline
|
|
4
|
+
// it cannot be is your own component in components/, built from
|
|
5
|
+
// task-model's helpers and these schedule helpers.
|
|
6
|
+
export { Gantt } from "./gantt";
|
|
7
|
+
export { ZOOMS, ganttRange, headerTiers, planMove, afterBlockersPatch, isMilestone, summarySpan, arrowPath } from "./schedule";
|
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
import { Avatar, Button, Icon, Input, Menu, StatusDot, cx } from "../../ui";
|
|
5
|
+
import { GroupLabel, formatDate, useDraggableTask, useDropTarget } from "../task-model";
|
|
6
|
+
import { daysFromPixels, lengthOf } from "./schedule";
|
|
7
|
+
|
|
8
|
+
// The gantt's rows: the list pane's row (a task, a group heading, a
|
|
9
|
+
// quick-add) and the timeline's row (a bar, a milestone diamond, a
|
|
10
|
+
// summary bracket, or — for a task without dates — a ghost bar that
|
|
11
|
+
// schedules it where it is clicked). Geometry comes in from gantt.jsx;
|
|
12
|
+
// what a drag did goes back out through `on`.
|
|
13
|
+
|
|
14
|
+
export const ROW = 36;
|
|
15
|
+
export const ADD_ROW = 48;
|
|
16
|
+
const BAR_H = 24;
|
|
17
|
+
|
|
18
|
+
// Bar colours, written out whole so Tailwind finds every class: a
|
|
19
|
+
// project's hue (chart-1…5) or a status tone. `fill` is the progress.
|
|
20
|
+
export const TINTS = {
|
|
21
|
+
1: { bar: "bg-chart-1/25 border-chart-1/70", fill: "bg-chart-1/45", solid: "bg-chart-1" },
|
|
22
|
+
2: { bar: "bg-chart-2/25 border-chart-2/70", fill: "bg-chart-2/45", solid: "bg-chart-2" },
|
|
23
|
+
3: { bar: "bg-chart-3/25 border-chart-3/70", fill: "bg-chart-3/45", solid: "bg-chart-3" },
|
|
24
|
+
4: { bar: "bg-chart-4/25 border-chart-4/70", fill: "bg-chart-4/45", solid: "bg-chart-4" },
|
|
25
|
+
5: { bar: "bg-chart-5/25 border-chart-5/70", fill: "bg-chart-5/45", solid: "bg-chart-5" },
|
|
26
|
+
primary: { bar: "bg-primary/25 border-primary/70", fill: "bg-primary/45", solid: "bg-primary" },
|
|
27
|
+
info: { bar: "bg-info/25 border-info/70", fill: "bg-info/45", solid: "bg-info" },
|
|
28
|
+
success: { bar: "bg-success/25 border-success/70", fill: "bg-success/45", solid: "bg-success" },
|
|
29
|
+
warning: { bar: "bg-warning/25 border-warning/70", fill: "bg-warning/45", solid: "bg-warning" },
|
|
30
|
+
danger: { bar: "bg-destructive/25 border-destructive/70", fill: "bg-destructive/45", solid: "bg-destructive" },
|
|
31
|
+
neutral: { bar: "bg-muted-foreground/15 border-muted-foreground/55", fill: "bg-muted-foreground/30", solid: "bg-muted-foreground" },
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/** "Sep 22 – 26" · "Sep 29 – Oct 3" · "Sep 22" */
|
|
35
|
+
export function spanWords(span, locale) {
|
|
36
|
+
if (!span) return "No dates";
|
|
37
|
+
const a = formatDate(span.start, { month: "short", day: "numeric" }, { locale });
|
|
38
|
+
if (span.start === span.end) return a;
|
|
39
|
+
const sameMonth = span.start.slice(0, 7) === span.end.slice(0, 7);
|
|
40
|
+
const b = formatDate(span.end, sameMonth ? { day: "numeric" } : { month: "short", day: "numeric" }, { locale });
|
|
41
|
+
return `${a} – ${b}`;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// ---- the list pane -------------------------------------------------------
|
|
45
|
+
|
|
46
|
+
/** A group's heading in the list pane: fold, face, count. */
|
|
47
|
+
export function GroupRow({ group, by, ctx, folded, onFold, hot, onHot, count }) {
|
|
48
|
+
return (
|
|
49
|
+
<div
|
|
50
|
+
className={cx("flex items-center gap-1 border-t border-border bg-muted/40 pe-2 ps-1 first:border-t-0", hot && "bg-accent/60")}
|
|
51
|
+
style={{ height: ROW }}
|
|
52
|
+
onPointerEnter={onHot}
|
|
53
|
+
>
|
|
54
|
+
{/* raw: the heading folds its group; a kit Button would centre it
|
|
55
|
+
and weigh it as an action. */}
|
|
56
|
+
<button
|
|
57
|
+
type="button"
|
|
58
|
+
aria-expanded={!folded}
|
|
59
|
+
onClick={onFold}
|
|
60
|
+
className="flex h-8 min-w-0 flex-1 items-center gap-1.5 rounded-md px-1 text-left outline-none hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring"
|
|
61
|
+
>
|
|
62
|
+
<Icon name={folded ? "chevron-right" : "chevron-down"} size={14} className="shrink-0 text-muted-foreground" />
|
|
63
|
+
<GroupLabel group={group} by={by} ctx={ctx} className="min-w-0" />
|
|
64
|
+
<span data-nums className="shrink-0 text-xs font-normal tabular-nums text-muted-foreground">
|
|
65
|
+
{count}
|
|
66
|
+
</span>
|
|
67
|
+
</button>
|
|
68
|
+
</div>
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** A task's row in the list pane: fold (a parent), status, title, the
|
|
73
|
+
* first face and its length; a menu on hover. */
|
|
74
|
+
export function ListRow({ row, ctx, hot, onHot, onFold, onOpen, menu, conflict, blockers }) {
|
|
75
|
+
const t = row.task;
|
|
76
|
+
const status = ctx.statusById.get(String(t.status));
|
|
77
|
+
const person = t.assignees?.[0] ? ctx.personById.get(t.assignees[0]) : null;
|
|
78
|
+
const len = lengthOf(row.span);
|
|
79
|
+
const title = t.title || "Untitled";
|
|
80
|
+
return (
|
|
81
|
+
<div
|
|
82
|
+
className={cx("group/row flex items-center gap-1.5 pe-1", hot && "bg-accent/60")}
|
|
83
|
+
style={{ height: ROW, paddingInlineStart: 4 + row.depth * 16 }}
|
|
84
|
+
onPointerEnter={onHot}
|
|
85
|
+
>
|
|
86
|
+
{row.hasChildren ? (
|
|
87
|
+
// raw: a 24px fold inside a 36px row; the kit's IconButton is a
|
|
88
|
+
// 36/44px target that would push the title out of line.
|
|
89
|
+
<button
|
|
90
|
+
type="button"
|
|
91
|
+
aria-expanded={!row.collapsed}
|
|
92
|
+
aria-label={`${row.collapsed ? "Show" : "Hide"} the subtasks of ${title}`}
|
|
93
|
+
onClick={onFold}
|
|
94
|
+
className="inline-flex size-6 shrink-0 items-center justify-center rounded-sm text-muted-foreground outline-none hover:bg-accent hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring"
|
|
95
|
+
>
|
|
96
|
+
<Icon name={row.collapsed ? "chevron-right" : "chevron-down"} size={14} />
|
|
97
|
+
</button>
|
|
98
|
+
) : (
|
|
99
|
+
<span aria-hidden="true" className="size-6 shrink-0" />
|
|
100
|
+
)}
|
|
101
|
+
{row.milestone ? (
|
|
102
|
+
<Icon name="diamond" size={12} className="shrink-0 text-muted-foreground" />
|
|
103
|
+
) : (
|
|
104
|
+
<StatusDot tone={status ? status.tone ?? (status.hue ? undefined : "neutral") : "neutral"} hue={status?.hue} size="sm" />
|
|
105
|
+
)}
|
|
106
|
+
{onOpen ? (
|
|
107
|
+
// raw: a title that opens the task; a kit Button would centre and
|
|
108
|
+
// pad it as an action.
|
|
109
|
+
<button
|
|
110
|
+
type="button"
|
|
111
|
+
title={title}
|
|
112
|
+
onClick={() => onOpen(t)}
|
|
113
|
+
className={cx(
|
|
114
|
+
"min-w-0 flex-1 truncate rounded-sm text-left text-sm outline-none hover:underline focus-visible:ring-2 focus-visible:ring-ring",
|
|
115
|
+
row.done && "text-muted-foreground line-through",
|
|
116
|
+
row.hasChildren && "font-medium",
|
|
117
|
+
)}
|
|
118
|
+
>
|
|
119
|
+
{title}
|
|
120
|
+
</button>
|
|
121
|
+
) : (
|
|
122
|
+
<span title={title} className={cx("min-w-0 flex-1 truncate text-sm", row.done && "text-muted-foreground line-through", row.hasChildren && "font-medium")}>
|
|
123
|
+
{title}
|
|
124
|
+
</span>
|
|
125
|
+
)}
|
|
126
|
+
{conflict ? (
|
|
127
|
+
<span className="shrink-0 text-destructive" title={`Starts before ${blockers} ends`}>
|
|
128
|
+
<Icon name="warning" size={14} />
|
|
129
|
+
<span className="sr-only">Starts before {blockers} ends</span>
|
|
130
|
+
</span>
|
|
131
|
+
) : null}
|
|
132
|
+
{person ? <Avatar name={person.name} src={person.src} size="xs" className="hidden shrink-0 sm:inline-flex" /> : null}
|
|
133
|
+
<span data-nums className="hidden w-8 shrink-0 text-end text-xs tabular-nums text-muted-foreground sm:inline">
|
|
134
|
+
{len ? `${len}d` : "–"}
|
|
135
|
+
<span className="sr-only">{len ? (len === 1 ? " day" : " days") : "no dates"}</span>
|
|
136
|
+
</span>
|
|
137
|
+
{menu?.length ? (
|
|
138
|
+
<Menu
|
|
139
|
+
label={`More for ${title}`}
|
|
140
|
+
items={menu}
|
|
141
|
+
className="shrink-0 opacity-0 transition-opacity duration-150 focus-visible:opacity-100 group-hover/row:opacity-100 group-focus-within/row:opacity-100 aria-expanded:opacity-100 [@media(hover:none)]:opacity-100"
|
|
142
|
+
/>
|
|
143
|
+
) : null}
|
|
144
|
+
</div>
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** The last row of a group: "Add task", then a field — Enter adds and
|
|
149
|
+
* stays open for the next one, Escape closes. */
|
|
150
|
+
export function QuickAdd({ group, open, onOpen, onClose, onCreate, addLabel, uid }) {
|
|
151
|
+
const [draft, setDraft] = useState("");
|
|
152
|
+
const [busy, setBusy] = useState(false);
|
|
153
|
+
const id = `${uid}-add-${group.key}`;
|
|
154
|
+
async function submit() {
|
|
155
|
+
const title = draft.trim();
|
|
156
|
+
if (!title || busy) return;
|
|
157
|
+
setBusy(true);
|
|
158
|
+
const r = await onCreate(title, group.key);
|
|
159
|
+
setBusy(false);
|
|
160
|
+
if (r?.ok !== false) setDraft("");
|
|
161
|
+
}
|
|
162
|
+
return (
|
|
163
|
+
<div className="flex items-center px-1.5" style={{ height: ADD_ROW }}>
|
|
164
|
+
{open ? (
|
|
165
|
+
<>
|
|
166
|
+
<label htmlFor={id} className="sr-only">
|
|
167
|
+
New task in {group.label}
|
|
168
|
+
</label>
|
|
169
|
+
<Input
|
|
170
|
+
id={id}
|
|
171
|
+
autoFocus
|
|
172
|
+
value={draft}
|
|
173
|
+
disabled={busy}
|
|
174
|
+
placeholder="Task name, then Enter"
|
|
175
|
+
onChange={(e) => setDraft(e.target.value)}
|
|
176
|
+
onKeyDown={(e) => {
|
|
177
|
+
if (e.key === "Enter" && !e.nativeEvent.isComposing) {
|
|
178
|
+
e.preventDefault();
|
|
179
|
+
submit();
|
|
180
|
+
} else if (e.key === "Escape") {
|
|
181
|
+
setDraft("");
|
|
182
|
+
onClose();
|
|
183
|
+
}
|
|
184
|
+
}}
|
|
185
|
+
onBlur={() => {
|
|
186
|
+
if (!draft.trim()) onClose();
|
|
187
|
+
}}
|
|
188
|
+
/>
|
|
189
|
+
</>
|
|
190
|
+
) : (
|
|
191
|
+
<Button variant="quiet" size="sm" icon="plus" align="start" onClick={onOpen} className="text-muted-foreground">
|
|
192
|
+
{addLabel}
|
|
193
|
+
</Button>
|
|
194
|
+
)}
|
|
195
|
+
</div>
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// ---- the timeline --------------------------------------------------------
|
|
200
|
+
|
|
201
|
+
/** A task's row on the timeline: the drop target a link lands on, and
|
|
202
|
+
* whatever the task draws. */
|
|
203
|
+
export function TimelineRow({ row, hot, onHot, linking, children }) {
|
|
204
|
+
const drop = useDropTarget(`drop:${row.key}`, { task: row.task, label: row.task.title || "Untitled" }, { disabled: !linking });
|
|
205
|
+
const over = drop.isOver && drop.active?.data?.kind === "link" && drop.active.data.task.id !== row.task.id;
|
|
206
|
+
return (
|
|
207
|
+
<div ref={drop.setNodeRef} className={cx("relative", hot && "bg-accent/40", over && "z-[6]")} style={{ height: ROW }} onPointerEnter={onHot} data-over={over || undefined}>
|
|
208
|
+
{typeof children === "function" ? children(over) : children}
|
|
209
|
+
</div>
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/** A task's bar: drag the body to move it, an edge to change its start or
|
|
214
|
+
* end, the dot past its end onto another bar to make that one wait on
|
|
215
|
+
* it. Arrow keys move it a day; Shift changes its end, Alt its start.
|
|
216
|
+
* A parent's bar is a summary bracket (moves with its subtasks); a
|
|
217
|
+
* milestone is a diamond on its day. */
|
|
218
|
+
export function Bar({
|
|
219
|
+
row,
|
|
220
|
+
x,
|
|
221
|
+
w,
|
|
222
|
+
dayWidth,
|
|
223
|
+
tint,
|
|
224
|
+
shape = "bar",
|
|
225
|
+
editable,
|
|
226
|
+
onOpen,
|
|
227
|
+
onPreview,
|
|
228
|
+
onNudge,
|
|
229
|
+
clickGuard,
|
|
230
|
+
dim,
|
|
231
|
+
critical,
|
|
232
|
+
over,
|
|
233
|
+
moving,
|
|
234
|
+
hintId,
|
|
235
|
+
locale,
|
|
236
|
+
}) {
|
|
237
|
+
const t = row.task;
|
|
238
|
+
const title = t.title || "Untitled";
|
|
239
|
+
const bar = shape === "bar";
|
|
240
|
+
const move = useDraggableTask(`bar:${row.key}`, { task: t, kind: "move", label: title }, { disabled: !editable });
|
|
241
|
+
const start = useDraggableTask(`start:${row.key}`, { task: t, kind: "start", label: `the start of ${title}` }, { disabled: !editable || !bar });
|
|
242
|
+
const end = useDraggableTask(`end:${row.key}`, { task: t, kind: "end", label: `the end of ${title}` }, { disabled: !editable || !bar });
|
|
243
|
+
const link = useDraggableTask(`link:${row.key}`, { task: t, kind: "link", label: `a link from ${title}` }, { disabled: !editable });
|
|
244
|
+
|
|
245
|
+
const active = move.isDragging ? ["move", move] : start.isDragging ? ["start", start] : end.isDragging ? ["end", end] : null;
|
|
246
|
+
const days = active ? daysFromPixels(active[1].transform?.x, dayWidth) : 0;
|
|
247
|
+
const kind = active?.[0];
|
|
248
|
+
useEffect(() => {
|
|
249
|
+
if (kind) onPreview?.(t.id, kind, days);
|
|
250
|
+
}, [kind, days, t.id, onPreview]);
|
|
251
|
+
|
|
252
|
+
const words = spanWords(row.span, locale);
|
|
253
|
+
const len = lengthOf(row.span);
|
|
254
|
+
const progress = typeof row.progress === "number" ? Math.max(0, Math.min(100, row.progress)) : null;
|
|
255
|
+
const label = `${title}${shape === "milestone" ? ", milestone" : ""}, ${words}${len > 1 ? `, ${len} days` : ""}${progress !== null && bar ? `, ${Math.round(progress)}% done` : ""}${row.done ? ", done" : ""}`;
|
|
256
|
+
const inside = bar && w >= 64;
|
|
257
|
+
const dragging = Boolean(kind) || moving;
|
|
258
|
+
|
|
259
|
+
function onKeyDown(e) {
|
|
260
|
+
if (!editable) {
|
|
261
|
+
if ((e.key === "Enter" || e.key === " ") && onOpen) {
|
|
262
|
+
e.preventDefault();
|
|
263
|
+
onOpen(t);
|
|
264
|
+
}
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
if (e.key === "ArrowLeft" || e.key === "ArrowRight") {
|
|
268
|
+
e.preventDefault();
|
|
269
|
+
const step = e.key === "ArrowRight" ? 1 : -1;
|
|
270
|
+
onNudge(t.id, bar && e.shiftKey ? "end" : bar && e.altKey ? "start" : "move", step);
|
|
271
|
+
} else if (e.key === "Enter" || e.key === " ") {
|
|
272
|
+
e.preventDefault();
|
|
273
|
+
if (moving) onNudge(t.id, null, 0, "flush");
|
|
274
|
+
else onOpen?.(t);
|
|
275
|
+
} else if (e.key === "Escape" && moving) {
|
|
276
|
+
e.preventDefault();
|
|
277
|
+
onNudge(t.id, null, 0, "cancel");
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
const body = cx(
|
|
282
|
+
"absolute outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-card",
|
|
283
|
+
editable ? "cursor-grab touch-manipulation active:cursor-grabbing" : onOpen ? "cursor-pointer" : "cursor-default",
|
|
284
|
+
over && "ring-2 ring-primary ring-offset-1 ring-offset-card",
|
|
285
|
+
critical && !over && "ring-2 ring-primary/70",
|
|
286
|
+
);
|
|
287
|
+
const handle = editable ? { ...move.handle } : {};
|
|
288
|
+
// Our keys, not dnd-kit's keyboard drag: a bar moves by whole days.
|
|
289
|
+
const common = {
|
|
290
|
+
...handle,
|
|
291
|
+
ref: move.setNodeRef,
|
|
292
|
+
role: onOpen || editable ? "button" : "img",
|
|
293
|
+
tabIndex: onOpen || editable ? 0 : undefined,
|
|
294
|
+
"aria-roledescription": editable ? "timeline bar" : undefined,
|
|
295
|
+
"aria-describedby": editable ? hintId : undefined,
|
|
296
|
+
"aria-label": label,
|
|
297
|
+
onKeyDown,
|
|
298
|
+
onClick: () => {
|
|
299
|
+
if (clickGuard?.()) return;
|
|
300
|
+
onOpen?.(t);
|
|
301
|
+
},
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
return (
|
|
305
|
+
<div
|
|
306
|
+
className={cx(
|
|
307
|
+
"group/bar absolute",
|
|
308
|
+
!dragging && "motion-safe:transition-[left,width,opacity] motion-safe:duration-150",
|
|
309
|
+
dim && !dragging && "opacity-40",
|
|
310
|
+
dragging && "z-20",
|
|
311
|
+
)}
|
|
312
|
+
style={{ left: x, width: w, top: shape === "bar" ? (ROW - BAR_H) / 2 : 0, height: shape === "bar" ? BAR_H : ROW }}
|
|
313
|
+
>
|
|
314
|
+
{shape === "milestone" ? (
|
|
315
|
+
// raw: a draggable diamond on the timeline; no kit part is a
|
|
316
|
+
// shape that moves.
|
|
317
|
+
<div {...common} className={cx(body, "left-1/2 top-1/2 size-3.5 -translate-x-1/2 -translate-y-1/2 rotate-45 rounded-[3px] shadow-sm", row.done ? "bg-success" : tint.solid)} />
|
|
318
|
+
) : shape === "summary" ? (
|
|
319
|
+
// raw: the summary bracket over a parent's subtasks; it drags the
|
|
320
|
+
// whole family.
|
|
321
|
+
<div {...common} className={cx(body, "inset-x-0 top-1/2 h-3 -translate-y-1/2 rounded-sm")}>
|
|
322
|
+
<span aria-hidden="true" className="absolute inset-x-0 top-0 h-1.5 rounded-sm bg-foreground/70" />
|
|
323
|
+
<span aria-hidden="true" className="absolute start-0 top-0 h-3 w-1.5 rounded-b-sm bg-foreground/70" />
|
|
324
|
+
<span aria-hidden="true" className="absolute end-0 top-0 h-3 w-1.5 rounded-b-sm bg-foreground/70" />
|
|
325
|
+
</div>
|
|
326
|
+
) : (
|
|
327
|
+
// raw: the bar is a draggable, resizable shape; a kit Button would
|
|
328
|
+
// centre and pad it as an action.
|
|
329
|
+
<div
|
|
330
|
+
{...common}
|
|
331
|
+
className={cx(
|
|
332
|
+
body,
|
|
333
|
+
"inset-0 overflow-hidden rounded-md border text-xs text-foreground shadow-xs",
|
|
334
|
+
tint.bar,
|
|
335
|
+
row.done && "opacity-70",
|
|
336
|
+
dragging && "shadow-md",
|
|
337
|
+
)}
|
|
338
|
+
>
|
|
339
|
+
{progress ? <span aria-hidden="true" className={cx("absolute inset-y-0 start-0", tint.fill)} style={{ width: `${progress}%` }} /> : null}
|
|
340
|
+
{inside ? (
|
|
341
|
+
<span className="relative flex h-full items-center gap-1 px-2">
|
|
342
|
+
{row.done ? <Icon name="check" size={12} className="shrink-0 text-success" /> : null}
|
|
343
|
+
<span className={cx("truncate font-medium", row.done && "line-through decoration-muted-foreground")}>{title}</span>
|
|
344
|
+
</span>
|
|
345
|
+
) : null}
|
|
346
|
+
</div>
|
|
347
|
+
)}
|
|
348
|
+
|
|
349
|
+
{editable && bar ? (
|
|
350
|
+
<>
|
|
351
|
+
{/* raw: pointer-only edge grips (the keyboard uses Shift/Alt +
|
|
352
|
+
arrows); dnd-kit's listeners go on the element that drags. */}
|
|
353
|
+
<span
|
|
354
|
+
ref={start.setNodeRef}
|
|
355
|
+
{...start.handle}
|
|
356
|
+
role={undefined}
|
|
357
|
+
tabIndex={-1}
|
|
358
|
+
aria-hidden="true"
|
|
359
|
+
className="absolute inset-y-0 -start-1 z-10 flex w-3 cursor-ew-resize touch-none items-center justify-center opacity-0 transition-opacity duration-150 group-hover/bar:opacity-100 [@media(hover:none)]:hidden"
|
|
360
|
+
>
|
|
361
|
+
<span className="h-3 w-1 rounded-full bg-foreground/50" />
|
|
362
|
+
</span>
|
|
363
|
+
<span
|
|
364
|
+
ref={end.setNodeRef}
|
|
365
|
+
{...end.handle}
|
|
366
|
+
role={undefined}
|
|
367
|
+
tabIndex={-1}
|
|
368
|
+
aria-hidden="true"
|
|
369
|
+
className="absolute inset-y-0 -end-1 z-10 flex w-3 cursor-ew-resize touch-none items-center justify-center opacity-0 transition-opacity duration-150 group-hover/bar:opacity-100 [@media(hover:none)]:hidden"
|
|
370
|
+
>
|
|
371
|
+
<span className="h-3 w-1 rounded-full bg-foreground/50" />
|
|
372
|
+
</span>
|
|
373
|
+
</>
|
|
374
|
+
) : null}
|
|
375
|
+
{editable ? (
|
|
376
|
+
<LinkDot link={link} title={title} />
|
|
377
|
+
) : null}
|
|
378
|
+
|
|
379
|
+
{/* The words beside the bar: its title when it does not fit inside,
|
|
380
|
+
its dates on hover, focus and while it moves. */}
|
|
381
|
+
<span
|
|
382
|
+
className={cx(
|
|
383
|
+
"pointer-events-none absolute top-1/2 flex -translate-y-1/2 items-center gap-2 whitespace-nowrap ps-2 text-xs",
|
|
384
|
+
editable ? "start-[calc(100%+14px)]" : "start-full",
|
|
385
|
+
)}
|
|
386
|
+
>
|
|
387
|
+
{!inside ? <span className={cx("font-medium text-foreground", row.done && "text-muted-foreground line-through")}>{title}</span> : null}
|
|
388
|
+
<span
|
|
389
|
+
data-nums
|
|
390
|
+
className={cx(
|
|
391
|
+
"tabular-nums text-muted-foreground transition-opacity duration-150",
|
|
392
|
+
dragging ? "opacity-100" : "opacity-0 group-hover/bar:opacity-100 group-focus-within/bar:opacity-100",
|
|
393
|
+
)}
|
|
394
|
+
>
|
|
395
|
+
{words}
|
|
396
|
+
{len > 1 ? ` · ${len}d` : ""}
|
|
397
|
+
</span>
|
|
398
|
+
</span>
|
|
399
|
+
</div>
|
|
400
|
+
);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// The dot past a bar's end: drag it onto another bar to link them. While
|
|
404
|
+
// it is dragged, a dashed line follows the pointer.
|
|
405
|
+
function LinkDot({ link, title }) {
|
|
406
|
+
const tx = link.transform?.x ?? 0;
|
|
407
|
+
const ty = link.transform?.y ?? 0;
|
|
408
|
+
return (
|
|
409
|
+
<>
|
|
410
|
+
{/* raw: a pointer-only link grip (the keyboard links from the row's
|
|
411
|
+
menu, "Waits on"). */}
|
|
412
|
+
<span
|
|
413
|
+
ref={link.setNodeRef}
|
|
414
|
+
{...link.handle}
|
|
415
|
+
role={undefined}
|
|
416
|
+
tabIndex={-1}
|
|
417
|
+
aria-hidden="true"
|
|
418
|
+
title={`Drag onto another task to make it wait on ${title}`}
|
|
419
|
+
className={cx(
|
|
420
|
+
"absolute -end-3.5 top-1/2 z-10 flex size-4 -translate-y-1/2 cursor-crosshair touch-none items-center justify-center",
|
|
421
|
+
link.isDragging ? "opacity-100" : "opacity-0 transition-opacity duration-150 group-hover/bar:opacity-100 [@media(hover:none)]:hidden",
|
|
422
|
+
)}
|
|
423
|
+
>
|
|
424
|
+
<span className="size-2.5 rounded-full border-2 border-primary bg-card" />
|
|
425
|
+
</span>
|
|
426
|
+
{link.isDragging ? (
|
|
427
|
+
// raw: an SVG drawing — the link being drawn; no kit part draws one.
|
|
428
|
+
<svg aria-hidden="true" className="pointer-events-none absolute -end-1.5 top-1/2 z-20 overflow-visible" width="1" height="1">
|
|
429
|
+
<path d={`M0 0 L${tx} ${ty}`} className="stroke-primary" strokeWidth={1.5} strokeDasharray="4 3" fill="none" />
|
|
430
|
+
<circle cx={tx} cy={ty} r={3.5} className="fill-primary" />
|
|
431
|
+
</svg>
|
|
432
|
+
) : null}
|
|
433
|
+
</>
|
|
434
|
+
);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
/** A task with no dates: a ghost bar follows the pointer; a click (or a
|
|
438
|
+
* tap) schedules it there. */
|
|
439
|
+
export function Unscheduled({ row, dayWidth, length, onSchedule }) {
|
|
440
|
+
const [day, setDay] = useState(null);
|
|
441
|
+
const dayAt = (e) => {
|
|
442
|
+
const r = e.currentTarget.getBoundingClientRect();
|
|
443
|
+
return Math.max(0, Math.floor((e.clientX - r.left) / dayWidth));
|
|
444
|
+
};
|
|
445
|
+
const w = Math.max(length * dayWidth, 24);
|
|
446
|
+
return (
|
|
447
|
+
// raw: a whole timeline row is the place to click; a kit Button would
|
|
448
|
+
// be one small target in a row a person points anywhere along.
|
|
449
|
+
<button
|
|
450
|
+
type="button"
|
|
451
|
+
aria-label={`Schedule ${row.task.title || "Untitled"}: pick a day`}
|
|
452
|
+
tabIndex={-1}
|
|
453
|
+
className="absolute inset-0 cursor-copy outline-none"
|
|
454
|
+
onPointerMove={(e) => setDay(dayAt(e))}
|
|
455
|
+
onPointerLeave={() => setDay(null)}
|
|
456
|
+
onClick={(e) => onSchedule(row.task, dayAt(e))}
|
|
457
|
+
>
|
|
458
|
+
{day !== null ? (
|
|
459
|
+
<span
|
|
460
|
+
className="pointer-events-none absolute flex items-center overflow-hidden whitespace-nowrap rounded-md border border-dashed border-primary/60 bg-primary/5 px-2 text-xs text-muted-foreground"
|
|
461
|
+
style={{ left: day * dayWidth, width: w, top: (ROW - BAR_H) / 2, height: BAR_H }}
|
|
462
|
+
>
|
|
463
|
+
{w >= 96 ? "Click to schedule" : ""}
|
|
464
|
+
</span>
|
|
465
|
+
) : null}
|
|
466
|
+
</button>
|
|
467
|
+
);
|
|
468
|
+
}
|