@signalflare-ai/ui 0.5.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/CHANGELOG.md +96 -0
- package/README.md +527 -0
- package/ai/USAGE.md +200 -0
- package/ai/component-registry.json +7103 -0
- package/ai/component-registry.md +3046 -0
- package/ai/schemas.ts +1230 -0
- package/bin/intent.js +23 -0
- package/bin/sf.js +34 -0
- package/dist/.build-complete +1 -0
- package/dist/ai/schemas.d.ts +7056 -0
- package/dist/ai/schemas.d.ts.map +1 -0
- package/dist/ai-actions-DG1dhDMP.js +57 -0
- package/dist/ai-actions-DG1dhDMP.js.map +1 -0
- package/dist/ai-agent-card-BbtL4NII.js +171 -0
- package/dist/ai-agent-card-BbtL4NII.js.map +1 -0
- package/dist/ai-approval-Mb7-BY6i.js +184 -0
- package/dist/ai-approval-Mb7-BY6i.js.map +1 -0
- package/dist/ai-code-block-BI_z0UVR.js +110 -0
- package/dist/ai-code-block-BI_z0UVR.js.map +1 -0
- package/dist/ai-conversation-DYtExcrw.js +184 -0
- package/dist/ai-conversation-DYtExcrw.js.map +1 -0
- package/dist/ai-info-banner-BpzauUAY.js +76 -0
- package/dist/ai-info-banner-BpzauUAY.js.map +1 -0
- package/dist/ai-loader-Cr3eQkNS.js +134 -0
- package/dist/ai-loader-Cr3eQkNS.js.map +1 -0
- package/dist/ai-message-CV8SBoHM.js +286 -0
- package/dist/ai-message-CV8SBoHM.js.map +1 -0
- package/dist/ai-mission-header-ByYkJ6YP.js +171 -0
- package/dist/ai-mission-header-ByYkJ6YP.js.map +1 -0
- package/dist/ai-prompt-input-Bo1YuJly.js +769 -0
- package/dist/ai-prompt-input-Bo1YuJly.js.map +1 -0
- package/dist/ai-question-Dp1g9k2o.js +149 -0
- package/dist/ai-question-Dp1g9k2o.js.map +1 -0
- package/dist/ai-reasoning-UAmNx_LD.js +270 -0
- package/dist/ai-reasoning-UAmNx_LD.js.map +1 -0
- package/dist/ai-response-BWoVsNQG.js +42 -0
- package/dist/ai-response-BWoVsNQG.js.map +1 -0
- package/dist/ai-shimmer-BpOmfonu.js +43 -0
- package/dist/ai-shimmer-BpOmfonu.js.map +1 -0
- package/dist/ai-status-badge-WhbKVeqn.js +63 -0
- package/dist/ai-status-badge-WhbKVeqn.js.map +1 -0
- package/dist/ai-streaming-text-ClL7FwvD.js +81 -0
- package/dist/ai-streaming-text-ClL7FwvD.js.map +1 -0
- package/dist/ai-subagent-BruGN1UE.js +133 -0
- package/dist/ai-subagent-BruGN1UE.js.map +1 -0
- package/dist/ai-suggestion-CNsCZj5P.js +55 -0
- package/dist/ai-suggestion-CNsCZj5P.js.map +1 -0
- package/dist/ai-task-list-B9CpMDYN.js +120 -0
- package/dist/ai-task-list-B9CpMDYN.js.map +1 -0
- package/dist/ai-timeline-Bb5ntsr3.js +373 -0
- package/dist/ai-timeline-Bb5ntsr3.js.map +1 -0
- package/dist/ai-tool-BGH8nQ_D.js +437 -0
- package/dist/ai-tool-BGH8nQ_D.js.map +1 -0
- package/dist/ai-usage-bar-BI-p-JBk.js +70 -0
- package/dist/ai-usage-bar-BI-p-JBk.js.map +1 -0
- package/dist/badge-D_eaA6wv.js +128 -0
- package/dist/badge-D_eaA6wv.js.map +1 -0
- package/dist/banner-B_6oBrsu.js +54 -0
- package/dist/banner-B_6oBrsu.js.map +1 -0
- package/dist/breadcrumbs-BlmeYfgq.js +128 -0
- package/dist/breadcrumbs-BlmeYfgq.js.map +1 -0
- package/dist/button-De0267YU.js +170 -0
- package/dist/button-De0267YU.js.map +1 -0
- package/dist/catalog.js +506 -0
- package/dist/catalog.js.map +1 -0
- package/dist/chart-Bes4MN3C.js +618 -0
- package/dist/chart-Bes4MN3C.js.map +1 -0
- package/dist/checkbox-CPX7lBaU.js +153 -0
- package/dist/checkbox-CPX7lBaU.js.map +1 -0
- package/dist/clipboard-text-92YeCybc.js +176 -0
- package/dist/clipboard-text-92YeCybc.js.map +1 -0
- package/dist/cn-YROP2_ox.js +25 -0
- package/dist/cn-YROP2_ox.js.map +1 -0
- package/dist/code-DE1Yy1Cu.js +97 -0
- package/dist/code-DE1Yy1Cu.js.map +1 -0
- package/dist/collapsible-DWsXeXmS.js +72 -0
- package/dist/collapsible-DWsXeXmS.js.map +1 -0
- package/dist/combobox-B0bLdsX8.js +197 -0
- package/dist/combobox-B0bLdsX8.js.map +1 -0
- package/dist/command-line/cli.js +823 -0
- package/dist/command-palette-CBTY8EiF.js +484 -0
- package/dist/command-palette-CBTY8EiF.js.map +1 -0
- package/dist/components/ai-actions.js +3 -0
- package/dist/components/ai-agent-card.js +3 -0
- package/dist/components/ai-approval.js +3 -0
- package/dist/components/ai-code-block.js +3 -0
- package/dist/components/ai-conversation.js +3 -0
- package/dist/components/ai-info-banner.js +3 -0
- package/dist/components/ai-loader.js +3 -0
- package/dist/components/ai-message.js +3 -0
- package/dist/components/ai-mission-header.js +3 -0
- package/dist/components/ai-prompt-input.js +3 -0
- package/dist/components/ai-question.js +3 -0
- package/dist/components/ai-reasoning.js +3 -0
- package/dist/components/ai-response.js +3 -0
- package/dist/components/ai-shimmer.js +3 -0
- package/dist/components/ai-status-badge.js +3 -0
- package/dist/components/ai-streaming-text.js +3 -0
- package/dist/components/ai-subagent.js +3 -0
- package/dist/components/ai-suggestion.js +3 -0
- package/dist/components/ai-task-list.js +3 -0
- package/dist/components/ai-timeline.js +3 -0
- package/dist/components/ai-tool.js +3 -0
- package/dist/components/ai-usage-bar.js +3 -0
- package/dist/components/badge.js +3 -0
- package/dist/components/banner.js +3 -0
- package/dist/components/breadcrumbs.js +3 -0
- package/dist/components/button.js +3 -0
- package/dist/components/chart.js +3 -0
- package/dist/components/checkbox.js +3 -0
- package/dist/components/clipboard-text.js +3 -0
- package/dist/components/code.js +3 -0
- package/dist/components/collapsible.js +3 -0
- package/dist/components/combobox.js +3 -0
- package/dist/components/command-palette.js +3 -0
- package/dist/components/data-grid.js +3 -0
- package/dist/components/date-picker.js +3 -0
- package/dist/components/date-range-picker.js +3 -0
- package/dist/components/dialog.js +3 -0
- package/dist/components/dropdown.js +3 -0
- package/dist/components/empty.js +3 -0
- package/dist/components/field.js +3 -0
- package/dist/components/filters.js +3 -0
- package/dist/components/flow.js +3 -0
- package/dist/components/grid.js +3 -0
- package/dist/components/input.js +4 -0
- package/dist/components/label.js +3 -0
- package/dist/components/layer-card.js +3 -0
- package/dist/components/link.js +92 -0
- package/dist/components/link.js.map +1 -0
- package/dist/components/loader.js +4 -0
- package/dist/components/menubar.js +3 -0
- package/dist/components/meter.js +3 -0
- package/dist/components/pagination.js +3 -0
- package/dist/components/popover.js +3 -0
- package/dist/components/radio.js +3 -0
- package/dist/components/select.js +3 -0
- package/dist/components/sensitive-input.js +3 -0
- package/dist/components/sidebar.js +3 -0
- package/dist/components/signalflare-ai-logo.js +3 -0
- package/dist/components/surface.js +3 -0
- package/dist/components/switch.js +3 -0
- package/dist/components/table.js +3 -0
- package/dist/components/tabs.js +3 -0
- package/dist/components/text.js +3 -0
- package/dist/components/theme-toggle.js +3 -0
- package/dist/components/toast.js +3 -0
- package/dist/components/tooltip.js +3 -0
- package/dist/components/use-agent-harness.js +3 -0
- package/dist/data-grid-UJ9ja5cu.js +305 -0
- package/dist/data-grid-UJ9ja5cu.js.map +1 -0
- package/dist/date-picker-ebekkC3R.js +57 -0
- package/dist/date-picker-ebekkC3R.js.map +1 -0
- package/dist/date-range-picker-D75LLINc.js +347 -0
- package/dist/date-range-picker-D75LLINc.js.map +1 -0
- package/dist/dialog-CyHEQXEY.js +104 -0
- package/dist/dialog-CyHEQXEY.js.map +1 -0
- package/dist/dist-BNlyONdD.js +3546 -0
- package/dist/dist-BNlyONdD.js.map +1 -0
- package/dist/dropdown-J5T4pHaR.js +202 -0
- package/dist/dropdown-J5T4pHaR.js.map +1 -0
- package/dist/empty-D2TypIId.js +90 -0
- package/dist/empty-D2TypIId.js.map +1 -0
- package/dist/favicon.svg +4 -0
- package/dist/field-Y_UK1_Cg.js +57 -0
- package/dist/field-Y_UK1_Cg.js.map +1 -0
- package/dist/filters-BdBogf7D.js +682 -0
- package/dist/filters-BdBogf7D.js.map +1 -0
- package/dist/flow-BRsYUCJa.js +741 -0
- package/dist/flow-BRsYUCJa.js.map +1 -0
- package/dist/genui.js +40 -0
- package/dist/genui.js.map +1 -0
- package/dist/grid-qUAN9hFx.js +119 -0
- package/dist/grid-qUAN9hFx.js.map +1 -0
- package/dist/highlight-to-react-ClEfL81q.js +57 -0
- package/dist/highlight-to-react-ClEfL81q.js.map +1 -0
- package/dist/index.js +215 -0
- package/dist/index.js.map +1 -0
- package/dist/input-BxQAnXki.js +81 -0
- package/dist/input-BxQAnXki.js.map +1 -0
- package/dist/input-Cn25I4o5.js +121 -0
- package/dist/input-Cn25I4o5.js.map +1 -0
- package/dist/label-QtJxtJ4u.js +70 -0
- package/dist/label-QtJxtJ4u.js.map +1 -0
- package/dist/layer-card-BME0eljh.js +44 -0
- package/dist/layer-card-BME0eljh.js.map +1 -0
- package/dist/link-provider-BUZKXaNE.js +25 -0
- package/dist/link-provider-BUZKXaNE.js.map +1 -0
- package/dist/loader-DAcc-Uag.js +84 -0
- package/dist/loader-DAcc-Uag.js.map +1 -0
- package/dist/logo.svg +1 -0
- package/dist/menubar-C8NzAjfd.js +102 -0
- package/dist/menubar-C8NzAjfd.js.map +1 -0
- package/dist/meter-CpmTenEr.js +37 -0
- package/dist/meter-CpmTenEr.js.map +1 -0
- package/dist/pagination-C_YqCy8l.js +117 -0
- package/dist/pagination-C_YqCy8l.js.map +1 -0
- package/dist/popover-BRQZ2b6z.js +147 -0
- package/dist/popover-BRQZ2b6z.js.map +1 -0
- package/dist/primitives/accordion.js +2 -0
- package/dist/primitives/alert-dialog.js +2 -0
- package/dist/primitives/autocomplete.js +2 -0
- package/dist/primitives/avatar.js +2 -0
- package/dist/primitives/button.js +2 -0
- package/dist/primitives/checkbox-group.js +2 -0
- package/dist/primitives/checkbox.js +2 -0
- package/dist/primitives/collapsible.js +2 -0
- package/dist/primitives/combobox.js +2 -0
- package/dist/primitives/context-menu.js +2 -0
- package/dist/primitives/csp-provider.js +2 -0
- package/dist/primitives/dialog.js +2 -0
- package/dist/primitives/direction-provider.js +2 -0
- package/dist/primitives/drawer.js +2 -0
- package/dist/primitives/field.js +2 -0
- package/dist/primitives/fieldset.js +2 -0
- package/dist/primitives/form.js +2 -0
- package/dist/primitives/input.js +2 -0
- package/dist/primitives/menu.js +2 -0
- package/dist/primitives/menubar.js +2 -0
- package/dist/primitives/meter.js +2 -0
- package/dist/primitives/navigation-menu.js +2 -0
- package/dist/primitives/number-field.js +2 -0
- package/dist/primitives/popover.js +2 -0
- package/dist/primitives/preview-card.js +2 -0
- package/dist/primitives/progress.js +2 -0
- package/dist/primitives/radio-group.js +2 -0
- package/dist/primitives/radio.js +2 -0
- package/dist/primitives/scroll-area.js +2 -0
- package/dist/primitives/select.js +2 -0
- package/dist/primitives/separator.js +2 -0
- package/dist/primitives/slider.js +2 -0
- package/dist/primitives/switch.js +2 -0
- package/dist/primitives/tabs.js +2 -0
- package/dist/primitives/toast.js +2 -0
- package/dist/primitives/toggle-group.js +2 -0
- package/dist/primitives/toggle.js +2 -0
- package/dist/primitives/toolbar.js +2 -0
- package/dist/primitives/tooltip.js +2 -0
- package/dist/primitives.js +40 -0
- package/dist/radio-B7zg1wUI.js +101 -0
- package/dist/radio-B7zg1wUI.js.map +1 -0
- package/dist/registry.js +1 -0
- package/dist/select-9p721G00.js +95 -0
- package/dist/select-9p721G00.js.map +1 -0
- package/dist/sensitive-input-D5je2NLl.js +248 -0
- package/dist/sensitive-input-D5je2NLl.js.map +1 -0
- package/dist/sidebar-DOwBrq57.js +964 -0
- package/dist/sidebar-DOwBrq57.js.map +1 -0
- package/dist/signalflare-ai-logo-DDhxMJD6.js +260 -0
- package/dist/signalflare-ai-logo-DDhxMJD6.js.map +1 -0
- package/dist/skeleton-line-Do3UmGk9.js +36 -0
- package/dist/skeleton-line-Do3UmGk9.js.map +1 -0
- package/dist/src/blocks/agent-harness/agent-harness.d.ts +177 -0
- package/dist/src/blocks/agent-harness/agent-harness.d.ts.map +1 -0
- package/dist/src/blocks/agent-harness/agent-harness.tsx +1122 -0
- package/dist/src/blocks/agent-harness/index.d.ts +2 -0
- package/dist/src/blocks/agent-harness/index.d.ts.map +1 -0
- package/dist/src/blocks/commander/commander.d.ts +101 -0
- package/dist/src/blocks/commander/commander.d.ts.map +1 -0
- package/dist/src/blocks/commander/commander.tsx +477 -0
- package/dist/src/blocks/commander/index.d.ts +2 -0
- package/dist/src/blocks/commander/index.d.ts.map +1 -0
- package/dist/src/blocks/delete-resource/delete-resource.d.ts +46 -0
- package/dist/src/blocks/delete-resource/delete-resource.d.ts.map +1 -0
- package/dist/src/blocks/delete-resource/delete-resource.tsx +214 -0
- package/dist/src/blocks/delete-resource/index.d.ts +2 -0
- package/dist/src/blocks/delete-resource/index.d.ts.map +1 -0
- package/dist/src/blocks/map-block/index.d.ts +2 -0
- package/dist/src/blocks/map-block/index.d.ts.map +1 -0
- package/dist/src/blocks/map-block/map-block.d.ts +79 -0
- package/dist/src/blocks/map-block/map-block.d.ts.map +1 -0
- package/dist/src/blocks/map-block/map-block.tsx +522 -0
- package/dist/src/blocks/page-header/index.d.ts +2 -0
- package/dist/src/blocks/page-header/index.d.ts.map +1 -0
- package/dist/src/blocks/page-header/page-header.d.ts +38 -0
- package/dist/src/blocks/page-header/page-header.d.ts.map +1 -0
- package/dist/src/blocks/page-header/page-header.tsx +96 -0
- package/dist/src/blocks/resource-list/index.d.ts +2 -0
- package/dist/src/blocks/resource-list/index.d.ts.map +1 -0
- package/dist/src/blocks/resource-list/resource-list.d.ts +18 -0
- package/dist/src/blocks/resource-list/resource-list.d.ts.map +1 -0
- package/dist/src/blocks/resource-list/resource-list.test.tsx +27 -0
- package/dist/src/blocks/resource-list/resource-list.tsx +65 -0
- package/dist/src/catalog/catalog.d.ts +75 -0
- package/dist/src/catalog/catalog.d.ts.map +1 -0
- package/dist/src/catalog/data.d.ts +44 -0
- package/dist/src/catalog/data.d.ts.map +1 -0
- package/dist/src/catalog/index.d.ts +35 -0
- package/dist/src/catalog/index.d.ts.map +1 -0
- package/dist/src/catalog/sf-components.d.ts +8 -0
- package/dist/src/catalog/sf-components.d.ts.map +1 -0
- package/dist/src/catalog/sf-registry.d.ts +4 -0
- package/dist/src/catalog/sf-registry.d.ts.map +1 -0
- package/dist/src/catalog/types.d.ts +226 -0
- package/dist/src/catalog/types.d.ts.map +1 -0
- package/dist/src/catalog/visibility.d.ts +37 -0
- package/dist/src/catalog/visibility.d.ts.map +1 -0
- package/dist/src/command-line/build-cli.d.ts +7 -0
- package/dist/src/command-line/build-cli.d.ts.map +1 -0
- package/dist/src/command-line/cli.d.ts +13 -0
- package/dist/src/command-line/cli.d.ts.map +1 -0
- package/dist/src/command-line/commands/add.d.ts +10 -0
- package/dist/src/command-line/commands/add.d.ts.map +1 -0
- package/dist/src/command-line/commands/ai.d.ts +10 -0
- package/dist/src/command-line/commands/ai.d.ts.map +1 -0
- package/dist/src/command-line/commands/blocks.d.ts +10 -0
- package/dist/src/command-line/commands/blocks.d.ts.map +1 -0
- package/dist/src/command-line/commands/doc.d.ts +14 -0
- package/dist/src/command-line/commands/doc.d.ts.map +1 -0
- package/dist/src/command-line/commands/init.d.ts +18 -0
- package/dist/src/command-line/commands/init.d.ts.map +1 -0
- package/dist/src/command-line/commands/ls.d.ts +10 -0
- package/dist/src/command-line/commands/ls.d.ts.map +1 -0
- package/dist/src/command-line/commands/migrate.d.ts +10 -0
- package/dist/src/command-line/commands/migrate.d.ts.map +1 -0
- package/dist/src/command-line/utils/config.d.ts +42 -0
- package/dist/src/command-line/utils/config.d.ts.map +1 -0
- package/dist/src/command-line/utils/transformer.d.ts +21 -0
- package/dist/src/command-line/utils/transformer.d.ts.map +1 -0
- package/dist/src/components/ai-actions/ai-actions.d.ts +35 -0
- package/dist/src/components/ai-actions/ai-actions.d.ts.map +1 -0
- package/dist/src/components/ai-actions/index.d.ts +2 -0
- package/dist/src/components/ai-actions/index.d.ts.map +1 -0
- package/dist/src/components/ai-agent-card/ai-agent-card.d.ts +82 -0
- package/dist/src/components/ai-agent-card/ai-agent-card.d.ts.map +1 -0
- package/dist/src/components/ai-agent-card/index.d.ts +2 -0
- package/dist/src/components/ai-agent-card/index.d.ts.map +1 -0
- package/dist/src/components/ai-approval/ai-approval.d.ts +102 -0
- package/dist/src/components/ai-approval/ai-approval.d.ts.map +1 -0
- package/dist/src/components/ai-approval/index.d.ts +2 -0
- package/dist/src/components/ai-approval/index.d.ts.map +1 -0
- package/dist/src/components/ai-code-block/ai-code-block.d.ts +48 -0
- package/dist/src/components/ai-code-block/ai-code-block.d.ts.map +1 -0
- package/dist/src/components/ai-code-block/index.d.ts +2 -0
- package/dist/src/components/ai-code-block/index.d.ts.map +1 -0
- package/dist/src/components/ai-conversation/ai-conversation.d.ts +125 -0
- package/dist/src/components/ai-conversation/ai-conversation.d.ts.map +1 -0
- package/dist/src/components/ai-conversation/index.d.ts +2 -0
- package/dist/src/components/ai-conversation/index.d.ts.map +1 -0
- package/dist/src/components/ai-info-banner/ai-info-banner.d.ts +55 -0
- package/dist/src/components/ai-info-banner/ai-info-banner.d.ts.map +1 -0
- package/dist/src/components/ai-info-banner/index.d.ts +2 -0
- package/dist/src/components/ai-info-banner/index.d.ts.map +1 -0
- package/dist/src/components/ai-loader/ai-loader.d.ts +44 -0
- package/dist/src/components/ai-loader/ai-loader.d.ts.map +1 -0
- package/dist/src/components/ai-loader/index.d.ts +2 -0
- package/dist/src/components/ai-loader/index.d.ts.map +1 -0
- package/dist/src/components/ai-message/ai-message.d.ts +97 -0
- package/dist/src/components/ai-message/ai-message.d.ts.map +1 -0
- package/dist/src/components/ai-message/index.d.ts +2 -0
- package/dist/src/components/ai-message/index.d.ts.map +1 -0
- package/dist/src/components/ai-mission-header/ai-mission-header.d.ts +62 -0
- package/dist/src/components/ai-mission-header/ai-mission-header.d.ts.map +1 -0
- package/dist/src/components/ai-mission-header/index.d.ts +2 -0
- package/dist/src/components/ai-mission-header/index.d.ts.map +1 -0
- package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts +260 -0
- package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -0
- package/dist/src/components/ai-prompt-input/index.d.ts +2 -0
- package/dist/src/components/ai-prompt-input/index.d.ts.map +1 -0
- package/dist/src/components/ai-question/ai-question.d.ts +73 -0
- package/dist/src/components/ai-question/ai-question.d.ts.map +1 -0
- package/dist/src/components/ai-question/index.d.ts +2 -0
- package/dist/src/components/ai-question/index.d.ts.map +1 -0
- package/dist/src/components/ai-reasoning/ai-reasoning.d.ts +107 -0
- package/dist/src/components/ai-reasoning/ai-reasoning.d.ts.map +1 -0
- package/dist/src/components/ai-reasoning/index.d.ts +2 -0
- package/dist/src/components/ai-reasoning/index.d.ts.map +1 -0
- package/dist/src/components/ai-response/ai-response.d.ts +26 -0
- package/dist/src/components/ai-response/ai-response.d.ts.map +1 -0
- package/dist/src/components/ai-response/index.d.ts +2 -0
- package/dist/src/components/ai-response/index.d.ts.map +1 -0
- package/dist/src/components/ai-shimmer/ai-shimmer.d.ts +29 -0
- package/dist/src/components/ai-shimmer/ai-shimmer.d.ts.map +1 -0
- package/dist/src/components/ai-shimmer/index.d.ts +2 -0
- package/dist/src/components/ai-shimmer/index.d.ts.map +1 -0
- package/dist/src/components/ai-status-badge/ai-status-badge.d.ts +46 -0
- package/dist/src/components/ai-status-badge/ai-status-badge.d.ts.map +1 -0
- package/dist/src/components/ai-status-badge/index.d.ts +2 -0
- package/dist/src/components/ai-status-badge/index.d.ts.map +1 -0
- package/dist/src/components/ai-streaming-text/ai-streaming-text.d.ts +27 -0
- package/dist/src/components/ai-streaming-text/ai-streaming-text.d.ts.map +1 -0
- package/dist/src/components/ai-streaming-text/index.d.ts +2 -0
- package/dist/src/components/ai-streaming-text/index.d.ts.map +1 -0
- package/dist/src/components/ai-subagent/ai-subagent.d.ts +74 -0
- package/dist/src/components/ai-subagent/ai-subagent.d.ts.map +1 -0
- package/dist/src/components/ai-subagent/index.d.ts +2 -0
- package/dist/src/components/ai-subagent/index.d.ts.map +1 -0
- package/dist/src/components/ai-suggestion/ai-suggestion.d.ts +40 -0
- package/dist/src/components/ai-suggestion/ai-suggestion.d.ts.map +1 -0
- package/dist/src/components/ai-suggestion/index.d.ts +2 -0
- package/dist/src/components/ai-suggestion/index.d.ts.map +1 -0
- package/dist/src/components/ai-task-list/ai-task-list.d.ts +61 -0
- package/dist/src/components/ai-task-list/ai-task-list.d.ts.map +1 -0
- package/dist/src/components/ai-task-list/index.d.ts +2 -0
- package/dist/src/components/ai-task-list/index.d.ts.map +1 -0
- package/dist/src/components/ai-timeline/ai-timeline.d.ts +130 -0
- package/dist/src/components/ai-timeline/ai-timeline.d.ts.map +1 -0
- package/dist/src/components/ai-timeline/index.d.ts +2 -0
- package/dist/src/components/ai-timeline/index.d.ts.map +1 -0
- package/dist/src/components/ai-tool/ai-tool.d.ts +138 -0
- package/dist/src/components/ai-tool/ai-tool.d.ts.map +1 -0
- package/dist/src/components/ai-tool/index.d.ts +2 -0
- package/dist/src/components/ai-tool/index.d.ts.map +1 -0
- package/dist/src/components/ai-usage-bar/ai-usage-bar.d.ts +38 -0
- package/dist/src/components/ai-usage-bar/ai-usage-bar.d.ts.map +1 -0
- package/dist/src/components/ai-usage-bar/index.d.ts +2 -0
- package/dist/src/components/ai-usage-bar/index.d.ts.map +1 -0
- package/dist/src/components/badge/badge.d.ts +129 -0
- package/dist/src/components/badge/badge.d.ts.map +1 -0
- package/dist/src/components/badge/index.d.ts +2 -0
- package/dist/src/components/badge/index.d.ts.map +1 -0
- package/dist/src/components/banner/banner.d.ts +80 -0
- package/dist/src/components/banner/banner.d.ts.map +1 -0
- package/dist/src/components/banner/index.d.ts +2 -0
- package/dist/src/components/banner/index.d.ts.map +1 -0
- package/dist/src/components/breadcrumbs/breadcrumbs.d.ts +78 -0
- package/dist/src/components/breadcrumbs/breadcrumbs.d.ts.map +1 -0
- package/dist/src/components/breadcrumbs/index.d.ts +2 -0
- package/dist/src/components/breadcrumbs/index.d.ts.map +1 -0
- package/dist/src/components/button/button.d.ts +212 -0
- package/dist/src/components/button/button.d.ts.map +1 -0
- package/dist/src/components/button/index.d.ts +2 -0
- package/dist/src/components/button/index.d.ts.map +1 -0
- package/dist/src/components/chart/color.d.ts +98 -0
- package/dist/src/components/chart/color.d.ts.map +1 -0
- package/dist/src/components/chart/echart.d.ts +135 -0
- package/dist/src/components/chart/echart.d.ts.map +1 -0
- package/dist/src/components/chart/index.d.ts +5 -0
- package/dist/src/components/chart/index.d.ts.map +1 -0
- package/dist/src/components/chart/legend.d.ts +42 -0
- package/dist/src/components/chart/legend.d.ts.map +1 -0
- package/dist/src/components/chart/timeseries-chart.d.ts +119 -0
- package/dist/src/components/chart/timeseries-chart.d.ts.map +1 -0
- package/dist/src/components/checkbox/checkbox.d.ts +174 -0
- package/dist/src/components/checkbox/checkbox.d.ts.map +1 -0
- package/dist/src/components/checkbox/index.d.ts +2 -0
- package/dist/src/components/checkbox/index.d.ts.map +1 -0
- package/dist/src/components/clipboard-text/clipboard-text.d.ts +86 -0
- package/dist/src/components/clipboard-text/clipboard-text.d.ts.map +1 -0
- package/dist/src/components/clipboard-text/index.d.ts +2 -0
- package/dist/src/components/clipboard-text/index.d.ts.map +1 -0
- package/dist/src/components/code/code.d.ts +165 -0
- package/dist/src/components/code/code.d.ts.map +1 -0
- package/dist/src/components/code/index.d.ts +4 -0
- package/dist/src/components/code/index.d.ts.map +1 -0
- package/dist/src/components/collapsible/collapsible.d.ts +72 -0
- package/dist/src/components/collapsible/collapsible.d.ts.map +1 -0
- package/dist/src/components/collapsible/index.d.ts +2 -0
- package/dist/src/components/collapsible/index.d.ts.map +1 -0
- package/dist/src/components/combobox/combobox.d.ts +188 -0
- package/dist/src/components/combobox/combobox.d.ts.map +1 -0
- package/dist/src/components/combobox/index.d.ts +2 -0
- package/dist/src/components/combobox/index.d.ts.map +1 -0
- package/dist/src/components/command-palette/command-palette.d.ts +260 -0
- package/dist/src/components/command-palette/command-palette.d.ts.map +1 -0
- package/dist/src/components/command-palette/index.d.ts +3 -0
- package/dist/src/components/command-palette/index.d.ts.map +1 -0
- package/dist/src/components/command-palette/types.d.ts +149 -0
- package/dist/src/components/command-palette/types.d.ts.map +1 -0
- package/dist/src/components/data-grid/data-grid.d.ts +78 -0
- package/dist/src/components/data-grid/data-grid.d.ts.map +1 -0
- package/dist/src/components/data-grid/index.d.ts +3 -0
- package/dist/src/components/data-grid/index.d.ts.map +1 -0
- package/dist/src/components/data-grid/types.d.ts +236 -0
- package/dist/src/components/data-grid/types.d.ts.map +1 -0
- package/dist/src/components/date-picker/date-picker.d.ts +65 -0
- package/dist/src/components/date-picker/date-picker.d.ts.map +1 -0
- package/dist/src/components/date-picker/index.d.ts +4 -0
- package/dist/src/components/date-picker/index.d.ts.map +1 -0
- package/dist/src/components/date-range-picker/date-range-picker.d.ts +125 -0
- package/dist/src/components/date-range-picker/date-range-picker.d.ts.map +1 -0
- package/dist/src/components/date-range-picker/index.d.ts +5 -0
- package/dist/src/components/date-range-picker/index.d.ts.map +1 -0
- package/dist/src/components/dialog/dialog.d.ts +189 -0
- package/dist/src/components/dialog/dialog.d.ts.map +1 -0
- package/dist/src/components/dialog/index.d.ts +2 -0
- package/dist/src/components/dialog/index.d.ts.map +1 -0
- package/dist/src/components/dropdown/dropdown.d.ts +91 -0
- package/dist/src/components/dropdown/dropdown.d.ts.map +1 -0
- package/dist/src/components/dropdown/index.d.ts +2 -0
- package/dist/src/components/dropdown/index.d.ts.map +1 -0
- package/dist/src/components/empty/empty.d.ts +69 -0
- package/dist/src/components/empty/empty.d.ts.map +1 -0
- package/dist/src/components/empty/index.d.ts +2 -0
- package/dist/src/components/empty/index.d.ts.map +1 -0
- package/dist/src/components/field/field.d.ts +68 -0
- package/dist/src/components/field/field.d.ts.map +1 -0
- package/dist/src/components/field/index.d.ts +2 -0
- package/dist/src/components/field/index.d.ts.map +1 -0
- package/dist/src/components/filters/filters.d.ts +54 -0
- package/dist/src/components/filters/filters.d.ts.map +1 -0
- package/dist/src/components/filters/helpers.d.ts +56 -0
- package/dist/src/components/filters/helpers.d.ts.map +1 -0
- package/dist/src/components/filters/index.d.ts +3 -0
- package/dist/src/components/filters/index.d.ts.map +1 -0
- package/dist/src/components/filters/types.d.ts +148 -0
- package/dist/src/components/filters/types.d.ts.map +1 -0
- package/dist/src/components/flow/connectors.d.ts +35 -0
- package/dist/src/components/flow/connectors.d.ts.map +1 -0
- package/dist/src/components/flow/diagram.d.ts +62 -0
- package/dist/src/components/flow/diagram.d.ts.map +1 -0
- package/dist/src/components/flow/index.d.ts +26 -0
- package/dist/src/components/flow/index.d.ts.map +1 -0
- package/dist/src/components/flow/node.d.ts +52 -0
- package/dist/src/components/flow/node.d.ts.map +1 -0
- package/dist/src/components/flow/parallel.d.ts +5 -0
- package/dist/src/components/flow/parallel.d.ts.map +1 -0
- package/dist/src/components/flow/use-children.d.ts +69 -0
- package/dist/src/components/flow/use-children.d.ts.map +1 -0
- package/dist/src/components/grid/grid.d.ts +135 -0
- package/dist/src/components/grid/grid.d.ts.map +1 -0
- package/dist/src/components/grid/index.d.ts +2 -0
- package/dist/src/components/grid/index.d.ts.map +1 -0
- package/dist/src/components/input/index.d.ts +4 -0
- package/dist/src/components/input/index.d.ts.map +1 -0
- package/dist/src/components/input/input-area.d.ts +65 -0
- package/dist/src/components/input/input-area.d.ts.map +1 -0
- package/dist/src/components/input/input-group.d.ts +39 -0
- package/dist/src/components/input/input-group.d.ts.map +1 -0
- package/dist/src/components/input/input.d.ts +172 -0
- package/dist/src/components/input/input.d.ts.map +1 -0
- package/dist/src/components/label/index.d.ts +2 -0
- package/dist/src/components/label/index.d.ts.map +1 -0
- package/dist/src/components/label/label.d.ts +67 -0
- package/dist/src/components/label/label.d.ts.map +1 -0
- package/dist/src/components/layer-card/index.d.ts +2 -0
- package/dist/src/components/layer-card/index.d.ts.map +1 -0
- package/dist/src/components/layer-card/layer-card.d.ts +29 -0
- package/dist/src/components/layer-card/layer-card.d.ts.map +1 -0
- package/dist/src/components/link/index.d.ts +2 -0
- package/dist/src/components/link/index.d.ts.map +1 -0
- package/dist/src/components/link/link.d.ts +55 -0
- package/dist/src/components/link/link.d.ts.map +1 -0
- package/dist/src/components/loader/index.d.ts +3 -0
- package/dist/src/components/loader/index.d.ts.map +1 -0
- package/dist/src/components/loader/loader.d.ts +65 -0
- package/dist/src/components/loader/loader.d.ts.map +1 -0
- package/dist/src/components/loader/skeleton-line.d.ts +10 -0
- package/dist/src/components/loader/skeleton-line.d.ts.map +1 -0
- package/dist/src/components/menubar/index.d.ts +3 -0
- package/dist/src/components/menubar/index.d.ts.map +1 -0
- package/dist/src/components/menubar/menubar.d.ts +66 -0
- package/dist/src/components/menubar/menubar.d.ts.map +1 -0
- package/dist/src/components/menubar/use-menu-navigation.d.ts +8 -0
- package/dist/src/components/menubar/use-menu-navigation.d.ts.map +1 -0
- package/dist/src/components/meter/index.d.ts +2 -0
- package/dist/src/components/meter/index.d.ts.map +1 -0
- package/dist/src/components/meter/meter.d.ts +44 -0
- package/dist/src/components/meter/meter.d.ts.map +1 -0
- package/dist/src/components/pagination/index.d.ts +2 -0
- package/dist/src/components/pagination/index.d.ts.map +1 -0
- package/dist/src/components/pagination/pagination.d.ts +60 -0
- package/dist/src/components/pagination/pagination.d.ts.map +1 -0
- package/dist/src/components/popover/index.d.ts +3 -0
- package/dist/src/components/popover/index.d.ts.map +1 -0
- package/dist/src/components/popover/popover.d.ts +138 -0
- package/dist/src/components/popover/popover.d.ts.map +1 -0
- package/dist/src/components/radio/index.d.ts +2 -0
- package/dist/src/components/radio/index.d.ts.map +1 -0
- package/dist/src/components/radio/radio.d.ts +163 -0
- package/dist/src/components/radio/radio.d.ts.map +1 -0
- package/dist/src/components/select/index.d.ts +2 -0
- package/dist/src/components/select/index.d.ts.map +1 -0
- package/dist/src/components/select/select.d.ts +150 -0
- package/dist/src/components/select/select.d.ts.map +1 -0
- package/dist/src/components/sensitive-input/index.d.ts +2 -0
- package/dist/src/components/sensitive-input/index.d.ts.map +1 -0
- package/dist/src/components/sensitive-input/sensitive-input.d.ts +94 -0
- package/dist/src/components/sensitive-input/sensitive-input.d.ts.map +1 -0
- package/dist/src/components/sidebar/index.d.ts +2 -0
- package/dist/src/components/sidebar/index.d.ts.map +1 -0
- package/dist/src/components/sidebar/sidebar.d.ts +556 -0
- package/dist/src/components/sidebar/sidebar.d.ts.map +1 -0
- package/dist/src/components/signalflare-ai-logo/index.d.ts +2 -0
- package/dist/src/components/signalflare-ai-logo/index.d.ts.map +1 -0
- package/dist/src/components/signalflare-ai-logo/signalflare-ai-logo.d.ts +171 -0
- package/dist/src/components/signalflare-ai-logo/signalflare-ai-logo.d.ts.map +1 -0
- package/dist/src/components/surface/index.d.ts +2 -0
- package/dist/src/components/surface/index.d.ts.map +1 -0
- package/dist/src/components/surface/surface.d.ts +60 -0
- package/dist/src/components/surface/surface.d.ts.map +1 -0
- package/dist/src/components/switch/index.d.ts +2 -0
- package/dist/src/components/switch/index.d.ts.map +1 -0
- package/dist/src/components/switch/switch.d.ts +169 -0
- package/dist/src/components/switch/switch.d.ts.map +1 -0
- package/dist/src/components/table/index.d.ts +2 -0
- package/dist/src/components/table/index.d.ts.map +1 -0
- package/dist/src/components/table/table.d.ts +89 -0
- package/dist/src/components/table/table.d.ts.map +1 -0
- package/dist/src/components/tabs/index.d.ts +3 -0
- package/dist/src/components/tabs/index.d.ts.map +1 -0
- package/dist/src/components/tabs/tabs.d.ts +105 -0
- package/dist/src/components/tabs/tabs.d.ts.map +1 -0
- package/dist/src/components/text/index.d.ts +2 -0
- package/dist/src/components/text/index.d.ts.map +1 -0
- package/dist/src/components/text/text.d.ts +181 -0
- package/dist/src/components/text/text.d.ts.map +1 -0
- package/dist/src/components/theme-toggle/index.d.ts +2 -0
- package/dist/src/components/theme-toggle/index.d.ts.map +1 -0
- package/dist/src/components/theme-toggle/theme-toggle.d.ts +68 -0
- package/dist/src/components/theme-toggle/theme-toggle.d.ts.map +1 -0
- package/dist/src/components/toast/index.d.ts +5 -0
- package/dist/src/components/toast/index.d.ts.map +1 -0
- package/dist/src/components/toast/toast.d.ts +152 -0
- package/dist/src/components/toast/toast.d.ts.map +1 -0
- package/dist/src/components/tooltip/index.d.ts +2 -0
- package/dist/src/components/tooltip/index.d.ts.map +1 -0
- package/dist/src/components/tooltip/tooltip.d.ts +82 -0
- package/dist/src/components/tooltip/tooltip.d.ts.map +1 -0
- package/dist/src/components/use-agent-harness/index.d.ts +2 -0
- package/dist/src/components/use-agent-harness/index.d.ts.map +1 -0
- package/dist/src/components/use-agent-harness/use-agent-harness.d.ts +642 -0
- package/dist/src/components/use-agent-harness/use-agent-harness.d.ts.map +1 -0
- package/dist/src/genui/genui.d.ts +17 -0
- package/dist/src/genui/genui.d.ts.map +1 -0
- package/dist/src/genui/index.d.ts +19 -0
- package/dist/src/genui/index.d.ts.map +1 -0
- package/dist/src/index.d.ts +102 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/lib/utils.d.ts +2 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/primitives/accordion.d.ts +13 -0
- package/dist/src/primitives/accordion.d.ts.map +1 -0
- package/dist/src/primitives/alert-dialog.d.ts +13 -0
- package/dist/src/primitives/alert-dialog.d.ts.map +1 -0
- package/dist/src/primitives/autocomplete.d.ts +13 -0
- package/dist/src/primitives/autocomplete.d.ts.map +1 -0
- package/dist/src/primitives/avatar.d.ts +13 -0
- package/dist/src/primitives/avatar.d.ts.map +1 -0
- package/dist/src/primitives/button.d.ts +13 -0
- package/dist/src/primitives/button.d.ts.map +1 -0
- package/dist/src/primitives/checkbox-group.d.ts +13 -0
- package/dist/src/primitives/checkbox-group.d.ts.map +1 -0
- package/dist/src/primitives/checkbox.d.ts +13 -0
- package/dist/src/primitives/checkbox.d.ts.map +1 -0
- package/dist/src/primitives/collapsible.d.ts +13 -0
- package/dist/src/primitives/collapsible.d.ts.map +1 -0
- package/dist/src/primitives/combobox.d.ts +13 -0
- package/dist/src/primitives/combobox.d.ts.map +1 -0
- package/dist/src/primitives/context-menu.d.ts +13 -0
- package/dist/src/primitives/context-menu.d.ts.map +1 -0
- package/dist/src/primitives/csp-provider.d.ts +13 -0
- package/dist/src/primitives/csp-provider.d.ts.map +1 -0
- package/dist/src/primitives/dialog.d.ts +13 -0
- package/dist/src/primitives/dialog.d.ts.map +1 -0
- package/dist/src/primitives/direction-provider.d.ts +13 -0
- package/dist/src/primitives/direction-provider.d.ts.map +1 -0
- package/dist/src/primitives/drawer.d.ts +13 -0
- package/dist/src/primitives/drawer.d.ts.map +1 -0
- package/dist/src/primitives/field.d.ts +13 -0
- package/dist/src/primitives/field.d.ts.map +1 -0
- package/dist/src/primitives/fieldset.d.ts +13 -0
- package/dist/src/primitives/fieldset.d.ts.map +1 -0
- package/dist/src/primitives/form.d.ts +13 -0
- package/dist/src/primitives/form.d.ts.map +1 -0
- package/dist/src/primitives/index.d.ts +54 -0
- package/dist/src/primitives/index.d.ts.map +1 -0
- package/dist/src/primitives/input.d.ts +13 -0
- package/dist/src/primitives/input.d.ts.map +1 -0
- package/dist/src/primitives/menu.d.ts +13 -0
- package/dist/src/primitives/menu.d.ts.map +1 -0
- package/dist/src/primitives/menubar.d.ts +13 -0
- package/dist/src/primitives/menubar.d.ts.map +1 -0
- package/dist/src/primitives/meter.d.ts +13 -0
- package/dist/src/primitives/meter.d.ts.map +1 -0
- package/dist/src/primitives/navigation-menu.d.ts +13 -0
- package/dist/src/primitives/navigation-menu.d.ts.map +1 -0
- package/dist/src/primitives/number-field.d.ts +13 -0
- package/dist/src/primitives/number-field.d.ts.map +1 -0
- package/dist/src/primitives/popover.d.ts +13 -0
- package/dist/src/primitives/popover.d.ts.map +1 -0
- package/dist/src/primitives/preview-card.d.ts +13 -0
- package/dist/src/primitives/preview-card.d.ts.map +1 -0
- package/dist/src/primitives/progress.d.ts +13 -0
- package/dist/src/primitives/progress.d.ts.map +1 -0
- package/dist/src/primitives/radio-group.d.ts +13 -0
- package/dist/src/primitives/radio-group.d.ts.map +1 -0
- package/dist/src/primitives/radio.d.ts +13 -0
- package/dist/src/primitives/radio.d.ts.map +1 -0
- package/dist/src/primitives/scroll-area.d.ts +13 -0
- package/dist/src/primitives/scroll-area.d.ts.map +1 -0
- package/dist/src/primitives/select.d.ts +13 -0
- package/dist/src/primitives/select.d.ts.map +1 -0
- package/dist/src/primitives/separator.d.ts +13 -0
- package/dist/src/primitives/separator.d.ts.map +1 -0
- package/dist/src/primitives/slider.d.ts +13 -0
- package/dist/src/primitives/slider.d.ts.map +1 -0
- package/dist/src/primitives/switch.d.ts +13 -0
- package/dist/src/primitives/switch.d.ts.map +1 -0
- package/dist/src/primitives/tabs.d.ts +13 -0
- package/dist/src/primitives/tabs.d.ts.map +1 -0
- package/dist/src/primitives/toast.d.ts +13 -0
- package/dist/src/primitives/toast.d.ts.map +1 -0
- package/dist/src/primitives/toggle-group.d.ts +13 -0
- package/dist/src/primitives/toggle-group.d.ts.map +1 -0
- package/dist/src/primitives/toggle.d.ts +13 -0
- package/dist/src/primitives/toggle.d.ts.map +1 -0
- package/dist/src/primitives/toolbar.d.ts +13 -0
- package/dist/src/primitives/toolbar.d.ts.map +1 -0
- package/dist/src/primitives/tooltip.d.ts +13 -0
- package/dist/src/primitives/tooltip.d.ts.map +1 -0
- package/dist/src/registry/index.d.ts +8 -0
- package/dist/src/registry/index.d.ts.map +1 -0
- package/dist/src/registry/types.d.ts +191 -0
- package/dist/src/registry/types.d.ts.map +1 -0
- package/dist/src/utils/cn.d.ts +4 -0
- package/dist/src/utils/cn.d.ts.map +1 -0
- package/dist/src/utils/highlight-to-react.d.ts +12 -0
- package/dist/src/utils/highlight-to-react.d.ts.map +1 -0
- package/dist/src/utils/index.d.ts +3 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/link-provider.d.ts +12 -0
- package/dist/src/utils/link-provider.d.ts.map +1 -0
- package/dist/src/utils/prop-examples.d.ts +36 -0
- package/dist/src/utils/prop-examples.d.ts.map +1 -0
- package/dist/styles/sf-binding.css +255 -0
- package/dist/styles/sf-standalone.css +2 -0
- package/dist/styles/sf.css +596 -0
- package/dist/styles/theme-fedramp.css +22 -0
- package/dist/styles/theme-minimal.css +127 -0
- package/dist/styles/theme-navigator.css +137 -0
- package/dist/styles/theme-sf.css +191 -0
- package/dist/surface-BduI7Ehl.js +18 -0
- package/dist/surface-BduI7Ehl.js.map +1 -0
- package/dist/switch-CzZBRBL7.js +169 -0
- package/dist/switch-CzZBRBL7.js.map +1 -0
- package/dist/table-CIMx0Oq0.js +200 -0
- package/dist/table-CIMx0Oq0.js.map +1 -0
- package/dist/tabs-1cHrYoel.js +54 -0
- package/dist/tabs-1cHrYoel.js.map +1 -0
- package/dist/text-KJmGkwnf.js +103 -0
- package/dist/text-KJmGkwnf.js.map +1 -0
- package/dist/theme-toggle-Dpgnoj_Q.js +129 -0
- package/dist/theme-toggle-Dpgnoj_Q.js.map +1 -0
- package/dist/toast-Nw28a5Cx.js +161 -0
- package/dist/toast-Nw28a5Cx.js.map +1 -0
- package/dist/tooltip-Cb7QW-7H.js +79 -0
- package/dist/tooltip-Cb7QW-7H.js.map +1 -0
- package/dist/use-agent-harness-DZzcn96L.js +929 -0
- package/dist/use-agent-harness-DZzcn96L.js.map +1 -0
- package/dist/utils.js +4 -0
- package/package.json +620 -0
- package/scripts/component-registry/cache.ts +124 -0
- package/scripts/component-registry/discovery.ts +464 -0
- package/scripts/component-registry/example-cleanup.ts +168 -0
- package/scripts/component-registry/index.test.ts +678 -0
- package/scripts/component-registry/index.ts +931 -0
- package/scripts/component-registry/markdown-generator.ts +222 -0
- package/scripts/component-registry/metadata.ts +653 -0
- package/scripts/component-registry/props-filter.ts +313 -0
- package/scripts/component-registry/schema-generator.ts +332 -0
- package/scripts/component-registry/sub-components.ts +350 -0
- package/scripts/component-registry/types.ts +156 -0
- package/scripts/component-registry/utils.ts +280 -0
- package/scripts/component-registry/variant-parser.ts +262 -0
- package/scripts/css-build.ts +117 -0
- package/scripts/generate-primitives.ts +178 -0
- package/scripts/theme-generator/config.ts +538 -0
- package/scripts/theme-generator/generate-css.ts +256 -0
- package/scripts/theme-generator/index.ts +161 -0
- package/scripts/theme-generator/migrate.ts +584 -0
- package/scripts/theme-generator/types.ts +86 -0
- package/skills/component-selection/SKILL.md +64 -0
- package/skills/installing-blocks/SKILL.md +47 -0
- package/skills/theming-and-tokens/SKILL.md +62 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-reasoning-UAmNx_LD.js","names":[],"sources":["../src/components/ai-reasoning/ai-reasoning.tsx"],"sourcesContent":["\"use client\";\n\nimport { Collapsible as BaseCollapsible } from \"@base-ui/react/collapsible\";\nimport {\n BrainIcon,\n CaretDownIcon,\n CaretRightIcon,\n SparkleIcon,\n SpinnerGapIcon,\n} from \"@phosphor-icons/react\";\nimport type { ComponentProps, ElementType } from \"react\";\nimport {\n memo,\n Suspense,\n lazy,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\n\nimport { cn } from \"../../utils/cn\";\nimport { AiStatusBadge } from \"../ai-status-badge\";\n\n// Lazy-load Streamdown for markdown rendering in reasoning content.\n// Mirrors the pattern from ai-response.tsx for SSR safety.\ntype StreamdownModule = {\n default: (props: { children: string; className?: string }) => React.ReactNode;\n};\n\nconst Streamdown = lazy((): Promise<StreamdownModule> => {\n if (typeof window === \"undefined\") {\n return Promise.resolve({\n default: ({ children }: { children: string }) => <span>{children}</span>,\n });\n }\n return import(\"streamdown\").then((sd) => ({\n default: (props: { children: string; className?: string }) => (\n <sd.Streamdown {...props} />\n ),\n }));\n});\n\n// ─── Variants ────────────────────────────────────────────────────────────────\n\nexport const SF_AI_REASONING_VARIANTS = {\n variant: {\n default: {\n classes: \"\",\n description:\n \"Expandable card with collapsible reasoning text and duration\",\n },\n inline: {\n classes: \"\",\n description: \"Compact single-line display with left accent border\",\n },\n minimal: {\n classes: \"\",\n description: \"Pill-shaped status badge\",\n },\n },\n} as const;\n\nexport const SF_AI_REASONING_DEFAULT_VARIANTS = {\n variant: \"default\",\n} as const;\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\n/** Display variant for reasoning rendering. */\nexport type AiReasoningVariant = keyof typeof SF_AI_REASONING_VARIANTS.variant;\n\n/**\n * Structured reasoning part — mirrors the shape of Vercel AI SDK's\n * `ReasoningUIPart` without requiring the `ai` package as a dependency.\n */\nexport interface AiReasoningPart {\n /** The reasoning text content. */\n text: string;\n}\n\nexport type AiReasoningProps = Omit<ComponentProps<\"div\">, \"part\"> & {\n /** Structured reasoning part data. */\n part: AiReasoningPart;\n /** Display variant. @default \"default\" */\n variant?: AiReasoningVariant;\n /** Whether reasoning is currently streaming. */\n isStreaming?: boolean;\n /** Duration in seconds (passed in or self-tracked when streaming). */\n duration?: number;\n /** Default expanded state. @default false */\n defaultExpanded?: boolean;\n /** Controlled open state. */\n open?: boolean;\n /** Called when open state changes. */\n onOpenChange?: (open: boolean) => void;\n /** Delay in ms before auto-closing after streaming ends. Set to 0 to disable. @default 1000 */\n autoCloseDelay?: number;\n /**\n * Custom icon override. Defaults to `SparkleIcon` (streaming) or `BrainIcon` (done).\n * Use to distinguish observation/reflection blocks from standard reasoning.\n */\n icon?: ElementType;\n /**\n * Custom label override. Defaults to `\"Thinking...\"` (streaming) or `\"Reasoning\"` (done).\n * Use to label observational memory blocks: `\"Observing...\"`, `\"Reflecting...\"`, etc.\n */\n label?: string;\n /**\n * Custom streaming label. When provided, used instead of `label` while `isStreaming` is true.\n * Falls back to `label`, then to the default `\"Thinking...\"`.\n */\n streamingLabel?: string;\n};\n\nexport type AiReasoningGroupProps = Omit<ComponentProps<\"div\">, \"part\"> & {\n /** Array of reasoning parts. */\n parts: AiReasoningPart[];\n /** Whether the last part is currently streaming. */\n isStreaming?: boolean;\n /** Total duration in seconds. */\n totalDuration?: number;\n /** Default expanded state. @default false */\n defaultExpanded?: boolean;\n};\n\n// ─── Utilities ───────────────────────────────────────────────────────────────\n\n/** Format seconds into a human-friendly duration string. */\nexport function formatDuration(seconds: number): string {\n if (seconds < 60) return `${seconds}s`;\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return secs > 0 ? `${mins}m ${secs}s` : `${mins}m`;\n}\n\n/** Truncate reasoning text with an ellipsis. */\nexport function truncateReasoning(text: string, maxLength = 100): string {\n if (text.length <= maxLength) return text;\n return `${text.slice(0, maxLength).trim()}...`;\n}\n\n/** Extract the first **bold** text from markdown-style reasoning. */\nexport function extractFirstBoldText(text: string): string | null {\n const match = text.match(/\\*\\*([^*]+)\\*\\*/);\n return match?.[1]?.trim() ?? null;\n}\n\n// ─── AiReasoning ─────────────────────────────────────────────────────────────\n\n/**\n * Collapsible reasoning block. Supports three display variants:\n * - `\"default\"` — expandable card with auto-open on stream start\n * - `\"inline\"` — compact single-line with left accent border\n * - `\"minimal\"` — pill-shaped status badge\n *\n * @example\n * ```tsx\n * <AiReasoning\n * part={{ text: \"First I considered the user's intent...\" }}\n * isStreaming={false}\n * duration={3}\n * />\n * ```\n */\nexport const AiReasoning = memo(\n ({\n part,\n variant = \"default\",\n isStreaming = false,\n duration: durationProp,\n defaultExpanded = false,\n open: openProp,\n onOpenChange,\n autoCloseDelay = 1000,\n icon: iconProp,\n label: labelProp,\n streamingLabel: streamingLabelProp,\n className,\n ...props\n }: AiReasoningProps) => {\n const [internalOpen, setInternalOpen] = useState(defaultExpanded);\n const [hasAutoClosed, setHasAutoClosed] = useState(false);\n const [userOpened, setUserOpened] = useState(false);\n const [internalDuration, setInternalDuration] = useState(0);\n const startTimeRef = useRef<number | null>(null);\n\n const isControlled = openProp !== undefined;\n const isOpen = isControlled ? openProp : internalOpen;\n\n const rawSetIsOpen = isControlled ? onOpenChange : setInternalOpen;\n const setIsOpen = useCallback(\n (value: boolean) => {\n rawSetIsOpen?.(value);\n },\n [rawSetIsOpen]\n );\n\n const handleUserToggle = useCallback(\n (value: boolean) => {\n if (value) setUserOpened(true);\n setIsOpen(value);\n },\n [setIsOpen]\n );\n\n const displayDuration = durationProp ?? internalDuration;\n const reasoningText = part.text || \"\";\n\n // Resolve custom icon/label (with defaults)\n // When not streaming, try to extract a dynamic title from first **bold** text\n const extractedBoldTitle = !isStreaming\n ? extractFirstBoldText(reasoningText)\n : null;\n const dynamicLabel = extractedBoldTitle\n ? truncateReasoning(extractedBoldTitle, 40)\n : null;\n const displayLabel = isStreaming\n ? (streamingLabelProp ?? labelProp ?? \"Thinking...\")\n : (labelProp ?? dynamicLabel ?? \"Reasoning\");\n const ActiveIcon = iconProp ?? (isStreaming ? SparkleIcon : BrainIcon);\n const StreamIcon = iconProp ?? SparkleIcon;\n const DoneIcon = iconProp ?? BrainIcon;\n\n // Track duration while streaming\n useEffect(() => {\n if (isStreaming) {\n if (startTimeRef.current === null) {\n startTimeRef.current = Date.now();\n }\n const interval = setInterval(() => {\n if (startTimeRef.current) {\n setInternalDuration(\n Math.round((Date.now() - startTimeRef.current) / 1000)\n );\n }\n }, 1000);\n return () => clearInterval(interval);\n }\n if (startTimeRef.current !== null) {\n setInternalDuration(\n Math.round((Date.now() - startTimeRef.current) / 1000)\n );\n startTimeRef.current = null;\n }\n }, [isStreaming]);\n\n // Auto-open on stream start, auto-close when done (unless user opened)\n useEffect(() => {\n if (isStreaming && !isOpen) {\n setUserOpened(false);\n setIsOpen(true);\n return;\n }\n if (\n !isStreaming &&\n isOpen &&\n !defaultExpanded &&\n !hasAutoClosed &&\n !userOpened &&\n autoCloseDelay > 0\n ) {\n const timer = setTimeout(() => {\n setIsOpen(false);\n setHasAutoClosed(true);\n }, autoCloseDelay);\n return () => clearTimeout(timer);\n }\n }, [\n isStreaming,\n isOpen,\n defaultExpanded,\n hasAutoClosed,\n userOpened,\n autoCloseDelay,\n setIsOpen,\n ]);\n\n // ── Minimal ──────────────────────────────────────────────────────────────\n\n if (variant === \"minimal\") {\n return (\n <BaseCollapsible.Root open={isOpen} onOpenChange={handleUserToggle}>\n <div className={cn(\"my-1.5\", className)} {...props}>\n <BaseCollapsible.Trigger\n render={<button type=\"button\" className=\"cursor-pointer\" />}\n >\n <AiStatusBadge\n className=\"py-1\"\n icon={DoneIcon}\n label={displayLabel}\n status={isStreaming ? \"running\" : \"success\"}\n />\n </BaseCollapsible.Trigger>\n <BaseCollapsible.Panel className=\"overflow-hidden\">\n <div className=\"mx-2 mt-1 rounded-lg bg-sf-tint/50 px-3 py-2\">\n <Suspense>\n <Streamdown className=\"text-sf-subtle text-sm [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\">\n {reasoningText}\n </Streamdown>\n </Suspense>\n </div>\n </BaseCollapsible.Panel>\n </div>\n </BaseCollapsible.Root>\n );\n }\n\n // ── Inline ───────────────────────────────────────────────────────────────\n\n if (variant === \"inline\") {\n return (\n <div\n className={cn(\n \"my-1.5 flex items-center gap-2 border-l-2 border-sf-line py-1 pl-2\",\n \"animate-in fade-in-0 slide-in-from-bottom-1 duration-200\",\n className\n )}\n {...props}\n >\n <ActiveIcon className=\"size-3.5 shrink-0 text-sf-subtle\" />\n <span className=\"text-sm text-sf-subtle\">{displayLabel}</span>\n {isStreaming ? (\n <SpinnerGapIcon className=\"size-3.5 animate-spin text-sf-subtle\" />\n ) : null}\n {!isStreaming && reasoningText ? (\n <span className=\"max-w-[300px] truncate text-xs text-sf-subtle/60\">\n — {truncateReasoning(reasoningText)}\n </span>\n ) : null}\n </div>\n );\n }\n\n // ── Default (compact expandable row) ─────────────────────────────────────\n\n return (\n <BaseCollapsible.Root open={isOpen} onOpenChange={handleUserToggle}>\n <div\n className={cn(\n \"my-0.5 flex w-full flex-col\",\n \"animate-in fade-in-0 duration-150\",\n className\n )}\n {...props}\n >\n {/* Trigger — content-width, left-justified */}\n <BaseCollapsible.Trigger\n render={\n <button\n type=\"button\"\n className=\"flex w-fit items-center gap-1.5 rounded px-1 py-0.5 text-left transition-colors hover:bg-sf-tint\"\n />\n }\n >\n {isStreaming ? (\n <StreamIcon className=\"size-3.5 shrink-0 animate-pulse text-sf-subtle\" />\n ) : (\n <DoneIcon className=\"size-3.5 shrink-0 text-sf-subtle\" />\n )}\n <span className=\"text-sm text-sf-subtle\">{displayLabel}</span>\n {isStreaming ? (\n <SpinnerGapIcon className=\"size-3 shrink-0 animate-spin text-sf-subtle\" />\n ) : null}\n {displayDuration > 0 && !isStreaming ? (\n <span className=\"text-xs tabular-nums text-sf-subtle/60\">\n {formatDuration(displayDuration)}\n </span>\n ) : null}\n {isOpen ? (\n <CaretDownIcon className=\"size-3 shrink-0 text-sf-subtle/60\" />\n ) : (\n <CaretRightIcon className=\"size-3 shrink-0 text-sf-subtle/60\" />\n )}\n </BaseCollapsible.Trigger>\n\n {/* Detail panel */}\n <BaseCollapsible.Panel className=\"overflow-hidden\">\n <div className=\"mt-1 rounded-lg bg-sf-tint/50 px-3 py-2\">\n <Suspense>\n <Streamdown className=\"text-sf-subtle text-sm [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\">\n {reasoningText || \"*No reasoning content*\"}\n </Streamdown>\n </Suspense>\n </div>\n </BaseCollapsible.Panel>\n </div>\n </BaseCollapsible.Root>\n );\n }\n);\n\nAiReasoning.displayName = \"AiReasoning\";\n\n// ─── AiReasoningGroup ────────────────────────────────────────────────────────\n\n/**\n * Renders multiple reasoning steps. Shows a single `<AiReasoning>` directly\n * when only one part is provided. When multiple parts exist, renders a\n * collapsible group with step labels.\n *\n * @example\n * ```tsx\n * <AiReasoningGroup parts={reasoningParts} isStreaming={false} totalDuration={5} />\n * ```\n */\nexport function AiReasoningGroup({\n parts,\n isStreaming = false,\n totalDuration,\n defaultExpanded = false,\n className,\n ...props\n}: AiReasoningGroupProps) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\n\n // Single part — render directly\n if (parts.length === 1 && parts[0]) {\n const singlePart = parts[0];\n // Strip `part` from div props spread to avoid collision with HTML `part` attribute\n const { part: _part, ...restProps } = props as typeof props & {\n part?: unknown;\n };\n return (\n <AiReasoning\n part={singlePart}\n isStreaming={isStreaming}\n duration={totalDuration}\n className={className}\n {...restProps}\n />\n );\n }\n\n return (\n <BaseCollapsible.Root open={isExpanded} onOpenChange={setIsExpanded}>\n <div\n className={cn(\n \"my-0.5 flex w-full flex-col\",\n \"animate-in fade-in-0 duration-150\",\n className\n )}\n {...props}\n >\n <BaseCollapsible.Trigger\n render={\n <button\n type=\"button\"\n className=\"flex w-fit items-center gap-1.5 rounded px-1 py-0.5 text-left transition-colors hover:bg-sf-tint\"\n />\n }\n >\n {isStreaming ? (\n <SparkleIcon className=\"size-3.5 shrink-0 animate-pulse text-sf-subtle\" />\n ) : (\n <BrainIcon className=\"size-3.5 shrink-0 text-sf-subtle\" />\n )}\n <span className=\"text-sm text-sf-subtle\">\n {isStreaming ? \"Thinking...\" : `${parts.length} reasoning steps`}\n </span>\n {isStreaming ? (\n <SpinnerGapIcon className=\"size-3 shrink-0 animate-spin text-sf-subtle\" />\n ) : null}\n {totalDuration && totalDuration > 0 && !isStreaming ? (\n <span className=\"text-xs tabular-nums text-sf-subtle/60\">\n {formatDuration(totalDuration)}\n </span>\n ) : null}\n {isExpanded ? (\n <CaretDownIcon className=\"size-3 shrink-0 text-sf-subtle/60\" />\n ) : (\n <CaretRightIcon className=\"size-3 shrink-0 text-sf-subtle/60\" />\n )}\n </BaseCollapsible.Trigger>\n\n <BaseCollapsible.Panel className=\"overflow-hidden\">\n <div className=\"mt-1 space-y-2 rounded-lg bg-sf-tint/50 px-3 py-2\">\n {parts.map((partItem, index) => (\n <div key={index} className=\"text-sm text-sf-subtle\">\n {parts.length > 1 ? (\n <p className=\"mb-0.5 text-[10px] uppercase tracking-wider text-sf-subtle/50\">\n Step {index + 1}\n </p>\n ) : null}\n <Suspense>\n <Streamdown className=\"[&>*:first-child]:mt-0 [&>*:last-child]:mb-0\">\n {partItem.text || \"*No content*\"}\n </Streamdown>\n </Suspense>\n </div>\n ))}\n </div>\n </BaseCollapsible.Panel>\n </div>\n </BaseCollapsible.Root>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { t as cn } from "./cn-YROP2_ox.js";
|
|
3
|
+
import { Suspense, lazy, memo } from "react";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
//#region src/components/ai-response/ai-response.tsx
|
|
6
|
+
var SF_AI_RESPONSE_VARIANTS = {};
|
|
7
|
+
var SF_AI_RESPONSE_DEFAULT_VARIANTS = {};
|
|
8
|
+
var Streamdown = lazy(() => {
|
|
9
|
+
if (typeof window === "undefined") return Promise.resolve({ default: (_props) => null });
|
|
10
|
+
return Promise.all([import("streamdown"), import("@streamdown/code")]).then(([sd, codePlugin]) => {
|
|
11
|
+
const plugins = { code: codePlugin.code };
|
|
12
|
+
return { default: (props) => /* @__PURE__ */ jsx(sd.Streamdown, {
|
|
13
|
+
plugins,
|
|
14
|
+
...props
|
|
15
|
+
}) };
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Renders AI-generated markdown using Streamdown.
|
|
20
|
+
* Supports streaming animation, syntax-highlighted code, tables, and more.
|
|
21
|
+
*
|
|
22
|
+
* Pass `isAnimating={true}` while streaming and `false` once complete to get
|
|
23
|
+
* character-by-character reveal animation.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```tsx
|
|
27
|
+
* // Static
|
|
28
|
+
* <AiResponse>{"# Hello\n\nThis is **bold** and _italic_."}</AiResponse>
|
|
29
|
+
*
|
|
30
|
+
* // Streaming
|
|
31
|
+
* <AiResponse isAnimating={isStreaming}>{streamedText}</AiResponse>
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
var AiResponse = memo(({ className, ...props }) => /* @__PURE__ */ jsx(Suspense, { children: /* @__PURE__ */ jsx(Streamdown, {
|
|
35
|
+
className: cn("w-full text-sf-default text-sm", "[&>*:first-child]:mt-0 [&>*:last-child]:mb-0", className),
|
|
36
|
+
...props
|
|
37
|
+
}) }), (prev, next) => prev.children === next.children && prev.isAnimating === next.isAnimating);
|
|
38
|
+
AiResponse.displayName = "AiResponse";
|
|
39
|
+
//#endregion
|
|
40
|
+
export { SF_AI_RESPONSE_DEFAULT_VARIANTS as n, SF_AI_RESPONSE_VARIANTS as r, AiResponse as t };
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=ai-response-BWoVsNQG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-response-BWoVsNQG.js","names":[],"sources":["../src/components/ai-response/ai-response.tsx"],"sourcesContent":["\"use client\";\n\nimport type React from \"react\";\nimport { memo, Suspense, lazy } from \"react\";\nimport type { StreamdownProps } from \"streamdown\";\n\nimport { cn } from \"../../utils/cn\";\n\n// ─── Variants ────────────────────────────────────────────────────────────────\n\nexport const SF_AI_RESPONSE_VARIANTS = {} as const;\nexport const SF_AI_RESPONSE_DEFAULT_VARIANTS = {} as const;\n\n// Lazy-load Streamdown + the code plugin.\n// Streamdown accesses `document` at module init time, which crashes Astro\n// static builds. We gate the import behind a browser check so it is never\n// evaluated in a Node / SSR context.\ntype StreamdownModule = {\n default: (props: StreamdownProps) => React.ReactNode;\n};\n\nconst Streamdown = lazy((): Promise<StreamdownModule> => {\n if (typeof window === \"undefined\") {\n // SSR: return a no-op placeholder that renders nothing\n return Promise.resolve({\n default: (_props: StreamdownProps) => null,\n });\n }\n return Promise.all([import(\"streamdown\"), import(\"@streamdown/code\")]).then(\n ([sd, codePlugin]) => {\n const plugins = { code: codePlugin.code };\n return {\n default: (props: StreamdownProps) => (\n <sd.Streamdown plugins={plugins} {...props} />\n ),\n };\n }\n );\n});\n\n// ─── Component ───────────────────────────────────────────────────────────────\n\nexport type AiResponseProps = StreamdownProps & {\n /** Additional CSS classes. */\n className?: string;\n};\n\n/**\n * Renders AI-generated markdown using Streamdown.\n * Supports streaming animation, syntax-highlighted code, tables, and more.\n *\n * Pass `isAnimating={true}` while streaming and `false` once complete to get\n * character-by-character reveal animation.\n *\n * @example\n * ```tsx\n * // Static\n * <AiResponse>{\"# Hello\\n\\nThis is **bold** and _italic_.\"}</AiResponse>\n *\n * // Streaming\n * <AiResponse isAnimating={isStreaming}>{streamedText}</AiResponse>\n * ```\n */\nexport const AiResponse = memo(\n ({ className, ...props }: AiResponseProps) => (\n <Suspense>\n <Streamdown\n className={cn(\n \"w-full text-sf-default text-sm\",\n \"[&>*:first-child]:mt-0 [&>*:last-child]:mb-0\",\n className\n )}\n {...props}\n />\n </Suspense>\n ),\n (prev, next) =>\n prev.children === next.children && prev.isAnimating === next.isAnimating\n);\n\nAiResponse.displayName = \"AiResponse\";\n"],"mappings":";;;;;AAUA,IAAa,0BAA0B,EAAE;AACzC,IAAa,kCAAkC,EAAE;AAUjD,IAAM,aAAa,WAAsC;AACvD,KAAI,OAAO,WAAW,YAEpB,QAAO,QAAQ,QAAQ,EACrB,UAAU,WAA4B,MACvC,CAAC;AAEJ,QAAO,QAAQ,IAAI,CAAC,OAAO,eAAe,OAAO,oBAAoB,CAAC,CAAC,MACpE,CAAC,IAAI,gBAAgB;EACpB,MAAM,UAAU,EAAE,MAAM,WAAW,MAAM;AACzC,SAAO,EACL,UAAU,UACR,oBAAC,GAAG,YAAJ;GAAwB;GAAS,GAAI;GAAS,CAAA,EAEjD;GAEJ;EACD;;;;;;;;;;;;;;;;;AAyBF,IAAa,aAAa,MACvB,EAAE,WAAW,GAAG,YACf,oBAAC,UAAD,EAAA,UACE,oBAAC,YAAD;CACE,WAAW,GACT,kCACA,gDACA,UACD;CACD,GAAI;CACJ,CAAA,EACO,CAAA,GAEZ,MAAM,SACL,KAAK,aAAa,KAAK,YAAY,KAAK,gBAAgB,KAAK,YAChE;AAED,WAAW,cAAc"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { t as cn } from "./cn-YROP2_ox.js";
|
|
3
|
+
import { memo, useMemo } from "react";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
import { motion } from "motion/react";
|
|
6
|
+
//#region src/components/ai-shimmer/ai-shimmer.tsx
|
|
7
|
+
var SF_AI_SHIMMER_VARIANTS = {};
|
|
8
|
+
var SF_AI_SHIMMER_DEFAULT_VARIANTS = {};
|
|
9
|
+
/**
|
|
10
|
+
* Animated text shimmer effect for AI streaming states.
|
|
11
|
+
* Renders a sweep of light across the text to indicate activity.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* <AiShimmer>Thinking...</AiShimmer>
|
|
16
|
+
* <AiShimmer as="span" duration={1.5}>Generating response</AiShimmer>
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
function AiShimmerBase({ children, as: Component = "p", className, duration = 2, spread = 2 }) {
|
|
20
|
+
const MotionComponent = motion.create(Component);
|
|
21
|
+
const dynamicSpread = useMemo(() => (children?.length ?? 0) * spread, [children, spread]);
|
|
22
|
+
return /* @__PURE__ */ jsx(MotionComponent, {
|
|
23
|
+
animate: { backgroundPosition: "0% center" },
|
|
24
|
+
className: cn("relative inline-block bg-[length:250%_100%,auto] bg-clip-text text-transparent", "[--bg:linear-gradient(90deg,#0000_calc(50%-var(--spread)),var(--color-sf-base),#0000_calc(50%+var(--spread)))] [background-repeat:no-repeat,padding-box]", className),
|
|
25
|
+
initial: { backgroundPosition: "100% center" },
|
|
26
|
+
style: {
|
|
27
|
+
"--spread": `${dynamicSpread}px`,
|
|
28
|
+
backgroundImage: "var(--bg), linear-gradient(var(--color-sf-subtle), var(--color-sf-subtle))"
|
|
29
|
+
},
|
|
30
|
+
transition: {
|
|
31
|
+
repeat: Number.POSITIVE_INFINITY,
|
|
32
|
+
duration,
|
|
33
|
+
ease: "linear"
|
|
34
|
+
},
|
|
35
|
+
children
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
var AiShimmer = memo(AiShimmerBase);
|
|
39
|
+
AiShimmer.displayName = "AiShimmer";
|
|
40
|
+
//#endregion
|
|
41
|
+
export { SF_AI_SHIMMER_DEFAULT_VARIANTS as n, SF_AI_SHIMMER_VARIANTS as r, AiShimmer as t };
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=ai-shimmer-BpOmfonu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-shimmer-BpOmfonu.js","names":[],"sources":["../src/components/ai-shimmer/ai-shimmer.tsx"],"sourcesContent":["\"use client\";\n\nimport { motion } from \"motion/react\";\nimport {\n type CSSProperties,\n type ElementType,\n type JSX,\n memo,\n useMemo,\n} from \"react\";\n\nimport { cn } from \"../../utils/cn\";\n\n// ─── Variants ────────────────────────────────────────────────────────────────\n\nexport const SF_AI_SHIMMER_VARIANTS = {} as const;\nexport const SF_AI_SHIMMER_DEFAULT_VARIANTS = {} as const;\n\n// ─── Component ───────────────────────────────────────────────────────────────\n\nexport interface AiShimmerProps {\n /** Text content to animate. */\n children: string;\n /** HTML element or component to render as. @default \"p\" */\n as?: ElementType;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Animation duration in seconds. @default 2 */\n duration?: number;\n /** Shimmer width multiplier relative to text length. @default 2 */\n spread?: number;\n}\n\n/**\n * Animated text shimmer effect for AI streaming states.\n * Renders a sweep of light across the text to indicate activity.\n *\n * @example\n * ```tsx\n * <AiShimmer>Thinking...</AiShimmer>\n * <AiShimmer as=\"span\" duration={1.5}>Generating response</AiShimmer>\n * ```\n */\nfunction AiShimmerBase({\n children,\n as: Component = \"p\",\n className,\n duration = 2,\n spread = 2,\n}: AiShimmerProps) {\n const MotionComponent = motion.create(\n Component as keyof JSX.IntrinsicElements\n );\n const dynamicSpread = useMemo(\n () => (children?.length ?? 0) * spread,\n [children, spread]\n );\n\n return (\n <MotionComponent\n animate={{ backgroundPosition: \"0% center\" }}\n className={cn(\n \"relative inline-block bg-[length:250%_100%,auto] bg-clip-text text-transparent\",\n \"[--bg:linear-gradient(90deg,#0000_calc(50%-var(--spread)),var(--color-sf-base),#0000_calc(50%+var(--spread)))] [background-repeat:no-repeat,padding-box]\",\n className\n )}\n initial={{ backgroundPosition: \"100% center\" }}\n style={\n {\n \"--spread\": `${dynamicSpread}px`,\n backgroundImage:\n \"var(--bg), linear-gradient(var(--color-sf-subtle), var(--color-sf-subtle))\",\n } as CSSProperties\n }\n transition={{\n repeat: Number.POSITIVE_INFINITY,\n duration,\n ease: \"linear\",\n }}\n >\n {children}\n </MotionComponent>\n );\n}\n\nexport const AiShimmer = memo(AiShimmerBase);\nAiShimmer.displayName = \"AiShimmer\";\n"],"mappings":";;;;;;AAeA,IAAa,yBAAyB,EAAE;AACxC,IAAa,iCAAiC,EAAE;;;;;;;;;;;AA2BhD,SAAS,cAAc,EACrB,UACA,IAAI,YAAY,KAChB,WACA,WAAW,GACX,SAAS,KACQ;CACjB,MAAM,kBAAkB,OAAO,OAC7B,UACD;CACD,MAAM,gBAAgB,eACb,UAAU,UAAU,KAAK,QAChC,CAAC,UAAU,OAAO,CACnB;AAED,QACE,oBAAC,iBAAD;EACE,SAAS,EAAE,oBAAoB,aAAa;EAC5C,WAAW,GACT,kFACA,4JACA,UACD;EACD,SAAS,EAAE,oBAAoB,eAAe;EAC9C,OACE;GACE,YAAY,GAAG,cAAc;GAC7B,iBACE;GACH;EAEH,YAAY;GACV,QAAQ,OAAO;GACf;GACA,MAAM;GACP;EAEA;EACe,CAAA;;AAItB,IAAa,YAAY,KAAK,cAAc;AAC5C,UAAU,cAAc"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { t as cn } from "./cn-YROP2_ox.js";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
import { CheckIcon, SpinnerGapIcon, XIcon } from "@phosphor-icons/react";
|
|
5
|
+
//#region src/components/ai-status-badge/ai-status-badge.tsx
|
|
6
|
+
var SF_AI_STATUS_BADGE_VARIANTS = { status: {
|
|
7
|
+
idle: {
|
|
8
|
+
classes: "",
|
|
9
|
+
description: "Default idle state — no status icon shown"
|
|
10
|
+
},
|
|
11
|
+
running: {
|
|
12
|
+
classes: "",
|
|
13
|
+
description: "Actively running — spinner icon shown"
|
|
14
|
+
},
|
|
15
|
+
success: {
|
|
16
|
+
classes: "",
|
|
17
|
+
description: "Completed successfully — check icon shown"
|
|
18
|
+
},
|
|
19
|
+
error: {
|
|
20
|
+
classes: "",
|
|
21
|
+
description: "Failed with an error — X icon shown"
|
|
22
|
+
}
|
|
23
|
+
} };
|
|
24
|
+
var SF_AI_STATUS_BADGE_DEFAULT_VARIANTS = { status: "idle" };
|
|
25
|
+
function StatusIcon({ status }) {
|
|
26
|
+
switch (status) {
|
|
27
|
+
case "running": return /* @__PURE__ */ jsx(SpinnerGapIcon, { className: "size-3 animate-spin text-sf-brand" });
|
|
28
|
+
case "success": return /* @__PURE__ */ jsx(CheckIcon, { className: "size-3 text-sf-success" });
|
|
29
|
+
case "error": return /* @__PURE__ */ jsx(XIcon, { className: "size-3 text-sf-danger" });
|
|
30
|
+
default: return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Compact pill-shaped badge showing an icon, label, and a status indicator.
|
|
35
|
+
* Used by minimal variants of AiToolCall and AiReasoning.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```tsx
|
|
39
|
+
* <AiStatusBadge icon={MagnifyingGlassIcon} label="web_search" status="running" />
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
function AiStatusBadge({ icon: Icon, label, status = "idle", info, className, ...props }) {
|
|
43
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
44
|
+
className: cn("mx-2 inline-flex cursor-default items-center gap-1.5 rounded-full bg-sf-tint/50 px-2 py-0.5 text-xs", "animate-in fade-in-0 slide-in-from-bottom-1 duration-200", className),
|
|
45
|
+
...props,
|
|
46
|
+
children: [
|
|
47
|
+
Icon ? /* @__PURE__ */ jsx(Icon, { className: "size-3 text-sf-subtle" }) : null,
|
|
48
|
+
/* @__PURE__ */ jsx("span", {
|
|
49
|
+
className: "text-sf-subtle",
|
|
50
|
+
children: label
|
|
51
|
+
}),
|
|
52
|
+
info ? /* @__PURE__ */ jsx("span", {
|
|
53
|
+
className: "text-sf-subtle/60",
|
|
54
|
+
children: info
|
|
55
|
+
}) : null,
|
|
56
|
+
/* @__PURE__ */ jsx(StatusIcon, { status })
|
|
57
|
+
]
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
//#endregion
|
|
61
|
+
export { SF_AI_STATUS_BADGE_DEFAULT_VARIANTS as n, SF_AI_STATUS_BADGE_VARIANTS as r, AiStatusBadge as t };
|
|
62
|
+
|
|
63
|
+
//# sourceMappingURL=ai-status-badge-WhbKVeqn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-status-badge-WhbKVeqn.js","names":[],"sources":["../src/components/ai-status-badge/ai-status-badge.tsx"],"sourcesContent":["\"use client\";\n\nimport { CheckIcon, SpinnerGapIcon, XIcon } from \"@phosphor-icons/react\";\nimport type { ComponentProps, ElementType } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\n\n// ─── Variants ────────────────────────────────────────────────────────────────\n\nexport const SF_AI_STATUS_BADGE_VARIANTS = {\n status: {\n idle: {\n classes: \"\",\n description: \"Default idle state — no status icon shown\",\n },\n running: {\n classes: \"\",\n description: \"Actively running — spinner icon shown\",\n },\n success: {\n classes: \"\",\n description: \"Completed successfully — check icon shown\",\n },\n error: {\n classes: \"\",\n description: \"Failed with an error — X icon shown\",\n },\n },\n} as const;\n\nexport const SF_AI_STATUS_BADGE_DEFAULT_VARIANTS = {\n status: \"idle\",\n} as const;\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport type AiStatusBadgeStatus =\n keyof typeof SF_AI_STATUS_BADGE_VARIANTS.status;\n\nexport type AiStatusBadgeProps = ComponentProps<\"div\"> & {\n /** Icon component rendered on the left. */\n icon?: ElementType;\n /** Label text displayed in the badge. */\n label: string;\n /** Current status — determines the status icon on the right. @default \"idle\" */\n status?: AiStatusBadgeStatus;\n /** Additional info text (e.g. \"2/3\") shown after the label. */\n info?: string;\n};\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction StatusIcon({ status }: { status: AiStatusBadgeStatus }) {\n switch (status) {\n case \"running\":\n return <SpinnerGapIcon className=\"size-3 animate-spin text-sf-brand\" />;\n case \"success\":\n return <CheckIcon className=\"size-3 text-sf-success\" />;\n case \"error\":\n return <XIcon className=\"size-3 text-sf-danger\" />;\n default:\n return null;\n }\n}\n\n// ─── AiStatusBadge ───────────────────────────────────────────────────────────\n\n/**\n * Compact pill-shaped badge showing an icon, label, and a status indicator.\n * Used by minimal variants of AiToolCall and AiReasoning.\n *\n * @example\n * ```tsx\n * <AiStatusBadge icon={MagnifyingGlassIcon} label=\"web_search\" status=\"running\" />\n * ```\n */\nexport function AiStatusBadge({\n icon: Icon,\n label,\n status = \"idle\",\n info,\n className,\n ...props\n}: AiStatusBadgeProps) {\n return (\n <div\n className={cn(\n \"mx-2 inline-flex cursor-default items-center gap-1.5 rounded-full bg-sf-tint/50 px-2 py-0.5 text-xs\",\n \"animate-in fade-in-0 slide-in-from-bottom-1 duration-200\",\n className\n )}\n {...props}\n >\n {Icon ? <Icon className=\"size-3 text-sf-subtle\" /> : null}\n <span className=\"text-sf-subtle\">{label}</span>\n {info ? <span className=\"text-sf-subtle/60\">{info}</span> : null}\n <StatusIcon status={status} />\n </div>\n );\n}\n"],"mappings":";;;;;AASA,IAAa,8BAA8B,EACzC,QAAQ;CACN,MAAM;EACJ,SAAS;EACT,aAAa;EACd;CACD,SAAS;EACP,SAAS;EACT,aAAa;EACd;CACD,SAAS;EACP,SAAS;EACT,aAAa;EACd;CACD,OAAO;EACL,SAAS;EACT,aAAa;EACd;CACF,EACF;AAED,IAAa,sCAAsC,EACjD,QAAQ,QACT;AAoBD,SAAS,WAAW,EAAE,UAA2C;AAC/D,SAAQ,QAAR;EACE,KAAK,UACH,QAAO,oBAAC,gBAAD,EAAgB,WAAU,qCAAsC,CAAA;EACzE,KAAK,UACH,QAAO,oBAAC,WAAD,EAAW,WAAU,0BAA2B,CAAA;EACzD,KAAK,QACH,QAAO,oBAAC,OAAD,EAAO,WAAU,yBAA0B,CAAA;EACpD,QACE,QAAO;;;;;;;;;;;;AAeb,SAAgB,cAAc,EAC5B,MAAM,MACN,OACA,SAAS,QACT,MACA,WACA,GAAG,SACkB;AACrB,QACE,qBAAC,OAAD;EACE,WAAW,GACT,uGACA,4DACA,UACD;EACD,GAAI;YANN;GAQG,OAAO,oBAAC,MAAD,EAAM,WAAU,yBAA0B,CAAA,GAAG;GACrD,oBAAC,QAAD;IAAM,WAAU;cAAkB;IAAa,CAAA;GAC9C,OAAO,oBAAC,QAAD;IAAM,WAAU;cAAqB;IAAY,CAAA,GAAG;GAC5D,oBAAC,YAAD,EAAoB,QAAU,CAAA;GAC1B"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
//#region src/components/ai-streaming-text/ai-streaming-text.tsx
|
|
4
|
+
var SF_AI_STREAMING_TEXT_VARIANTS = {};
|
|
5
|
+
var SF_AI_STREAMING_TEXT_DEFAULT_VARIANTS = {};
|
|
6
|
+
/**
|
|
7
|
+
* Buffers incoming text and releases it character-by-character for a smooth
|
|
8
|
+
* typing effect. Pass the full (possibly incomplete) text and whether streaming
|
|
9
|
+
* is active — get back the display-ready substring.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* function StreamingMessage({ text, isStreaming }) {
|
|
14
|
+
* const displayText = useAiStreamingText(text, { isStreaming });
|
|
15
|
+
* return <AiResponse>{displayText}</AiResponse>;
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
function useAiStreamingText(text, options = {}) {
|
|
20
|
+
const { isStreaming = false, charsPerTick = 10, tickInterval = 16, flushOnStop = true } = options;
|
|
21
|
+
const [displayText, setDisplayText] = useState(text);
|
|
22
|
+
const targetRef = useRef(text);
|
|
23
|
+
const posRef = useRef(text.length);
|
|
24
|
+
const rafRef = useRef(null);
|
|
25
|
+
const lastTickRef = useRef(0);
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
targetRef.current = text;
|
|
28
|
+
}, [text]);
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
if (!isStreaming) {
|
|
31
|
+
if (flushOnStop) {
|
|
32
|
+
setDisplayText(text);
|
|
33
|
+
posRef.current = text.length;
|
|
34
|
+
}
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const animate = (timestamp) => {
|
|
38
|
+
const target = targetRef.current;
|
|
39
|
+
const pos = posRef.current;
|
|
40
|
+
if (pos >= target.length) {
|
|
41
|
+
rafRef.current = requestAnimationFrame(animate);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (timestamp - lastTickRef.current < tickInterval) {
|
|
45
|
+
rafRef.current = requestAnimationFrame(animate);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
lastTickRef.current = timestamp;
|
|
49
|
+
const newPos = Math.min(pos + charsPerTick, target.length);
|
|
50
|
+
posRef.current = newPos;
|
|
51
|
+
setDisplayText(target.slice(0, newPos));
|
|
52
|
+
rafRef.current = requestAnimationFrame(animate);
|
|
53
|
+
};
|
|
54
|
+
rafRef.current = requestAnimationFrame(animate);
|
|
55
|
+
return () => {
|
|
56
|
+
if (rafRef.current) cancelAnimationFrame(rafRef.current);
|
|
57
|
+
};
|
|
58
|
+
}, [
|
|
59
|
+
isStreaming,
|
|
60
|
+
charsPerTick,
|
|
61
|
+
tickInterval,
|
|
62
|
+
flushOnStop,
|
|
63
|
+
text
|
|
64
|
+
]);
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
if (!isStreaming && flushOnStop && displayText !== text) {
|
|
67
|
+
setDisplayText(text);
|
|
68
|
+
posRef.current = text.length;
|
|
69
|
+
}
|
|
70
|
+
}, [
|
|
71
|
+
isStreaming,
|
|
72
|
+
flushOnStop,
|
|
73
|
+
text,
|
|
74
|
+
displayText
|
|
75
|
+
]);
|
|
76
|
+
return displayText;
|
|
77
|
+
}
|
|
78
|
+
//#endregion
|
|
79
|
+
export { SF_AI_STREAMING_TEXT_VARIANTS as n, useAiStreamingText as r, SF_AI_STREAMING_TEXT_DEFAULT_VARIANTS as t };
|
|
80
|
+
|
|
81
|
+
//# sourceMappingURL=ai-streaming-text-ClL7FwvD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-streaming-text-ClL7FwvD.js","names":[],"sources":["../src/components/ai-streaming-text/ai-streaming-text.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\n\n// ─── Variants ────────────────────────────────────────────────────────────────\n\nexport const SF_AI_STREAMING_TEXT_VARIANTS = {} as const;\nexport const SF_AI_STREAMING_TEXT_DEFAULT_VARIANTS = {} as const;\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface UseAiStreamingTextOptions {\n /** Whether content is actively streaming. @default false */\n isStreaming?: boolean;\n /** Characters to release per animation frame tick. @default 10 */\n charsPerTick?: number;\n /** Milliseconds between releases (~16ms = 60fps). @default 16 */\n tickInterval?: number;\n /** Immediately flush all text when streaming stops. @default true */\n flushOnStop?: boolean;\n}\n\n// ─── Hook ────────────────────────────────────────────────────────────────────\n\n/**\n * Buffers incoming text and releases it character-by-character for a smooth\n * typing effect. Pass the full (possibly incomplete) text and whether streaming\n * is active — get back the display-ready substring.\n *\n * @example\n * ```tsx\n * function StreamingMessage({ text, isStreaming }) {\n * const displayText = useAiStreamingText(text, { isStreaming });\n * return <AiResponse>{displayText}</AiResponse>;\n * }\n * ```\n */\nexport function useAiStreamingText(\n text: string,\n options: UseAiStreamingTextOptions = {}\n): string {\n const {\n isStreaming = false,\n charsPerTick = 10,\n tickInterval = 16,\n flushOnStop = true,\n } = options;\n\n const [displayText, setDisplayText] = useState(text);\n const targetRef = useRef(text);\n const posRef = useRef(text.length);\n const rafRef = useRef<number | null>(null);\n const lastTickRef = useRef(0);\n\n useEffect(() => {\n targetRef.current = text;\n }, [text]);\n\n useEffect(() => {\n if (!isStreaming) {\n if (flushOnStop) {\n setDisplayText(text);\n posRef.current = text.length;\n }\n return;\n }\n\n const animate = (timestamp: number) => {\n const target = targetRef.current;\n const pos = posRef.current;\n\n if (pos >= target.length) {\n rafRef.current = requestAnimationFrame(animate);\n return;\n }\n\n if (timestamp - lastTickRef.current < tickInterval) {\n rafRef.current = requestAnimationFrame(animate);\n return;\n }\n lastTickRef.current = timestamp;\n\n const newPos = Math.min(pos + charsPerTick, target.length);\n posRef.current = newPos;\n setDisplayText(target.slice(0, newPos));\n rafRef.current = requestAnimationFrame(animate);\n };\n\n rafRef.current = requestAnimationFrame(animate);\n return () => {\n if (rafRef.current) cancelAnimationFrame(rafRef.current);\n };\n }, [isStreaming, charsPerTick, tickInterval, flushOnStop, text]);\n\n useEffect(() => {\n if (!isStreaming && flushOnStop && displayText !== text) {\n setDisplayText(text);\n posRef.current = text.length;\n }\n }, [isStreaming, flushOnStop, text, displayText]);\n\n return displayText;\n}\n"],"mappings":";;;AAMA,IAAa,gCAAgC,EAAE;AAC/C,IAAa,wCAAwC,EAAE;;;;;;;;;;;;;;AA8BvD,SAAgB,mBACd,MACA,UAAqC,EAAE,EAC/B;CACR,MAAM,EACJ,cAAc,OACd,eAAe,IACf,eAAe,IACf,cAAc,SACZ;CAEJ,MAAM,CAAC,aAAa,kBAAkB,SAAS,KAAK;CACpD,MAAM,YAAY,OAAO,KAAK;CAC9B,MAAM,SAAS,OAAO,KAAK,OAAO;CAClC,MAAM,SAAS,OAAsB,KAAK;CAC1C,MAAM,cAAc,OAAO,EAAE;AAE7B,iBAAgB;AACd,YAAU,UAAU;IACnB,CAAC,KAAK,CAAC;AAEV,iBAAgB;AACd,MAAI,CAAC,aAAa;AAChB,OAAI,aAAa;AACf,mBAAe,KAAK;AACpB,WAAO,UAAU,KAAK;;AAExB;;EAGF,MAAM,WAAW,cAAsB;GACrC,MAAM,SAAS,UAAU;GACzB,MAAM,MAAM,OAAO;AAEnB,OAAI,OAAO,OAAO,QAAQ;AACxB,WAAO,UAAU,sBAAsB,QAAQ;AAC/C;;AAGF,OAAI,YAAY,YAAY,UAAU,cAAc;AAClD,WAAO,UAAU,sBAAsB,QAAQ;AAC/C;;AAEF,eAAY,UAAU;GAEtB,MAAM,SAAS,KAAK,IAAI,MAAM,cAAc,OAAO,OAAO;AAC1D,UAAO,UAAU;AACjB,kBAAe,OAAO,MAAM,GAAG,OAAO,CAAC;AACvC,UAAO,UAAU,sBAAsB,QAAQ;;AAGjD,SAAO,UAAU,sBAAsB,QAAQ;AAC/C,eAAa;AACX,OAAI,OAAO,QAAS,sBAAqB,OAAO,QAAQ;;IAEzD;EAAC;EAAa;EAAc;EAAc;EAAa;EAAK,CAAC;AAEhE,iBAAgB;AACd,MAAI,CAAC,eAAe,eAAe,gBAAgB,MAAM;AACvD,kBAAe,KAAK;AACpB,UAAO,UAAU,KAAK;;IAEvB;EAAC;EAAa;EAAa;EAAM;EAAY,CAAC;AAEjD,QAAO"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { t as cn } from "./cn-YROP2_ox.js";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { CaretDownIcon, CheckCircleIcon, RobotIcon, SpinnerGapIcon, XCircleIcon } from "@phosphor-icons/react";
|
|
6
|
+
import { Collapsible } from "@base-ui/react/collapsible";
|
|
7
|
+
//#region src/components/ai-subagent/ai-subagent.tsx
|
|
8
|
+
var SF_AI_SUBAGENT_VARIANTS = { status: {
|
|
9
|
+
running: {
|
|
10
|
+
classes: "",
|
|
11
|
+
description: "Subagent is actively processing"
|
|
12
|
+
},
|
|
13
|
+
completed: {
|
|
14
|
+
classes: "",
|
|
15
|
+
description: "Subagent finished successfully"
|
|
16
|
+
},
|
|
17
|
+
error: {
|
|
18
|
+
classes: "",
|
|
19
|
+
description: "Subagent encountered an error"
|
|
20
|
+
}
|
|
21
|
+
} };
|
|
22
|
+
var SF_AI_SUBAGENT_DEFAULT_VARIANTS = { status: "running" };
|
|
23
|
+
var STATUS_CONFIG = {
|
|
24
|
+
running: {
|
|
25
|
+
icon: SpinnerGapIcon,
|
|
26
|
+
className: "text-sf-brand animate-spin",
|
|
27
|
+
label: "Running"
|
|
28
|
+
},
|
|
29
|
+
completed: {
|
|
30
|
+
icon: CheckCircleIcon,
|
|
31
|
+
className: "text-sf-success",
|
|
32
|
+
label: "Completed"
|
|
33
|
+
},
|
|
34
|
+
error: {
|
|
35
|
+
icon: XCircleIcon,
|
|
36
|
+
className: "text-sf-danger",
|
|
37
|
+
label: "Error"
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
function formatDuration(ms) {
|
|
41
|
+
if (ms < 1e3) return `${ms}ms`;
|
|
42
|
+
const s = Math.floor(ms / 1e3);
|
|
43
|
+
if (s < 60) return `${s}s`;
|
|
44
|
+
const m = Math.floor(s / 60);
|
|
45
|
+
const remaining = s % 60;
|
|
46
|
+
return remaining > 0 ? `${m}m ${remaining}s` : `${m}m`;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Collapsible wrapper for nested subagent activity. Shows the subagent name,
|
|
50
|
+
* status, model, and duration in a header, with all subagent output (text,
|
|
51
|
+
* tool calls, etc.) in a collapsible body.
|
|
52
|
+
*
|
|
53
|
+
* Maps to harness events: `subagent_start`, `subagent_text_delta`,
|
|
54
|
+
* `subagent_tool_start`, `subagent_tool_end`, `subagent_end`,
|
|
55
|
+
* `subagent_model_changed`.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```tsx
|
|
59
|
+
* <AiSubagent
|
|
60
|
+
* name="Explore"
|
|
61
|
+
* agentType="explore"
|
|
62
|
+
* status="running"
|
|
63
|
+
* modelId="claude-haiku-3.5"
|
|
64
|
+
* defaultExpanded
|
|
65
|
+
* >
|
|
66
|
+
* <AiResponse isAnimating>{streamingText}</AiResponse>
|
|
67
|
+
* <AiToolCallGroup tools={toolCalls} />
|
|
68
|
+
* </AiSubagent>
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
function AiSubagent({ agentType, name, status = "running", modelId, duration, icon, defaultExpanded = true, open: controlledOpen, onOpenChange, children, className, ...props }) {
|
|
72
|
+
const [internalOpen, setInternalOpen] = useState(defaultExpanded);
|
|
73
|
+
const isControlled = controlledOpen !== void 0;
|
|
74
|
+
const isOpen = isControlled ? controlledOpen : internalOpen;
|
|
75
|
+
const handleOpenChange = (nextOpen) => {
|
|
76
|
+
if (!isControlled) setInternalOpen(nextOpen);
|
|
77
|
+
onOpenChange?.(nextOpen);
|
|
78
|
+
};
|
|
79
|
+
const IconComponent = icon ?? RobotIcon;
|
|
80
|
+
const statusConfig = STATUS_CONFIG[status];
|
|
81
|
+
const StatusIcon = statusConfig.icon;
|
|
82
|
+
const displayName = name ?? agentType ?? "Subagent";
|
|
83
|
+
return /* @__PURE__ */ jsx(Collapsible.Root, {
|
|
84
|
+
defaultOpen: defaultExpanded,
|
|
85
|
+
onOpenChange: handleOpenChange,
|
|
86
|
+
open: isOpen,
|
|
87
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
88
|
+
className: cn("flex flex-col overflow-hidden rounded-lg", className),
|
|
89
|
+
...props,
|
|
90
|
+
children: [/* @__PURE__ */ jsxs(Collapsible.Trigger, {
|
|
91
|
+
className: "flex w-fit items-center gap-2 rounded-md px-2 py-1.5 text-left transition-colors hover:bg-sf-tint",
|
|
92
|
+
children: [
|
|
93
|
+
/* @__PURE__ */ jsx("div", {
|
|
94
|
+
className: "flex size-5 shrink-0 items-center justify-center rounded bg-sf-tint text-sf-subtle",
|
|
95
|
+
children: /* @__PURE__ */ jsx(IconComponent, { className: "size-3.5" })
|
|
96
|
+
}),
|
|
97
|
+
/* @__PURE__ */ jsxs("div", {
|
|
98
|
+
className: "flex min-w-0 grow items-center gap-2",
|
|
99
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
100
|
+
className: "text-sm font-medium text-sf-default",
|
|
101
|
+
children: displayName
|
|
102
|
+
}), modelId && /* @__PURE__ */ jsx("span", {
|
|
103
|
+
className: "truncate rounded bg-sf-tint px-1.5 py-0.5 font-mono text-[10px] text-sf-subtle",
|
|
104
|
+
children: modelId
|
|
105
|
+
})]
|
|
106
|
+
}),
|
|
107
|
+
/* @__PURE__ */ jsxs("div", {
|
|
108
|
+
className: "flex shrink-0 items-center gap-2",
|
|
109
|
+
children: [
|
|
110
|
+
duration !== void 0 && /* @__PURE__ */ jsx("span", {
|
|
111
|
+
className: "text-xs tabular-nums text-sf-subtle",
|
|
112
|
+
children: formatDuration(duration)
|
|
113
|
+
}),
|
|
114
|
+
/* @__PURE__ */ jsx(StatusIcon, { className: cn("size-3.5", statusConfig.className) }),
|
|
115
|
+
/* @__PURE__ */ jsx(CaretDownIcon, { className: cn("size-3 text-sf-subtle transition-transform duration-200", isOpen && "rotate-180") })
|
|
116
|
+
]
|
|
117
|
+
})
|
|
118
|
+
]
|
|
119
|
+
}), /* @__PURE__ */ jsx(Collapsible.Panel, {
|
|
120
|
+
className: "overflow-hidden [&[data-ending-style]]:h-0 [&[data-starting-style]]:h-0",
|
|
121
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
122
|
+
className: "flex flex-col gap-2 bg-sf-tint/50 px-3 py-2.5",
|
|
123
|
+
children
|
|
124
|
+
})
|
|
125
|
+
})]
|
|
126
|
+
})
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
AiSubagent.displayName = "AiSubagent";
|
|
130
|
+
//#endregion
|
|
131
|
+
export { SF_AI_SUBAGENT_DEFAULT_VARIANTS as n, SF_AI_SUBAGENT_VARIANTS as r, AiSubagent as t };
|
|
132
|
+
|
|
133
|
+
//# sourceMappingURL=ai-subagent-BruGN1UE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-subagent-BruGN1UE.js","names":[],"sources":["../src/components/ai-subagent/ai-subagent.tsx"],"sourcesContent":["\"use client\";\n\nimport { Collapsible as BaseCollapsible } from \"@base-ui/react/collapsible\";\nimport {\n RobotIcon,\n CaretDownIcon,\n SpinnerGapIcon,\n CheckCircleIcon,\n XCircleIcon,\n} from \"@phosphor-icons/react\";\nimport type { ElementType, HTMLAttributes, ReactNode } from \"react\";\nimport { useState } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\n\n// ─── Variants ────────────────────────────────────────────────────────────────\n\nexport const SF_AI_SUBAGENT_VARIANTS = {\n status: {\n running: { classes: \"\", description: \"Subagent is actively processing\" },\n completed: { classes: \"\", description: \"Subagent finished successfully\" },\n error: { classes: \"\", description: \"Subagent encountered an error\" },\n },\n} as const;\n\nexport const SF_AI_SUBAGENT_DEFAULT_VARIANTS = {\n status: \"running\",\n} as const;\n\nexport type SFAiSubagentStatus = keyof typeof SF_AI_SUBAGENT_VARIANTS.status;\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type AiSubagentProps = HTMLAttributes<HTMLDivElement> & {\n /** Subagent type ID (e.g. `\"explore\"`, `\"execute\"`). */\n agentType?: string;\n /** Human-readable name for this subagent. */\n name?: string;\n /** Current status. */\n status?: SFAiSubagentStatus;\n /** Current model ID being used (e.g. `\"claude-haiku-3.5\"`). */\n modelId?: string;\n /** Duration in milliseconds. */\n duration?: number;\n /** Custom icon. Defaults to `RobotIcon`. */\n icon?: ElementType;\n /** Whether the subagent content is expanded by default. */\n defaultExpanded?: boolean;\n /** Controlled open state. */\n open?: boolean;\n /** Called when open state changes. */\n onOpenChange?: (open: boolean) => void;\n /**\n * Content rendered inside the collapsible body — typically streaming text,\n * tool calls, and other nested agent output.\n */\n children?: ReactNode;\n};\n\n// ─── Status config ────────────────────────────────────────────────────────────\n\nconst STATUS_CONFIG: Record<\n SFAiSubagentStatus,\n {\n icon: ElementType;\n className: string;\n label: string;\n }\n> = {\n running: {\n icon: SpinnerGapIcon,\n className: \"text-sf-brand animate-spin\",\n label: \"Running\",\n },\n completed: {\n icon: CheckCircleIcon,\n className: \"text-sf-success\",\n label: \"Completed\",\n },\n error: {\n icon: XCircleIcon,\n className: \"text-sf-danger\",\n label: \"Error\",\n },\n};\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n const remaining = s % 60;\n return remaining > 0 ? `${m}m ${remaining}s` : `${m}m`;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * Collapsible wrapper for nested subagent activity. Shows the subagent name,\n * status, model, and duration in a header, with all subagent output (text,\n * tool calls, etc.) in a collapsible body.\n *\n * Maps to harness events: `subagent_start`, `subagent_text_delta`,\n * `subagent_tool_start`, `subagent_tool_end`, `subagent_end`,\n * `subagent_model_changed`.\n *\n * @example\n * ```tsx\n * <AiSubagent\n * name=\"Explore\"\n * agentType=\"explore\"\n * status=\"running\"\n * modelId=\"claude-haiku-3.5\"\n * defaultExpanded\n * >\n * <AiResponse isAnimating>{streamingText}</AiResponse>\n * <AiToolCallGroup tools={toolCalls} />\n * </AiSubagent>\n * ```\n */\nexport function AiSubagent({\n agentType,\n name,\n status = \"running\",\n modelId,\n duration,\n icon,\n defaultExpanded = true,\n open: controlledOpen,\n onOpenChange,\n children,\n className,\n ...props\n}: AiSubagentProps) {\n const [internalOpen, setInternalOpen] = useState(defaultExpanded);\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : internalOpen;\n\n const handleOpenChange = (nextOpen: boolean) => {\n if (!isControlled) setInternalOpen(nextOpen);\n onOpenChange?.(nextOpen);\n };\n\n const IconComponent = icon ?? RobotIcon;\n const statusConfig = STATUS_CONFIG[status];\n const StatusIcon = statusConfig.icon;\n const displayName = name ?? agentType ?? \"Subagent\";\n\n return (\n <BaseCollapsible.Root\n defaultOpen={defaultExpanded}\n onOpenChange={handleOpenChange}\n open={isOpen}\n >\n <div\n className={cn(\"flex flex-col overflow-hidden rounded-lg\", className)}\n {...props}\n >\n {/* Header / trigger */}\n <BaseCollapsible.Trigger className=\"flex w-fit items-center gap-2 rounded-md px-2 py-1.5 text-left transition-colors hover:bg-sf-tint\">\n {/* Agent icon */}\n <div className=\"flex size-5 shrink-0 items-center justify-center rounded bg-sf-tint text-sf-subtle\">\n <IconComponent className=\"size-3.5\" />\n </div>\n\n {/* Name + model */}\n <div className=\"flex min-w-0 grow items-center gap-2\">\n <span className=\"text-sm font-medium text-sf-default\">\n {displayName}\n </span>\n {modelId && (\n <span className=\"truncate rounded bg-sf-tint px-1.5 py-0.5 font-mono text-[10px] text-sf-subtle\">\n {modelId}\n </span>\n )}\n </div>\n\n {/* Status + duration + caret */}\n <div className=\"flex shrink-0 items-center gap-2\">\n {duration !== undefined && (\n <span className=\"text-xs tabular-nums text-sf-subtle\">\n {formatDuration(duration)}\n </span>\n )}\n <StatusIcon className={cn(\"size-3.5\", statusConfig.className)} />\n <CaretDownIcon\n className={cn(\n \"size-3 text-sf-subtle transition-transform duration-200\",\n isOpen && \"rotate-180\"\n )}\n />\n </div>\n </BaseCollapsible.Trigger>\n\n {/* Collapsible content */}\n <BaseCollapsible.Panel className=\"overflow-hidden [&[data-ending-style]]:h-0 [&[data-starting-style]]:h-0\">\n <div className=\"flex flex-col gap-2 bg-sf-tint/50 px-3 py-2.5\">\n {children}\n </div>\n </BaseCollapsible.Panel>\n </div>\n </BaseCollapsible.Root>\n );\n}\n\nAiSubagent.displayName = \"AiSubagent\";\n"],"mappings":";;;;;;;AAiBA,IAAa,0BAA0B,EACrC,QAAQ;CACN,SAAS;EAAE,SAAS;EAAI,aAAa;EAAmC;CACxE,WAAW;EAAE,SAAS;EAAI,aAAa;EAAkC;CACzE,OAAO;EAAE,SAAS;EAAI,aAAa;EAAiC;CACrE,EACF;AAED,IAAa,kCAAkC,EAC7C,QAAQ,WACT;AAkCD,IAAM,gBAOF;CACF,SAAS;EACP,MAAM;EACN,WAAW;EACX,OAAO;EACR;CACD,WAAW;EACT,MAAM;EACN,WAAW;EACX,OAAO;EACR;CACD,OAAO;EACL,MAAM;EACN,WAAW;EACX,OAAO;EACR;CACF;AAID,SAAS,eAAe,IAAoB;AAC1C,KAAI,KAAK,IAAM,QAAO,GAAG,GAAG;CAC5B,MAAM,IAAI,KAAK,MAAM,KAAK,IAAK;AAC/B,KAAI,IAAI,GAAI,QAAO,GAAG,EAAE;CACxB,MAAM,IAAI,KAAK,MAAM,IAAI,GAAG;CAC5B,MAAM,YAAY,IAAI;AACtB,QAAO,YAAY,IAAI,GAAG,EAAE,IAAI,UAAU,KAAK,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;AA4BtD,SAAgB,WAAW,EACzB,WACA,MACA,SAAS,WACT,SACA,UACA,MACA,kBAAkB,MAClB,MAAM,gBACN,cACA,UACA,WACA,GAAG,SACe;CAClB,MAAM,CAAC,cAAc,mBAAmB,SAAS,gBAAgB;CACjE,MAAM,eAAe,mBAAmB,KAAA;CACxC,MAAM,SAAS,eAAe,iBAAiB;CAE/C,MAAM,oBAAoB,aAAsB;AAC9C,MAAI,CAAC,aAAc,iBAAgB,SAAS;AAC5C,iBAAe,SAAS;;CAG1B,MAAM,gBAAgB,QAAQ;CAC9B,MAAM,eAAe,cAAc;CACnC,MAAM,aAAa,aAAa;CAChC,MAAM,cAAc,QAAQ,aAAa;AAEzC,QACE,oBAAC,YAAgB,MAAjB;EACE,aAAa;EACb,cAAc;EACd,MAAM;YAEN,qBAAC,OAAD;GACE,WAAW,GAAG,4CAA4C,UAAU;GACpE,GAAI;aAFN,CAKE,qBAAC,YAAgB,SAAjB;IAAyB,WAAU;cAAnC;KAEE,oBAAC,OAAD;MAAK,WAAU;gBACb,oBAAC,eAAD,EAAe,WAAU,YAAa,CAAA;MAClC,CAAA;KAGN,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,QAAD;OAAM,WAAU;iBACb;OACI,CAAA,EACN,WACC,oBAAC,QAAD;OAAM,WAAU;iBACb;OACI,CAAA,CAEL;;KAGN,qBAAC,OAAD;MAAK,WAAU;gBAAf;OACG,aAAa,KAAA,KACZ,oBAAC,QAAD;QAAM,WAAU;kBACb,eAAe,SAAS;QACpB,CAAA;OAET,oBAAC,YAAD,EAAY,WAAW,GAAG,YAAY,aAAa,UAAU,EAAI,CAAA;OACjE,oBAAC,eAAD,EACE,WAAW,GACT,2DACA,UAAU,aACX,EACD,CAAA;OACE;;KACkB;OAG1B,oBAAC,YAAgB,OAAjB;IAAuB,WAAU;cAC/B,oBAAC,OAAD;KAAK,WAAU;KACZ;KACG,CAAA;IACgB,CAAA,CACpB;;EACe,CAAA;;AAI3B,WAAW,cAAc"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { t as cn } from "./cn-YROP2_ox.js";
|
|
3
|
+
import { t as Button } from "./button-De0267YU.js";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
//#region src/components/ai-suggestion/ai-suggestion.tsx
|
|
6
|
+
var SF_AI_SUGGESTION_VARIANTS = {};
|
|
7
|
+
var SF_AI_SUGGESTION_DEFAULT_VARIANTS = {};
|
|
8
|
+
/**
|
|
9
|
+
* Horizontally scrollable container for suggestion pills.
|
|
10
|
+
* Position it relative to your prompt input (e.g. `bottom-full`).
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* <div className="relative">
|
|
15
|
+
* <AiSuggestions>
|
|
16
|
+
* <AiSuggestion suggestion="Summarize this" onClick={handleSuggestion} />
|
|
17
|
+
* <AiSuggestion suggestion="Explain in simple terms" onClick={handleSuggestion} />
|
|
18
|
+
* </AiSuggestions>
|
|
19
|
+
* <AiPromptInput ... />
|
|
20
|
+
* </div>
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
function AiSuggestions({ className, children, ...props }) {
|
|
24
|
+
return /* @__PURE__ */ jsx("div", {
|
|
25
|
+
className: cn("flex w-full flex-nowrap items-center gap-2 overflow-x-auto px-3 py-2", "[scrollbar-width:none] [&::-webkit-scrollbar]:hidden", className),
|
|
26
|
+
...props,
|
|
27
|
+
children
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* A single suggestion pill button.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```tsx
|
|
35
|
+
* <AiSuggestion
|
|
36
|
+
* suggestion="What can you help me with?"
|
|
37
|
+
* onClick={(s) => setInput(s)}
|
|
38
|
+
* />
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
function AiSuggestion({ suggestion, onClick, className, variant = "secondary", size = "sm", children, ...props }) {
|
|
42
|
+
return /* @__PURE__ */ jsx(Button, {
|
|
43
|
+
className: cn("shrink-0 rounded-full px-4", className),
|
|
44
|
+
onClick: () => onClick?.(suggestion),
|
|
45
|
+
size,
|
|
46
|
+
type: "button",
|
|
47
|
+
variant,
|
|
48
|
+
...props,
|
|
49
|
+
children: children ?? suggestion
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//#endregion
|
|
53
|
+
export { SF_AI_SUGGESTION_VARIANTS as i, AiSuggestions as n, SF_AI_SUGGESTION_DEFAULT_VARIANTS as r, AiSuggestion as t };
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=ai-suggestion-CNsCZj5P.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-suggestion-CNsCZj5P.js","names":[],"sources":["../src/components/ai-suggestion/ai-suggestion.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../button\";\n\n// ─── Variants ────────────────────────────────────────────────────────────────\n\nexport const SF_AI_SUGGESTION_VARIANTS = {} as const;\nexport const SF_AI_SUGGESTION_DEFAULT_VARIANTS = {} as const;\n\n// ─── AiSuggestions ───────────────────────────────────────────────────────────\n\nexport type AiSuggestionsProps = ComponentProps<\"div\">;\n\n/**\n * Horizontally scrollable container for suggestion pills.\n * Position it relative to your prompt input (e.g. `bottom-full`).\n *\n * @example\n * ```tsx\n * <div className=\"relative\">\n * <AiSuggestions>\n * <AiSuggestion suggestion=\"Summarize this\" onClick={handleSuggestion} />\n * <AiSuggestion suggestion=\"Explain in simple terms\" onClick={handleSuggestion} />\n * </AiSuggestions>\n * <AiPromptInput ... />\n * </div>\n * ```\n */\nexport function AiSuggestions({\n className,\n children,\n ...props\n}: AiSuggestionsProps) {\n return (\n <div\n className={cn(\n \"flex w-full flex-nowrap items-center gap-2 overflow-x-auto px-3 py-2\",\n // hide scrollbar cross-browser\n \"[scrollbar-width:none] [&::-webkit-scrollbar]:hidden\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n\n// ─── AiSuggestion ────────────────────────────────────────────────────────────\n\nexport type AiSuggestionProps = Omit<\n ComponentProps<typeof Button>,\n \"onClick\" | \"shape\"\n> & {\n /** The suggestion text — used as button label if no children provided. */\n suggestion: string;\n /** Called with the suggestion string when clicked. */\n onClick?: (suggestion: string) => void;\n};\n\n/**\n * A single suggestion pill button.\n *\n * @example\n * ```tsx\n * <AiSuggestion\n * suggestion=\"What can you help me with?\"\n * onClick={(s) => setInput(s)}\n * />\n * ```\n */\nexport function AiSuggestion({\n suggestion,\n onClick,\n className,\n variant = \"secondary\",\n size = \"sm\",\n children,\n ...props\n}: AiSuggestionProps) {\n return (\n <Button\n className={cn(\"shrink-0 rounded-full px-4\", className)}\n onClick={() => onClick?.(suggestion)}\n size={size}\n type=\"button\"\n variant={variant}\n {...props}\n >\n {children ?? suggestion}\n </Button>\n );\n}\n"],"mappings":";;;;;AASA,IAAa,4BAA4B,EAAE;AAC3C,IAAa,oCAAoC,EAAE;;;;;;;;;;;;;;;;AAqBnD,SAAgB,cAAc,EAC5B,WACA,UACA,GAAG,SACkB;AACrB,QACE,oBAAC,OAAD;EACE,WAAW,GACT,wEAEA,wDACA,UACD;EACD,GAAI;EAEH;EACG,CAAA;;;;;;;;;;;;;AA2BV,SAAgB,aAAa,EAC3B,YACA,SACA,WACA,UAAU,aACV,OAAO,MACP,UACA,GAAG,SACiB;AACpB,QACE,oBAAC,QAAD;EACE,WAAW,GAAG,8BAA8B,UAAU;EACtD,eAAe,UAAU,WAAW;EAC9B;EACN,MAAK;EACI;EACT,GAAI;YAEH,YAAY;EACN,CAAA"}
|