makersclaw 0.2.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/THIRD-PARTY-NOTICES.md +180 -0
- package/package.json +3 -2
- package/r/annotate.json +62 -0
- package/r/approval-request.json +52 -0
- package/r/audio-player.json +74 -0
- package/r/auth-form.json +55 -0
- package/r/board.json +10 -6
- package/r/calendar-view.json +105 -0
- package/r/cart.json +62 -0
- package/r/chart.json +83 -0
- package/r/chat.json +95 -0
- package/r/code-editor.json +94 -0
- package/r/comment-box.json +64 -0
- package/r/contact-section.json +53 -0
- package/r/core.json +205 -8
- package/r/csv-import.json +63 -0
- package/r/data-table.json +69 -0
- package/r/diagram.json +74 -0
- package/r/doc-editor.json +82 -0
- package/r/doc-page.json +61 -0
- package/r/email-render.json +73 -0
- package/r/faq.json +50 -0
- package/r/file-upload.json +54 -0
- package/r/flow-canvas.json +93 -0
- package/r/footer.json +52 -0
- package/r/gantt.json +70 -0
- package/r/job-panel.json +12 -7
- package/r/json-editor.json +66 -0
- package/r/map.json +89 -0
- package/r/menubar.json +52 -0
- package/r/mind-map.json +67 -0
- package/r/navigation-menu.json +52 -0
- package/r/order-detail.json +54 -0
- package/r/org-chart.json +66 -0
- package/r/page-builder.json +105 -0
- package/r/payment-methods.json +51 -0
- package/r/pdf-document.json +79 -0
- package/r/pdf-viewer.json +88 -0
- package/r/product-detail.json +76 -0
- package/r/product-grid.json +65 -0
- package/r/record-form.json +67 -0
- package/r/record-notes.json +55 -0
- package/r/registry.json +3411 -29
- package/r/search-dialog.json +51 -0
- package/r/settings-list.json +66 -0
- package/r/setup-checklist.json +51 -0
- package/r/share-dialog.json +52 -0
- package/r/sidebar.json +69 -0
- package/r/signature-pad.json +72 -0
- package/r/sketch-canvas.json +99 -0
- package/r/spreadsheet.json +90 -0
- package/r/stat-cards.json +66 -0
- package/r/task-list.json +63 -0
- package/r/task-model.json +98 -0
- package/r/testimonials.json +52 -0
- package/r/transaction-list.json +53 -0
- package/r/whiteboard.json +66 -0
- package/registry/blocks/annotate/README.md +179 -0
- package/registry/blocks/annotate/annotate-data.js +250 -0
- package/registry/blocks/annotate/annotate.jsx +646 -0
- package/registry/blocks/annotate/block.json +10 -0
- package/registry/blocks/annotate/demo.jsx +135 -0
- package/registry/blocks/annotate/index.js +15 -0
- package/registry/blocks/approval-request/README.md +116 -0
- package/registry/blocks/approval-request/approval-request.jsx +386 -0
- package/registry/blocks/approval-request/block.json +10 -0
- package/registry/blocks/approval-request/demo.jsx +127 -0
- package/registry/blocks/approval-request/index.js +4 -0
- package/registry/blocks/audio-player/README.md +167 -0
- package/registry/blocks/audio-player/audio-player.jsx +623 -0
- package/registry/blocks/audio-player/block.json +14 -0
- package/registry/blocks/audio-player/colors.js +109 -0
- package/registry/blocks/audio-player/demo.jsx +209 -0
- package/registry/blocks/audio-player/index.js +6 -0
- package/registry/blocks/audio-player/time.js +67 -0
- package/registry/blocks/audio-player/wavesurfer.js +9 -0
- package/registry/blocks/auth-form/README.md +126 -0
- package/registry/blocks/auth-form/auth-form.jsx +568 -0
- package/registry/blocks/auth-form/block.json +10 -0
- package/registry/blocks/auth-form/demo.jsx +131 -0
- package/registry/blocks/auth-form/index.js +3 -0
- package/registry/blocks/board/README.md +55 -5
- package/registry/blocks/board/block.json +2 -2
- package/registry/blocks/board/board.jsx +230 -86
- package/registry/blocks/board/demo.jsx +103 -24
- package/registry/blocks/calendar-view/README.md +180 -0
- package/registry/blocks/calendar-view/agenda.jsx +147 -0
- package/registry/blocks/calendar-view/block.json +76 -0
- package/registry/blocks/calendar-view/calendar-model.js +442 -0
- package/registry/blocks/calendar-view/calendar.jsx +627 -0
- package/registry/blocks/calendar-view/demo.jsx +195 -0
- package/registry/blocks/calendar-view/draft.jsx +49 -0
- package/registry/blocks/calendar-view/index.js +39 -0
- package/registry/blocks/calendar-view/month.jsx +346 -0
- package/registry/blocks/calendar-view/paint.js +69 -0
- package/registry/blocks/calendar-view/time-grid.jsx +527 -0
- package/registry/blocks/calendar-view/tray.jsx +87 -0
- package/registry/blocks/cart/README.md +146 -0
- package/registry/blocks/cart/block.json +10 -0
- package/registry/blocks/cart/cart.jsx +597 -0
- package/registry/blocks/cart/demo.jsx +98 -0
- package/registry/blocks/cart/index.js +4 -0
- package/registry/blocks/cart/money.js +28 -0
- package/registry/blocks/chart/README.md +316 -0
- package/registry/blocks/chart/block.json +10 -0
- package/registry/blocks/chart/cartesian.jsx +642 -0
- package/registry/blocks/chart/core.jsx +262 -0
- package/registry/blocks/chart/demo.jsx +357 -0
- package/registry/blocks/chart/heatmap.jsx +336 -0
- package/registry/blocks/chart/index.js +8 -0
- package/registry/blocks/chart/pie.jsx +245 -0
- package/registry/blocks/chart/sparkline.jsx +88 -0
- package/registry/blocks/chat/README.md +273 -0
- package/registry/blocks/chat/attachment.jsx +95 -0
- package/registry/blocks/chat/block.json +10 -0
- package/registry/blocks/chat/chat.jsx +132 -0
- package/registry/blocks/chat/composer.jsx +364 -0
- package/registry/blocks/chat/demo.jsx +578 -0
- package/registry/blocks/chat/header.jsx +34 -0
- package/registry/blocks/chat/index.js +9 -0
- package/registry/blocks/chat/message.jsx +450 -0
- package/registry/blocks/chat/scroller.jsx +247 -0
- package/registry/blocks/chat/text.jsx +104 -0
- package/registry/blocks/code-editor/README.md +210 -0
- package/registry/blocks/code-editor/block.json +22 -0
- package/registry/blocks/code-editor/code-editor.jsx +534 -0
- package/registry/blocks/code-editor/codemirror.js +38 -0
- package/registry/blocks/code-editor/demo.jsx +205 -0
- package/registry/blocks/code-editor/index.js +8 -0
- package/registry/blocks/code-editor/json.js +317 -0
- package/registry/blocks/code-editor/sql.js +136 -0
- package/registry/blocks/code-editor/text.js +101 -0
- package/registry/blocks/code-editor/theme.js +186 -0
- package/registry/blocks/comment-box/README.md +123 -0
- package/registry/blocks/comment-box/block.json +10 -0
- package/registry/blocks/comment-box/comment-body.jsx +217 -0
- package/registry/blocks/comment-box/comment-box.jsx +198 -0
- package/registry/blocks/comment-box/comment-time.jsx +77 -0
- package/registry/blocks/comment-box/demo.jsx +141 -0
- package/registry/blocks/comment-box/index.js +8 -0
- package/registry/blocks/contact-section/README.md +152 -0
- package/registry/blocks/contact-section/block.json +11 -0
- package/registry/blocks/contact-section/contact-section.jsx +509 -0
- package/registry/blocks/contact-section/demo.jsx +93 -0
- package/registry/blocks/contact-section/index.js +4 -0
- package/registry/blocks/csv-import/README.md +133 -0
- package/registry/blocks/csv-import/block.json +13 -0
- package/registry/blocks/csv-import/csv-import.jsx +479 -0
- package/registry/blocks/csv-import/demo.jsx +106 -0
- package/registry/blocks/csv-import/import.js +200 -0
- package/registry/blocks/csv-import/index.js +7 -0
- package/registry/blocks/data-table/README.md +386 -0
- package/registry/blocks/data-table/block.json +10 -0
- package/registry/blocks/data-table/data-table.jsx +1164 -0
- package/registry/blocks/data-table/demo.jsx +588 -0
- package/registry/blocks/data-table/index.js +5 -0
- package/registry/blocks/data-table/model.js +169 -0
- package/registry/blocks/diagram/README.md +108 -0
- package/registry/blocks/diagram/block.json +13 -0
- package/registry/blocks/diagram/demo.jsx +113 -0
- package/registry/blocks/diagram/diagram.jsx +481 -0
- package/registry/blocks/diagram/index.js +7 -0
- package/registry/blocks/diagram/mermaid.js +52 -0
- package/registry/blocks/diagram/palette.js +313 -0
- package/registry/blocks/diagram/source.js +98 -0
- package/registry/blocks/doc-editor/README.md +215 -0
- package/registry/blocks/doc-editor/block.json +15 -0
- package/registry/blocks/doc-editor/demo.jsx +225 -0
- package/registry/blocks/doc-editor/doc-editor.jsx +291 -0
- package/registry/blocks/doc-editor/doc.js +309 -0
- package/registry/blocks/doc-editor/index.js +7 -0
- package/registry/blocks/doc-editor/schema.jsx +56 -0
- package/registry/blocks/doc-editor/shadcn-classes.js +110 -0
- package/registry/blocks/doc-editor/theme.js +82 -0
- package/registry/blocks/doc-page/README.md +119 -0
- package/registry/blocks/doc-page/autosave.js +104 -0
- package/registry/blocks/doc-page/block.json +10 -0
- package/registry/blocks/doc-page/demo.jsx +137 -0
- package/registry/blocks/doc-page/doc-page.jsx +276 -0
- package/registry/blocks/doc-page/index.js +4 -0
- package/registry/blocks/email-render/README.md +151 -0
- package/registry/blocks/email-render/block.json +14 -0
- package/registry/blocks/email-render/demo.jsx +153 -0
- package/registry/blocks/email-render/doc-email.jsx +210 -0
- package/registry/blocks/email-render/email.jsx +221 -0
- package/registry/blocks/email-render/index.js +10 -0
- package/registry/blocks/email-render/render.js +50 -0
- package/registry/blocks/email-render/theme.js +215 -0
- package/registry/blocks/faq/README.md +101 -0
- package/registry/blocks/faq/block.json +11 -0
- package/registry/blocks/faq/demo.jsx +89 -0
- package/registry/blocks/faq/faq.jsx +220 -0
- package/registry/blocks/faq/index.js +4 -0
- package/registry/blocks/file-upload/README.md +138 -0
- package/registry/blocks/file-upload/block.json +10 -0
- package/registry/blocks/file-upload/demo.jsx +204 -0
- package/registry/blocks/file-upload/file-upload.jsx +635 -0
- package/registry/blocks/file-upload/index.js +4 -0
- package/registry/blocks/flow-canvas/README.md +420 -0
- package/registry/blocks/flow-canvas/block.json +13 -0
- package/registry/blocks/flow-canvas/board.js +819 -0
- package/registry/blocks/flow-canvas/chrome.jsx +649 -0
- package/registry/blocks/flow-canvas/context.jsx +35 -0
- package/registry/blocks/flow-canvas/demo.jsx +249 -0
- package/registry/blocks/flow-canvas/edges.jsx +107 -0
- package/registry/blocks/flow-canvas/flow-canvas.jsx +1329 -0
- package/registry/blocks/flow-canvas/index.js +41 -0
- package/registry/blocks/flow-canvas/nodes.jsx +392 -0
- package/registry/blocks/flow-canvas/theme.js +174 -0
- package/registry/blocks/footer/README.md +133 -0
- package/registry/blocks/footer/block.json +11 -0
- package/registry/blocks/footer/demo.jsx +119 -0
- package/registry/blocks/footer/footer.jsx +406 -0
- package/registry/blocks/footer/index.js +4 -0
- package/registry/blocks/gantt/README.md +220 -0
- package/registry/blocks/gantt/block.json +10 -0
- package/registry/blocks/gantt/demo.jsx +148 -0
- package/registry/blocks/gantt/gantt.jsx +923 -0
- package/registry/blocks/gantt/index.js +7 -0
- package/registry/blocks/gantt/rows.jsx +468 -0
- package/registry/blocks/gantt/schedule.js +278 -0
- package/registry/blocks/job-panel/README.md +80 -0
- package/registry/blocks/job-panel/block.json +3 -3
- package/registry/blocks/job-panel/demo.jsx +230 -3
- package/registry/blocks/job-panel/job-panel.jsx +169 -3
- package/registry/blocks/json-editor/README.md +133 -0
- package/registry/blocks/json-editor/block.json +10 -0
- package/registry/blocks/json-editor/demo.jsx +92 -0
- package/registry/blocks/json-editor/index.js +7 -0
- package/registry/blocks/json-editor/json-editor.jsx +305 -0
- package/registry/blocks/json-editor/json-tree.jsx +393 -0
- package/registry/blocks/json-editor/tree.js +225 -0
- package/registry/blocks/map/README.md +221 -0
- package/registry/blocks/map/block.json +14 -0
- package/registry/blocks/map/demo.jsx +201 -0
- package/registry/blocks/map/geo.js +198 -0
- package/registry/blocks/map/index.js +8 -0
- package/registry/blocks/map/list.jsx +128 -0
- package/registry/blocks/map/map-view.jsx +715 -0
- package/registry/blocks/map/maplibre.js +30 -0
- package/registry/blocks/map/marks.jsx +146 -0
- package/registry/blocks/map/theme.js +142 -0
- package/registry/blocks/menubar/README.md +109 -0
- package/registry/blocks/menubar/block.json +10 -0
- package/registry/blocks/menubar/demo.jsx +128 -0
- package/registry/blocks/menubar/index.js +4 -0
- package/registry/blocks/menubar/menubar.jsx +199 -0
- package/registry/blocks/mind-map/README.md +206 -0
- package/registry/blocks/mind-map/block.json +10 -0
- package/registry/blocks/mind-map/demo.jsx +103 -0
- package/registry/blocks/mind-map/index.js +31 -0
- package/registry/blocks/mind-map/mind-map.jsx +1125 -0
- package/registry/blocks/mind-map/topic.jsx +143 -0
- package/registry/blocks/mind-map/tree.js +645 -0
- package/registry/blocks/navigation-menu/README.md +124 -0
- package/registry/blocks/navigation-menu/block.json +10 -0
- package/registry/blocks/navigation-menu/demo.jsx +84 -0
- package/registry/blocks/navigation-menu/index.js +4 -0
- package/registry/blocks/navigation-menu/navigation-menu.jsx +448 -0
- package/registry/blocks/order-detail/README.md +109 -0
- package/registry/blocks/order-detail/block.json +10 -0
- package/registry/blocks/order-detail/demo.jsx +88 -0
- package/registry/blocks/order-detail/index.js +4 -0
- package/registry/blocks/order-detail/order-detail.jsx +354 -0
- package/registry/blocks/org-chart/README.md +145 -0
- package/registry/blocks/org-chart/block.json +10 -0
- package/registry/blocks/org-chart/demo.jsx +94 -0
- package/registry/blocks/org-chart/index.js +7 -0
- package/registry/blocks/org-chart/org-chart.jsx +631 -0
- package/registry/blocks/org-chart/org.js +245 -0
- package/registry/blocks/org-chart/person.jsx +96 -0
- package/registry/blocks/page-builder/README.md +257 -0
- package/registry/blocks/page-builder/block.json +14 -0
- package/registry/blocks/page-builder/demo.jsx +145 -0
- package/registry/blocks/page-builder/grapes.js +18 -0
- package/registry/blocks/page-builder/index.js +11 -0
- package/registry/blocks/page-builder/page-builder.jsx +704 -0
- package/registry/blocks/page-builder/page-view.jsx +33 -0
- package/registry/blocks/page-builder/page.js +118 -0
- package/registry/blocks/page-builder/panels.jsx +588 -0
- package/registry/blocks/page-builder/sections.js +209 -0
- package/registry/blocks/page-builder/theme.js +87 -0
- package/registry/blocks/page-builder/thumbs.jsx +189 -0
- package/registry/blocks/page-builder/tokens.js +329 -0
- package/registry/blocks/payment-methods/README.md +104 -0
- package/registry/blocks/payment-methods/block.json +10 -0
- package/registry/blocks/payment-methods/demo.jsx +71 -0
- package/registry/blocks/payment-methods/index.js +4 -0
- package/registry/blocks/payment-methods/payment-methods.jsx +302 -0
- package/registry/blocks/pdf-document/README.md +213 -0
- package/registry/blocks/pdf-document/block.json +13 -0
- package/registry/blocks/pdf-document/demo.jsx +136 -0
- package/registry/blocks/pdf-document/index.js +33 -0
- package/registry/blocks/pdf-document/money.js +83 -0
- package/registry/blocks/pdf-document/pdf-document.jsx +144 -0
- package/registry/blocks/pdf-document/primitives.jsx +271 -0
- package/registry/blocks/pdf-document/quote.jsx +179 -0
- package/registry/blocks/pdf-document/theme.js +193 -0
- package/registry/blocks/pdf-viewer/README.md +191 -0
- package/registry/blocks/pdf-viewer/block.json +14 -0
- package/registry/blocks/pdf-viewer/demo.jsx +252 -0
- package/registry/blocks/pdf-viewer/helpers.js +270 -0
- package/registry/blocks/pdf-viewer/index.js +8 -0
- package/registry/blocks/pdf-viewer/notes.jsx +195 -0
- package/registry/blocks/pdf-viewer/pdf-viewer.jsx +1368 -0
- package/registry/blocks/pdf-viewer/pdfjs.js +37 -0
- package/registry/blocks/pdf-viewer/ssr-shim-end.js +6 -0
- package/registry/blocks/pdf-viewer/ssr-shim.js +44 -0
- package/registry/blocks/product-detail/README.md +217 -0
- package/registry/blocks/product-detail/block.json +10 -0
- package/registry/blocks/product-detail/demo.jsx +233 -0
- package/registry/blocks/product-detail/index.js +7 -0
- package/registry/blocks/product-detail/price.jsx +115 -0
- package/registry/blocks/product-detail/product-detail.jsx +348 -0
- package/registry/blocks/product-detail/product-media.jsx +102 -0
- package/registry/blocks/product-detail/product-options.jsx +144 -0
- package/registry/blocks/product-grid/README.md +162 -0
- package/registry/blocks/product-grid/block.json +10 -0
- package/registry/blocks/product-grid/demo.jsx +255 -0
- package/registry/blocks/product-grid/index.js +5 -0
- package/registry/blocks/product-grid/product-card.jsx +232 -0
- package/registry/blocks/product-grid/product-grid.jsx +235 -0
- package/registry/blocks/record-form/README.md +196 -0
- package/registry/blocks/record-form/block.json +10 -0
- package/registry/blocks/record-form/demo.jsx +525 -0
- package/registry/blocks/record-form/index.js +4 -0
- package/registry/blocks/record-form/record-fields.jsx +457 -0
- package/registry/blocks/record-form/record-form.jsx +415 -0
- package/registry/blocks/record-form/rules.js +81 -0
- package/registry/blocks/record-notes/README.md +139 -0
- package/registry/blocks/record-notes/block.json +10 -0
- package/registry/blocks/record-notes/demo.jsx +179 -0
- package/registry/blocks/record-notes/index.js +4 -0
- package/registry/blocks/record-notes/record-notes.jsx +266 -0
- package/registry/blocks/search-dialog/README.md +108 -0
- package/registry/blocks/search-dialog/block.json +10 -0
- package/registry/blocks/search-dialog/demo.jsx +116 -0
- package/registry/blocks/search-dialog/index.js +3 -0
- package/registry/blocks/search-dialog/search-dialog.jsx +235 -0
- package/registry/blocks/settings-list/README.md +171 -0
- package/registry/blocks/settings-list/block.json +10 -0
- package/registry/blocks/settings-list/demo.jsx +333 -0
- package/registry/blocks/settings-list/index.js +4 -0
- package/registry/blocks/settings-list/row-state.jsx +93 -0
- package/registry/blocks/settings-list/settings-list.jsx +349 -0
- package/registry/blocks/settings-list/settings-matrix.jsx +118 -0
- package/registry/blocks/setup-checklist/README.md +142 -0
- package/registry/blocks/setup-checklist/block.json +10 -0
- package/registry/blocks/setup-checklist/demo.jsx +159 -0
- package/registry/blocks/setup-checklist/index.js +4 -0
- package/registry/blocks/setup-checklist/setup-checklist.jsx +446 -0
- package/registry/blocks/share-dialog/README.md +113 -0
- package/registry/blocks/share-dialog/block.json +10 -0
- package/registry/blocks/share-dialog/demo.jsx +140 -0
- package/registry/blocks/share-dialog/index.js +3 -0
- package/registry/blocks/share-dialog/share-dialog.jsx +384 -0
- package/registry/blocks/sidebar/README.md +190 -0
- package/registry/blocks/sidebar/block.json +43 -0
- package/registry/blocks/sidebar/demo.jsx +577 -0
- package/registry/blocks/sidebar/index.js +4 -0
- package/registry/blocks/sidebar/sidebar-panel.jsx +149 -0
- package/registry/blocks/sidebar/sidebar.jsx +864 -0
- package/registry/blocks/signature-pad/README.md +137 -0
- package/registry/blocks/signature-pad/block.json +13 -0
- package/registry/blocks/signature-pad/colors.js +115 -0
- package/registry/blocks/signature-pad/demo.jsx +94 -0
- package/registry/blocks/signature-pad/index.js +6 -0
- package/registry/blocks/signature-pad/pad.js +7 -0
- package/registry/blocks/signature-pad/signature-pad.jsx +434 -0
- package/registry/blocks/signature-pad/signature.js +68 -0
- package/registry/blocks/sketch-canvas/README.md +280 -0
- package/registry/blocks/sketch-canvas/block.json +13 -0
- package/registry/blocks/sketch-canvas/demo.jsx +159 -0
- package/registry/blocks/sketch-canvas/excalidraw.js +40 -0
- package/registry/blocks/sketch-canvas/index.js +9 -0
- package/registry/blocks/sketch-canvas/palette.js +226 -0
- package/registry/blocks/sketch-canvas/sketch-canvas.jsx +1188 -0
- package/registry/blocks/sketch-canvas/sketch.js +179 -0
- package/registry/blocks/sketch-canvas/ssr-shim-end.js +6 -0
- package/registry/blocks/sketch-canvas/ssr-shim.js +45 -0
- package/registry/blocks/sketch-canvas/stamps.js +104 -0
- package/registry/blocks/sketch-canvas/theme.js +131 -0
- package/registry/blocks/spreadsheet/README.md +307 -0
- package/registry/blocks/spreadsheet/block.json +13 -0
- package/registry/blocks/spreadsheet/cells.jsx +455 -0
- package/registry/blocks/spreadsheet/chrome.jsx +325 -0
- package/registry/blocks/spreadsheet/demo.jsx +177 -0
- package/registry/blocks/spreadsheet/grid.js +387 -0
- package/registry/blocks/spreadsheet/index.js +34 -0
- package/registry/blocks/spreadsheet/spreadsheet.jsx +1732 -0
- package/registry/blocks/spreadsheet/types.js +473 -0
- package/registry/blocks/stat-cards/README.md +173 -0
- package/registry/blocks/stat-cards/block.json +10 -0
- package/registry/blocks/stat-cards/demo.jsx +257 -0
- package/registry/blocks/stat-cards/index.js +4 -0
- package/registry/blocks/stat-cards/stat-cards.jsx +307 -0
- package/registry/blocks/stat-cards/usage.jsx +243 -0
- package/registry/blocks/task-list/README.md +176 -0
- package/registry/blocks/task-list/block.json +10 -0
- package/registry/blocks/task-list/demo.jsx +134 -0
- package/registry/blocks/task-list/index.js +5 -0
- package/registry/blocks/task-list/task-list.jsx +907 -0
- package/registry/blocks/task-model/README.md +455 -0
- package/registry/blocks/task-model/block.json +167 -0
- package/registry/blocks/task-model/changes.js +89 -0
- package/registry/blocks/task-model/dates.js +371 -0
- package/registry/blocks/task-model/demo.jsx +215 -0
- package/registry/blocks/task-model/dnd.jsx +240 -0
- package/registry/blocks/task-model/index.js +97 -0
- package/registry/blocks/task-model/model.js +919 -0
- package/registry/blocks/task-model/parts.jsx +449 -0
- package/registry/blocks/task-model/toolbar.jsx +271 -0
- package/registry/blocks/testimonials/README.md +139 -0
- package/registry/blocks/testimonials/block.json +11 -0
- package/registry/blocks/testimonials/demo.jsx +137 -0
- package/registry/blocks/testimonials/index.js +4 -0
- package/registry/blocks/testimonials/testimonials.jsx +430 -0
- package/registry/blocks/transaction-list/README.md +126 -0
- package/registry/blocks/transaction-list/block.json +10 -0
- package/registry/blocks/transaction-list/demo.jsx +79 -0
- package/registry/blocks/transaction-list/index.js +4 -0
- package/registry/blocks/transaction-list/transaction-list.jsx +383 -0
- package/registry/blocks/whiteboard/README.md +179 -0
- package/registry/blocks/whiteboard/block.json +10 -0
- package/registry/blocks/whiteboard/demo.jsx +169 -0
- package/registry/blocks/whiteboard/index.js +6 -0
- package/registry/blocks/whiteboard/templates.js +150 -0
- package/registry/blocks/whiteboard/whiteboard.jsx +721 -0
- package/src/install.mjs +18 -0
- package/src/shadcn.mjs +8 -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/ui/avatar.jsx +141 -0
- package/templates/next/files/components/ui/breadcrumb.jsx +149 -0
- package/templates/next/files/components/ui/button-group.jsx +70 -0
- package/templates/next/files/components/ui/button.jsx +132 -12
- package/templates/next/files/components/ui/calendar.jsx +609 -0
- package/templates/next/files/components/ui/carousel.jsx +281 -0
- package/templates/next/files/components/ui/collapsible.jsx +208 -0
- package/templates/next/files/components/ui/combobox.jsx +608 -0
- package/templates/next/files/components/ui/command.jsx +577 -0
- package/templates/next/files/components/ui/context-menu.jsx +191 -0
- package/templates/next/files/components/ui/date-picker.jsx +360 -0
- package/templates/next/files/components/ui/distribution.jsx +117 -0
- package/templates/next/files/components/ui/feedback.jsx +143 -0
- package/templates/next/files/components/ui/field.jsx +115 -3
- package/templates/next/files/components/ui/file-input.jsx +234 -0
- package/templates/next/files/components/ui/icon.jsx +130 -8
- package/templates/next/files/components/ui/image.jsx +143 -0
- package/templates/next/files/components/ui/index.js +47 -2
- package/templates/next/files/components/ui/input-group.jsx +213 -0
- package/templates/next/files/components/ui/input-otp.jsx +170 -0
- package/templates/next/files/components/ui/item.jsx +206 -0
- package/templates/next/files/components/ui/menu.jsx +454 -82
- package/templates/next/files/components/ui/notice.jsx +126 -14
- package/templates/next/files/components/ui/pagination.jsx +156 -0
- package/templates/next/files/components/ui/popover.jsx +284 -0
- package/templates/next/files/components/ui/radio.jsx +193 -0
- package/templates/next/files/components/ui/rating.jsx +131 -0
- package/templates/next/files/components/ui/resizable.jsx +338 -0
- package/templates/next/files/components/ui/scroll-area.jsx +123 -0
- package/templates/next/files/components/ui/separator.jsx +119 -0
- package/templates/next/files/components/ui/sheet.jsx +96 -11
- package/templates/next/files/components/ui/slider.jsx +174 -0
- package/templates/next/files/components/ui/stat.jsx +574 -0
- package/templates/next/files/components/ui/steps.jsx +338 -0
- package/templates/next/files/components/ui/swatch.jsx +33 -0
- package/templates/next/files/components/ui/table.jsx +130 -0
- package/templates/next/files/components/ui/toast.jsx +440 -0
- package/templates/next/files/components/ui/toggle.jsx +195 -0
- package/templates/next/files/components/ui/tooltip.jsx +270 -0
- package/templates/next/template.json +264 -8
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useRef, useState } from "react";
|
|
4
|
+
import { cx } from "./cx";
|
|
5
|
+
import { Icon } from "./icon";
|
|
6
|
+
|
|
7
|
+
// InputOTP — the one-time code from an email or a text: N boxes, one
|
|
8
|
+
// character each. The boxes are a view of ONE string, as a single field
|
|
9
|
+
// is: typing fills the box and moves on, Backspace clears and moves
|
|
10
|
+
// back, a cleared box closes the gap, the arrows and Home/End move, and
|
|
11
|
+
// a box past the first empty one sends the caret back to it. Paste, or
|
|
12
|
+
// the phone's "From Messages" (autocomplete="one-time-code" on the first
|
|
13
|
+
// box), fills every box at once. Each box is a native <input>, so the
|
|
14
|
+
// keyboard, the numeric keypad and autofill are the browser's.
|
|
15
|
+
//
|
|
16
|
+
// length how many boxes (6)
|
|
17
|
+
// groups box counts split by a dash: [3, 3] → 123–456; their
|
|
18
|
+
// sum is the length
|
|
19
|
+
// value the code so far, a string; onChange(code) on every edit
|
|
20
|
+
// (controlled), or `defaultValue`
|
|
21
|
+
// onComplete (code) → called once the last box fills: verify here
|
|
22
|
+
// digitsOnly true (the default: 0–9 and the number pad) · false
|
|
23
|
+
// (letters too, as typed)
|
|
24
|
+
// label what a screen reader calls the group ("Verification code")
|
|
25
|
+
// name a hidden input carries the whole code in a form
|
|
26
|
+
// invalid every box turns red — pair it with <Field error>
|
|
27
|
+
//
|
|
28
|
+
// Wrap it in <Field id> with the same `id`: the label points at the
|
|
29
|
+
// first box. After a wrong code, clear `value` and the caret starts over.
|
|
30
|
+
|
|
31
|
+
const SLOT =
|
|
32
|
+
"h-11 w-10 min-w-0 -ml-px border border-input bg-background text-center text-lg font-medium text-foreground outline-none " +
|
|
33
|
+
"first:ml-0 first:rounded-l-md last:rounded-r-md caret-foreground selection:bg-transparent " +
|
|
34
|
+
"focus-visible:z-10 focus-visible:ring-2 focus-visible:ring-ring " +
|
|
35
|
+
"aria-[invalid=true]:border-destructive disabled:cursor-not-allowed";
|
|
36
|
+
|
|
37
|
+
export function InputOTP({
|
|
38
|
+
id,
|
|
39
|
+
length = 6,
|
|
40
|
+
groups,
|
|
41
|
+
value,
|
|
42
|
+
defaultValue = "",
|
|
43
|
+
onChange,
|
|
44
|
+
onComplete,
|
|
45
|
+
digitsOnly = true,
|
|
46
|
+
label = "One-time code",
|
|
47
|
+
name,
|
|
48
|
+
invalid,
|
|
49
|
+
disabled,
|
|
50
|
+
autoFocus,
|
|
51
|
+
className,
|
|
52
|
+
}) {
|
|
53
|
+
const sizes = groups?.length ? groups : [length];
|
|
54
|
+
const total = sizes.reduce((a, b) => a + b, 0);
|
|
55
|
+
const [own, setOwn] = useState(defaultValue);
|
|
56
|
+
const code = (value ?? own).slice(0, total);
|
|
57
|
+
const boxes = useRef([]);
|
|
58
|
+
// The code as of the last edit. Focus moves inside the edit's own
|
|
59
|
+
// event, before React renders it, so the redirect below reads this.
|
|
60
|
+
const latest = useRef(code);
|
|
61
|
+
latest.current = code;
|
|
62
|
+
const allowed = digitsOnly ? /[0-9]/ : /[0-9a-zA-Z]/;
|
|
63
|
+
const clean = (s) => [...s].filter((c) => allowed.test(c)).join("");
|
|
64
|
+
|
|
65
|
+
function focus(i) {
|
|
66
|
+
const el = boxes.current[Math.max(0, Math.min(i, total - 1))];
|
|
67
|
+
el?.focus();
|
|
68
|
+
el?.select();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function commit(next, caret) {
|
|
72
|
+
next = next.slice(0, total);
|
|
73
|
+
latest.current = next;
|
|
74
|
+
if (value === undefined) setOwn(next);
|
|
75
|
+
if (next !== code) onChange?.(next);
|
|
76
|
+
if (next.length === total && next !== code) onComplete?.(next);
|
|
77
|
+
if (caret !== undefined) focus(caret);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Put `text` in from box i on, over what is there.
|
|
81
|
+
function place(i, text) {
|
|
82
|
+
commit(code.slice(0, i) + text + code.slice(i + text.length), i + text.length);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function onInput(e, i) {
|
|
86
|
+
const old = code[i] ?? "";
|
|
87
|
+
let v = e.target.value;
|
|
88
|
+
// The caret sat beside the old character: keep only the new one.
|
|
89
|
+
if (old && v.length === 2) v = v[0] === old ? v[1] : v[0];
|
|
90
|
+
if (v === "") return commit(code.slice(0, i) + code.slice(i + 1), i);
|
|
91
|
+
const typed = clean(v);
|
|
92
|
+
if (typed) place(i, typed);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function onKeyDown(e, i) {
|
|
96
|
+
if (e.key === "Backspace" && !code[i] && i > 0) {
|
|
97
|
+
commit(code.slice(0, i - 1) + code.slice(i), i - 1);
|
|
98
|
+
} else if (e.key === "Delete" && code[i]) {
|
|
99
|
+
commit(code.slice(0, i) + code.slice(i + 1), i);
|
|
100
|
+
} else if (e.key === "ArrowLeft") focus(i - 1);
|
|
101
|
+
else if (e.key === "ArrowRight") focus(Math.min(i + 1, code.length));
|
|
102
|
+
else if (e.key === "Home") focus(0);
|
|
103
|
+
else if (e.key === "End") focus(code.length);
|
|
104
|
+
else return;
|
|
105
|
+
e.preventDefault();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function onPaste(e, i) {
|
|
109
|
+
e.preventDefault();
|
|
110
|
+
const text = clean(e.clipboardData.getData("text"));
|
|
111
|
+
if (!text) return;
|
|
112
|
+
// A whole code replaces the code; a fragment goes in where the caret is.
|
|
113
|
+
place(text.length >= total ? 0 : i, text);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// The code is one string: a box past the first empty one is not a
|
|
117
|
+
// place to type, so the caret goes back to the gap.
|
|
118
|
+
function onFocus(e, i) {
|
|
119
|
+
if (i > latest.current.length) return focus(latest.current.length);
|
|
120
|
+
e.target.select();
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
let n = 0;
|
|
124
|
+
return (
|
|
125
|
+
<div
|
|
126
|
+
role="group"
|
|
127
|
+
aria-label={label}
|
|
128
|
+
className={cx("flex items-center gap-2", disabled && "opacity-50", className)}
|
|
129
|
+
>
|
|
130
|
+
{sizes.map((size, g) => (
|
|
131
|
+
<div key={g} className="contents">
|
|
132
|
+
{g > 0 ? <Icon name="minus" className="shrink-0 text-muted-foreground" /> : null}
|
|
133
|
+
<div className="flex">
|
|
134
|
+
{Array.from({ length: size }, () => {
|
|
135
|
+
const i = n++;
|
|
136
|
+
return (
|
|
137
|
+
<input
|
|
138
|
+
key={i}
|
|
139
|
+
ref={(el) => {
|
|
140
|
+
boxes.current[i] = el;
|
|
141
|
+
}}
|
|
142
|
+
id={i === 0 ? id : undefined}
|
|
143
|
+
type="text"
|
|
144
|
+
inputMode={digitsOnly ? "numeric" : "text"}
|
|
145
|
+
autoComplete={i === 0 ? "one-time-code" : "off"}
|
|
146
|
+
autoCorrect="off"
|
|
147
|
+
autoCapitalize="off"
|
|
148
|
+
spellCheck={false}
|
|
149
|
+
autoFocus={i === 0 ? autoFocus : undefined}
|
|
150
|
+
aria-label={`${digitsOnly ? "Digit" : "Character"} ${i + 1} of ${total}`}
|
|
151
|
+
aria-invalid={invalid ? true : undefined}
|
|
152
|
+
disabled={disabled}
|
|
153
|
+
value={code[i] ?? ""}
|
|
154
|
+
onChange={(e) => onInput(e, i)}
|
|
155
|
+
onKeyDown={(e) => onKeyDown(e, i)}
|
|
156
|
+
onPaste={(e) => onPaste(e, i)}
|
|
157
|
+
onFocus={(e) => onFocus(e, i)}
|
|
158
|
+
onClick={(e) => e.currentTarget.select()}
|
|
159
|
+
data-nums
|
|
160
|
+
className={SLOT}
|
|
161
|
+
/>
|
|
162
|
+
);
|
|
163
|
+
})}
|
|
164
|
+
</div>
|
|
165
|
+
</div>
|
|
166
|
+
))}
|
|
167
|
+
{name ? <input type="hidden" name={name} value={code} /> : null}
|
|
168
|
+
</div>
|
|
169
|
+
);
|
|
170
|
+
}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import Link from "next/link";
|
|
2
|
+
import { Children } from "react";
|
|
3
|
+
import { cx } from "./cx";
|
|
4
|
+
import { Icon } from "./icon";
|
|
5
|
+
|
|
6
|
+
// Item — the list row: a contact, a file, a run, a setting. Media on the
|
|
7
|
+
// left, title and description, meta on the right, then its own actions.
|
|
8
|
+
// With `href` or `onClick` the WHOLE row is the target — the title is the
|
|
9
|
+
// real <a> or <button> and stretches over the row, so the row's own
|
|
10
|
+
// actions stay separate buttons (never a button inside a link) and a
|
|
11
|
+
// screen reader hears the title, not the whole row read out.
|
|
12
|
+
//
|
|
13
|
+
// media a node on the left: an avatar, an <img>, a logo
|
|
14
|
+
// icon or a glyph from ./icon, drawn in a muted square
|
|
15
|
+
// title the one line that names the thing (truncates)
|
|
16
|
+
// description up to two lines under it
|
|
17
|
+
// meta a count, a date, a Badge — muted, on the right
|
|
18
|
+
// actions buttons on the far right (IconButton, Menu); they sit above
|
|
19
|
+
// the row's target, so they click on their own
|
|
20
|
+
// href a next/link row · `onClick` a button row · neither: static
|
|
21
|
+
// size default (56px) · sm (44px, for dense lists and rails) ·
|
|
22
|
+
// lg (64px, roomier: a pipeline's runs, a list read at leisure)
|
|
23
|
+
// variant plain (no fill) · outline (a bordered card) · muted (a filled panel)
|
|
24
|
+
// layout row (default) · stacked — a card for a grid: icon or media on
|
|
25
|
+
// top, then the title (up to two lines), the description (up
|
|
26
|
+
// to three), children, and meta at the foot; actions sit in the
|
|
27
|
+
// top-right corner. It fills its grid cell's height, so a row
|
|
28
|
+
// of cards lines up. Pair it with variant="outline" or "muted".
|
|
29
|
+
// The link or button target and what goes where are the row's
|
|
30
|
+
//
|
|
31
|
+
// Where the other props go: `aria-current`, `onClick`, `target` and `rel`
|
|
32
|
+
// belong to the row's target, so they go on its <a> or <button> (with
|
|
33
|
+
// `href`, `onClick` rides on the link: analytics, closing a sheet).
|
|
34
|
+
// aria-current on the target fills the row, so the current page looks
|
|
35
|
+
// like what a screen reader says it is. Every other prop (data-*, id,
|
|
36
|
+
// aria-label…) goes on the row's <div>.
|
|
37
|
+
//
|
|
38
|
+
// ItemGroup stacks plain Items with a rule between each, as a list.
|
|
39
|
+
|
|
40
|
+
const VARIANTS = {
|
|
41
|
+
plain: "",
|
|
42
|
+
outline: "border border-border bg-card text-card-foreground",
|
|
43
|
+
muted: "bg-muted",
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const SIZES = {
|
|
47
|
+
default: { row: "min-h-14 gap-3 px-3 py-2.5", icon: "size-10", glyph: 18, desc: "line-clamp-2 text-sm" },
|
|
48
|
+
sm: { row: "min-h-11 gap-2.5 px-2.5 py-1.5", icon: "size-8", glyph: 16, desc: "truncate text-xs" },
|
|
49
|
+
lg: { row: "min-h-16 gap-3.5 px-4 py-3", icon: "size-11", glyph: 20, desc: "line-clamp-2 text-sm" },
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// layout="stacked": the card's padding and gaps, and its icon square.
|
|
53
|
+
const STACKED = {
|
|
54
|
+
default: { box: "gap-3 p-4", icon: "size-10", glyph: 18 },
|
|
55
|
+
sm: { box: "gap-2 p-3", icon: "size-8", glyph: 16 },
|
|
56
|
+
lg: { box: "gap-4 p-5", icon: "size-12", glyph: 22 },
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const TARGET = "outline-none after:absolute after:inset-0";
|
|
60
|
+
|
|
61
|
+
// The row filled while its target (or a static row itself) is current.
|
|
62
|
+
const CURRENT =
|
|
63
|
+
"has-[[data-item-target][aria-current]:not([aria-current=false])]:bg-accent " +
|
|
64
|
+
"[&[aria-current]:not([aria-current=false])]:bg-accent";
|
|
65
|
+
|
|
66
|
+
export function Item({
|
|
67
|
+
media,
|
|
68
|
+
icon,
|
|
69
|
+
title,
|
|
70
|
+
description,
|
|
71
|
+
meta,
|
|
72
|
+
actions,
|
|
73
|
+
href,
|
|
74
|
+
onClick,
|
|
75
|
+
size = "default",
|
|
76
|
+
variant = "plain",
|
|
77
|
+
layout = "row",
|
|
78
|
+
disabled,
|
|
79
|
+
className,
|
|
80
|
+
children,
|
|
81
|
+
"aria-current": ariaCurrent,
|
|
82
|
+
target,
|
|
83
|
+
rel,
|
|
84
|
+
...rest
|
|
85
|
+
}) {
|
|
86
|
+
const s = SIZES[size] ?? SIZES.default;
|
|
87
|
+
const interactive = Boolean(href || onClick) && !disabled;
|
|
88
|
+
|
|
89
|
+
let name = title;
|
|
90
|
+
let targeted = false;
|
|
91
|
+
if (href && !disabled) {
|
|
92
|
+
targeted = true;
|
|
93
|
+
name = (
|
|
94
|
+
<Link href={href} onClick={onClick} target={target} rel={rel} aria-current={ariaCurrent} data-item-target className={TARGET}>
|
|
95
|
+
{title}
|
|
96
|
+
</Link>
|
|
97
|
+
);
|
|
98
|
+
} else if (onClick) {
|
|
99
|
+
targeted = true;
|
|
100
|
+
name = (
|
|
101
|
+
<button
|
|
102
|
+
type="button"
|
|
103
|
+
onClick={onClick}
|
|
104
|
+
disabled={disabled}
|
|
105
|
+
aria-current={ariaCurrent}
|
|
106
|
+
data-item-target
|
|
107
|
+
className={cx(TARGET, "text-left disabled:cursor-not-allowed")}
|
|
108
|
+
>
|
|
109
|
+
{title}
|
|
110
|
+
</button>
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const ring =
|
|
115
|
+
interactive &&
|
|
116
|
+
"hover:bg-accent has-[[data-item-target]:focus-visible]:ring-2 has-[[data-item-target]:focus-visible]:ring-inset has-[[data-item-target]:focus-visible]:ring-ring";
|
|
117
|
+
|
|
118
|
+
if (layout === "stacked") {
|
|
119
|
+
const k = STACKED[size] ?? STACKED.default;
|
|
120
|
+
return (
|
|
121
|
+
<div
|
|
122
|
+
className={cx("relative flex h-full flex-col items-start rounded-lg text-sm", VARIANTS[variant] ?? VARIANTS.plain, k.box, ring, CURRENT, disabled && "opacity-50", className)}
|
|
123
|
+
aria-current={targeted ? undefined : ariaCurrent}
|
|
124
|
+
{...rest}
|
|
125
|
+
>
|
|
126
|
+
{icon ? (
|
|
127
|
+
<span className={cx("flex shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground", variant === "muted" && "bg-background", k.icon)}>
|
|
128
|
+
<Icon name={icon} size={k.glyph} />
|
|
129
|
+
</span>
|
|
130
|
+
) : media ? (
|
|
131
|
+
<span className="flex shrink-0 items-center">{media}</span>
|
|
132
|
+
) : null}
|
|
133
|
+
<div className={cx("w-full min-w-0 flex-1", actions && !icon && !media && "pr-10")}>
|
|
134
|
+
<p className="line-clamp-2 font-medium text-foreground">{name}</p>
|
|
135
|
+
{description ? <p className="mt-1 line-clamp-3 text-sm text-muted-foreground">{description}</p> : null}
|
|
136
|
+
{children ? <div className="mt-2">{children}</div> : null}
|
|
137
|
+
</div>
|
|
138
|
+
{meta !== undefined && meta !== null ? (
|
|
139
|
+
<div data-nums className="text-xs text-muted-foreground">
|
|
140
|
+
{meta}
|
|
141
|
+
</div>
|
|
142
|
+
) : null}
|
|
143
|
+
{actions ? <div className="absolute right-2 top-2 z-10 flex items-center gap-1">{actions}</div> : null}
|
|
144
|
+
</div>
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return (
|
|
149
|
+
<div
|
|
150
|
+
className={cx(
|
|
151
|
+
"relative flex items-center rounded-lg text-sm",
|
|
152
|
+
VARIANTS[variant] ?? VARIANTS.plain,
|
|
153
|
+
s.row,
|
|
154
|
+
ring,
|
|
155
|
+
CURRENT,
|
|
156
|
+
disabled && "opacity-50",
|
|
157
|
+
className,
|
|
158
|
+
)}
|
|
159
|
+
aria-current={targeted ? undefined : ariaCurrent}
|
|
160
|
+
{...rest}
|
|
161
|
+
>
|
|
162
|
+
{icon ? (
|
|
163
|
+
<span className={cx("flex shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground", variant === "muted" && "bg-background", s.icon)}>
|
|
164
|
+
<Icon name={icon} size={s.glyph} />
|
|
165
|
+
</span>
|
|
166
|
+
) : media ? (
|
|
167
|
+
<span className="flex shrink-0 items-center">{media}</span>
|
|
168
|
+
) : null}
|
|
169
|
+
<div className="min-w-0 flex-1">
|
|
170
|
+
<p className="truncate font-medium text-foreground">{name}</p>
|
|
171
|
+
{description ? <p className={cx("text-muted-foreground", s.desc)}>{description}</p> : null}
|
|
172
|
+
{children ? <div className="mt-1.5">{children}</div> : null}
|
|
173
|
+
</div>
|
|
174
|
+
{meta !== undefined && meta !== null ? (
|
|
175
|
+
<div data-nums className="shrink-0 text-xs text-muted-foreground">
|
|
176
|
+
{meta}
|
|
177
|
+
</div>
|
|
178
|
+
) : null}
|
|
179
|
+
{actions ? <div className="relative z-10 flex shrink-0 items-center gap-1">{actions}</div> : null}
|
|
180
|
+
</div>
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** Items as a list, a rule between each. `variant="outline"` boxes the
|
|
185
|
+
* whole list; put plain Items in it. */
|
|
186
|
+
export function ItemGroup({ variant = "plain", className, children, "aria-label": ariaLabel }) {
|
|
187
|
+
const rows = Children.toArray(children).filter(Boolean);
|
|
188
|
+
if (rows.length === 0) return null;
|
|
189
|
+
return (
|
|
190
|
+
<ul
|
|
191
|
+
role="list"
|
|
192
|
+
aria-label={ariaLabel}
|
|
193
|
+
className={cx(
|
|
194
|
+
"flex flex-col",
|
|
195
|
+
variant === "outline" && "overflow-hidden rounded-lg border border-border bg-card text-card-foreground [&>li>*]:rounded-none",
|
|
196
|
+
className,
|
|
197
|
+
)}
|
|
198
|
+
>
|
|
199
|
+
{rows.map((row, i) => (
|
|
200
|
+
<li key={row.key ?? i} className={cx(i > 0 && "border-t border-border")}>
|
|
201
|
+
{row}
|
|
202
|
+
</li>
|
|
203
|
+
))}
|
|
204
|
+
</ul>
|
|
205
|
+
);
|
|
206
|
+
}
|