makersclaw 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +41 -1
- package/THIRD-PARTY-NOTICES.md +180 -0
- package/package.json +15 -8
- package/r/annotate.json +62 -0
- package/r/approval-request.json +52 -0
- package/r/audio-player.json +74 -0
- package/r/auth-form.json +55 -0
- package/r/board.json +55 -0
- package/r/calendar-view.json +105 -0
- package/r/cart.json +62 -0
- package/r/chart.json +83 -0
- package/r/chat.json +95 -0
- package/r/code-editor.json +94 -0
- package/r/comment-box.json +64 -0
- package/r/contact-section.json +53 -0
- package/r/core.json +341 -0
- package/r/csv-import.json +63 -0
- package/r/data-table.json +69 -0
- package/r/diagram.json +74 -0
- package/r/doc-editor.json +82 -0
- package/r/doc-page.json +61 -0
- package/r/email-render.json +73 -0
- package/r/faq.json +50 -0
- package/r/file-upload.json +54 -0
- package/r/flow-canvas.json +93 -0
- package/r/footer.json +52 -0
- package/r/gantt.json +70 -0
- package/r/job-panel.json +56 -0
- package/r/json-editor.json +66 -0
- package/r/map.json +89 -0
- package/r/menubar.json +52 -0
- package/r/mind-map.json +67 -0
- package/r/navigation-menu.json +52 -0
- package/r/order-detail.json +54 -0
- package/r/org-chart.json +66 -0
- package/r/page-builder.json +105 -0
- package/r/payment-methods.json +51 -0
- package/r/pdf-document.json +79 -0
- package/r/pdf-viewer.json +88 -0
- package/r/product-detail.json +76 -0
- package/r/product-grid.json +65 -0
- package/r/record-form.json +67 -0
- package/r/record-notes.json +55 -0
- package/r/registry.json +3612 -0
- package/r/search-dialog.json +51 -0
- package/r/settings-list.json +66 -0
- package/r/setup-checklist.json +51 -0
- package/r/share-dialog.json +52 -0
- package/r/sidebar.json +69 -0
- package/r/signature-pad.json +72 -0
- package/r/sketch-canvas.json +99 -0
- package/r/spreadsheet.json +90 -0
- package/r/stat-cards.json +66 -0
- package/r/task-list.json +63 -0
- package/r/task-model.json +98 -0
- package/r/testimonials.json +52 -0
- package/r/transaction-list.json +53 -0
- package/r/whiteboard.json +66 -0
- package/registry/blocks/annotate/README.md +179 -0
- package/registry/blocks/annotate/annotate-data.js +250 -0
- package/registry/blocks/annotate/annotate.jsx +646 -0
- package/registry/blocks/annotate/block.json +10 -0
- package/registry/blocks/annotate/demo.jsx +135 -0
- package/registry/blocks/annotate/index.js +15 -0
- package/registry/blocks/approval-request/README.md +116 -0
- package/registry/blocks/approval-request/approval-request.jsx +386 -0
- package/registry/blocks/approval-request/block.json +10 -0
- package/registry/blocks/approval-request/demo.jsx +127 -0
- package/registry/blocks/approval-request/index.js +4 -0
- package/registry/blocks/audio-player/README.md +167 -0
- package/registry/blocks/audio-player/audio-player.jsx +623 -0
- package/registry/blocks/audio-player/block.json +14 -0
- package/registry/blocks/audio-player/colors.js +109 -0
- package/registry/blocks/audio-player/demo.jsx +209 -0
- package/registry/blocks/audio-player/index.js +6 -0
- package/registry/blocks/audio-player/time.js +67 -0
- package/registry/blocks/audio-player/wavesurfer.js +9 -0
- package/registry/blocks/auth-form/README.md +126 -0
- package/registry/blocks/auth-form/auth-form.jsx +568 -0
- package/registry/blocks/auth-form/block.json +10 -0
- package/registry/blocks/auth-form/demo.jsx +131 -0
- package/registry/blocks/auth-form/index.js +3 -0
- package/registry/blocks/board/README.md +64 -13
- package/registry/blocks/board/block.json +2 -2
- package/registry/blocks/board/board.jsx +237 -94
- package/registry/blocks/board/demo.jsx +103 -24
- package/registry/blocks/calendar-view/README.md +180 -0
- package/registry/blocks/calendar-view/agenda.jsx +147 -0
- package/registry/blocks/calendar-view/block.json +76 -0
- package/registry/blocks/calendar-view/calendar-model.js +442 -0
- package/registry/blocks/calendar-view/calendar.jsx +627 -0
- package/registry/blocks/calendar-view/demo.jsx +195 -0
- package/registry/blocks/calendar-view/draft.jsx +49 -0
- package/registry/blocks/calendar-view/index.js +39 -0
- package/registry/blocks/calendar-view/month.jsx +346 -0
- package/registry/blocks/calendar-view/paint.js +69 -0
- package/registry/blocks/calendar-view/time-grid.jsx +527 -0
- package/registry/blocks/calendar-view/tray.jsx +87 -0
- package/registry/blocks/cart/README.md +146 -0
- package/registry/blocks/cart/block.json +10 -0
- package/registry/blocks/cart/cart.jsx +597 -0
- package/registry/blocks/cart/demo.jsx +98 -0
- package/registry/blocks/cart/index.js +4 -0
- package/registry/blocks/cart/money.js +28 -0
- package/registry/blocks/chart/README.md +316 -0
- package/registry/blocks/chart/block.json +10 -0
- package/registry/blocks/chart/cartesian.jsx +642 -0
- package/registry/blocks/chart/core.jsx +262 -0
- package/registry/blocks/chart/demo.jsx +357 -0
- package/registry/blocks/chart/heatmap.jsx +336 -0
- package/registry/blocks/chart/index.js +8 -0
- package/registry/blocks/chart/pie.jsx +245 -0
- package/registry/blocks/chart/sparkline.jsx +88 -0
- package/registry/blocks/chat/README.md +273 -0
- package/registry/blocks/chat/attachment.jsx +95 -0
- package/registry/blocks/chat/block.json +10 -0
- package/registry/blocks/chat/chat.jsx +132 -0
- package/registry/blocks/chat/composer.jsx +364 -0
- package/registry/blocks/chat/demo.jsx +578 -0
- package/registry/blocks/chat/header.jsx +34 -0
- package/registry/blocks/chat/index.js +9 -0
- package/registry/blocks/chat/message.jsx +450 -0
- package/registry/blocks/chat/scroller.jsx +247 -0
- package/registry/blocks/chat/text.jsx +104 -0
- package/registry/blocks/code-editor/README.md +210 -0
- package/registry/blocks/code-editor/block.json +22 -0
- package/registry/blocks/code-editor/code-editor.jsx +534 -0
- package/registry/blocks/code-editor/codemirror.js +38 -0
- package/registry/blocks/code-editor/demo.jsx +205 -0
- package/registry/blocks/code-editor/index.js +8 -0
- package/registry/blocks/code-editor/json.js +317 -0
- package/registry/blocks/code-editor/sql.js +136 -0
- package/registry/blocks/code-editor/text.js +101 -0
- package/registry/blocks/code-editor/theme.js +186 -0
- package/registry/blocks/comment-box/README.md +123 -0
- package/registry/blocks/comment-box/block.json +10 -0
- package/registry/blocks/comment-box/comment-body.jsx +217 -0
- package/registry/blocks/comment-box/comment-box.jsx +198 -0
- package/registry/blocks/comment-box/comment-time.jsx +77 -0
- package/registry/blocks/comment-box/demo.jsx +141 -0
- package/registry/blocks/comment-box/index.js +8 -0
- package/registry/blocks/contact-section/README.md +152 -0
- package/registry/blocks/contact-section/block.json +11 -0
- package/registry/blocks/contact-section/contact-section.jsx +509 -0
- package/registry/blocks/contact-section/demo.jsx +93 -0
- package/registry/blocks/contact-section/index.js +4 -0
- package/registry/blocks/csv-import/README.md +133 -0
- package/registry/blocks/csv-import/block.json +13 -0
- package/registry/blocks/csv-import/csv-import.jsx +479 -0
- package/registry/blocks/csv-import/demo.jsx +106 -0
- package/registry/blocks/csv-import/import.js +200 -0
- package/registry/blocks/csv-import/index.js +7 -0
- package/registry/blocks/data-table/README.md +386 -0
- package/registry/blocks/data-table/block.json +10 -0
- package/registry/blocks/data-table/data-table.jsx +1164 -0
- package/registry/blocks/data-table/demo.jsx +588 -0
- package/registry/blocks/data-table/index.js +5 -0
- package/registry/blocks/data-table/model.js +169 -0
- package/registry/blocks/diagram/README.md +108 -0
- package/registry/blocks/diagram/block.json +13 -0
- package/registry/blocks/diagram/demo.jsx +113 -0
- package/registry/blocks/diagram/diagram.jsx +481 -0
- package/registry/blocks/diagram/index.js +7 -0
- package/registry/blocks/diagram/mermaid.js +52 -0
- package/registry/blocks/diagram/palette.js +313 -0
- package/registry/blocks/diagram/source.js +98 -0
- package/registry/blocks/doc-editor/README.md +215 -0
- package/registry/blocks/doc-editor/block.json +15 -0
- package/registry/blocks/doc-editor/demo.jsx +225 -0
- package/registry/blocks/doc-editor/doc-editor.jsx +291 -0
- package/registry/blocks/doc-editor/doc.js +309 -0
- package/registry/blocks/doc-editor/index.js +7 -0
- package/registry/blocks/doc-editor/schema.jsx +56 -0
- package/registry/blocks/doc-editor/shadcn-classes.js +110 -0
- package/registry/blocks/doc-editor/theme.js +82 -0
- package/registry/blocks/doc-page/README.md +119 -0
- package/registry/blocks/doc-page/autosave.js +104 -0
- package/registry/blocks/doc-page/block.json +10 -0
- package/registry/blocks/doc-page/demo.jsx +137 -0
- package/registry/blocks/doc-page/doc-page.jsx +276 -0
- package/registry/blocks/doc-page/index.js +4 -0
- package/registry/blocks/email-render/README.md +151 -0
- package/registry/blocks/email-render/block.json +14 -0
- package/registry/blocks/email-render/demo.jsx +153 -0
- package/registry/blocks/email-render/doc-email.jsx +210 -0
- package/registry/blocks/email-render/email.jsx +221 -0
- package/registry/blocks/email-render/index.js +10 -0
- package/registry/blocks/email-render/render.js +50 -0
- package/registry/blocks/email-render/theme.js +215 -0
- package/registry/blocks/faq/README.md +101 -0
- package/registry/blocks/faq/block.json +11 -0
- package/registry/blocks/faq/demo.jsx +89 -0
- package/registry/blocks/faq/faq.jsx +220 -0
- package/registry/blocks/faq/index.js +4 -0
- package/registry/blocks/file-upload/README.md +138 -0
- package/registry/blocks/file-upload/block.json +10 -0
- package/registry/blocks/file-upload/demo.jsx +204 -0
- package/registry/blocks/file-upload/file-upload.jsx +635 -0
- package/registry/blocks/file-upload/index.js +4 -0
- package/registry/blocks/flow-canvas/README.md +420 -0
- package/registry/blocks/flow-canvas/block.json +13 -0
- package/registry/blocks/flow-canvas/board.js +819 -0
- package/registry/blocks/flow-canvas/chrome.jsx +649 -0
- package/registry/blocks/flow-canvas/context.jsx +35 -0
- package/registry/blocks/flow-canvas/demo.jsx +249 -0
- package/registry/blocks/flow-canvas/edges.jsx +107 -0
- package/registry/blocks/flow-canvas/flow-canvas.jsx +1329 -0
- package/registry/blocks/flow-canvas/index.js +41 -0
- package/registry/blocks/flow-canvas/nodes.jsx +392 -0
- package/registry/blocks/flow-canvas/theme.js +174 -0
- package/registry/blocks/footer/README.md +133 -0
- package/registry/blocks/footer/block.json +11 -0
- package/registry/blocks/footer/demo.jsx +119 -0
- package/registry/blocks/footer/footer.jsx +406 -0
- package/registry/blocks/footer/index.js +4 -0
- package/registry/blocks/gantt/README.md +220 -0
- package/registry/blocks/gantt/block.json +10 -0
- package/registry/blocks/gantt/demo.jsx +148 -0
- package/registry/blocks/gantt/gantt.jsx +923 -0
- package/registry/blocks/gantt/index.js +7 -0
- package/registry/blocks/gantt/rows.jsx +468 -0
- package/registry/blocks/gantt/schedule.js +278 -0
- package/registry/blocks/job-panel/README.md +86 -2
- package/registry/blocks/job-panel/block.json +3 -3
- package/registry/blocks/job-panel/demo.jsx +230 -3
- package/registry/blocks/job-panel/job-panel.jsx +169 -3
- package/registry/blocks/json-editor/README.md +133 -0
- package/registry/blocks/json-editor/block.json +10 -0
- package/registry/blocks/json-editor/demo.jsx +92 -0
- package/registry/blocks/json-editor/index.js +7 -0
- package/registry/blocks/json-editor/json-editor.jsx +305 -0
- package/registry/blocks/json-editor/json-tree.jsx +393 -0
- package/registry/blocks/json-editor/tree.js +225 -0
- package/registry/blocks/map/README.md +221 -0
- package/registry/blocks/map/block.json +14 -0
- package/registry/blocks/map/demo.jsx +201 -0
- package/registry/blocks/map/geo.js +198 -0
- package/registry/blocks/map/index.js +8 -0
- package/registry/blocks/map/list.jsx +128 -0
- package/registry/blocks/map/map-view.jsx +715 -0
- package/registry/blocks/map/maplibre.js +30 -0
- package/registry/blocks/map/marks.jsx +146 -0
- package/registry/blocks/map/theme.js +142 -0
- package/registry/blocks/menubar/README.md +109 -0
- package/registry/blocks/menubar/block.json +10 -0
- package/registry/blocks/menubar/demo.jsx +128 -0
- package/registry/blocks/menubar/index.js +4 -0
- package/registry/blocks/menubar/menubar.jsx +199 -0
- package/registry/blocks/mind-map/README.md +206 -0
- package/registry/blocks/mind-map/block.json +10 -0
- package/registry/blocks/mind-map/demo.jsx +103 -0
- package/registry/blocks/mind-map/index.js +31 -0
- package/registry/blocks/mind-map/mind-map.jsx +1125 -0
- package/registry/blocks/mind-map/topic.jsx +143 -0
- package/registry/blocks/mind-map/tree.js +645 -0
- package/registry/blocks/navigation-menu/README.md +124 -0
- package/registry/blocks/navigation-menu/block.json +10 -0
- package/registry/blocks/navigation-menu/demo.jsx +84 -0
- package/registry/blocks/navigation-menu/index.js +4 -0
- package/registry/blocks/navigation-menu/navigation-menu.jsx +448 -0
- package/registry/blocks/order-detail/README.md +109 -0
- package/registry/blocks/order-detail/block.json +10 -0
- package/registry/blocks/order-detail/demo.jsx +88 -0
- package/registry/blocks/order-detail/index.js +4 -0
- package/registry/blocks/order-detail/order-detail.jsx +354 -0
- package/registry/blocks/org-chart/README.md +145 -0
- package/registry/blocks/org-chart/block.json +10 -0
- package/registry/blocks/org-chart/demo.jsx +94 -0
- package/registry/blocks/org-chart/index.js +7 -0
- package/registry/blocks/org-chart/org-chart.jsx +631 -0
- package/registry/blocks/org-chart/org.js +245 -0
- package/registry/blocks/org-chart/person.jsx +96 -0
- package/registry/blocks/page-builder/README.md +257 -0
- package/registry/blocks/page-builder/block.json +14 -0
- package/registry/blocks/page-builder/demo.jsx +145 -0
- package/registry/blocks/page-builder/grapes.js +18 -0
- package/registry/blocks/page-builder/index.js +11 -0
- package/registry/blocks/page-builder/page-builder.jsx +704 -0
- package/registry/blocks/page-builder/page-view.jsx +33 -0
- package/registry/blocks/page-builder/page.js +118 -0
- package/registry/blocks/page-builder/panels.jsx +588 -0
- package/registry/blocks/page-builder/sections.js +209 -0
- package/registry/blocks/page-builder/theme.js +87 -0
- package/registry/blocks/page-builder/thumbs.jsx +189 -0
- package/registry/blocks/page-builder/tokens.js +329 -0
- package/registry/blocks/payment-methods/README.md +104 -0
- package/registry/blocks/payment-methods/block.json +10 -0
- package/registry/blocks/payment-methods/demo.jsx +71 -0
- package/registry/blocks/payment-methods/index.js +4 -0
- package/registry/blocks/payment-methods/payment-methods.jsx +302 -0
- package/registry/blocks/pdf-document/README.md +213 -0
- package/registry/blocks/pdf-document/block.json +13 -0
- package/registry/blocks/pdf-document/demo.jsx +136 -0
- package/registry/blocks/pdf-document/index.js +33 -0
- package/registry/blocks/pdf-document/money.js +83 -0
- package/registry/blocks/pdf-document/pdf-document.jsx +144 -0
- package/registry/blocks/pdf-document/primitives.jsx +271 -0
- package/registry/blocks/pdf-document/quote.jsx +179 -0
- package/registry/blocks/pdf-document/theme.js +193 -0
- package/registry/blocks/pdf-viewer/README.md +191 -0
- package/registry/blocks/pdf-viewer/block.json +14 -0
- package/registry/blocks/pdf-viewer/demo.jsx +252 -0
- package/registry/blocks/pdf-viewer/helpers.js +270 -0
- package/registry/blocks/pdf-viewer/index.js +8 -0
- package/registry/blocks/pdf-viewer/notes.jsx +195 -0
- package/registry/blocks/pdf-viewer/pdf-viewer.jsx +1368 -0
- package/registry/blocks/pdf-viewer/pdfjs.js +37 -0
- package/registry/blocks/pdf-viewer/ssr-shim-end.js +6 -0
- package/registry/blocks/pdf-viewer/ssr-shim.js +44 -0
- package/registry/blocks/product-detail/README.md +217 -0
- package/registry/blocks/product-detail/block.json +10 -0
- package/registry/blocks/product-detail/demo.jsx +233 -0
- package/registry/blocks/product-detail/index.js +7 -0
- package/registry/blocks/product-detail/price.jsx +115 -0
- package/registry/blocks/product-detail/product-detail.jsx +348 -0
- package/registry/blocks/product-detail/product-media.jsx +102 -0
- package/registry/blocks/product-detail/product-options.jsx +144 -0
- package/registry/blocks/product-grid/README.md +162 -0
- package/registry/blocks/product-grid/block.json +10 -0
- package/registry/blocks/product-grid/demo.jsx +255 -0
- package/registry/blocks/product-grid/index.js +5 -0
- package/registry/blocks/product-grid/product-card.jsx +232 -0
- package/registry/blocks/product-grid/product-grid.jsx +235 -0
- package/registry/blocks/record-form/README.md +196 -0
- package/registry/blocks/record-form/block.json +10 -0
- package/registry/blocks/record-form/demo.jsx +525 -0
- package/registry/blocks/record-form/index.js +4 -0
- package/registry/blocks/record-form/record-fields.jsx +457 -0
- package/registry/blocks/record-form/record-form.jsx +415 -0
- package/registry/blocks/record-form/rules.js +81 -0
- package/registry/blocks/record-notes/README.md +139 -0
- package/registry/blocks/record-notes/block.json +10 -0
- package/registry/blocks/record-notes/demo.jsx +179 -0
- package/registry/blocks/record-notes/index.js +4 -0
- package/registry/blocks/record-notes/record-notes.jsx +266 -0
- package/registry/blocks/search-dialog/README.md +108 -0
- package/registry/blocks/search-dialog/block.json +10 -0
- package/registry/blocks/search-dialog/demo.jsx +116 -0
- package/registry/blocks/search-dialog/index.js +3 -0
- package/registry/blocks/search-dialog/search-dialog.jsx +235 -0
- package/registry/blocks/settings-list/README.md +171 -0
- package/registry/blocks/settings-list/block.json +10 -0
- package/registry/blocks/settings-list/demo.jsx +333 -0
- package/registry/blocks/settings-list/index.js +4 -0
- package/registry/blocks/settings-list/row-state.jsx +93 -0
- package/registry/blocks/settings-list/settings-list.jsx +349 -0
- package/registry/blocks/settings-list/settings-matrix.jsx +118 -0
- package/registry/blocks/setup-checklist/README.md +142 -0
- package/registry/blocks/setup-checklist/block.json +10 -0
- package/registry/blocks/setup-checklist/demo.jsx +159 -0
- package/registry/blocks/setup-checklist/index.js +4 -0
- package/registry/blocks/setup-checklist/setup-checklist.jsx +446 -0
- package/registry/blocks/share-dialog/README.md +113 -0
- package/registry/blocks/share-dialog/block.json +10 -0
- package/registry/blocks/share-dialog/demo.jsx +140 -0
- package/registry/blocks/share-dialog/index.js +3 -0
- package/registry/blocks/share-dialog/share-dialog.jsx +384 -0
- package/registry/blocks/sidebar/README.md +190 -0
- package/registry/blocks/sidebar/block.json +43 -0
- package/registry/blocks/sidebar/demo.jsx +577 -0
- package/registry/blocks/sidebar/index.js +4 -0
- package/registry/blocks/sidebar/sidebar-panel.jsx +149 -0
- package/registry/blocks/sidebar/sidebar.jsx +864 -0
- package/registry/blocks/signature-pad/README.md +137 -0
- package/registry/blocks/signature-pad/block.json +13 -0
- package/registry/blocks/signature-pad/colors.js +115 -0
- package/registry/blocks/signature-pad/demo.jsx +94 -0
- package/registry/blocks/signature-pad/index.js +6 -0
- package/registry/blocks/signature-pad/pad.js +7 -0
- package/registry/blocks/signature-pad/signature-pad.jsx +434 -0
- package/registry/blocks/signature-pad/signature.js +68 -0
- package/registry/blocks/sketch-canvas/README.md +280 -0
- package/registry/blocks/sketch-canvas/block.json +13 -0
- package/registry/blocks/sketch-canvas/demo.jsx +159 -0
- package/registry/blocks/sketch-canvas/excalidraw.js +40 -0
- package/registry/blocks/sketch-canvas/index.js +9 -0
- package/registry/blocks/sketch-canvas/palette.js +226 -0
- package/registry/blocks/sketch-canvas/sketch-canvas.jsx +1188 -0
- package/registry/blocks/sketch-canvas/sketch.js +179 -0
- package/registry/blocks/sketch-canvas/ssr-shim-end.js +6 -0
- package/registry/blocks/sketch-canvas/ssr-shim.js +45 -0
- package/registry/blocks/sketch-canvas/stamps.js +104 -0
- package/registry/blocks/sketch-canvas/theme.js +131 -0
- package/registry/blocks/spreadsheet/README.md +307 -0
- package/registry/blocks/spreadsheet/block.json +13 -0
- package/registry/blocks/spreadsheet/cells.jsx +455 -0
- package/registry/blocks/spreadsheet/chrome.jsx +325 -0
- package/registry/blocks/spreadsheet/demo.jsx +177 -0
- package/registry/blocks/spreadsheet/grid.js +387 -0
- package/registry/blocks/spreadsheet/index.js +34 -0
- package/registry/blocks/spreadsheet/spreadsheet.jsx +1732 -0
- package/registry/blocks/spreadsheet/types.js +473 -0
- package/registry/blocks/stat-cards/README.md +173 -0
- package/registry/blocks/stat-cards/block.json +10 -0
- package/registry/blocks/stat-cards/demo.jsx +257 -0
- package/registry/blocks/stat-cards/index.js +4 -0
- package/registry/blocks/stat-cards/stat-cards.jsx +307 -0
- package/registry/blocks/stat-cards/usage.jsx +243 -0
- package/registry/blocks/task-list/README.md +176 -0
- package/registry/blocks/task-list/block.json +10 -0
- package/registry/blocks/task-list/demo.jsx +134 -0
- package/registry/blocks/task-list/index.js +5 -0
- package/registry/blocks/task-list/task-list.jsx +907 -0
- package/registry/blocks/task-model/README.md +455 -0
- package/registry/blocks/task-model/block.json +167 -0
- package/registry/blocks/task-model/changes.js +89 -0
- package/registry/blocks/task-model/dates.js +371 -0
- package/registry/blocks/task-model/demo.jsx +215 -0
- package/registry/blocks/task-model/dnd.jsx +240 -0
- package/registry/blocks/task-model/index.js +97 -0
- package/registry/blocks/task-model/model.js +919 -0
- package/registry/blocks/task-model/parts.jsx +449 -0
- package/registry/blocks/task-model/toolbar.jsx +271 -0
- package/registry/blocks/testimonials/README.md +139 -0
- package/registry/blocks/testimonials/block.json +11 -0
- package/registry/blocks/testimonials/demo.jsx +137 -0
- package/registry/blocks/testimonials/index.js +4 -0
- package/registry/blocks/testimonials/testimonials.jsx +430 -0
- package/registry/blocks/transaction-list/README.md +126 -0
- package/registry/blocks/transaction-list/block.json +10 -0
- package/registry/blocks/transaction-list/demo.jsx +79 -0
- package/registry/blocks/transaction-list/index.js +4 -0
- package/registry/blocks/transaction-list/transaction-list.jsx +383 -0
- package/registry/blocks/whiteboard/README.md +179 -0
- package/registry/blocks/whiteboard/block.json +10 -0
- package/registry/blocks/whiteboard/demo.jsx +169 -0
- package/registry/blocks/whiteboard/index.js +6 -0
- package/registry/blocks/whiteboard/templates.js +150 -0
- package/registry/blocks/whiteboard/whiteboard.jsx +721 -0
- package/src/install.mjs +18 -0
- package/src/shadcn.mjs +171 -0
- package/templates/next/files/README.md +145 -11
- package/templates/next/files/app/globals.css +55 -4
- package/templates/next/files/check/run.mjs +3 -3
- package/templates/next/files/components/parts/fixture.jsx +1 -1
- package/templates/next/files/components/parts/sample.js +15 -0
- package/templates/next/files/components/ui/avatar.jsx +141 -0
- package/templates/next/files/components/ui/breadcrumb.jsx +149 -0
- package/templates/next/files/components/ui/button-group.jsx +70 -0
- package/templates/next/files/components/ui/button.jsx +132 -12
- package/templates/next/files/components/ui/calendar.jsx +609 -0
- package/templates/next/files/components/ui/carousel.jsx +281 -0
- package/templates/next/files/components/ui/collapsible.jsx +208 -0
- package/templates/next/files/components/ui/combobox.jsx +608 -0
- package/templates/next/files/components/ui/command.jsx +577 -0
- package/templates/next/files/components/ui/context-menu.jsx +191 -0
- package/templates/next/files/components/ui/date-picker.jsx +360 -0
- package/templates/next/files/components/ui/distribution.jsx +117 -0
- package/templates/next/files/components/ui/feedback.jsx +143 -0
- package/templates/next/files/components/ui/field.jsx +115 -3
- package/templates/next/files/components/ui/file-input.jsx +234 -0
- package/templates/next/files/components/ui/icon.jsx +130 -8
- package/templates/next/files/components/ui/image.jsx +143 -0
- package/templates/next/files/components/ui/index.js +47 -2
- package/templates/next/files/components/ui/input-group.jsx +213 -0
- package/templates/next/files/components/ui/input-otp.jsx +170 -0
- package/templates/next/files/components/ui/item.jsx +206 -0
- package/templates/next/files/components/ui/menu.jsx +454 -82
- package/templates/next/files/components/ui/notice.jsx +126 -14
- package/templates/next/files/components/ui/pagination.jsx +156 -0
- package/templates/next/files/components/ui/popover.jsx +284 -0
- package/templates/next/files/components/ui/radio.jsx +193 -0
- package/templates/next/files/components/ui/rating.jsx +131 -0
- package/templates/next/files/components/ui/resizable.jsx +338 -0
- package/templates/next/files/components/ui/scroll-area.jsx +123 -0
- package/templates/next/files/components/ui/separator.jsx +119 -0
- package/templates/next/files/components/ui/sheet.jsx +96 -11
- package/templates/next/files/components/ui/slider.jsx +174 -0
- package/templates/next/files/components/ui/stat.jsx +574 -0
- package/templates/next/files/components/ui/steps.jsx +338 -0
- package/templates/next/files/components/ui/swatch.jsx +33 -0
- package/templates/next/files/components/ui/table.jsx +130 -0
- package/templates/next/files/components/ui/toast.jsx +440 -0
- package/templates/next/files/components/ui/toggle.jsx +195 -0
- package/templates/next/files/components/ui/tooltip.jsx +270 -0
- package/templates/next/files/lib/sample.js +4 -12
- package/templates/next/template.json +264 -8
|
@@ -0,0 +1,577 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// The Sidebar with a page beside it, state in memory — the gallery's and
|
|
4
|
+
// the smoke test's surface. Not installed into apps: `makersclaw add
|
|
5
|
+
// sidebar` lays index.js, sidebar.jsx and sidebar-panel.jsx only. Items
|
|
6
|
+
// use onSelect here so the gallery frame never navigates; an app passes
|
|
7
|
+
// `href`. The switcher at the top shows each shape the block takes:
|
|
8
|
+
// today's column, inset, floating, ⌘K search with folding groups, a mail
|
|
9
|
+
// panel, drill-in (a column, or in place) and a chat history with menus.
|
|
10
|
+
import { useState } from "react";
|
|
11
|
+
import { Avatar, Badge, Card, Field, Icon, Menu, Progress, Select, ToggleGroup, toast } from "../components/ui";
|
|
12
|
+
import { Sidebar, SidebarLayout, SidebarTrigger } from "../components/blocks/sidebar";
|
|
13
|
+
|
|
14
|
+
const VARIANTS = [
|
|
15
|
+
{ value: "default", label: "Column (default)" },
|
|
16
|
+
{ value: "inset", label: "Inset" },
|
|
17
|
+
{ value: "floating", label: "Floating" },
|
|
18
|
+
{ value: "search", label: "⌘K search + folding groups" },
|
|
19
|
+
{ value: "panel", label: "Mail panel" },
|
|
20
|
+
{ value: "drill-panel", label: "Drill-in: second column" },
|
|
21
|
+
{ value: "drill-replace", label: "Drill-in: in place" },
|
|
22
|
+
{ value: "chat", label: "Chat history with menus" },
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
const PAGES = {
|
|
26
|
+
inbox: { title: "Inbox", blurb: "Replies and new leads waiting on you." },
|
|
27
|
+
deals: { title: "Deals", blurb: "Everything open in the pipeline." },
|
|
28
|
+
contacts: { title: "Contacts", blurb: "People at the companies you sell to." },
|
|
29
|
+
reports: { title: "Reports", blurb: "How the quarter is going." },
|
|
30
|
+
settings: { title: "Settings", blurb: "Your workspace, team and billing." },
|
|
31
|
+
"p-renewals": { title: "Q3 renewals", blurb: "Accounts up for renewal before October." },
|
|
32
|
+
"p-expansion": { title: "Northwind expansion", blurb: "Three new teams at Northwind." },
|
|
33
|
+
"p-partners": { title: "Partner launch", blurb: "Co-selling with two agencies." },
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const THREADS = [
|
|
37
|
+
{ from: "Maya Okafor", company: "Northwind", line: "Can we move the call to Thursday?", when: "9:12" },
|
|
38
|
+
{ from: "Leon Brandt", company: "Acme Ltd", line: "Signed copy attached, thanks!", when: "8:40" },
|
|
39
|
+
{ from: "Priya Raman", company: "Globex", line: "Who owns onboarding on your side?", when: "Yesterday" },
|
|
40
|
+
{ from: "Tom Ellery", company: "Initech", line: "Pricing for 40 seats, please.", when: "Mon" },
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
const ME = { name: "Dana Whitfield", email: "dana@harbor.io" };
|
|
44
|
+
const USER_MENU = [
|
|
45
|
+
{ label: "Account", icon: "user", onSelect: () => toast("Account opened") },
|
|
46
|
+
{ label: "Notifications", icon: "bell", onSelect: () => toast("Notifications opened") },
|
|
47
|
+
{ label: "Sign out", icon: "log-out", tone: "danger", onSelect: () => toast("Signed out") },
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
export default function SidebarDemo() {
|
|
51
|
+
const [variant, setVariant] = useState("default");
|
|
52
|
+
const Shape = SHAPES[variant] ?? DefaultShape;
|
|
53
|
+
return (
|
|
54
|
+
<div className="grid gap-3">
|
|
55
|
+
<Field id="sidebar-demo-variant" label="Shape" className="max-w-xs">
|
|
56
|
+
<Select id="sidebar-demo-variant" value={variant} onChange={(e) => setVariant(e.target.value)} options={VARIANTS} />
|
|
57
|
+
</Field>
|
|
58
|
+
<Shape key={variant} />
|
|
59
|
+
</div>
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ─── the page beside the sidebar ─────────────────────────────────────────
|
|
64
|
+
|
|
65
|
+
function Header({ title }) {
|
|
66
|
+
return (
|
|
67
|
+
<header className="flex min-h-14 items-center gap-2 border-b border-border px-2 sm:px-4">
|
|
68
|
+
<SidebarTrigger />
|
|
69
|
+
<div className="min-w-0">
|
|
70
|
+
<h1 className="truncate text-base font-semibold">{title}</h1>
|
|
71
|
+
</div>
|
|
72
|
+
</header>
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function SimplePage({ title, blurb, children }) {
|
|
77
|
+
return (
|
|
78
|
+
<>
|
|
79
|
+
<Header title={title} />
|
|
80
|
+
<div className="grid flex-1 grid-cols-1 content-start gap-4 p-4 sm:p-6">
|
|
81
|
+
{blurb ? <p className="text-sm text-muted-foreground">{blurb}</p> : null}
|
|
82
|
+
{children}
|
|
83
|
+
</div>
|
|
84
|
+
</>
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function CrmPage({ page }) {
|
|
89
|
+
const current = PAGES[page] ?? { title: page, blurb: "" };
|
|
90
|
+
return (
|
|
91
|
+
<SimplePage title={current.title} blurb={current.blurb}>
|
|
92
|
+
<div className="grid gap-3 sm:grid-cols-3">
|
|
93
|
+
<Card>
|
|
94
|
+
<p className="text-xs text-muted-foreground">Open deals</p>
|
|
95
|
+
<p data-nums className="mt-1 text-2xl font-semibold">38</p>
|
|
96
|
+
</Card>
|
|
97
|
+
<Card>
|
|
98
|
+
<p className="text-xs text-muted-foreground">Pipeline</p>
|
|
99
|
+
<p data-nums className="mt-1 text-2xl font-semibold">$1.24M</p>
|
|
100
|
+
</Card>
|
|
101
|
+
<Card>
|
|
102
|
+
<p className="text-xs text-muted-foreground">Won this month</p>
|
|
103
|
+
<p data-nums className="mt-1 text-2xl font-semibold">$86k</p>
|
|
104
|
+
</Card>
|
|
105
|
+
</div>
|
|
106
|
+
<Card title="Latest">
|
|
107
|
+
<ul className="divide-y divide-border">
|
|
108
|
+
{THREADS.map((t) => (
|
|
109
|
+
<li key={t.from} className="flex items-center gap-3 py-3">
|
|
110
|
+
<Avatar name={t.from} size="sm" />
|
|
111
|
+
<div className="min-w-0 flex-1">
|
|
112
|
+
<p className="truncate text-sm font-medium">
|
|
113
|
+
{t.from} <span className="font-normal text-muted-foreground">· {t.company}</span>
|
|
114
|
+
</p>
|
|
115
|
+
<p className="truncate text-sm text-muted-foreground">{t.line}</p>
|
|
116
|
+
</div>
|
|
117
|
+
<Badge className="shrink-0">{t.when}</Badge>
|
|
118
|
+
</li>
|
|
119
|
+
))}
|
|
120
|
+
</ul>
|
|
121
|
+
</Card>
|
|
122
|
+
</SimplePage>
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// ─── the CRM nav most shapes share ───────────────────────────────────────
|
|
127
|
+
|
|
128
|
+
function useCrmNav() {
|
|
129
|
+
const [page, setPage] = useState("inbox");
|
|
130
|
+
const [workspace, setWorkspace] = useState("Harbor Sales");
|
|
131
|
+
const item = (key, label, icon, extra) => ({ key, label, icon, active: page === key, onSelect: () => setPage(key), ...extra });
|
|
132
|
+
const groups = [
|
|
133
|
+
{
|
|
134
|
+
label: "Workspace",
|
|
135
|
+
items: [
|
|
136
|
+
item("inbox", "Inbox", "inbox", { badge: 12 }),
|
|
137
|
+
item("deals", "Deals", "dollar", { badge: 4 }),
|
|
138
|
+
item("contacts", "Contacts", "users"),
|
|
139
|
+
item("reports", "Reports", "chart"),
|
|
140
|
+
],
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
label: "Projects",
|
|
144
|
+
items: [
|
|
145
|
+
{
|
|
146
|
+
key: "projects",
|
|
147
|
+
label: "Projects",
|
|
148
|
+
icon: "folder",
|
|
149
|
+
badge: 3,
|
|
150
|
+
items: [item("p-renewals", "Q3 renewals"), item("p-expansion", "Northwind expansion"), item("p-partners", "Partner launch")],
|
|
151
|
+
},
|
|
152
|
+
],
|
|
153
|
+
},
|
|
154
|
+
{ items: [item("settings", "Settings", "settings")] },
|
|
155
|
+
];
|
|
156
|
+
const switcher = ["Harbor Sales", "Harbor Support", "Personal"].map((name) => ({
|
|
157
|
+
label: name,
|
|
158
|
+
icon: name === workspace ? "check" : undefined,
|
|
159
|
+
onSelect: () => setWorkspace(name),
|
|
160
|
+
}));
|
|
161
|
+
return { page, setPage, workspace, groups, switcher };
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const TARGET = (
|
|
165
|
+
<div className="mt-2 rounded-md border border-border bg-card p-3">
|
|
166
|
+
<Progress value={64} label="Q3 target" valueText="$412k of $640k" />
|
|
167
|
+
</div>
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
// 1. Today's sidebar, unchanged.
|
|
171
|
+
function DefaultShape() {
|
|
172
|
+
const { page, workspace, groups, switcher } = useCrmNav();
|
|
173
|
+
return (
|
|
174
|
+
<SidebarLayout
|
|
175
|
+
storageKey="demo.sidebar"
|
|
176
|
+
className="min-h-[600px] overflow-hidden rounded-lg border border-border"
|
|
177
|
+
sidebar={
|
|
178
|
+
<Sidebar title={workspace} subtitle="Pro plan" switcher={switcher} groups={groups} user={ME} userMenu={USER_MENU}>
|
|
179
|
+
{TARGET}
|
|
180
|
+
</Sidebar>
|
|
181
|
+
}
|
|
182
|
+
>
|
|
183
|
+
<CrmPage page={page} />
|
|
184
|
+
</SidebarLayout>
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const NOTICES = [
|
|
189
|
+
{ who: "Maya Okafor", what: "replied to Renewal terms", when: "4m" },
|
|
190
|
+
{ who: "Leon Brandt", what: "signed the Acme order form", when: "1h" },
|
|
191
|
+
{ who: "Priya Raman", what: "booked a call for Thursday", when: "3h" },
|
|
192
|
+
];
|
|
193
|
+
|
|
194
|
+
function Bell() {
|
|
195
|
+
return (
|
|
196
|
+
<Menu
|
|
197
|
+
label="Notifications, 3 new"
|
|
198
|
+
trigger={<BellIcon />}
|
|
199
|
+
items={[
|
|
200
|
+
{ type: "label", label: "Recent" },
|
|
201
|
+
...NOTICES.map((n) => ({ label: n.who, description: `${n.what} · ${n.when}`, icon: "user", onSelect: () => toast(`Opened ${n.who}`) })),
|
|
202
|
+
{ type: "separator" },
|
|
203
|
+
{ label: "See all notifications", icon: "bell", onSelect: () => toast("All notifications") },
|
|
204
|
+
]}
|
|
205
|
+
/>
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function BellIcon() {
|
|
210
|
+
return (
|
|
211
|
+
<span className="relative inline-flex">
|
|
212
|
+
<Icon name="bell" />
|
|
213
|
+
<span aria-hidden="true" className="absolute -right-0.5 -top-0.5 size-1.5 rounded-full bg-primary" />
|
|
214
|
+
</span>
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// 2 & 3. Inset and floating: the bell in the header, the switcher at the foot.
|
|
219
|
+
function FramedShape({ variant }) {
|
|
220
|
+
const { page, workspace, groups, switcher } = useCrmNav();
|
|
221
|
+
return (
|
|
222
|
+
<SidebarLayout
|
|
223
|
+
storageKey="demo.sidebar"
|
|
224
|
+
className="min-h-[600px] overflow-hidden rounded-lg border border-border"
|
|
225
|
+
sidebar={
|
|
226
|
+
<Sidebar
|
|
227
|
+
variant={variant}
|
|
228
|
+
title={workspace}
|
|
229
|
+
subtitle="Pro plan"
|
|
230
|
+
switcher={switcher}
|
|
231
|
+
switcherPlacement="footer"
|
|
232
|
+
headerActions={<Bell />}
|
|
233
|
+
groups={groups}
|
|
234
|
+
user={ME}
|
|
235
|
+
userMenu={USER_MENU}
|
|
236
|
+
/>
|
|
237
|
+
}
|
|
238
|
+
>
|
|
239
|
+
<CrmPage page={page} />
|
|
240
|
+
</SidebarLayout>
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// 4. ⌘K search, folding groups with colour dots, and a "+" in the foot.
|
|
245
|
+
function SearchShape() {
|
|
246
|
+
const [page, setPage] = useState("home");
|
|
247
|
+
const item = (key, label, extra) => ({ key, label, active: page === key, onSelect: () => setPage(key), ...extra });
|
|
248
|
+
const groups = [
|
|
249
|
+
{
|
|
250
|
+
items: [
|
|
251
|
+
item("home", "Home", { icon: "home" }),
|
|
252
|
+
item("inbox", "Inbox", { icon: "inbox", badge: 5 }),
|
|
253
|
+
item("tasks", "My tasks", { icon: "check-circle" }),
|
|
254
|
+
],
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
label: "Favorites",
|
|
258
|
+
collapsible: true,
|
|
259
|
+
items: [
|
|
260
|
+
item("fav-northwind", "Northwind renewal", { hue: 1 }),
|
|
261
|
+
item("fav-board", "Board deck, Q3", { hue: 2 }),
|
|
262
|
+
item("fav-hiring", "Hiring plan", { hue: 3 }),
|
|
263
|
+
],
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
label: "Teams",
|
|
267
|
+
collapsible: true,
|
|
268
|
+
defaultOpen: false,
|
|
269
|
+
items: [
|
|
270
|
+
item("team-sales", "Sales", { icon: "dollar" }),
|
|
271
|
+
item("team-success", "Customer success", { icon: "life-buoy" }),
|
|
272
|
+
item("team-ops", "Revenue ops", { icon: "settings" }),
|
|
273
|
+
],
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
label: "Topics",
|
|
277
|
+
collapsible: true,
|
|
278
|
+
items: [item("topic-pricing", "Pricing", { icon: "tag" }), item("topic-churn", "Churn", { icon: "trending-down" })],
|
|
279
|
+
},
|
|
280
|
+
];
|
|
281
|
+
const label = groups.flatMap((g) => g.items).find((i) => i.key === page)?.label ?? "Home";
|
|
282
|
+
return (
|
|
283
|
+
<SidebarLayout
|
|
284
|
+
storageKey="demo.sidebar"
|
|
285
|
+
className="min-h-[600px] overflow-hidden rounded-lg border border-border"
|
|
286
|
+
sidebar={
|
|
287
|
+
<Sidebar
|
|
288
|
+
title="Harbor"
|
|
289
|
+
subtitle="Team plan"
|
|
290
|
+
search={{ placeholder: "Search…", hotkey: "k" }}
|
|
291
|
+
groups={groups}
|
|
292
|
+
user={ME}
|
|
293
|
+
userMenu={USER_MENU}
|
|
294
|
+
footerActions={[
|
|
295
|
+
{ label: "New deal", icon: "dollar", onSelect: () => toast("New deal started") },
|
|
296
|
+
{ label: "New contact", icon: "user-plus", onSelect: () => toast("New contact started") },
|
|
297
|
+
{ label: "Invite a teammate", icon: "mail", onSelect: () => toast("Invite opened") },
|
|
298
|
+
]}
|
|
299
|
+
/>
|
|
300
|
+
}
|
|
301
|
+
>
|
|
302
|
+
<SimplePage title={label} blurb="Press ⌘K (Ctrl+K) or the search row to jump anywhere; the group headings fold." />
|
|
303
|
+
</SidebarLayout>
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// 5. A mail app: a narrow nav, and the chosen folder's mails beside it.
|
|
308
|
+
const MAILS = [
|
|
309
|
+
{ key: "m1", folder: "inbox", title: "Maya Okafor", subtitle: "Renewal terms for Northwind", description: "Legal came back with two small changes to the auto-renew clause. Can we take them on Thursday's call?", meta: "09:12" },
|
|
310
|
+
{ key: "m2", folder: "inbox", title: "Leon Brandt", subtitle: "Signed order form", description: "Attached is the countersigned copy. Our finance team will send the PO next week.", meta: "08:40" },
|
|
311
|
+
{ key: "m3", folder: "inbox", title: "Priya Raman", subtitle: "Onboarding owner?", description: "Who on your side runs onboarding? I'd like to get our admins set up before the kickoff.", meta: "Tue" },
|
|
312
|
+
{ key: "m4", folder: "inbox", title: "Tom Ellery", subtitle: "Quote for 40 seats", description: "Could you send pricing for 40 seats on the annual plan, with SSO included?", meta: "Mon" },
|
|
313
|
+
{ key: "m5", folder: "drafts", title: "To: Globex team", subtitle: "Kickoff agenda", description: "Proposed agenda for the kickoff: goals, data import, first workflow, open questions.", meta: "Mon" },
|
|
314
|
+
{ key: "m6", folder: "sent", title: "To: Maya Okafor", subtitle: "Re: Renewal terms", description: "Thanks Maya, Thursday works. I'll bring the redline.", meta: "Sep 18" },
|
|
315
|
+
{ key: "m7", folder: "sent", title: "To: Leon Brandt", subtitle: "Order form", description: "Here is the order form for the Acme expansion, ready to sign.", meta: "Sep 16" },
|
|
316
|
+
];
|
|
317
|
+
|
|
318
|
+
function PanelShape() {
|
|
319
|
+
const [folder, setFolder] = useState("inbox");
|
|
320
|
+
const [open, setOpen] = useState("m1");
|
|
321
|
+
const [state, setState] = useState("data");
|
|
322
|
+
const folders = [
|
|
323
|
+
["inbox", "Inbox", "inbox"],
|
|
324
|
+
["drafts", "Drafts", "file"],
|
|
325
|
+
["sent", "Sent", "send"],
|
|
326
|
+
["archive", "Archive", "archive"],
|
|
327
|
+
["trash", "Trash", "trash"],
|
|
328
|
+
];
|
|
329
|
+
const groups = [
|
|
330
|
+
{
|
|
331
|
+
items: folders.map(([key, label, icon]) => ({
|
|
332
|
+
key,
|
|
333
|
+
label,
|
|
334
|
+
icon,
|
|
335
|
+
active: folder === key,
|
|
336
|
+
badge: key === "inbox" ? 4 : undefined,
|
|
337
|
+
onSelect: () => setFolder(key),
|
|
338
|
+
})),
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
label: "Labels",
|
|
342
|
+
items: [
|
|
343
|
+
{ key: "l-customers", label: "Customers", hue: 1, onSelect: () => toast("Label: Customers") },
|
|
344
|
+
{ key: "l-partners", label: "Partners", hue: 2, onSelect: () => toast("Label: Partners") },
|
|
345
|
+
{ key: "l-hiring", label: "Hiring", hue: 4, onSelect: () => toast("Label: Hiring") },
|
|
346
|
+
],
|
|
347
|
+
},
|
|
348
|
+
];
|
|
349
|
+
const mails = MAILS.filter((m) => m.folder === folder).map((m) => ({ ...m, active: m.key === open, onSelect: () => setOpen(m.key) }));
|
|
350
|
+
const mail = MAILS.find((m) => m.key === open);
|
|
351
|
+
const title = folders.find((f) => f[0] === folder)[1];
|
|
352
|
+
return (
|
|
353
|
+
<div className="grid gap-3">
|
|
354
|
+
<ToggleGroup
|
|
355
|
+
size="sm"
|
|
356
|
+
aria-label="List state"
|
|
357
|
+
value={state}
|
|
358
|
+
onChange={setState}
|
|
359
|
+
items={[
|
|
360
|
+
{ value: "data", label: "Mail" },
|
|
361
|
+
{ value: "loading", label: "Loading" },
|
|
362
|
+
{ value: "error", label: "Error" },
|
|
363
|
+
]}
|
|
364
|
+
/>
|
|
365
|
+
<SidebarLayout
|
|
366
|
+
storageKey="demo.sidebar.mail"
|
|
367
|
+
className="min-h-[600px] overflow-hidden rounded-lg border border-border"
|
|
368
|
+
sidebar={
|
|
369
|
+
<Sidebar
|
|
370
|
+
title="Harbor Mail"
|
|
371
|
+
subtitle="dana@harbor.io"
|
|
372
|
+
groups={groups}
|
|
373
|
+
user={ME}
|
|
374
|
+
userMenu={USER_MENU}
|
|
375
|
+
panel={{
|
|
376
|
+
title,
|
|
377
|
+
search: { placeholder: "Search mail" },
|
|
378
|
+
items: state === "data" ? mails : [],
|
|
379
|
+
loading: state === "loading",
|
|
380
|
+
error: state === "error" ? "Mail didn't load. Check your connection." : undefined,
|
|
381
|
+
onRetry: () => setState("data"),
|
|
382
|
+
empty: `No mail in ${title}`,
|
|
383
|
+
}}
|
|
384
|
+
/>
|
|
385
|
+
}
|
|
386
|
+
>
|
|
387
|
+
<SimplePage title={mail ? mail.subtitle : title}>
|
|
388
|
+
{mail ? (
|
|
389
|
+
<Card>
|
|
390
|
+
<p className="text-sm font-medium">{mail.title}</p>
|
|
391
|
+
<p className="mt-2 text-sm text-muted-foreground">{mail.description}</p>
|
|
392
|
+
</Card>
|
|
393
|
+
) : (
|
|
394
|
+
<p className="text-sm text-muted-foreground">Choose a message.</p>
|
|
395
|
+
)}
|
|
396
|
+
</SimplePage>
|
|
397
|
+
</SidebarLayout>
|
|
398
|
+
</div>
|
|
399
|
+
);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// 6 & 7. Drill-in: a parent's children (each with a line saying what it
|
|
403
|
+
// is) open in a second column, or in place of the list.
|
|
404
|
+
const SECTIONS = [
|
|
405
|
+
{
|
|
406
|
+
key: "overview",
|
|
407
|
+
label: "Overview",
|
|
408
|
+
icon: "home",
|
|
409
|
+
children: [
|
|
410
|
+
["dashboard", "Dashboard", "chart", "The quarter at a glance"],
|
|
411
|
+
["activity", "Activity", "history", "Calls, emails and meetings"],
|
|
412
|
+
["insights", "Insights", "lightbulb", "Where deals stall and why"],
|
|
413
|
+
],
|
|
414
|
+
},
|
|
415
|
+
{
|
|
416
|
+
key: "pipeline",
|
|
417
|
+
label: "Pipeline",
|
|
418
|
+
icon: "dollar",
|
|
419
|
+
badge: 12,
|
|
420
|
+
children: [
|
|
421
|
+
["open", "Open deals", "dollar", "Everything still in play"],
|
|
422
|
+
["won", "Won", "check-circle", "Closed this quarter"],
|
|
423
|
+
["lost", "Lost", "circle-x", "With the reason recorded"],
|
|
424
|
+
],
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
key: "people",
|
|
428
|
+
label: "People",
|
|
429
|
+
icon: "users",
|
|
430
|
+
children: [
|
|
431
|
+
["contacts", "Contacts", "user", "Everyone you talk to"],
|
|
432
|
+
["companies", "Companies", "building", "Accounts and their teams"],
|
|
433
|
+
["lists", "Lists", "list", "Saved segments for outreach"],
|
|
434
|
+
],
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
key: "admin",
|
|
438
|
+
label: "Workspace",
|
|
439
|
+
icon: "settings",
|
|
440
|
+
children: [
|
|
441
|
+
["members", "Members", "user-plus", "Who has access, and what role"],
|
|
442
|
+
["billing", "Billing", "credit-card", "Plan, invoices and seats"],
|
|
443
|
+
["security", "Security", "shield", "Sign-in rules and audit log"],
|
|
444
|
+
],
|
|
445
|
+
},
|
|
446
|
+
];
|
|
447
|
+
|
|
448
|
+
function DrillShape({ drilldown }) {
|
|
449
|
+
const [page, setPage] = useState("dashboard");
|
|
450
|
+
const [workspace, setWorkspace] = useState("Harbor Sales");
|
|
451
|
+
const items = SECTIONS.map((s) => ({
|
|
452
|
+
key: s.key,
|
|
453
|
+
label: s.label,
|
|
454
|
+
icon: s.icon,
|
|
455
|
+
badge: s.badge,
|
|
456
|
+
items: s.children.map(([key, label, icon, description]) => ({ key, label, icon, description, active: page === key, onSelect: () => setPage(key) })),
|
|
457
|
+
}));
|
|
458
|
+
const current = SECTIONS.flatMap((s) => s.children).find((c) => c[0] === page);
|
|
459
|
+
return (
|
|
460
|
+
<SidebarLayout
|
|
461
|
+
storageKey="demo.sidebar"
|
|
462
|
+
className="min-h-[600px] overflow-hidden rounded-lg border border-border"
|
|
463
|
+
sidebar={
|
|
464
|
+
<Sidebar
|
|
465
|
+
title={workspace}
|
|
466
|
+
subtitle="Pro plan"
|
|
467
|
+
drilldown={drilldown}
|
|
468
|
+
switcher={["Harbor Sales", "Harbor Support"].map((name) => ({ label: name, icon: name === workspace ? "check" : undefined, onSelect: () => setWorkspace(name) }))}
|
|
469
|
+
items={items}
|
|
470
|
+
user={ME}
|
|
471
|
+
userMenu={USER_MENU}
|
|
472
|
+
/>
|
|
473
|
+
}
|
|
474
|
+
>
|
|
475
|
+
<SimplePage title={current?.[1] ?? "Home"} blurb={current?.[3]} />
|
|
476
|
+
</SidebarLayout>
|
|
477
|
+
);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
// 8. A chat history: "New chat" above, threads by day, a "…" per thread.
|
|
481
|
+
// Archive fails on purpose (returns { ok: false }), so the error shows.
|
|
482
|
+
const CHATS = [
|
|
483
|
+
{ id: "c1", title: "Renewal email for Northwind", when: "pinned" },
|
|
484
|
+
{ id: "c2", title: "Q3 forecast summary", when: "pinned" },
|
|
485
|
+
{ id: "c3", title: "Objections from the Globex call", when: "today" },
|
|
486
|
+
{ id: "c4", title: "Draft: pricing page FAQ", when: "today" },
|
|
487
|
+
{ id: "c5", title: "Onboarding checklist for Acme", when: "yesterday" },
|
|
488
|
+
{ id: "c6", title: "Compare CRM import options", when: "week" },
|
|
489
|
+
{ id: "c7", title: "Board update, September", when: "week" },
|
|
490
|
+
];
|
|
491
|
+
const DAYS = [
|
|
492
|
+
["pinned", "Pinned"],
|
|
493
|
+
["today", "Today"],
|
|
494
|
+
["yesterday", "Yesterday"],
|
|
495
|
+
["week", "Previous 7 days"],
|
|
496
|
+
];
|
|
497
|
+
|
|
498
|
+
function ChatShape() {
|
|
499
|
+
const [chats, setChats] = useState(CHATS);
|
|
500
|
+
const [active, setActive] = useState("c3");
|
|
501
|
+
const pause = () => new Promise((r) => setTimeout(r, 400));
|
|
502
|
+
const actionsFor = (chat) => [
|
|
503
|
+
{
|
|
504
|
+
label: chat.when === "pinned" ? "Unpin" : "Pin",
|
|
505
|
+
icon: "pin",
|
|
506
|
+
onSelect: () => setChats((all) => all.map((c) => (c.id === chat.id ? { ...c, when: c.when === "pinned" ? "today" : "pinned" } : c))),
|
|
507
|
+
},
|
|
508
|
+
{ label: "Rename", icon: "pencil", onSelect: () => toast(`Rename "${chat.title}"`) },
|
|
509
|
+
{ label: "Share", icon: "share", onSelect: () => toast("Link copied") },
|
|
510
|
+
{
|
|
511
|
+
label: "Archive",
|
|
512
|
+
icon: "archive",
|
|
513
|
+
onSelect: async () => {
|
|
514
|
+
await pause();
|
|
515
|
+
return { ok: false, error: "Couldn't archive: the server said no. Try again." };
|
|
516
|
+
},
|
|
517
|
+
},
|
|
518
|
+
{ type: "separator" },
|
|
519
|
+
{
|
|
520
|
+
label: "Delete",
|
|
521
|
+
icon: "trash",
|
|
522
|
+
tone: "danger",
|
|
523
|
+
onSelect: async () => {
|
|
524
|
+
await pause();
|
|
525
|
+
setChats((all) => all.filter((c) => c.id !== chat.id));
|
|
526
|
+
toast("Chat deleted");
|
|
527
|
+
return { ok: true };
|
|
528
|
+
},
|
|
529
|
+
},
|
|
530
|
+
];
|
|
531
|
+
const groups = DAYS.map(([when, label]) => ({
|
|
532
|
+
key: when,
|
|
533
|
+
label,
|
|
534
|
+
items: chats
|
|
535
|
+
.filter((c) => c.when === when)
|
|
536
|
+
.map((c) => ({ key: c.id, label: c.title, active: active === c.id, onSelect: () => setActive(c.id), actions: actionsFor(c) })),
|
|
537
|
+
}));
|
|
538
|
+
const current = chats.find((c) => c.id === active);
|
|
539
|
+
return (
|
|
540
|
+
<SidebarLayout
|
|
541
|
+
storageKey="demo.sidebar"
|
|
542
|
+
className="min-h-[600px] overflow-hidden rounded-lg border border-border"
|
|
543
|
+
sidebar={
|
|
544
|
+
<Sidebar
|
|
545
|
+
title="Harbor Assistant"
|
|
546
|
+
subtitle="Pro plan"
|
|
547
|
+
primaryAction={{
|
|
548
|
+
label: "New chat",
|
|
549
|
+
icon: "plus",
|
|
550
|
+
onSelect: () => {
|
|
551
|
+
const id = `c${Date.now()}`;
|
|
552
|
+
setChats((all) => [{ id, title: "New chat", when: "today" }, ...all]);
|
|
553
|
+
setActive(id);
|
|
554
|
+
},
|
|
555
|
+
}}
|
|
556
|
+
search={{ placeholder: "Search chats", label: "Search chats" }}
|
|
557
|
+
groups={groups}
|
|
558
|
+
user={ME}
|
|
559
|
+
userMenu={USER_MENU}
|
|
560
|
+
/>
|
|
561
|
+
}
|
|
562
|
+
>
|
|
563
|
+
<SimplePage title={current?.title ?? "New chat"} blurb="Hover a thread for its menu (always shown on a touch screen). Archive fails on purpose." />
|
|
564
|
+
</SidebarLayout>
|
|
565
|
+
);
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
const SHAPES = {
|
|
569
|
+
default: DefaultShape,
|
|
570
|
+
inset: () => <FramedShape variant="inset" />,
|
|
571
|
+
floating: () => <FramedShape variant="floating" />,
|
|
572
|
+
search: SearchShape,
|
|
573
|
+
panel: PanelShape,
|
|
574
|
+
"drill-panel": () => <DrillShape drilldown="panel" />,
|
|
575
|
+
"drill-replace": () => <DrillShape drilldown="replace" />,
|
|
576
|
+
chat: ChatShape,
|
|
577
|
+
};
|