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,270 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useEffect, useId, useRef, useState } from "react";
|
|
4
|
+
import { createPortal } from "react-dom";
|
|
5
|
+
import { cx } from "./cx";
|
|
6
|
+
import { panelClass, usePopoverPosition } from "./popover";
|
|
7
|
+
|
|
8
|
+
// Tooltip and HoverCard — what shows while the pointer rests on something,
|
|
9
|
+
// placed by usePopoverPosition (./popover). Both wrap their trigger in an
|
|
10
|
+
// inline span that listens; neither is the only way to learn anything.
|
|
11
|
+
//
|
|
12
|
+
// Tooltip — a short label for a control: the name of an icon button, a
|
|
13
|
+
// shortcut. Hover (after `delay`) or keyboard focus shows it; leaving,
|
|
14
|
+
// clicking, blur or Escape hides it. While one shows (or just after), the
|
|
15
|
+
// next opens at once, so running along a toolbar reads every label. Plain text only:
|
|
16
|
+
// it never holds a link or a button. A `popover="hint"` where the browser
|
|
17
|
+
// has it (one hint at a time, never closing an open Popover), else
|
|
18
|
+
// "manual" with the same rules kept here.
|
|
19
|
+
//
|
|
20
|
+
// <Tooltip label="Copy link"><IconButton icon="link" label="Copy link" /></Tooltip>
|
|
21
|
+
//
|
|
22
|
+
// label the text; nothing (or "") renders the child alone
|
|
23
|
+
// side top (default) · right · bottom · left; align start · center · end
|
|
24
|
+
// delay ms before a hover shows it (default 500)
|
|
25
|
+
//
|
|
26
|
+
// Touch shows nothing, on purpose: a long press belongs to the OS (text
|
|
27
|
+
// selection, the link menu) and a tap is the action. So what a touch user
|
|
28
|
+
// needs is visible or in the control's label — the tooltip only repeats
|
|
29
|
+
// it for the pointer. The child's `title` is removed while it is wrapped,
|
|
30
|
+
// so the browser's own tooltip does not double this one, and the label is
|
|
31
|
+
// tied to the child's control with aria-describedby unless it already is
|
|
32
|
+
// that control's name.
|
|
33
|
+
//
|
|
34
|
+
// HoverCard — a richer preview of what a link or a name points at: a
|
|
35
|
+
// person's card, a company's summary. Opens after `openDelay` on hover or
|
|
36
|
+
// keyboard focus, stays while the pointer or focus is on the trigger or
|
|
37
|
+
// the card, closes `closeDelay` after both are left, or on Escape. It may
|
|
38
|
+
// hold any content — links, buttons, blocks — because it is portalled to
|
|
39
|
+
// <body>; Tab from the trigger walks into it and out again. Touch shows
|
|
40
|
+
// nothing — the tap follows the link — so the card only previews what the
|
|
41
|
+
// link's own page shows in full.
|
|
42
|
+
//
|
|
43
|
+
// <HoverCard trigger={<a href="/people/ada">Ada Lovelace</a>}>…the card…</HoverCard>
|
|
44
|
+
//
|
|
45
|
+
// trigger the inline thing hovered: a link, a name, an avatar
|
|
46
|
+
// side bottom (default) · top · right · left; align start · center · end
|
|
47
|
+
// width sm · md (default) · lg · auto, as Popover
|
|
48
|
+
// openDelay ms (default 600); closeDelay ms (default 300)
|
|
49
|
+
// className the card's (it has p-4 unless it names a padding)
|
|
50
|
+
|
|
51
|
+
const FOCUSABLE = 'a[href], button, input, select, textarea, [tabindex]:not([tabindex="-1"])';
|
|
52
|
+
|
|
53
|
+
// "hint" where the browser has it; the attribute reads back "manual" where not.
|
|
54
|
+
function hintable() {
|
|
55
|
+
const d = document.createElement("div");
|
|
56
|
+
d.popover = "hint";
|
|
57
|
+
return d.popover === "hint";
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// One tooltip at a time, and the warm-up skipped just after one closed.
|
|
61
|
+
let hideShown = null;
|
|
62
|
+
let closedAt = 0;
|
|
63
|
+
|
|
64
|
+
// Show, hide and their timer, made once per mounted part: they read only
|
|
65
|
+
// refs, so the Escape listener added on show is the one removed on hide.
|
|
66
|
+
function useFloat(panel, { onHide } = {}) {
|
|
67
|
+
const api = useRef(null);
|
|
68
|
+
if (!api.current) {
|
|
69
|
+
let timer = 0;
|
|
70
|
+
const self = {
|
|
71
|
+
later(fn, ms) {
|
|
72
|
+
clearTimeout(timer);
|
|
73
|
+
timer = setTimeout(fn, ms);
|
|
74
|
+
},
|
|
75
|
+
cancel: () => clearTimeout(timer),
|
|
76
|
+
isOpen: () => Boolean(panel.current?.matches(":popover-open")),
|
|
77
|
+
show() {
|
|
78
|
+
clearTimeout(timer);
|
|
79
|
+
if (!panel.current || self.isOpen()) return;
|
|
80
|
+
panel.current.showPopover();
|
|
81
|
+
document.addEventListener("keydown", self.onKey);
|
|
82
|
+
},
|
|
83
|
+
hide() {
|
|
84
|
+
clearTimeout(timer);
|
|
85
|
+
document.removeEventListener("keydown", self.onKey);
|
|
86
|
+
if (!self.isOpen()) return;
|
|
87
|
+
const inside = panel.current.contains(document.activeElement);
|
|
88
|
+
panel.current.hidePopover();
|
|
89
|
+
onHide?.(inside);
|
|
90
|
+
},
|
|
91
|
+
onKey(e) {
|
|
92
|
+
if (e.key === "Escape") self.hide();
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
api.current = self;
|
|
96
|
+
}
|
|
97
|
+
useEffect(() => () => {
|
|
98
|
+
api.current.cancel();
|
|
99
|
+
document.removeEventListener("keydown", api.current.onKey);
|
|
100
|
+
}, []);
|
|
101
|
+
return api.current;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export function Tooltip({ label, side = "top", align = "center", delay = 500, className, children }) {
|
|
105
|
+
const id = useId();
|
|
106
|
+
const anchor = useRef(null);
|
|
107
|
+
const tip = useRef(null);
|
|
108
|
+
usePopoverPosition(anchor, tip, { side, align, offset: 6 });
|
|
109
|
+
const f = useFloat(tip);
|
|
110
|
+
|
|
111
|
+
useEffect(() => {
|
|
112
|
+
const t = tip.current;
|
|
113
|
+
const control = anchor.current?.querySelector(FOCUSABLE) ?? anchor.current?.firstElementChild;
|
|
114
|
+
if (!t || !control) return;
|
|
115
|
+
if (hintable()) t.setAttribute("popover", "hint");
|
|
116
|
+
const title = control.getAttribute("title");
|
|
117
|
+
if (title !== null) control.removeAttribute("title");
|
|
118
|
+
const name = (control.getAttribute("aria-label") ?? control.textContent ?? "").trim();
|
|
119
|
+
const describe = name !== String(label).trim();
|
|
120
|
+
if (describe) control.setAttribute("aria-describedby", id);
|
|
121
|
+
return () => {
|
|
122
|
+
if (title !== null) control.setAttribute("title", title);
|
|
123
|
+
if (describe) control.removeAttribute("aria-describedby");
|
|
124
|
+
};
|
|
125
|
+
}, [id, label]);
|
|
126
|
+
|
|
127
|
+
if (!label) return children;
|
|
128
|
+
|
|
129
|
+
function show() {
|
|
130
|
+
if (hideShown && hideShown !== f.hide) hideShown();
|
|
131
|
+
f.show();
|
|
132
|
+
hideShown = f.hide;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return (
|
|
136
|
+
<>
|
|
137
|
+
<span
|
|
138
|
+
ref={anchor}
|
|
139
|
+
className="inline-flex"
|
|
140
|
+
onPointerEnter={(e) => e.pointerType !== "touch" && f.later(show, hideShown || Date.now() - closedAt < 400 ? 0 : delay)}
|
|
141
|
+
onPointerLeave={() => f.later(f.hide, 80)}
|
|
142
|
+
onPointerDown={f.hide}
|
|
143
|
+
onFocus={(e) => e.target.matches(":focus-visible") && show()}
|
|
144
|
+
onBlur={f.hide}
|
|
145
|
+
>
|
|
146
|
+
{children}
|
|
147
|
+
</span>
|
|
148
|
+
<span
|
|
149
|
+
ref={tip}
|
|
150
|
+
id={id}
|
|
151
|
+
role="tooltip"
|
|
152
|
+
popover="manual"
|
|
153
|
+
// However it closed (ours, or a hint's own Escape and light dismiss).
|
|
154
|
+
onToggle={(e) => {
|
|
155
|
+
if (e.newState !== "closed") return;
|
|
156
|
+
f.hide();
|
|
157
|
+
closedAt = Date.now();
|
|
158
|
+
if (hideShown === f.hide) hideShown = null;
|
|
159
|
+
}}
|
|
160
|
+
// A pointer crossing the gap onto the label keeps it (WCAG 1.4.13).
|
|
161
|
+
onPointerEnter={f.cancel}
|
|
162
|
+
onPointerLeave={() => f.later(f.hide, 80)}
|
|
163
|
+
className={cx(
|
|
164
|
+
"max-w-64 rounded-md bg-foreground px-2 py-1 text-xs leading-snug text-background shadow-md text-balance",
|
|
165
|
+
"opacity-0 transition-[opacity,display,overlay] transition-discrete duration-100 open:opacity-100 starting:open:opacity-0 motion-reduce:transition-none",
|
|
166
|
+
className,
|
|
167
|
+
)}
|
|
168
|
+
>
|
|
169
|
+
{label}
|
|
170
|
+
</span>
|
|
171
|
+
</>
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export function HoverCard({
|
|
176
|
+
trigger,
|
|
177
|
+
side = "bottom",
|
|
178
|
+
align = "center",
|
|
179
|
+
width = "md",
|
|
180
|
+
openDelay = 600,
|
|
181
|
+
closeDelay = 300,
|
|
182
|
+
className,
|
|
183
|
+
children,
|
|
184
|
+
}) {
|
|
185
|
+
const anchor = useRef(null);
|
|
186
|
+
const card = useRef(null);
|
|
187
|
+
const hovering = useRef(false);
|
|
188
|
+
const [host, setHost] = useState(null);
|
|
189
|
+
useEffect(() => setHost(document.body), []);
|
|
190
|
+
usePopoverPosition(anchor, card, { side, align, offset: 8 });
|
|
191
|
+
// Focus inside the card goes back to the trigger, not to the page.
|
|
192
|
+
const control = () => anchor.current?.querySelector(FOCUSABLE);
|
|
193
|
+
const f = useFloat(card, { onHide: (inside) => inside && control()?.focus() });
|
|
194
|
+
|
|
195
|
+
// Pointer or focus on either the trigger or the card keeps it open.
|
|
196
|
+
const stay = {
|
|
197
|
+
onPointerEnter: (e) => {
|
|
198
|
+
if (e.pointerType === "touch") return;
|
|
199
|
+
hovering.current = true;
|
|
200
|
+
if (f.isOpen()) f.cancel();
|
|
201
|
+
else f.later(f.show, openDelay);
|
|
202
|
+
},
|
|
203
|
+
onPointerLeave: (e) => {
|
|
204
|
+
if (e.pointerType === "touch") return;
|
|
205
|
+
hovering.current = false;
|
|
206
|
+
f.later(f.hide, closeDelay);
|
|
207
|
+
},
|
|
208
|
+
onBlur: (e) => {
|
|
209
|
+
const to = e.relatedTarget;
|
|
210
|
+
if (to ? !anchor.current?.contains(to) && !card.current?.contains(to) : !hovering.current) f.later(f.hide, 0);
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
// The card lives at the end of <body> (a name in a <p> may not hold a
|
|
215
|
+
// <div>), so Tab is carried by hand: from the trigger into the open card,
|
|
216
|
+
// from the card's first control back to the trigger, and from its last
|
|
217
|
+
// on to whatever follows the trigger on the page.
|
|
218
|
+
function onTriggerKey(e) {
|
|
219
|
+
if (e.key !== "Tab" || e.shiftKey || !f.isOpen()) return;
|
|
220
|
+
const first = card.current?.querySelector(FOCUSABLE);
|
|
221
|
+
if (!first) return;
|
|
222
|
+
e.preventDefault();
|
|
223
|
+
first.focus();
|
|
224
|
+
}
|
|
225
|
+
function onCardKey(e) {
|
|
226
|
+
if (e.key !== "Tab") return;
|
|
227
|
+
const inCard = [...card.current.querySelectorAll(FOCUSABLE)];
|
|
228
|
+
const back = e.shiftKey && document.activeElement === inCard[0];
|
|
229
|
+
const on = !e.shiftKey && document.activeElement === inCard[inCard.length - 1];
|
|
230
|
+
if (!back && !on) return;
|
|
231
|
+
e.preventDefault();
|
|
232
|
+
const from = control();
|
|
233
|
+
if (back) return from?.focus();
|
|
234
|
+
const page = [...document.querySelectorAll(FOCUSABLE)].filter((n) => !card.current.contains(n) && n.tabIndex >= 0 && n.offsetParent);
|
|
235
|
+
f.hide();
|
|
236
|
+
(page[page.indexOf(from) + 1] ?? from)?.focus();
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return (
|
|
240
|
+
<>
|
|
241
|
+
<span
|
|
242
|
+
ref={anchor}
|
|
243
|
+
className="inline"
|
|
244
|
+
{...stay}
|
|
245
|
+
onKeyDown={onTriggerKey}
|
|
246
|
+
onFocus={(e) => {
|
|
247
|
+
if (f.isOpen()) f.cancel();
|
|
248
|
+
else if (e.target.matches(":focus-visible")) f.later(f.show, openDelay);
|
|
249
|
+
}}
|
|
250
|
+
>
|
|
251
|
+
{trigger}
|
|
252
|
+
</span>
|
|
253
|
+
{host
|
|
254
|
+
? createPortal(
|
|
255
|
+
<div
|
|
256
|
+
ref={card}
|
|
257
|
+
popover="manual"
|
|
258
|
+
{...stay}
|
|
259
|
+
onKeyDown={onCardKey}
|
|
260
|
+
onFocus={f.cancel}
|
|
261
|
+
className={panelClass(width, cx(!/(^|\s)p[xytrbl]?-/.test(className ?? "") && "p-4", "text-sm", className))}
|
|
262
|
+
>
|
|
263
|
+
{children}
|
|
264
|
+
</div>,
|
|
265
|
+
host,
|
|
266
|
+
)
|
|
267
|
+
: null}
|
|
268
|
+
</>
|
|
269
|
+
);
|
|
270
|
+
}
|
|
@@ -30,23 +30,23 @@
|
|
|
30
30
|
"name": "button",
|
|
31
31
|
"type": "component",
|
|
32
32
|
"title": "Button, IconButton",
|
|
33
|
-
"description": "The one button: variant primary (one per surface) · secondary · quiet · danger · link; size md (44px) · sm; icon; href for a link. IconButton for an icon alone, label required.",
|
|
33
|
+
"description": "The one button: variant primary (one per surface) · secondary · quiet · danger · link (inline text: no padding, no min-height, wraps and truncates with its sentence; size inherit takes the sentence's text; tone primary · muted for a secondary link) · nav (a full-width, start-aligned, normal-weight navigation row, filled when aria-current); size md (44px) · sm; align center · start; icon; href for a link; loading (a spinner, same width, aria-busy, disabled). IconButton for an icon alone, label required.",
|
|
34
34
|
"tags": ["button", "action", "link", "icon button"],
|
|
35
35
|
"files": ["components/ui/button.jsx"]
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
38
|
"name": "field",
|
|
39
39
|
"type": "component",
|
|
40
|
-
"title": "Field, Input, Textarea, Select, Switch, Checkbox",
|
|
41
|
-
"description": "Form controls with their label, hint and error. Select with empty options renders a muted line, never a disabled dropdown.",
|
|
42
|
-
"tags": ["form", "input", "select", "dropdown", "textarea", "switch", "checkbox", "toggle"],
|
|
40
|
+
"title": "Field, Input, TimeInput, Textarea, Select, Switch, Checkbox",
|
|
41
|
+
"description": "Form controls with their label, hint and error. TimeInput is the native time input (\"HH:MM\"; min, max, step) with the kit's clock glyph in place of the browser's grey one. Textarea autoGrow grows with its text from minRows to maxRows. Select with empty options renders a muted line, never a disabled dropdown.",
|
|
42
|
+
"tags": ["form", "input", "select", "dropdown", "textarea", "switch", "checkbox", "toggle", "time", "time picker"],
|
|
43
43
|
"files": ["components/ui/field.jsx"]
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
46
|
"name": "notice",
|
|
47
47
|
"type": "component",
|
|
48
48
|
"title": "Card, Notice, Badge, Kicker, Empty",
|
|
49
|
-
"description": "Containers and signals: Card, Notice (tone neutral · info · success · warning · danger), Badge, Kicker (the small line above a heading), Empty (a search or filter with no matches).",
|
|
49
|
+
"description": "Containers and signals: Card (padding md · sm · none; titleSize md · lg), Notice (tone neutral · info · success · warning · danger), Badge (tone neutral · primary · success · warning · danger · info; variant label — small caps · soft — sentence case, every tone tinted, primary included · outline — sentence case, a hairline on no fill · code — the mono face in its own case for a version tag or a commit hash; hue 1..5 a categorical colour from --color-chart-N for kinds of things, never status: soft a hue tint with a hue dot, label filled, outline a hue hairline, the text always readable), Kicker (the small line above a heading), Empty (a search or filter with no matches).",
|
|
50
50
|
"tags": ["card", "alert", "notice", "badge", "empty state", "status"],
|
|
51
51
|
"files": ["components/ui/notice.jsx"]
|
|
52
52
|
},
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"name": "sheet",
|
|
55
55
|
"type": "component",
|
|
56
56
|
"title": "Sheet, Confirm",
|
|
57
|
-
"description": "The one overlay — a rail beside the work (side end), a dialog (center) or a bottom sheet; every side is a bottom sheet on a narrow window. Confirm is the \"delete this?\" case.",
|
|
57
|
+
"description": "The one overlay — a rail beside the work (side end), a drawer from the leading edge (start, for navigation), a dialog (center) or a bottom sheet; every side is a bottom sheet on a narrow window. bare (with label): no header and a flush body, for a panel that draws its own top. Confirm is the \"delete this?\" case: consequences (a muted bullet list), requireText (type the exact text to unlock) and acknowledge (a checkbox to tick) hold Confirm disabled until each is met.",
|
|
58
58
|
"tags": ["dialog", "modal", "drawer", "overlay", "confirm", "rail"],
|
|
59
59
|
"files": ["components/ui/sheet.jsx"]
|
|
60
60
|
},
|
|
@@ -70,10 +70,74 @@
|
|
|
70
70
|
"name": "menu",
|
|
71
71
|
"type": "component",
|
|
72
72
|
"title": "Menu",
|
|
73
|
-
"description": "The \"…\" of a row, on the Popover API. Empty items render nothing: a menu is earned by having actions.",
|
|
74
|
-
"tags": ["menu", "dropdown", "actions", "overflow"],
|
|
73
|
+
"description": "The dropdown menu — the \"…\" of a row, a View or Account menu — on the Popover API, placed by usePopoverPosition (side, align; flips at the window's edge). Data-driven items: actions (icon, tone danger, disabled, shortcut drawn as keys, description), labelled groups, labels, separators, checkbox and radio items (they keep it open), submenus (to the side; inline on a phone). WAI-ARIA menu keys with typeahead. Trigger size sm (36px, default) · md (44px). Empty items render nothing: a menu is earned by having actions.",
|
|
74
|
+
"tags": ["menu", "dropdown", "dropdown-menu", "actions", "overflow", "submenu", "checkbox", "radio"],
|
|
75
75
|
"files": ["components/ui/menu.jsx"]
|
|
76
76
|
},
|
|
77
|
+
{
|
|
78
|
+
"name": "context-menu",
|
|
79
|
+
"type": "component",
|
|
80
|
+
"title": "ContextMenu",
|
|
81
|
+
"description": "The menu a right-click, a long press or Shift+F10 opens on a region, at the pointer; the same items as Menu (groups, checkboxes, radios, shortcuts, submenus) and the same keys. Never the only way to an action.",
|
|
82
|
+
"tags": ["menu", "context-menu", "right-click", "long-press", "actions"],
|
|
83
|
+
"files": ["components/ui/context-menu.jsx"]
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"name": "popover",
|
|
87
|
+
"type": "component",
|
|
88
|
+
"title": "Popover, usePopoverPosition, panelClass",
|
|
89
|
+
"description": "A panel beside the control that opened it, on the Popover API with CSS anchor positioning (a measured fallback elsewhere): side top · right · bottom · left, align start · center · end, width sm · md · lg · auto; flips at the window's edge and tries the asked side first again on every open, follows scroll; controlled or not; focus moves in and back. usePopoverPosition places any floating panel.",
|
|
90
|
+
"tags": ["popover", "floating", "panel", "dropdown", "anchor", "flyout"],
|
|
91
|
+
"files": ["components/ui/popover.jsx"]
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"name": "calendar",
|
|
95
|
+
"type": "component",
|
|
96
|
+
"title": "Calendar, parseDate, isDateString, toDateString, todayString, addDays, addMonths, startOfMonth, endOfMonth, dayOfWeek, formatDate, firstDayOfWeek",
|
|
97
|
+
"description": "A month grid, the WAI-ARIA date grid (arrows a day or a week, Page Up/Down a month, Home/End the week's edges, Enter picks): mode single · multiple · range, dates as \"YYYY-MM-DD\" strings in and out (no timezone drift); numberOfMonths side by side (stacked on a phone); captionLayout label · dropdown (month and year Selects) · none (the parent shows and moves a controlled month); min, max, disabled(date); today ringed, outside days muted, range start/middle/end; marked days (a dot in a tone, a label for readers; emphasizeMarked draws them bold and the rest muted; onlyMarked makes the rest unpickable, unstruck); week numbers; week start and names from Intl, weekStartsOn overrides; size md (44px days) · sm. The string-date helpers do the same arithmetic in a surface.",
|
|
98
|
+
"tags": ["calendar", "date", "month", "range", "schedule", "day picker", "week"],
|
|
99
|
+
"files": ["components/ui/calendar.jsx"]
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"name": "date-picker",
|
|
103
|
+
"type": "component",
|
|
104
|
+
"title": "DatePicker, DateInput, DATE_PRESETS",
|
|
105
|
+
"description": "DatePicker: a field that reads like an input and opens a Calendar in a Popover — mode single · range (formatRange in the field), presets beside the calendar (true for Today, Last 7 days, This month… or your own), clearable, disabled, min/max, a hidden input for forms; goes in <Field>. DateInput: the browser's own typed date field with the Calendar one button away.",
|
|
106
|
+
"tags": ["date picker", "date", "range", "due date", "presets", "date input", "report period"],
|
|
107
|
+
"files": ["components/ui/date-picker.jsx"]
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"name": "tooltip",
|
|
111
|
+
"type": "component",
|
|
112
|
+
"title": "Tooltip, HoverCard",
|
|
113
|
+
"description": "Tooltip: a short text label on hover (after a delay) or keyboard focus, side top · right · bottom · left; never on touch. HoverCard: a richer preview of a link or a name (a profile card) with open and close delays; may hold links.",
|
|
114
|
+
"tags": ["tooltip", "hint", "hover card", "preview", "profile card", "hover"],
|
|
115
|
+
"files": ["components/ui/tooltip.jsx"]
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"name": "avatar",
|
|
119
|
+
"type": "component",
|
|
120
|
+
"title": "Avatar, AvatarGroup",
|
|
121
|
+
"description": "A person's face with initials from name while it loads and when the image fails (a user icon with no name); size xs · sm · md · lg; shape round · square; status dot online · away · busy · offline. AvatarGroup overlaps people with \"+N\" after max.",
|
|
122
|
+
"tags": ["avatar", "profile", "user", "initials", "presence", "status", "people", "facepile"],
|
|
123
|
+
"files": ["components/ui/avatar.jsx"]
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"name": "breadcrumb",
|
|
127
|
+
"type": "component",
|
|
128
|
+
"title": "Breadcrumb",
|
|
129
|
+
"description": "Where this page sits: items as data ({ label, href }), the last is the current page. The middle folds into a \"…\" popover past max and always on a phone; earlier crumbs are capped and truncate, the current page takes the rest of the row and truncates only when it runs out; separator chevron · slash. A client part a server surface renders as it is (items are plain data).",
|
|
130
|
+
"tags": ["breadcrumb", "navigation", "path", "hierarchy", "trail"],
|
|
131
|
+
"files": ["components/ui/breadcrumb.jsx"]
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"name": "pagination",
|
|
135
|
+
"type": "component",
|
|
136
|
+
"title": "Pagination",
|
|
137
|
+
"description": "Page numbers with \"…\" around the current page, previous/next disabled at the ends; links via hrefFor(page) (server-safe) or buttons via onPageChange; compact \"Page 3 of 12\" on a phone or when asked; optional Rows per page Select; size md · sm.",
|
|
138
|
+
"tags": ["pagination", "pager", "pages", "table", "list", "page size", "navigation"],
|
|
139
|
+
"files": ["components/ui/pagination.jsx"]
|
|
140
|
+
},
|
|
77
141
|
{
|
|
78
142
|
"name": "icon",
|
|
79
143
|
"type": "component",
|
|
@@ -90,6 +154,198 @@
|
|
|
90
154
|
"tags": ["depiction", "preview", "mockup", "frame"],
|
|
91
155
|
"files": ["components/ui/depiction.jsx"]
|
|
92
156
|
},
|
|
157
|
+
{
|
|
158
|
+
"name": "radio",
|
|
159
|
+
"type": "component",
|
|
160
|
+
"title": "RadioGroup, Radio",
|
|
161
|
+
"description": "One choice out of a few, all visible: native radios (arrow keys move and select). Options as data or <Radio> children, each with an optional description and icon; variant list · card (each option a selectable card); orientation vertical · horizontal; size md · sm; invalid; inside <Field> with the same id it takes the label, hint and error.",
|
|
162
|
+
"tags": ["radio", "radio group", "choice", "option", "choice card", "form"],
|
|
163
|
+
"files": ["components/ui/radio.jsx"]
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"name": "toggle",
|
|
167
|
+
"type": "component",
|
|
168
|
+
"title": "Toggle, ToggleGroup",
|
|
169
|
+
"description": "Toggle: a button that stays down (aria-pressed), variant secondary · quiet, size md · sm, icon (square with label). ToggleGroup: the segmented control — type single · multiple over items, roving focus with the arrow keys, size md · sm, stretches to a given width.",
|
|
170
|
+
"tags": ["toggle", "toggle group", "segmented control", "pressed", "view switcher", "toolbar"],
|
|
171
|
+
"files": ["components/ui/toggle.jsx"]
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
"name": "button-group",
|
|
175
|
+
"type": "component",
|
|
176
|
+
"title": "ButtonGroup, ButtonGroupSeparator",
|
|
177
|
+
"description": "Joins Buttons, IconButtons and a Menu trigger into one attached piece (a split button, a pager, a zoom control); orientation horizontal · vertical; size md · sm; ButtonGroupSeparator between primary or quiet buttons.",
|
|
178
|
+
"tags": ["button group", "split button", "segmented", "toolbar", "attached buttons"],
|
|
179
|
+
"files": ["components/ui/button-group.jsx"]
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"name": "collapsible",
|
|
183
|
+
"type": "component",
|
|
184
|
+
"title": "Collapsible, Accordion",
|
|
185
|
+
"description": "A row that shows or hides what is under it, on native <details>: title, meta on the right (a count, a date), controlled (open + onOpenChange) or not (defaultOpen); variant plain · outline · flush (edge-to-edge rows inside a Card, a rule between them; accordion-outline is its older name); chevron down (turns up, the default) · right (the disclosure triangle, turns down); the chevron turns and the height animates unless reduced motion. Accordion is a list of them: type single · multiple, collapsible, value + onChange, variant plain · outline, chevron; arrow keys, Home and End move between rows.",
|
|
186
|
+
"tags": ["collapsible", "accordion", "disclosure", "expand", "details", "faq", "show more"],
|
|
187
|
+
"files": ["components/ui/collapsible.jsx"]
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"name": "item",
|
|
191
|
+
"type": "component",
|
|
192
|
+
"title": "Item, ItemGroup",
|
|
193
|
+
"description": "The list row: media (an avatar, an image) or an icon, title, description, meta on the right, actions; href makes the whole row a link, onClick a button, neither static — actions still click on their own. aria-current, onClick, target and rel go on the row's link or button (aria-current fills the row); other props on the row. size default (56px) · sm (44px) · lg (64px); variant plain · outline · muted; layout row · stacked (a card for a grid: icon or media on top, title, description, meta at the foot, actions top-right, full cell height). ItemGroup stacks them with a rule between each (variant plain · outline).",
|
|
194
|
+
"tags": ["item", "list", "row", "list item", "contact", "file", "settings row"],
|
|
195
|
+
"files": ["components/ui/item.jsx"]
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
"name": "table",
|
|
199
|
+
"type": "component",
|
|
200
|
+
"title": "Table, TableHeader, TableBody, TableFooter, TableRow, TableHead, TableCell, TableCaption",
|
|
201
|
+
"description": "Native table parts in the workspace's look, presentation only. Table scrolls inside itself so it never widens a phone (variant outline · plain); TableRow selected; TableHead sort asc · desc · none with onSort renders a button and aria-sort, sortIndex shows each column's priority in a multi-column sort; numeric head and cells are right-aligned with tabular figures.",
|
|
202
|
+
"tags": ["table", "data table", "grid", "rows", "columns", "sort", "spreadsheet"],
|
|
203
|
+
"files": ["components/ui/table.jsx"]
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
"name": "slider",
|
|
207
|
+
"type": "component",
|
|
208
|
+
"title": "Slider",
|
|
209
|
+
"description": "A number, or a range (value [low, high] — two thumbs that never cross), picked by dragging the native range input: min, max, step, showValue through format (also the screen reader's text), disabled. A value someone will type is an Input type=\"number\".",
|
|
210
|
+
"tags": ["slider", "range", "number", "threshold", "budget", "price range"],
|
|
211
|
+
"files": ["components/ui/slider.jsx"]
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"name": "input-group",
|
|
215
|
+
"type": "component",
|
|
216
|
+
"title": "InputGroup, PasswordInput",
|
|
217
|
+
"description": "An Input with addons that reads as one field: a leading icon or text (\"https://\"), trailing text (\"USD\"), a keyboard hint, a trailing button (copy, search). PasswordInput is the password field with a show/hide IconButton (aria-pressed); autoComplete passes through (current-password by default, new-password on sign-up). Focus, invalid and disabled belong to the whole group. Goes inside <Field>. multiline: a textarea that grows with its text (minRows, maxRows) with the addons in a bar under it — tools at the start, the action at the end, `above` for attached files — the chat composer.",
|
|
218
|
+
"tags": ["input", "addon", "prefix", "suffix", "search", "copy", "url", "currency", "composer", "textarea", "multiline", "password", "show password"],
|
|
219
|
+
"files": ["components/ui/input-group.jsx"]
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"name": "image",
|
|
223
|
+
"type": "component",
|
|
224
|
+
"title": "Image",
|
|
225
|
+
"description": "A picture of a thing (a thumbnail, a product shot, a cover): the native <img> in a rounded box, a Skeleton while it loads, an image glyph (or `fallback`) when it fails or has no src; lazy by default; alt required. ratio auto · square · video · portrait · photo · wide or a number; fit cover · contain; rounded none · sm · md · lg · full. A person's face is an Avatar.",
|
|
226
|
+
"tags": ["image", "img", "picture", "photo", "thumbnail", "cover", "media"],
|
|
227
|
+
"files": ["components/ui/image.jsx"]
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
"name": "file-input",
|
|
231
|
+
"type": "component",
|
|
232
|
+
"title": "FileInput, FileDrop, fileMatches",
|
|
233
|
+
"description": "How files come in, over a real hidden <input type=file>: FileInput is a Button (or, with only a label, an IconButton) that opens the picker; FileDrop is a drop zone (size md · sm; label, hint, invalid) that lights up on drag-over and opens the picker on click, Enter or Space. Both take accept, multiple, disabled and onFiles(files); a drop is filtered by accept and the rest go to onReject(files). Neither uploads.",
|
|
234
|
+
"tags": ["file", "upload", "file input", "drop zone", "dropzone", "drag and drop", "attach", "picker"],
|
|
235
|
+
"files": ["components/ui/file-input.jsx"]
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
"name": "input-otp",
|
|
239
|
+
"type": "component",
|
|
240
|
+
"title": "InputOTP",
|
|
241
|
+
"description": "A one-time code in N one-character slots: typing advances, Backspace goes back, arrows move, paste and SMS autofill fill every slot; groups (e.g. [3, 3]) with a separator; digits only by default; onComplete(code); invalid.",
|
|
242
|
+
"tags": ["otp", "one-time code", "verification", "2fa", "pin", "code"],
|
|
243
|
+
"files": ["components/ui/input-otp.jsx"]
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
"name": "command",
|
|
247
|
+
"type": "component",
|
|
248
|
+
"title": "Command, CommandDialog, commandScore, commandFilter",
|
|
249
|
+
"description": "A searchable list of actions (combobox + listbox ARIA, aria-activedescendant): items with icon, label, description, shortcut hint, keywords and groups; fuzzy/substring filtering (commandScore, commandFilter, exported); arrows, Home/End, PageUp/PageDown, Enter; empty and loading states; async onSearch (debounced, stale answers dropped). CommandDialog opens it in a center Sheet (a bottom sheet on a phone) with an optional ⌘K / Ctrl+K hotkey.",
|
|
250
|
+
"tags": ["command", "palette", "cmdk", "search", "spotlight", "quick actions", "jump to", "filter"],
|
|
251
|
+
"files": ["components/ui/command.jsx"]
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
"name": "combobox",
|
|
255
|
+
"type": "component",
|
|
256
|
+
"title": "Combobox",
|
|
257
|
+
"description": "Pick one or many from a searchable list: a field-shaped trigger showing the choice, a Popover panel with a search input and options (icons, descriptions, groups, a count at the right; Command's list and filter); open + onOpenChange or defaultOpen. multiple (chips with remove buttons), searchable={false} (the rich custom-drawn Select), creatable, async onSearch with loading, clearable, disabled, invalid, name for forms; goes inside <Field> by id. On a phone it opens as a bottom Sheet.",
|
|
258
|
+
"tags": ["combobox", "select", "autocomplete", "multi-select", "tags", "typeahead", "picker", "dropdown"],
|
|
259
|
+
"files": ["components/ui/combobox.jsx"]
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
"name": "rating",
|
|
263
|
+
"type": "component",
|
|
264
|
+
"title": "Rating",
|
|
265
|
+
"description": "Stars. Read-only (value of max, default 5; fractional values drawn to the nearest half; one image a reader hears as \"4.5 out of 5\") or, with onChange, an input: a native radio group, arrow keys, each star a 44px target at size md, named \"3 out of 5\". size sm · md; label names what is rated; readOnly, disabled, name for forms. Filled stars wear the primary token, empty ones the border.",
|
|
266
|
+
"tags": ["rating", "stars", "review", "score", "feedback", "reviews", "nps"],
|
|
267
|
+
"files": ["components/ui/rating.jsx"]
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
"name": "feedback",
|
|
271
|
+
"type": "component",
|
|
272
|
+
"title": "Spinner, Skeleton, Progress",
|
|
273
|
+
"description": "Waiting signals. Spinner (size sm · md · lg, currentColor, a label for readers). Skeleton (shape line · circle · rect, sized by className, a gentle pulse). Progress (value of max, or indeterminate with no value; tone neutral · success · warning · danger · info; a label; valueText). Motion stops or slows under prefers-reduced-motion. A Button shows its own spinner with loading.",
|
|
274
|
+
"tags": ["spinner", "loading", "skeleton", "placeholder", "progress", "progress bar", "upload", "busy"],
|
|
275
|
+
"files": ["components/ui/feedback.jsx"]
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
"name": "stat",
|
|
279
|
+
"type": "component",
|
|
280
|
+
"title": "Stat, StatGroup, Delta, StatusDot, Legend, Meter",
|
|
281
|
+
"description": "Numbers at a glance, server-safe, tabular figures. Stat (label, value, unit, caption; tone colours the value for a threshold state; dot; icon; delta; size sm · md · lg). StatGroup (the strip of 2–4 Stats; variant card · divided · bare; columns; two columns on a phone). Delta (a signed change with an arrow, coloured by sign; invert for lower-is-better; zero is neutral; suffix, display, label; variant text · badge; hideValue for the arrow and tone alone, the value still read to a screen reader). StatusDot (tone dot, or hue 1..5 for a category, size sm · md, pulse that stops under reduced motion, label or hideLabel). Legend (items [{ tone or hue, label, count }] as a wrapping row of dots). Meter (value against max, a role=meter: used / limit, a target mark, thresholds [{ at, tone }] in percent, over the limit the bar caps and turns danger and a reader hears \"over by\"; direction higher · lower picks the tone against the target when no tone is given; valueTone colours the value text (or \"bar\"); targetMark={false} hides the tick; tone muted for a plain grey share; size thin · md; shape ring: a circular gauge with the percent (or center) in the middle, size sm · md · lg, same tones, thresholds, target tick and reader words). Tones neutral · primary · success · warning · danger · info.",
|
|
282
|
+
"tags": ["stat", "kpi", "metric", "summary", "stat strip", "delta", "trend", "change", "status dot", "legend", "meter", "usage", "quota", "limit", "budget", "target", "threshold"],
|
|
283
|
+
"files": ["components/ui/stat.jsx"]
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
"name": "distribution",
|
|
287
|
+
"type": "component",
|
|
288
|
+
"title": "Distribution",
|
|
289
|
+
"description": "Parts of one whole as a single stacked bar, server-safe: segments [{ label, value, tone?, hue? }] drawn as shares of their total, thin gaps between them, round ends. Each segment takes a categorical hue by default (segment i gets hue i+1, round 1..5, from --color-chart-N); a status tone (success · warning · danger · info · neutral) overrides it for sentiment; hue pins a category's colour. size thin · md; legend adds a row of dot, label and share %; label names it, and a reader hears every label and share. Zero values are skipped; an empty total draws the empty track. total: shares of a whole larger than the sum, the rest drawn as unfilled track, restLabel names it (\"Free\") in the legend; formatValue shows values (\"$450\") in the legend instead of shares; formatLegend({ label, value, pct, share, rest }) writes the legend text whole.",
|
|
290
|
+
"tags": ["distribution", "stacked bar", "breakdown", "share", "parts of a whole", "composition", "split", "segments", "legend", "category"],
|
|
291
|
+
"files": ["components/ui/distribution.jsx"]
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
"name": "swatch",
|
|
295
|
+
"type": "component",
|
|
296
|
+
"title": "Swatch",
|
|
297
|
+
"description": "A square of a colour that comes from data (a brand colour in an audit row, a label colour a user picked), with a hairline border; color is any CSS colour string; size sm · md; label is the accessible name (none: decoration). The one kit part that sets an inline background from a prop, so no block ever writes one.",
|
|
298
|
+
"tags": ["swatch", "colour", "color", "palette", "brand colour", "colour chip"],
|
|
299
|
+
"files": ["components/ui/swatch.jsx"]
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"name": "steps",
|
|
303
|
+
"type": "component",
|
|
304
|
+
"title": "Steps",
|
|
305
|
+
"description": "Where a job with named stages has got to, server-safe: an ordered list with aria-current=\"step\" and each step's state in words for readers. steps [{ key, label, description, status, meta }] with status complete · current · pending · failed · skipped, or a current index for the simple case. variant dots (markers joined by a line filled up to where the job has got; size md with check, cross and number · sm plain dots; hideStepLabels draws bare markers and gives each step's label to readers only, \"Build, complete\") · bar (one segment per phase, a rollout's 5% → 25% → 100%). orientation horizontal · vertical; a horizontal list with descriptions or meta turns vertical below sm, bare dots and short labels stay in one row. pulse on the current step stops under reduced motion. label + valueText as a header like Progress; onSelect(step, index) makes steps buttons, otherwise it takes no clicks.",
|
|
306
|
+
"tags": ["steps", "stepper", "stages", "phases", "pipeline", "rollout", "timeline", "wizard progress", "checklist", "progress"],
|
|
307
|
+
"files": ["components/ui/steps.jsx"]
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
"name": "separator",
|
|
311
|
+
"type": "component",
|
|
312
|
+
"title": "Separator, Kbd, KbdGroup, AspectRatio",
|
|
313
|
+
"description": "Layout bits. Separator (orientation horizontal · vertical; decorative by default, decorative={false} for a role=separator; label for an \"or\" line). Kbd (one key cap; ⌘ ⇧ ⌥ are spelled out to readers) and KbdGroup (a combo: keys={[\"⌘\", \"K\"]}). AspectRatio (ratio square · video · portrait · photo · wide or a number; its child fills it).",
|
|
314
|
+
"tags": ["separator", "divider", "hr", "kbd", "keyboard", "shortcut", "hotkey", "aspect ratio", "thumbnail", "video"],
|
|
315
|
+
"files": ["components/ui/separator.jsx"]
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
"name": "scroll-area",
|
|
319
|
+
"type": "component",
|
|
320
|
+
"title": "ScrollArea",
|
|
321
|
+
"description": "A bounded box whose content scrolls: orientation vertical · horizontal · both, thin scrollbars in the theme, fade at the edges that have more content past them, and keyboard-focusable (a labelled region) only while it overflows. Bound it with className (max-h-80). ref (and onScroll, aria-busy…) reach the scrolling element, to read and set scrollTop.",
|
|
322
|
+
"tags": ["scroll", "scroll area", "overflow", "list", "carousel", "rail"],
|
|
323
|
+
"files": ["components/ui/scroll-area.jsx"]
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
"name": "toast",
|
|
327
|
+
"type": "component",
|
|
328
|
+
"title": "toast, Toaster",
|
|
329
|
+
"description": "A short line about something that just happened, which leaves on its own. toast(title) and toast.success · .error · .info · .warning(title, { description, action: { label, onClick }, duration, id }); toast.promise(promise, { loading, success, error }); toast.dismiss(id). Needs nothing mounted: the first toast lays its own host in the top layer. <Toaster position visible /> only to choose where they stack (bottom-end · bottom-center · top-end · top-center; full width on a phone). Stacked, fans out and pauses on hover or focus, swipe or × to close, announced through a live region.",
|
|
330
|
+
"tags": ["toast", "snackbar", "notification", "sonner", "flash message", "feedback", "alert"],
|
|
331
|
+
"files": ["components/ui/toast.jsx"]
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
"name": "carousel",
|
|
335
|
+
"type": "component",
|
|
336
|
+
"title": "Carousel",
|
|
337
|
+
"description": "Slides the user moves through, on native CSS scroll-snap: swipe, previous/next buttons, dots (indicator dots · counter · none), arrow keys. itemsPerView a number or { sm, md, lg } (always 1 on a phone); loop off by default; autoplay only when asked for, paused on hover, focus and reduced motion, with a pause button; onChange(index).",
|
|
338
|
+
"tags": ["carousel", "slider", "slideshow", "gallery", "testimonials", "swipe"],
|
|
339
|
+
"files": ["components/ui/carousel.jsx"]
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
"name": "resizable",
|
|
343
|
+
"type": "component",
|
|
344
|
+
"title": "ResizablePanelGroup, ResizablePanel, ResizableHandle",
|
|
345
|
+
"description": "Panes sized by dragging the line between them. Group direction horizontal · vertical, storageKey remembers the sizes; Panel defaultSize and minSize / maxSize in %; Handle is a keyboard-movable separator (arrows, Home/End, Enter folds), grip for a visible grip. Below md a horizontal group stacks its panes and hides the handles.",
|
|
346
|
+
"tags": ["resizable", "split pane", "splitter", "panels", "layout", "master detail"],
|
|
347
|
+
"files": ["components/ui/resizable.jsx"]
|
|
348
|
+
},
|
|
93
349
|
{
|
|
94
350
|
"name": "cx",
|
|
95
351
|
"type": "component",
|