makersclaw 0.2.0 → 0.3.1
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/cli.mjs +19 -6
- package/src/install.mjs +18 -0
- package/src/registry.mjs +38 -4
- package/src/shadcn.mjs +14 -1
- 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,273 @@
|
|
|
1
|
+
# Chat
|
|
2
|
+
|
|
3
|
+
The parts of a chat, and a thread made of them. `Message` is one turn:
|
|
4
|
+
avatar, name, time, the words in a `Bubble`, its files, its state
|
|
5
|
+
(sending, streaming, failed with Retry) and the actions that appear on
|
|
6
|
+
hover or focus (copy, regenerate, a menu of yours). `MessageScroller` is
|
|
7
|
+
the list: it keeps to the bottom while a reply streams unless the reader
|
|
8
|
+
scrolled up, then offers "Jump to latest"; it puts a day between days,
|
|
9
|
+
runs consecutive messages from one author together, loads older messages
|
|
10
|
+
from the top and says each finished reply to a screen reader.
|
|
11
|
+
`Composer` is the input: it grows with the text, Enter sends,
|
|
12
|
+
Shift+Enter is a new line, files come by paperclip, paste or drop, and
|
|
13
|
+
Send becomes Stop while a reply streams; it comes as a box or as the
|
|
14
|
+
round "ask anything" pill, with a "+" menu, your tools in its bar and
|
|
15
|
+
suggestion chips. An assistant reply can fold its reasoning away
|
|
16
|
+
("Thought for 4s") and take a thumbs up or down; a user message can be
|
|
17
|
+
edited in place. `ChatHeader` is the strip over a thread (name, status,
|
|
18
|
+
actions). `Attachment` is one file. `ChatThread` puts them together from
|
|
19
|
+
`messages` and `onSend`.
|
|
20
|
+
|
|
21
|
+
```jsx
|
|
22
|
+
import { ChatThread } from "../components/blocks/chat"; // a Makersclaw app ("./blocks/chat" from components/)
|
|
23
|
+
import { ChatThread } from "@/components/makersclaw/blocks/chat"; // a shadcn project
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Every part is a client component: render them from a `"use client"`
|
|
27
|
+
component. The block imports nothing but React and the kit — it holds no
|
|
28
|
+
conversation and calls no model. The messages come in as a prop and the
|
|
29
|
+
send goes out as `onSend`; where the reply comes from (your server action,
|
|
30
|
+
the AI SDK's `useChat`, a support inbox table) is the surface's.
|
|
31
|
+
|
|
32
|
+
This is not the app window's Agent tab — the OS draws that. It is for a
|
|
33
|
+
conversation that lives on your own screen: a support reply pane, a
|
|
34
|
+
customer-facing assistant, comments on a record.
|
|
35
|
+
|
|
36
|
+
## The data
|
|
37
|
+
|
|
38
|
+
A message:
|
|
39
|
+
|
|
40
|
+
```js
|
|
41
|
+
{
|
|
42
|
+
id: "m5", // stable; the list is keyed on it
|
|
43
|
+
role: "user", // user · assistant · system
|
|
44
|
+
content: "It's still showing…", // a string — or `parts: [{ type: "text", text }]`
|
|
45
|
+
createdAt: "2026-09-23T10:04:00Z",
|
|
46
|
+
author: { name: "Maya Chen", src: "https://…" }, // optional
|
|
47
|
+
status: "failed", // sending · streaming · failed · nothing (sent)
|
|
48
|
+
error: "you are offline", // shown with a failed message
|
|
49
|
+
attachments: [{ id, name, size, type, url }], // size in bytes; url shows an image's thumbnail
|
|
50
|
+
reasoning: "They asked about the double charge…", // assistant only: folded over the reply
|
|
51
|
+
reasoningDuration: 4, // seconds: "Thought for 4s"
|
|
52
|
+
feedback: "up", // up · down — the thumbs already given (assistant only)
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
`reasoning` is drawn in a kit `Collapsible`, closed, over the reply.
|
|
57
|
+
While the message streams with no answer yet it reads "Thinking…"; give
|
|
58
|
+
`reasoning: ""` from the start to show that line instead of the three
|
|
59
|
+
dots.
|
|
60
|
+
|
|
61
|
+
A message with `parts` (the AI SDK's shape) is drawn from its text parts;
|
|
62
|
+
other parts are not drawn. A `system` message is a centred muted line.
|
|
63
|
+
An assistant message with `status: "streaming"` and no text yet shows
|
|
64
|
+
three dots; with text it shows a caret after it.
|
|
65
|
+
|
|
66
|
+
The words are drawn by a small safe renderer — never as HTML, and with no
|
|
67
|
+
markdown library. It understands fenced code blocks (with a Copy button;
|
|
68
|
+
an unclosed fence runs to the end, so a block still streaming already
|
|
69
|
+
looks like one), `code spans`, `**bold**` and line breaks. Everything else
|
|
70
|
+
(links, lists, headings) is plain text. `<script>` in a message is shown,
|
|
71
|
+
not run.
|
|
72
|
+
|
|
73
|
+
## Props
|
|
74
|
+
|
|
75
|
+
### ChatThread
|
|
76
|
+
|
|
77
|
+
- `messages` — the conversation, oldest first.
|
|
78
|
+
- `onSend(text, attachments)` — send it. The composer clears at once;
|
|
79
|
+
return `{ ok: false, error }` (or throw) and the text comes back to the
|
|
80
|
+
field with the reason under it. The usual pattern is to add the message
|
|
81
|
+
with `status: "sending"` here, then mark it sent or `failed`.
|
|
82
|
+
- `streaming` — a reply is streaming: Send becomes Stop, Esc stops.
|
|
83
|
+
Default: true while any message has `status: "streaming"`.
|
|
84
|
+
- `onStop()` — stop the reply.
|
|
85
|
+
- `onRetry(message)` — the Retry on a failed message. Without it, a
|
|
86
|
+
failed message says so and offers nothing.
|
|
87
|
+
- `onRegenerate(message)` — a regenerate button on assistant messages.
|
|
88
|
+
- `actionsOf(message)` — more items for a message's menu, kit `Menu`
|
|
89
|
+
shape: `[{ label, onSelect, icon?, tone?: "danger" }]`.
|
|
90
|
+
- `onFeedback(message, "up" | "down" | null)` — thumbs up and down on
|
|
91
|
+
assistant replies (pressing the chosen one again clears it: `null`).
|
|
92
|
+
The choice shows at once; return `{ ok: false, error }` (or throw) and
|
|
93
|
+
it goes back, with the reason under the message. Store it and pass it
|
|
94
|
+
back as `message.feedback`.
|
|
95
|
+
- `onEdit(message, text)` — an edit button on your own messages. The
|
|
96
|
+
words come back in a field: Enter or Save saves, Esc or Cancel leaves
|
|
97
|
+
them. Return `{ ok: false, error }` and the field stays open with the
|
|
98
|
+
reason. Up arrow in an empty composer edits the last message you sent.
|
|
99
|
+
What an edit does next (drop the replies after it, ask again) is yours.
|
|
100
|
+
- `header` — a node over the list, or the props of a `ChatHeader`
|
|
101
|
+
(`{ title, status, actions, menu }`).
|
|
102
|
+
- `shape` — the composer: `"box"` (default) or `"pill"` (see Composer).
|
|
103
|
+
- `tools` · `menu` — the composer's bar: nodes of yours, and kit `Menu`
|
|
104
|
+
items behind a "+" (see Composer).
|
|
105
|
+
- `suggestions` — prompt chips over the composer:
|
|
106
|
+
`[{ label, prompt?, icon?, description? }]`. Shown while the thread is
|
|
107
|
+
empty; `suggestionsWhen="always"` keeps them. `suggestionMode`
|
|
108
|
+
`"send"` (the default here: a press sends `prompt ?? label`) or
|
|
109
|
+
`"fill"` (puts it in the field). `suggestionsLook` `"chips"` (default)
|
|
110
|
+
or `"cards"`.
|
|
111
|
+
- `onLoadMore()` · `hasMore` (false) · `loadingMore` (false) — older
|
|
112
|
+
messages. Reaching the top (or pressing "Load earlier messages") calls
|
|
113
|
+
`onLoadMore`; prepend them to `messages` and the reader keeps their place.
|
|
114
|
+
- `attachments` · `onAttach(files)` · `onRemoveAttachment(att)` · `accept`
|
|
115
|
+
— files waiting in the composer. `onAttach` gets the browser's `File`s:
|
|
116
|
+
upload them and pass them back in `attachments` as
|
|
117
|
+
`{ id, name, size, type, url?, progress?, error? }` (`progress` 0–100
|
|
118
|
+
draws a bar; Send waits until every upload is at 100). Without
|
|
119
|
+
`onAttach` there is no paperclip. They reach `onSend` as its second
|
|
120
|
+
argument.
|
|
121
|
+
- `disabled` (false) · `disabledPlaceholder` · `placeholder` — a closed
|
|
122
|
+
or read-only thread.
|
|
123
|
+
- `variant` — how assistant words sit: `"plain"` (default, on the page)
|
|
124
|
+
or `"bubble"`. User messages are always filled bubbles at the end.
|
|
125
|
+
- `assistantName` ("Assistant") · `assistantAvatar` · `userName` ("You")
|
|
126
|
+
· `userAvatar` · `showUserAvatar` (false) — who is who, when a message
|
|
127
|
+
has no `author`.
|
|
128
|
+
- `emptyTitle` · `emptyBody` · `emptyState` — what an empty thread says;
|
|
129
|
+
`emptyState` replaces the whole thing.
|
|
130
|
+
- `height` — default `"min(40rem, 80dvh)"`; the list scrolls inside it.
|
|
131
|
+
- `label` — what the thread is called to a screen reader.
|
|
132
|
+
- `className` — layout around it (width, margin). Never colour.
|
|
133
|
+
|
|
134
|
+
### Message
|
|
135
|
+
|
|
136
|
+
`message` (the shape above), `first` / `last` (its place in a run from
|
|
137
|
+
one author: `first` shows the avatar, name and time), `latest` (the
|
|
138
|
+
newest reply: its actions stay in view instead of waiting for hover), and `variant`,
|
|
139
|
+
`assistantName`, `assistantAvatar`, `userName`, `userAvatar`,
|
|
140
|
+
`showUserAvatar`, `onRetry`, `onRegenerate`, `actionsOf`, `onFeedback`,
|
|
141
|
+
`onEdit` as above. `editing` / `onEditingChange(next)` control the edit
|
|
142
|
+
field (leave them out and the message keeps its own).
|
|
143
|
+
`onCopy(message, text)` replaces the clipboard write; `formatTime(date)`
|
|
144
|
+
replaces the time's format.
|
|
145
|
+
|
|
146
|
+
### Bubble
|
|
147
|
+
|
|
148
|
+
`from` (`"user"` · `"assistant"`), `variant` (`"bubble"` · `"plain"`),
|
|
149
|
+
`first` / `last`, `streaming` (draws the caret), and `text` (drawn by the
|
|
150
|
+
safe renderer) or `children`.
|
|
151
|
+
|
|
152
|
+
### ChatHeader
|
|
153
|
+
|
|
154
|
+
`title`, then `status` (`{ tone: "success", label: "Online", pulse? }`,
|
|
155
|
+
a kit `StatusDot`) or `subtitle` (a muted line) under it, `avatar`
|
|
156
|
+
(`{ name?, src?, status? }`), `actions` (nodes at the end: a "New chat"
|
|
157
|
+
Button), `menu` (kit `Menu` items behind a "⋯") and `menuLabel`.
|
|
158
|
+
|
|
159
|
+
### Attachment
|
|
160
|
+
|
|
161
|
+
`name`, `size` (bytes), `type` (MIME; the extension is used when it is
|
|
162
|
+
missing), `url` (an image shows itself; anything else opens it),
|
|
163
|
+
`href` (open this instead), `progress` (0–100, a bar until 100), `error`,
|
|
164
|
+
`onRemove`, `removeLabel`. An image's thumbnail is a kit `Image`: a
|
|
165
|
+
skeleton while it loads, the image glyph if it fails.
|
|
166
|
+
|
|
167
|
+
### MessageScroller
|
|
168
|
+
|
|
169
|
+
`messages`, `renderMessage(message, { first, last, latest })` (default: a plain
|
|
170
|
+
`Message`), `idOf(message, i)`, `onLoadMore` · `hasMore` · `loadingMore`,
|
|
171
|
+
`emptyState`, `formatDay(date)` ("Today", "Yesterday", "Mon 21 Sep"),
|
|
172
|
+
`announce(message)` (what a screen reader hears when a reply is whole),
|
|
173
|
+
`jumpLabel`, `loadMoreLabel`, `label`, `className` (give it a bounded
|
|
174
|
+
height, or put it in a flex column), `children` (drawn after the last
|
|
175
|
+
message — a typing line, say).
|
|
176
|
+
|
|
177
|
+
The list is a kit `ScrollArea`. Once it overflows it joins the tab order
|
|
178
|
+
as a region named `label`, so a keyboard can scroll it.
|
|
179
|
+
|
|
180
|
+
### Composer
|
|
181
|
+
|
|
182
|
+
`onSend`, `onStop`, `streaming`, `disabled`, `disabledPlaceholder`,
|
|
183
|
+
`placeholder`, `attachments` · `onAttach` · `onRemoveAttachment` ·
|
|
184
|
+
`accept` as in ChatThread, and `value` / `onValueChange` (control the
|
|
185
|
+
text — to quote a message into it, say), `maxRows` (8), `canSendEmpty`
|
|
186
|
+
(false), `label` ("Message"), `hint` (true: the Enter / Shift+Enter keys
|
|
187
|
+
under the field, from md up), `autoFocus`, and:
|
|
188
|
+
|
|
189
|
+
- `shape` — `"box"` (default: the text on top, the bar under it) or
|
|
190
|
+
`"pill"`: the "ask anything" box, one round row with the "+" menu and
|
|
191
|
+
the paperclip before the text and `tools` and Send after it. Past one
|
|
192
|
+
line (or with files waiting) it opens into a rounded box, text on top;
|
|
193
|
+
emptied, it is a pill again. The pill shows no key hint.
|
|
194
|
+
- `tools` — nodes in the bar: a model `Select`, a kit `Menu` of
|
|
195
|
+
settings with checkbox items, a `Toggle` for "Auto", a mic. The
|
|
196
|
+
composer draws them; what they choose is yours (read it in `onSend`).
|
|
197
|
+
- `menu` · `menuLabel` ("Add to the message") — kit `Menu` items behind
|
|
198
|
+
a "+" at the start of the bar: "Add files", "Search the web".
|
|
199
|
+
- `suggestions` — `[{ label, prompt?, icon?, description?, onSelect? }]`,
|
|
200
|
+
drawn `suggestionsPlacement` `"below"` (default) or `"above"` the
|
|
201
|
+
field. `suggestionMode` `"fill"` (default: the prompt goes in the
|
|
202
|
+
field, caret at its end) or `"send"`; an item's own `onSelect(item)`
|
|
203
|
+
replaces both. `suggestionsLook` `"chips"` (round, centred) or
|
|
204
|
+
`"cards"` (a two-column grid with `description` under each label).
|
|
205
|
+
`suggestionsLabel` names the list to a reader.
|
|
206
|
+
- `onEditLast()` — Up arrow in the empty field (ChatThread opens the last
|
|
207
|
+
message you sent for editing).
|
|
208
|
+
|
|
209
|
+
The field is the kit's multi-line `InputGroup`: the waiting files sit
|
|
210
|
+
above the text inside its one border, the paperclip (a kit `FileInput`)
|
|
211
|
+
and the hint in its bar, Send at the end. The picker leaves out files
|
|
212
|
+
`accept` rules out; a drop or a paste is passed on as it comes.
|
|
213
|
+
|
|
214
|
+
## Example
|
|
215
|
+
|
|
216
|
+
```jsx
|
|
217
|
+
// components/SupportChat.jsx — client: one ticket's conversation
|
|
218
|
+
"use client";
|
|
219
|
+
import { useState } from "react";
|
|
220
|
+
import { insertRow } from "../lib/actions";
|
|
221
|
+
import { ChatThread } from "./blocks/chat";
|
|
222
|
+
|
|
223
|
+
export default function SupportChat({ ticket, initial }) {
|
|
224
|
+
const [messages, setMessages] = useState(initial);
|
|
225
|
+
const patch = (id, change) => setMessages((all) => all.map((m) => (m.id === id ? { ...m, ...change } : m)));
|
|
226
|
+
|
|
227
|
+
async function send(text) {
|
|
228
|
+
const id = crypto.randomUUID();
|
|
229
|
+
const draft = { id, role: "user", content: text, createdAt: new Date().toISOString(), status: "sending" };
|
|
230
|
+
setMessages((all) => [...all, draft]);
|
|
231
|
+
const r = await insertRow({ source: "public.ticket_messages", values: { id, ticket_id: ticket.id, body: text }, detail: text });
|
|
232
|
+
patch(id, r.ok ? { status: undefined } : { status: "failed", error: r.error });
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return (
|
|
236
|
+
<ChatThread
|
|
237
|
+
messages={messages}
|
|
238
|
+
onSend={send}
|
|
239
|
+
onRetry={(m) => { setMessages((all) => all.filter((x) => x.id !== m.id)); send(m.content); }}
|
|
240
|
+
assistantName={ticket.agent_name}
|
|
241
|
+
userName="You"
|
|
242
|
+
label={`Ticket ${ticket.number}`}
|
|
243
|
+
/>
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
With the AI SDK in a shadcn project, `useChat()` already has the shape:
|
|
249
|
+
`<ChatThread messages={messages} onSend={(text) => sendMessage({ text })}
|
|
250
|
+
streaming={status === "streaming" || status === "submitted"} onStop={stop}
|
|
251
|
+
onRegenerate={() => regenerate()} />`.
|
|
252
|
+
|
|
253
|
+
## What it will not do
|
|
254
|
+
|
|
255
|
+
- Call a model, store a message or upload a file: those are the
|
|
256
|
+
surface's, through `onSend`, `onAttach` and the rows it passes back.
|
|
257
|
+
- Render HTML or full markdown: links, lists, tables and images inside
|
|
258
|
+
the text stay plain text.
|
|
259
|
+
- Keep the feedback or the edit: `onFeedback` and `onEdit` hand them to
|
|
260
|
+
you, and the rows you pass back are what shows. Emoji reactions are
|
|
261
|
+
yours, in `actionsOf`.
|
|
262
|
+
- Record audio or pick a model: a mic or a model `Select` is a node you
|
|
263
|
+
put in `tools`.
|
|
264
|
+
- Draw the app window's Agent tab, or a job the founder commissioned —
|
|
265
|
+
that is `job-panel`.
|
|
266
|
+
|
|
267
|
+
A chat it cannot be is your own component in `components/`, built from
|
|
268
|
+
these parts and the kit — not an edit to this block. Its files are fixed:
|
|
269
|
+
`npm run check` refuses a change, and `makersclaw add chat` restores them.
|
|
270
|
+
|
|
271
|
+
## Credits
|
|
272
|
+
|
|
273
|
+
The pill composer, tools, suggestions, feedback, edit, reasoning and header are ported from blocks.so (https://blocks.so, ai-01–05 and chat-01–03, MIT) and Creative Tim UI (https://github.com/creativetimofficial/ui, ai-chat-streaming-01, MIT), rewritten on the Makersclaw kit.
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { Icon, IconButton, Image, Progress, cx } from "../../ui";
|
|
4
|
+
|
|
5
|
+
// Attachment — one file on a message or waiting in the composer: an icon
|
|
6
|
+
// for its kind (or the picture itself when it is an image with a `url`),
|
|
7
|
+
// its name and size, a bar while it uploads, the reason when it failed,
|
|
8
|
+
// and a remove button when `onRemove` is given.
|
|
9
|
+
|
|
10
|
+
const KINDS = [
|
|
11
|
+
[/^image\//, "image", "Image"],
|
|
12
|
+
[/^(audio|video)\//, "play", "Media"],
|
|
13
|
+
[/(zip|tar|gzip|compressed|x-7z|rar)/, "archive", "Archive"],
|
|
14
|
+
[/(spreadsheet|excel|csv)/, "grid", "Spreadsheet"],
|
|
15
|
+
[/(pdf|word|document|text|rtf|presentation|powerpoint)/, "file", "Document"],
|
|
16
|
+
];
|
|
17
|
+
const BY_EXT = {
|
|
18
|
+
png: "image/png", jpg: "image/jpeg", jpeg: "image/jpeg", gif: "image/gif", webp: "image/webp", svg: "image/svg+xml",
|
|
19
|
+
pdf: "application/pdf", doc: "application/msword", docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
20
|
+
txt: "text/plain", md: "text/markdown", csv: "text/csv", xls: "application/vnd.ms-excel", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
21
|
+
zip: "application/zip", mp3: "audio/mpeg", mp4: "video/mp4", mov: "video/quicktime",
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export function kindOf(type, name) {
|
|
25
|
+
const mime = type || BY_EXT[String(name ?? "").split(".").pop()?.toLowerCase()] || "";
|
|
26
|
+
for (const [re, icon, label] of KINDS) if (re.test(mime)) return { icon, label, image: icon === "image" };
|
|
27
|
+
return { icon: "file", label: "File", image: false };
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** 2048 → "2 KB", 5_300_000 → "5.1 MB". */
|
|
31
|
+
export function formatBytes(bytes) {
|
|
32
|
+
const n = Number(bytes);
|
|
33
|
+
if (!Number.isFinite(n) || n < 0) return "";
|
|
34
|
+
if (n < 1024) return `${n} B`;
|
|
35
|
+
const units = ["KB", "MB", "GB", "TB"];
|
|
36
|
+
let v = n / 1024;
|
|
37
|
+
let u = 0;
|
|
38
|
+
while (v >= 1024 && u < units.length - 1) {
|
|
39
|
+
v /= 1024;
|
|
40
|
+
u += 1;
|
|
41
|
+
}
|
|
42
|
+
return `${v >= 10 ? Math.round(v) : Math.round(v * 10) / 10} ${units[u]}`;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function Attachment({ name, size, type, url, href, progress, error, onRemove, removeLabel, className }) {
|
|
46
|
+
const kind = kindOf(type, name);
|
|
47
|
+
const uploading = typeof progress === "number" && progress < 100 && !error;
|
|
48
|
+
const thumb = kind.image && url;
|
|
49
|
+
const open = href ?? (!uploading && !error ? url : undefined);
|
|
50
|
+
const facts = error ? error : uploading ? `Uploading… ${Math.round(progress)}%` : [kind.label, formatBytes(size)].filter(Boolean).join(" · ");
|
|
51
|
+
|
|
52
|
+
const title = open ? (
|
|
53
|
+
// raw: an attachment opens a file URL (often a blob: or a storage
|
|
54
|
+
// link) in a new tab; Button's href is next/link, which is for pages.
|
|
55
|
+
<a
|
|
56
|
+
href={open}
|
|
57
|
+
target="_blank"
|
|
58
|
+
rel="noreferrer"
|
|
59
|
+
className="block truncate rounded-sm text-sm font-medium outline-none hover:underline focus-visible:ring-2 focus-visible:ring-ring"
|
|
60
|
+
>
|
|
61
|
+
{name}
|
|
62
|
+
</a>
|
|
63
|
+
) : (
|
|
64
|
+
<p className="truncate text-sm font-medium">{name}</p>
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
return (
|
|
68
|
+
<div
|
|
69
|
+
className={cx(
|
|
70
|
+
"flex w-64 max-w-full min-w-0 items-center gap-2.5 rounded-lg border bg-card p-2 text-card-foreground",
|
|
71
|
+
error ? "border-destructive/50" : "border-border",
|
|
72
|
+
className,
|
|
73
|
+
)}
|
|
74
|
+
>
|
|
75
|
+
{thumb ? (
|
|
76
|
+
<Image src={url} alt="" ratio="square" className="size-10 shrink-0" />
|
|
77
|
+
) : (
|
|
78
|
+
<span className="flex size-10 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground">
|
|
79
|
+
<Icon name={error ? "warning" : kind.icon} size={18} className={error ? "text-destructive" : undefined} />
|
|
80
|
+
</span>
|
|
81
|
+
)}
|
|
82
|
+
<div className="grid min-w-0 flex-1 gap-1">
|
|
83
|
+
{title}
|
|
84
|
+
{uploading ? (
|
|
85
|
+
<Progress value={progress} aria-label={`Uploading ${name}`} valueText={`${Math.round(progress)}%`} />
|
|
86
|
+
) : (
|
|
87
|
+
<p className={cx("truncate text-xs", error ? "text-destructive" : "text-muted-foreground")}>{facts}</p>
|
|
88
|
+
)}
|
|
89
|
+
</div>
|
|
90
|
+
{onRemove ? (
|
|
91
|
+
<IconButton icon="x" size="sm" label={removeLabel ?? `Remove ${name}`} onClick={onRemove} className="-my-1" />
|
|
92
|
+
) : null}
|
|
93
|
+
</div>
|
|
94
|
+
);
|
|
95
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "chat",
|
|
3
|
+
"title": "Chat",
|
|
4
|
+
"description": "The parts of a chat: messages with avatars, times, grouping, sending/failed/streaming states, hover actions, thumbs up/down feedback, in-place editing and a folding reasoning section; a scroller that sticks to the bottom with day separators and older-message loading; a composer (a box or an \"ask anything\" pill) with attachments, a + menu, tools, suggestion chips, Enter to send and Stop; a header; and ChatThread, which composes them from messages + onSend.",
|
|
5
|
+
"useWhen": "A conversation lives inside the app's own screen: a support inbox reply pane, a customer-facing assistant, comments between teammates on a record, a thread per object. Not the app window's Agent tab (the OS draws that) and not a one-off job the founder commissions (job-panel).",
|
|
6
|
+
"tags": ["chat", "messages", "conversation", "thread", "assistant", "ai", "support", "inbox", "composer", "attachments", "streaming", "bubble", "reply", "feedback", "reasoning", "prompt", "suggestions", "ask anything", "header"],
|
|
7
|
+
"exports": ["ChatThread", "ChatHeader", "Message", "Bubble", "Attachment", "MessageScroller", "Composer"],
|
|
8
|
+
"files": ["index.js", "chat.jsx", "header.jsx", "message.jsx", "text.jsx", "attachment.jsx", "scroller.jsx", "composer.jsx"],
|
|
9
|
+
"requires": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { isValidElement, useState } from "react";
|
|
4
|
+
import { Empty, cx } from "../../ui";
|
|
5
|
+
import { Composer } from "./composer";
|
|
6
|
+
import { ChatHeader } from "./header";
|
|
7
|
+
import { Message } from "./message";
|
|
8
|
+
import { MessageScroller } from "./scroller";
|
|
9
|
+
|
|
10
|
+
// ChatThread — a whole conversation from `messages` and `onSend`: the
|
|
11
|
+
// scrolling list (MessageScroller) of Message rows, and the Composer under
|
|
12
|
+
// it; a header over it when given one. The common case in one element;
|
|
13
|
+
// when a thread needs a shape this cannot take, compose the same parts
|
|
14
|
+
// yourself (README.md).
|
|
15
|
+
//
|
|
16
|
+
// <ChatThread messages={messages} onSend={send} streaming={busy} onStop={stop}
|
|
17
|
+
// onRetry={resend} assistantName="Support" height="36rem" />
|
|
18
|
+
|
|
19
|
+
export function ChatThread({
|
|
20
|
+
messages,
|
|
21
|
+
onSend,
|
|
22
|
+
onStop,
|
|
23
|
+
streaming,
|
|
24
|
+
onRetry,
|
|
25
|
+
onRegenerate,
|
|
26
|
+
actionsOf,
|
|
27
|
+
onFeedback,
|
|
28
|
+
onEdit,
|
|
29
|
+
onLoadMore,
|
|
30
|
+
hasMore = false,
|
|
31
|
+
loadingMore = false,
|
|
32
|
+
attachments,
|
|
33
|
+
onAttach,
|
|
34
|
+
onRemoveAttachment,
|
|
35
|
+
accept,
|
|
36
|
+
disabled = false,
|
|
37
|
+
disabledPlaceholder,
|
|
38
|
+
placeholder,
|
|
39
|
+
variant = "plain",
|
|
40
|
+
assistantName = "Assistant",
|
|
41
|
+
assistantAvatar,
|
|
42
|
+
userName = "You",
|
|
43
|
+
userAvatar,
|
|
44
|
+
showUserAvatar = false,
|
|
45
|
+
emptyTitle = "No messages yet",
|
|
46
|
+
emptyBody = "Write the first one below.",
|
|
47
|
+
emptyState,
|
|
48
|
+
header,
|
|
49
|
+
shape = "box",
|
|
50
|
+
tools,
|
|
51
|
+
menu,
|
|
52
|
+
suggestions,
|
|
53
|
+
suggestionsWhen = "empty",
|
|
54
|
+
suggestionsLook = "chips",
|
|
55
|
+
suggestionMode = "send",
|
|
56
|
+
label = "Conversation",
|
|
57
|
+
height = "min(40rem, 80dvh)",
|
|
58
|
+
className,
|
|
59
|
+
}) {
|
|
60
|
+
const list = messages ?? [];
|
|
61
|
+
// Streaming when told so, or when the last message says it still is.
|
|
62
|
+
const busy = streaming ?? list.some((m) => m.status === "streaming");
|
|
63
|
+
// The message being edited: one at a time, and ArrowUp in an empty
|
|
64
|
+
// composer opens the last one you sent.
|
|
65
|
+
const [editingId, setEditingId] = useState(null);
|
|
66
|
+
const lastMine = onEdit ? [...list].reverse().find((m) => m.role === "user" && m.status !== "sending") : null;
|
|
67
|
+
const showSuggestions = suggestions && suggestions.length && (suggestionsWhen === "always" || list.length === 0);
|
|
68
|
+
|
|
69
|
+
const top = !header ? null : isValidElement(header) || typeof header !== "object" ? header : <ChatHeader {...header} />;
|
|
70
|
+
|
|
71
|
+
return (
|
|
72
|
+
<section
|
|
73
|
+
aria-label={label}
|
|
74
|
+
style={height ? { height } : undefined}
|
|
75
|
+
className={cx("flex min-h-0 flex-col overflow-hidden rounded-lg border border-border bg-card text-card-foreground", className)}
|
|
76
|
+
>
|
|
77
|
+
{top}
|
|
78
|
+
<MessageScroller
|
|
79
|
+
messages={list}
|
|
80
|
+
onLoadMore={onLoadMore}
|
|
81
|
+
hasMore={hasMore}
|
|
82
|
+
loadingMore={loadingMore}
|
|
83
|
+
label={`${label} messages`}
|
|
84
|
+
className="flex-1"
|
|
85
|
+
emptyState={emptyState ?? <Empty icon="mail" title={emptyTitle} body={emptyBody} className="my-auto" />}
|
|
86
|
+
renderMessage={(m, ctx) => (
|
|
87
|
+
<Message
|
|
88
|
+
message={m}
|
|
89
|
+
first={ctx.first}
|
|
90
|
+
last={ctx.last}
|
|
91
|
+
latest={ctx.latest}
|
|
92
|
+
variant={variant}
|
|
93
|
+
assistantName={assistantName}
|
|
94
|
+
assistantAvatar={assistantAvatar}
|
|
95
|
+
userName={userName}
|
|
96
|
+
userAvatar={userAvatar}
|
|
97
|
+
showUserAvatar={showUserAvatar}
|
|
98
|
+
onRetry={onRetry}
|
|
99
|
+
onRegenerate={onRegenerate}
|
|
100
|
+
actionsOf={actionsOf}
|
|
101
|
+
onFeedback={onFeedback}
|
|
102
|
+
onEdit={onEdit}
|
|
103
|
+
editing={onEdit ? editingId === m.id : undefined}
|
|
104
|
+
onEditingChange={(next) => setEditingId(next ? m.id : null)}
|
|
105
|
+
/>
|
|
106
|
+
)}
|
|
107
|
+
/>
|
|
108
|
+
<div className="border-t border-border p-2 sm:p-3">
|
|
109
|
+
<Composer
|
|
110
|
+
onSend={onSend}
|
|
111
|
+
onStop={onStop}
|
|
112
|
+
streaming={busy}
|
|
113
|
+
disabled={disabled}
|
|
114
|
+
disabledPlaceholder={disabledPlaceholder}
|
|
115
|
+
placeholder={placeholder}
|
|
116
|
+
attachments={attachments}
|
|
117
|
+
onAttach={onAttach}
|
|
118
|
+
onRemoveAttachment={onRemoveAttachment}
|
|
119
|
+
accept={accept}
|
|
120
|
+
shape={shape}
|
|
121
|
+
tools={tools}
|
|
122
|
+
menu={menu}
|
|
123
|
+
suggestions={showSuggestions ? suggestions : undefined}
|
|
124
|
+
suggestionsLook={suggestionsLook}
|
|
125
|
+
suggestionsPlacement="above"
|
|
126
|
+
suggestionMode={suggestionMode}
|
|
127
|
+
onEditLast={lastMine && !disabled && !busy ? () => setEditingId(lastMine.id) : undefined}
|
|
128
|
+
/>
|
|
129
|
+
</div>
|
|
130
|
+
</section>
|
|
131
|
+
);
|
|
132
|
+
}
|