@signalflare-ai/ui 0.5.0 → 1.0.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 +117 -1
- package/ai/USAGE.md +64 -0
- package/ai/component-registry.json +492 -618
- package/ai/component-registry.md +167 -85
- package/ai/schemas.ts +545 -102
- package/bin/sf.js +2 -3
- package/dist/.build-complete +1 -1
- package/dist/ai/schemas.d.ts +1659 -5532
- package/dist/ai/schemas.d.ts.map +1 -1
- package/dist/{ai-actions-DG1dhDMP.js → ai-actions-DSVeQn4e.js} +1 -1
- package/dist/{ai-actions-DG1dhDMP.js.map → ai-actions-DSVeQn4e.js.map} +1 -1
- package/dist/{ai-agent-card-BbtL4NII.js → ai-agent-card-BXHwhWAU.js} +1 -1
- package/dist/{ai-agent-card-BbtL4NII.js.map → ai-agent-card-BXHwhWAU.js.map} +1 -1
- package/dist/{ai-approval-Mb7-BY6i.js → ai-approval-aa0qvjFN.js} +1 -1
- package/dist/{ai-approval-Mb7-BY6i.js.map → ai-approval-aa0qvjFN.js.map} +1 -1
- package/dist/{ai-code-block-BI_z0UVR.js → ai-code-block-BgtIxtZZ.js} +1 -1
- package/dist/{ai-code-block-BI_z0UVR.js.map → ai-code-block-BgtIxtZZ.js.map} +1 -1
- package/dist/{ai-conversation-DYtExcrw.js → ai-conversation-CArP7C8K.js} +1 -1
- package/dist/{ai-conversation-DYtExcrw.js.map → ai-conversation-CArP7C8K.js.map} +1 -1
- package/dist/{ai-info-banner-BpzauUAY.js → ai-info-banner-uFxHHwBA.js} +1 -1
- package/dist/{ai-info-banner-BpzauUAY.js.map → ai-info-banner-uFxHHwBA.js.map} +1 -1
- package/dist/{ai-message-CV8SBoHM.js → ai-message-BjnFznXy.js} +1 -1
- package/dist/{ai-message-CV8SBoHM.js.map → ai-message-BjnFznXy.js.map} +1 -1
- package/dist/{ai-mission-header-ByYkJ6YP.js → ai-mission-header-08__gULL.js} +1 -1
- package/dist/{ai-mission-header-ByYkJ6YP.js.map → ai-mission-header-08__gULL.js.map} +1 -1
- package/dist/ai-part-group-DBtgTgAn.js +277 -0
- package/dist/ai-part-group-DBtgTgAn.js.map +1 -0
- package/dist/ai-prompt-input-Dy1LfxPk.js +1541 -0
- package/dist/ai-prompt-input-Dy1LfxPk.js.map +1 -0
- package/dist/{ai-question-Dp1g9k2o.js → ai-question-CHHoDJMg.js} +1 -1
- package/dist/{ai-question-Dp1g9k2o.js.map → ai-question-CHHoDJMg.js.map} +1 -1
- package/dist/{ai-reasoning-UAmNx_LD.js → ai-reasoning-CnL6ZSr5.js} +84 -5
- package/dist/ai-reasoning-CnL6ZSr5.js.map +1 -0
- package/dist/{ai-response-BWoVsNQG.js → ai-response-BEUg3xvd.js} +13 -16
- package/dist/ai-response-BEUg3xvd.js.map +1 -0
- package/dist/{ai-shimmer-BpOmfonu.js → ai-shimmer-By5_L05p.js} +1 -1
- package/dist/{ai-shimmer-BpOmfonu.js.map → ai-shimmer-By5_L05p.js.map} +1 -1
- package/dist/{ai-status-badge-WhbKVeqn.js → ai-status-badge-BGYGWYF6.js} +1 -1
- package/dist/{ai-status-badge-WhbKVeqn.js.map → ai-status-badge-BGYGWYF6.js.map} +1 -1
- package/dist/{ai-streaming-text-ClL7FwvD.js → ai-streaming-text-CMfoThV0.js} +1 -1
- package/dist/{ai-streaming-text-ClL7FwvD.js.map → ai-streaming-text-CMfoThV0.js.map} +1 -1
- package/dist/{ai-subagent-BruGN1UE.js → ai-subagent-DcPRqkAA.js} +1 -1
- package/dist/{ai-subagent-BruGN1UE.js.map → ai-subagent-DcPRqkAA.js.map} +1 -1
- package/dist/{ai-suggestion-CNsCZj5P.js → ai-suggestion-MgeCg5Ar.js} +1 -1
- package/dist/{ai-suggestion-CNsCZj5P.js.map → ai-suggestion-MgeCg5Ar.js.map} +1 -1
- package/dist/{ai-task-list-B9CpMDYN.js → ai-task-list-Da9zIm00.js} +9 -12
- package/dist/ai-task-list-Da9zIm00.js.map +1 -0
- package/dist/{ai-timeline-Bb5ntsr3.js → ai-timeline-Cwu045IR.js} +1 -1
- package/dist/ai-timeline-Cwu045IR.js.map +1 -0
- package/dist/{ai-tool-BGH8nQ_D.js → ai-tool-Cn1O4xjP.js} +168 -11
- package/dist/ai-tool-Cn1O4xjP.js.map +1 -0
- package/dist/{ai-usage-bar-BI-p-JBk.js → ai-usage-bar-DjS12DMp.js} +1 -1
- package/dist/{ai-usage-bar-BI-p-JBk.js.map → ai-usage-bar-DjS12DMp.js.map} +1 -1
- package/dist/catalog.js +3 -3
- package/dist/catalog.js.map +1 -1
- package/dist/{chart-Bes4MN3C.js → chart-BK3sVPnD.js} +442 -248
- package/dist/chart-BK3sVPnD.js.map +1 -0
- package/dist/{checkbox-CPX7lBaU.js → checkbox-DYhUmZNw.js} +4 -4
- package/dist/checkbox-DYhUmZNw.js.map +1 -0
- package/dist/{clipboard-text-92YeCybc.js → clipboard-text-ssybngLw.js} +2 -2
- package/dist/{clipboard-text-92YeCybc.js.map → clipboard-text-ssybngLw.js.map} +1 -1
- package/dist/{code-DE1Yy1Cu.js → code-Cx-QSoOT.js} +2 -2
- package/dist/{code-DE1Yy1Cu.js.map → code-Cx-QSoOT.js.map} +1 -1
- package/dist/{combobox-B0bLdsX8.js → combobox-C0iW6a0r.js} +2 -2
- package/dist/{combobox-B0bLdsX8.js.map → combobox-C0iW6a0r.js.map} +1 -1
- package/dist/command-line/cli.js +22 -27
- package/dist/{command-palette-CBTY8EiF.js → command-palette-DGzioeki.js} +2 -2
- package/dist/command-palette-DGzioeki.js.map +1 -0
- package/dist/components/ai-actions.js +1 -1
- package/dist/components/ai-agent-card.js +1 -1
- package/dist/components/ai-approval.js +1 -1
- package/dist/components/ai-code-block.js +1 -1
- package/dist/components/ai-conversation.js +1 -1
- package/dist/components/ai-info-banner.js +1 -1
- package/dist/components/ai-message.js +1 -1
- package/dist/components/ai-mission-header.js +1 -1
- package/dist/components/ai-part-group.js +3 -0
- package/dist/components/ai-prompt-input.js +2 -2
- package/dist/components/ai-question.js +1 -1
- package/dist/components/ai-reasoning.js +1 -1
- package/dist/components/ai-response.js +1 -1
- package/dist/components/ai-shimmer.js +1 -1
- package/dist/components/ai-status-badge.js +1 -1
- package/dist/components/ai-streaming-text.js +1 -1
- package/dist/components/ai-subagent.js +1 -1
- package/dist/components/ai-suggestion.js +1 -1
- package/dist/components/ai-task-list.js +1 -1
- package/dist/components/ai-timeline.js +1 -1
- package/dist/components/ai-tool.js +1 -1
- package/dist/components/ai-usage-bar.js +1 -1
- package/dist/components/chart.js +3 -2
- package/dist/components/checkbox.js +1 -1
- package/dist/components/clipboard-text.js +1 -1
- package/dist/components/code.js +1 -1
- package/dist/components/combobox.js +1 -1
- package/dist/components/command-palette.js +1 -1
- package/dist/components/data-grid.js +1 -1
- package/dist/components/date-picker.js +1 -1
- package/dist/components/dropdown.js +1 -1
- package/dist/components/filters.js +1 -1
- package/dist/components/input.js +2 -2
- package/dist/components/link.js +2 -2
- package/dist/components/link.js.map +1 -1
- package/dist/components/pagination.js +1 -1
- package/dist/components/radio.js +1 -1
- package/dist/components/select.js +1 -1
- package/dist/components/sensitive-input.js +1 -1
- package/dist/components/sidebar.js +1 -1
- package/dist/components/sparkline.js +3 -0
- package/dist/components/stat-card.js +3 -0
- package/dist/components/table.js +1 -1
- package/dist/components/text-roll.js +3 -0
- package/dist/components/theme-toggle.js +1 -1
- package/dist/components/use-agent-harness.js +1 -1
- package/dist/{data-grid-UJ9ja5cu.js → data-grid-CG76N_hK.js} +6 -6
- package/dist/data-grid-CG76N_hK.js.map +1 -0
- package/dist/{date-picker-ebekkC3R.js → date-picker-Dqg9L4xu.js} +2 -2
- package/dist/{date-picker-ebekkC3R.js.map → date-picker-Dqg9L4xu.js.map} +1 -1
- package/dist/{dist-BNlyONdD.js → dist-1-gcEL2L.js} +224 -135
- package/dist/dist-1-gcEL2L.js.map +1 -0
- package/dist/{dropdown-J5T4pHaR.js → dropdown-qnEYRFXZ.js} +2 -2
- package/dist/{dropdown-J5T4pHaR.js.map → dropdown-qnEYRFXZ.js.map} +1 -1
- package/dist/echart-DURZEyai.js +314 -0
- package/dist/echart-DURZEyai.js.map +1 -0
- package/dist/{filters-BdBogf7D.js → filters-Bw_U6ZTx.js} +5 -5
- package/dist/filters-Bw_U6ZTx.js.map +1 -0
- package/dist/flow-BRsYUCJa.js.map +1 -1
- package/dist/genui.js +2 -2
- package/dist/genui.js.map +1 -1
- package/dist/index.js +45 -42
- package/dist/index.js.map +1 -1
- package/dist/{input-BxQAnXki.js → input-DXYUjGgD.js} +2 -2
- package/dist/{input-BxQAnXki.js.map → input-DXYUjGgD.js.map} +1 -1
- package/dist/{input-Cn25I4o5.js → input-DddtBN-g.js} +2 -2
- package/dist/{input-Cn25I4o5.js.map → input-DddtBN-g.js.map} +1 -1
- package/dist/layer-card-BME0eljh.js.map +1 -1
- package/dist/{pagination-C_YqCy8l.js → pagination-BVqdlONY.js} +2 -2
- package/dist/{pagination-C_YqCy8l.js.map → pagination-BVqdlONY.js.map} +1 -1
- package/dist/primitives/otp-field.js +2 -0
- package/dist/primitives.js +1 -0
- package/dist/{radio-B7zg1wUI.js → radio-BNSwOt3B.js} +3 -3
- package/dist/radio-BNSwOt3B.js.map +1 -0
- package/dist/{select-9p721G00.js → select-1w2aebGQ.js} +2 -2
- package/dist/select-1w2aebGQ.js.map +1 -0
- package/dist/{sensitive-input-D5je2NLl.js → sensitive-input-82Cez3vj.js} +2 -2
- package/dist/{sensitive-input-D5je2NLl.js.map → sensitive-input-82Cez3vj.js.map} +1 -1
- package/dist/{sidebar-DOwBrq57.js → sidebar-CAsCmSpM.js} +3 -3
- package/dist/sidebar-CAsCmSpM.js.map +1 -0
- package/dist/sparkline-DdbeM4Ai.js +108 -0
- package/dist/sparkline-DdbeM4Ai.js.map +1 -0
- package/dist/src/blocks/agent-harness/agent-harness.d.ts +30 -9
- package/dist/src/blocks/agent-harness/agent-harness.d.ts.map +1 -1
- package/dist/src/blocks/agent-harness/agent-harness.stories.tsx +114 -0
- package/dist/src/blocks/agent-harness/agent-harness.tsx +144 -63
- package/dist/src/blocks/commander/commander.stories.tsx +31 -0
- package/dist/src/blocks/dashboard-grid/dashboard-grid.d.ts +48 -0
- package/dist/src/blocks/dashboard-grid/dashboard-grid.d.ts.map +1 -0
- package/dist/src/blocks/dashboard-grid/dashboard-grid.stories.tsx +19 -0
- package/dist/src/blocks/dashboard-grid/dashboard-grid.tsx +110 -0
- package/dist/src/blocks/dashboard-grid/index.d.ts +2 -0
- package/dist/src/blocks/dashboard-grid/index.d.ts.map +1 -0
- package/dist/src/blocks/delete-resource/delete-resource.stories.tsx +31 -0
- package/dist/src/blocks/map-block/map-block.stories.tsx +41 -0
- package/dist/src/blocks/metrics-overview/index.d.ts +2 -0
- package/dist/src/blocks/metrics-overview/index.d.ts.map +1 -0
- package/dist/src/blocks/metrics-overview/metrics-overview.d.ts +67 -0
- package/dist/src/blocks/metrics-overview/metrics-overview.d.ts.map +1 -0
- package/dist/src/blocks/metrics-overview/metrics-overview.stories.tsx +26 -0
- package/dist/src/blocks/metrics-overview/metrics-overview.tsx +139 -0
- package/dist/src/blocks/page-header/page-header.stories.tsx +56 -0
- package/dist/src/blocks/resource-list/resource-list.stories.tsx +31 -0
- package/dist/src/catalog/catalog.d.ts +1 -1
- package/dist/src/catalog/index.d.ts +1 -1
- package/dist/src/catalog/types.d.ts +1 -1
- package/dist/src/command-line/build-cli.d.ts +1 -1
- package/dist/src/command-line/cli.d.ts +1 -1
- package/dist/src/command-line/commands/add.d.ts +1 -1
- package/dist/src/command-line/commands/add.d.ts.map +1 -1
- package/dist/src/command-line/commands/ai.d.ts.map +1 -1
- package/dist/src/command-line/commands/blocks.d.ts +1 -1
- package/dist/src/command-line/commands/blocks.d.ts.map +1 -1
- package/dist/src/command-line/commands/doc.d.ts +1 -1
- package/dist/src/command-line/commands/doc.d.ts.map +1 -1
- package/dist/src/command-line/commands/ls.d.ts +1 -1
- package/dist/src/command-line/commands/ls.d.ts.map +1 -1
- package/dist/src/command-line/commands/migrate.d.ts +3 -3
- package/dist/src/command-line/commands/migrate.d.ts.map +1 -1
- package/dist/src/command-line/utils/config.d.ts +1 -1
- package/dist/src/command-line/utils/transformer.d.ts +1 -1
- package/dist/src/components/ai-part-group/ai-part-group.d.ts +134 -0
- package/dist/src/components/ai-part-group/ai-part-group.d.ts.map +1 -0
- package/dist/src/components/ai-part-group/index.d.ts +2 -0
- package/dist/src/components/ai-part-group/index.d.ts.map +1 -0
- package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts +196 -7
- package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -1
- package/dist/src/components/ai-prompt-input/controller.d.ts +41 -0
- package/dist/src/components/ai-prompt-input/controller.d.ts.map +1 -0
- package/dist/src/components/ai-prompt-input/index.d.ts +3 -1
- package/dist/src/components/ai-prompt-input/index.d.ts.map +1 -1
- package/dist/src/components/ai-prompt-input/types.d.ts +86 -0
- package/dist/src/components/ai-prompt-input/types.d.ts.map +1 -0
- package/dist/src/components/ai-reasoning/ai-reasoning.d.ts +17 -1
- package/dist/src/components/ai-reasoning/ai-reasoning.d.ts.map +1 -1
- package/dist/src/components/ai-response/ai-response.d.ts +1 -2
- package/dist/src/components/ai-response/ai-response.d.ts.map +1 -1
- package/dist/src/components/ai-task-list/ai-task-list.d.ts.map +1 -1
- package/dist/src/components/ai-tool/ai-tool.d.ts +17 -1
- package/dist/src/components/ai-tool/ai-tool.d.ts.map +1 -1
- package/dist/src/components/chart/area-chart.d.ts +69 -0
- package/dist/src/components/chart/area-chart.d.ts.map +1 -0
- package/dist/src/components/chart/bar-chart.d.ts +60 -0
- package/dist/src/components/chart/bar-chart.d.ts.map +1 -0
- package/dist/src/components/chart/color.d.ts +56 -0
- package/dist/src/components/chart/color.d.ts.map +1 -1
- package/dist/src/components/chart/echart.d.ts.map +1 -1
- package/dist/src/components/chart/index.d.ts +5 -0
- package/dist/src/components/chart/index.d.ts.map +1 -1
- package/dist/src/components/chart/pie-chart.d.ts +64 -0
- package/dist/src/components/chart/pie-chart.d.ts.map +1 -0
- package/dist/src/components/chart/scatter-chart.d.ts +57 -0
- package/dist/src/components/chart/scatter-chart.d.ts.map +1 -0
- package/dist/src/components/chart/stacked-bar-chart.d.ts +59 -0
- package/dist/src/components/chart/stacked-bar-chart.d.ts.map +1 -0
- package/dist/src/components/chart/timeseries-chart.d.ts.map +1 -1
- package/dist/src/components/code/code.d.ts +1 -1
- package/dist/src/components/command-palette/command-palette.d.ts +1 -1
- package/dist/src/components/data-grid/data-grid.d.ts.map +1 -1
- package/dist/src/components/data-grid/index.d.ts +1 -1
- package/dist/src/components/data-grid/index.d.ts.map +1 -1
- package/dist/src/components/data-grid/types.d.ts.map +1 -1
- package/dist/src/components/date-picker/date-picker.d.ts +2 -2
- package/dist/src/components/filters/filters.d.ts.map +1 -1
- package/dist/src/components/filters/helpers.d.ts.map +1 -1
- package/dist/src/components/filters/types.d.ts.map +1 -1
- package/dist/src/components/layer-card/layer-card.d.ts +1 -1
- package/dist/src/components/link/link.d.ts +2 -2
- package/dist/src/components/radio/radio.d.ts +1 -1
- package/dist/src/components/select/select.d.ts +1 -1
- package/dist/src/components/sidebar/sidebar.d.ts +2 -2
- package/dist/src/components/sparkline/index.d.ts +2 -0
- package/dist/src/components/sparkline/index.d.ts.map +1 -0
- package/dist/src/components/sparkline/sparkline.d.ts +52 -0
- package/dist/src/components/sparkline/sparkline.d.ts.map +1 -0
- package/dist/src/components/stat-card/index.d.ts +2 -0
- package/dist/src/components/{ai-loader → stat-card}/index.d.ts.map +1 -1
- package/dist/src/components/stat-card/stat-card.d.ts +80 -0
- package/dist/src/components/stat-card/stat-card.d.ts.map +1 -0
- package/dist/src/components/text-roll/index.d.ts +2 -0
- package/dist/src/components/text-roll/index.d.ts.map +1 -0
- package/dist/src/components/text-roll/text-roll.d.ts +49 -0
- package/dist/src/components/text-roll/text-roll.d.ts.map +1 -0
- package/dist/src/components/toast/toast.d.ts.map +1 -1
- package/dist/src/components/use-agent-harness/use-agent-harness.d.ts +2 -2
- package/dist/src/genui/genui.d.ts.map +1 -1
- package/dist/src/index.d.ts +5 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/primitives/index.d.ts +1 -0
- package/dist/src/primitives/index.d.ts.map +1 -1
- package/dist/src/primitives/otp-field.d.ts +13 -0
- package/dist/src/primitives/otp-field.d.ts.map +1 -0
- package/dist/src/registry/index.d.ts +1 -1
- package/dist/src/registry/types.d.ts +1 -1
- package/dist/stat-card-CEZscNh8.js +103 -0
- package/dist/stat-card-CEZscNh8.js.map +1 -0
- package/dist/styles/sf-binding.css +20 -62
- package/dist/styles/sf-standalone.css +2 -2
- package/dist/styles/shadcn.css +120 -0
- package/dist/styles/theme-blue-tint.css +98 -0
- package/dist/styles/theme-fedramp.css +3 -12
- package/dist/styles/theme-minimal.css +26 -104
- package/dist/styles/theme-sf.css +96 -114
- package/dist/{table-CIMx0Oq0.js → table-Rv4JMy0B.js} +2 -2
- package/dist/{table-CIMx0Oq0.js.map → table-Rv4JMy0B.js.map} +1 -1
- package/dist/text-roll-BZ3I1umc.js +79 -0
- package/dist/text-roll-BZ3I1umc.js.map +1 -0
- package/dist/{theme-toggle-Dpgnoj_Q.js → theme-toggle-Bhu681D7.js} +1 -1
- package/dist/{theme-toggle-Dpgnoj_Q.js.map → theme-toggle-Bhu681D7.js.map} +1 -1
- package/dist/{use-agent-harness-DZzcn96L.js → use-agent-harness-BMyF8pTq.js} +5 -5
- package/dist/use-agent-harness-BMyF8pTq.js.map +1 -0
- package/package.json +48 -19
- package/scripts/component-registry/discovery.ts +2 -2
- package/scripts/component-registry/index.ts +1 -1
- package/scripts/component-registry/props-filter.ts +1 -1
- package/scripts/component-registry/utils.ts +5 -5
- package/scripts/component-registry/variant-parser.ts +124 -19
- package/scripts/convert-demos-to-stories.ts +253 -0
- package/scripts/css-build.ts +4 -3
- package/scripts/generate-primitives.ts +11 -3
- package/scripts/theme-generator/config.ts +339 -71
- package/scripts/theme-generator/generate-css.ts +17 -3
- package/scripts/theme-generator/index.ts +3 -3
- package/scripts/theme-generator/migrate.ts +1 -1
- package/dist/ai-loader-Cr3eQkNS.js +0 -134
- package/dist/ai-loader-Cr3eQkNS.js.map +0 -1
- package/dist/ai-prompt-input-Bo1YuJly.js +0 -769
- package/dist/ai-prompt-input-Bo1YuJly.js.map +0 -1
- package/dist/ai-reasoning-UAmNx_LD.js.map +0 -1
- package/dist/ai-response-BWoVsNQG.js.map +0 -1
- package/dist/ai-task-list-B9CpMDYN.js.map +0 -1
- package/dist/ai-timeline-Bb5ntsr3.js.map +0 -1
- package/dist/ai-tool-BGH8nQ_D.js.map +0 -1
- package/dist/chart-Bes4MN3C.js.map +0 -1
- package/dist/checkbox-CPX7lBaU.js.map +0 -1
- package/dist/command-palette-CBTY8EiF.js.map +0 -1
- package/dist/components/ai-loader.js +0 -3
- package/dist/data-grid-UJ9ja5cu.js.map +0 -1
- package/dist/dist-BNlyONdD.js.map +0 -1
- package/dist/filters-BdBogf7D.js.map +0 -1
- package/dist/radio-B7zg1wUI.js.map +0 -1
- package/dist/select-9p721G00.js.map +0 -1
- package/dist/sidebar-DOwBrq57.js.map +0 -1
- package/dist/src/components/ai-loader/ai-loader.d.ts +0 -44
- package/dist/src/components/ai-loader/ai-loader.d.ts.map +0 -1
- package/dist/src/components/ai-loader/index.d.ts +0 -2
- package/dist/styles/theme-navigator.css +0 -137
- package/dist/use-agent-harness-DZzcn96L.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-tool-Cn1O4xjP.js","names":[],"sources":["../src/components/ai-tool/ai-tool.tsx"],"sourcesContent":["\"use client\";\n\nimport { Collapsible as BaseCollapsible } from \"@base-ui/react/collapsible\";\nimport {\n CaretDownIcon,\n CheckIcon,\n CircleIcon,\n CodeIcon,\n DatabaseIcon,\n FileTextIcon,\n GearIcon,\n GlobeIcon,\n ImageIcon,\n LightningIcon,\n MagnifyingGlassIcon,\n ChatCircleIcon,\n SpinnerGapIcon,\n TerminalIcon,\n WarningCircleIcon,\n XCircleIcon,\n ShieldWarningIcon,\n BrainIcon,\n} from \"@phosphor-icons/react\";\nimport type { ComponentProps, ElementType } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\nimport { AiStatusBadge, type AiStatusBadgeStatus } from \"../ai-status-badge\";\nimport { Button } from \"../button\";\nimport { Tooltip } from \"../tooltip\";\n\n// ─── Variants ────────────────────────────────────────────────────────────────\n\nexport const SF_AI_TOOL_VARIANTS = {\n variant: {\n default: {\n classes: \"\",\n description: \"Expandable card with collapsible input/output sections\",\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 ephemeral: {\n classes: \"\",\n description:\n \"Single-status row that auto-dismisses after the call completes. Persists on error or when the user expands it.\",\n },\n },\n} as const;\n\nexport const SF_AI_TOOL_DEFAULT_VARIANTS = {\n variant: \"default\",\n} as const;\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\n/** Tool execution state — matches Vercel AI SDK ToolUIPart[\"state\"]. */\nexport type AiToolState =\n | \"input-streaming\"\n | \"input-available\"\n | \"approval-requested\"\n | \"approval-responded\"\n | \"output-available\"\n | \"output-error\"\n | \"output-denied\";\n\n/** Display variant for tool call rendering. */\nexport type AiToolCallVariant = keyof typeof SF_AI_TOOL_VARIANTS.variant;\n\n/** Approval state for tools requiring user confirmation. */\nexport type AiToolApprovalState =\n | \"awaiting\"\n | \"approved\"\n | \"declined\"\n | undefined;\n\n/**\n * Structured tool part — mirrors the shape of Vercel AI SDK's `ToolUIPart`\n * without requiring the `ai` package as a dependency.\n */\nexport interface AiToolPart {\n /** Tool call identifier. */\n toolCallId: string;\n /** Tool name or type identifier. */\n toolName: string;\n /** Current execution state. */\n state: AiToolState;\n /** Tool input parameters. */\n input?: unknown;\n /** Tool output result. */\n output?: unknown;\n /** Error text when state is \"output-error\". */\n errorText?: string;\n}\n\nexport type AiToolCallProps = Omit<ComponentProps<\"div\">, \"part\"> & {\n /** Structured tool part data. */\n part: AiToolPart;\n /** Display variant. @default \"default\" */\n variant?: AiToolCallVariant;\n /** Duration in milliseconds. */\n duration?: number;\n /** Summary text shown alongside the tool name. */\n summary?: string;\n /** Custom icon override. */\n icon?: ElementType;\n /** Approval state for tools requiring confirmation. */\n approvalState?: AiToolApprovalState;\n /** Called when user approves a tool call (only relevant when `approvalState=\"awaiting\"`). */\n onApprove?: () => void;\n /** Called when user rejects a tool call (only relevant when `approvalState=\"awaiting\"`). */\n onReject?: () => void;\n /** Default expanded state for the collapsible. @default false */\n defaultExpanded?: boolean;\n /**\n * For `variant=\"ephemeral\"`: ms to keep the completed row visible before\n * fading out. Set to `0` to disable auto-dismiss. @default 800\n */\n dismissDelay?: number;\n /**\n * For `variant=\"ephemeral\"`: when `true`, the row never auto-dismisses.\n * Errors and user-expanded rows are pinned automatically.\n */\n persist?: boolean;\n /** Called once the ephemeral row has finished its dismiss animation. */\n onDismiss?: () => void;\n};\n\nexport type AiToolCallGroupProps = Omit<ComponentProps<\"div\">, \"part\"> & {\n /** Array of tool parts. */\n parts: AiToolPart[];\n /** Group label. */\n label?: string;\n /** Duration map keyed by toolCallId. */\n durations?: Record<string, number>;\n /** Summary map keyed by toolCallId. */\n summaries?: Record<string, string>;\n /** Approval states map keyed by toolCallId. */\n approvalStates?: Record<string, AiToolApprovalState>;\n /** Called when user approves a tool call. Receives the `toolCallId`. */\n onApprove?: (toolCallId: string) => void;\n /** Called when user rejects a tool call. Receives the `toolCallId`. */\n onReject?: (toolCallId: string) => void;\n /** Default expanded state. @default false */\n defaultExpanded?: boolean;\n};\n\nexport type AiToolCallTimelineProps = ComponentProps<\"div\"> & {\n /** Array of tool parts. */\n parts: AiToolPart[];\n /** Duration map keyed by toolCallId. */\n durations?: Record<string, number>;\n};\n\n// ─── Icon Map ────────────────────────────────────────────────────────────────\n\nconst TOOL_ICONS: Record<string, ElementType> = {\n generateSuggestions: BrainIcon,\n searchDatabase: DatabaseIcon,\n searchWeb: GlobeIcon,\n search: MagnifyingGlassIcon,\n readFile: FileTextIcon,\n writeFile: FileTextIcon,\n executeQuery: LightningIcon,\n analyzeContent: BrainIcon,\n generateImage: ImageIcon,\n chat: ChatCircleIcon,\n runCode: TerminalIcon,\n settings: GearIcon,\n code: CodeIcon,\n};\n\n// ─── Utilities ───────────────────────────────────────────────────────────────\n\n/** Extract the display-friendly tool name from a tool part. */\nexport function getToolDisplayName(part: AiToolPart): string {\n return part.toolName\n .replace(\"tool-\", \"\")\n .replace(\"Tool\", \"\")\n .replace(/([A-Z])/g, \" $1\")\n .replace(/_/g, \" \")\n .replace(/^./, (s) => s.toUpperCase())\n .trim();\n}\n\n/** Get the best-matching icon for a tool part. */\nexport function getToolIcon(part: AiToolPart): ElementType {\n if (TOOL_ICONS[part.toolName]) return TOOL_ICONS[part.toolName];\n\n const lower = part.toolName.toLowerCase();\n for (const [key, icon] of Object.entries(TOOL_ICONS)) {\n if (lower.includes(key.toLowerCase())) return icon;\n }\n\n return MagnifyingGlassIcon;\n}\n\n/** Whether the tool is still loading (input phase). */\nexport function isToolLoading(part: AiToolPart): boolean {\n return part.state === \"input-streaming\" || part.state === \"input-available\";\n}\n\n/** Whether the tool has produced a result. */\nexport function hasToolResult(part: AiToolPart): boolean {\n return part.state === \"output-available\";\n}\n\n/** Whether the output itself contains an error flag. */\nexport function hasToolOutputError(part: AiToolPart): boolean {\n if (part.state !== \"output-available\") return false;\n const output = part.output as Record<string, unknown> | undefined;\n return output?.error === true;\n}\n\n/** Whether the tool is in any error state. */\nexport function hasToolError(part: AiToolPart): boolean {\n return part.state === \"output-error\" || hasToolOutputError(part);\n}\n\n/** Extract error text from either error state or output.error. */\nexport function getToolErrorText(part: AiToolPart): string | undefined {\n if (part.state === \"output-error\") return part.errorText;\n if (hasToolOutputError(part)) {\n const output = part.output as Record<string, unknown>;\n return (\n (output.message as string) ||\n (output.error as string) ||\n \"Tool returned an error\"\n );\n }\n return undefined;\n}\n\n// ─── State Config ────────────────────────────────────────────────────────────\n\ninterface StateConfig {\n colorClass: string;\n bgClass: string;\n icon: ElementType;\n spin: boolean;\n label: string;\n /** Solid dot color for the minimalist status indicator (ephemeral variant). */\n dotClass: string;\n /** Whether the dot should pulse (running / streaming states). */\n dotPulse: boolean;\n}\n\nfunction getStateConfig(\n part: AiToolPart,\n approvalState?: AiToolApprovalState\n): StateConfig {\n if (approvalState === \"awaiting\") {\n return {\n colorClass: \"text-sf-warning\",\n bgClass: \"bg-sf-warning/10\",\n icon: ShieldWarningIcon,\n spin: false,\n label: \"Awaiting Approval\",\n dotClass: \"bg-sf-warning\",\n dotPulse: true,\n };\n }\n\n if (approvalState === \"declined\") {\n return {\n colorClass: \"text-sf-danger\",\n bgClass: \"bg-sf-danger/10\",\n icon: XCircleIcon,\n spin: false,\n label: \"Declined\",\n dotClass: \"bg-sf-danger\",\n dotPulse: false,\n };\n }\n\n if (hasToolError(part)) {\n return {\n colorClass: \"text-sf-danger\",\n bgClass: \"bg-sf-danger/10\",\n icon: WarningCircleIcon,\n spin: false,\n label: \"Failed\",\n dotClass: \"bg-sf-danger\",\n dotPulse: false,\n };\n }\n\n switch (part.state) {\n case \"input-streaming\":\n return {\n colorClass: \"text-sf-brand\",\n bgClass: \"bg-sf-brand/10\",\n icon: CircleIcon,\n spin: false,\n label: \"Streaming\",\n dotClass: \"bg-sf-warning\",\n dotPulse: true,\n };\n case \"input-available\":\n return {\n colorClass: \"text-sf-brand\",\n bgClass: \"bg-sf-brand/10\",\n icon: SpinnerGapIcon,\n spin: true,\n label: \"Running\",\n dotClass: \"bg-sf-warning\",\n dotPulse: true,\n };\n case \"output-available\":\n return {\n colorClass: \"text-sf-success\",\n bgClass: \"bg-sf-tint\",\n icon: CheckIcon,\n spin: false,\n label: \"Complete\",\n dotClass: \"bg-sf-success\",\n dotPulse: false,\n };\n default:\n return {\n colorClass: \"text-sf-subtle\",\n bgClass: \"bg-sf-tint\",\n icon: CircleIcon,\n spin: false,\n label: \"Pending\",\n dotClass: \"bg-sf-subtle/40\",\n dotPulse: false,\n };\n }\n}\n\n// ─── AiToolCall ──────────────────────────────────────────────────────────────\n\n/**\n * Renders a single tool call. Supports three display variants:\n * - `\"default\"` — expandable card with collapsible input/output\n * - `\"inline\"` — compact single-line with left accent border\n * - `\"minimal\"` — pill-shaped status badge\n *\n * @example\n * ```tsx\n * <AiToolCall\n * part={{ toolCallId: \"1\", toolName: \"web_search\", state: \"output-available\", input: { q: \"ts\" }, output: \"...\" }}\n * />\n * ```\n */\nexport function AiToolCall({\n part,\n variant = \"default\",\n duration,\n summary,\n icon: CustomIcon,\n approvalState,\n onApprove,\n onReject,\n defaultExpanded = false,\n dismissDelay = 800,\n persist = false,\n onDismiss,\n className,\n ...props\n}: AiToolCallProps) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\n\n const IconComponent = CustomIcon ?? getToolIcon(part);\n const displayName = getToolDisplayName(part);\n const config = getStateConfig(part, approvalState);\n const StatusIconEl = config.icon;\n const errorText = getToolErrorText(part);\n\n // ── Ephemeral ──────────────────────────────────────────────────────────────\n\n if (variant === \"ephemeral\") {\n return (\n <AiToolCallEphemeral\n part={part}\n approvalState={approvalState}\n duration={duration}\n summary={summary}\n icon={IconComponent}\n displayName={displayName}\n config={config}\n errorText={errorText}\n dismissDelay={dismissDelay}\n persist={persist}\n onDismiss={onDismiss}\n onApprove={onApprove}\n onReject={onReject}\n className={className}\n {...props}\n />\n );\n }\n\n // ── Minimal ────────────────────────────────────────────────────────────────\n\n if (variant === \"minimal\") {\n const handleGetToolStatus = (): AiStatusBadgeStatus => {\n if (hasToolError(part)) return \"error\";\n if (approvalState === \"awaiting\") return \"idle\";\n if (isToolLoading(part)) return \"running\";\n if (hasToolResult(part)) return \"success\";\n return \"idle\";\n };\n\n return (\n <AiStatusBadge\n className={cn(\n \"my-1.5 py-1\",\n hasToolError(part) && \"bg-sf-danger/10\",\n className\n )}\n icon={IconComponent}\n label={displayName}\n status={handleGetToolStatus()}\n {...props}\n />\n );\n }\n\n // ── Inline ─────────────────────────────────────────────────────────────────\n\n if (variant === \"inline\") {\n return (\n <div\n className={cn(\n \"my-1 flex w-full items-center gap-2 py-1.5 pl-1\",\n \"animate-in fade-in-0 slide-in-from-bottom-1 duration-200\",\n className\n )}\n {...props}\n >\n <div className={cn(\"shrink-0 rounded-md p-1\", config.bgClass)}>\n <IconComponent className={cn(\"size-3.5\", config.colorClass)} />\n </div>\n <span\n className={cn(\n \"min-w-0 grow truncate text-sm\",\n hasToolError(part) ? \"text-sf-danger\" : \"text-sf-subtle\"\n )}\n >\n {displayName}\n </span>\n {/* Right-aligned meta group */}\n <div className=\"flex shrink-0 items-center gap-1.5\">\n {duration && hasToolResult(part) ? (\n <span className=\"text-xs tabular-nums text-sf-subtle\">\n {duration}ms\n </span>\n ) : null}\n {summary && !hasToolError(part) ? (\n <span className=\"max-w-[160px] truncate text-xs text-sf-subtle\">\n {summary}\n </span>\n ) : null}\n {errorText ? (\n <span\n className=\"max-w-[160px] truncate text-xs text-sf-danger\"\n title={errorText}\n >\n {errorText}\n </span>\n ) : null}\n {approvalState === \"awaiting\" && (onApprove || onReject) ? (\n <>\n {onReject && (\n <Button\n onClick={onReject}\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n >\n Reject\n </Button>\n )}\n {onApprove && (\n <Button\n onClick={onApprove}\n size=\"sm\"\n type=\"button\"\n variant=\"primary\"\n >\n Approve\n </Button>\n )}\n </>\n ) : (\n <StatusIconEl\n className={cn(\n \"size-3.5\",\n config.colorClass,\n config.spin && \"animate-spin\"\n )}\n />\n )}\n </div>\n </div>\n );\n }\n\n // ── Default (compact expandable row) ─────────────────────────────────────\n\n return (\n <BaseCollapsible.Root open={isExpanded} onOpenChange={setIsExpanded}>\n <div\n className={cn(\n \"my-0.5 flex w-full max-w-sm flex-col\",\n \"animate-in fade-in-0 duration-150\",\n className\n )}\n {...props}\n >\n {/* Trigger — content-width: name + meta + caret */}\n <BaseCollapsible.Trigger\n render={\n <button\n type=\"button\"\n className={cn(\n \"flex w-fit items-center gap-1.5 rounded px-1 py-0.5 text-left\",\n \"transition-colors hover:bg-sf-tint\"\n )}\n />\n }\n >\n <span className=\"min-w-0 truncate text-sm text-sf-subtle\">\n {displayName}\n </span>\n {/* Meta group — part of the content-width trigger */}\n <div className=\"flex shrink-0 items-center gap-1.5\">\n {duration && hasToolResult(part) && !isExpanded ? (\n <span className=\"text-xs tabular-nums text-sf-subtle\">\n {duration}ms\n </span>\n ) : null}\n {summary && !isExpanded && !errorText ? (\n <span className=\"max-w-[120px] truncate text-xs text-sf-subtle\">\n {summary}\n </span>\n ) : null}\n <StatusIconEl\n className={cn(\n \"size-3.5\",\n config.colorClass,\n config.spin && \"animate-spin\"\n )}\n />\n <CaretDownIcon\n className={cn(\n \"size-3 text-sf-subtle transition-transform duration-200\",\n !isExpanded && \"-rotate-90\"\n )}\n />\n </div>\n </BaseCollapsible.Trigger>\n\n {/* Detail panel */}\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 {/* Input */}\n {part.input &&\n typeof part.input === \"object\" &&\n Object.keys(part.input as object).length > 0 ? (\n <div>\n <p className=\"mb-1 text-[10px] uppercase tracking-wider text-sf-subtle\">\n Input\n </p>\n <pre className=\"overflow-x-auto rounded bg-sf-recessed p-1.5 font-mono text-xs text-sf-subtle\">\n {JSON.stringify(\n part.input as Record<string, unknown>,\n null,\n 2\n )}\n </pre>\n </div>\n ) : null}\n\n {/* Output */}\n {hasToolResult(part) &&\n part.output !== undefined &&\n !hasToolError(part) ? (\n <div>\n <p className=\"mb-1 text-[10px] uppercase tracking-wider text-sf-subtle\">\n Output\n </p>\n <pre className=\"max-h-28 overflow-x-auto overflow-y-auto rounded bg-sf-recessed p-1.5 font-mono text-xs text-sf-subtle\">\n {typeof part.output === \"string\"\n ? part.output\n : JSON.stringify(\n part.output as Record<string, unknown>,\n null,\n 2\n )}\n </pre>\n </div>\n ) : null}\n\n {/* Error */}\n {errorText ? (\n <div>\n <p className=\"mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wider text-sf-danger\">\n <WarningCircleIcon className=\"size-3\" />\n Error\n </p>\n <pre className=\"overflow-x-auto whitespace-pre-wrap rounded bg-sf-danger/10 p-1.5 font-mono text-xs text-sf-danger\">\n {errorText}\n </pre>\n </div>\n ) : null}\n\n {/* Approval actions */}\n {approvalState === \"awaiting\" && (onApprove || onReject) && (\n <div className=\"flex items-center justify-end gap-2 border-t border-sf-line/20 pt-2\">\n {onReject && (\n <Button\n onClick={onReject}\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n >\n Reject\n </Button>\n )}\n {onApprove && (\n <Button\n onClick={onApprove}\n size=\"sm\"\n type=\"button\"\n variant=\"primary\"\n >\n Approve\n </Button>\n )}\n </div>\n )}\n\n {/* Tool call ID */}\n <p className=\"font-mono text-[10px] text-sf-subtle/50\">\n {part.toolCallId}\n </p>\n </div>\n </BaseCollapsible.Panel>\n </div>\n </BaseCollapsible.Root>\n );\n}\n\n// ─── AiToolCallEphemeral ─────────────────────────────────────────────────────\n\ninterface AiToolCallEphemeralInternalProps extends Omit<\n ComponentProps<\"div\">,\n \"part\"\n> {\n part: AiToolPart;\n approvalState?: AiToolApprovalState;\n duration?: number;\n summary?: string;\n icon: ElementType;\n displayName: string;\n config: StateConfig;\n errorText: string | undefined;\n dismissDelay: number;\n persist: boolean;\n onDismiss?: () => void;\n onApprove?: () => void;\n onReject?: () => void;\n}\n\n// Note: `icon` (tool icon) is accepted for API symmetry with other variants\n// but the ephemeral row leads with the status icon for at-a-glance state.\n\nconst FADE_OUT_MS = 200;\n\n/**\n * Internal renderer for `variant=\"ephemeral\"`. Shows a single-status row\n * that auto-dismisses once the tool call completes. Pins on error or when\n * the user expands the row.\n */\nfunction AiToolCallEphemeral({\n part,\n approvalState,\n duration,\n summary,\n icon: _icon,\n displayName,\n config,\n errorText,\n dismissDelay,\n persist,\n onDismiss,\n onApprove,\n onReject,\n className,\n ...props\n}: AiToolCallEphemeralInternalProps) {\n const [isExpanded, setIsExpanded] = useState(false);\n const [phase, setPhase] = useState<\"live\" | \"fading\" | \"gone\">(\"live\");\n const userExpandedRef = useRef(false);\n\n const hasError = hasToolError(part);\n const isComplete = hasToolResult(part);\n const isAwaitingApproval = approvalState === \"awaiting\";\n\n // Pin the row when: errored, user expanded, persist requested, or awaiting approval.\n const pinned =\n persist || hasError || userExpandedRef.current || isAwaitingApproval;\n\n // Auto-dismiss when complete (and not pinned).\n useEffect(() => {\n if (phase !== \"live\") return;\n if (!isComplete) return;\n if (pinned) return;\n if (dismissDelay <= 0) return;\n\n const settleTimer = setTimeout(() => {\n setPhase(\"fading\");\n }, dismissDelay);\n\n return () => clearTimeout(settleTimer);\n }, [phase, isComplete, pinned, dismissDelay]);\n\n // After fade animation, unmount.\n useEffect(() => {\n if (phase !== \"fading\") return;\n const fadeTimer = setTimeout(() => {\n setPhase(\"gone\");\n onDismiss?.();\n }, FADE_OUT_MS);\n return () => clearTimeout(fadeTimer);\n }, [phase, onDismiss]);\n\n if (phase === \"gone\") return null;\n\n const handleToggle = (next: boolean) => {\n if (next) userExpandedRef.current = true;\n setIsExpanded(next);\n };\n\n return (\n <BaseCollapsible.Root open={isExpanded} onOpenChange={handleToggle}>\n <div\n className={cn(\n \"my-0.5 flex w-full max-w-sm flex-col overflow-hidden\",\n \"transition-[opacity,max-height,margin] duration-200 ease-out\",\n phase === \"live\"\n ? \"max-h-40 opacity-100\"\n : \"pointer-events-none my-0 max-h-0 opacity-0\",\n phase === \"live\" && \"animate-in fade-in-0 duration-150\",\n className\n )}\n data-phase={phase}\n {...props}\n >\n <BaseCollapsible.Trigger\n render={\n <button\n type=\"button\"\n className={cn(\n \"flex w-fit items-center gap-1.5 rounded px-1 py-0.5 text-left\",\n \"transition-colors hover:bg-sf-tint\"\n )}\n />\n }\n >\n <span\n aria-label={config.label}\n className={cn(\n \"size-1.5 shrink-0 rounded-full\",\n config.dotClass,\n config.dotPulse && \"animate-pulse\"\n )}\n role=\"status\"\n />\n <span\n className={cn(\n \"min-w-0 truncate text-sm\",\n hasError ? \"text-sf-danger\" : \"text-sf-subtle\"\n )}\n >\n {displayName}\n </span>\n {duration && isComplete && !isExpanded ? (\n <span className=\"text-xs tabular-nums text-sf-subtle/60\">\n {duration}ms\n </span>\n ) : null}\n {summary && !isExpanded && !errorText ? (\n <span className=\"max-w-[120px] truncate text-xs text-sf-subtle/60\">\n {summary}\n </span>\n ) : null}\n <CaretDownIcon\n className={cn(\n \"size-3 text-sf-subtle/60 transition-transform duration-200\",\n !isExpanded && \"-rotate-90\"\n )}\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 {part.input &&\n typeof part.input === \"object\" &&\n Object.keys(part.input as object).length > 0 ? (\n <div>\n <p className=\"mb-1 text-[10px] uppercase tracking-wider text-sf-subtle\">\n Input\n </p>\n <pre className=\"overflow-x-auto rounded bg-sf-recessed p-1.5 font-mono text-xs text-sf-subtle\">\n {JSON.stringify(\n part.input as Record<string, unknown>,\n null,\n 2\n )}\n </pre>\n </div>\n ) : null}\n\n {hasToolResult(part) && part.output !== undefined && !hasError ? (\n <div>\n <p className=\"mb-1 text-[10px] uppercase tracking-wider text-sf-subtle\">\n Output\n </p>\n <pre className=\"max-h-28 overflow-x-auto overflow-y-auto rounded bg-sf-recessed p-1.5 font-mono text-xs text-sf-subtle\">\n {typeof part.output === \"string\"\n ? part.output\n : JSON.stringify(\n part.output as Record<string, unknown>,\n null,\n 2\n )}\n </pre>\n </div>\n ) : null}\n\n {errorText ? (\n <div>\n <p className=\"mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wider text-sf-danger\">\n <WarningCircleIcon className=\"size-3\" />\n Error\n </p>\n <pre className=\"overflow-x-auto whitespace-pre-wrap rounded bg-sf-danger/10 p-1.5 font-mono text-xs text-sf-danger\">\n {errorText}\n </pre>\n </div>\n ) : null}\n\n {isAwaitingApproval && (onApprove || onReject) && (\n <div className=\"flex items-center justify-end gap-2 border-t border-sf-line/20 pt-2\">\n {onReject && (\n <Button\n onClick={onReject}\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n >\n Reject\n </Button>\n )}\n {onApprove && (\n <Button\n onClick={onApprove}\n size=\"sm\"\n type=\"button\"\n variant=\"primary\"\n >\n Approve\n </Button>\n )}\n </div>\n )}\n </div>\n </BaseCollapsible.Panel>\n </div>\n </BaseCollapsible.Root>\n );\n}\n\n// ─── AiToolCallGroup ─────────────────────────────────────────────────────────\n\n/**\n * Collapsible group of tool calls. Shows a summary header with progress\n * counter and stacked tool icons when collapsed. Renders a single tool\n * directly if only one part is provided.\n *\n * @example\n * ```tsx\n * <AiToolCallGroup parts={toolParts} label=\"3 tools ran\" />\n * ```\n */\nexport function AiToolCallGroup({\n parts,\n label,\n durations = {},\n summaries = {},\n approvalStates = {},\n onApprove,\n onReject,\n defaultExpanded = false,\n className,\n ...props\n}: AiToolCallGroupProps) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\n\n const completedCount = parts.filter(\n (p) => p.state === \"output-available\"\n ).length;\n const errorCount = parts.filter(hasToolError).length;\n const totalCount = parts.length;\n\n // Single item — 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 <AiToolCall\n part={singlePart}\n duration={durations[singlePart.toolCallId]}\n summary={summaries[singlePart.toolCallId]}\n approvalState={approvalStates[singlePart.toolCallId]}\n onApprove={\n onApprove ? () => onApprove(singlePart.toolCallId) : undefined\n }\n onReject={onReject ? () => onReject(singlePart.toolCallId) : undefined}\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-1.5 w-full overflow-hidden rounded-lg bg-sf-tint/50\",\n \"animate-in fade-in-0 slide-in-from-bottom-2 duration-200\",\n className\n )}\n {...props}\n >\n <BaseCollapsible.Trigger\n render={\n <button\n type=\"button\"\n className=\"flex w-fit items-center gap-3 px-3 py-2.5 text-left transition-colors hover:bg-sf-tint\"\n />\n }\n >\n <span className=\"text-sm font-medium text-sf-subtle\">\n {label ?? `${totalCount} tool calls`}\n </span>\n <span className=\"text-xs text-sf-subtle\">\n {completedCount}/{totalCount}\n {errorCount > 0 ? (\n <span className=\"ml-1 text-sf-danger\">({errorCount} errors)</span>\n ) : null}\n </span>\n\n <div className=\"flex items-center gap-2\">\n {/* Tool icon stack when collapsed */}\n {!isExpanded ? (\n <div className=\"flex -space-x-1\">\n {parts.slice(0, 5).map((p) => {\n const Icon = getToolIcon(p);\n return (\n <div\n key={p.toolCallId}\n className={cn(\n \"flex size-6 items-center justify-center rounded-full border-2 border-sf-elevated\",\n p.state === \"output-available\" &&\n !hasToolError(p) &&\n \"bg-sf-tint\",\n isToolLoading(p) && \"bg-sf-tint\",\n hasToolError(p) && \"bg-sf-danger/20\"\n )}\n >\n <Icon className=\"size-3\" />\n </div>\n );\n })}\n {parts.length > 5 ? (\n <div className=\"flex size-6 items-center justify-center rounded-full border-2 border-sf-elevated bg-sf-tint text-[10px] text-sf-subtle\">\n +{parts.length - 5}\n </div>\n ) : null}\n </div>\n ) : null}\n <CaretDownIcon\n className={cn(\n \"size-4 text-sf-subtle transition-transform duration-200\",\n !isExpanded && \"-rotate-90\"\n )}\n />\n </div>\n </BaseCollapsible.Trigger>\n\n <BaseCollapsible.Panel className=\"overflow-hidden\">\n <div className=\"space-y-2 border-t border-sf-line/20 px-3 pt-1 pb-3\">\n {parts.map((p) => (\n <AiToolCall\n key={p.toolCallId}\n part={p}\n variant=\"inline\"\n duration={durations[p.toolCallId]}\n summary={summaries[p.toolCallId]}\n approvalState={approvalStates[p.toolCallId]}\n onApprove={\n onApprove ? () => onApprove(p.toolCallId) : undefined\n }\n onReject={onReject ? () => onReject(p.toolCallId) : undefined}\n />\n ))}\n </div>\n </BaseCollapsible.Panel>\n </div>\n </BaseCollapsible.Root>\n );\n}\n\n// ─── AiToolCallTimeline ──────────────────────────────────────────────────────\n\n/**\n * Horizontal timeline view of tool calls. Each tool is shown as a small\n * icon pill with a tooltip showing its name, duration, and any errors.\n *\n * @example\n * ```tsx\n * <AiToolCallTimeline parts={toolParts} durations={{ id1: 230, id2: 540 }} />\n * ```\n */\nexport function AiToolCallTimeline({\n parts,\n durations = {},\n className,\n ...props\n}: AiToolCallTimelineProps) {\n return (\n <div\n className={cn(\"flex flex-wrap items-center gap-1 py-2\", className)}\n {...props}\n >\n {parts.map((part, index) => {\n const IconComponent = getToolIcon(part);\n const displayName = getToolDisplayName(part);\n const config = getStateConfig(part);\n const duration = durations[part.toolCallId];\n const errorText = getToolErrorText(part);\n\n const tooltipLines = [\n displayName,\n duration ? `${duration}ms` : null,\n errorText ?? null,\n ]\n .filter(Boolean)\n .join(\" · \");\n\n return (\n <div key={part.toolCallId} className=\"flex items-center\">\n <Tooltip content={tooltipLines}>\n <div\n className={cn(\n \"flex cursor-default items-center gap-1.5 rounded-md px-2 py-1 transition-all\",\n config.bgClass\n )}\n >\n <IconComponent className={cn(\"size-3.5\", config.colorClass)} />\n {part.state === \"input-streaming\" ? (\n <CircleIcon\n className={cn(\"size-3 animate-pulse\", config.colorClass)}\n />\n ) : null}\n {part.state === \"input-available\" ? (\n <SpinnerGapIcon\n className={cn(\"size-3 animate-spin\", config.colorClass)}\n />\n ) : null}\n {hasToolResult(part) && !hasToolError(part) ? (\n <CheckIcon className={cn(\"size-3\", config.colorClass)} />\n ) : null}\n {hasToolError(part) ? (\n <WarningCircleIcon\n className={cn(\"size-3\", config.colorClass)}\n />\n ) : null}\n </div>\n </Tooltip>\n\n {/* Connector line */}\n {index < parts.length - 1 ? (\n <div\n className={cn(\n \"mx-0.5 h-px w-3\",\n (() => {\n const nextPart = parts[index + 1];\n if (!nextPart) return \"bg-sf-line\";\n return hasToolResult(nextPart) || isToolLoading(nextPart)\n ? \"bg-sf-success/50\"\n : \"bg-sf-line\";\n })()\n )}\n />\n ) : null}\n </div>\n );\n })}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-usage-bar-
|
|
1
|
+
{"version":3,"file":"ai-usage-bar-DjS12DMp.js","names":[],"sources":["../src/components/ai-usage-bar/ai-usage-bar.tsx"],"sourcesContent":["\"use client\";\n\nimport { LightningIcon } from \"@phosphor-icons/react\";\nimport type { ElementType, HTMLAttributes } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\n\n// ─── Variants ────────────────────────────────────────────────────────────────\n\nexport const SF_AI_USAGE_BAR_VARIANTS = {} as const;\nexport const SF_AI_USAGE_BAR_DEFAULT_VARIANTS = {} as const;\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type AiUsageBarProps = HTMLAttributes<HTMLDivElement> & {\n /** Input/prompt token count. */\n inputTokens?: number;\n /** Output/completion token count. */\n outputTokens?: number;\n /** Total token count. Computed from input + output if not provided. */\n totalTokens?: number;\n /** Estimated cost in USD. */\n cost?: number;\n /** Model ID being used (shown as label). */\n modelId?: string;\n /** Custom icon. Defaults to `LightningIcon`. */\n icon?: ElementType;\n};\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction formatTokens(count: number): string {\n if (count >= 1_000_000) return `${(count / 1_000_000).toFixed(1)}M`;\n if (count >= 1000) return `${(count / 1000).toFixed(1)}k`;\n return count.toString();\n}\n\nfunction formatCost(usd: number): string {\n if (usd < 0.01) return `<$0.01`;\n return `$${usd.toFixed(2)}`;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * Compact token usage display bar. Shows input/output token counts, total,\n * optional cost, and model identifier.\n *\n * Maps to harness event: `usage_update`.\n *\n * @example\n * ```tsx\n * <AiUsageBar\n * inputTokens={1234}\n * outputTokens={567}\n * cost={0.02}\n * modelId=\"claude-sonnet-4\"\n * />\n * ```\n */\nexport function AiUsageBar({\n inputTokens,\n outputTokens,\n totalTokens,\n cost,\n modelId,\n icon,\n className,\n ...props\n}: AiUsageBarProps) {\n const IconComponent = icon ?? LightningIcon;\n const computed = (inputTokens ?? 0) + (outputTokens ?? 0);\n const total = totalTokens ?? (computed > 0 ? computed : undefined);\n const hasTokens =\n inputTokens !== undefined ||\n outputTokens !== undefined ||\n total !== undefined;\n\n if (!hasTokens && cost === undefined && !modelId) return null;\n\n return (\n <div\n className={cn(\n \"flex items-center gap-3 px-3 py-1 text-[11px] tabular-nums text-sf-subtle\",\n className\n )}\n {...props}\n >\n <IconComponent className=\"size-3 shrink-0\" />\n\n {inputTokens !== undefined && (\n <span>\n <span className=\"text-sf-inactive\">in </span>\n {formatTokens(inputTokens)}\n </span>\n )}\n {outputTokens !== undefined && (\n <span>\n <span className=\"text-sf-inactive\">out </span>\n {formatTokens(outputTokens)}\n </span>\n )}\n {total !== undefined && (\n <span>\n <span className=\"text-sf-inactive\">total </span>\n {formatTokens(total)}\n </span>\n )}\n {cost !== undefined && (\n <span className=\"text-sf-subtle\">{formatCost(cost)}</span>\n )}\n {modelId && (\n <span className=\"ml-auto truncate font-mono text-sf-inactive\">\n {modelId}\n </span>\n )}\n </div>\n );\n}\n\nAiUsageBar.displayName = \"AiUsageBar\";\n"],"mappings":";;;;;AASA,IAAa,2BAA2B,EAAE;AAC1C,IAAa,mCAAmC,EAAE;AAqBlD,SAAS,aAAa,OAAuB;AAC3C,KAAI,SAAS,IAAW,QAAO,IAAI,QAAQ,KAAW,QAAQ,EAAE,CAAC;AACjE,KAAI,SAAS,IAAM,QAAO,IAAI,QAAQ,KAAM,QAAQ,EAAE,CAAC;AACvD,QAAO,MAAM,UAAU;;AAGzB,SAAS,WAAW,KAAqB;AACvC,KAAI,MAAM,IAAM,QAAO;AACvB,QAAO,IAAI,IAAI,QAAQ,EAAE;;;;;;;;;;;;;;;;;;AAqB3B,SAAgB,WAAW,EACzB,aACA,cACA,aACA,MACA,SACA,MACA,WACA,GAAG,SACe;CAClB,MAAM,gBAAgB,QAAQ;CAC9B,MAAM,YAAY,eAAe,MAAM,gBAAgB;CACvD,MAAM,QAAQ,gBAAgB,WAAW,IAAI,WAAW,KAAA;AAMxD,KAAI,EAJF,gBAAgB,KAAA,KAChB,iBAAiB,KAAA,KACjB,UAAU,KAAA,MAEM,SAAS,KAAA,KAAa,CAAC,QAAS,QAAO;AAEzD,QACE,qBAAC,OAAD;EACE,WAAW,GACT,6EACA,UACD;EACD,GAAI;YALN;GAOE,oBAAC,eAAD,EAAe,WAAU,mBAAoB,CAAA;GAE5C,gBAAgB,KAAA,KACf,qBAAC,QAAD,EAAA,UAAA,CACE,oBAAC,QAAD;IAAM,WAAU;cAAmB;IAAU,CAAA,EAC5C,aAAa,YAAY,CACrB,EAAA,CAAA;GAER,iBAAiB,KAAA,KAChB,qBAAC,QAAD,EAAA,UAAA,CACE,oBAAC,QAAD;IAAM,WAAU;cAAmB;IAAW,CAAA,EAC7C,aAAa,aAAa,CACtB,EAAA,CAAA;GAER,UAAU,KAAA,KACT,qBAAC,QAAD,EAAA,UAAA,CACE,oBAAC,QAAD;IAAM,WAAU;cAAmB;IAAa,CAAA,EAC/C,aAAa,MAAM,CACf,EAAA,CAAA;GAER,SAAS,KAAA,KACR,oBAAC,QAAD;IAAM,WAAU;cAAkB,WAAW,KAAK;IAAQ,CAAA;GAE3D,WACC,oBAAC,QAAD;IAAM,WAAU;cACb;IACI,CAAA;GAEL;;;AAIV,WAAW,cAAc"}
|
package/dist/catalog.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { C as resolveDynamicValue, S as getByPath, T as sfComponents, _ as defineCatalog, a as ValidationProvider, b as validateSpec, c as defineRegistry, d as useJsonRenderMessage, f as useUIStream, g as deepMergeSpec, h as buildUserPrompt, i as StateProvider, l as useBoundProp, m as autoFixSpec, n as JSONUIProvider, o as VisibilityProvider, p as schema, r as Renderer, s as createRenderer, t as ActionProvider, u as useChatUI, v as diffToPatches, w as setByPath, x as createStateStore, y as evaluateVisibility } from "./dist-
|
|
2
|
+
import { C as resolveDynamicValue, S as getByPath, T as sfComponents, _ as defineCatalog, a as ValidationProvider, b as validateSpec, c as defineRegistry, d as useJsonRenderMessage, f as useUIStream, g as deepMergeSpec, h as buildUserPrompt, i as StateProvider, l as useBoundProp, m as autoFixSpec, n as JSONUIProvider, o as VisibilityProvider, p as schema, r as Renderer, s as createRenderer, t as ActionProvider, u as useChatUI, v as diffToPatches, w as setByPath, x as createStateStore, y as evaluateVisibility } from "./dist-1-gcEL2L.js";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
//#region src/catalog/sf-components.ts
|
|
5
5
|
/**
|
|
6
|
-
* Curated
|
|
6
|
+
* Curated SignalFlare component definitions for json-render catalogs.
|
|
7
7
|
*
|
|
8
8
|
* These definitions expose an LLM-friendly API surface:
|
|
9
9
|
* - Simple string/enum/boolean props (no className, callbacks, refs)
|
|
@@ -11,7 +11,7 @@ import { z } from "zod";
|
|
|
11
11
|
* - Descriptions and examples that guide the LLM
|
|
12
12
|
*
|
|
13
13
|
* The renderers in `sf-registry.ts` bridge these LLM-friendly props
|
|
14
|
-
* to the actual
|
|
14
|
+
* to the actual SignalFlare component APIs.
|
|
15
15
|
*/
|
|
16
16
|
var sfComponentDefinitions = {
|
|
17
17
|
Stack: {
|
package/dist/catalog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.js","names":[],"sources":["../src/catalog/sf-components.ts"],"sourcesContent":["/**\n * Curated SF component definitions for json-render catalogs.\n *\n * These definitions expose an LLM-friendly API surface:\n * - Simple string/enum/boolean props (no className, callbacks, refs)\n * - `text` / `label` props for display text (mapped to `children` in renderers)\n * - Descriptions and examples that guide the LLM\n *\n * The renderers in `sf-registry.ts` bridge these LLM-friendly props\n * to the actual SF component APIs.\n */\n\nimport { z } from \"zod\";\n\nexport const sfComponentDefinitions: Record<\n string,\n {\n props: z.ZodTypeAny;\n slots?: string[];\n description: string;\n example?: Record<string, unknown>;\n }\n> = {\n // ── Layout ────────────────────────────────────────────────────────────\n\n Stack: {\n props: z.object({\n direction: z.enum([\"horizontal\", \"vertical\"]).optional(),\n gap: z.enum([\"sm\", \"base\", \"lg\"]).optional(),\n align: z.enum([\"start\", \"center\", \"end\", \"stretch\"]).optional(),\n wrap: z.boolean().optional(),\n }),\n slots: [\"default\"],\n description:\n \"Flex layout container. Use as the primary way to arrange child components vertically or horizontally with consistent spacing. Default: vertical, base gap.\",\n example: { direction: \"vertical\", gap: \"base\" },\n },\n\n Surface: {\n props: z.object({\n padding: z.enum([\"sm\", \"base\", \"lg\"]).optional(),\n border: z.boolean().optional(),\n }),\n slots: [\"default\"],\n description:\n \"Visual container with background, shadow, and ring. Use for cards, panels, and sections. For layout/spacing, use Stack instead.\",\n example: { padding: \"base\", border: true },\n },\n\n Grid: {\n props: z.object({\n variant: z\n .enum([\"2up\", \"side-by-side\", \"2-1\", \"1-2\", \"3up\", \"4up\", \"6up\"])\n .optional(),\n gap: z.enum([\"none\", \"sm\", \"base\", \"lg\"]).optional(),\n }),\n slots: [\"default\"],\n description:\n \"Responsive CSS grid layout. Place child components inside as grid items.\",\n example: { variant: \"3up\", gap: \"base\" },\n },\n\n LayerCard: {\n props: z.object({}),\n slots: [\"default\"],\n description:\n \"Elevated card container with border and shadow. Wrap content inside it.\",\n },\n\n // ── Typography ────────────────────────────────────────────────────────\n\n Text: {\n props: z.object({\n text: z.string(),\n variant: z\n .enum([\n \"heading1\",\n \"heading2\",\n \"heading3\",\n \"body\",\n \"secondary\",\n \"success\",\n \"error\",\n \"mono\",\n ])\n .optional(),\n size: z.enum([\"xs\", \"sm\", \"base\", \"lg\"]).optional(),\n bold: z.boolean().optional(),\n }),\n description:\n \"Text content — headings, body copy, labels. Use variant='heading1' for page titles, 'heading2' for sections, 'body' for paragraphs.\",\n example: { text: \"Dashboard Overview\", variant: \"heading1\" },\n },\n\n Code: {\n props: z.object({\n code: z.string(),\n lang: z.enum([\"ts\", \"tsx\", \"jsonc\", \"bash\", \"css\"]).optional(),\n }),\n description: \"Code display with syntax highlighting.\",\n example: { code: \"const x = 42;\", lang: \"ts\" },\n },\n\n // ── Actions ───────────────────────────────────────────────────────────\n\n Button: {\n props: z.object({\n label: z.string(),\n variant: z\n .enum([\"primary\", \"secondary\", \"ghost\", \"destructive\", \"outline\"])\n .optional(),\n size: z.enum([\"xs\", \"sm\", \"base\", \"lg\"]).optional(),\n disabled: z.boolean().optional(),\n loading: z.boolean().optional(),\n }),\n description: \"Clickable action button.\",\n example: { label: \"Save changes\", variant: \"primary\" },\n },\n\n Link: {\n props: z.object({\n text: z.string(),\n href: z.string(),\n variant: z.enum([\"inline\", \"plain\"]).optional(),\n }),\n description: \"Navigation link.\",\n example: { text: \"View details\", href: \"/details\" },\n },\n\n // ── Data Display ──────────────────────────────────────────────────────\n\n Badge: {\n props: z.object({\n text: z.string(),\n variant: z\n .enum([\"primary\", \"secondary\", \"destructive\", \"outline\", \"beta\"])\n .optional(),\n }),\n description: \"Small status label or tag.\",\n example: { text: \"Active\", variant: \"primary\" },\n },\n\n Banner: {\n props: z.object({\n variant: z.enum([\"default\", \"alert\", \"error\"]).optional(),\n title: z.string(),\n description: z.string().optional(),\n }),\n description: \"Full-width alert message for notices, warnings, or errors.\",\n example: {\n variant: \"alert\",\n title: \"Warning\",\n description: \"Your trial expires in 3 days.\",\n },\n },\n\n Meter: {\n props: z.object({\n label: z.string(),\n value: z.number(),\n max: z.number().optional(),\n showValue: z.boolean().optional(),\n }),\n description: \"Progress bar showing a value (defaults 0–100).\",\n example: { label: \"Storage used\", value: 72, max: 100 },\n },\n\n Empty: {\n props: z.object({\n title: z.string(),\n description: z.string().optional(),\n size: z.enum([\"sm\", \"base\", \"lg\"]).optional(),\n }),\n description: \"Placeholder for empty lists, tables, or sections.\",\n example: {\n title: \"No results\",\n description: \"Try adjusting your filters.\",\n },\n },\n\n Loader: {\n props: z.object({\n size: z.enum([\"sm\", \"base\", \"lg\"]).optional(),\n }),\n description: \"Animated loading spinner.\",\n },\n\n Table: {\n props: z.object({\n data: z.array(z.record(z.string(), z.unknown())),\n columns: z.array(z.object({ key: z.string(), label: z.string() })),\n }),\n description:\n \"Data table. Provide `data` (array of row objects) and `columns` (key + label pairs). The renderer builds header and body automatically.\",\n example: {\n columns: [\n { key: \"name\", label: \"Name\" },\n { key: \"email\", label: \"Email\" },\n ],\n data: [{ name: \"Alice\", email: \"alice@example.com\" }],\n },\n },\n\n // ── Charts ──────────────────────────────────────────────────────────\n\n BarChart: {\n props: z.object({\n title: z.string().optional(),\n data: z.array(z.record(z.string(), z.unknown())),\n xKey: z.string(),\n yKey: z.string(),\n aggregate: z.enum([\"sum\", \"count\", \"avg\"]).optional(),\n color: z.string().optional(),\n height: z.number().optional(),\n }),\n description:\n \"Bar chart visualization. Use { $state: \\\"/path\\\" } on data to bind to an array of objects. xKey is the category/group field, yKey is the numeric value field. Use aggregate='count' to count items grouped by xKey.\",\n example: {\n data: { $state: \"/sales\" } as any,\n xKey: \"month\",\n yKey: \"revenue\",\n },\n },\n\n LineChart: {\n props: z.object({\n title: z.string().optional(),\n data: z.array(z.record(z.string(), z.unknown())),\n xKey: z.string(),\n yKey: z.string(),\n aggregate: z.enum([\"sum\", \"count\", \"avg\"]).optional(),\n color: z.string().optional(),\n height: z.number().optional(),\n }),\n description:\n 'Line chart visualization. Use { $state: \"/path\" } on data to bind to an array of objects. xKey is the x-axis field, yKey is the numeric value field.',\n example: {\n data: { $state: \"/metrics\" } as any,\n xKey: \"date\",\n yKey: \"value\",\n },\n },\n\n PieChart: {\n props: z.object({\n title: z.string().optional(),\n data: z.array(z.record(z.string(), z.unknown())),\n nameKey: z.string(),\n valueKey: z.string(),\n height: z.number().optional(),\n }),\n description:\n 'Pie/donut chart. nameKey is the label field, valueKey is the numeric field. Use { $state: \"/path\" } on data.',\n example: {\n data: { $state: \"/categories\" } as any,\n nameKey: \"name\",\n valueKey: \"count\",\n },\n },\n\n Chart: {\n props: z.object({\n options: z.record(z.string(), z.unknown()),\n height: z.number().optional(),\n }),\n description:\n \"Low-level ECharts component for any chart type. Pass a full ECharts option object. Use for advanced charts not covered by BarChart/LineChart/PieChart. Data arrays in options can use { $state } references.\",\n example: {\n options: {\n xAxis: { type: \"category\", data: [\"Mon\", \"Tue\", \"Wed\"] },\n yAxis: { type: \"value\" },\n series: [{ type: \"bar\", data: [120, 200, 150] }],\n },\n height: 400,\n },\n },\n\n // ── Form Controls ─────────────────────────────────────────────────────\n\n Input: {\n props: z.object({\n label: z.string().optional(),\n placeholder: z.string().optional(),\n type: z.enum([\"text\", \"email\", \"password\", \"number\", \"url\"]).optional(),\n description: z.string().optional(),\n error: z.string().optional(),\n }),\n description: \"Text input field.\",\n example: { label: \"Email\", placeholder: \"you@example.com\", type: \"email\" },\n },\n\n InputArea: {\n props: z.object({\n label: z.string().optional(),\n placeholder: z.string().optional(),\n rows: z.number().optional(),\n description: z.string().optional(),\n error: z.string().optional(),\n }),\n description: \"Multi-line text area.\",\n example: { label: \"Message\", placeholder: \"Type your message...\", rows: 4 },\n },\n\n Select: {\n props: z.object({\n label: z.string().optional(),\n placeholder: z.string().optional(),\n options: z.array(z.object({ value: z.string(), label: z.string() })),\n }),\n description:\n \"Dropdown select. Provide options as an array of {value, label}.\",\n example: {\n label: \"Country\",\n placeholder: \"Select...\",\n options: [\n { value: \"us\", label: \"United States\" },\n { value: \"uk\", label: \"United Kingdom\" },\n ],\n },\n },\n\n Checkbox: {\n props: z.object({\n label: z.string(),\n }),\n description: \"Boolean checkbox input with a label.\",\n example: { label: \"I agree to the terms\" },\n },\n\n Switch: {\n props: z.object({\n label: z.string(),\n }),\n description: \"Toggle switch with a label.\",\n example: { label: \"Enable notifications\" },\n },\n\n Radio: {\n props: z.object({\n legend: z.string(),\n options: z.array(z.object({ value: z.string(), label: z.string() })),\n }),\n description:\n \"Radio button group. Provide legend and options as {value, label} pairs.\",\n example: {\n legend: \"Plan\",\n options: [\n { value: \"free\", label: \"Free\" },\n { value: \"pro\", label: \"Pro\" },\n ],\n },\n },\n\n Field: {\n props: z.object({\n label: z.string().optional(),\n description: z.string().optional(),\n error: z.string().optional(),\n }),\n slots: [\"default\"],\n description:\n \"Form field wrapper that adds a label, description, and error message around an input.\",\n example: { label: \"Username\", description: \"Must be unique.\" },\n },\n\n // ── Overlays & Disclosure ─────────────────────────────────────────────\n\n Tabs: {\n props: z.object({\n tabs: z.array(z.object({ value: z.string(), label: z.string() })),\n defaultValue: z.string().optional(),\n variant: z.enum([\"segmented\", \"underline\"]).optional(),\n }),\n slots: [\"default\"],\n description:\n \"Tabbed navigation. Provide tab definitions; place tab content as children.\",\n example: {\n tabs: [\n { value: \"general\", label: \"General\" },\n { value: \"advanced\", label: \"Advanced\" },\n ],\n defaultValue: \"general\",\n },\n },\n\n Dialog: {\n props: z.object({\n trigger: z.string(),\n title: z.string().optional(),\n description: z.string().optional(),\n }),\n slots: [\"default\"],\n description:\n \"Modal dialog. The `trigger` text creates a button that opens the dialog.\",\n example: {\n trigger: \"Delete\",\n title: \"Confirm deletion\",\n description: \"This action cannot be undone.\",\n },\n },\n\n Collapsible: {\n props: z.object({\n label: z.string(),\n }),\n slots: [\"default\"],\n description:\n \"Expandable/collapsible section. The label is the toggle trigger.\",\n example: { label: \"Advanced options\" },\n },\n\n Tooltip: {\n props: z.object({\n content: z.string(),\n }),\n slots: [\"default\"],\n description: \"Hover tooltip. Wrap the target element as a child.\",\n },\n\n Popover: {\n props: z.object({\n trigger: z.string(),\n }),\n slots: [\"default\"],\n description:\n \"Popover panel. The `trigger` text creates a button that toggles the popover.\",\n example: { trigger: \"More info\" },\n },\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"catalog.js","names":[],"sources":["../src/catalog/sf-components.ts"],"sourcesContent":["/**\n * Curated SignalFlare component definitions for json-render catalogs.\n *\n * These definitions expose an LLM-friendly API surface:\n * - Simple string/enum/boolean props (no className, callbacks, refs)\n * - `text` / `label` props for display text (mapped to `children` in renderers)\n * - Descriptions and examples that guide the LLM\n *\n * The renderers in `sf-registry.ts` bridge these LLM-friendly props\n * to the actual SignalFlare component APIs.\n */\n\nimport { z } from \"zod\";\n\nexport const sfComponentDefinitions: Record<\n string,\n {\n props: z.ZodTypeAny;\n slots?: string[];\n description: string;\n example?: Record<string, unknown>;\n }\n> = {\n // ── Layout ────────────────────────────────────────────────────────────\n\n Stack: {\n props: z.object({\n direction: z.enum([\"horizontal\", \"vertical\"]).optional(),\n gap: z.enum([\"sm\", \"base\", \"lg\"]).optional(),\n align: z.enum([\"start\", \"center\", \"end\", \"stretch\"]).optional(),\n wrap: z.boolean().optional(),\n }),\n slots: [\"default\"],\n description:\n \"Flex layout container. Use as the primary way to arrange child components vertically or horizontally with consistent spacing. Default: vertical, base gap.\",\n example: { direction: \"vertical\", gap: \"base\" },\n },\n\n Surface: {\n props: z.object({\n padding: z.enum([\"sm\", \"base\", \"lg\"]).optional(),\n border: z.boolean().optional(),\n }),\n slots: [\"default\"],\n description:\n \"Visual container with background, shadow, and ring. Use for cards, panels, and sections. For layout/spacing, use Stack instead.\",\n example: { padding: \"base\", border: true },\n },\n\n Grid: {\n props: z.object({\n variant: z\n .enum([\"2up\", \"side-by-side\", \"2-1\", \"1-2\", \"3up\", \"4up\", \"6up\"])\n .optional(),\n gap: z.enum([\"none\", \"sm\", \"base\", \"lg\"]).optional(),\n }),\n slots: [\"default\"],\n description:\n \"Responsive CSS grid layout. Place child components inside as grid items.\",\n example: { variant: \"3up\", gap: \"base\" },\n },\n\n LayerCard: {\n props: z.object({}),\n slots: [\"default\"],\n description:\n \"Elevated card container with border and shadow. Wrap content inside it.\",\n },\n\n // ── Typography ────────────────────────────────────────────────────────\n\n Text: {\n props: z.object({\n text: z.string(),\n variant: z\n .enum([\n \"heading1\",\n \"heading2\",\n \"heading3\",\n \"body\",\n \"secondary\",\n \"success\",\n \"error\",\n \"mono\",\n ])\n .optional(),\n size: z.enum([\"xs\", \"sm\", \"base\", \"lg\"]).optional(),\n bold: z.boolean().optional(),\n }),\n description:\n \"Text content — headings, body copy, labels. Use variant='heading1' for page titles, 'heading2' for sections, 'body' for paragraphs.\",\n example: { text: \"Dashboard Overview\", variant: \"heading1\" },\n },\n\n Code: {\n props: z.object({\n code: z.string(),\n lang: z.enum([\"ts\", \"tsx\", \"jsonc\", \"bash\", \"css\"]).optional(),\n }),\n description: \"Code display with syntax highlighting.\",\n example: { code: \"const x = 42;\", lang: \"ts\" },\n },\n\n // ── Actions ───────────────────────────────────────────────────────────\n\n Button: {\n props: z.object({\n label: z.string(),\n variant: z\n .enum([\"primary\", \"secondary\", \"ghost\", \"destructive\", \"outline\"])\n .optional(),\n size: z.enum([\"xs\", \"sm\", \"base\", \"lg\"]).optional(),\n disabled: z.boolean().optional(),\n loading: z.boolean().optional(),\n }),\n description: \"Clickable action button.\",\n example: { label: \"Save changes\", variant: \"primary\" },\n },\n\n Link: {\n props: z.object({\n text: z.string(),\n href: z.string(),\n variant: z.enum([\"inline\", \"plain\"]).optional(),\n }),\n description: \"Navigation link.\",\n example: { text: \"View details\", href: \"/details\" },\n },\n\n // ── Data Display ──────────────────────────────────────────────────────\n\n Badge: {\n props: z.object({\n text: z.string(),\n variant: z\n .enum([\"primary\", \"secondary\", \"destructive\", \"outline\", \"beta\"])\n .optional(),\n }),\n description: \"Small status label or tag.\",\n example: { text: \"Active\", variant: \"primary\" },\n },\n\n Banner: {\n props: z.object({\n variant: z.enum([\"default\", \"alert\", \"error\"]).optional(),\n title: z.string(),\n description: z.string().optional(),\n }),\n description: \"Full-width alert message for notices, warnings, or errors.\",\n example: {\n variant: \"alert\",\n title: \"Warning\",\n description: \"Your trial expires in 3 days.\",\n },\n },\n\n Meter: {\n props: z.object({\n label: z.string(),\n value: z.number(),\n max: z.number().optional(),\n showValue: z.boolean().optional(),\n }),\n description: \"Progress bar showing a value (defaults 0–100).\",\n example: { label: \"Storage used\", value: 72, max: 100 },\n },\n\n Empty: {\n props: z.object({\n title: z.string(),\n description: z.string().optional(),\n size: z.enum([\"sm\", \"base\", \"lg\"]).optional(),\n }),\n description: \"Placeholder for empty lists, tables, or sections.\",\n example: {\n title: \"No results\",\n description: \"Try adjusting your filters.\",\n },\n },\n\n Loader: {\n props: z.object({\n size: z.enum([\"sm\", \"base\", \"lg\"]).optional(),\n }),\n description: \"Animated loading spinner.\",\n },\n\n Table: {\n props: z.object({\n data: z.array(z.record(z.string(), z.unknown())),\n columns: z.array(z.object({ key: z.string(), label: z.string() })),\n }),\n description:\n \"Data table. Provide `data` (array of row objects) and `columns` (key + label pairs). The renderer builds header and body automatically.\",\n example: {\n columns: [\n { key: \"name\", label: \"Name\" },\n { key: \"email\", label: \"Email\" },\n ],\n data: [{ name: \"Alice\", email: \"alice@example.com\" }],\n },\n },\n\n // ── Charts ──────────────────────────────────────────────────────────\n\n BarChart: {\n props: z.object({\n title: z.string().optional(),\n data: z.array(z.record(z.string(), z.unknown())),\n xKey: z.string(),\n yKey: z.string(),\n aggregate: z.enum([\"sum\", \"count\", \"avg\"]).optional(),\n color: z.string().optional(),\n height: z.number().optional(),\n }),\n description:\n \"Bar chart visualization. Use { $state: \\\"/path\\\" } on data to bind to an array of objects. xKey is the category/group field, yKey is the numeric value field. Use aggregate='count' to count items grouped by xKey.\",\n example: {\n data: { $state: \"/sales\" } as any,\n xKey: \"month\",\n yKey: \"revenue\",\n },\n },\n\n LineChart: {\n props: z.object({\n title: z.string().optional(),\n data: z.array(z.record(z.string(), z.unknown())),\n xKey: z.string(),\n yKey: z.string(),\n aggregate: z.enum([\"sum\", \"count\", \"avg\"]).optional(),\n color: z.string().optional(),\n height: z.number().optional(),\n }),\n description:\n 'Line chart visualization. Use { $state: \"/path\" } on data to bind to an array of objects. xKey is the x-axis field, yKey is the numeric value field.',\n example: {\n data: { $state: \"/metrics\" } as any,\n xKey: \"date\",\n yKey: \"value\",\n },\n },\n\n PieChart: {\n props: z.object({\n title: z.string().optional(),\n data: z.array(z.record(z.string(), z.unknown())),\n nameKey: z.string(),\n valueKey: z.string(),\n height: z.number().optional(),\n }),\n description:\n 'Pie/donut chart. nameKey is the label field, valueKey is the numeric field. Use { $state: \"/path\" } on data.',\n example: {\n data: { $state: \"/categories\" } as any,\n nameKey: \"name\",\n valueKey: \"count\",\n },\n },\n\n Chart: {\n props: z.object({\n options: z.record(z.string(), z.unknown()),\n height: z.number().optional(),\n }),\n description:\n \"Low-level ECharts component for any chart type. Pass a full ECharts option object. Use for advanced charts not covered by BarChart/LineChart/PieChart. Data arrays in options can use { $state } references.\",\n example: {\n options: {\n xAxis: { type: \"category\", data: [\"Mon\", \"Tue\", \"Wed\"] },\n yAxis: { type: \"value\" },\n series: [{ type: \"bar\", data: [120, 200, 150] }],\n },\n height: 400,\n },\n },\n\n // ── Form Controls ─────────────────────────────────────────────────────\n\n Input: {\n props: z.object({\n label: z.string().optional(),\n placeholder: z.string().optional(),\n type: z.enum([\"text\", \"email\", \"password\", \"number\", \"url\"]).optional(),\n description: z.string().optional(),\n error: z.string().optional(),\n }),\n description: \"Text input field.\",\n example: { label: \"Email\", placeholder: \"you@example.com\", type: \"email\" },\n },\n\n InputArea: {\n props: z.object({\n label: z.string().optional(),\n placeholder: z.string().optional(),\n rows: z.number().optional(),\n description: z.string().optional(),\n error: z.string().optional(),\n }),\n description: \"Multi-line text area.\",\n example: { label: \"Message\", placeholder: \"Type your message...\", rows: 4 },\n },\n\n Select: {\n props: z.object({\n label: z.string().optional(),\n placeholder: z.string().optional(),\n options: z.array(z.object({ value: z.string(), label: z.string() })),\n }),\n description:\n \"Dropdown select. Provide options as an array of {value, label}.\",\n example: {\n label: \"Country\",\n placeholder: \"Select...\",\n options: [\n { value: \"us\", label: \"United States\" },\n { value: \"uk\", label: \"United Kingdom\" },\n ],\n },\n },\n\n Checkbox: {\n props: z.object({\n label: z.string(),\n }),\n description: \"Boolean checkbox input with a label.\",\n example: { label: \"I agree to the terms\" },\n },\n\n Switch: {\n props: z.object({\n label: z.string(),\n }),\n description: \"Toggle switch with a label.\",\n example: { label: \"Enable notifications\" },\n },\n\n Radio: {\n props: z.object({\n legend: z.string(),\n options: z.array(z.object({ value: z.string(), label: z.string() })),\n }),\n description:\n \"Radio button group. Provide legend and options as {value, label} pairs.\",\n example: {\n legend: \"Plan\",\n options: [\n { value: \"free\", label: \"Free\" },\n { value: \"pro\", label: \"Pro\" },\n ],\n },\n },\n\n Field: {\n props: z.object({\n label: z.string().optional(),\n description: z.string().optional(),\n error: z.string().optional(),\n }),\n slots: [\"default\"],\n description:\n \"Form field wrapper that adds a label, description, and error message around an input.\",\n example: { label: \"Username\", description: \"Must be unique.\" },\n },\n\n // ── Overlays & Disclosure ─────────────────────────────────────────────\n\n Tabs: {\n props: z.object({\n tabs: z.array(z.object({ value: z.string(), label: z.string() })),\n defaultValue: z.string().optional(),\n variant: z.enum([\"segmented\", \"underline\"]).optional(),\n }),\n slots: [\"default\"],\n description:\n \"Tabbed navigation. Provide tab definitions; place tab content as children.\",\n example: {\n tabs: [\n { value: \"general\", label: \"General\" },\n { value: \"advanced\", label: \"Advanced\" },\n ],\n defaultValue: \"general\",\n },\n },\n\n Dialog: {\n props: z.object({\n trigger: z.string(),\n title: z.string().optional(),\n description: z.string().optional(),\n }),\n slots: [\"default\"],\n description:\n \"Modal dialog. The `trigger` text creates a button that opens the dialog.\",\n example: {\n trigger: \"Delete\",\n title: \"Confirm deletion\",\n description: \"This action cannot be undone.\",\n },\n },\n\n Collapsible: {\n props: z.object({\n label: z.string(),\n }),\n slots: [\"default\"],\n description:\n \"Expandable/collapsible section. The label is the toggle trigger.\",\n example: { label: \"Advanced options\" },\n },\n\n Tooltip: {\n props: z.object({\n content: z.string(),\n }),\n slots: [\"default\"],\n description: \"Hover tooltip. Wrap the target element as a child.\",\n },\n\n Popover: {\n props: z.object({\n trigger: z.string(),\n }),\n slots: [\"default\"],\n description:\n \"Popover panel. The `trigger` text creates a button that toggles the popover.\",\n example: { trigger: \"More info\" },\n },\n};\n"],"mappings":"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"}
|