@signalflare-ai/ui 1.0.0 → 1.2.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 +37 -4
- package/README.md +1 -1
- package/ai/component-registry.json +1047 -183
- package/ai/component-registry.md +4241 -50
- package/ai/schemas.ts +99 -502
- package/dist/.build-complete +1 -1
- package/dist/ai/schemas.d.ts +76 -58
- package/dist/ai/schemas.d.ts.map +1 -1
- package/dist/{ai-actions-DSVeQn4e.js → ai-actions-BdUZI3Gk.js} +3 -3
- package/dist/{ai-actions-DSVeQn4e.js.map → ai-actions-BdUZI3Gk.js.map} +1 -1
- package/dist/{ai-agent-card-BXHwhWAU.js → ai-agent-card-BR2NIYhi.js} +1 -1
- package/dist/{ai-agent-card-BXHwhWAU.js.map → ai-agent-card-BR2NIYhi.js.map} +1 -1
- package/dist/{ai-approval-aa0qvjFN.js → ai-approval-Ba7mrKba.js} +2 -2
- package/dist/{ai-approval-aa0qvjFN.js.map → ai-approval-Ba7mrKba.js.map} +1 -1
- package/dist/{ai-code-block-BgtIxtZZ.js → ai-code-block-CZtoL73R.js} +3 -3
- package/dist/{ai-code-block-BgtIxtZZ.js.map → ai-code-block-CZtoL73R.js.map} +1 -1
- package/dist/ai-conversation-Cc7WlaBg.js +242 -0
- package/dist/ai-conversation-Cc7WlaBg.js.map +1 -0
- package/dist/{ai-info-banner-uFxHHwBA.js → ai-info-banner-C7EWPBj7.js} +7 -3
- package/dist/ai-info-banner-C7EWPBj7.js.map +1 -0
- package/dist/{ai-message-BjnFznXy.js → ai-message-Bp7L68U_.js} +27 -8
- package/dist/ai-message-Bp7L68U_.js.map +1 -0
- package/dist/{ai-mission-header-08__gULL.js → ai-mission-header-TiCJfTNt.js} +1 -1
- package/dist/{ai-mission-header-08__gULL.js.map → ai-mission-header-TiCJfTNt.js.map} +1 -1
- package/dist/{ai-part-group-DBtgTgAn.js → ai-part-group-DNb9I446.js} +3 -3
- package/dist/{ai-part-group-DBtgTgAn.js.map → ai-part-group-DNb9I446.js.map} +1 -1
- package/dist/{ai-prompt-input-Dy1LfxPk.js → ai-prompt-input-BVvov_KF.js} +467 -25
- package/dist/ai-prompt-input-BVvov_KF.js.map +1 -0
- package/dist/{ai-question-CHHoDJMg.js → ai-question-GPPMk7YM.js} +2 -2
- package/dist/{ai-question-CHHoDJMg.js.map → ai-question-GPPMk7YM.js.map} +1 -1
- package/dist/{ai-reasoning-CnL6ZSr5.js → ai-reasoning-_feFjk56.js} +2 -2
- package/dist/{ai-reasoning-CnL6ZSr5.js.map → ai-reasoning-_feFjk56.js.map} +1 -1
- package/dist/{ai-response-BEUg3xvd.js → ai-response-CvjV3WhV.js} +8 -3
- package/dist/ai-response-CvjV3WhV.js.map +1 -0
- package/dist/{ai-shimmer-By5_L05p.js → ai-shimmer-j6lKIrjj.js} +1 -1
- package/dist/{ai-shimmer-By5_L05p.js.map → ai-shimmer-j6lKIrjj.js.map} +1 -1
- package/dist/{ai-status-badge-BGYGWYF6.js → ai-status-badge-CSU_QOdz.js} +1 -1
- package/dist/{ai-status-badge-BGYGWYF6.js.map → ai-status-badge-CSU_QOdz.js.map} +1 -1
- package/dist/{ai-streaming-text-CMfoThV0.js → ai-streaming-text-IWW1BhvZ.js} +44 -16
- package/dist/ai-streaming-text-IWW1BhvZ.js.map +1 -0
- package/dist/{ai-subagent-DcPRqkAA.js → ai-subagent-JA4iIMW3.js} +13 -5
- package/dist/ai-subagent-JA4iIMW3.js.map +1 -0
- package/dist/{ai-suggestion-MgeCg5Ar.js → ai-suggestion-BdO6MBuH.js} +2 -2
- package/dist/{ai-suggestion-MgeCg5Ar.js.map → ai-suggestion-BdO6MBuH.js.map} +1 -1
- package/dist/{ai-task-list-Da9zIm00.js → ai-task-list-DYw4R1FA.js} +12 -5
- package/dist/ai-task-list-DYw4R1FA.js.map +1 -0
- package/dist/{ai-timeline-Cwu045IR.js → ai-timeline-C42tOUT8.js} +1 -1
- package/dist/{ai-timeline-Cwu045IR.js.map → ai-timeline-C42tOUT8.js.map} +1 -1
- package/dist/{ai-tool-Cn1O4xjP.js → ai-tool-03jOTwUI.js} +23 -10
- package/dist/ai-tool-03jOTwUI.js.map +1 -0
- package/dist/{ai-usage-bar-DjS12DMp.js → ai-usage-bar-BRf5LC_b.js} +1 -1
- package/dist/{ai-usage-bar-DjS12DMp.js.map → ai-usage-bar-BRf5LC_b.js.map} +1 -1
- package/dist/{badge-D_eaA6wv.js → badge-BheXjMc8.js} +2 -2
- package/dist/{badge-D_eaA6wv.js.map → badge-BheXjMc8.js.map} +1 -1
- package/dist/{banner-B_6oBrsu.js → banner-CcsjunJg.js} +7 -2
- package/dist/banner-CcsjunJg.js.map +1 -0
- package/dist/{breadcrumbs-BlmeYfgq.js → breadcrumbs-CouSyy3H.js} +3 -3
- package/dist/{breadcrumbs-BlmeYfgq.js.map → breadcrumbs-CouSyy3H.js.map} +1 -1
- package/dist/{button-De0267YU.js → button-CO6-qPax.js} +1 -1
- package/dist/{button-De0267YU.js.map → button-CO6-qPax.js.map} +1 -1
- package/dist/catalog.js +1 -1
- package/dist/{chart-BK3sVPnD.js → chart-Dg0qUeSc.js} +2 -2
- package/dist/{chart-BK3sVPnD.js.map → chart-Dg0qUeSc.js.map} +1 -1
- package/dist/{checkbox-DYhUmZNw.js → checkbox-D7p4QKsC.js} +2 -2
- package/dist/{checkbox-DYhUmZNw.js.map → checkbox-D7p4QKsC.js.map} +1 -1
- package/dist/{clipboard-text-ssybngLw.js → clipboard-text-kLaMogs3.js} +3 -3
- package/dist/{clipboard-text-ssybngLw.js.map → clipboard-text-kLaMogs3.js.map} +1 -1
- package/dist/{code-Cx-QSoOT.js → code-BN8InC0G.js} +2 -2
- package/dist/{code-Cx-QSoOT.js.map → code-BN8InC0G.js.map} +1 -1
- package/dist/{collapsible-DWsXeXmS.js → collapsible-D_ueZ0jz.js} +1 -1
- package/dist/{collapsible-DWsXeXmS.js.map → collapsible-D_ueZ0jz.js.map} +1 -1
- package/dist/{combobox-C0iW6a0r.js → combobox-B7TOK0U2.js} +3 -3
- package/dist/{combobox-C0iW6a0r.js.map → combobox-B7TOK0U2.js.map} +1 -1
- package/dist/{command-palette-DGzioeki.js → command-palette-CuNUyJca.js} +2 -2
- package/dist/{command-palette-DGzioeki.js.map → command-palette-CuNUyJca.js.map} +1 -1
- 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 +2 -2
- 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 +1 -1
- 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 +2 -2
- 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/badge.js +1 -1
- package/dist/components/banner.js +1 -1
- package/dist/components/breadcrumbs.js +1 -1
- package/dist/components/button.js +1 -1
- package/dist/components/chart.js +2 -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/collapsible.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/date-range-picker.js +1 -1
- package/dist/components/dialog.js +1 -1
- package/dist/components/dropdown.js +1 -1
- package/dist/components/empty.js +1 -1
- package/dist/components/field.js +1 -1
- package/dist/components/filters.js +1 -1
- package/dist/components/flow.js +1 -1
- package/dist/components/grid.js +1 -1
- package/dist/components/input.js +2 -2
- package/dist/components/label.js +1 -1
- package/dist/components/layer-card.js +1 -1
- package/dist/components/loader.js +1 -1
- package/dist/components/menubar.js +1 -1
- package/dist/components/meter.js +1 -1
- package/dist/components/pagination.js +1 -1
- package/dist/components/popover.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/signalflare-ai-logo.js +1 -1
- package/dist/components/sparkline.js +1 -1
- package/dist/components/stat-card.js +1 -1
- package/dist/components/surface.js +1 -1
- package/dist/components/switch.js +1 -1
- package/dist/components/table.js +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/text-roll.js +1 -1
- package/dist/components/text.js +1 -1
- package/dist/components/theme-toggle.js +1 -1
- package/dist/components/toast.js +1 -1
- package/dist/components/tooltip.js +1 -1
- package/dist/components/use-agent-harness.js +1 -1
- package/dist/{data-grid-CG76N_hK.js → data-grid-DGHmU0w3.js} +8 -8
- package/dist/{data-grid-CG76N_hK.js.map → data-grid-DGHmU0w3.js.map} +1 -1
- package/dist/{date-picker-Dqg9L4xu.js → date-picker--ox89RBy.js} +1 -1
- package/dist/{date-picker-Dqg9L4xu.js.map → date-picker--ox89RBy.js.map} +1 -1
- package/dist/{date-range-picker-D75LLINc.js → date-range-picker-DVa7QBqE.js} +1 -1
- package/dist/{date-range-picker-D75LLINc.js.map → date-range-picker-DVa7QBqE.js.map} +1 -1
- package/dist/{dialog-CyHEQXEY.js → dialog-Bv1oSFOd.js} +2 -2
- package/dist/{dialog-CyHEQXEY.js.map → dialog-Bv1oSFOd.js.map} +1 -1
- package/dist/{dist-1-gcEL2L.js → dist-B6iWiWwp.js} +25 -25
- package/dist/{dist-1-gcEL2L.js.map → dist-B6iWiWwp.js.map} +1 -1
- package/dist/{dropdown-qnEYRFXZ.js → dropdown-B_nrGXjV.js} +2 -2
- package/dist/{dropdown-qnEYRFXZ.js.map → dropdown-B_nrGXjV.js.map} +1 -1
- package/dist/{echart-DURZEyai.js → echart-CdOUaT-r.js} +1 -1
- package/dist/{echart-DURZEyai.js.map → echart-CdOUaT-r.js.map} +1 -1
- package/dist/{empty-D2TypIId.js → empty-DZnN0zKX.js} +11 -6
- package/dist/empty-DZnN0zKX.js.map +1 -0
- package/dist/{field-Y_UK1_Cg.js → field-B_yVof52.js} +2 -2
- package/dist/{field-Y_UK1_Cg.js.map → field-B_yVof52.js.map} +1 -1
- package/dist/{filters-Bw_U6ZTx.js → filters-cpJCY21R.js} +7 -7
- package/dist/{filters-Bw_U6ZTx.js.map → filters-cpJCY21R.js.map} +1 -1
- package/dist/{flow-BRsYUCJa.js → flow-B4v198ot.js} +1 -1
- package/dist/{flow-BRsYUCJa.js.map → flow-B4v198ot.js.map} +1 -1
- package/dist/genui.js +1 -1
- package/dist/{grid-qUAN9hFx.js → grid-CEd64Lnh.js} +1 -1
- package/dist/{grid-qUAN9hFx.js.map → grid-CEd64Lnh.js.map} +1 -1
- package/dist/{highlight-to-react-ClEfL81q.js → highlight-to-react-D0Yav4jk.js} +1 -1
- package/dist/{highlight-to-react-ClEfL81q.js.map → highlight-to-react-D0Yav4jk.js.map} +1 -1
- package/dist/index.js +69 -69
- package/dist/{input-DXYUjGgD.js → input-B2bbijRh.js} +2 -2
- package/dist/{input-DXYUjGgD.js.map → input-B2bbijRh.js.map} +1 -1
- package/dist/{input-DddtBN-g.js → input-ClB_E4Lb.js} +4 -4
- package/dist/{input-DddtBN-g.js.map → input-ClB_E4Lb.js.map} +1 -1
- package/dist/{label-QtJxtJ4u.js → label-DUv_urO1.js} +2 -2
- package/dist/{label-QtJxtJ4u.js.map → label-DUv_urO1.js.map} +1 -1
- package/dist/{layer-card-BME0eljh.js → layer-card-BK7eYfwn.js} +1 -1
- package/dist/{layer-card-BME0eljh.js.map → layer-card-BK7eYfwn.js.map} +1 -1
- package/dist/layout-DJHMMap2.js +6103 -0
- package/dist/layout-DJHMMap2.js.map +1 -0
- package/dist/measured-text-BI3dTJmH.js +290 -0
- package/dist/measured-text-BI3dTJmH.js.map +1 -0
- package/dist/{menubar-C8NzAjfd.js → menubar-Cxf3xeAt.js} +2 -2
- package/dist/{menubar-C8NzAjfd.js.map → menubar-Cxf3xeAt.js.map} +1 -1
- package/dist/{meter-CpmTenEr.js → meter-BFFe9l5b.js} +1 -1
- package/dist/{meter-CpmTenEr.js.map → meter-BFFe9l5b.js.map} +1 -1
- package/dist/{pagination-BVqdlONY.js → pagination-yS372Tr4.js} +2 -2
- package/dist/{pagination-BVqdlONY.js.map → pagination-yS372Tr4.js.map} +1 -1
- package/dist/{popover-BRQZ2b6z.js → popover-SRoJaCZr.js} +1 -1
- package/dist/{popover-BRQZ2b6z.js.map → popover-SRoJaCZr.js.map} +1 -1
- package/dist/{radio-BNSwOt3B.js → radio-BcwhwYNB.js} +1 -1
- package/dist/{radio-BNSwOt3B.js.map → radio-BcwhwYNB.js.map} +1 -1
- package/dist/{select-1w2aebGQ.js → select-DMhdoHMa.js} +4 -4
- package/dist/{select-1w2aebGQ.js.map → select-DMhdoHMa.js.map} +1 -1
- package/dist/{sensitive-input-82Cez3vj.js → sensitive-input-CJUpIRal.js} +3 -3
- package/dist/{sensitive-input-82Cez3vj.js.map → sensitive-input-CJUpIRal.js.map} +1 -1
- package/dist/{sidebar-CAsCmSpM.js → sidebar-D4zrlYpn.js} +2 -2
- package/dist/{sidebar-CAsCmSpM.js.map → sidebar-D4zrlYpn.js.map} +1 -1
- package/dist/{signalflare-ai-logo-DDhxMJD6.js → signalflare-ai-logo-Bipogceq.js} +1 -1
- package/dist/{signalflare-ai-logo-DDhxMJD6.js.map → signalflare-ai-logo-Bipogceq.js.map} +1 -1
- package/dist/{skeleton-line-Do3UmGk9.js → skeleton-line-CH1-h6e2.js} +1 -1
- package/dist/{skeleton-line-Do3UmGk9.js.map → skeleton-line-CH1-h6e2.js.map} +1 -1
- package/dist/{sparkline-DdbeM4Ai.js → sparkline-DHmgj1d0.js} +2 -2
- package/dist/{sparkline-DdbeM4Ai.js.map → sparkline-DHmgj1d0.js.map} +1 -1
- package/dist/src/blocks/agent-harness/agent-harness.d.ts.map +1 -1
- package/dist/src/blocks/agent-harness/agent-harness.tsx +29 -5
- package/dist/src/components/ai-conversation/ai-conversation.d.ts +69 -37
- package/dist/src/components/ai-conversation/ai-conversation.d.ts.map +1 -1
- package/dist/src/components/ai-conversation/index.d.ts +2 -1
- package/dist/src/components/ai-conversation/index.d.ts.map +1 -1
- package/dist/src/components/ai-conversation/measurement-constants.d.ts +30 -0
- package/dist/src/components/ai-conversation/measurement-constants.d.ts.map +1 -0
- package/dist/src/components/ai-info-banner/ai-info-banner.d.ts.map +1 -1
- package/dist/src/components/ai-message/ai-message.d.ts +3 -0
- package/dist/src/components/ai-message/ai-message.d.ts.map +1 -1
- package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts +58 -4
- 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 +10 -2
- package/dist/src/components/ai-prompt-input/controller.d.ts.map +1 -1
- package/dist/src/components/ai-prompt-input/index.d.ts +2 -2
- package/dist/src/components/ai-prompt-input/index.d.ts.map +1 -1
- package/dist/src/components/ai-prompt-input/types.d.ts +16 -0
- package/dist/src/components/ai-prompt-input/types.d.ts.map +1 -1
- package/dist/src/components/ai-response/ai-response.d.ts +12 -1
- package/dist/src/components/ai-response/ai-response.d.ts.map +1 -1
- 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 -1
- package/dist/src/components/ai-streaming-text/index.d.ts +1 -1
- package/dist/src/components/ai-streaming-text/index.d.ts.map +1 -1
- package/dist/src/components/ai-subagent/ai-subagent.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.map +1 -1
- package/dist/src/components/banner/banner.d.ts.map +1 -1
- package/dist/src/components/empty/empty.d.ts.map +1 -1
- package/dist/src/components/stat-card/stat-card.d.ts +5 -0
- package/dist/src/components/stat-card/stat-card.d.ts.map +1 -1
- package/dist/src/components/text/text.d.ts +35 -1
- package/dist/src/components/text/text.d.ts.map +1 -1
- package/dist/src/components/tooltip/tooltip.d.ts.map +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/utils/index.d.ts +2 -0
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/measured-text.d.ts +40 -0
- package/dist/src/utils/measured-text.d.ts.map +1 -0
- package/dist/src/utils/use-measured-text.d.ts +59 -0
- package/dist/src/utils/use-measured-text.d.ts.map +1 -0
- package/dist/{stat-card-CEZscNh8.js → stat-card-Ew-ofzEm.js} +28 -10
- package/dist/stat-card-Ew-ofzEm.js.map +1 -0
- package/dist/styles/sf-binding.css +9 -1
- package/dist/styles/sf-standalone.css +2 -2
- package/dist/styles/shadcn.css +1 -1
- package/dist/styles/theme-fedramp.css +12 -3
- package/dist/styles/theme-minimal.css +104 -26
- package/dist/styles/theme-sf.css +138 -39
- package/dist/styles/theme-vesper.css +91 -0
- package/dist/{surface-BduI7Ehl.js → surface-DGwRlC0o.js} +1 -1
- package/dist/{surface-BduI7Ehl.js.map → surface-DGwRlC0o.js.map} +1 -1
- package/dist/{switch-CzZBRBL7.js → switch-BxAMfHdt.js} +2 -2
- package/dist/{switch-CzZBRBL7.js.map → switch-BxAMfHdt.js.map} +1 -1
- package/dist/{table-Rv4JMy0B.js → table-BBeAtYVZ.js} +2 -2
- package/dist/{table-Rv4JMy0B.js.map → table-BBeAtYVZ.js.map} +1 -1
- package/dist/{tabs-1cHrYoel.js → tabs-CeHu7Scn.js} +1 -1
- package/dist/{tabs-1cHrYoel.js.map → tabs-CeHu7Scn.js.map} +1 -1
- package/dist/{text-KJmGkwnf.js → text-Cqryz7rk.js} +27 -5
- package/dist/text-Cqryz7rk.js.map +1 -0
- package/dist/{text-roll-BZ3I1umc.js → text-roll-Ch52hcQj.js} +1 -1
- package/dist/{text-roll-BZ3I1umc.js.map → text-roll-Ch52hcQj.js.map} +1 -1
- package/dist/{theme-toggle-Bhu681D7.js → theme-toggle-LDfIKEqx.js} +3 -3
- package/dist/{theme-toggle-Bhu681D7.js.map → theme-toggle-LDfIKEqx.js.map} +1 -1
- package/dist/{toast-Nw28a5Cx.js → toast-CaFQNYng.js} +2 -2
- package/dist/{toast-Nw28a5Cx.js.map → toast-CaFQNYng.js.map} +1 -1
- package/dist/{tooltip-Cb7QW-7H.js → tooltip-g9lFsvcT.js} +8 -2
- package/dist/tooltip-g9lFsvcT.js.map +1 -0
- package/dist/{use-agent-harness-BMyF8pTq.js → use-agent-harness-BTcNJdw4.js} +1 -1
- package/dist/{use-agent-harness-BMyF8pTq.js.map → use-agent-harness-BTcNJdw4.js.map} +1 -1
- package/dist/utils.js +2 -1
- package/package.json +2 -1
- package/scripts/component-registry/index.ts +2 -2
- package/scripts/css-build.ts +1 -1
- package/scripts/theme-generator/config.ts +27 -141
- package/scripts/theme-generator/generate-css.ts +0 -1
- package/scripts/theme-generator/index.ts +0 -1
- package/dist/ai-conversation-CArP7C8K.js +0 -184
- package/dist/ai-conversation-CArP7C8K.js.map +0 -1
- package/dist/ai-info-banner-uFxHHwBA.js.map +0 -1
- package/dist/ai-message-BjnFznXy.js.map +0 -1
- package/dist/ai-prompt-input-Dy1LfxPk.js.map +0 -1
- package/dist/ai-response-BEUg3xvd.js.map +0 -1
- package/dist/ai-streaming-text-CMfoThV0.js.map +0 -1
- package/dist/ai-subagent-DcPRqkAA.js.map +0 -1
- package/dist/ai-task-list-Da9zIm00.js.map +0 -1
- package/dist/ai-tool-Cn1O4xjP.js.map +0 -1
- package/dist/banner-B_6oBrsu.js.map +0 -1
- package/dist/empty-D2TypIId.js.map +0 -1
- package/dist/stat-card-CEZscNh8.js.map +0 -1
- package/dist/styles/theme-blue-tint.css +0 -98
- package/dist/text-KJmGkwnf.js.map +0 -1
- package/dist/tooltip-Cb7QW-7H.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { t as cn } from "./cn-YROP2_ox.js";
|
|
3
|
-
import {
|
|
4
|
-
import { t as
|
|
5
|
-
import { t as
|
|
3
|
+
import { n as layoutWithLines, o as prepareWithSegments } from "./layout-DJHMMap2.js";
|
|
4
|
+
import { t as Tooltip } from "./tooltip-g9lFsvcT.js";
|
|
5
|
+
import { t as Button } from "./button-CO6-qPax.js";
|
|
6
6
|
import { Fragment, createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
7
7
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
8
8
|
import { ArrowUpIcon, ArrowsClockwiseIcon, CaretDownIcon, CheckIcon, FileIcon, FileTextIcon, ImageIcon, MicrophoneIcon, PaperclipIcon, PlusIcon, SpinnerGapIcon, SquareIcon, XIcon } from "@phosphor-icons/react";
|
|
@@ -442,7 +442,8 @@ var useStore = (source, selector = (s) => s, compare) => useSelector(source, sel
|
|
|
442
442
|
*/
|
|
443
443
|
var DEFAULT_REQUEST = {
|
|
444
444
|
text: "",
|
|
445
|
-
files: []
|
|
445
|
+
files: [],
|
|
446
|
+
tags: []
|
|
446
447
|
};
|
|
447
448
|
var DEFAULT_DISPLAY = { sendStatus: "idle" };
|
|
448
449
|
function createPromptInputRequestController(options = {}) {
|
|
@@ -494,13 +495,60 @@ function createPromptInputRequestController(options = {}) {
|
|
|
494
495
|
};
|
|
495
496
|
});
|
|
496
497
|
},
|
|
498
|
+
addTags(tags) {
|
|
499
|
+
request.setState((prev) => {
|
|
500
|
+
const existing = prev.tags ?? [];
|
|
501
|
+
const incoming = tags.filter((tag) => !existing.some((item) => item.id === tag.id));
|
|
502
|
+
return {
|
|
503
|
+
...prev,
|
|
504
|
+
tags: [...existing, ...incoming]
|
|
505
|
+
};
|
|
506
|
+
});
|
|
507
|
+
},
|
|
508
|
+
insertTag(tag, range) {
|
|
509
|
+
request.setState((prev) => {
|
|
510
|
+
const mention = tag.mention ?? `@${tag.label.replace(/\s+/g, "-").toLowerCase()}`;
|
|
511
|
+
const text = prev.text ?? "";
|
|
512
|
+
const start = range?.start ?? text.length;
|
|
513
|
+
const end = range?.end ?? text.length;
|
|
514
|
+
const prefix = text.slice(0, start);
|
|
515
|
+
const suffix = text.slice(end);
|
|
516
|
+
const needsPrefixSpace = prefix.length > 0 && !/\s$/.test(prefix);
|
|
517
|
+
const needsSuffixSpace = suffix.length > 0 && !/^\s/.test(suffix);
|
|
518
|
+
const nextText = `${prefix}${needsPrefixSpace ? " " : ""}${mention}${needsSuffixSpace ? " " : ""}${suffix}`;
|
|
519
|
+
const nextTag = {
|
|
520
|
+
...tag,
|
|
521
|
+
mention
|
|
522
|
+
};
|
|
523
|
+
const existing = prev.tags ?? [];
|
|
524
|
+
const nextTags = existing.some((item) => item.id === tag.id) ? existing.map((item) => item.id === tag.id ? nextTag : item) : [...existing, nextTag];
|
|
525
|
+
return {
|
|
526
|
+
...prev,
|
|
527
|
+
text: nextText,
|
|
528
|
+
tags: nextTags
|
|
529
|
+
};
|
|
530
|
+
});
|
|
531
|
+
},
|
|
532
|
+
removeTag(id) {
|
|
533
|
+
request.setState((prev) => ({
|
|
534
|
+
...prev,
|
|
535
|
+
tags: (prev.tags ?? []).filter((tag) => tag.id !== id)
|
|
536
|
+
}));
|
|
537
|
+
},
|
|
538
|
+
clearTags() {
|
|
539
|
+
request.setState((prev) => ({
|
|
540
|
+
...prev,
|
|
541
|
+
tags: []
|
|
542
|
+
}));
|
|
543
|
+
},
|
|
497
544
|
resetRequest() {
|
|
498
545
|
request.setState((prev) => {
|
|
499
546
|
for (const f of prev.files) if (f.url.startsWith("blob:")) URL.revokeObjectURL(f.url);
|
|
500
547
|
return {
|
|
501
548
|
...prev,
|
|
502
549
|
text: "",
|
|
503
|
-
files: []
|
|
550
|
+
files: [],
|
|
551
|
+
tags: []
|
|
504
552
|
};
|
|
505
553
|
});
|
|
506
554
|
},
|
|
@@ -698,9 +746,10 @@ function makeAttachmentId() {
|
|
|
698
746
|
* </PromptInput>
|
|
699
747
|
* ```
|
|
700
748
|
*/
|
|
701
|
-
|
|
749
|
+
function PromptInput({ className, accept, multiple, globalDrop, maxFiles, maxFileSize, onError, onSubmit, children, backLayer, backLayerTitle = "Context", backLayerStatus = "idle", backLayerOpen, onBackLayerOpenChange, autoOpenBackLayerWhen, ...props }) {
|
|
702
750
|
const hasBackLayer = backLayer !== void 0;
|
|
703
751
|
const controller = useOptionalPromptInputController();
|
|
752
|
+
const requestCtrl = useOptionalPromptInputRequestController();
|
|
704
753
|
const usingProvider = !!controller;
|
|
705
754
|
const inputRef = useRef(null);
|
|
706
755
|
const anchorRef = useRef(null);
|
|
@@ -714,6 +763,7 @@ var PromptInput = ({ className, accept, multiple, globalDrop, maxFiles, maxFileS
|
|
|
714
763
|
}, [autoOpenBackLayerWhen, onBackLayerOpenChange]);
|
|
715
764
|
const [items, setItems] = useState([]);
|
|
716
765
|
const files = usingProvider ? controller.attachments.files : items;
|
|
766
|
+
const tags = useStore(requestCtrl?.request ?? FALLBACK_REQUEST_STORE, (state) => state.tags ?? []);
|
|
717
767
|
const openFileDialogLocal = useCallback(() => {
|
|
718
768
|
inputRef.current?.click();
|
|
719
769
|
}, []);
|
|
@@ -837,7 +887,7 @@ var PromptInput = ({ className, accept, multiple, globalDrop, maxFiles, maxFileS
|
|
|
837
887
|
const handleSubmit = (event) => {
|
|
838
888
|
event.preventDefault();
|
|
839
889
|
const form = event.currentTarget;
|
|
840
|
-
const text = usingProvider ? controller.textInput.value : new FormData(form).get("message") || "";
|
|
890
|
+
const text = requestCtrl ? requestCtrl.request.state.text : usingProvider ? controller.textInput.value : new FormData(form).get("message") || "";
|
|
841
891
|
if (!usingProvider) form.reset();
|
|
842
892
|
const doSubmit = async () => {
|
|
843
893
|
const convertedFiles = await Promise.all(files.map(async (item) => {
|
|
@@ -850,10 +900,14 @@ var PromptInput = ({ className, accept, multiple, globalDrop, maxFiles, maxFileS
|
|
|
850
900
|
try {
|
|
851
901
|
await onSubmit({
|
|
852
902
|
text,
|
|
853
|
-
files: convertedFiles
|
|
903
|
+
files: convertedFiles,
|
|
904
|
+
tags
|
|
854
905
|
}, event);
|
|
855
|
-
|
|
856
|
-
|
|
906
|
+
if (requestCtrl) requestCtrl.resetRequest();
|
|
907
|
+
else {
|
|
908
|
+
clear();
|
|
909
|
+
if (usingProvider) controller.textInput.clear();
|
|
910
|
+
}
|
|
857
911
|
} catch {}
|
|
858
912
|
};
|
|
859
913
|
doSubmit().catch(() => {});
|
|
@@ -868,9 +922,19 @@ var PromptInput = ({ className, accept, multiple, globalDrop, maxFiles, maxFileS
|
|
|
868
922
|
className: "flex w-full items-center justify-between gap-2 px-3 py-2 text-left",
|
|
869
923
|
onClick: () => onBackLayerOpenChange?.(!isBackLayerOpen),
|
|
870
924
|
type: "button",
|
|
871
|
-
children: [/* @__PURE__ */
|
|
872
|
-
className: "text-sm font-medium text-sf-subtle uppercase tracking-wide select-none",
|
|
873
|
-
children:
|
|
925
|
+
children: [/* @__PURE__ */ jsxs("span", {
|
|
926
|
+
className: "flex items-center gap-1.5 text-sm font-medium text-sf-subtle uppercase tracking-wide select-none",
|
|
927
|
+
children: [
|
|
928
|
+
backLayerStatus === "running" ? /* @__PURE__ */ jsx(SpinnerGapIcon, {
|
|
929
|
+
className: "size-3.5 animate-spin",
|
|
930
|
+
"aria-hidden": "true"
|
|
931
|
+
}) : null,
|
|
932
|
+
backLayerStatus === "error" ? /* @__PURE__ */ jsx(XIcon, {
|
|
933
|
+
className: "size-3.5 text-sf-danger",
|
|
934
|
+
"aria-hidden": "true"
|
|
935
|
+
}) : null,
|
|
936
|
+
backLayerTitle
|
|
937
|
+
]
|
|
874
938
|
}), /* @__PURE__ */ jsx(CaretDownIcon, { className: cn("size-3.5 text-sf-subtle transition-transform duration-200", isBackLayerOpen && "rotate-180") })]
|
|
875
939
|
}),
|
|
876
940
|
/* @__PURE__ */ jsx(PromptInputBackLayerPanel, {
|
|
@@ -878,11 +942,14 @@ var PromptInput = ({ className, accept, multiple, globalDrop, maxFiles, maxFileS
|
|
|
878
942
|
children: backLayer
|
|
879
943
|
}),
|
|
880
944
|
/* @__PURE__ */ jsx("div", {
|
|
881
|
-
className: "flex flex-col overflow-
|
|
945
|
+
className: "flex flex-col overflow-visible rounded-xl bg-sf-base ring ring-sf-line/50 focus-within:ring-sf-ring",
|
|
882
946
|
children
|
|
883
947
|
})
|
|
884
948
|
]
|
|
885
|
-
}) : /* @__PURE__ */ jsx(
|
|
949
|
+
}) : /* @__PURE__ */ jsx("div", {
|
|
950
|
+
className: "flex w-full flex-col items-stretch overflow-visible rounded-xl border-0 bg-sf-base shadow-xs ring ring-sf-line focus-within:ring-sf-ring",
|
|
951
|
+
children
|
|
952
|
+
});
|
|
886
953
|
const inner = /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
887
954
|
/* @__PURE__ */ jsx("span", {
|
|
888
955
|
"aria-hidden": "true",
|
|
@@ -909,7 +976,7 @@ var PromptInput = ({ className, accept, multiple, globalDrop, maxFiles, maxFileS
|
|
|
909
976
|
value: ctx,
|
|
910
977
|
children: inner
|
|
911
978
|
});
|
|
912
|
-
}
|
|
979
|
+
}
|
|
913
980
|
var PromptInputBody = ({ className, ...props }) => /* @__PURE__ */ jsx("div", {
|
|
914
981
|
className: cn("contents", className),
|
|
915
982
|
...props
|
|
@@ -970,6 +1037,8 @@ var handleTextareaKeyDown = (e) => {
|
|
|
970
1037
|
*/
|
|
971
1038
|
var PromptInputTextarea = ({ onChange, className, placeholder = "What would you like to know?", ...props }) => {
|
|
972
1039
|
const controller = useOptionalPromptInputController();
|
|
1040
|
+
const requestCtrl = useOptionalPromptInputRequestController();
|
|
1041
|
+
const requestText = useStore(requestCtrl?.request ?? FALLBACK_REQUEST_STORE, (state) => typeof state.text === "string" ? state.text : "");
|
|
973
1042
|
const attachments = usePromptInputAttachments();
|
|
974
1043
|
const handlePaste = (event) => {
|
|
975
1044
|
const items = event.clipboardData?.items;
|
|
@@ -984,7 +1053,13 @@ var PromptInputTextarea = ({ onChange, className, placeholder = "What would you
|
|
|
984
1053
|
attachments.add(pastedFiles);
|
|
985
1054
|
}
|
|
986
1055
|
};
|
|
987
|
-
const controlledProps =
|
|
1056
|
+
const controlledProps = requestCtrl ? {
|
|
1057
|
+
value: requestText,
|
|
1058
|
+
onChange: (e) => {
|
|
1059
|
+
requestCtrl.setRequestField("text", e.currentTarget.value);
|
|
1060
|
+
onChange?.(e);
|
|
1061
|
+
}
|
|
1062
|
+
} : controller ? {
|
|
988
1063
|
value: controller.textInput.value,
|
|
989
1064
|
onChange: (e) => {
|
|
990
1065
|
controller.textInput.setInput(e.currentTarget.value);
|
|
@@ -992,7 +1067,7 @@ var PromptInputTextarea = ({ onChange, className, placeholder = "What would you
|
|
|
992
1067
|
}
|
|
993
1068
|
} : { onChange };
|
|
994
1069
|
return /* @__PURE__ */ jsx("textarea", {
|
|
995
|
-
className: cn("field-sizing-content max-h-48 min-h-16 w-full resize-none border-0 bg-transparent px-3
|
|
1070
|
+
className: cn("field-sizing-content max-h-48 min-h-16 w-full resize-none border-0 bg-transparent px-3 pt-3 pb-1 text-sm text-sf-default outline-none placeholder:text-sf-inactive", className),
|
|
996
1071
|
name: "message",
|
|
997
1072
|
onKeyDown: handleTextareaKeyDown,
|
|
998
1073
|
onPaste: handlePaste,
|
|
@@ -1002,12 +1077,276 @@ var PromptInputTextarea = ({ onChange, className, placeholder = "What would you
|
|
|
1002
1077
|
...controlledProps
|
|
1003
1078
|
});
|
|
1004
1079
|
};
|
|
1080
|
+
var getTagMention = (tag) => tag.mention ?? `@${tag.label.replace(/\s+/g, "-").toLowerCase()}`;
|
|
1081
|
+
var findMentionAtCursor = (text, cursor) => {
|
|
1082
|
+
const beforeCursor = text.slice(0, cursor);
|
|
1083
|
+
const match = /(^|\s)@([\w-]*)$/.exec(beforeCursor);
|
|
1084
|
+
if (!match) return null;
|
|
1085
|
+
return {
|
|
1086
|
+
start: cursor - match[0].trimStart().length,
|
|
1087
|
+
end: cursor,
|
|
1088
|
+
query: match[2] ?? ""
|
|
1089
|
+
};
|
|
1090
|
+
};
|
|
1091
|
+
var renderInlineReferenceText = (text, tags) => {
|
|
1092
|
+
if (text.length === 0) return null;
|
|
1093
|
+
const mentions = tags.map((tag) => ({
|
|
1094
|
+
tag,
|
|
1095
|
+
mention: getTagMention(tag)
|
|
1096
|
+
})).filter((item) => item.mention.length > 0).sort((a, b) => b.mention.length - a.mention.length);
|
|
1097
|
+
const parts = [];
|
|
1098
|
+
let index = 0;
|
|
1099
|
+
while (index < text.length) {
|
|
1100
|
+
let match;
|
|
1101
|
+
for (const mention of mentions) if (text.startsWith(mention.mention, index)) {
|
|
1102
|
+
match = mention;
|
|
1103
|
+
break;
|
|
1104
|
+
}
|
|
1105
|
+
if (match) {
|
|
1106
|
+
parts.push(/* @__PURE__ */ jsx("span", {
|
|
1107
|
+
className: "rounded-md bg-sf-tint font-medium text-sf-strong ring-1 ring-sf-line",
|
|
1108
|
+
children: match.mention
|
|
1109
|
+
}, `${match.tag.id}-${index}`));
|
|
1110
|
+
index += match.mention.length;
|
|
1111
|
+
continue;
|
|
1112
|
+
}
|
|
1113
|
+
parts.push(text[index]);
|
|
1114
|
+
index += 1;
|
|
1115
|
+
}
|
|
1116
|
+
return parts;
|
|
1117
|
+
};
|
|
1118
|
+
var getTextareaCursorPosition = (textarea, wrapper) => {
|
|
1119
|
+
if (!wrapper) return {
|
|
1120
|
+
left: 12,
|
|
1121
|
+
top: 0
|
|
1122
|
+
};
|
|
1123
|
+
const computed = window.getComputedStyle(textarea);
|
|
1124
|
+
const wrapperRect = wrapper.getBoundingClientRect();
|
|
1125
|
+
const paddingLeft = parseFloat(computed.paddingLeft) || 0;
|
|
1126
|
+
const paddingTop = parseFloat(computed.paddingTop) || 0;
|
|
1127
|
+
const contentWidth = Math.max(1, textarea.clientWidth - paddingLeft - (parseFloat(computed.paddingRight) || 0));
|
|
1128
|
+
const lineHeightPx = parseFloat(computed.lineHeight) || 20;
|
|
1129
|
+
const font = computed.font || `${computed.fontStyle} ${computed.fontWeight} ${computed.fontSize} ${computed.fontFamily}`;
|
|
1130
|
+
const result = layoutWithLines(prepareWithSegments(textarea.value.slice(0, textarea.selectionStart), font, { whiteSpace: "pre-wrap" }), contentWidth, lineHeightPx);
|
|
1131
|
+
const lineCount = result.lines.length || 1;
|
|
1132
|
+
const lastLine = result.lines[result.lines.length - 1];
|
|
1133
|
+
const lastLineWidth = lastLine ? lastLine.width : 0;
|
|
1134
|
+
const top = (lineCount - 1) * lineHeightPx + paddingTop + textarea.offsetTop - 6;
|
|
1135
|
+
return {
|
|
1136
|
+
left: Math.min(Math.max(lastLineWidth + paddingLeft + textarea.offsetLeft, 12), Math.max(wrapperRect.width - 300, 12)),
|
|
1137
|
+
top
|
|
1138
|
+
};
|
|
1139
|
+
};
|
|
1140
|
+
var PromptInputReferencePicker = ({ activeIndex, onSelect, options, style }) => /* @__PURE__ */ jsxs("div", {
|
|
1141
|
+
className: "absolute z-50 w-72 -translate-y-full overflow-hidden rounded-lg bg-sf-elevated p-1 shadow-lg ring ring-sf-line",
|
|
1142
|
+
style,
|
|
1143
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
1144
|
+
className: "px-2 py-1.5 text-xs font-medium text-sf-subtle",
|
|
1145
|
+
children: "References"
|
|
1146
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
1147
|
+
className: "max-h-56 overflow-y-auto",
|
|
1148
|
+
children: options.map((tag, index) => /* @__PURE__ */ jsxs("button", {
|
|
1149
|
+
"aria-selected": index === activeIndex,
|
|
1150
|
+
className: cn("flex w-full items-start gap-2 rounded-md px-2 py-2 text-left text-sm text-sf-default hover:bg-sf-tint aria-selected:bg-sf-tint", index === activeIndex && "bg-sf-tint"),
|
|
1151
|
+
onMouseDown: (event) => {
|
|
1152
|
+
event.preventDefault();
|
|
1153
|
+
onSelect(tag);
|
|
1154
|
+
},
|
|
1155
|
+
role: "option",
|
|
1156
|
+
type: "button",
|
|
1157
|
+
children: [
|
|
1158
|
+
tag.icon && /* @__PURE__ */ jsx("span", {
|
|
1159
|
+
className: "mt-0.5 shrink-0",
|
|
1160
|
+
children: tag.icon
|
|
1161
|
+
}),
|
|
1162
|
+
/* @__PURE__ */ jsxs("span", {
|
|
1163
|
+
className: "min-w-0 flex-1",
|
|
1164
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
1165
|
+
className: "block truncate font-medium",
|
|
1166
|
+
children: tag.label
|
|
1167
|
+
}), tag.description && /* @__PURE__ */ jsx("span", {
|
|
1168
|
+
className: "block truncate text-xs text-sf-subtle",
|
|
1169
|
+
children: tag.description
|
|
1170
|
+
})]
|
|
1171
|
+
}),
|
|
1172
|
+
/* @__PURE__ */ jsx("span", {
|
|
1173
|
+
className: "shrink-0 text-xs text-sf-subtle",
|
|
1174
|
+
children: getTagMention(tag)
|
|
1175
|
+
})
|
|
1176
|
+
]
|
|
1177
|
+
}, tag.id))
|
|
1178
|
+
})]
|
|
1179
|
+
});
|
|
1180
|
+
var PromptInputEditor = ({ className, placeholder = "What would you like to know?", onReferenceSearch, references, onChange, onKeyDown, style, ...props }) => {
|
|
1181
|
+
const controller = useOptionalPromptInputController();
|
|
1182
|
+
const requestCtrl = useOptionalPromptInputRequestController();
|
|
1183
|
+
const textareaRef = useRef(null);
|
|
1184
|
+
const wrapperRef = useRef(null);
|
|
1185
|
+
const [mention, setMention] = useState(null);
|
|
1186
|
+
const [options, setOptions] = useState([]);
|
|
1187
|
+
const [activeIndex, setActiveIndex] = useState(0);
|
|
1188
|
+
const [pickerPosition, setPickerPosition] = useState({
|
|
1189
|
+
left: 12,
|
|
1190
|
+
top: 0
|
|
1191
|
+
});
|
|
1192
|
+
const requestText = useStore(requestCtrl?.request ?? FALLBACK_REQUEST_STORE, (state) => typeof state.text === "string" ? state.text : "");
|
|
1193
|
+
const tags = useStore(requestCtrl?.request ?? FALLBACK_REQUEST_STORE, (state) => Array.isArray(state.tags) ? state.tags : []);
|
|
1194
|
+
const attachments = usePromptInputAttachments();
|
|
1195
|
+
const value = requestCtrl ? requestText : controller?.textInput.value ?? "";
|
|
1196
|
+
const updateMention = useCallback((textarea) => {
|
|
1197
|
+
const nextMention = findMentionAtCursor(textarea.value, textarea.selectionStart);
|
|
1198
|
+
if (nextMention) setPickerPosition(getTextareaCursorPosition(textarea, wrapperRef.current));
|
|
1199
|
+
setMention((current) => {
|
|
1200
|
+
if (!(current || nextMention)) return current;
|
|
1201
|
+
if (current && nextMention && current.start === nextMention.start && current.end === nextMention.end && current.query === nextMention.query) return current;
|
|
1202
|
+
return nextMention;
|
|
1203
|
+
});
|
|
1204
|
+
}, []);
|
|
1205
|
+
useEffect(() => {
|
|
1206
|
+
let cancelled = false;
|
|
1207
|
+
if (!mention) {
|
|
1208
|
+
setOptions([]);
|
|
1209
|
+
return;
|
|
1210
|
+
}
|
|
1211
|
+
const load = async () => {
|
|
1212
|
+
const result = onReferenceSearch ? await onReferenceSearch({
|
|
1213
|
+
trigger: "@",
|
|
1214
|
+
query: mention.query
|
|
1215
|
+
}) : (references ?? []).filter((tag) => tag.label.toLowerCase().includes(mention.query.toLowerCase()));
|
|
1216
|
+
if (!cancelled) {
|
|
1217
|
+
setOptions(result);
|
|
1218
|
+
setActiveIndex((index) => index < result.length ? index : 0);
|
|
1219
|
+
}
|
|
1220
|
+
};
|
|
1221
|
+
load().catch(() => {
|
|
1222
|
+
if (!cancelled) setOptions([]);
|
|
1223
|
+
});
|
|
1224
|
+
return () => {
|
|
1225
|
+
cancelled = true;
|
|
1226
|
+
};
|
|
1227
|
+
}, [
|
|
1228
|
+
mention,
|
|
1229
|
+
onReferenceSearch,
|
|
1230
|
+
references
|
|
1231
|
+
]);
|
|
1232
|
+
const insertReference = useCallback((tag) => {
|
|
1233
|
+
if (!(requestCtrl && mention)) return;
|
|
1234
|
+
const mentionText = getTagMention(tag);
|
|
1235
|
+
requestCtrl.insertTag({
|
|
1236
|
+
...tag,
|
|
1237
|
+
mention: mentionText
|
|
1238
|
+
}, mention);
|
|
1239
|
+
setMention(null);
|
|
1240
|
+
setOptions([]);
|
|
1241
|
+
requestAnimationFrame(() => {
|
|
1242
|
+
const textarea = textareaRef.current;
|
|
1243
|
+
if (!textarea) return;
|
|
1244
|
+
const cursor = mention.start + mentionText.length + 1;
|
|
1245
|
+
textarea.focus();
|
|
1246
|
+
textarea.setSelectionRange(cursor, cursor);
|
|
1247
|
+
});
|
|
1248
|
+
}, [mention, requestCtrl]);
|
|
1249
|
+
const handlePaste = (event) => {
|
|
1250
|
+
const items = event.clipboardData?.items;
|
|
1251
|
+
if (!items) return;
|
|
1252
|
+
const pastedFiles = [];
|
|
1253
|
+
for (const item of items) if (item.kind === "file") {
|
|
1254
|
+
const file = item.getAsFile();
|
|
1255
|
+
if (file) pastedFiles.push(file);
|
|
1256
|
+
}
|
|
1257
|
+
if (pastedFiles.length > 0) {
|
|
1258
|
+
event.preventDefault();
|
|
1259
|
+
attachments.add(pastedFiles);
|
|
1260
|
+
}
|
|
1261
|
+
};
|
|
1262
|
+
const handleKeyDown = (event) => {
|
|
1263
|
+
if (mention && options.length > 0) {
|
|
1264
|
+
if (event.key === "ArrowDown") {
|
|
1265
|
+
event.preventDefault();
|
|
1266
|
+
setActiveIndex((index) => (index + 1) % options.length);
|
|
1267
|
+
return;
|
|
1268
|
+
}
|
|
1269
|
+
if (event.key === "ArrowUp") {
|
|
1270
|
+
event.preventDefault();
|
|
1271
|
+
setActiveIndex((index) => (index - 1 + options.length) % options.length);
|
|
1272
|
+
return;
|
|
1273
|
+
}
|
|
1274
|
+
if (event.key === "Enter" || event.key === "Tab") {
|
|
1275
|
+
event.preventDefault();
|
|
1276
|
+
insertReference(options[activeIndex]);
|
|
1277
|
+
return;
|
|
1278
|
+
}
|
|
1279
|
+
if (event.key === "Escape") {
|
|
1280
|
+
event.preventDefault();
|
|
1281
|
+
setMention(null);
|
|
1282
|
+
setOptions([]);
|
|
1283
|
+
return;
|
|
1284
|
+
}
|
|
1285
|
+
}
|
|
1286
|
+
handleTextareaKeyDown(event);
|
|
1287
|
+
onKeyDown?.(event);
|
|
1288
|
+
};
|
|
1289
|
+
const handleChange = (event) => {
|
|
1290
|
+
if (requestCtrl) requestCtrl.setRequestField("text", event.currentTarget.value);
|
|
1291
|
+
else if (controller) controller.textInput.setInput(event.currentTarget.value);
|
|
1292
|
+
updateMention(event.currentTarget);
|
|
1293
|
+
onChange?.(event);
|
|
1294
|
+
};
|
|
1295
|
+
const showPicker = mention && options.length > 0;
|
|
1296
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
1297
|
+
className: "relative",
|
|
1298
|
+
ref: wrapperRef,
|
|
1299
|
+
children: [
|
|
1300
|
+
/* @__PURE__ */ jsx("div", {
|
|
1301
|
+
"aria-hidden": "true",
|
|
1302
|
+
className: cn("pointer-events-none field-sizing-content max-h-48 min-h-16 w-full overflow-hidden whitespace-pre-wrap break-words px-3 pt-3 pb-1 text-sm text-sf-default", value.length === 0 && "text-transparent"),
|
|
1303
|
+
children: renderInlineReferenceText(value, tags)
|
|
1304
|
+
}),
|
|
1305
|
+
/* @__PURE__ */ jsx("textarea", {
|
|
1306
|
+
className: cn("absolute inset-0 field-sizing-content max-h-48 min-h-16 w-full resize-none border-0 bg-transparent px-3 pt-3 pb-1 text-sm text-transparent outline-none placeholder:text-sf-inactive", className),
|
|
1307
|
+
name: "message",
|
|
1308
|
+
onChange: handleChange,
|
|
1309
|
+
onClick: (event) => updateMention(event.currentTarget),
|
|
1310
|
+
onKeyDown: handleKeyDown,
|
|
1311
|
+
onKeyUp: (event) => {
|
|
1312
|
+
if ([
|
|
1313
|
+
"ArrowDown",
|
|
1314
|
+
"ArrowUp",
|
|
1315
|
+
"Enter",
|
|
1316
|
+
"Tab",
|
|
1317
|
+
"Escape"
|
|
1318
|
+
].includes(event.key)) return;
|
|
1319
|
+
updateMention(event.currentTarget);
|
|
1320
|
+
},
|
|
1321
|
+
onPaste: handlePaste,
|
|
1322
|
+
placeholder,
|
|
1323
|
+
ref: textareaRef,
|
|
1324
|
+
rows: 1,
|
|
1325
|
+
style: {
|
|
1326
|
+
caretColor: "var(--text-color-sf-default)",
|
|
1327
|
+
...style
|
|
1328
|
+
},
|
|
1329
|
+
value,
|
|
1330
|
+
...props
|
|
1331
|
+
}),
|
|
1332
|
+
showPicker && /* @__PURE__ */ jsx(PromptInputReferencePicker, {
|
|
1333
|
+
activeIndex,
|
|
1334
|
+
onSelect: insertReference,
|
|
1335
|
+
options,
|
|
1336
|
+
style: {
|
|
1337
|
+
left: pickerPosition.left,
|
|
1338
|
+
top: pickerPosition.top
|
|
1339
|
+
}
|
|
1340
|
+
})
|
|
1341
|
+
]
|
|
1342
|
+
});
|
|
1343
|
+
};
|
|
1005
1344
|
var PromptInputToolbar = ({ className, ...props }) => /* @__PURE__ */ jsx("div", {
|
|
1006
|
-
className: cn("
|
|
1345
|
+
className: cn("grid grid-cols-[minmax(0,1fr)_auto] items-end gap-2 px-2.5 pt-1 pb-2", className),
|
|
1007
1346
|
...props
|
|
1008
1347
|
});
|
|
1009
1348
|
var PromptInputTools = ({ className, ...props }) => /* @__PURE__ */ jsx("div", {
|
|
1010
|
-
className: cn("flex min-w-0 items-center gap-1", className),
|
|
1349
|
+
className: cn("flex min-w-0 flex-wrap items-center gap-1", className),
|
|
1011
1350
|
...props
|
|
1012
1351
|
});
|
|
1013
1352
|
var PromptInputButton = ({ variant = "ghost", size = "sm", className, ...props }) => /* @__PURE__ */ jsx(Button, {
|
|
@@ -1032,7 +1371,7 @@ var PromptInputSubmit = ({ className, variant = "primary", size = "sm", status =
|
|
|
1032
1371
|
else Icon = /* @__PURE__ */ jsx(ArrowUpIcon, { className: "size-4" });
|
|
1033
1372
|
return /* @__PURE__ */ jsx(Button, {
|
|
1034
1373
|
"aria-label": "Submit",
|
|
1035
|
-
className: cn(className),
|
|
1374
|
+
className: cn("size-8 shrink-0 justify-center rounded-lg p-0", className),
|
|
1036
1375
|
size,
|
|
1037
1376
|
type: "submit",
|
|
1038
1377
|
variant,
|
|
@@ -1435,17 +1774,107 @@ function PromptInputAttachments({ className, children, ...props }) {
|
|
|
1435
1774
|
if (attachments.files.length === 0) return null;
|
|
1436
1775
|
return /* @__PURE__ */ jsx("div", {
|
|
1437
1776
|
"aria-live": "polite",
|
|
1438
|
-
className: cn("overflow-hidden px-2 transition-[height] duration-200 ease-out", className),
|
|
1777
|
+
className: cn("overflow-hidden px-2.5 transition-[height] duration-200 ease-out", className),
|
|
1439
1778
|
style: { height: attachments.files.length ? height : 0 },
|
|
1440
1779
|
...props,
|
|
1441
1780
|
children: /* @__PURE__ */ jsx("div", {
|
|
1442
|
-
className: "flex flex-wrap gap-2
|
|
1781
|
+
className: "flex flex-wrap gap-2 pt-2 pb-1",
|
|
1443
1782
|
ref: contentRef,
|
|
1444
1783
|
children: attachments.files.map((file) => /* @__PURE__ */ jsx(Fragment, { children: children(file) }, file.id))
|
|
1445
1784
|
})
|
|
1446
1785
|
});
|
|
1447
1786
|
}
|
|
1448
1787
|
/**
|
|
1788
|
+
* Single reference chip for prompt tags. Includes a remove button when mounted
|
|
1789
|
+
* inside a PromptInputRequestControllerProvider.
|
|
1790
|
+
*/
|
|
1791
|
+
function PromptInputTag({ data, className, ...props }) {
|
|
1792
|
+
const requestCtrl = useOptionalPromptInputRequestController();
|
|
1793
|
+
const handleRemove = useCallback(() => {
|
|
1794
|
+
requestCtrl?.removeTag(data.id);
|
|
1795
|
+
}, [requestCtrl, data.id]);
|
|
1796
|
+
const chip = /* @__PURE__ */ jsxs("div", {
|
|
1797
|
+
className: cn("group inline-flex h-8 items-center gap-2 rounded-md border border-sf-info/30 bg-sf-info-tint px-2 text-sm text-sf-default", className),
|
|
1798
|
+
...props,
|
|
1799
|
+
children: [
|
|
1800
|
+
data.icon && /* @__PURE__ */ jsx("div", {
|
|
1801
|
+
className: "flex size-4 shrink-0 items-center justify-center",
|
|
1802
|
+
children: data.icon
|
|
1803
|
+
}),
|
|
1804
|
+
/* @__PURE__ */ jsx("span", {
|
|
1805
|
+
className: "max-w-[180px] truncate font-medium",
|
|
1806
|
+
children: data.label
|
|
1807
|
+
}),
|
|
1808
|
+
requestCtrl && /* @__PURE__ */ jsx(Button, {
|
|
1809
|
+
"aria-label": "Remove tag",
|
|
1810
|
+
className: "ml-0.5 size-4 shrink-0 rounded-full p-0 opacity-0 transition-opacity group-hover:opacity-100",
|
|
1811
|
+
onClick: handleRemove,
|
|
1812
|
+
size: "sm",
|
|
1813
|
+
type: "button",
|
|
1814
|
+
variant: "ghost",
|
|
1815
|
+
children: /* @__PURE__ */ jsx(XIcon, { className: "size-3" })
|
|
1816
|
+
})
|
|
1817
|
+
]
|
|
1818
|
+
});
|
|
1819
|
+
if (!data.description) return chip;
|
|
1820
|
+
return /* @__PURE__ */ jsx(Tooltip, {
|
|
1821
|
+
content: data.description,
|
|
1822
|
+
children: chip
|
|
1823
|
+
});
|
|
1824
|
+
}
|
|
1825
|
+
/**
|
|
1826
|
+
* Renders all prompt tags using a render prop. Hidden when no tags.
|
|
1827
|
+
* Animates height as tags are added/removed.
|
|
1828
|
+
*/
|
|
1829
|
+
function PromptInputTags({ className, children, ...props }) {
|
|
1830
|
+
const tags = useStore(useOptionalPromptInputRequestController()?.request ?? FALLBACK_REQUEST_STORE, (state) => state.tags ?? []);
|
|
1831
|
+
const [height, setHeight] = useState(0);
|
|
1832
|
+
const contentRef = useRef(null);
|
|
1833
|
+
useLayoutEffect(() => {
|
|
1834
|
+
const el = contentRef.current;
|
|
1835
|
+
if (!el) return;
|
|
1836
|
+
const ro = new ResizeObserver(() => {
|
|
1837
|
+
setHeight(el.getBoundingClientRect().height);
|
|
1838
|
+
});
|
|
1839
|
+
ro.observe(el);
|
|
1840
|
+
setHeight(el.getBoundingClientRect().height);
|
|
1841
|
+
return () => ro.disconnect();
|
|
1842
|
+
}, []);
|
|
1843
|
+
useLayoutEffect(() => {
|
|
1844
|
+
const el = contentRef.current;
|
|
1845
|
+
if (el) setHeight(el.getBoundingClientRect().height);
|
|
1846
|
+
}, [tags.length]);
|
|
1847
|
+
if (tags.length === 0) return null;
|
|
1848
|
+
return /* @__PURE__ */ jsx("div", {
|
|
1849
|
+
"aria-live": "polite",
|
|
1850
|
+
className: cn("overflow-hidden px-2.5 transition-[height] duration-200 ease-out", className),
|
|
1851
|
+
style: { height: tags.length ? height : 0 },
|
|
1852
|
+
...props,
|
|
1853
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
1854
|
+
className: "flex flex-wrap gap-2 pt-2 pb-1",
|
|
1855
|
+
ref: contentRef,
|
|
1856
|
+
children: tags.map((tag) => /* @__PURE__ */ jsx(Fragment, { children: children(tag) }, tag.id))
|
|
1857
|
+
})
|
|
1858
|
+
});
|
|
1859
|
+
}
|
|
1860
|
+
/**
|
|
1861
|
+
* Toolbar trigger for opening a consumer-owned tag picker.
|
|
1862
|
+
*/
|
|
1863
|
+
function PromptInputAddTagButton({ children, onClick, onOpenPicker, ...props }) {
|
|
1864
|
+
return /* @__PURE__ */ jsx(Button, {
|
|
1865
|
+
"aria-label": "Add tag",
|
|
1866
|
+
onClick: (event) => {
|
|
1867
|
+
onOpenPicker?.();
|
|
1868
|
+
onClick?.(event);
|
|
1869
|
+
},
|
|
1870
|
+
size: "sm",
|
|
1871
|
+
type: "button",
|
|
1872
|
+
variant: "ghost",
|
|
1873
|
+
...props,
|
|
1874
|
+
children: children ?? /* @__PURE__ */ jsx(PlusIcon, { className: "size-4" })
|
|
1875
|
+
});
|
|
1876
|
+
}
|
|
1877
|
+
/**
|
|
1449
1878
|
* Voice input button. Uses the Web Speech API (Chrome/Edge). Hidden on unsupported browsers.
|
|
1450
1879
|
* Pulses while listening.
|
|
1451
1880
|
*/
|
|
@@ -1535,7 +1964,20 @@ var PromptInputAttachButton = ({ "aria-label": ariaLabel = "Attach file", classN
|
|
|
1535
1964
|
})
|
|
1536
1965
|
});
|
|
1537
1966
|
};
|
|
1967
|
+
PromptInput.BackLayer = PromptInputBackLayer;
|
|
1968
|
+
PromptInput.Textarea = PromptInputTextarea;
|
|
1969
|
+
PromptInput.Editor = PromptInputEditor;
|
|
1970
|
+
PromptInput.Toolbar = PromptInputToolbar;
|
|
1971
|
+
PromptInput.Tools = PromptInputTools;
|
|
1972
|
+
PromptInput.Submit = PromptInputSubmit;
|
|
1973
|
+
PromptInput.ModeSelector = PromptInputModeSelector;
|
|
1974
|
+
PromptInput.AddTagButton = PromptInputAddTagButton;
|
|
1975
|
+
PromptInput.Tags = PromptInputTags;
|
|
1976
|
+
PromptInput.Tag = PromptInputTag;
|
|
1977
|
+
PromptInput.AttachButton = PromptInputAttachButton;
|
|
1978
|
+
PromptInput.Attachments = PromptInputAttachments;
|
|
1979
|
+
PromptInput.Attachment = PromptInputAttachment;
|
|
1538
1980
|
//#endregion
|
|
1539
|
-
export {
|
|
1981
|
+
export { SF_AI_PROMPT_INPUT_DEFAULT_VARIANTS as A, useRequestField as B, PromptInputSpeechButton as C, PromptInputTextarea as D, PromptInputTags as E, PromptInputRequestControllerProvider as F, createPromptInputRequestController as I, useDisplayField as L, usePromptInputAttachments as M, usePromptInputController as N, PromptInputToolbar as O, useProviderAttachments as P, useOptionalPromptInputRequestController as R, PromptInputProvider as S, PromptInputTag as T, useSetRequestField as V, PromptInputModeCycle as _, PromptInputActionMenuItem as a, PromptInputModelCycle as b, PromptInputAttachButton as c, PromptInputBackLayer as d, PromptInputBody as f, PromptInputEditor as g, PromptInputCompactSelect as h, PromptInputActionMenuContent as i, SF_AI_PROMPT_INPUT_VARIANTS as j, PromptInputTools as k, PromptInputAttachment as l, PromptInputCompactCycle as m, PromptInputActionAddAttachments as n, PromptInputActionMenuTrigger as o, PromptInputButton as p, PromptInputActionMenu as r, PromptInputAddTagButton as s, PromptInput as t, PromptInputAttachments as u, PromptInputModeSelect as v, PromptInputSubmit as w, PromptInputModelSelect as x, PromptInputModeSelector as y, usePromptInputRequestController as z };
|
|
1540
1982
|
|
|
1541
|
-
//# sourceMappingURL=ai-prompt-input-
|
|
1983
|
+
//# sourceMappingURL=ai-prompt-input-BVvov_KF.js.map
|