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,338 @@
|
|
|
1
|
+
import { cx } from "./cx";
|
|
2
|
+
import { Icon } from "./icon";
|
|
3
|
+
|
|
4
|
+
// Steps — where a job with named stages has got to: a CI run's stages, a
|
|
5
|
+
// rollout's phases (5% → 25% → 100%), an onboarding checklist. Server-safe
|
|
6
|
+
// (no hooks). An ordered list: every step is an <li>, the current one has
|
|
7
|
+
// aria-current="step", and a reader hears each step's state in words —
|
|
8
|
+
// the dot or segment says nothing on its own. Status sets every tone;
|
|
9
|
+
// nothing takes a colour.
|
|
10
|
+
//
|
|
11
|
+
// steps [{ key, label, description?, status?, meta? }] — status
|
|
12
|
+
// complete · current · pending · failed · skipped. Plain
|
|
13
|
+
// strings are labels. A step without a status takes it
|
|
14
|
+
// from `current`
|
|
15
|
+
// current the index of the current step, for the simple case:
|
|
16
|
+
// before it complete, after it pending
|
|
17
|
+
// variant dots (markers joined by a line, the line filled up to
|
|
18
|
+
// where the job has got) · bar (one segment per phase, like
|
|
19
|
+
// Progress cut into pieces)
|
|
20
|
+
// size dots only: md (24px markers with a check, a cross, a
|
|
21
|
+
// number) · sm (small plain dots, a dense card header)
|
|
22
|
+
// hideStepLabels bare markers: every step's label, description and meta
|
|
23
|
+
// go to readers only ("Build, complete"), none on screen.
|
|
24
|
+
// Pass the labels anyway — a step without one is only
|
|
25
|
+
// "Step 1" to a reader. With onSelect each marker is the
|
|
26
|
+
// button
|
|
27
|
+
// orientation horizontal · vertical
|
|
28
|
+
// pulse the current step breathes; still under prefers-reduced-motion
|
|
29
|
+
// label the list's name, shown above it (as Progress does) and read
|
|
30
|
+
// to a screen reader; `hideLabel` keeps it for readers only
|
|
31
|
+
// valueText the right side of that header: "25% traffic", "3/5 stages"
|
|
32
|
+
// onSelect (step, index) → makes every step a button (open its logs,
|
|
33
|
+
// jump to it). Without it the list takes no clicks
|
|
34
|
+
//
|
|
35
|
+
// On a phone: a horizontal list whose steps carry a description or meta
|
|
36
|
+
// turns vertical below sm (640px) — those words need a line of their own.
|
|
37
|
+
// Bare dots, bare segments and short labels ("5%", "Build") stay in one
|
|
38
|
+
// row at every width: the spacing compresses, labels truncate, it never
|
|
39
|
+
// wraps and never scrolls.
|
|
40
|
+
//
|
|
41
|
+
// The rule: status is the only thing that colours a step — complete is
|
|
42
|
+
// success, current is primary, failed is danger, pending and skipped are
|
|
43
|
+
// muted. Never use Steps for choices (that is Tabs or RadioGroup).
|
|
44
|
+
|
|
45
|
+
const STATUS = {
|
|
46
|
+
complete: { word: "complete", icon: "check" },
|
|
47
|
+
current: { word: "current", icon: null },
|
|
48
|
+
pending: { word: "not started", icon: null },
|
|
49
|
+
failed: { word: "failed", icon: "x" },
|
|
50
|
+
skipped: { word: "skipped", icon: "minus" },
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// Markers for the dots variant.
|
|
54
|
+
const MARKER_MD = {
|
|
55
|
+
complete: "bg-success text-card",
|
|
56
|
+
current: "border-2 border-primary bg-card text-primary",
|
|
57
|
+
pending: "border border-border bg-card text-muted-foreground",
|
|
58
|
+
failed: "bg-destructive text-destructive-foreground",
|
|
59
|
+
skipped: "border border-dashed border-muted-foreground/50 bg-card text-muted-foreground",
|
|
60
|
+
};
|
|
61
|
+
const MARKER_SM = {
|
|
62
|
+
complete: "size-2.5 bg-success",
|
|
63
|
+
current: "size-3 bg-primary",
|
|
64
|
+
pending: "size-2.5 bg-muted-foreground/35",
|
|
65
|
+
failed: "size-3 bg-destructive",
|
|
66
|
+
skipped: "size-2.5 border border-muted-foreground/60",
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
// Segments for the bar variant.
|
|
70
|
+
const SEGMENT = {
|
|
71
|
+
complete: "bg-success",
|
|
72
|
+
current: "bg-primary",
|
|
73
|
+
pending: "bg-accent",
|
|
74
|
+
failed: "bg-destructive",
|
|
75
|
+
skipped: "bg-muted-foreground/25",
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
const LABEL_TONE = {
|
|
79
|
+
complete: "text-foreground",
|
|
80
|
+
current: "text-foreground",
|
|
81
|
+
pending: "text-muted-foreground",
|
|
82
|
+
failed: "text-destructive",
|
|
83
|
+
skipped: "text-muted-foreground line-through decoration-muted-foreground/50",
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
// Every layout as literal class names, so Tailwind sees each one:
|
|
87
|
+
// h (always a row), v (always a column), r (a column below sm, a row from sm).
|
|
88
|
+
// The DOM is the same in all three: li > [track: marker + line] [text].
|
|
89
|
+
const LAYOUT = {
|
|
90
|
+
dots: {
|
|
91
|
+
h: {
|
|
92
|
+
ol: "flex w-full items-start",
|
|
93
|
+
li: "relative flex min-w-0 flex-1 flex-col gap-2",
|
|
94
|
+
last: "flex-none",
|
|
95
|
+
track: "flex items-center",
|
|
96
|
+
line: "mx-2 h-0.5 min-w-2 flex-1 rounded-full",
|
|
97
|
+
text: "min-w-0 pr-3",
|
|
98
|
+
textLast: "min-w-0",
|
|
99
|
+
label: "block truncate text-sm font-medium",
|
|
100
|
+
rowMeta: "",
|
|
101
|
+
},
|
|
102
|
+
v: {
|
|
103
|
+
ol: "flex flex-col",
|
|
104
|
+
li: "relative flex min-w-0 gap-3",
|
|
105
|
+
last: "",
|
|
106
|
+
track: "flex flex-col items-center",
|
|
107
|
+
line: "my-1 min-h-3 w-0.5 flex-1 rounded-full",
|
|
108
|
+
text: "min-w-0 flex-1 pb-5",
|
|
109
|
+
textLast: "min-w-0 flex-1",
|
|
110
|
+
label: "min-w-0 text-sm font-medium",
|
|
111
|
+
rowMeta: "flex items-baseline justify-between gap-3",
|
|
112
|
+
},
|
|
113
|
+
r: {
|
|
114
|
+
ol: "flex flex-col sm:flex-row sm:items-start",
|
|
115
|
+
li: "relative flex min-w-0 gap-3 sm:flex-1 sm:flex-col sm:gap-2",
|
|
116
|
+
last: "sm:flex-none",
|
|
117
|
+
track: "flex flex-col items-center sm:flex-row",
|
|
118
|
+
line: "my-1 min-h-3 w-0.5 flex-1 rounded-full sm:mx-2 sm:my-0 sm:h-0.5 sm:min-h-0 sm:w-auto sm:min-w-2",
|
|
119
|
+
text: "min-w-0 flex-1 pb-5 sm:flex sm:flex-none sm:flex-col sm:pb-0 sm:pr-3",
|
|
120
|
+
textLast: "min-w-0 flex-1 sm:flex sm:flex-none sm:flex-col",
|
|
121
|
+
label: "min-w-0 text-sm font-medium sm:block sm:truncate",
|
|
122
|
+
rowMeta: "flex items-baseline justify-between gap-3 sm:contents",
|
|
123
|
+
meta: "sm:order-last sm:mt-0.5",
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
bar: {
|
|
127
|
+
h: {
|
|
128
|
+
ol: "flex w-full items-start gap-1",
|
|
129
|
+
li: "relative flex min-w-0 flex-1 flex-col gap-1.5",
|
|
130
|
+
last: "",
|
|
131
|
+
track: "h-2 w-full rounded-full",
|
|
132
|
+
text: "min-w-0 text-center",
|
|
133
|
+
textLast: "min-w-0 text-center",
|
|
134
|
+
label: "block truncate text-xs",
|
|
135
|
+
rowMeta: "",
|
|
136
|
+
},
|
|
137
|
+
v: {
|
|
138
|
+
ol: "flex flex-col gap-1",
|
|
139
|
+
li: "relative flex min-w-0 gap-3",
|
|
140
|
+
last: "",
|
|
141
|
+
track: "min-h-6 w-1.5 shrink-0 self-stretch rounded-full",
|
|
142
|
+
text: "min-w-0 flex-1 py-1",
|
|
143
|
+
textLast: "min-w-0 flex-1 py-1",
|
|
144
|
+
label: "min-w-0 text-sm",
|
|
145
|
+
rowMeta: "flex items-baseline justify-between gap-3",
|
|
146
|
+
},
|
|
147
|
+
r: {
|
|
148
|
+
ol: "flex flex-col gap-1 sm:flex-row sm:items-start",
|
|
149
|
+
li: "relative flex min-w-0 gap-3 sm:flex-1 sm:flex-col sm:gap-1.5",
|
|
150
|
+
last: "",
|
|
151
|
+
track: "min-h-6 w-1.5 shrink-0 self-stretch rounded-full sm:h-2 sm:min-h-0 sm:w-full",
|
|
152
|
+
text: "min-w-0 flex-1 py-1 sm:flex sm:flex-col sm:py-0 sm:text-center",
|
|
153
|
+
textLast: "min-w-0 flex-1 py-1 sm:flex sm:flex-col sm:py-0 sm:text-center",
|
|
154
|
+
label: "min-w-0 text-sm sm:block sm:truncate sm:text-xs",
|
|
155
|
+
rowMeta: "flex items-baseline justify-between gap-3 sm:contents",
|
|
156
|
+
meta: "sm:order-last sm:mt-0.5",
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
function normalize(steps, current) {
|
|
162
|
+
const cur = typeof current === "number" && Number.isFinite(current) ? current : -1;
|
|
163
|
+
return steps.map((raw, i) => {
|
|
164
|
+
const s = typeof raw === "string" ? { label: raw } : raw ?? {};
|
|
165
|
+
const derived = cur < 0 ? "pending" : i < cur ? "complete" : i === cur ? "current" : "pending";
|
|
166
|
+
const status = STATUS[s.status] ? s.status : derived;
|
|
167
|
+
return { ...s, key: s.key ?? `${i}`, status };
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function Marker({ step, index, size, pulse }) {
|
|
172
|
+
const st = step.status;
|
|
173
|
+
if (size === "sm") {
|
|
174
|
+
return (
|
|
175
|
+
<span aria-hidden="true" className="relative grid size-3 shrink-0 place-items-center">
|
|
176
|
+
{pulse && st === "current" ? (
|
|
177
|
+
<span className={cx("absolute inset-0 rounded-full opacity-50 animate-ping bg-primary motion-reduce:hidden")} />
|
|
178
|
+
) : null}
|
|
179
|
+
<span className={cx("relative rounded-full", MARKER_SM[st])} />
|
|
180
|
+
</span>
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
const glyph = STATUS[st].icon;
|
|
184
|
+
return (
|
|
185
|
+
<span aria-hidden="true" className="relative grid size-6 shrink-0 place-items-center">
|
|
186
|
+
{pulse && st === "current" ? (
|
|
187
|
+
<span className={cx("absolute inset-0 rounded-full opacity-30 animate-ping bg-primary motion-reduce:hidden")} />
|
|
188
|
+
) : null}
|
|
189
|
+
<span className={cx("relative grid size-6 place-items-center rounded-full", MARKER_MD[st])}>
|
|
190
|
+
{glyph ? (
|
|
191
|
+
<Icon name={glyph} size={14} className={st === "complete" || st === "failed" ? "[stroke-width:2.6]" : undefined} />
|
|
192
|
+
) : st === "current" ? (
|
|
193
|
+
<span className="size-2 rounded-full bg-primary" />
|
|
194
|
+
) : (
|
|
195
|
+
<span data-nums className="text-2xs font-medium">
|
|
196
|
+
{index + 1}
|
|
197
|
+
</span>
|
|
198
|
+
)}
|
|
199
|
+
</span>
|
|
200
|
+
</span>
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* The steps of one job and where it has got to. See the header above.
|
|
206
|
+
*/
|
|
207
|
+
export function Steps({
|
|
208
|
+
steps = [],
|
|
209
|
+
current,
|
|
210
|
+
variant = "dots",
|
|
211
|
+
size = "md",
|
|
212
|
+
orientation = "horizontal",
|
|
213
|
+
pulse = false,
|
|
214
|
+
label,
|
|
215
|
+
hideLabel = false,
|
|
216
|
+
hideStepLabels = false,
|
|
217
|
+
valueText,
|
|
218
|
+
onSelect,
|
|
219
|
+
className,
|
|
220
|
+
}) {
|
|
221
|
+
const list = normalize(steps, current);
|
|
222
|
+
if (!list.length) return null;
|
|
223
|
+
const kind = variant === "bar" ? "bar" : "dots";
|
|
224
|
+
const words = !hideStepLabels && list.some((s) => s.description || s.meta);
|
|
225
|
+
const mode = orientation === "vertical" ? "v" : words ? "r" : "h";
|
|
226
|
+
const L = LAYOUT[kind][mode];
|
|
227
|
+
// How far the job has got: the last step that is not pending. The line
|
|
228
|
+
// after every step before it is filled.
|
|
229
|
+
let reached = -1;
|
|
230
|
+
list.forEach((s, i) => {
|
|
231
|
+
if (s.status !== "pending") reached = i;
|
|
232
|
+
});
|
|
233
|
+
const n = list.length;
|
|
234
|
+
|
|
235
|
+
return (
|
|
236
|
+
<div className={cx("grid gap-2", className)}>
|
|
237
|
+
{label && !hideLabel ? (
|
|
238
|
+
<div aria-hidden="true" className="flex items-baseline justify-between gap-3 text-sm">
|
|
239
|
+
<span className="min-w-0 truncate text-muted-foreground">{label}</span>
|
|
240
|
+
{valueText ? (
|
|
241
|
+
<span data-nums className="shrink-0 font-medium text-foreground">
|
|
242
|
+
{valueText}
|
|
243
|
+
</span>
|
|
244
|
+
) : null}
|
|
245
|
+
</div>
|
|
246
|
+
) : null}
|
|
247
|
+
<ol aria-label={label ? (valueText ? `${label}, ${valueText}` : label) : undefined} className={L.ol}>
|
|
248
|
+
{list.map((step, i) => {
|
|
249
|
+
const last = i === n - 1;
|
|
250
|
+
const st = step.status;
|
|
251
|
+
const isCurrent = st === "current";
|
|
252
|
+
const labelTone = kind === "bar" && !isCurrent && st !== "failed" ? "text-muted-foreground" : LABEL_TONE[st];
|
|
253
|
+
const title = (
|
|
254
|
+
<>
|
|
255
|
+
{step.label ?? `Step ${i + 1}`}
|
|
256
|
+
{/* The state in words; aria-current already says "current step". */}
|
|
257
|
+
{isCurrent ? null : <span className="sr-only">, {STATUS[st].word}</span>}
|
|
258
|
+
</>
|
|
259
|
+
);
|
|
260
|
+
// Bare markers: the words a reader would otherwise have seen.
|
|
261
|
+
const hiddenTitle = (
|
|
262
|
+
<>
|
|
263
|
+
{title}
|
|
264
|
+
{step.description ? <>, {step.description}</> : null}
|
|
265
|
+
{step.meta ? <>, {step.meta}</> : null}
|
|
266
|
+
</>
|
|
267
|
+
);
|
|
268
|
+
return (
|
|
269
|
+
<li key={step.key} aria-current={isCurrent ? "step" : undefined} className={cx(L.li, last && L.last)}>
|
|
270
|
+
{kind === "dots" ? (
|
|
271
|
+
<div className={L.track}>
|
|
272
|
+
<Marker step={step} index={i} size={size} pulse={pulse} />
|
|
273
|
+
{last ? null : (
|
|
274
|
+
<span aria-hidden="true" className={cx(L.line, i < reached ? "bg-success" : "bg-border")} />
|
|
275
|
+
)}
|
|
276
|
+
</div>
|
|
277
|
+
) : (
|
|
278
|
+
<span
|
|
279
|
+
aria-hidden="true"
|
|
280
|
+
className={cx(
|
|
281
|
+
L.track,
|
|
282
|
+
SEGMENT[st],
|
|
283
|
+
"transition-colors duration-300 motion-reduce:transition-none",
|
|
284
|
+
pulse && isCurrent && "animate-pulse motion-reduce:animate-none",
|
|
285
|
+
)}
|
|
286
|
+
/>
|
|
287
|
+
)}
|
|
288
|
+
{hideStepLabels ? (
|
|
289
|
+
onSelect ? (
|
|
290
|
+
// raw: a button stretched over the whole step, named by its label.
|
|
291
|
+
<button
|
|
292
|
+
type="button"
|
|
293
|
+
onClick={() => onSelect(step, i)}
|
|
294
|
+
className="absolute inset-0 rounded-sm outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
295
|
+
>
|
|
296
|
+
<span className="sr-only">{hiddenTitle}</span>
|
|
297
|
+
</button>
|
|
298
|
+
) : (
|
|
299
|
+
<span className="sr-only">{hiddenTitle}</span>
|
|
300
|
+
)
|
|
301
|
+
) : step.label || step.description || step.meta ? (
|
|
302
|
+
<div className={last ? L.textLast : L.text}>
|
|
303
|
+
<div className={L.rowMeta}>
|
|
304
|
+
{onSelect ? (
|
|
305
|
+
// raw: a stretched button over the whole step, as Item does.
|
|
306
|
+
<button
|
|
307
|
+
type="button"
|
|
308
|
+
onClick={() => onSelect(step, i)}
|
|
309
|
+
className={cx(
|
|
310
|
+
L.label,
|
|
311
|
+
labelTone,
|
|
312
|
+
isCurrent && "font-semibold",
|
|
313
|
+
"rounded-sm text-left outline-none after:absolute after:inset-0 after:content-[''] hover:underline focus-visible:ring-2 focus-visible:ring-ring",
|
|
314
|
+
)}
|
|
315
|
+
>
|
|
316
|
+
{title}
|
|
317
|
+
</button>
|
|
318
|
+
) : (
|
|
319
|
+
<span className={cx(L.label, labelTone, kind === "bar" && isCurrent && "font-semibold")}>{title}</span>
|
|
320
|
+
)}
|
|
321
|
+
{step.meta ? (
|
|
322
|
+
<span data-nums className={cx("shrink-0 text-xs text-muted-foreground", L.meta)}>
|
|
323
|
+
{step.meta}
|
|
324
|
+
</span>
|
|
325
|
+
) : null}
|
|
326
|
+
</div>
|
|
327
|
+
{step.description ? <p className="mt-0.5 text-xs text-muted-foreground">{step.description}</p> : null}
|
|
328
|
+
</div>
|
|
329
|
+
) : (
|
|
330
|
+
<span className="sr-only">{title}</span>
|
|
331
|
+
)}
|
|
332
|
+
</li>
|
|
333
|
+
);
|
|
334
|
+
})}
|
|
335
|
+
</ol>
|
|
336
|
+
</div>
|
|
337
|
+
);
|
|
338
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { cx } from "./cx";
|
|
2
|
+
|
|
3
|
+
// A square of a colour that comes from DATA: a brand colour in an audit
|
|
4
|
+
// row, a label's colour a user picked, a product variant. Server-safe.
|
|
5
|
+
//
|
|
6
|
+
// The one place in the kit that sets an inline background from a prop.
|
|
7
|
+
// Every other colour in an app is a token; a colour that IS the record's
|
|
8
|
+
// value cannot be one, so this part owns the inline style and nothing
|
|
9
|
+
// else ever writes one (a block shows a data colour with a Swatch).
|
|
10
|
+
//
|
|
11
|
+
// color a CSS colour string from the data: "#0053fd", "rgb(…)",
|
|
12
|
+
// "oklch(…)", "rebeccapurple". An invalid one draws the
|
|
13
|
+
// empty square
|
|
14
|
+
// size sm (16px, inline in a row) · md (24px)
|
|
15
|
+
// label the accessible name: "Brand blue #0053FD". Without one the
|
|
16
|
+
// square is decoration and hidden from a screen reader —
|
|
17
|
+
// the text beside it must say the colour
|
|
18
|
+
//
|
|
19
|
+
// A hairline border keeps a colour close to the canvas (white on a light
|
|
20
|
+
// page, black on a dark one) visible.
|
|
21
|
+
const SIZES = { sm: "size-4 rounded-sm", md: "size-6 rounded-md" };
|
|
22
|
+
|
|
23
|
+
export function Swatch({ color, size = "md", label, className }) {
|
|
24
|
+
return (
|
|
25
|
+
<span
|
|
26
|
+
role={label ? "img" : undefined}
|
|
27
|
+
aria-label={label || undefined}
|
|
28
|
+
aria-hidden={label ? undefined : "true"}
|
|
29
|
+
className={cx("inline-block shrink-0 border border-border align-middle", SIZES[size] ?? SIZES.md, className)}
|
|
30
|
+
style={{ backgroundColor: typeof color === "string" ? color : undefined }}
|
|
31
|
+
/>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { cx } from "./cx";
|
|
2
|
+
import { Icon } from "./icon";
|
|
3
|
+
|
|
4
|
+
// Table parts — the native <table> with the workspace's look. Presentation
|
|
5
|
+
// only: the rows, the sort order and the selection are the caller's state;
|
|
6
|
+
// these draw them. Server-safe (no hooks). `Table` is a scroll box, so a
|
|
7
|
+
// wide table scrolls inside itself and never widens a 390px window; cells
|
|
8
|
+
// do not wrap, so a narrow window scrolls rather than squashing columns.
|
|
9
|
+
//
|
|
10
|
+
// <Table>
|
|
11
|
+
// <TableHeader><TableRow>
|
|
12
|
+
// <TableHead sort={dir} onSort={flip}>Name</TableHead>
|
|
13
|
+
// <TableHead numeric>Amount</TableHead>
|
|
14
|
+
// </TableRow></TableHeader>
|
|
15
|
+
// <TableBody>{rows.map((r) => (
|
|
16
|
+
// <TableRow key={r.id} selected={r.id === picked}>
|
|
17
|
+
// <TableCell>{r.name}</TableCell>
|
|
18
|
+
// <TableCell numeric>{r.amount}</TableCell>
|
|
19
|
+
// </TableRow>
|
|
20
|
+
// ))}</TableBody>
|
|
21
|
+
// </Table>
|
|
22
|
+
//
|
|
23
|
+
// Table variant outline (a bordered card; the default) · plain
|
|
24
|
+
// TableRow selected — the row the rest of the surface is showing
|
|
25
|
+
// TableHead sort asc · desc · none makes it a button with aria-sort;
|
|
26
|
+
// `onSort` is called on press and the caller picks the next
|
|
27
|
+
// order. One column is sorted at a time; the rest are none —
|
|
28
|
+
// or, sorting by several, pass each sorted column its
|
|
29
|
+
// `sortIndex` (1 first): the number shows beside the arrow.
|
|
30
|
+
// Pass it only while two or more are sorted
|
|
31
|
+
// numeric TableHead and TableCell: right-aligned, tabular figures
|
|
32
|
+
|
|
33
|
+
export function Table({ variant = "outline", className, children, ...rest }) {
|
|
34
|
+
return (
|
|
35
|
+
<div
|
|
36
|
+
className={cx(
|
|
37
|
+
"relative w-full max-w-full overflow-x-auto",
|
|
38
|
+
variant === "outline" && "rounded-lg border border-border bg-card text-card-foreground",
|
|
39
|
+
className,
|
|
40
|
+
)}
|
|
41
|
+
>
|
|
42
|
+
<table className="w-full caption-bottom border-collapse text-sm" {...rest}>
|
|
43
|
+
{children}
|
|
44
|
+
</table>
|
|
45
|
+
</div>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function TableHeader({ className, ...rest }) {
|
|
50
|
+
return <thead className={cx("[&_tr]:border-b [&_tr]:hover:bg-transparent", className)} {...rest} />;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function TableBody({ className, ...rest }) {
|
|
54
|
+
return <tbody className={cx("[&_tr:last-child]:border-b-0", className)} {...rest} />;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function TableFooter({ className, ...rest }) {
|
|
58
|
+
return <tfoot className={cx("border-t border-border bg-muted/50 font-medium [&_tr]:border-b-0", className)} {...rest} />;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function TableRow({ selected, className, ...rest }) {
|
|
62
|
+
return (
|
|
63
|
+
<tr
|
|
64
|
+
data-selected={selected ? "" : undefined}
|
|
65
|
+
className={cx("border-b border-border transition-colors hover:bg-muted/50 data-[selected]:bg-muted", className)}
|
|
66
|
+
{...rest}
|
|
67
|
+
/>
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const SORT = {
|
|
72
|
+
asc: { aria: "ascending", icon: "chevron-up" },
|
|
73
|
+
desc: { aria: "descending", icon: "chevron-down" },
|
|
74
|
+
none: { aria: undefined, icon: "chevrons-up-down" },
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export function TableHead({ sort, onSort, sortIndex, numeric, scope = "col", className, children, ...rest }) {
|
|
78
|
+
const s = sort ? SORT[sort] ?? SORT.none : null;
|
|
79
|
+
return (
|
|
80
|
+
<th
|
|
81
|
+
scope={scope}
|
|
82
|
+
aria-sort={s?.aria}
|
|
83
|
+
className={cx(
|
|
84
|
+
"h-11 whitespace-nowrap px-3 text-left align-middle text-xs font-medium text-muted-foreground",
|
|
85
|
+
numeric && "text-right",
|
|
86
|
+
className,
|
|
87
|
+
)}
|
|
88
|
+
{...rest}
|
|
89
|
+
>
|
|
90
|
+
{s ? (
|
|
91
|
+
<button
|
|
92
|
+
type="button"
|
|
93
|
+
onClick={onSort}
|
|
94
|
+
className={cx(
|
|
95
|
+
"-mx-2 inline-flex min-h-9 items-center gap-1 rounded-md px-2 outline-none hover:bg-accent hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring",
|
|
96
|
+
sort !== "none" && "text-foreground",
|
|
97
|
+
numeric && "flex-row-reverse",
|
|
98
|
+
)}
|
|
99
|
+
>
|
|
100
|
+
{children}
|
|
101
|
+
{sortIndex != null && sort !== "none" ? (
|
|
102
|
+
<span className={cx("inline-flex items-center", numeric && "flex-row-reverse")}>
|
|
103
|
+
<Icon name={s.icon} size={14} />
|
|
104
|
+
<span className="sr-only">, sort priority </span>
|
|
105
|
+
<span className="font-semibold leading-none tabular-nums">{sortIndex}</span>
|
|
106
|
+
</span>
|
|
107
|
+
) : (
|
|
108
|
+
<Icon name={s.icon} size={14} className={sort === "none" ? "opacity-50" : undefined} />
|
|
109
|
+
)}
|
|
110
|
+
</button>
|
|
111
|
+
) : (
|
|
112
|
+
children
|
|
113
|
+
)}
|
|
114
|
+
</th>
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export function TableCell({ numeric, className, ...rest }) {
|
|
119
|
+
return (
|
|
120
|
+
<td
|
|
121
|
+
data-nums={numeric ? "" : undefined}
|
|
122
|
+
className={cx("whitespace-nowrap px-3 py-2.5 align-middle", numeric && "text-right", className)}
|
|
123
|
+
{...rest}
|
|
124
|
+
/>
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export function TableCaption({ className, ...rest }) {
|
|
129
|
+
return <caption className={cx("px-3 py-3 text-left text-xs text-muted-foreground", className)} {...rest} />;
|
|
130
|
+
}
|