@mastra/playground-ui 68.0.0 → 69.0.0-alpha.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/README.md +80 -8
- package/dist/AgentIndicator-Dnv_1hvF.js +1995 -0
- package/dist/AgentIndicator-Dnv_1hvF.js.map +1 -0
- package/dist/AgentIndicator-zCokR2zb.cjs +2012 -0
- package/dist/AgentIndicator-zCokR2zb.cjs.map +1 -0
- package/dist/{AttachmentCard-DbGp7TYl.js → AttachmentCard-Bt3-QAxJ.js} +3 -3
- package/dist/{AttachmentCard-DbGp7TYl.js.map → AttachmentCard-Bt3-QAxJ.js.map} +1 -1
- package/dist/{AttachmentCard-CciBqu7E.cjs → AttachmentCard-BycDEelL.cjs} +3 -3
- package/dist/{AttachmentCard-CciBqu7E.cjs.map → AttachmentCard-BycDEelL.cjs.map} +1 -1
- package/dist/{Avatar-Dj8aP7OI.js → Avatar-DOoEXudh.js} +3 -3
- package/dist/{Avatar-Dj8aP7OI.js.map → Avatar-DOoEXudh.js.map} +1 -1
- package/dist/{Avatar-Iiqjad9K.cjs → Avatar-Dxpc0YUx.cjs} +3 -3
- package/dist/{Avatar-Iiqjad9K.cjs.map → Avatar-Dxpc0YUx.cjs.map} +1 -1
- package/dist/{Badge-aVu5iGAF.js → Badge-C7NnqmMx.js} +3 -3
- package/dist/{Badge-aVu5iGAF.js.map → Badge-C7NnqmMx.js.map} +1 -1
- package/dist/{Badge-DZ6r6bcw.cjs → Badge-DqaMg7Gy.cjs} +3 -3
- package/dist/{Badge-DZ6r6bcw.cjs.map → Badge-DqaMg7Gy.cjs.map} +1 -1
- package/dist/{Button-DLcMcuUL.cjs → Button-BfICfyxD.cjs} +5 -5
- package/dist/Button-BfICfyxD.cjs.map +1 -0
- package/dist/{Button-CLXTbAY8.js → Button-Bi7aXd_G.js} +5 -5
- package/dist/Button-Bi7aXd_G.js.map +1 -0
- package/dist/{Card-C6iEBgVq.cjs → Card-C9oCXvxU.cjs} +3 -3
- package/dist/{Card-C6iEBgVq.cjs.map → Card-C9oCXvxU.cjs.map} +1 -1
- package/dist/{Card-LU1aWO7U.js → Card-ClDoUQNb.js} +3 -3
- package/dist/{Card-LU1aWO7U.js.map → Card-ClDoUQNb.js.map} +1 -1
- package/dist/{CodeEditor-CLzs0yVc.cjs → CodeEditor-DHIDfP5g.cjs} +8 -8
- package/dist/{CodeEditor-CLzs0yVc.cjs.map → CodeEditor-DHIDfP5g.cjs.map} +1 -1
- package/dist/{CodeEditor-COnz9c6B.js → CodeEditor-ZoBu3Gjw.js} +8 -8
- package/dist/{CodeEditor-COnz9c6B.js.map → CodeEditor-ZoBu3Gjw.js.map} +1 -1
- package/dist/{Comment-0n98b_f_.js → Comment-2q9SomE2.js} +5 -5
- package/dist/{Comment-0n98b_f_.js.map → Comment-2q9SomE2.js.map} +1 -1
- package/dist/{Comment-Cg0f7eLa.cjs → Comment-rQxuMDQv.cjs} +6 -6
- package/dist/{Comment-Cg0f7eLa.cjs.map → Comment-rQxuMDQv.cjs.map} +1 -1
- package/dist/{Composer-D1gF-0jZ.js → Composer-bVE8qK52.js} +19 -14
- package/dist/Composer-bVE8qK52.js.map +1 -0
- package/dist/{Composer-BcueJvdX.cjs → Composer-u1K6edoZ.cjs} +18 -13
- package/dist/Composer-u1K6edoZ.cjs.map +1 -0
- package/dist/{DataCodeSection-CFxXsQWH.cjs → DataCodeSection-7SvRJj6f.cjs} +8 -8
- package/dist/{DataCodeSection-CFxXsQWH.cjs.map → DataCodeSection-7SvRJj6f.cjs.map} +1 -1
- package/dist/{DataCodeSection-PY9XEg2C.js → DataCodeSection-CTodi9wg.js} +8 -8
- package/dist/{DataCodeSection-PY9XEg2C.js.map → DataCodeSection-CTodi9wg.js.map} +1 -1
- package/dist/{DataDetailsPanel-DiyjEXqK.cjs → DataDetailsPanel-BDoD6pxx.cjs} +7 -7
- package/dist/{DataDetailsPanel-DiyjEXqK.cjs.map → DataDetailsPanel-BDoD6pxx.cjs.map} +1 -1
- package/dist/{DataDetailsPanel-CohEKPm4.js → DataDetailsPanel-BU05psHL.js} +7 -7
- package/dist/{DataDetailsPanel-CohEKPm4.js.map → DataDetailsPanel-BU05psHL.js.map} +1 -1
- package/dist/{DataKeysAndValues-PwOmGxyp.js → DataKeysAndValues-B56je3sK.js} +2 -2
- package/dist/{DataKeysAndValues-PwOmGxyp.js.map → DataKeysAndValues-B56je3sK.js.map} +1 -1
- package/dist/{DataKeysAndValues-DsH6AbAo.cjs → DataKeysAndValues-BbKeVxrQ.cjs} +2 -2
- package/dist/{DataKeysAndValues-DsH6AbAo.cjs.map → DataKeysAndValues-BbKeVxrQ.cjs.map} +1 -1
- package/dist/{DataList-CUhRQAv6.js → DataList-B7ho6PrJ.js} +8 -8
- package/dist/{DataList-CUhRQAv6.js.map → DataList-B7ho6PrJ.js.map} +1 -1
- package/dist/{DataList-Cj0mfk19.cjs → DataList-DTIdllb-.cjs} +8 -8
- package/dist/{DataList-Cj0mfk19.cjs.map → DataList-DTIdllb-.cjs.map} +1 -1
- package/dist/{DataPanel-Coc9h35I.cjs → DataPanel-BRRAvWYQ.cjs} +10 -10
- package/dist/{DataPanel-Coc9h35I.cjs.map → DataPanel-BRRAvWYQ.cjs.map} +1 -1
- package/dist/{DataPanel-IgB9D5PO.js → DataPanel-pVr5LVaK.js} +10 -10
- package/dist/{DataPanel-IgB9D5PO.js.map → DataPanel-pVr5LVaK.js.map} +1 -1
- package/dist/{Dialog-BvWF9HE-.cjs → Dialog-Duy3M1ny.cjs} +3 -3
- package/dist/{Dialog-BvWF9HE-.cjs.map → Dialog-Duy3M1ny.cjs.map} +1 -1
- package/dist/{Dialog-DaWtxwd9.js → Dialog-OBPu3rl2.js} +3 -3
- package/dist/{Dialog-DaWtxwd9.js.map → Dialog-OBPu3rl2.js.map} +1 -1
- package/dist/{EmptyState-DxDHlYqD.cjs → EmptyState-Dc-sP95H.cjs} +2 -2
- package/dist/{EmptyState-DxDHlYqD.cjs.map → EmptyState-Dc-sP95H.cjs.map} +1 -1
- package/dist/{EmptyState-P-Gy898T.js → EmptyState-i88y1x75.js} +2 -2
- package/dist/{EmptyState-P-Gy898T.js.map → EmptyState-i88y1x75.js.map} +1 -1
- package/dist/{ErrorBoundary-B5GjmA6V.cjs → ErrorBoundary-Bwoum0sT.cjs} +3 -3
- package/dist/{ErrorBoundary-B5GjmA6V.cjs.map → ErrorBoundary-Bwoum0sT.cjs.map} +1 -1
- package/dist/{ErrorBoundary-Cat3KU86.js → ErrorBoundary-BzmaWe2y.js} +3 -3
- package/dist/{ErrorBoundary-Cat3KU86.js.map → ErrorBoundary-BzmaWe2y.js.map} +1 -1
- package/dist/{FilterBar-PSQ1OwqH.js → FilterBar-Kmn6gMgO.js} +14 -15
- package/dist/FilterBar-Kmn6gMgO.js.map +1 -0
- package/dist/{FilterBar-BSP2UTjc.cjs → FilterBar-jBz6yaNu.cjs} +13 -14
- package/dist/FilterBar-jBz6yaNu.cjs.map +1 -0
- package/dist/{LogsDataList-BI2C5OJz.js → LogsDataList-Cdo_U0Ei.js} +5 -5
- package/dist/{LogsDataList-BI2C5OJz.js.map → LogsDataList-Cdo_U0Ei.js.map} +1 -1
- package/dist/{LogsDataList-CCIfUPGo.cjs → LogsDataList-z0Y2X8P5.cjs} +5 -5
- package/dist/{LogsDataList-CCIfUPGo.cjs.map → LogsDataList-z0Y2X8P5.cjs.map} +1 -1
- package/dist/{MarkdownRenderer-y65WGBhC.cjs → MarkdownRenderer-CUYpmuPh.cjs} +6 -6
- package/dist/{MarkdownRenderer-y65WGBhC.cjs.map → MarkdownRenderer-CUYpmuPh.cjs.map} +1 -1
- package/dist/{MarkdownRenderer-CI30RqdB.js → MarkdownRenderer-CY8LGt-l.js} +6 -6
- package/dist/{MarkdownRenderer-CI30RqdB.js.map → MarkdownRenderer-CY8LGt-l.js.map} +1 -1
- package/dist/MarkdownRenderer.css +77 -6
- package/dist/{Message-jj56lxNL.cjs → Message-CgO_SxI4.cjs} +20 -9
- package/dist/Message-CgO_SxI4.cjs.map +1 -0
- package/dist/{Message-CWzi5F_Q.js → Message-DnnCoSef.js} +20 -9
- package/dist/{Message-CWzi5F_Q.js.map → Message-DnnCoSef.js.map} +1 -1
- package/dist/{MessageScroller-CGsfTd1Z.cjs → MessageScroller-D-mK1uuu.cjs} +50 -26
- package/dist/MessageScroller-D-mK1uuu.cjs.map +1 -0
- package/dist/{MessageScroller-DvaKlm4O.js → MessageScroller-nV_zBF3H.js} +50 -26
- package/dist/MessageScroller-nV_zBF3H.js.map +1 -0
- package/dist/Metadata-5GJlO4GU.cjs +32 -0
- package/dist/Metadata-5GJlO4GU.cjs.map +1 -0
- package/dist/Metadata-DlVgmRTA.js +27 -0
- package/dist/Metadata-DlVgmRTA.js.map +1 -0
- package/dist/{MetricsCard-BEwiS7Pe.cjs → MetricsCard-DojbLiEx.cjs} +19 -6
- package/dist/MetricsCard-DojbLiEx.cjs.map +1 -0
- package/dist/{MetricsCard-ua6C6b8a.js → MetricsCard-kAqSCPPe.js} +20 -7
- package/dist/MetricsCard-kAqSCPPe.js.map +1 -0
- package/dist/{MetricsKpiCard-OHbAElTl.js → MetricsKpiCard-1blTbzUs.js} +6 -6
- package/dist/{MetricsKpiCard-OHbAElTl.js.map → MetricsKpiCard-1blTbzUs.js.map} +1 -1
- package/dist/{MetricsKpiCard-By_-sagx.cjs → MetricsKpiCard-C_9GvRAp.cjs} +6 -6
- package/dist/{MetricsKpiCard-By_-sagx.cjs.map → MetricsKpiCard-C_9GvRAp.cjs.map} +1 -1
- package/dist/{MetricsLineChart-4SwxBbQx.js → MetricsLineChart-4w5lpH63.js} +3 -3
- package/dist/{MetricsLineChart-4SwxBbQx.js.map → MetricsLineChart-4w5lpH63.js.map} +1 -1
- package/dist/{MetricsLineChart-tZxsauau.cjs → MetricsLineChart-BnY9JKzc.cjs} +3 -3
- package/dist/{MetricsLineChart-tZxsauau.cjs.map → MetricsLineChart-BnY9JKzc.cjs.map} +1 -1
- package/dist/{MetricsStackedBarChart-D2QyS4-z.js → MetricsStackedBarChart-Bmk0OjYp.js} +7 -7
- package/dist/{MetricsStackedBarChart-D2QyS4-z.js.map → MetricsStackedBarChart-Bmk0OjYp.js.map} +1 -1
- package/dist/{MetricsStackedBarChart-CDLE76IB.cjs → MetricsStackedBarChart-CJQF99sc.cjs} +7 -7
- package/dist/{MetricsStackedBarChart-CDLE76IB.cjs.map → MetricsStackedBarChart-CJQF99sc.cjs.map} +1 -1
- package/dist/{MetricsTable-BSl81oNe.cjs → MetricsTable-CvMoo2vg.cjs} +3 -3
- package/dist/{MetricsTable-BSl81oNe.cjs.map → MetricsTable-CvMoo2vg.cjs.map} +1 -1
- package/dist/{MetricsTable-DID6LRoP.js → MetricsTable-DIjbD5Xk.js} +3 -3
- package/dist/{MetricsTable-DID6LRoP.js.map → MetricsTable-DIjbD5Xk.js.map} +1 -1
- package/dist/{Notice-JZ7SW7q6.cjs → Notice-B_KjMmA6.cjs} +3 -3
- package/dist/{Notice-JZ7SW7q6.cjs.map → Notice-B_KjMmA6.cjs.map} +1 -1
- package/dist/{Notice-C-8oOZZF.js → Notice-OSlG42lD.js} +2 -2
- package/dist/{Notice-C-8oOZZF.js.map → Notice-OSlG42lD.js.map} +1 -1
- package/dist/{PageLayout-DFRzcnkf.cjs → PageLayout-C0Fo3ZQC.cjs} +3 -3
- package/dist/{PageLayout-DFRzcnkf.cjs.map → PageLayout-C0Fo3ZQC.cjs.map} +1 -1
- package/dist/{PageLayout-CyM_Op3c.js → PageLayout-DLll7ZwB.js} +3 -3
- package/dist/{PageLayout-CyM_Op3c.js.map → PageLayout-DLll7ZwB.js.map} +1 -1
- package/dist/{SankeyChart-E68mYEs2.js → SankeyChart-lkM5cpOC.js} +3 -3
- package/dist/{SankeyChart-E68mYEs2.js.map → SankeyChart-lkM5cpOC.js.map} +1 -1
- package/dist/{SankeyChart-DHeJ45KN.cjs → SankeyChart-m50vrsBS.cjs} +3 -3
- package/dist/{SankeyChart-DHeJ45KN.cjs.map → SankeyChart-m50vrsBS.cjs.map} +1 -1
- package/dist/{Section-CyGQZR7U.cjs → Section-B8MIbDDs.cjs} +3 -3
- package/dist/{Section-CyGQZR7U.cjs.map → Section-B8MIbDDs.cjs.map} +1 -1
- package/dist/{Section-CWFQ8jNS.js → Section-C9Fgv-IF.js} +3 -3
- package/dist/{Section-CWFQ8jNS.js.map → Section-C9Fgv-IF.js.map} +1 -1
- package/dist/{ShareBar-3Z5np-NY.cjs → ShareBar-DERy_egz.cjs} +2 -2
- package/dist/{ShareBar-3Z5np-NY.cjs.map → ShareBar-DERy_egz.cjs.map} +1 -1
- package/dist/{ShareBar-D6dWWl4C.js → ShareBar-KrzzdcyI.js} +2 -2
- package/dist/{ShareBar-D6dWWl4C.js.map → ShareBar-KrzzdcyI.js.map} +1 -1
- package/dist/{Tree-BplQcY8u.cjs → Tree-Caz4FTCU.cjs} +3 -3
- package/dist/{Tree-BplQcY8u.cjs.map → Tree-Caz4FTCU.cjs.map} +1 -1
- package/dist/{Tree-CoLkeBCL.js → Tree-od43gLMO.js} +3 -3
- package/dist/{Tree-CoLkeBCL.js.map → Tree-od43gLMO.js.map} +1 -1
- package/dist/{Txt-BM6TVV_c.js → Txt-5efBsb2p.js} +2 -2
- package/dist/{Txt-BM6TVV_c.js.map → Txt-5efBsb2p.js.map} +1 -1
- package/dist/{Txt-BnoSqxKE.cjs → Txt-_00wWxTd.cjs} +2 -2
- package/dist/{Txt-BnoSqxKE.cjs.map → Txt-_00wWxTd.cjs.map} +1 -1
- package/dist/{Workflow-DSWQ-ROz.cjs → Workflow-XR5L-3cJ.cjs} +15 -14
- package/dist/Workflow-XR5L-3cJ.cjs.map +1 -0
- package/dist/{Workflow-C3SlEdP-.js → Workflow-mIbUYdv0.js} +15 -14
- package/dist/Workflow-mIbUYdv0.js.map +1 -0
- package/dist/{activity-CcQZeDYi.cjs → activity-BprmG6yH.cjs} +10 -10
- package/dist/activity-BprmG6yH.cjs.map +1 -0
- package/dist/{activity-C8Ql81WM.js → activity-ClFChYfl.js} +10 -10
- package/dist/activity-ClFChYfl.js.map +1 -0
- package/dist/annotations.css +8 -0
- package/dist/{ask-user-DPznrqGO.js → ask-user-D4ezQ6pt.js} +5 -5
- package/dist/{ask-user-DPznrqGO.js.map → ask-user-D4ezQ6pt.js.map} +1 -1
- package/dist/{ask-user-C1p2PEYe.cjs → ask-user-DcnUNMM5.cjs} +5 -5
- package/dist/{ask-user-C1p2PEYe.cjs.map → ask-user-DcnUNMM5.cjs.map} +1 -1
- package/dist/{buttons-group-DkFlnMiL.js → buttons-group-DA_wORqQ.js} +2 -2
- package/dist/{buttons-group-DkFlnMiL.js.map → buttons-group-DA_wORqQ.js.map} +1 -1
- package/dist/{buttons-group-Dc6R7YSs.cjs → buttons-group-DM6_Kohs.cjs} +2 -2
- package/dist/{buttons-group-Dc6R7YSs.cjs.map → buttons-group-DM6_Kohs.cjs.map} +1 -1
- package/dist/chat-shell-context-0m1GVhS7.js +16 -0
- package/dist/chat-shell-context-0m1GVhS7.js.map +1 -0
- package/dist/chat-shell-context-ONCslAGn.cjs +39 -0
- package/dist/chat-shell-context-ONCslAGn.cjs.map +1 -0
- package/dist/{clear-filters-button-CNrRuHOY.js → clear-filters-button-C79dzuzA.js} +2 -2
- package/dist/{clear-filters-button-CNrRuHOY.js.map → clear-filters-button-C79dzuzA.js.map} +1 -1
- package/dist/{clear-filters-button-Buc973vw.cjs → clear-filters-button-CCO-y7kt.cjs} +2 -2
- package/dist/{clear-filters-button-Buc973vw.cjs.map → clear-filters-button-CCO-y7kt.cjs.map} +1 -1
- package/dist/{combobox-DIT_6xiG.cjs → combobox-i723LxeC.cjs} +33 -29
- package/dist/combobox-i723LxeC.cjs.map +1 -0
- package/dist/{combobox-D21no8t5.js → combobox-lbSxWRMl.js} +33 -29
- package/dist/combobox-lbSxWRMl.js.map +1 -0
- package/dist/{combobox-parts-C4phOq4t.cjs → combobox-parts-BeNqgCbj.cjs} +27 -12
- package/dist/combobox-parts-BeNqgCbj.cjs.map +1 -0
- package/dist/{combobox-parts-D90ir0Py.js → combobox-parts-C9o4UfH_.js} +22 -13
- package/dist/combobox-parts-C9o4UfH_.js.map +1 -0
- package/dist/components/AgentIndicator.cjs.js +1 -1
- package/dist/components/AgentIndicator.es.js +1 -1
- package/dist/components/AlertDialog.cjs.js +2 -2
- package/dist/components/AlertDialog.es.js +2 -2
- package/dist/components/AttachmentCard.cjs.js +1 -1
- package/dist/components/AttachmentCard.es.js +1 -1
- package/dist/components/Avatar.cjs.js +1 -1
- package/dist/components/Avatar.es.js +1 -1
- package/dist/components/Badge.cjs.js +1 -1
- package/dist/components/Badge.es.js +1 -1
- package/dist/components/Breadcrumb.cjs.js +6 -5
- package/dist/components/Breadcrumb.cjs.js.map +1 -1
- package/dist/components/Breadcrumb.es.js +6 -5
- package/dist/components/Breadcrumb.es.js.map +1 -1
- package/dist/components/Button.cjs.js +2 -2
- package/dist/components/Button.es.js +2 -2
- package/dist/components/ButtonsGroup.cjs.js +1 -1
- package/dist/components/ButtonsGroup.es.js +1 -1
- package/dist/components/Card.cjs.js +1 -1
- package/dist/components/Card.es.js +1 -1
- package/dist/components/ChartSkeleton.cjs.js +2 -2
- package/dist/components/ChartSkeleton.es.js +2 -2
- package/dist/components/ChartTooltip.cjs.js +1 -1
- package/dist/components/ChartTooltip.es.js +1 -1
- package/dist/components/ChatShell.cjs.js +33 -9
- package/dist/components/ChatShell.cjs.js.map +1 -1
- package/dist/components/ChatShell.es.js +33 -9
- package/dist/components/ChatShell.es.js.map +1 -1
- package/dist/components/Checkbox.cjs.js +1 -1
- package/dist/components/Checkbox.es.js +1 -1
- package/dist/components/ClampedText.cjs.js +3 -3
- package/dist/components/ClampedText.es.js +3 -3
- package/dist/components/ClearFiltersButton.cjs.js +1 -1
- package/dist/components/ClearFiltersButton.es.js +1 -1
- package/dist/components/CodeBlock.cjs.js +5 -5
- package/dist/components/CodeBlock.es.js +5 -5
- package/dist/components/CodeDiff.cjs.js +3 -3
- package/dist/components/CodeDiff.es.js +2 -2
- package/dist/components/CodeEditor.cjs.js +1 -1
- package/dist/components/CodeEditor.es.js +1 -1
- package/dist/components/Collapsible.cjs.js +1 -1
- package/dist/components/Collapsible.es.js +1 -1
- package/dist/components/CollapsibleBox.cjs.js +1 -1
- package/dist/components/CollapsibleBox.es.js +1 -1
- package/dist/components/Combobox.cjs.js +2 -2
- package/dist/components/Combobox.es.js +2 -2
- package/dist/components/Command.cjs.js +5 -5
- package/dist/components/Command.es.js +5 -5
- package/dist/components/CommandPalette.cjs.js +7 -7
- package/dist/components/CommandPalette.cjs.js.map +1 -1
- package/dist/components/CommandPalette.es.js +7 -7
- package/dist/components/CommandPalette.es.js.map +1 -1
- package/dist/components/Comment.cjs.js +1 -1
- package/dist/components/Comment.es.js +1 -1
- package/dist/components/CompactNumber.cjs.js +2 -2
- package/dist/components/CompactNumber.es.js +2 -2
- package/dist/components/Composer.cjs.js +1 -1
- package/dist/components/Composer.es.js +1 -1
- package/dist/components/ContextMenu.cjs.js +1 -1
- package/dist/components/ContextMenu.es.js +1 -1
- package/dist/components/CopyButton.cjs.js +1 -1
- package/dist/components/CopyButton.es.js +1 -1
- package/dist/components/DataCodeSection.cjs.js +1 -1
- package/dist/components/DataCodeSection.es.js +1 -1
- package/dist/components/DataDetailsPanel.cjs.js +1 -1
- package/dist/components/DataDetailsPanel.es.js +1 -1
- package/dist/components/DataKeysAndValues.cjs.js +1 -1
- package/dist/components/DataKeysAndValues.es.js +1 -1
- package/dist/components/DataList.cjs.js +3 -3
- package/dist/components/DataList.es.js +3 -3
- package/dist/components/DataPanel.cjs.js +1 -1
- package/dist/components/DataPanel.es.js +1 -1
- package/dist/components/DateRangeTimeline.cjs.js +9 -9
- package/dist/components/DateRangeTimeline.cjs.js.map +1 -1
- package/dist/components/DateRangeTimeline.es.js +9 -9
- package/dist/components/DateRangeTimeline.es.js.map +1 -1
- package/dist/components/DateTimePicker.cjs.js +75 -142
- package/dist/components/DateTimePicker.cjs.js.map +1 -1
- package/dist/components/DateTimePicker.es.js +79 -146
- package/dist/components/DateTimePicker.es.js.map +1 -1
- package/dist/components/DateTimeRangePicker.cjs.js +1 -1
- package/dist/components/DateTimeRangePicker.es.js +1 -1
- package/dist/components/Dialog.cjs.js +1 -1
- package/dist/components/Dialog.es.js +1 -1
- package/dist/components/DiffStat.cjs.js +1 -1
- package/dist/components/DiffStat.es.js +1 -1
- package/dist/components/DisabledFeatureButton.cjs.js +3 -3
- package/dist/components/DisabledFeatureButton.es.js +3 -3
- package/dist/components/DisclosureChevron.cjs.js +1 -1
- package/dist/components/DisclosureChevron.es.js +1 -1
- package/dist/components/Drawer.cjs.js +2 -2
- package/dist/components/Drawer.es.js +2 -2
- package/dist/components/DropdownMenu.cjs.js +1 -1
- package/dist/components/DropdownMenu.es.js +1 -1
- package/dist/components/EmptyState.cjs.js +1 -1
- package/dist/components/EmptyState.es.js +1 -1
- package/dist/components/Entity.cjs.js +3 -3
- package/dist/components/Entity.es.js +3 -3
- package/dist/components/EntityHeader.cjs.js +2 -2
- package/dist/components/EntityHeader.es.js +2 -2
- package/dist/components/Entry.cjs.js +1 -1
- package/dist/components/Entry.es.js +1 -1
- package/dist/components/EnvironmentVariablesEditor.cjs.js +6 -6
- package/dist/components/EnvironmentVariablesEditor.es.js +6 -6
- package/dist/components/ErrorBoundary.cjs.js +1 -1
- package/dist/components/ErrorBoundary.es.js +1 -1
- package/dist/components/Field.cjs.js +2 -2
- package/dist/components/Field.es.js +2 -2
- package/dist/components/FileDropBackdrop.cjs.js +1 -1
- package/dist/components/FileDropBackdrop.es.js +1 -1
- package/dist/components/FilterBar.cjs.js +3 -3
- package/dist/components/FilterBar.es.js +3 -3
- package/dist/components/FormFieldBlocks.cjs.js +5 -5
- package/dist/components/FormFieldBlocks.es.js +6 -6
- package/dist/components/Header.cjs.js +1 -1
- package/dist/components/Header.es.js +1 -1
- package/dist/components/HoverCard.cjs.js +1 -1
- package/dist/components/HoverCard.es.js +1 -1
- package/dist/components/Input.cjs.js +1 -1
- package/dist/components/Input.es.js +1 -1
- package/dist/components/InputGroup.cjs.js +1 -1
- package/dist/components/InputGroup.es.js +1 -1
- package/dist/components/InputNumber.cjs.js +3 -3
- package/dist/components/InputNumber.es.js +3 -3
- package/dist/components/JSONSchemaForm.cjs.js +4 -4
- package/dist/components/JSONSchemaForm.es.js +4 -4
- package/dist/components/Kbd.cjs.js +1 -1
- package/dist/components/Kbd.es.js +1 -1
- package/dist/components/KeyValueList.cjs.js +2 -2
- package/dist/components/KeyValueList.es.js +2 -2
- package/dist/components/ListSearch.cjs.js +1 -1
- package/dist/components/ListSearch.es.js +1 -1
- package/dist/components/LogsDataList.cjs.js +2 -2
- package/dist/components/LogsDataList.es.js +2 -2
- package/dist/components/MainHeader.cjs.js +1 -1
- package/dist/components/MainHeader.es.js +1 -1
- package/dist/components/MarkdownRenderer.cjs.js +1 -1
- package/dist/components/MarkdownRenderer.es.js +1 -1
- package/dist/components/Message.cjs.js +1 -1
- package/dist/components/Message.es.js +1 -1
- package/dist/components/MessageScroller.cjs.js +1 -1
- package/dist/components/MessageScroller.es.js +1 -1
- package/dist/components/Metadata.cjs.js +3 -0
- package/dist/components/Metadata.d.ts +1 -0
- package/dist/components/Metadata.es.js +1 -0
- package/dist/components/Meter.cjs.js +3 -3
- package/dist/components/Meter.es.js +3 -3
- package/dist/components/MetricsCard.cjs.js +1 -1
- package/dist/components/MetricsCard.es.js +1 -1
- package/dist/components/MetricsKpiCard.cjs.js +1 -1
- package/dist/components/MetricsKpiCard.es.js +1 -1
- package/dist/components/MetricsLineChart.cjs.js +1 -1
- package/dist/components/MetricsLineChart.es.js +1 -1
- package/dist/components/MetricsStackedBarChart.cjs.js +1 -1
- package/dist/components/MetricsStackedBarChart.es.js +1 -1
- package/dist/components/MetricsTable.cjs.js +1 -1
- package/dist/components/MetricsTable.es.js +1 -1
- package/dist/components/Notice.cjs.js +1 -1
- package/dist/components/Notice.es.js +1 -1
- package/dist/components/PageHeader.cjs.js +1 -1
- package/dist/components/PageHeader.es.js +1 -1
- package/dist/components/PageLayout.cjs.js +1 -1
- package/dist/components/PageLayout.es.js +1 -1
- package/dist/components/Popover.cjs.js +1 -1
- package/dist/components/Popover.es.js +1 -1
- package/dist/components/PrevNextNav.cjs.js +1 -1
- package/dist/components/PrevNextNav.es.js +1 -1
- package/dist/components/ProductAvatar.cjs.js +2 -2
- package/dist/components/ProductAvatar.es.js +2 -2
- package/dist/components/ProductBadge.cjs.js +2 -2
- package/dist/components/ProductBadge.es.js +2 -2
- package/dist/components/PropertyFilter.cjs.js +9 -9
- package/dist/components/PropertyFilter.cjs.js.map +1 -1
- package/dist/components/PropertyFilter.es.js +9 -9
- package/dist/components/PropertyFilter.es.js.map +1 -1
- package/dist/components/RadioGroup.cjs.js +1 -1
- package/dist/components/RadioGroup.es.js +1 -1
- package/dist/components/RelativeTimestamp.cjs.js +6 -30
- package/dist/components/RelativeTimestamp.cjs.js.map +1 -1
- package/dist/components/RelativeTimestamp.es.js +7 -31
- package/dist/components/RelativeTimestamp.es.js.map +1 -1
- package/dist/components/RuleBuilder.cjs.js +22 -22
- package/dist/components/RuleBuilder.cjs.js.map +1 -1
- package/dist/components/RuleBuilder.es.js +5 -5
- package/dist/components/SankeyChart.cjs.js +1 -1
- package/dist/components/SankeyChart.es.js +1 -1
- package/dist/components/SavedViews.cjs.js +9 -9
- package/dist/components/SavedViews.es.js +9 -9
- package/dist/components/ScatterPlotChart.cjs.js +2 -2
- package/dist/components/ScatterPlotChart.es.js +2 -2
- package/dist/components/ScrollArea.cjs.js +1 -1
- package/dist/components/ScrollArea.es.js +1 -1
- package/dist/components/SearchInput.cjs.js +2 -2
- package/dist/components/SearchInput.es.js +2 -2
- package/dist/components/Section.cjs.js +1 -1
- package/dist/components/Section.es.js +1 -1
- package/dist/components/SectionCard.cjs.js +1 -1
- package/dist/components/SectionCard.es.js +1 -1
- package/dist/components/SegmentedControl.cjs.js +3 -3
- package/dist/components/SegmentedControl.es.js +3 -3
- package/dist/components/Select.cjs.js +1 -1
- package/dist/components/Select.es.js +1 -1
- package/dist/components/ShareBar.cjs.js +1 -1
- package/dist/components/ShareBar.es.js +1 -1
- package/dist/components/SideDialog.cjs.js +8 -8
- package/dist/components/SideDialog.es.js +8 -8
- package/dist/components/Sidebar.cjs.js +14 -14
- package/dist/components/Sidebar.cjs.js.map +1 -1
- package/dist/components/Sidebar.es.js +15 -15
- package/dist/components/Sidebar.es.js.map +1 -1
- package/dist/components/Skeleton.cjs.js +1 -1
- package/dist/components/Skeleton.es.js +1 -1
- package/dist/components/Spinner.cjs.js +1 -1
- package/dist/components/Spinner.es.js +1 -1
- package/dist/components/StatusIndicators.cjs.js +3 -3
- package/dist/components/StatusIndicators.es.js +3 -3
- package/dist/components/Steps.cjs.js +73 -3
- package/dist/components/Steps.cjs.js.map +1 -1
- package/dist/components/Steps.es.js +73 -4
- package/dist/components/Steps.es.js.map +1 -1
- package/dist/components/Switch.cjs.js +2 -2
- package/dist/components/Switch.es.js +2 -2
- package/dist/components/Table.cjs.js +4 -4
- package/dist/components/Table.es.js +4 -4
- package/dist/components/Tabs.cjs.js +2 -2
- package/dist/components/Tabs.es.js +2 -2
- package/dist/components/Text.cjs.js +1 -1
- package/dist/components/Text.es.js +1 -1
- package/dist/components/Textarea.cjs.js +2 -2
- package/dist/components/Textarea.es.js +2 -2
- package/dist/components/ThinkingLevel.cjs.js +5 -5
- package/dist/components/ThinkingLevel.cjs.js.map +1 -1
- package/dist/components/ThinkingLevel.es.js +5 -5
- package/dist/components/ThinkingLevel.es.js.map +1 -1
- package/dist/components/ThreadList.cjs.js +2 -2
- package/dist/components/ThreadList.es.js +2 -2
- package/dist/components/ThreadRail.cjs.js +8 -8
- package/dist/components/ThreadRail.cjs.js.map +1 -1
- package/dist/components/ThreadRail.es.js +8 -8
- package/dist/components/ThreadRail.es.js.map +1 -1
- package/dist/components/Toaster.cjs.js +4 -4
- package/dist/components/Toaster.es.js +3 -3
- package/dist/components/TokenBudget.cjs.js +3 -3
- package/dist/components/TokenBudget.es.js +2 -2
- package/dist/components/Tooltip.cjs.js +2 -2
- package/dist/components/Tooltip.es.js +2 -2
- package/dist/components/Tree.cjs.js +1 -1
- package/dist/components/Tree.es.js +1 -1
- package/dist/components/Truncate.cjs.js +3 -3
- package/dist/components/Truncate.es.js +3 -3
- package/dist/components/Txt.cjs.js +1 -1
- package/dist/components/Txt.es.js +1 -1
- package/dist/components/Workflow.cjs.js +1 -1
- package/dist/components/Workflow.es.js +1 -1
- package/dist/components/ai/activity.cjs.js +1 -1
- package/dist/components/ai/activity.es.js +1 -1
- package/dist/components/ai/annotations.cjs.js +836 -0
- package/dist/components/ai/annotations.cjs.js.map +1 -0
- package/dist/components/ai/annotations.d.ts +1 -0
- package/dist/components/ai/annotations.es.js +831 -0
- package/dist/components/ai/annotations.es.js.map +1 -0
- package/dist/components/ai/ask-user.cjs.js +1 -1
- package/dist/components/ai/ask-user.es.js +1 -1
- package/dist/components/ai/plan.cjs.js +6 -6
- package/dist/components/ai/plan.es.js +6 -6
- package/dist/components/ai/task-list.cjs.js +4 -4
- package/dist/components/ai/task-list.cjs.js.map +1 -1
- package/dist/components/ai/task-list.es.js +4 -4
- package/dist/components/ai/task-list.es.js.map +1 -1
- package/dist/components/ai/tool-approval.cjs.js +1 -1
- package/dist/components/ai/tool-approval.es.js +1 -1
- package/dist/components/ai/tool-call.cjs.js +7 -2
- package/dist/components/ai/tool-call.es.js +3 -3
- package/dist/components/ai/transcript-divider.cjs.js +1 -1
- package/dist/components/ai/transcript-divider.es.js +1 -1
- package/dist/{context-menu-Dv0NU0oM.js → context-menu-6_Kcs8kj.js} +3 -3
- package/dist/{context-menu-Dv0NU0oM.js.map → context-menu-6_Kcs8kj.js.map} +1 -1
- package/dist/{context-menu-DTFPCyae.cjs → context-menu-DwB7u7fB.cjs} +3 -3
- package/dist/{context-menu-DTFPCyae.cjs.map → context-menu-DwB7u7fB.cjs.map} +1 -1
- package/dist/{copy-button-BXrbevLn.js → copy-button-B-_Z6N6y.js} +2 -2
- package/dist/{copy-button-BXrbevLn.js.map → copy-button-B-_Z6N6y.js.map} +1 -1
- package/dist/{copy-button-DJAQ6_3o.cjs → copy-button-DuEUYvS2.cjs} +2 -2
- package/dist/{copy-button-DJAQ6_3o.cjs.map → copy-button-DuEUYvS2.cjs.map} +1 -1
- package/dist/{data-list-C4Vmq5HA.cjs → data-list-072hHK9L.cjs} +7 -7
- package/dist/{data-list-C4Vmq5HA.cjs.map → data-list-072hHK9L.cjs.map} +1 -1
- package/dist/{data-list-DHCOoLmj.js → data-list-GzbzPmYR.js} +7 -7
- package/dist/{data-list-DHCOoLmj.js.map → data-list-GzbzPmYR.js.map} +1 -1
- package/dist/{date-time-range-picker-CWGjoR3j.cjs → date-time-range-picker-Bq-8IPtS.cjs} +141 -112
- package/dist/date-time-range-picker-Bq-8IPtS.cjs.map +1 -0
- package/dist/{date-time-range-picker-CdSiXwB4.js → date-time-range-picker-DdNgKD87.js} +144 -115
- package/dist/date-time-range-picker-DdNgKD87.js.map +1 -0
- package/dist/domains/auth/components/permission-denied.cjs.js +1 -1
- package/dist/domains/auth/components/permission-denied.es.js +1 -1
- package/dist/domains/auth/components/session-expired.cjs.js +3 -3
- package/dist/domains/auth/components/session-expired.es.js +3 -3
- package/dist/domains/chat/activity/activity-stretch-line.cjs.js +2 -2
- package/dist/domains/chat/activity/activity-stretch-line.es.js +2 -2
- package/dist/domains/chat/activity/components/activity-fold.cjs.js +54 -58
- package/dist/domains/chat/activity/components/activity-fold.cjs.js.map +1 -1
- package/dist/domains/chat/activity/components/activity-fold.es.js +54 -58
- package/dist/domains/chat/activity/components/activity-fold.es.js.map +1 -1
- package/dist/domains/chat/activity/components/calls-panel.cjs.js +2 -2
- package/dist/domains/chat/activity/components/calls-panel.es.js +2 -2
- package/dist/domains/chat/activity/components/stretch-content.cjs.js +2 -2
- package/dist/domains/chat/activity/components/stretch-content.es.js +2 -2
- package/dist/domains/chat/activity/components/stretch-thought.cjs.js +1 -1
- package/dist/domains/chat/activity/components/stretch-thought.es.js +1 -1
- package/dist/domains/chat/activity/model/activity-segments.cjs.js +1 -1
- package/dist/domains/chat/activity/model/activity-segments.es.js +1 -1
- package/dist/domains/chat/activity/model/activity-words.cjs.js +7 -11
- package/dist/domains/chat/activity/model/activity-words.cjs.js.map +1 -1
- package/dist/domains/chat/activity/model/activity-words.es.js +8 -11
- package/dist/domains/chat/activity/model/activity-words.es.js.map +1 -1
- package/dist/domains/chat/activity.cjs.js +2 -5
- package/dist/domains/chat/activity.es.js +4 -5
- package/dist/domains/chat/attachments/attachment-preview-dialog.cjs.js +3 -3
- package/dist/domains/chat/attachments/attachment-preview-dialog.es.js +3 -3
- package/dist/domains/chat/attachments/composer-attachment-entry.cjs.js +2 -2
- package/dist/domains/chat/attachments/composer-attachment-entry.es.js +2 -2
- package/dist/domains/chat/attachments/composer-attachment-list.cjs.js +2 -2
- package/dist/domains/chat/attachments/composer-attachment-list.es.js +2 -2
- package/dist/domains/chat/attachments/composer-attachment.cjs.js +4 -4
- package/dist/domains/chat/attachments/composer-attachment.es.js +4 -4
- package/dist/domains/chat/attachments/message-attachment.cjs.js +2 -2
- package/dist/domains/chat/attachments/message-attachment.es.js +2 -2
- package/dist/domains/chat/attachments/message-image-attachment.cjs.js +2 -2
- package/dist/domains/chat/attachments/message-image-attachment.cjs.js.map +1 -1
- package/dist/domains/chat/attachments/message-image-attachment.es.js +2 -2
- package/dist/domains/chat/attachments/message-image-attachment.es.js.map +1 -1
- package/dist/domains/chat/components/badge-wrapper.cjs.js +2 -2
- package/dist/domains/chat/components/badge-wrapper.es.js +2 -2
- package/dist/domains/chat/components/loading-badge.cjs.js +2 -2
- package/dist/domains/chat/components/loading-badge.es.js +2 -2
- package/dist/domains/chat/components/network-choice-metadata-dialog.cjs.js +4 -4
- package/dist/domains/chat/components/network-choice-metadata-dialog.es.js +4 -4
- package/dist/domains/chat/components/section-label.cjs.js +1 -1
- package/dist/domains/chat/components/section-label.es.js +1 -1
- package/dist/domains/chat/context/chat-context.cjs.js +2 -0
- package/dist/domains/chat/context/chat-context.cjs.js.map +1 -1
- package/dist/domains/chat/context/chat-context.es.js +2 -1
- package/dist/domains/chat/context/chat-context.es.js.map +1 -1
- package/dist/domains/chat/knowledge/knowledge-links.cjs.js +1 -1
- package/dist/domains/chat/knowledge/knowledge-links.es.js +1 -1
- package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js +3 -3
- package/dist/domains/chat/knowledge/pinned-knowledge.es.js +3 -3
- package/dist/domains/chat/knowledge.cjs.js +1 -1
- package/dist/domains/chat/knowledge.es.js +1 -1
- package/dist/domains/chat/messages/assistant-message-actions.cjs.js +2 -2
- package/dist/domains/chat/messages/assistant-message-actions.es.js +2 -2
- package/dist/domains/chat/messages/dataset-save-action.cjs.js +10 -10
- package/dist/domains/chat/messages/dataset-save-action.es.js +11 -11
- package/dist/domains/chat/messages/message-row.cjs.js +20 -20
- package/dist/domains/chat/messages/message-row.cjs.js.map +1 -1
- package/dist/domains/chat/messages/message-row.es.js +20 -20
- package/dist/domains/chat/messages/message-row.es.js.map +1 -1
- package/dist/domains/chat/messages/notification-signal-notice.cjs.js +5 -5
- package/dist/domains/chat/messages/notification-signal-notice.cjs.js.map +1 -1
- package/dist/domains/chat/messages/notification-signal-notice.es.js +5 -5
- package/dist/domains/chat/messages/notification-signal-notice.es.js.map +1 -1
- package/dist/domains/chat/messages/reasoning-content.cjs.js +1 -1
- package/dist/domains/chat/messages/reasoning-content.es.js +1 -1
- package/dist/domains/chat/messages/renderers/data-part-renderer.cjs.js +1 -1
- package/dist/domains/chat/messages/renderers/data-part-renderer.es.js +1 -1
- package/dist/domains/chat/messages/renderers/message-text.cjs.js +5 -5
- package/dist/domains/chat/messages/renderers/message-text.es.js +5 -5
- package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js +1 -1
- package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js +1 -1
- package/dist/domains/chat/messages/renderers/status-renderers.cjs.js +1 -1
- package/dist/domains/chat/messages/renderers/status-renderers.es.js +1 -1
- package/dist/domains/chat/messages/renderers/user-file-part-renderer.cjs.js +1 -1
- package/dist/domains/chat/messages/renderers/user-file-part-renderer.es.js +1 -1
- package/dist/domains/chat/messages/signal-badge.cjs.js +5 -5
- package/dist/domains/chat/messages/signal-badge.es.js +5 -5
- package/dist/domains/chat/messages/skill-message.cjs.js +4 -4
- package/dist/domains/chat/messages/skill-message.es.js +4 -4
- package/dist/domains/chat/messages/system-reminder-badge.cjs.js +1 -1
- package/dist/domains/chat/messages/system-reminder-badge.es.js +1 -1
- package/dist/domains/chat/messages/tripwire-notice.cjs.js +4 -4
- package/dist/domains/chat/messages/tripwire-notice.es.js +4 -4
- package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/ask-user-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/ask-user-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/background-task-metadata-dialog.cjs.js +5 -5
- package/dist/domains/chat/tools/badges/background-task-metadata-dialog.es.js +5 -5
- package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js +7 -6
- package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/code-mode-badge.es.js +7 -6
- package/dist/domains/chat/tools/badges/code-mode-badge.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/file-tree-badge.cjs.js +5 -5
- package/dist/domains/chat/tools/badges/file-tree-badge.es.js +5 -5
- package/dist/domains/chat/tools/badges/knowledge-body-range.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/knowledge-body-range.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/knowledge-body-range.es.js +2 -2
- package/dist/domains/chat/tools/badges/knowledge-body-range.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js +34 -28
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js +34 -28
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js +28 -24
- package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/mcp-task-chip.es.js +28 -24
- package/dist/domains/chat/tools/badges/mcp-task-chip.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +4 -4
- package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +4 -4
- package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js +8 -7
- package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/observation-marker-details.es.js +8 -7
- package/dist/domains/chat/tools/badges/observation-marker-details.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +3 -3
- package/dist/domains/chat/tools/badges/observation-renderer.es.js +3 -3
- package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js +25 -34
- package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +27 -36
- package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/tool-approval-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/tool-approval-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/tool-badge.cjs.js +19 -26
- package/dist/domains/chat/tools/badges/tool-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/tool-badge.es.js +19 -26
- package/dist/domains/chat/tools/badges/tool-badge.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +12 -10
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.es.js +12 -10
- package/dist/domains/chat/tools/badges/workflow-badge.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/workspace-data-parts.cjs.js +13 -0
- package/dist/domains/chat/tools/badges/workspace-data-parts.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/workspace-data-parts.es.js +13 -1
- package/dist/domains/chat/tools/badges/workspace-data-parts.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/workspace-link.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/workspace-link.es.js +1 -1
- package/dist/domains/chat/tools/connect-prompt-tool.cjs.js +8 -8
- package/dist/domains/chat/tools/connect-prompt-tool.es.js +8 -8
- package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js +5 -5
- package/dist/domains/chat/tools/mcp-input-request-tool.es.js +5 -5
- package/dist/domains/chat/tools/submit-plan-tool.cjs.js +4 -4
- package/dist/domains/chat/tools/submit-plan-tool.es.js +4 -4
- package/dist/domains/chat/tools/tool-card-kind.cjs.js +10 -5
- package/dist/domains/chat/tools/tool-card-kind.cjs.js.map +1 -1
- package/dist/domains/chat/tools/tool-card-kind.es.js +10 -5
- package/dist/domains/chat/tools/tool-card-kind.es.js.map +1 -1
- package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
- package/dist/domains/chat/tools/tool-card.es.js +1 -1
- package/dist/domains/chat/tools/tool-groups.cjs.js +2 -2
- package/dist/domains/chat/tools/tool-groups.es.js +2 -2
- package/dist/domains/chat.cjs.js +6 -5
- package/dist/domains/chat.es.js +6 -6
- package/dist/domains/connect.cjs.js +1 -1
- package/dist/domains/connect.es.js +1 -1
- package/dist/domains/dashboards/components/dashboard-grid.cjs.js +11 -8
- package/dist/domains/dashboards/components/dashboard-grid.cjs.js.map +1 -1
- package/dist/domains/dashboards/components/dashboard-grid.es.js +11 -8
- package/dist/domains/dashboards/components/dashboard-grid.es.js.map +1 -1
- package/dist/domains/dashboards/components/dashboard-renderer.cjs.js +18 -7
- package/dist/domains/dashboards/components/dashboard-renderer.cjs.js.map +1 -1
- package/dist/domains/dashboards/components/dashboard-renderer.es.js +18 -7
- package/dist/domains/dashboards/components/dashboard-renderer.es.js.map +1 -1
- package/dist/domains/dashboards/components/widget-chrome.cjs.js +1 -1
- package/dist/domains/dashboards/components/widget-chrome.es.js +1 -1
- package/dist/domains/dashboards/components/widget-controls.cjs.js +16 -1
- package/dist/domains/dashboards/components/widget-controls.cjs.js.map +1 -1
- package/dist/domains/dashboards/components/widget-controls.es.js +16 -2
- package/dist/domains/dashboards/components/widget-controls.es.js.map +1 -1
- package/dist/domains/dashboards/components/widget-error.cjs.js +6 -3
- package/dist/domains/dashboards/components/widget-error.cjs.js.map +1 -1
- package/dist/domains/dashboards/components/widget-error.es.js +6 -3
- package/dist/domains/dashboards/components/widget-error.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/kpis/kpis-widget.cjs.js +18 -4
- package/dist/domains/dashboards/kinds/kpis/kpis-widget.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/kpis/kpis-widget.es.js +19 -5
- package/dist/domains/dashboards/kinds/kpis/kpis-widget.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/kpis.cjs.js +1 -1
- package/dist/domains/dashboards/kinds/kpis.es.js +1 -1
- package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js +18 -9
- package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/scores/scores-widget.es.js +18 -9
- package/dist/domains/dashboards/kinds/scores/scores-widget.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/table/table-cells.cjs.js +1 -1
- package/dist/domains/dashboards/kinds/table/table-cells.es.js +1 -1
- package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js +12 -5
- package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/table/table-tabs.es.js +12 -5
- package/dist/domains/dashboards/kinds/table/table-tabs.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/table/table-view.cjs.js +7 -7
- package/dist/domains/dashboards/kinds/table/table-view.es.js +7 -7
- package/dist/domains/dashboards/kinds/table/table-widget.cjs.js +5 -2
- package/dist/domains/dashboards/kinds/table/table-widget.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/table/table-widget.es.js +5 -2
- package/dist/domains/dashboards/kinds/table/table-widget.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/table.cjs.js +1 -1
- package/dist/domains/dashboards/kinds/table.es.js +1 -1
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js +21 -14
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js +22 -15
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/timeseries.cjs.js +1 -1
- package/dist/domains/dashboards/kinds/timeseries.es.js +1 -1
- package/dist/domains/dashboards/lib/chrome.cjs.js.map +1 -1
- package/dist/domains/dashboards/lib/chrome.es.js.map +1 -1
- package/dist/domains/dashboards/lib/format.cjs.js +1 -1
- package/dist/domains/dashboards/lib/format.es.js +1 -1
- package/dist/domains/dashboards/lib/pin-actions.cjs.js +16 -0
- package/dist/domains/dashboards/lib/pin-actions.cjs.js.map +1 -0
- package/dist/domains/dashboards/lib/pin-actions.d.ts +1 -0
- package/dist/domains/dashboards/lib/pin-actions.es.js +15 -0
- package/dist/domains/dashboards/lib/pin-actions.es.js.map +1 -0
- package/dist/domains/dashboards/lib/requests.cjs.js +2 -2
- package/dist/domains/dashboards/lib/requests.es.js +2 -2
- package/dist/domains/dashboards/widget-kind.cjs.js.map +1 -1
- package/dist/domains/dashboards/widget-kind.es.js.map +1 -1
- package/dist/domains/dashboards.cjs.js +11 -10
- package/dist/domains/dashboards.es.js +11 -11
- package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.cjs.js +11 -11
- package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.es.js +11 -11
- package/dist/domains/datasets/components/add-dataset-item-dialog/dataset-picker.cjs.js +3 -3
- package/dist/domains/datasets/components/add-dataset-item-dialog/dataset-picker.es.js +3 -3
- package/dist/domains/datasets/components/add-dataset-item-dialog/trajectory-editor.cjs.js +6 -6
- package/dist/domains/datasets/components/add-dataset-item-dialog/trajectory-editor.es.js +6 -6
- package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js +7 -7
- package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js +7 -7
- package/dist/domains/knowledge/components/KnowledgePageCard.cjs.js +3 -2
- package/dist/domains/knowledge/components/KnowledgePageCard.cjs.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageCard.es.js +3 -2
- package/dist/domains/knowledge/components/KnowledgePageCard.es.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js +11 -16
- package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageDetail.es.js +11 -16
- package/dist/domains/knowledge/components/KnowledgePageDetail.es.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js +5 -5
- package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js +5 -5
- package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js +11 -10
- package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageGraph.es.js +10 -9
- package/dist/domains/knowledge/components/KnowledgePageGraph.es.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js +1 -1
- package/dist/domains/knowledge/components/KnowledgePageTree.es.js +1 -1
- package/dist/domains/llm/models-dev-logo-slugs.cjs.js +230 -0
- package/dist/domains/llm/models-dev-logo-slugs.cjs.js.map +1 -0
- package/dist/domains/llm/models-dev-logo-slugs.d.ts +1 -0
- package/dist/domains/llm/models-dev-logo-slugs.es.js +229 -0
- package/dist/domains/llm/models-dev-logo-slugs.es.js.map +1 -0
- package/dist/domains/llm/provider-logo-monogram.cjs.js +37 -0
- package/dist/domains/llm/provider-logo-monogram.cjs.js.map +1 -0
- package/dist/domains/llm/provider-logo-monogram.d.ts +1 -0
- package/dist/domains/llm/provider-logo-monogram.es.js +36 -0
- package/dist/domains/llm/provider-logo-monogram.es.js.map +1 -0
- package/dist/domains/llm/provider-logo.cjs.js +46 -17
- package/dist/domains/llm/provider-logo.cjs.js.map +1 -1
- package/dist/domains/llm/provider-logo.es.js +46 -17
- package/dist/domains/llm/provider-logo.es.js.map +1 -1
- package/dist/domains/llm/provider-map-icon.cjs.js +1 -1
- package/dist/domains/llm/provider-map-icon.es.js +1 -1
- package/dist/domains/llm.cjs.js +1 -1
- package/dist/domains/llm.es.js +1 -1
- package/dist/domains/logs/components/log-data-panel.cjs.js +11 -7
- package/dist/domains/logs/components/log-data-panel.cjs.js.map +1 -1
- package/dist/domains/logs/components/log-data-panel.es.js +11 -7
- package/dist/domains/logs/components/log-data-panel.es.js.map +1 -1
- package/dist/domains/logs/components/logs-error-content.cjs.js +1 -1
- package/dist/domains/logs/components/logs-error-content.es.js +1 -1
- package/dist/domains/logs/components/logs-list-view.cjs.js +2 -2
- package/dist/domains/logs/components/logs-list-view.es.js +2 -2
- package/dist/domains/logs/components/logs-saved-views.cjs.js +1 -1
- package/dist/domains/logs/components/logs-saved-views.es.js +1 -1
- package/dist/domains/logs/components/logs-toolbar.cjs.js +1 -1
- package/dist/domains/logs/components/logs-toolbar.es.js +1 -1
- package/dist/domains/logs/components/no-logs-info.cjs.js +3 -3
- package/dist/domains/logs/components/no-logs-info.cjs.js.map +1 -1
- package/dist/domains/logs/components/no-logs-info.es.js +3 -3
- package/dist/domains/logs/components/no-logs-info.es.js.map +1 -1
- package/dist/domains/logs/hooks/use-logs-filter-persistence.cjs.js +1 -1
- package/dist/domains/logs/hooks/use-logs-filter-persistence.es.js +1 -1
- package/dist/domains/logs.cjs.js +2 -2
- package/dist/domains/logs.es.js +2 -2
- package/dist/domains/mcps/components/mcp-app-tool-result.cjs.js +7 -8
- package/dist/domains/mcps/components/mcp-app-tool-result.cjs.js.map +1 -1
- package/dist/domains/mcps/components/mcp-app-tool-result.es.js +6 -7
- package/dist/domains/mcps/components/mcp-app-tool-result.es.js.map +1 -1
- package/dist/domains/mcps/components/mcp-app-viewer.cjs.js +2 -108
- package/dist/domains/mcps/components/mcp-app-viewer.es.js +1 -108
- package/dist/domains/mcps/hooks/use-mcp-app-tool-call.cjs.js +36 -0
- package/dist/domains/mcps/hooks/use-mcp-app-tool-call.cjs.js.map +1 -0
- package/dist/domains/mcps/hooks/use-mcp-app-tool-call.d.ts +1 -0
- package/dist/domains/mcps/hooks/use-mcp-app-tool-call.es.js +35 -0
- package/dist/domains/mcps/hooks/use-mcp-app-tool-call.es.js.map +1 -0
- package/dist/domains/memory/components/flame-graph.cjs.js +4 -4
- package/dist/domains/memory/components/flame-graph.es.js +4 -4
- package/dist/domains/memory/components/memory-studio-panel.cjs.js +6 -6
- package/dist/domains/memory/components/memory-studio-panel.es.js +6 -6
- package/dist/domains/memory/components/observation-detail-view.cjs.js +6 -6
- package/dist/domains/memory/components/observation-detail-view.es.js +6 -6
- package/dist/domains/memory/components/thread-context-progress.cjs.js +2 -2
- package/dist/domains/memory/components/thread-context-progress.es.js +2 -2
- package/dist/domains/memory/components.cjs.js +1 -1
- package/dist/domains/memory/components.es.js +1 -1
- package/dist/domains/metrics/components/agent-runs-card.cjs.js +7 -7
- package/dist/domains/metrics/components/agent-runs-card.es.js +7 -7
- package/dist/domains/metrics/components/breakdown/breakdown-entity-tab.cjs.js +2 -2
- package/dist/domains/metrics/components/breakdown/breakdown-entity-tab.es.js +2 -2
- package/dist/domains/metrics/components/breakdown/breakdown-figure.cjs.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-figure.es.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-models-tab.cjs.js +2 -2
- package/dist/domains/metrics/components/breakdown/breakdown-models-tab.es.js +2 -2
- package/dist/domains/metrics/components/breakdown/breakdown-row-mark.cjs.js +2 -2
- package/dist/domains/metrics/components/breakdown/breakdown-row-mark.es.js +2 -2
- package/dist/domains/metrics/components/breakdown/breakdown-row-name.cjs.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-row-name.es.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-tab-body.cjs.js +2 -2
- package/dist/domains/metrics/components/breakdown/breakdown-tab-body.es.js +2 -2
- package/dist/domains/metrics/components/breakdown/breakdown-table.cjs.js +8 -8
- package/dist/domains/metrics/components/breakdown/breakdown-table.es.js +8 -8
- package/dist/domains/metrics/components/breakdown/breakdown-text.cjs.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-text.es.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-trace-tab.cjs.js +2 -2
- package/dist/domains/metrics/components/breakdown/breakdown-trace-tab.es.js +2 -2
- package/dist/domains/metrics/components/breakdown-card.cjs.js +4 -4
- package/dist/domains/metrics/components/breakdown-card.es.js +4 -4
- package/dist/domains/metrics/components/card-action-buttons.cjs.js +1 -1
- package/dist/domains/metrics/components/card-action-buttons.es.js +1 -1
- package/dist/domains/metrics/components/chart-area.cjs.js +1 -1
- package/dist/domains/metrics/components/chart-area.es.js +1 -1
- package/dist/domains/metrics/components/chart-card-error.cjs.js +2 -2
- package/dist/domains/metrics/components/chart-card-error.es.js +2 -2
- package/dist/domains/metrics/components/chart-card.cjs.js +21 -5
- package/dist/domains/metrics/components/chart-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/chart-card.es.js +21 -5
- package/dist/domains/metrics/components/chart-card.es.js.map +1 -1
- package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
- package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js +5 -5
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js +5 -5
- package/dist/domains/metrics/components/failure-rate-card.cjs.js +7 -7
- package/dist/domains/metrics/components/failure-rate-card.es.js +7 -7
- package/dist/domains/metrics/components/kpi-card.cjs.js +1 -1
- package/dist/domains/metrics/components/kpi-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/kpi-card.es.js +1 -1
- package/dist/domains/metrics/components/kpi-card.es.js.map +1 -1
- package/dist/domains/metrics/components/latency-card.cjs.js +7 -7
- package/dist/domains/metrics/components/latency-card.es.js +7 -7
- package/dist/domains/metrics/components/metrics-time-range-chip.cjs.js +2 -2
- package/dist/domains/metrics/components/metrics-time-range-chip.es.js +2 -2
- package/dist/domains/metrics/components/scores-card.cjs.js +4 -4
- package/dist/domains/metrics/components/scores-card.es.js +4 -4
- package/dist/domains/metrics/components/token-usage-card.cjs.js +8 -8
- package/dist/domains/metrics/components/token-usage-card.es.js +8 -8
- package/dist/domains/metrics/components/trace-aggregate-card.cjs.js +1 -1
- package/dist/domains/metrics/components/trace-aggregate-card.es.js +1 -1
- package/dist/domains/metrics/components/trace-volume-card.cjs.js +4 -4
- package/dist/domains/metrics/components/trace-volume-card.es.js +4 -4
- package/dist/domains/metrics/components/usage-card.cjs.js +5 -5
- package/dist/domains/metrics/components/usage-card.es.js +5 -5
- package/dist/domains/metrics/components.cjs.js +9 -9
- package/dist/domains/metrics/components.es.js +9 -9
- package/dist/domains/metrics/drilldown.cjs.js +1 -1
- package/dist/domains/metrics/drilldown.es.js +1 -1
- package/dist/domains/metrics/hooks/use-metrics-activity.cjs.js +1 -1
- package/dist/domains/metrics/hooks/use-metrics-activity.es.js +1 -1
- package/dist/domains/metrics/hooks/use-metrics-latency.cjs.js +1 -1
- package/dist/domains/metrics/hooks/use-metrics-latency.es.js +1 -1
- package/dist/domains/metrics/hooks/use-metrics-scores.cjs.js +1 -1
- package/dist/domains/metrics/hooks/use-metrics-scores.es.js +1 -1
- package/dist/domains/metrics/hooks/use-metrics-span-aggregate.cjs.js +2 -2
- package/dist/domains/metrics/hooks/use-metrics-span-aggregate.es.js +2 -2
- package/dist/domains/metrics/hooks/use-metrics-trace-aggregate.cjs.js +1 -1
- package/dist/domains/metrics/hooks/use-metrics-trace-aggregate.es.js +1 -1
- package/dist/domains/metrics/hooks/use-metrics.cjs.js +1 -1
- package/dist/domains/metrics/hooks/use-metrics.es.js +1 -1
- package/dist/domains/metrics/hooks.cjs.js +5 -5
- package/dist/domains/metrics/hooks.es.js +5 -5
- package/dist/domains/metrics/lib/breakdown-table.cjs.js +2 -2
- package/dist/domains/metrics/lib/breakdown-table.es.js +2 -2
- package/dist/domains/metrics/lib/series-colors.cjs.js +279 -0
- package/dist/domains/metrics/lib/series-colors.cjs.js.map +1 -0
- package/dist/domains/metrics/lib/series-colors.d.ts +1 -0
- package/dist/domains/metrics/lib/series-colors.es.js +272 -0
- package/dist/domains/metrics/lib/series-colors.es.js.map +1 -0
- package/dist/domains/metrics/lib.cjs.js +9 -3
- package/dist/domains/metrics/lib.es.js +5 -4
- package/dist/domains/metrics.cjs.js +7 -1
- package/dist/domains/metrics.es.js +3 -2
- package/dist/domains/observability/components/observability-capability-gate.cjs.js +3 -3
- package/dist/domains/observability/components/observability-capability-gate.es.js +3 -3
- package/dist/domains/observability/components/observability-histogram.cjs.js +5 -5
- package/dist/domains/observability/components/observability-histogram.cjs.js.map +1 -1
- package/dist/domains/observability/components/observability-histogram.es.js +5 -5
- package/dist/domains/observability/components/observability-histogram.es.js.map +1 -1
- package/dist/domains/observability/components/observability-page-layout.cjs.js +2 -2
- package/dist/domains/observability/components/observability-page-layout.es.js +2 -2
- package/dist/domains/observability/hooks/use-observability-list-filters.cjs.js +3 -3
- package/dist/domains/observability/hooks/use-observability-list-filters.es.js +3 -3
- package/dist/domains/observability/observability-list-url-state.cjs.js +1 -1
- package/dist/domains/observability/observability-list-url-state.es.js +1 -1
- package/dist/domains/observability/saved-view-state.cjs.js +3 -3
- package/dist/domains/observability/saved-view-state.es.js +3 -3
- package/dist/domains/observability/saved-views/observability-saved-views.cjs.js +1 -1
- package/dist/domains/observability/saved-views/observability-saved-views.es.js +1 -1
- package/dist/domains/observability/saved-views/use-hosted-saved-views.cjs.js +1 -1
- package/dist/domains/observability/saved-views/use-hosted-saved-views.es.js +1 -1
- package/dist/domains/observability/saved-views.cjs.js +2 -2
- package/dist/domains/observability/saved-views.es.js +2 -2
- package/dist/domains/observability.cjs.js +6 -6
- package/dist/domains/observability.es.js +6 -6
- package/dist/domains/review/components/review-status-badge.cjs.js +1 -1
- package/dist/domains/review/components/review-status-badge.es.js +1 -1
- package/dist/domains/scores/components/score-as-item-dialog.cjs.js +1 -1
- package/dist/domains/scores/components/score-as-item-dialog.es.js +1 -1
- package/dist/domains/scores/components/score-data-panel.cjs.js +7 -7
- package/dist/domains/scores/components/score-data-panel.cjs.js.map +1 -1
- package/dist/domains/scores/components/score-data-panel.es.js +7 -7
- package/dist/domains/scores/components/score-data-panel.es.js.map +1 -1
- package/dist/domains/scores/components/span-scoring.cjs.js +4 -4
- package/dist/domains/scores/components/span-scoring.es.js +4 -4
- package/dist/domains/scores/components/trace-scores-list.cjs.js +5 -5
- package/dist/domains/scores/components/trace-scores-list.es.js +5 -5
- package/dist/domains/scores/components/trace-scores-tab.cjs.js +15 -19
- package/dist/domains/scores/components/trace-scores-tab.cjs.js.map +1 -1
- package/dist/domains/scores/components/trace-scores-tab.es.js +15 -19
- package/dist/domains/scores/components/trace-scores-tab.es.js.map +1 -1
- package/dist/domains/scores/components.cjs.js +1 -1
- package/dist/domains/scores/components.es.js +1 -1
- package/dist/domains/skills/skill-simple-form.cjs.js +4 -4
- package/dist/domains/skills/skill-simple-form.es.js +4 -4
- package/dist/domains/spans/components/spans-explorer-body.cjs.js +6 -6
- package/dist/domains/spans/components/spans-explorer-body.es.js +7 -7
- package/dist/domains/spans/components/spans-filter-bar.cjs.js +3 -3
- package/dist/domains/spans/components/spans-filter-bar.es.js +3 -3
- package/dist/domains/spans/hooks/use-spans-filter-bar.cjs.js +2 -2
- package/dist/domains/spans/hooks/use-spans-filter-bar.es.js +2 -2
- package/dist/domains/spans/hooks/use-spans-list-source.cjs.js +1 -1
- package/dist/domains/spans/hooks/use-spans-list-source.es.js +1 -1
- package/dist/domains/spans/hooks.cjs.js +1 -1
- package/dist/domains/spans/hooks.es.js +1 -1
- package/dist/domains/threads/components/threads-explorer-body.cjs.js +6 -6
- package/dist/domains/threads/components/threads-explorer-body.es.js +7 -7
- package/dist/domains/threads/components/threads-filter-bar.cjs.js +3 -3
- package/dist/domains/threads/components/threads-filter-bar.es.js +3 -3
- package/dist/domains/threads/hooks/use-threads-filter-bar.cjs.js +2 -2
- package/dist/domains/threads/hooks/use-threads-filter-bar.es.js +2 -2
- package/dist/domains/threads/hooks/use-threads-list-source.cjs.js +1 -1
- package/dist/domains/threads/hooks/use-threads-list-source.es.js +1 -1
- package/dist/domains/threads/hooks.cjs.js +1 -1
- package/dist/domains/threads/hooks.es.js +1 -1
- package/dist/domains/traces/components/columns-menu/columns-menu.cjs.js +1 -1
- package/dist/domains/traces/components/columns-menu/columns-menu.es.js +2 -2
- package/dist/domains/traces/components/feedback-thread.cjs.js +9 -9
- package/dist/domains/traces/components/feedback-thread.es.js +9 -9
- package/dist/domains/traces/components/format-trace-thread-messages.cjs.js +1 -1
- package/dist/domains/traces/components/format-trace-thread-messages.es.js +1 -1
- package/dist/domains/traces/components/no-traces-info.cjs.js +2 -2
- package/dist/domains/traces/components/no-traces-info.cjs.js.map +1 -1
- package/dist/domains/traces/components/no-traces-info.es.js +2 -2
- package/dist/domains/traces/components/no-traces-info.es.js.map +1 -1
- package/dist/domains/traces/components/shared.cjs.js +3 -3
- package/dist/domains/traces/components/shared.es.js +3 -3
- package/dist/domains/traces/components/span-data-panel-view.cjs.js +23 -23
- package/dist/domains/traces/components/span-data-panel-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-data-panel-view.es.js +23 -23
- package/dist/domains/traces/components/span-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/span-details-view.cjs.js +3 -3
- package/dist/domains/traces/components/span-details-view.es.js +3 -3
- package/dist/domains/traces/components/span-outcome.cjs.js +1 -1
- package/dist/domains/traces/components/span-outcome.es.js +1 -1
- package/dist/domains/traces/components/span-outcome.utils.cjs.js +3 -3
- package/dist/domains/traces/components/span-outcome.utils.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-outcome.utils.es.js +3 -3
- package/dist/domains/traces/components/span-outcome.utils.es.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +5 -5
- package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +5 -5
- package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +4 -4
- package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +4 -4
- package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +7 -7
- package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +7 -7
- package/dist/domains/traces/components/span-payload/span-payload-attachment.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-attachment.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-json.es.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +14 -9
- package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +14 -9
- package/dist/domains/traces/components/span-payload/span-payload-messages.es.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +3 -3
- package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +3 -3
- package/dist/domains/traces/components/span-payload/span-payload-registry.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-registry.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-section.cjs.js +7 -7
- package/dist/domains/traces/components/span-payload/span-payload-section.es.js +7 -7
- package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-processor-attributes.cjs.js +3 -3
- package/dist/domains/traces/components/span-payload/span-processor-attributes.es.js +3 -3
- package/dist/domains/traces/components/span-payload/span-processor-mutations.cjs.js +3 -3
- package/dist/domains/traces/components/span-payload/span-processor-mutations.es.js +3 -3
- package/dist/domains/traces/components/span-payload/span-signal-details.cjs.js +4 -4
- package/dist/domains/traces/components/span-payload/span-signal-details.es.js +4 -4
- package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js +6 -6
- package/dist/domains/traces/components/span-payload/span-tools-section.es.js +6 -6
- package/dist/domains/traces/components/span-payload.cjs.js +4 -4
- package/dist/domains/traces/components/span-payload.es.js +4 -4
- package/dist/domains/traces/components/span-prompt-changes.cjs.js +17 -10
- package/dist/domains/traces/components/span-prompt-changes.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-prompt-changes.es.js +17 -10
- package/dist/domains/traces/components/span-prompt-changes.es.js.map +1 -1
- package/dist/domains/traces/components/span-rows.cjs.js +1 -1
- package/dist/domains/traces/components/span-rows.es.js +1 -1
- package/dist/domains/traces/components/span-summary-description.cjs.js +3 -3
- package/dist/domains/traces/components/span-summary-description.es.js +3 -3
- package/dist/domains/traces/components/span-timeline-row.cjs.js +10 -10
- package/dist/domains/traces/components/span-timeline-row.es.js +10 -10
- package/dist/domains/traces/components/span-timing-hover-card.cjs.js +3 -3
- package/dist/domains/traces/components/span-timing-hover-card.es.js +3 -3
- package/dist/domains/traces/components/span-token-usage.cjs.js +2 -2
- package/dist/domains/traces/components/span-token-usage.es.js +2 -2
- package/dist/domains/traces/components/span-token-usage.utils.cjs.js +2 -2
- package/dist/domains/traces/components/span-token-usage.utils.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-token-usage.utils.es.js +2 -2
- package/dist/domains/traces/components/span-token-usage.utils.es.js.map +1 -1
- package/dist/domains/traces/components/span-type-badge.cjs.js +1 -1
- package/dist/domains/traces/components/span-type-badge.es.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-details.cjs.js +3 -3
- package/dist/domains/traces/components/thread-trace/thread-trace-details.es.js +3 -3
- package/dist/domains/traces/components/thread-trace/thread-trace-list.cjs.js +2 -2
- package/dist/domains/traces/components/thread-trace/thread-trace-list.es.js +2 -2
- package/dist/domains/traces/components/thread-trace/thread-trace-messages.cjs.js +4 -4
- package/dist/domains/traces/components/thread-trace/thread-trace-messages.es.js +4 -4
- package/dist/domains/traces/components/thread-trace/thread-trace-root.cjs.js +3 -3
- package/dist/domains/traces/components/thread-trace/thread-trace-root.es.js +3 -3
- package/dist/domains/traces/components/thread-trace/thread-trace-row.cjs.js +5 -5
- package/dist/domains/traces/components/thread-trace/thread-trace-row.es.js +5 -5
- package/dist/domains/traces/components/thread-trace/thread-trace-span-panel.cjs.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-span-panel.es.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-spans.cjs.js +6 -6
- package/dist/domains/traces/components/thread-trace/thread-trace-spans.es.js +6 -6
- package/dist/domains/traces/components/thread-trace.cjs.js +3 -3
- package/dist/domains/traces/components/thread-trace.es.js +3 -3
- package/dist/domains/traces/components/thread-view-by-trace.cjs.js +7 -7
- package/dist/domains/traces/components/thread-view-by-trace.es.js +7 -7
- package/dist/domains/traces/components/thread-view-skeleton.cjs.js +5 -5
- package/dist/domains/traces/components/thread-view-skeleton.es.js +5 -5
- package/dist/domains/traces/components/timeline-name-col.cjs.js +6 -6
- package/dist/domains/traces/components/timeline-name-col.es.js +6 -6
- package/dist/domains/traces/components/timeline-timing-col.cjs.js +4 -4
- package/dist/domains/traces/components/timeline-timing-col.es.js +4 -4
- package/dist/domains/traces/components/trace-columns-menu.cjs.js +5 -5
- package/dist/domains/traces/components/trace-columns-menu.es.js +5 -5
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +13 -13
- package/dist/domains/traces/components/trace-data-panel-view.es.js +13 -13
- package/dist/domains/traces/components/trace-data-panel.cjs.js +2 -2
- package/dist/domains/traces/components/trace-data-panel.es.js +2 -2
- package/dist/domains/traces/components/trace-details-view.cjs.js +3 -3
- package/dist/domains/traces/components/trace-details-view.es.js +3 -3
- package/dist/domains/traces/components/trace-error-cell.cjs.js +2 -2
- package/dist/domains/traces/components/trace-error-cell.es.js +2 -2
- package/dist/domains/traces/components/trace-error-summary.cjs.js +2 -2
- package/dist/domains/traces/components/trace-error-summary.es.js +2 -2
- package/dist/domains/traces/components/trace-id-button.cjs.js +1 -1
- package/dist/domains/traces/components/trace-id-button.es.js +1 -1
- package/dist/domains/traces/components/trace-messages-panel.cjs.js +1 -1
- package/dist/domains/traces/components/trace-messages-panel.es.js +1 -1
- package/dist/domains/traces/components/trace-messages-skeleton.cjs.js +1 -1
- package/dist/domains/traces/components/trace-messages-skeleton.es.js +1 -1
- package/dist/domains/traces/components/trace-span-panel.cjs.js +3 -3
- package/dist/domains/traces/components/trace-span-panel.es.js +3 -3
- package/dist/domains/traces/components/trace-span-timeline-markers.cjs.js +6 -6
- package/dist/domains/traces/components/trace-span-timeline-markers.es.js +6 -6
- package/dist/domains/traces/components/trace-span-timeline.cjs.js +5 -5
- package/dist/domains/traces/components/trace-span-timeline.es.js +5 -5
- package/dist/domains/traces/components/trace-span-tree-skeleton.cjs.js +2 -2
- package/dist/domains/traces/components/trace-span-tree-skeleton.es.js +2 -2
- package/dist/domains/traces/components/trace-span-tree.cjs.js +2 -2
- package/dist/domains/traces/components/trace-span-tree.es.js +2 -2
- package/dist/domains/traces/components/trace-status-value.cjs.js +1 -1
- package/dist/domains/traces/components/trace-status-value.es.js +1 -1
- package/dist/domains/traces/components/trace-summary-description.cjs.js +5 -5
- package/dist/domains/traces/components/trace-summary-description.es.js +5 -5
- package/dist/domains/traces/components/trace-thread-item-view.cjs.js +5 -5
- package/dist/domains/traces/components/trace-thread-item-view.es.js +5 -5
- package/dist/domains/traces/components/trace-thread-panel.cjs.js +1 -1
- package/dist/domains/traces/components/trace-thread-panel.es.js +1 -1
- package/dist/domains/traces/components/trace-timeline.cjs.js +1 -1
- package/dist/domains/traces/components/trace-timeline.es.js +1 -1
- package/dist/domains/traces/components/traces-error-content.cjs.js +2 -2
- package/dist/domains/traces/components/traces-error-content.es.js +2 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-body.cjs.js +2 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-body.es.js +2 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-columns-menu.cjs.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-columns-menu.es.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-columns-provider.cjs.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-columns-provider.es.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js +2 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +2 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-histogram.cjs.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-histogram.es.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-layout.cjs.js +2 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-layout.es.js +2 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-list-provider.cjs.js +2 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-list-provider.es.js +2 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-list.cjs.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-list.es.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.cjs.js +6 -6
- package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.es.js +6 -6
- package/dist/domains/traces/components/traces-explorer/traces-explorer-root.cjs.js +2 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-root.es.js +3 -3
- package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.cjs.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.es.js +1 -1
- package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.cjs.js +2 -2
- package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js +2 -2
- package/dist/domains/traces/components/traces-explorer.cjs.js +4 -4
- package/dist/domains/traces/components/traces-explorer.es.js +4 -4
- package/dist/domains/traces/components/traces-list-mode-toggle.cjs.js +2 -2
- package/dist/domains/traces/components/traces-list-mode-toggle.es.js +2 -2
- package/dist/domains/traces/components/traces-list-view.cjs.js +10 -10
- package/dist/domains/traces/components/traces-list-view.es.js +10 -10
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js +2 -2
- package/dist/domains/traces/components/traces-page-skeleton.es.js +2 -2
- package/dist/domains/traces/components/traces-spans-switch.cjs.js +3 -3
- package/dist/domains/traces/components/traces-spans-switch.es.js +3 -3
- package/dist/domains/traces/components.cjs.js +15 -15
- package/dist/domains/traces/components.es.js +15 -15
- package/dist/domains/traces/hooks/use-download-trace-json.cjs.js +1 -1
- package/dist/domains/traces/hooks/use-download-trace-json.es.js +1 -1
- package/dist/domains/traces/hooks/use-traces-list-source.cjs.js +1 -1
- package/dist/domains/traces/hooks/use-traces-list-source.es.js +1 -1
- package/dist/domains/traces/hooks.cjs.js +4 -4
- package/dist/domains/traces/hooks.es.js +4 -4
- package/dist/domains/traces/utils/span-utils.cjs.js +2 -2
- package/dist/domains/traces/utils/span-utils.cjs.js.map +1 -1
- package/dist/domains/traces/utils/span-utils.es.js +2 -2
- package/dist/domains/traces/utils/span-utils.es.js.map +1 -1
- package/dist/domains/traces/utils.cjs.js +2 -2
- package/dist/domains/traces/utils.es.js +2 -2
- package/dist/domains/traces.cjs.js +2 -2
- package/dist/domains/traces.es.js +2 -2
- package/dist/domains/workflows/components/workflow-combobox.cjs.js +4 -3
- package/dist/domains/workflows/components/workflow-combobox.cjs.js.map +1 -1
- package/dist/domains/workflows/components/workflow-combobox.es.js +4 -3
- package/dist/domains/workflows/components/workflow-combobox.es.js.map +1 -1
- package/dist/domains/workflows/components/workflow-entity-header.cjs.js +6 -6
- package/dist/domains/workflows/components/workflow-entity-header.cjs.js.map +1 -1
- package/dist/domains/workflows/components/workflow-entity-header.es.js +6 -6
- package/dist/domains/workflows/components/workflow-entity-header.es.js.map +1 -1
- package/dist/domains/workflows/components/workflow-information.cjs.js +10 -10
- package/dist/domains/workflows/components/workflow-information.es.js +10 -10
- package/dist/domains/workflows/components/workflow-layout.cjs.js +3 -3
- package/dist/domains/workflows/components/workflow-layout.es.js +2 -2
- package/dist/domains/workflows/components/workflow-run-status-icon.cjs.js +3 -3
- package/dist/domains/workflows/components/workflow-run-status-icon.es.js +3 -3
- package/dist/domains/workflows/components/workflow-step-detail.cjs.js +4 -4
- package/dist/domains/workflows/components/workflow-step-detail.es.js +4 -4
- package/dist/domains/workflows/components/workflows-list/no-workflows-info.cjs.js +2 -2
- package/dist/domains/workflows/components/workflows-list/no-workflows-info.es.js +2 -2
- package/dist/domains/workflows/components/workflows-list/workflows-list.cjs.js +11 -11
- package/dist/domains/workflows/components/workflows-list/workflows-list.es.js +11 -11
- package/dist/domains/workflows/context/playground-workflow-run-provider.cjs.js +1 -1
- package/dist/domains/workflows/context/playground-workflow-run-provider.es.js +1 -1
- package/dist/domains/workflows/context/use-stream-for-run.cjs.js +1 -1
- package/dist/domains/workflows/context/use-stream-for-run.es.js +1 -1
- package/dist/domains/workflows/context/workflow-run-provider.cjs.js +1 -1
- package/dist/domains/workflows/context/workflow-run-provider.es.js +1 -1
- package/dist/domains/workflows/runs/workflow-run-details.cjs.js +2 -2
- package/dist/domains/workflows/runs/workflow-run-details.es.js +2 -2
- package/dist/domains/workflows/runs/workflow-run-list.cjs.js +26 -21
- package/dist/domains/workflows/runs/workflow-run-list.cjs.js.map +1 -1
- package/dist/domains/workflows/runs/workflow-run-list.es.js +26 -21
- package/dist/domains/workflows/runs/workflow-run-list.es.js.map +1 -1
- package/dist/domains/workflows/workflow/data/use-workflow-data.cjs.js +1 -1
- package/dist/domains/workflows/workflow/data/use-workflow-data.es.js +1 -1
- package/dist/domains/workflows/workflow/data/workflow-data-button.cjs.js +1 -1
- package/dist/domains/workflows/workflow/data/workflow-data-button.es.js +1 -1
- package/dist/domains/workflows/workflow/data/workflow-data-inspector.cjs.js +5 -5
- package/dist/domains/workflows/workflow/data/workflow-data-inspector.es.js +5 -5
- package/dist/domains/workflows/workflow/input/workflow-json-input.cjs.js +1 -1
- package/dist/domains/workflows/workflow/input/workflow-json-input.es.js +1 -1
- package/dist/domains/workflows/workflow/input/workflow-processor-input.cjs.js +8 -8
- package/dist/domains/workflows/workflow/input/workflow-processor-input.cjs.js.map +1 -1
- package/dist/domains/workflows/workflow/input/workflow-processor-input.es.js +8 -8
- package/dist/domains/workflows/workflow/input/workflow-processor-input.es.js.map +1 -1
- package/dist/domains/workflows/workflow/use-workflow-graph-nodes.cjs.js +1 -1
- package/dist/domains/workflows/workflow/use-workflow-graph-nodes.es.js +1 -1
- package/dist/domains/workflows/workflow/use-workflow-graph-runtime.cjs.js +1 -1
- package/dist/domains/workflows/workflow/use-workflow-graph-runtime.es.js +1 -1
- package/dist/domains/workflows/workflow/use-workflow-trigger.cjs.js +3 -3
- package/dist/domains/workflows/workflow/use-workflow-trigger.es.js +3 -3
- package/dist/domains/workflows/workflow/utils.cjs.js +2 -2
- package/dist/domains/workflows/workflow/utils.es.js +2 -2
- package/dist/domains/workflows/workflow/workflow-body-graph.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-body-graph.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-cancel-button.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-cancel-button.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-card.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-card.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-data-edge.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-data-edge.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-debug-mode-switch.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-debug-mode-switch.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-debug-step-controls.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-debug-step-controls.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph-boundary.cjs.js +6 -6
- package/dist/domains/workflows/workflow/workflow-graph-boundary.es.js +6 -6
- package/dist/domains/workflows/workflow/workflow-graph-groups.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph-groups.cjs.js.map +1 -1
- package/dist/domains/workflows/workflow/workflow-graph-groups.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph-groups.es.js.map +1 -1
- package/dist/domains/workflows/workflow/workflow-graph-inner.cjs.js +4 -4
- package/dist/domains/workflows/workflow/workflow-graph-inner.es.js +4 -4
- package/dist/domains/workflows/workflow/workflow-graph-layout.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph-layout.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph-node.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph-node.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph.cjs.js +2 -2
- package/dist/domains/workflows/workflow/workflow-graph.es.js +2 -2
- package/dist/domains/workflows/workflow/workflow-input-data.cjs.js +6 -6
- package/dist/domains/workflows/workflow/workflow-input-data.es.js +6 -6
- package/dist/domains/workflows/workflow/workflow-input-type-toggle.cjs.js +2 -2
- package/dist/domains/workflows/workflow/workflow-input-type-toggle.es.js +2 -2
- package/dist/domains/workflows/workflow/workflow-map-config-dialog.cjs.js +3 -3
- package/dist/domains/workflows/workflow/workflow-map-config-dialog.es.js +3 -3
- package/dist/domains/workflows/workflow/workflow-nested-graph.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-nested-graph.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-run-data.cjs.js +4 -4
- package/dist/domains/workflows/workflow/workflow-run-data.es.js +4 -4
- package/dist/domains/workflows/workflow/workflow-run-error.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-run-error.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-run-header.cjs.js +6 -6
- package/dist/domains/workflows/workflow/workflow-run-header.es.js +6 -6
- package/dist/domains/workflows/workflow/workflow-status.cjs.js +7 -7
- package/dist/domains/workflows/workflow/workflow-status.es.js +7 -7
- package/dist/domains/workflows/workflow/workflow-step-action-bar.cjs.js +2 -2
- package/dist/domains/workflows/workflow/workflow-step-action-bar.es.js +2 -2
- package/dist/domains/workflows/workflow/workflow-step-node-utils.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-step-node-utils.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-steps-status.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-steps-status.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-suspended-steps.cjs.js +10 -10
- package/dist/domains/workflows/workflow/workflow-suspended-steps.es.js +10 -10
- package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js +12 -12
- package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js +12 -12
- package/dist/domains/workflows/workflow/workflow-timeline-row.cjs.js +4 -4
- package/dist/domains/workflows/workflow/workflow-timeline-row.es.js +4 -4
- package/dist/domains/workflows/workflow/workflow-timeline.cjs.js +9 -9
- package/dist/domains/workflows/workflow/workflow-timeline.es.js +9 -9
- package/dist/domains/workflows/workflow/workflow-trigger-form.cjs.js +2 -2
- package/dist/domains/workflows/workflow/workflow-trigger-form.es.js +2 -2
- package/dist/domains/workflows/workflow/workflow-trigger-header.cjs.js +3 -3
- package/dist/domains/workflows/workflow/workflow-trigger-header.es.js +3 -3
- package/dist/domains/workflows/workflow/workflow-trigger.cjs.js +5 -5
- package/dist/domains/workflows/workflow/workflow-trigger.es.js +5 -5
- package/dist/domains/workflows.cjs.js +4 -4
- package/dist/domains/workflows.es.js +4 -4
- package/dist/domains/workspace/components/mount-icon.cjs.js +1 -1
- package/dist/domains/workspace/components/mount-icon.es.js +1 -1
- package/dist/domains/workspace/components/workspace-active-file.cjs.js +4 -4
- package/dist/domains/workspace/components/workspace-active-file.es.js +4 -4
- package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js +10 -10
- package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +10 -10
- package/dist/domains/workspace/components/workspace-add-skill.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-add-skill.es.js +1 -1
- package/dist/domains/workspace/components/workspace-context.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-context.es.js +1 -1
- package/dist/domains/workspace/components/workspace-create-directory.cjs.js +4 -4
- package/dist/domains/workspace/components/workspace-create-directory.es.js +4 -4
- package/dist/domains/workspace/components/workspace-error.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-error.es.js +1 -1
- package/dist/domains/workspace/components/workspace-markdown-preview.cjs.js +2 -2
- package/dist/domains/workspace/components/workspace-markdown-preview.es.js +2 -2
- package/dist/domains/workspace/components/workspace-parts.cjs.js +5 -5
- package/dist/domains/workspace/components/workspace-parts.es.js +5 -5
- package/dist/domains/workspace/components/workspace-search.cjs.js +17 -20
- package/dist/domains/workspace/components/workspace-search.cjs.js.map +1 -1
- package/dist/domains/workspace/components/workspace-search.es.js +18 -21
- package/dist/domains/workspace/components/workspace-search.es.js.map +1 -1
- package/dist/domains/workspace/components/workspace-tree-view.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-tree-view.es.js +1 -1
- package/dist/domains/workspace/components/workspace-tree.cjs.js +11 -11
- package/dist/domains/workspace/components/workspace-tree.cjs.js.map +1 -1
- package/dist/domains/workspace/components/workspace-tree.es.js +11 -11
- package/dist/domains/workspace/components/workspace-tree.es.js.map +1 -1
- package/dist/domains/workspace/components/workspace.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace.es.js +1 -1
- package/dist/domains/workspace.cjs.js +3 -3
- package/dist/domains/workspace.es.js +3 -3
- package/dist/{dropdown-menu-B4jY3J9e.js → dropdown-menu-DKoWI8kD.js} +2 -2
- package/dist/{dropdown-menu-B4jY3J9e.js.map → dropdown-menu-DKoWI8kD.js.map} +1 -1
- package/dist/{dropdown-menu-BETTTPBB.cjs → dropdown-menu-Dx-jCOIv.cjs} +2 -2
- package/dist/{dropdown-menu-BETTTPBB.cjs.map → dropdown-menu-Dx-jCOIv.cjs.map} +1 -1
- package/dist/ee/signals/components/entity-index-compact-grid.cjs.js +4 -4
- package/dist/ee/signals/components/entity-index-compact-grid.es.js +4 -4
- package/dist/ee/signals/components/entity-index-list.cjs.js +1 -1
- package/dist/ee/signals/components/entity-index-list.es.js +1 -1
- package/dist/ee/signals/components/entity-index-status.cjs.js +2 -2
- package/dist/ee/signals/components/entity-index-status.es.js +2 -2
- package/dist/ee/signals/components/signals-empty-state.cjs.js +12 -21
- package/dist/ee/signals/components/signals-empty-state.cjs.js.map +1 -1
- package/dist/ee/signals/components/signals-empty-state.es.js +12 -21
- package/dist/ee/signals/components/signals-empty-state.es.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-detail.cjs.js +5 -5
- package/dist/ee/signals/components/trace-intelligence-entity-detail.es.js +5 -5
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +13 -13
- package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +14 -14
- package/dist/ee/signals/examples-pager.cjs.js +2 -2
- package/dist/ee/signals/examples-pager.es.js +2 -2
- package/dist/ee/signals/flow-card.cjs.js +4 -4
- package/dist/ee/signals/flow-card.es.js +4 -4
- package/dist/ee/signals/lifeline-point.cjs.js +2 -2
- package/dist/ee/signals/lifeline-point.es.js +2 -2
- package/dist/ee/signals/lifeline-row.cjs.js +6 -6
- package/dist/ee/signals/lifeline-row.cjs.js.map +1 -1
- package/dist/ee/signals/lifeline-row.es.js +6 -6
- package/dist/ee/signals/lifeline-row.es.js.map +1 -1
- package/dist/ee/signals/noise-detail-panel.cjs.js +6 -6
- package/dist/ee/signals/noise-detail-panel.es.js +6 -6
- package/dist/ee/signals/sankey-signals-data.cjs.js +9 -5
- package/dist/ee/signals/sankey-signals-data.cjs.js.map +1 -1
- package/dist/ee/signals/sankey-signals-data.es.js +9 -5
- package/dist/ee/signals/sankey-signals-data.es.js.map +1 -1
- package/dist/ee/signals/sankey-signals.cjs.js +21 -12
- package/dist/ee/signals/sankey-signals.cjs.js.map +1 -1
- package/dist/ee/signals/sankey-signals.es.js +21 -12
- package/dist/ee/signals/sankey-signals.es.js.map +1 -1
- package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +4 -4
- package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +4 -4
- package/dist/ee/signals/settings/trace-signal-settings.cjs.js +7 -7
- package/dist/ee/signals/settings/trace-signal-settings.es.js +7 -7
- package/dist/ee/signals/signal-delta-column.cjs.js +3 -3
- package/dist/ee/signals/signal-delta-column.es.js +3 -3
- package/dist/ee/signals/signal-lifelines.cjs.js +5 -5
- package/dist/ee/signals/signal-lifelines.es.js +5 -5
- package/dist/ee/signals/signals-error-state.cjs.js +2 -2
- package/dist/ee/signals/signals-error-state.es.js +2 -2
- package/dist/ee/signals/snapshot-summary.cjs.js +15 -0
- package/dist/ee/signals/snapshot-summary.cjs.js.map +1 -0
- package/dist/ee/signals/snapshot-summary.d.ts +1 -0
- package/dist/ee/signals/snapshot-summary.es.js +14 -0
- package/dist/ee/signals/snapshot-summary.es.js.map +1 -0
- package/dist/ee/signals/snapshot-timeline.cjs.js +4 -4
- package/dist/ee/signals/snapshot-timeline.cjs.js.map +1 -1
- package/dist/ee/signals/snapshot-timeline.es.js +4 -4
- package/dist/ee/signals/snapshot-timeline.es.js.map +1 -1
- package/dist/ee/signals/sortable-signal-headers.cjs.js +6 -6
- package/dist/ee/signals/sortable-signal-headers.es.js +6 -6
- package/dist/ee/signals/theme-compare.cjs.js +15 -7
- package/dist/ee/signals/theme-compare.cjs.js.map +1 -1
- package/dist/ee/signals/theme-compare.es.js +15 -7
- package/dist/ee/signals/theme-compare.es.js.map +1 -1
- package/dist/ee/signals/theme-detail-panel.cjs.js +13 -17
- package/dist/ee/signals/theme-detail-panel.cjs.js.map +1 -1
- package/dist/ee/signals/theme-detail-panel.es.js +13 -17
- package/dist/ee/signals/theme-detail-panel.es.js.map +1 -1
- package/dist/ee/signals/theme-filter-banner.cjs.js +7 -7
- package/dist/ee/signals/theme-filter-banner.cjs.js.map +1 -1
- package/dist/ee/signals/theme-filter-banner.es.js +7 -7
- package/dist/ee/signals/theme-filter-banner.es.js.map +1 -1
- package/dist/ee/signals/theme-lifelines.cjs.js +8 -5
- package/dist/ee/signals/theme-lifelines.cjs.js.map +1 -1
- package/dist/ee/signals/theme-lifelines.es.js +8 -5
- package/dist/ee/signals/theme-lifelines.es.js.map +1 -1
- package/dist/ee/signals/theme-trend-chart.cjs.js +3 -3
- package/dist/ee/signals/theme-trend-chart.cjs.js.map +1 -1
- package/dist/ee/signals/theme-trend-chart.es.js +3 -3
- package/dist/ee/signals/theme-trend-chart.es.js.map +1 -1
- package/dist/ee/signals/trace-insight-view.cjs.js +11 -13
- package/dist/ee/signals/trace-insight-view.cjs.js.map +1 -1
- package/dist/ee/signals/trace-insight-view.es.js +11 -13
- package/dist/ee/signals/trace-insight-view.es.js.map +1 -1
- package/dist/ee/signals/trace-intelligence-explainer.cjs.js +10 -15
- package/dist/ee/signals/trace-intelligence-explainer.cjs.js.map +1 -1
- package/dist/ee/signals/trace-intelligence-explainer.es.js +10 -15
- package/dist/ee/signals/trace-intelligence-explainer.es.js.map +1 -1
- package/dist/ee/signals/view-mode-tab.cjs.js +2 -2
- package/dist/ee/signals/view-mode-tab.es.js +2 -2
- package/dist/ee/signals.cjs.js +5 -5
- package/dist/ee/signals.es.js +5 -5
- package/dist/ee/topics/components/topic-trace-details-panel.cjs.js +1 -1
- package/dist/ee/topics/components/topic-trace-details-panel.es.js +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +4 -4
- package/dist/ee/topics/components/topic-trace-summary-list.es.js +4 -4
- package/dist/ee/topics/components/topics-layout.cjs.js +1 -1
- package/dist/ee/topics/components/topics-layout.es.js +1 -1
- package/dist/{field-error-id-DBSuJ3HM.js → field-error-id-6ZynvsRO.js} +2 -2
- package/dist/{field-error-id-DBSuJ3HM.js.map → field-error-id-6ZynvsRO.js.map} +1 -1
- package/dist/{field-error-id-nGAF0330.cjs → field-error-id-VimPQI_b.cjs} +2 -2
- package/dist/{field-error-id-nGAF0330.cjs.map → field-error-id-VimPQI_b.cjs.map} +1 -1
- package/dist/{filter-bar-chip-Cg-UbIwP.cjs → filter-bar-chip-DFsbUZ-V.cjs} +10 -10
- package/dist/{filter-bar-chip-Cg-UbIwP.cjs.map → filter-bar-chip-DFsbUZ-V.cjs.map} +1 -1
- package/dist/{filter-bar-chip-CABeKrtf.js → filter-bar-chip-NBtfDca9.js} +11 -11
- package/dist/{filter-bar-chip-CABeKrtf.js.map → filter-bar-chip-NBtfDca9.js.map} +1 -1
- package/dist/{filter-bar-time-range-qlV8p7hp.js → filter-bar-time-range-D9SnzR2J.js} +3 -3
- package/dist/{filter-bar-time-range-qlV8p7hp.js.map → filter-bar-time-range-D9SnzR2J.js.map} +1 -1
- package/dist/{filter-bar-time-range-zdM024JD.cjs → filter-bar-time-range-DlVNjw43.cjs} +3 -3
- package/dist/{filter-bar-time-range-zdM024JD.cjs.map → filter-bar-time-range-DlVNjw43.cjs.map} +1 -1
- package/dist/hooks/use-clock.cjs.js +34 -0
- package/dist/hooks/use-clock.cjs.js.map +1 -0
- package/dist/hooks/use-clock.d.ts +1 -0
- package/dist/hooks/use-clock.es.js +33 -0
- package/dist/hooks/use-clock.es.js.map +1 -0
- package/dist/hooks/use-copy-to-clipboard.cjs.js +1 -1
- package/dist/hooks/use-copy-to-clipboard.es.js +1 -1
- package/dist/hooks/use-text-highlight.cjs.js +3 -5
- package/dist/hooks/use-text-highlight.cjs.js.map +1 -1
- package/dist/hooks/use-text-highlight.es.js +1 -3
- package/dist/hooks/use-text-highlight.es.js.map +1 -1
- package/dist/icons/ByteDanceIcon.cjs.js +37 -0
- package/dist/icons/ByteDanceIcon.cjs.js.map +1 -0
- package/dist/icons/ByteDanceIcon.d.ts +1 -0
- package/dist/icons/ByteDanceIcon.es.js +34 -0
- package/dist/icons/ByteDanceIcon.es.js.map +1 -0
- package/dist/icons/CohereBrandIcon.cjs.js +34 -0
- package/dist/icons/CohereBrandIcon.cjs.js.map +1 -0
- package/dist/icons/CohereBrandIcon.d.ts +1 -0
- package/dist/icons/CohereBrandIcon.es.js +31 -0
- package/dist/icons/CohereBrandIcon.es.js.map +1 -0
- package/dist/icons/FireworksIcon.cjs.js +22 -0
- package/dist/icons/FireworksIcon.cjs.js.map +1 -0
- package/dist/icons/FireworksIcon.d.ts +1 -0
- package/dist/icons/FireworksIcon.es.js +19 -0
- package/dist/icons/FireworksIcon.es.js.map +1 -0
- package/dist/icons/Icon.cjs.js +1 -1
- package/dist/icons/Icon.es.js +1 -1
- package/dist/icons/LongCatIcon.cjs.js +22 -0
- package/dist/icons/LongCatIcon.cjs.js.map +1 -0
- package/dist/icons/LongCatIcon.d.ts +1 -0
- package/dist/icons/LongCatIcon.es.js +19 -0
- package/dist/icons/LongCatIcon.es.js.map +1 -0
- package/dist/icons/MicrosoftIcon.cjs.js +34 -0
- package/dist/icons/MicrosoftIcon.cjs.js.map +1 -0
- package/dist/icons/MicrosoftIcon.d.ts +1 -0
- package/dist/icons/MicrosoftIcon.es.js +31 -0
- package/dist/icons/MicrosoftIcon.es.js.map +1 -0
- package/dist/icons/MorphIcon.cjs.js +20 -0
- package/dist/icons/MorphIcon.cjs.js.map +1 -0
- package/dist/icons/MorphIcon.d.ts +1 -0
- package/dist/icons/MorphIcon.es.js +17 -0
- package/dist/icons/MorphIcon.es.js.map +1 -0
- package/dist/icons/NousResearchIcon.cjs.js +19 -0
- package/dist/icons/NousResearchIcon.cjs.js.map +1 -0
- package/dist/icons/NousResearchIcon.d.ts +1 -0
- package/dist/icons/NousResearchIcon.es.js +16 -0
- package/dist/icons/NousResearchIcon.es.js.map +1 -0
- package/dist/icons/NovaIcon.cjs.js +41 -0
- package/dist/icons/NovaIcon.cjs.js.map +1 -0
- package/dist/icons/NovaIcon.d.ts +1 -0
- package/dist/icons/NovaIcon.es.js +38 -0
- package/dist/icons/NovaIcon.es.js.map +1 -0
- package/dist/icons/PerplexityIcon.cjs.js +21 -0
- package/dist/icons/PerplexityIcon.cjs.js.map +1 -0
- package/dist/icons/PerplexityIcon.d.ts +1 -0
- package/dist/icons/PerplexityIcon.es.js +18 -0
- package/dist/icons/PerplexityIcon.es.js.map +1 -0
- package/dist/icons/SakanaIcon.cjs.js +20 -0
- package/dist/icons/SakanaIcon.cjs.js.map +1 -0
- package/dist/icons/SakanaIcon.d.ts +1 -0
- package/dist/icons/SakanaIcon.es.js +17 -0
- package/dist/icons/SakanaIcon.es.js.map +1 -0
- package/dist/icons/StepFunIcon.cjs.js +35 -0
- package/dist/icons/StepFunIcon.cjs.js.map +1 -0
- package/dist/icons/StepFunIcon.d.ts +1 -0
- package/dist/icons/StepFunIcon.es.js +32 -0
- package/dist/icons/StepFunIcon.es.js.map +1 -0
- package/dist/icons/TencentIcon.cjs.js +21 -0
- package/dist/icons/TencentIcon.cjs.js.map +1 -0
- package/dist/icons/TencentIcon.d.ts +1 -0
- package/dist/icons/TencentIcon.es.js +18 -0
- package/dist/icons/TencentIcon.es.js.map +1 -0
- package/dist/icons/UpstageIcon.cjs.js +36 -0
- package/dist/icons/UpstageIcon.cjs.js.map +1 -0
- package/dist/icons/UpstageIcon.d.ts +1 -0
- package/dist/icons/UpstageIcon.es.js +33 -0
- package/dist/icons/UpstageIcon.es.js.map +1 -0
- package/dist/{input-2hRXcZIu.cjs → input-BpnUsQSt.cjs} +4 -4
- package/dist/{input-2hRXcZIu.cjs.map → input-BpnUsQSt.cjs.map} +1 -1
- package/dist/{input-0l1uzOBZ.js → input-Cyit5ZSc.js} +4 -4
- package/dist/{input-0l1uzOBZ.js.map → input-Cyit5ZSc.js.map} +1 -1
- package/dist/{input-group-DVJLZDBL.cjs → input-group-DBCilXjT.cjs} +4 -4
- package/dist/{input-group-DVJLZDBL.cjs.map → input-group-DBCilXjT.cjs.map} +1 -1
- package/dist/{input-group-QKKV_ouF.js → input-group-NV4ZzKOk.js} +4 -4
- package/dist/{input-group-QKKV_ouF.js.map → input-group-NV4ZzKOk.js.map} +1 -1
- package/dist/layout/tabbed-container.cjs.js +1 -1
- package/dist/layout/tabbed-container.es.js +1 -1
- package/dist/lib/form/auto-form.cjs.js +1 -1
- package/dist/lib/form/auto-form.es.js +1 -1
- package/dist/lib/form/components/array-element-wrapper.cjs.js +4 -4
- package/dist/lib/form/components/array-element-wrapper.es.js +4 -4
- package/dist/lib/form/components/array-wrapper.cjs.js +2 -2
- package/dist/lib/form/components/array-wrapper.es.js +2 -2
- package/dist/lib/form/components/boolean-field.cjs.js +1 -1
- package/dist/lib/form/components/boolean-field.es.js +1 -1
- package/dist/lib/form/components/date-field.cjs.js +5 -5
- package/dist/lib/form/components/date-field.es.js +5 -5
- package/dist/lib/form/components/error-message.cjs.js +1 -1
- package/dist/lib/form/components/error-message.es.js +1 -1
- package/dist/lib/form/components/form-submit-row.cjs.js +2 -2
- package/dist/lib/form/components/form-submit-row.es.js +2 -2
- package/dist/lib/form/components/number-field.cjs.js +1 -1
- package/dist/lib/form/components/number-field.es.js +1 -1
- package/dist/lib/form/components/object-wrapper.cjs.js +3 -3
- package/dist/lib/form/components/object-wrapper.es.js +3 -3
- package/dist/lib/form/components/record-field.cjs.js +2 -2
- package/dist/lib/form/components/record-field.es.js +2 -2
- package/dist/lib/form/components/select-field.cjs.js +1 -1
- package/dist/lib/form/components/select-field.es.js +1 -1
- package/dist/lib/form/components/string-field.cjs.js +1 -1
- package/dist/lib/form/components/string-field.es.js +1 -1
- package/dist/lib/form/components/submit-button.cjs.js +1 -1
- package/dist/lib/form/components/submit-button.es.js +1 -1
- package/dist/lib/form/components/union-field.cjs.js +1 -1
- package/dist/lib/form/components/union-field.es.js +1 -1
- package/dist/lib/form/dynamic-form.cjs.js +2 -2
- package/dist/lib/form/dynamic-form.es.js +2 -2
- package/dist/{list-search-CkhsTFdG.js → list-search-DUcIMJTk.js} +2 -2
- package/dist/{list-search-CkhsTFdG.js.map → list-search-DUcIMJTk.js.map} +1 -1
- package/dist/{list-search-BtRno5As.cjs → list-search-yF02rvZt.cjs} +2 -2
- package/dist/{list-search-BtRno5As.cjs.map → list-search-yF02rvZt.cjs.map} +1 -1
- package/dist/mcp-app-viewer-BV7FI498.js +2051 -0
- package/dist/mcp-app-viewer-BV7FI498.js.map +1 -0
- package/dist/mcp-app-viewer-M3-pqAlo.cjs +2058 -0
- package/dist/mcp-app-viewer-M3-pqAlo.cjs.map +1 -0
- package/dist/new/layout/page-header.cjs.js +1 -1
- package/dist/new/layout/page-header.es.js +1 -1
- package/dist/new/settings.cjs.js +1 -1
- package/dist/new/settings.es.js +1 -1
- package/dist/{observability-saved-views-CjKTEp1V.js → observability-saved-views-Ch53fh5_.js} +9 -9
- package/dist/{observability-saved-views-CjKTEp1V.js.map → observability-saved-views-Ch53fh5_.js.map} +1 -1
- package/dist/{observability-saved-views-Daizz4tU.cjs → observability-saved-views-DgABvgat.cjs} +9 -9
- package/dist/{observability-saved-views-Daizz4tU.cjs.map → observability-saved-views-DgABvgat.cjs.map} +1 -1
- package/dist/{page-header-BykBsHUy.js → page-header-Maytcmgh.js} +3 -3
- package/dist/{page-header-BB6yjtce.cjs.map → page-header-Maytcmgh.js.map} +1 -1
- package/dist/{page-header-BB6yjtce.cjs → page-header-pZCts_WC.cjs} +3 -3
- package/dist/page-header-pZCts_WC.cjs.map +1 -0
- package/dist/{popover-CzHvTPk2.js → popover-BpMi52Tb.js} +3 -3
- package/dist/{popover-CzHvTPk2.js.map → popover-BpMi52Tb.js.map} +1 -1
- package/dist/{popover-BJqa6Hz6.cjs → popover-D9AfJmla.cjs} +3 -3
- package/dist/{popover-BJqa6Hz6.cjs.map → popover-D9AfJmla.cjs.map} +1 -1
- package/dist/primitives/chart-frame.cjs.js +2 -2
- package/dist/primitives/chart-frame.es.js +2 -2
- package/dist/primitives/chart-time-tick.cjs.js +2 -2
- package/dist/primitives/chart-time-tick.es.js +2 -2
- package/dist/primitives/charts/drag-selection.cjs.js +1 -1
- package/dist/primitives/charts/drag-selection.es.js +1 -1
- package/dist/primitives/menu-item.cjs.js +2 -2
- package/dist/primitives/menu-item.es.js +2 -2
- package/dist/primitives/menu-scroll-area.cjs.js +1 -1
- package/dist/primitives/menu-scroll-area.es.js +1 -1
- package/dist/primitives/resize-handle-indicator.cjs.js +1 -1
- package/dist/primitives/resize-handle-indicator.es.js +1 -1
- package/dist/primitives/trigger-button.cjs.js +2 -2
- package/dist/primitives/trigger-button.es.js +2 -2
- package/dist/{property-filter-applied--U5EZdaA.js → property-filter-applied-DoxQHG09.js} +8 -8
- package/dist/{property-filter-applied--U5EZdaA.js.map → property-filter-applied-DoxQHG09.js.map} +1 -1
- package/dist/{property-filter-applied-BkkIObRq.cjs → property-filter-applied-DuyL4S_K.cjs} +8 -8
- package/dist/{property-filter-applied-BkkIObRq.cjs.map → property-filter-applied-DuyL4S_K.cjs.map} +1 -1
- package/dist/resize/collapsible-panel.cjs.js +4 -4
- package/dist/resize/collapsible-panel.cjs.js.map +1 -1
- package/dist/resize/collapsible-panel.es.js +4 -4
- package/dist/resize/collapsible-panel.es.js.map +1 -1
- package/dist/resize/panel-drawer.cjs.js +3 -3
- package/dist/resize/panel-drawer.es.js +3 -3
- package/dist/resize/panel-icon-button.cjs.js +1 -2
- package/dist/resize/panel-icon-button.cjs.js.map +1 -1
- package/dist/resize/panel-icon-button.es.js +1 -1
- package/dist/resize/separator.cjs.js +1 -1
- package/dist/resize/separator.es.js +1 -1
- package/dist/{scroll-area-C226l0v0.js → scroll-area-9-S7wfSs.js} +2 -2
- package/dist/{scroll-area-C226l0v0.js.map → scroll-area-9-S7wfSs.js.map} +1 -1
- package/dist/{scroll-area-BP4gPZ4G.cjs → scroll-area-BU_TorPW.cjs} +2 -2
- package/dist/{scroll-area-BP4gPZ4G.cjs.map → scroll-area-BU_TorPW.cjs.map} +1 -1
- package/dist/{select-Dg8L5ROX.cjs → select-CeukeSn_.cjs} +5 -5
- package/dist/{select-Dg8L5ROX.cjs.map → select-CeukeSn_.cjs.map} +1 -1
- package/dist/{select-BdIZEdcy.js → select-dNX9If-s.js} +5 -5
- package/dist/{select-BdIZEdcy.js.map → select-dNX9If-s.js.map} +1 -1
- package/dist/{settings-BaUeaO96.js → settings-BEw_bg12.js} +2 -2
- package/dist/{settings-BaUeaO96.js.map → settings-BEw_bg12.js.map} +1 -1
- package/dist/{settings-CUVqhBbf.cjs → settings-Bminohri.cjs} +2 -2
- package/dist/{settings-CUVqhBbf.cjs.map → settings-Bminohri.cjs.map} +1 -1
- package/dist/{span-payload-primitives-CKKIAVPJ.js → span-payload-primitives-BKkRpVVO.js} +12 -12
- package/dist/{span-payload-primitives-CKKIAVPJ.js.map → span-payload-primitives-BKkRpVVO.js.map} +1 -1
- package/dist/{span-payload-primitives-D4tHWN2W.cjs → span-payload-primitives-D2NWznGy.cjs} +12 -12
- package/dist/{span-payload-primitives-D4tHWN2W.cjs.map → span-payload-primitives-D2NWznGy.cjs.map} +1 -1
- package/dist/{spinner-CnLgLj9R.js → spinner-B9ykw74u.js} +2 -2
- package/dist/{spinner-CnLgLj9R.js.map → spinner-B9ykw74u.js.map} +1 -1
- package/dist/{spinner-C8ZxiA5C.cjs → spinner-oS6q4pwx.cjs} +3 -3
- package/dist/{spinner-C8ZxiA5C.cjs.map → spinner-oS6q4pwx.cjs.map} +1 -1
- package/dist/src/domains/chat/activity/index.d.ts +1 -3
- package/dist/src/domains/chat/activity/model/activity-members.d.ts +1 -2
- package/dist/src/domains/chat/activity/model/activity-words.d.ts +1 -2
- package/dist/src/domains/chat/context/chat-context.d.ts +9 -0
- package/dist/src/domains/chat/tools/badges/knowledge-tool-badge.d.ts +2 -1
- package/dist/src/domains/chat/tools/badges/mcp-task-chip.d.ts +1 -1
- package/dist/src/domains/chat/tools/badges/workspace-data-parts.d.ts +6 -0
- package/dist/src/domains/chat/tools/tool-card-kind.d.ts +12 -2
- package/dist/src/domains/dashboards/components/dashboard-grid.d.ts +4 -1
- package/dist/src/domains/dashboards/components/dashboard-renderer.d.ts +22 -2
- package/dist/src/domains/dashboards/components/widget-controls.d.ts +3 -0
- package/dist/src/domains/dashboards/components/widget-error.d.ts +7 -2
- package/dist/src/domains/dashboards/index.d.ts +2 -2
- package/dist/src/domains/dashboards/kinds/kpis/kpis-widget.d.ts +1 -1
- package/dist/src/domains/dashboards/kinds/scores/scores-widget.d.ts +1 -1
- package/dist/src/domains/dashboards/lib/chrome.d.ts +5 -2
- package/dist/src/domains/dashboards/lib/pin-actions.d.ts +7 -0
- package/dist/src/domains/dashboards/widget-kind.d.ts +13 -0
- package/dist/src/domains/llm/models-dev-logo-slugs.d.ts +1 -0
- package/dist/src/domains/llm/provider-logo-monogram.d.ts +8 -0
- package/dist/src/domains/llm/provider-logo.d.ts +0 -4
- package/dist/src/domains/mcps/components/mcp-app-tool-result.d.ts +2 -1
- package/dist/src/domains/mcps/components/mcp-app-viewer.d.ts +7 -2
- package/dist/src/domains/mcps/hooks/use-mcp-app-tool-call.d.ts +5 -0
- package/dist/src/domains/metrics/components/chart-card.d.ts +6 -2
- package/dist/src/domains/metrics/components/kpi-card.d.ts +2 -1
- package/dist/src/domains/metrics/lib/index.d.ts +1 -0
- package/dist/src/domains/metrics/lib/series-colors.d.ts +39 -0
- package/dist/src/domains/traces/components/span-token-usage.utils.d.ts +1 -1
- package/dist/src/domains/workflows/components/workflow-combobox.d.ts +2 -1
- package/dist/src/ds/components/AgentIndicator/paint.d.ts +6 -2
- package/dist/src/ds/components/AgentIndicator/poses/coordination.d.ts +7 -0
- package/dist/src/ds/components/AgentIndicator/poses/documents.d.ts +2 -0
- package/dist/src/ds/components/AgentIndicator/poses/files.d.ts +5 -0
- package/dist/src/ds/components/AgentIndicator/poses/interface.d.ts +8 -0
- package/dist/src/ds/components/AgentIndicator/poses/knowledge-actions.d.ts +6 -0
- package/dist/src/ds/components/AgentIndicator/poses/knowledge.d.ts +2 -0
- package/dist/src/ds/components/AgentIndicator/poses/skills.d.ts +4 -0
- package/dist/src/ds/components/AgentIndicator/poses/terminal.d.ts +4 -0
- package/dist/src/ds/components/AgentIndicator/poses/thinking.d.ts +2 -0
- package/dist/src/ds/components/AgentIndicator/poses.d.ts +1 -1
- package/dist/src/ds/components/AgentIndicator/shapes.d.ts +7 -1
- package/dist/src/ds/components/Breadcrumb/crumb-switcher.d.ts +1 -0
- package/dist/src/ds/components/ChatShell/chat-shell-context.d.ts +9 -0
- package/dist/src/ds/components/ChatShell/chat-shell.d.ts +5 -0
- package/dist/src/ds/components/ChatShell/index.d.ts +2 -1
- package/dist/src/ds/components/Combobox/combobox-parts.d.ts +2 -1
- package/dist/src/ds/components/Combobox/combobox-styles.d.ts +9 -4
- package/dist/src/ds/components/Combobox/combobox.d.ts +4 -2
- package/dist/src/ds/components/CommandPalette/command-palette.d.ts +1 -1
- package/dist/src/ds/components/DateTimePicker/date-picker.d.ts +6 -1
- package/dist/src/ds/components/DateTimePicker/index.d.ts +0 -1
- package/dist/src/ds/components/DateTimeRangePicker/custom-range-editor.d.ts +3 -2
- package/dist/src/ds/components/Message/message-timestamp.d.ts +1 -0
- package/dist/src/ds/components/MessageScroller/message-scroller-context.d.ts +3 -2
- package/dist/src/ds/components/MessageScroller/message-scroller-geometry.d.ts +1 -1
- package/dist/src/ds/components/MessageScroller/message-scroller-hooks.d.ts +2 -8
- package/dist/src/ds/components/MessageScroller/message-scroller-visibility-store.d.ts +8 -0
- package/dist/src/ds/components/Metadata/index.d.ts +2 -0
- package/dist/src/ds/components/Metadata/metadata.d.ts +10 -0
- package/dist/src/ds/components/MetricsCard/index.d.ts +1 -0
- package/dist/src/ds/components/MetricsCard/metrics-card-drag-handle.d.ts +12 -0
- package/dist/src/ds/components/MetricsCard/metrics-card.d.ts +2 -0
- package/dist/src/ds/components/Steps/index.d.ts +1 -0
- package/dist/src/ds/components/Steps/step.d.ts +13 -0
- package/dist/src/ds/components/Steps/steps-context.d.ts +2 -0
- package/dist/src/ds/components/Steps/steps-root.d.ts +18 -0
- package/dist/src/ds/components/Steps/steps.d.ts +7 -0
- package/dist/src/ds/components/ai/annotations/annotatable-selection.d.ts +25 -0
- package/dist/src/ds/components/ai/annotations/annotation-comment-card.d.ts +11 -0
- package/dist/src/ds/components/ai/annotations/annotation-comment-popover.d.ts +15 -0
- package/dist/src/ds/components/ai/annotations/annotation-highlights.d.ts +1 -0
- package/dist/src/ds/components/ai/annotations/annotation-marker.d.ts +13 -0
- package/dist/src/ds/components/ai/annotations/annotation-markers.d.ts +9 -0
- package/dist/src/ds/components/ai/annotations/annotation-number.d.ts +4 -0
- package/dist/src/ds/components/ai/annotations/annotation-selection-toolbar.d.ts +7 -0
- package/dist/src/ds/components/ai/annotations/chat-annotations.d.ts +27 -0
- package/dist/src/ds/components/ai/annotations/composer-annotation-list.d.ts +6 -0
- package/dist/src/ds/components/ai/annotations/composer-annotations.d.ts +5 -0
- package/dist/src/ds/components/ai/annotations/format-annotated-message.d.ts +11 -0
- package/dist/src/ds/components/ai/annotations/index.d.ts +5 -0
- package/dist/src/ds/components/ai/annotations/transcript-annotations.d.ts +6 -0
- package/dist/src/ds/components/ai/annotations/use-annotation-placement.d.ts +11 -0
- package/dist/src/ds/components/ai/annotations/use-annotation-selection.d.ts +12 -0
- package/dist/src/ds/components/ai/tool-call/index.d.ts +3 -0
- package/dist/src/ds/components/ai/tool-call/tool-call-body.d.ts +6 -0
- package/dist/src/ds/components/ai/tool-call/tool-call-exit-status.d.ts +11 -0
- package/dist/src/ds/components/ai/tool-call/tool-call-output.d.ts +1 -2
- package/dist/src/ds/components/ai/tool-call/tool-call-view.d.ts +17 -0
- package/dist/src/ds/components/ai/tool-call/tool-phrases.d.ts +127 -138
- package/dist/src/ds/components/ai/tool-call/tool-presentation.d.ts +2 -0
- package/dist/src/ds/components/ai/tool-call/tool-styles.d.ts +10 -0
- package/dist/src/ds/components/ai/transcript-divider/transcript-divider.d.ts +2 -2
- package/dist/src/ds/icons/ByteDanceIcon.d.ts +2 -0
- package/dist/src/ds/icons/CohereBrandIcon.d.ts +2 -0
- package/dist/src/ds/icons/FireworksIcon.d.ts +2 -0
- package/dist/src/ds/icons/LongCatIcon.d.ts +2 -0
- package/dist/src/ds/icons/MicrosoftIcon.d.ts +2 -0
- package/dist/src/ds/icons/MorphIcon.d.ts +2 -0
- package/dist/src/ds/icons/NousResearchIcon.d.ts +2 -0
- package/dist/src/ds/icons/NovaIcon.d.ts +2 -0
- package/dist/src/ds/icons/PerplexityIcon.d.ts +2 -0
- package/dist/src/ds/icons/SakanaIcon.d.ts +2 -0
- package/dist/src/ds/icons/StepFunIcon.d.ts +2 -0
- package/dist/src/ds/icons/TencentIcon.d.ts +2 -0
- package/dist/src/ds/icons/UpstageIcon.d.ts +2 -0
- package/dist/src/ds/icons/index.d.ts +13 -0
- package/dist/src/ds/tokens/colors.d.ts +12 -0
- package/dist/src/ee/signals/sankey-signals-data.d.ts +2 -2
- package/dist/src/ee/signals/snapshot-summary.d.ts +7 -0
- package/dist/src/ee/signals/snapshot-timeline.d.ts +2 -1
- package/dist/src/hooks/use-clock.d.ts +5 -0
- package/dist/src/lib/resize/collapsible-panel.d.ts +5 -3
- package/dist/src/lib/string.d.ts +1 -0
- package/dist/{string-CNKDIc_4.js → string-CA5M0mj_.js} +5 -2
- package/dist/{string-CNKDIc_4.js.map → string-CA5M0mj_.js.map} +1 -1
- package/dist/{string-DdJJdCv2.cjs → string-EyTazW-F.cjs} +10 -1
- package/dist/{string-DdJJdCv2.cjs.map → string-EyTazW-F.cjs.map} +1 -1
- package/dist/style.css +321 -144
- package/dist/{tabbed-container-B4lCBgRP.cjs → tabbed-container-Bhfi-DWr.cjs} +9 -9
- package/dist/{tabbed-container-B4lCBgRP.cjs.map → tabbed-container-Bhfi-DWr.cjs.map} +1 -1
- package/dist/{tabbed-container-DI1GI1Qv.js → tabbed-container-DOkHshha.js} +8 -8
- package/dist/{tabbed-container-DI1GI1Qv.js.map → tabbed-container-DOkHshha.js.map} +1 -1
- package/dist/{tabs-content-CmXe5ML0.cjs → tabs-content-BACwMrMG.cjs} +3 -3
- package/dist/{tabs-content-CmXe5ML0.cjs.map → tabs-content-BACwMrMG.cjs.map} +1 -1
- package/dist/{tabs-content-D__B9hd-.js → tabs-content-DwU_eA-a.js} +3 -3
- package/dist/{tabs-content-D__B9hd-.js.map → tabs-content-DwU_eA-a.js.map} +1 -1
- package/dist/{tabs-tab-CYTZevdV.js → tabs-tab-BHs639jL.js} +4 -4
- package/dist/{tabs-tab-CYTZevdV.js.map → tabs-tab-BHs639jL.js.map} +1 -1
- package/dist/{tabs-tab-DGwfHVDr.cjs → tabs-tab-CANh2eAD.cjs} +4 -4
- package/dist/{tabs-tab-DGwfHVDr.cjs.map → tabs-tab-CANh2eAD.cjs.map} +1 -1
- package/dist/{toast-api-D_rrRhNG.js → toast-api-Cak5N8pT.js} +2 -2
- package/dist/{toast-api-D_rrRhNG.js.map → toast-api-Cak5N8pT.js.map} +1 -1
- package/dist/{toast-api-qtkOucy2.cjs → toast-api-DDcGCbIw.cjs} +2 -2
- package/dist/{toast-api-qtkOucy2.cjs.map → toast-api-DDcGCbIw.cjs.map} +1 -1
- package/dist/tokens.cjs.js +12 -0
- package/dist/tokens.cjs.js.map +1 -1
- package/dist/tokens.es.js +12 -0
- package/dist/tokens.es.js.map +1 -1
- package/dist/{tool-approval-CJvPDL7D.cjs → tool-approval-CguPaikn.cjs} +7 -7
- package/dist/{tool-approval-CJvPDL7D.cjs.map → tool-approval-CguPaikn.cjs.map} +1 -1
- package/dist/{tool-approval-DyN11vFA.js → tool-approval-Cjz0yAzw.js} +7 -7
- package/dist/{tool-approval-DyN11vFA.js.map → tool-approval-Cjz0yAzw.js.map} +1 -1
- package/dist/tool-call-BqDI9mrY.cjs +600 -0
- package/dist/tool-call-BqDI9mrY.cjs.map +1 -0
- package/dist/tool-call-ChJKYCfu.js +505 -0
- package/dist/tool-call-ChJKYCfu.js.map +1 -0
- package/dist/{tool-card-BOLXeKIp.cjs → tool-card-Dg4VOYV6.cjs} +24 -15
- package/dist/tool-card-Dg4VOYV6.cjs.map +1 -0
- package/dist/{tool-card-HZ5bm7ue.js → tool-card-GSiCfxMz.js} +25 -16
- package/dist/tool-card-GSiCfxMz.js.map +1 -0
- package/dist/tool-presentation-C2bYQ7gB.js +874 -0
- package/dist/tool-presentation-C2bYQ7gB.js.map +1 -0
- package/dist/tool-presentation-DPp9h-n2.cjs +915 -0
- package/dist/tool-presentation-DPp9h-n2.cjs.map +1 -0
- package/dist/{tooltip-BiRLT3Th.cjs → tooltip-BsExuMO8.cjs} +2 -2
- package/dist/{tooltip-BiRLT3Th.cjs.map → tooltip-BsExuMO8.cjs.map} +1 -1
- package/dist/{tooltip-HzcLyGtV.js → tooltip-DJcze2VZ.js} +2 -2
- package/dist/{tooltip-HzcLyGtV.js.map → tooltip-DJcze2VZ.js.map} +1 -1
- package/dist/{transcript-divider-CvdgElIC.js → transcript-divider-DM2HkdeO.js} +5 -11
- package/dist/transcript-divider-DM2HkdeO.js.map +1 -0
- package/dist/{transcript-divider-CQ6sc3nt.cjs → transcript-divider-DroC3feH.cjs} +4 -10
- package/dist/transcript-divider-DroC3feH.cjs.map +1 -0
- package/dist/{use-workflow-graph-runtime-BKNhOKsH.js → use-workflow-graph-runtime-B3VUuhUE.js} +12 -12
- package/dist/{use-workflow-graph-runtime-BKNhOKsH.js.map → use-workflow-graph-runtime-B3VUuhUE.js.map} +1 -1
- package/dist/{use-workflow-graph-runtime-DYao-08R.cjs → use-workflow-graph-runtime-BfCL6nd4.cjs} +12 -12
- package/dist/{use-workflow-graph-runtime-DYao-08R.cjs.map → use-workflow-graph-runtime-BfCL6nd4.cjs.map} +1 -1
- package/dist/utils/string.cjs.js +2 -1
- package/dist/utils/string.es.js +1 -1
- package/dist/utils/toast.cjs.js +1 -1
- package/dist/utils/toast.es.js +1 -1
- package/oxlint/copy-rules.d.ts +4 -0
- package/oxlint/copy-rules.js +29 -0
- package/oxlint/copy-sources.js +223 -0
- package/oxlint/index.d.ts +5 -0
- package/oxlint/index.js +17 -0
- package/package.json +13 -10
- package/theme/data-viz.css +33 -0
- package/dist/AgentIndicator-Bs2S8AWJ.js +0 -847
- package/dist/AgentIndicator-Bs2S8AWJ.js.map +0 -1
- package/dist/AgentIndicator-to30W73z.cjs +0 -864
- package/dist/AgentIndicator-to30W73z.cjs.map +0 -1
- package/dist/Button-CLXTbAY8.js.map +0 -1
- package/dist/Button-DLcMcuUL.cjs.map +0 -1
- package/dist/Composer-BcueJvdX.cjs.map +0 -1
- package/dist/Composer-D1gF-0jZ.js.map +0 -1
- package/dist/FilterBar-BSP2UTjc.cjs.map +0 -1
- package/dist/FilterBar-PSQ1OwqH.js.map +0 -1
- package/dist/Message-jj56lxNL.cjs.map +0 -1
- package/dist/MessageScroller-CGsfTd1Z.cjs.map +0 -1
- package/dist/MessageScroller-DvaKlm4O.js.map +0 -1
- package/dist/MetricsCard-BEwiS7Pe.cjs.map +0 -1
- package/dist/MetricsCard-ua6C6b8a.js.map +0 -1
- package/dist/Workflow-C3SlEdP-.js.map +0 -1
- package/dist/Workflow-DSWQ-ROz.cjs.map +0 -1
- package/dist/activity-C8Ql81WM.js.map +0 -1
- package/dist/activity-CcQZeDYi.cjs.map +0 -1
- package/dist/combobox-D21no8t5.js.map +0 -1
- package/dist/combobox-DIT_6xiG.cjs.map +0 -1
- package/dist/combobox-parts-C4phOq4t.cjs.map +0 -1
- package/dist/combobox-parts-D90ir0Py.js.map +0 -1
- package/dist/date-time-range-picker-CWGjoR3j.cjs.map +0 -1
- package/dist/date-time-range-picker-CdSiXwB4.js.map +0 -1
- package/dist/domains/chat/activity/components/activity-timed-trigger.cjs.js +0 -29
- package/dist/domains/chat/activity/components/activity-timed-trigger.cjs.js.map +0 -1
- package/dist/domains/chat/activity/components/activity-timed-trigger.d.ts +0 -1
- package/dist/domains/chat/activity/components/activity-timed-trigger.es.js +0 -28
- package/dist/domains/chat/activity/components/activity-timed-trigger.es.js.map +0 -1
- package/dist/domains/mcps/components/mcp-app-viewer.cjs.js.map +0 -1
- package/dist/domains/mcps/components/mcp-app-viewer.es.js.map +0 -1
- package/dist/page-header-BykBsHUy.js.map +0 -1
- package/dist/src/domains/chat/activity/components/activity-timed-trigger.d.ts +0 -9
- package/dist/src/ds/components/DateTimePicker/time-picker.d.ts +0 -7
- package/dist/tool-call-DBn14X-3.cjs +0 -497
- package/dist/tool-call-DBn14X-3.cjs.map +0 -1
- package/dist/tool-call-Dsj43lvJ.js +0 -426
- package/dist/tool-call-Dsj43lvJ.js.map +0 -1
- package/dist/tool-card-BOLXeKIp.cjs.map +0 -1
- package/dist/tool-card-HZ5bm7ue.js.map +0 -1
- package/dist/tool-presentation-CvibOP1J.js +0 -256
- package/dist/tool-presentation-CvibOP1J.js.map +0 -1
- package/dist/tool-presentation-D6nzVruN.cjs +0 -291
- package/dist/tool-presentation-D6nzVruN.cjs.map +0 -1
- package/dist/transcript-divider-CQ6sc3nt.cjs.map +0 -1
- package/dist/transcript-divider-CvdgElIC.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FilterBar-PSQ1OwqH.js","names":["_Fragment","_Fragment"],"sources":["../src/ds/components/FilterBar/filter-bar-input.tsx","../src/ds/components/FilterBar/use-settle-on-leave.ts","../src/ds/components/FilterBar/filter-bar-group-editor.tsx","../src/ds/components/FilterBar/filter-bar-advanced-chip.tsx","../src/ds/components/FilterBar/filter-bar-clear.tsx","../src/ds/components/FilterBar/filter-bar.tsx","../src/ds/components/FilterBar/default-operators.ts"],"sourcesContent":["import type { BaseUIEvent } from '@base-ui/react/types';\nimport { BracesIcon, ListFilterIcon } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { KeyboardEvent } from 'react';\nimport { flushSync } from 'react-dom';\nimport { FILTER_BAR_CONTROL_SIZE, FilterBarFieldLabel, alwaysHighlightProps } from './filter-bar-chip';\nimport { useFilterBarContext } from './filter-bar-context';\nimport { FilterBarOptionLabel, FilterBarOptionList } from './filter-bar-option-list';\nimport { findGroup } from './filter-bar-tree';\nimport { matchesQueryFilter } from './match-query';\nimport type { FilterBarDraft, FilterBarField, FilterBarOperator, FilterBarOption, FilterBarValue } from './types';\nimport { parseFieldValue } from './types';\nimport { useValueStep } from './use-value-step';\nimport { Button } from '@/ds/components/Button/Button';\nimport { ComboboxPrimitive, comboboxStyles } from '@/ds/components/Combobox';\nimport { comboboxTriggerClass } from '@/ds/components/Combobox/combobox-styles';\nimport { Kbd } from '@/ds/components/Kbd/kbd';\nimport { Txt } from '@/ds/components/Txt';\nimport { FLOATING_POSITION_METHOD } from '@/ds/primitives/floating';\nimport { inputFocusBorderWithin, unstyledFormElementStyle } from '@/ds/primitives/form-element';\nimport { MENU_SIDE_OFFSET } from '@/ds/primitives/menu-item';\nimport { passwordManagerOptOutProps } from '@/ds/primitives/password-manager-autofill';\nimport { usePortalContainer } from '@/ds/primitives/portal-container';\nimport { useIsApplePlatform } from '@/hooks/use-keyboard-shortcut-label';\nimport { cn } from '@/lib/utils';\n\ntype Step = 'field' | 'operator' | 'value';\n\ntype Item = FilterBarField | FilterBarOperator | FilterBarOption;\n\nconst getItemLabel = (item: Item) => ('label' in item && item.label ? item.label : 'value' in item ? item.value : '');\n\nconst EMPTY_ITEMS: readonly Item[] = [];\n/** Pinned last entry of the field list that spawns an advanced filter (an `or` group) instead of a filter. */\nconst ADVANCED_FIELD_ID = '__filter-bar-advanced__';\nconst ADVANCED_FIELD: FilterBarField = {\n id: ADVANCED_FIELD_ID,\n label: 'Advanced filter…',\n icon: BracesIcon,\n operators: [],\n};\n\nexport type FilterBarInputProps = {\n placeholder?: string;\n className?: string;\n 'aria-label'?: string;\n /**\n * Group this instance commits into; omit for the bar's own input. Only the instance whose\n * `groupId` matches the provider's `inputTarget` renders, so a single input is ever mounted.\n */\n groupId?: string;\n /** Called when Escape is pressed on an empty query inside a group, after the input hands back to the bar. */\n onLeave?: () => void;\n};\n\n/**\n * Typeahead entry point: type to pick a field, then an operator, then a value.\n * Focus never leaves the input; the popup is driven with the arrow keys.\n */\nexport function FilterBarInput(props: FilterBarInputProps) {\n const ctx = useFilterBarContext();\n if (ctx.inputTarget !== props.groupId) return null;\n return <FilterBarInputImpl {...props} />;\n}\n\nfunction FilterBarInputImpl({\n placeholder = 'Filter',\n className,\n 'aria-label': ariaLabel = 'Add filter',\n groupId,\n onLeave,\n}: FilterBarInputProps) {\n const ctx = useFilterBarContext();\n const container = usePortalContainer();\n const inputRef = useRef<HTMLInputElement | null>(null);\n const anchorRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [highlighted, setHighlighted] = useState<Item | null>(null);\n const [emptyForStepChange, setEmptyForStepChange] = useState(false);\n const modEnterLabel = useIsApplePlatform() ? '⌘↵' : 'Ctrl ↵';\n\n // The draft lives in the provider so the chip list can render it; the step follows from it.\n const { draft, setDraft: setDraftState, commitDraft } = ctx;\n const step: Step = !draft ? 'field' : !draft.operatorId ? 'operator' : 'value';\n const field = draft ? ctx.getField(draft.fieldId) : undefined;\n const fieldOperators = useMemo(() => (field ? ctx.getFieldOperators(field) : []), [ctx, field]);\n const operator = draft?.operatorId\n ? (fieldOperators.find(o => o.id === draft.operatorId) ?? ctx.getOperator(draft.operatorId))\n : undefined;\n // The advanced option lives in the bar only; inside a popover, nesting is the editor's `+ Group`.\n const offerAdvanced = ctx.groupsEnabled && groupId === undefined;\n const visibleFields = useMemo(() => {\n const fields = ctx.fields.filter(f => !f.hidden);\n return offerAdvanced ? [...fields, ADVANCED_FIELD] : fields;\n }, [ctx.fields, offerAdvanced]);\n const targetGroup = groupId ? findGroup(ctx.expression, groupId) : undefined;\n\n // A group's input mounts on demand (see `openGroupInput`) and takes focus itself.\n useEffect(() => {\n if (groupId) inputRef.current?.focus();\n }, [groupId]);\n\n // Base UI owns the highlight index and keeps it when the list content changes, so a row\n // reached with ArrowDown would carry over into the step that follows. An empty list committed\n // first drops that index, and `autoHighlight` re-anchors on the first row of the new step.\n const withHighlightReset = useCallback((change: () => void) => {\n flushSync(() => setEmptyForStepChange(true));\n change();\n setEmptyForStepChange(false);\n }, []);\n\n const setDraft = useCallback(\n (next: Omit<FilterBarDraft, 'id' | 'from'> | null) => withHighlightReset(() => setDraftState(next)),\n [withHighlightReset, setDraftState],\n );\n\n const reset = useCallback(() => {\n setDraftState(null);\n setQuery('');\n }, [setDraftState]);\n\n const close = useCallback(() => {\n setOpen(false);\n reset();\n }, [reset]);\n\n const commit = useCallback(\n (fieldId: string, operatorId: string, value: FilterBarValue) => {\n withHighlightReset(() => commitDraft({ fieldId, operatorId }, value));\n setQuery('');\n inputRef.current?.focus();\n },\n [withHighlightReset, commitDraft],\n );\n\n const selectOperator = useCallback(\n (fieldId: string, next: FilterBarOperator) => {\n if (next.arity === 'none') {\n commit(fieldId, next.id, '');\n return;\n }\n setDraft({ fieldId, operatorId: next.id });\n setQuery('');\n },\n [commit, setDraft],\n );\n\n const selectField = useCallback(\n (next: FilterBarField) => {\n if (next.id === ADVANCED_FIELD_ID) {\n // `or` is the useful default: an `and` group is indistinguishable from the root.\n const id = ctx.addGroup(undefined, 'or');\n ctx.setOpenGroup(id);\n ctx.openGroupInput(id);\n setQuery('');\n setOpen(false);\n return;\n }\n const [only, ...rest] = ctx.getFieldOperators(next);\n // Free-text entry with text already typed: that text is the value, so neither the\n // operator nor the value step has anything left to ask.\n if (next.search && only && query.trim() !== '') {\n commit(next.id, only.id, parseFieldValue(next.type, query));\n return;\n }\n // A single allowed operator is implied: skip straight to the value step.\n if (only && rest.length === 0) {\n selectOperator(next.id, only);\n return;\n }\n setDraft({ fieldId: next.id });\n setQuery('');\n },\n [ctx, commit, query, selectOperator, setDraft],\n );\n\n const valueStep = useValueStep({\n field,\n operator,\n query,\n enabled: open && step === 'value',\n setQuery,\n onCommit: value => {\n if (draft?.operatorId) commit(draft.fieldId, draft.operatorId, value);\n },\n });\n\n // Leaving a group's input hands the target back to the bar; empty groups are pruned when the\n // popover closes, never here.\n const leaveGroup = useCallback(() => {\n if (!groupId) return false;\n ctx.openGroupInput(undefined);\n onLeave?.();\n return true;\n }, [ctx, groupId, onLeave]);\n\n const stepBack = useCallback(() => {\n if (step === 'value' && draft) {\n // Back to the field step when the operator was implied (single operator).\n const skipOperator = field ? fieldOperators.length === 1 : false;\n setDraft(skipOperator ? null : { fieldId: draft.fieldId });\n } else if (step === 'operator') setDraft(null);\n else if (!leaveGroup()) setOpen(false);\n setQuery('');\n }, [step, draft, field, fieldOperators, setDraft, leaveGroup]);\n\n // Selection is routed per step and never kept by Base UI (`value` stays null).\n const handleSelect = (item: Item) => {\n if (step === 'field') selectField(item as FilterBarField);\n else if (step === 'operator' && draft) selectOperator(draft.fieldId, item as FilterBarOperator);\n else valueStep.handleSelect(item as FilterBarOption);\n };\n\n // App-level keys run before Base UI's own input handling.\n const handleKeyDown = (event: BaseUIEvent<KeyboardEvent<HTMLInputElement>>) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n // Consumed here: an enclosing popover (advanced filter) must not close on it.\n event.stopPropagation();\n event.preventBaseUIHandler();\n stepBack();\n return;\n }\n if (!open && (event.key === 'ArrowDown' || event.key === 'Enter')) {\n event.preventDefault();\n event.preventBaseUIHandler();\n setOpen(true);\n return;\n }\n if (query === '') {\n if (event.key === 'Backspace') {\n event.preventDefault();\n event.preventBaseUIHandler();\n if (step !== 'field') stepBack();\n else if (targetGroup) {\n // Inside a group: eat its last chip, or drop the group once it is empty.\n const last = targetGroup.nodes.findLast(node => !ctx.leaving.has(node.id));\n if (last) ctx.removeItem(last.id);\n else leaveGroup();\n } else {\n // Chips still animating out are already gone from the value: skip them.\n const last = ctx.items.findLast(item => !ctx.leaving.has(item.id));\n if (last) ctx.removeItem(last.id);\n }\n return;\n }\n if (event.key === 'ArrowLeft' && step === 'field') {\n if (ctx.focusChip(ctx.items.length - 1, -1, 'remove')) event.preventDefault();\n return;\n }\n }\n if (!open) return;\n\n if (event.key === 'Tab' && highlighted && step !== 'value' && (step === 'operator' || query !== '')) {\n event.preventDefault();\n event.preventBaseUIHandler();\n handleSelect(highlighted);\n return;\n }\n if (step === 'value') {\n const highlightedOption = valueStep.hasSuggestions ? (highlighted as FilterBarOption | null) : null;\n const handled = valueStep.handleKeyDown(event, highlightedOption);\n // Base UI closes on Enter when nothing is highlighted (form submission); the draft must stay open.\n if (handled || (event.key === 'Enter' && highlightedOption === null)) event.preventBaseUIHandler();\n }\n };\n\n const optionsForStep: Record<Step, readonly Item[]> = {\n field: visibleFields,\n operator: fieldOperators,\n value: valueStep.options,\n };\n const items: readonly Item[] = emptyForStepChange ? EMPTY_ITEMS : optionsForStep[step];\n\n // A search field is the way out for text that names no field, so it survives the field\n // step's own filtering whatever was typed; every other item matches on its label.\n const filterItem = useCallback(\n (item: Item, text: string, itemToString?: (item: Item) => string) =>\n ('search' in item && item.search === true) || matchesQueryFilter(item, text, itemToString),\n [],\n );\n\n const inputPlaceholder =\n step === 'field'\n ? placeholder\n : step === 'operator'\n ? 'Operator'\n : valueStep.hasSuggestions && valueStep.allowFreeText\n ? 'Search or type a value'\n : field?.type === 'number'\n ? 'Number'\n : 'Value';\n\n return (\n <>\n <ComboboxPrimitive.Root<Item>\n items={items}\n itemToStringLabel={getItemLabel}\n // The value step is already filtered (locally or server-side) by useValueSuggestions.\n filter={step === 'value' ? null : filterItem}\n value={null}\n onValueChange={(item, details) => {\n // Never let Base UI keep the selection, fill the input or close: each step routes it.\n details.cancel();\n if (item) handleSelect(item);\n }}\n inputValue={query}\n onInputValueChange={(next, details) => {\n if (details.reason !== 'input-change') return;\n setQuery(next);\n if (!open) setOpen(true);\n }}\n onItemHighlighted={item => setHighlighted(item ?? null)}\n open={open}\n onOpenChange={(next, details) => {\n // Escape is handled by the input (it steps back rather than closing).\n if (!next && details.reason === 'escape-key') return;\n // The input is the anchor, not a trigger: clicking it must keep the draft open.\n if (\n !next &&\n details.reason === 'outside-press' &&\n details.event.target instanceof Node &&\n inputRef.current?.contains(details.event.target)\n ) {\n return;\n }\n if (next) setOpen(true);\n else close();\n }}\n {...alwaysHighlightProps}\n modal={false}\n >\n <div\n ref={anchorRef}\n data-slot=\"filter-bar-input-trigger\"\n className={cn(\n // Same trigger recipe as every other DS Combobox (fill, radius, `[&>svg]` icon sizing\n // and the Button icon offset); the bar itself has no chrome. Focus lives on the\n // nested input, so the recipe's `focus-visible` border becomes `focus-within`.\n comboboxTriggerClass({ variant: 'default', size: FILTER_BAR_CONTROL_SIZE }),\n 'w-auto cursor-text',\n 'focus-within:bg-fill-hover',\n inputFocusBorderWithin,\n step === 'field' ? 'min-w-40' : 'min-w-28',\n className,\n )}\n >\n <ListFilterIcon aria-hidden className=\"shrink-0\" />\n <ComboboxPrimitive.Input\n ref={el => {\n inputRef.current = el;\n ctx.registerInput(el);\n }}\n aria-label={ariaLabel}\n spellCheck={false}\n {...passwordManagerOptOutProps}\n data-slot=\"filter-bar-input\"\n data-step={step}\n data-target={targetGroup?.id}\n inputMode={step === 'value' && field?.type === 'number' ? 'decimal' : undefined}\n placeholder={inputPlaceholder}\n className={cn(\n unstyledFormElementStyle,\n 'min-w-0 flex-1 bg-transparent',\n 'placeholder:text-muted-foreground placeholder:transition-opacity placeholder:duration-normal focus:placeholder:opacity-70',\n )}\n onFocus={() => setOpen(true)}\n onKeyDown={handleKeyDown}\n />\n </div>\n <ComboboxPrimitive.Portal container={container}>\n <ComboboxPrimitive.Positioner\n // Base UI anchors to the input, which starts after the filter icon; align with the pill instead.\n anchor={anchorRef}\n align=\"start\"\n sideOffset={MENU_SIDE_OFFSET}\n positionMethod={FLOATING_POSITION_METHOD}\n className={comboboxStyles.positioner}\n >\n <ComboboxPrimitive.Popup // Match the pill, with the DS Combobox's 11rem floor (replaces the menu's anchor-width minimum).\n className={cn(comboboxStyles.popup, 'w-(--anchor-width) min-w-44')}\n data-slot=\"filter-bar-editor\"\n >\n {step === 'field' && (\n <FilterBarOptionList<FilterBarField>\n aria-label=\"Fields\"\n getKey={f => f.id}\n renderOption={f => (\n <>\n <FilterBarFieldLabel field={f} />\n {f.search && query !== '' && (\n <span className=\"min-w-0 truncate text-muted-foreground\">\n {ctx.getFieldOperators(f)[0]?.label} \"{query}\"\n </span>\n )}\n </>\n )}\n emptyText=\"No matching field.\"\n />\n )}\n {step === 'operator' && (\n <FilterBarOptionList<FilterBarOperator>\n aria-label=\"Operators\"\n getKey={o => o.id}\n renderOption={o => o.label}\n emptyText=\"No matching operator.\"\n />\n )}\n {step === 'value' && valueStep.hasOptions && (\n <FilterBarOptionList<FilterBarOption>\n aria-label=\"Values\"\n aria-multiselectable={valueStep.isMany || undefined}\n getKey={o => o.value}\n renderOption={option => <FilterBarOptionLabel option={option} />}\n isSelected={o => valueStep.isMany && valueStep.selected.includes(o.value)}\n isLoading={valueStep.isLoading}\n error={valueStep.error}\n emptyText={\n valueStep.allowFreeText ? 'No suggestions — press Enter to use your text.' : 'No matching value.'\n }\n />\n )}\n {step === 'value' && !valueStep.hasSuggestions && (\n <div className=\"flex items-center justify-between gap-2 py-1 pr-1 pl-[.9em]\">\n <Txt variant=\"caption\" tone=\"muted\">\n Type a value\n </Txt>\n <Button\n size=\"sm\"\n variant=\"default\"\n disabled={!valueStep.canCommitQuery}\n onMouseDown={e => e.preventDefault()}\n onClick={() => valueStep.submitFreeText()}\n >\n Apply\n <Kbd size=\"xs\">↵</Kbd>\n </Button>\n </div>\n )}\n {step === 'value' && valueStep.isMany && (\n <div className=\"flex items-center justify-end gap-1 border-t border-border p-1\">\n <Button\n size=\"sm\"\n variant=\"default\"\n onMouseDown={e => e.preventDefault()}\n onClick={() => valueStep.commitDone()}\n >\n Done\n <Kbd size=\"xs\">{modEnterLabel}</Kbd>\n </Button>\n </div>\n )}\n </ComboboxPrimitive.Popup>\n </ComboboxPrimitive.Positioner>\n </ComboboxPrimitive.Portal>\n </ComboboxPrimitive.Root>\n </>\n );\n}\n","import { useEffect } from 'react';\nimport { useFilterBarContext } from './filter-bar-context';\n\n/** Keeps a leaving node in the DOM until its exit animation has played, then releases it. */\nexport function useSettleOnLeave(id: string, leaving: boolean, rootRef: React.RefObject<HTMLElement | null>) {\n const { settleRemove } = useFilterBarContext();\n useEffect(() => {\n const root = rootRef.current;\n if (!leaving || !root) return;\n const animations = typeof root.getAnimations === 'function' ? root.getAnimations({ subtree: true }) : [];\n if (animations.length === 0) {\n settleRemove(id);\n return;\n }\n let cancelled = false;\n Promise.all(animations.map(animation => animation.finished))\n .then(() => {\n if (!cancelled) settleRemove(id);\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, [leaving, id, settleRemove, rootRef]);\n}\n","import { FolderIcon, FolderPlusIcon, PlusIcon, Trash2Icon } from 'lucide-react';\nimport { Fragment, useEffect, useRef } from 'react';\nimport type { ReactNode } from 'react';\nimport { FilterBarChip } from './filter-bar-chip';\nimport { useFilterBarContext } from './filter-bar-context';\nimport { FilterBarInput } from './filter-bar-input';\nimport { countLeaves } from './filter-bar-tree';\nimport type { FilterBarGroup, FilterBarLogic } from './types';\nimport { isFilterBarGroup } from './types';\nimport { useSettleOnLeave } from './use-settle-on-leave';\nimport { Button } from '@/ds/components/Button/Button';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nconst connectorClass =\n 'flex h-control-sm w-14 shrink-0 items-center justify-center rounded-md text-column tracking-wide text-muted-foreground uppercase';\n\nexport type FilterBarLogicToggleProps = {\n groupId: string;\n logic: FilterBarLogic;\n className?: string;\n};\n\n/** `and` / `or` connector in front of a row; every connector of a group shares its logic. */\nexport function FilterBarLogicToggle({ groupId, logic, className }: FilterBarLogicToggleProps) {\n const ctx = useFilterBarContext();\n const next: FilterBarLogic = logic === 'and' ? 'or' : 'and';\n return (\n <button\n type=\"button\"\n data-slot=\"filter-bar-logic\"\n data-logic={logic}\n aria-label={`Joined with ${logic}, switch to ${next}`}\n title={`Switch to ${next}`}\n className={cn(\n connectorClass,\n 'filter-bar-logic cursor-pointer border border-border bg-fill-subtle outline-none',\n 'hover:bg-fill-hover hover:text-foreground focus-visible:bg-fill-hover focus-visible:text-foreground',\n className,\n )}\n onClick={() => ctx.setLogic(groupId, next)}\n >\n {logic}\n </button>\n );\n}\n\n/** Segmented `and | or` control shown in a nested group's header. */\nfunction FilterBarLogicSwitch({ groupId, logic }: { groupId: string; logic: FilterBarLogic }) {\n const ctx = useFilterBarContext();\n return (\n <div\n role=\"radiogroup\"\n aria-label=\"Group logic\"\n className=\"flex h-control-sm items-center gap-0.5 rounded-md border border-border bg-fill-subtle p-0.5\"\n >\n {(['and', 'or'] as const).map(value => (\n <button\n key={value}\n type=\"button\"\n role=\"radio\"\n aria-checked={logic === value}\n aria-label={`Join with ${value}`}\n className={cn(\n 'h-full cursor-pointer rounded-sm px-1.5 text-column tracking-wide uppercase outline-none',\n 'focus-visible:bg-fill-hover',\n logic === value ? 'bg-fill-hover text-foreground' : 'text-muted-foreground hover:text-foreground',\n )}\n onClick={() => logic !== value && ctx.setLogic(groupId, value)}\n >\n {value}\n </button>\n ))}\n </div>\n );\n}\n\nexport type FilterBarGroupEditorProps = {\n group: FilterBarGroup;\n /** Nesting level of `group` (root-level group = 1). */\n depth: number;\n /** Drops this group; rendered as a trailing `Clear all` in the footer. */\n onRemove?: () => void;\n removeLabel?: string;\n className?: string;\n};\n\n/**\n * Recursive rule builder shown in an advanced-filter popover. Rows are laid out as\n * `connector | condition`: the first row reads `where`, the following ones carry the\n * group's `and` / `or` toggle. Nested groups render as bordered cards with their own\n * header (logic switch + remove) and footer. The shared typeahead input renders as the\n * last row of the group it is pointed at.\n */\nexport function FilterBarGroupEditor({\n group,\n depth,\n onRemove,\n removeLabel = 'Remove group',\n className,\n}: FilterBarGroupEditorProps) {\n const ctx = useFilterBarContext();\n const addFilterRef = useRef<HTMLButtonElement>(null);\n const focusAddFilter = useRef(false);\n const targeted = ctx.inputTarget === group.id;\n const canNest = depth < ctx.maxDepth;\n\n // `+ Condition` is hidden while the input is open; focus it once it remounts.\n useEffect(() => {\n if (targeted || !focusAddFilter.current) return;\n focusAddFilter.current = false;\n addFilterRef.current?.focus();\n }, [targeted]);\n\n const rows: ReactNode[] = [];\n const connector = (key: string) =>\n rows.length === 0 ? (\n <span key={`${key}:where`} className={connectorClass}>\n where\n </span>\n ) : (\n <FilterBarLogicToggle key={`${key}:logic`} groupId={group.id} logic={group.logic} />\n );\n for (const node of group.nodes) {\n rows.push(\n <Fragment key={node.id}>\n {connector(node.id)}\n {isFilterBarGroup(node) ? (\n <NestedGroupCard group={node} depth={depth + 1} />\n ) : (\n <FilterBarChip item={node} className=\"w-fit\" />\n )}\n </Fragment>,\n );\n }\n if (ctx.draft && ctx.draft.groupId === group.id) {\n const { id, fieldId, operatorId = '' } = ctx.draft;\n rows.push(\n <Fragment key={id}>\n {connector(id)}\n <FilterBarChip draft item={{ id, fieldId, operatorId, value: '' }} className=\"w-fit\" />\n </Fragment>,\n );\n }\n if (targeted) {\n rows.push(\n <Fragment key=\"input\">\n {connector('input')}\n <FilterBarInput\n groupId={group.id}\n placeholder=\"Add condition\"\n onLeave={() => {\n focusAddFilter.current = true;\n }}\n />\n </Fragment>,\n );\n }\n\n return (\n <div\n data-slot=\"filter-bar-group-editor\"\n data-depth={depth}\n role=\"group\"\n aria-label={`Conditions joined with ${group.logic}`}\n className={cn('flex min-w-0 flex-col', className)}\n >\n {rows.length > 0 && (\n <div className=\"grid grid-cols-[auto_minmax(0,1fr)] items-start gap-x-2 gap-y-1.5 p-2\">{rows}</div>\n )}\n <div\n data-slot=\"filter-bar-editor-actions\"\n className={cn('flex w-full items-center gap-1 p-1', rows.length > 0 && 'border-t border-border')}\n >\n {!targeted && (\n <Button\n ref={addFilterRef}\n variant=\"ghost\"\n size=\"sm\"\n icon={<PlusIcon />}\n onClick={() => ctx.openGroupInput(group.id)}\n >\n Condition\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n icon={<FolderPlusIcon />}\n className=\"text-muted-foreground\"\n tooltip={canNest ? undefined : `Groups can nest ${ctx.maxDepth} levels deep`}\n disabled={!canNest}\n onClick={() => ctx.addGroup(group.id, group.logic === 'and' ? 'or' : 'and')}\n >\n Group\n </Button>\n {onRemove && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n icon={<Trash2Icon />}\n className=\"ml-auto text-muted-foreground\"\n aria-label={removeLabel}\n onClick={onRemove}\n >\n Clear all\n </Button>\n )}\n </div>\n </div>\n );\n}\n\nfunction NestedGroupCard({ group, depth }: { group: FilterBarGroup; depth: number }) {\n const ctx = useFilterBarContext();\n const rootRef = useRef<HTMLDivElement>(null);\n const leaving = ctx.leaving.has(group.id);\n useSettleOnLeave(group.id, leaving, rootRef);\n const count = countLeaves(group);\n\n return (\n <div\n ref={rootRef}\n data-slot=\"filter-bar-editor-nested\"\n data-leaving={leaving || undefined}\n aria-hidden={leaving || undefined}\n className={cn(\n 'filter-bar-editor-nested w-full overflow-hidden rounded-lg border border-border',\n leaving && 'pointer-events-none',\n )}\n >\n <div className=\"flex items-center gap-2 border-b border-border px-2 py-1\">\n <FolderIcon className=\"size-3.5 text-muted-foreground\" />\n <Txt as=\"span\" variant=\"label\" tone=\"ink\">\n Group\n </Txt>\n <Txt as=\"span\" variant=\"label\" tone=\"muted\">\n · {count} {count === 1 ? 'condition' : 'conditions'}\n </Txt>\n <div className=\"ml-auto flex items-center gap-1\">\n <FilterBarLogicSwitch groupId={group.id} logic={group.logic} />\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n tooltip=\"Remove group\"\n disabled={leaving}\n onClick={() => ctx.removeGroup(group.id)}\n >\n <Trash2Icon />\n </Button>\n </div>\n </div>\n <FilterBarGroupEditor group={group} depth={depth} />\n </div>\n );\n}\n","import { BracesIcon, XIcon } from 'lucide-react';\nimport { useRef, useState } from 'react';\nimport type { KeyboardEvent } from 'react';\nimport { chipClass, editableSegmentClass, removeSegmentClass } from './filter-bar-chip';\nimport { FILTER_BAR_SCOPE_ATTR, useFilterBarContext } from './filter-bar-context';\nimport { FilterBarGroupEditor } from './filter-bar-group-editor';\nimport { countLeaves } from './filter-bar-tree';\nimport type { FilterBarGroup } from './types';\nimport { useSettleOnLeave } from './use-settle-on-leave';\nimport { Button } from '@/ds/components/Button/Button';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/ds/components/Popover';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport type FilterBarAdvancedChipProps = {\n group: FilterBarGroup;\n className?: string;\n};\n\n/**\n * A root-level group rendered as one \"Advanced filter\" chip. Its popover hosts the\n * recursive rule builder; the chip's remove button drops the whole subtree.\n */\nexport function FilterBarAdvancedChip({ group, className }: FilterBarAdvancedChipProps) {\n const ctx = useFilterBarContext();\n const [initial] = useState(() => !ctx.mounted);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const leaving = ctx.leaving.has(group.id);\n const open = ctx.openGroupId === group.id;\n const count = countLeaves(group);\n // Position in the flattened item list: navigation from the chip continues from its first leaf.\n const firstLeafIndex = ctx.items.findIndex(item => isUnder(group, item.id));\n const index = firstLeafIndex === -1 ? ctx.items.length : firstLeafIndex;\n useSettleOnLeave(group.id, leaving, rootRef);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (leaving) return;\n const segments = Array.from(rootRef.current?.querySelectorAll<HTMLElement>('[data-filter-bar-segment]') ?? []);\n const current = segments.findIndex(el => el === event.target);\n if (current === -1) return;\n switch (event.key) {\n case 'ArrowRight': {\n event.preventDefault();\n const next = segments[current + 1];\n if (next) next.focus();\n else if (!ctx.focusChip(index + count, 1, 'field')) ctx.focusInput();\n return;\n }\n case 'ArrowLeft': {\n event.preventDefault();\n const prev = segments[current - 1];\n if (prev) prev.focus();\n else ctx.focusChip(index - 1, -1, 'remove');\n return;\n }\n case 'Delete':\n case 'Backspace':\n event.preventDefault();\n remove();\n break;\n default:\n }\n };\n\n const remove = () => {\n ctx.removeGroup(group.id);\n ctx.focusAfterRemove(index);\n };\n\n return (\n <Popover open={open} onOpenChange={next => ctx.setOpenGroup(next ? group.id : null)}>\n <div\n ref={rootRef}\n role=\"group\"\n aria-label={`Advanced filter, ${count} ${count === 1 ? 'condition' : 'conditions'}`}\n aria-hidden={leaving || undefined}\n data-slot=\"filter-bar-advanced\"\n data-initial={initial || undefined}\n data-leaving={leaving || undefined}\n className={cn('filter-bar-advanced', chipClass, leaving && 'pointer-events-none', className)}\n onKeyDown={handleKeyDown}\n >\n <PopoverTrigger\n ref={el => {\n triggerRef.current = el;\n ctx.registerSegment(group.id, 'field', leaving ? null : el);\n }}\n render={<button type=\"button\" />}\n data-filter-bar-segment=\"field\"\n className={editableSegmentClass}\n title=\"Edit advanced filter\"\n >\n <BracesIcon aria-hidden />\n <span className=\"truncate\">Advanced filter</span>\n {count > 0 && (\n <Txt as=\"span\" variant=\"column\" tone=\"muted\" aria-hidden>\n {count}\n </Txt>\n )}\n </PopoverTrigger>\n {leaving ? (\n <span aria-hidden className={removeSegmentClass}>\n <XIcon />\n </span>\n ) : (\n <button\n type=\"button\"\n ref={el => ctx.registerSegment(group.id, 'remove', el)}\n data-filter-bar-segment=\"remove\"\n aria-label=\"Remove advanced filter\"\n title=\"Remove advanced filter\"\n className={removeSegmentClass}\n onClick={remove}\n >\n <XIcon />\n </button>\n )}\n </div>\n <PopoverContent\n align=\"start\"\n className=\"w-[min(92vw,44rem)] p-0\"\n {...{ [FILTER_BAR_SCOPE_ATTR]: 'advanced' }}\n finalFocus={triggerRef}\n >\n <div className=\"flex items-center gap-2 border-b border-border px-3 py-2\">\n <BracesIcon className=\"size-3.5 text-muted-foreground\" />\n <Txt as=\"span\" variant=\"label\" tone=\"ink\">\n Advanced filter\n </Txt>\n <Txt as=\"span\" variant=\"column\" tone=\"muted\" className=\"rounded-md bg-fill-subtle px-1.5\">\n {count}\n </Txt>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"ml-auto\"\n tooltip=\"Close\"\n onClick={() => ctx.setOpenGroup(null)}\n >\n <XIcon />\n </Button>\n </div>\n <FilterBarGroupEditor\n group={group}\n depth={1}\n removeLabel=\"Remove advanced filter\"\n onRemove={() => {\n ctx.setOpenGroup(null);\n remove();\n }}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\nconst isUnder = (group: FilterBarGroup, itemId: string): boolean =>\n group.nodes.some(node => (node.id === itemId ? true : 'kind' in node && isUnder(node, itemId)));\n","import { useFilterBarContext } from './filter-bar-context';\nimport { ClearFiltersButton } from '@/ds/components/ClearFiltersButton/clear-filters-button';\n\n/** Removes every removable filter. Rendered by FilterBar at its trailing edge; hidden while nothing can be removed. */\nexport function FilterBarClear({ label }: { label: string }) {\n const ctx = useFilterBarContext();\n if (!ctx.hasRemovableItems) return null;\n return (\n <ClearFiltersButton\n label={label}\n onClick={event => {\n event.stopPropagation();\n ctx.clear();\n ctx.focusInput();\n }}\n />\n );\n}\n","import { Fragment } from 'react';\nimport type { ReactNode } from 'react';\nimport { FilterBarAdvancedChip } from './filter-bar-advanced-chip';\nimport { FilterBarChip } from './filter-bar-chip';\nimport { FilterBarClear } from './filter-bar-clear';\nimport { FILTER_BAR_SCOPE_ATTR, FilterBarProvider, useFilterBarContext } from './filter-bar-context';\nimport { FilterBarInput } from './filter-bar-input';\nimport { FilterBarTimeRange } from './filter-bar-time-range';\nimport { isFilterBarGroup } from './types';\nimport type { FilterBarExpression, FilterBarField, FilterBarItem, FilterBarOperator } from './types';\nimport { VisuallyHidden } from '@/ds/primitives/visually-hidden';\nimport { cn } from '@/lib/utils';\n\ntype FilterBarValueProps =\n | {\n /** Flat list of filters, implicitly joined with `and`. Advanced filters are never offered. */\n value: FilterBarItem[];\n onValueChange: (items: FilterBarItem[]) => void;\n }\n | {\n /**\n * Tree of filters and groups. Root nodes are joined with `and`; each root group renders\n * as one \"Advanced filter\" chip whose popover edits the nested `and` / `or` logic.\n */\n value: FilterBarExpression;\n onValueChange: (expression: FilterBarExpression) => void;\n };\n\nexport type FilterBarProps = FilterBarValueProps & {\n fields: FilterBarField[];\n operators: FilterBarOperator[];\n /**\n * Id given to a newly added item. Defaults to a random id. Consumers that rebuild `value` from\n * their own store (URL, query params…) should return the id they will rebuild it with, so the\n * draft chip and the committed chip are the same element.\n */\n createItemId?: (fieldId: string) => string;\n /** How deep advanced-filter groups may nest (root-level group = 1). Defaults to 3. */\n maxDepth?: number;\n 'aria-label'?: string;\n /**\n * Text shown in a value list when the field's `suggestions` resolver rejects, for example\n * to explain a server limit. Return `undefined` to keep the default \"Couldn't load values.\".\n */\n describeSuggestionsError?: (error: unknown) => string | undefined;\n /** Accessible label of the trailing \"remove every filter\" button. */\n clearLabel?: string;\n className?: string;\n children: ReactNode;\n};\n\nfunction FilterBarSurface({\n className,\n clearLabel,\n children,\n}: {\n className?: string;\n clearLabel: string;\n children: ReactNode;\n}) {\n const ctx = useFilterBarContext();\n return (\n <div\n role=\"group\"\n aria-label={ctx.ariaLabel}\n data-slot=\"filter-bar\"\n {...{ [FILTER_BAR_SCOPE_ATTR]: 'bar' }}\n className={cn(\n // No chrome of its own: chips and the typeahead input sit directly on the parent surface.\n // Layout: chips, input, then Clear right beside the input — all in one wrapping row so\n // Clear never drifts to the far edge of a wide container.\n 'flex w-full flex-wrap items-center gap-1.5',\n className,\n )}\n >\n {children}\n <span className=\"flex shrink-0 items-center empty:hidden\">\n <FilterBarClear label={clearLabel} />\n </span>\n <VisuallyHidden aria-live=\"polite\">{ctx.announcement}</VisuallyHidden>\n </div>\n );\n}\n\n/**\n * Braintrust-style filter bar: `field → operator → value` filters built from a\n * single typeahead input, rendered as inline editable chips. Domain-agnostic —\n * fields, operators and values are plain strings supplied by the consumer.\n *\n * Pass a `FilterBarExpression` as `value` to enable Linear-style advanced filters:\n * the input offers \"Advanced filter…\", which adds one chip whose popover hosts a\n * recursive rule builder (`and` / `or` connectors, nested groups). The bar itself\n * stays flat. A flat `FilterBarItem[]` stays flat.\n *\n * @example\n * <FilterBar value={items} onValueChange={setItems} fields={fields} operators={DEFAULT_FILTER_OPERATORS}>\n * <FilterBar.Chips />\n * <FilterBar.Input />\n * </FilterBar>\n */\nexport function FilterBar({\n fields,\n operators,\n value,\n onValueChange,\n createItemId,\n maxDepth,\n 'aria-label': ariaLabel = 'Filters',\n describeSuggestionsError,\n clearLabel = 'Clear filters',\n className,\n children,\n}: FilterBarProps) {\n return (\n <FilterBarProvider\n fields={fields}\n operators={operators}\n value={value}\n onValueChange={onValueChange}\n createItemId={createItemId}\n maxDepth={maxDepth}\n ariaLabel={ariaLabel}\n describeSuggestionsError={describeSuggestionsError}\n >\n <FilterBarSurface className={className} clearLabel={clearLabel}>\n {children}\n </FilterBarSurface>\n </FilterBarProvider>\n );\n}\n\n/**\n * Default layout: one editable chip per root item, one \"Advanced filter\" chip per root\n * group, in order, then the chip of the filter being built in the bar's input (which\n * becomes the last item's chip once committed).\n */\nexport function FilterBarChips({ renderChip = defaultRenderChip }: FilterBarChipsProps) {\n const ctx = useFilterBarContext();\n // One keyed array: the draft chip and the item it becomes share a key, so React\n // keeps the element across the commit instead of mounting a new chip.\n const chips: ReactNode[] = [];\n for (const node of ctx.expression.nodes) {\n const chip = isFilterBarGroup(node) ? <FilterBarAdvancedChip group={node} /> : renderChip(node);\n if (chip !== null) chips.push(<Fragment key={node.id}>{chip}</Fragment>);\n }\n if (ctx.draft && !ctx.draft.groupId) {\n // `FilterBarChip` needs a full item; the draft's missing parts are blank until picked.\n const { id, fieldId, operatorId = '' } = ctx.draft;\n chips.push(\n <Fragment key={id}>\n <FilterBarChip draft item={{ id, fieldId, operatorId, value: '' }} />\n </Fragment>,\n );\n }\n return <>{chips}</>;\n}\n\nexport type FilterBarChipsProps = {\n /**\n * Chip for an item; return `null` to render none (e.g. an item only held in the\n * value for scoping). Defaults to a plain editable `FilterBar.Chip`.\n */\n renderChip?: (item: FilterBarItem) => ReactNode;\n};\n\nconst defaultRenderChip = (item: FilterBarItem) => <FilterBarChip item={item} />;\n\nFilterBar.Chips = FilterBarChips;\nFilterBar.Chip = FilterBarChip;\nFilterBar.AdvancedChip = FilterBarAdvancedChip;\nFilterBar.Input = FilterBarInput;\nFilterBar.TimeRange = FilterBarTimeRange;\n","import type { FilterBarOperator } from './types';\n\n/** Opt-in starter set. Pure data: the component attaches no semantics to ids. */\nexport const DEFAULT_FILTER_OPERATORS: FilterBarOperator[] = [\n { id: 'is', label: 'is', widensTo: 'in' },\n { id: 'is-not', label: 'is not' },\n { id: 'contains', label: 'contains' },\n { id: 'not-contains', label: 'does not contain' },\n { id: 'starts-with', label: 'starts with' },\n { id: 'gt', label: '>' },\n { id: 'lt', label: '<' },\n { id: 'gte', label: '>=' },\n { id: 'lte', label: '<=' },\n { id: 'is-empty', label: 'is empty', arity: 'none' },\n { id: 'is-not-empty', label: 'is not empty', arity: 'none' },\n { id: 'in', label: 'in', arity: 'many' },\n];\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Message-jj56lxNL.cjs","names":["cn","Txt","CopyButton","toDate","formatDate"],"sources":["../src/ds/components/Message/message.tsx","../src/ds/components/Message/message-copy-button.tsx","../src/ds/components/Message/message-timestamp.tsx"],"sourcesContent":["import type { ComponentProps, ReactNode } from 'react';\nimport { Txt } from '@/ds/components/Txt';\nimport { messageSurfaceStyle } from '@/ds/primitives/message-surface';\nimport { cn } from '@/lib/utils';\n\nexport interface MessageProps extends ComponentProps<'div'> {\n from: 'user' | 'assistant';\n avatar?: ReactNode;\n footer?: ReactNode;\n /** Sent files, displayed above and outside the text bubble. */\n attachments?: ReactNode;\n pending?: boolean;\n}\n\nexport function Message({ from, avatar, footer, attachments, pending, children, className, ...props }: MessageProps) {\n const isUser = from === 'user';\n\n return (\n <div\n {...props}\n data-slot=\"message\"\n data-from={from}\n data-message-pending={pending || undefined}\n className={cn(\n 'group/message max-w-full min-w-0',\n isUser && 'my-3 ml-auto flex w-fit max-w-[70%] items-start gap-2',\n !isUser && footer && 'mb-3',\n className,\n )}\n >\n {avatar}\n <div className={cn('min-w-0', isUser && 'flex flex-col items-end')}>\n {attachments && (\n <div data-slot=\"message-attachments\" className=\"mb-2 max-w-full min-w-0\">\n {attachments}\n </div>\n )}\n {children !== undefined && children !== null && children !== false && (\n <div\n data-slot=\"message-content\"\n className={cn(\n 'max-w-full min-w-0 text-body break-words',\n isUser && cn(messageSurfaceStyle, 'px-4 py-2'),\n isUser && pending && 'border border-dashed border-border',\n !isUser && footer && '[&>:last-child]:mb-0',\n )}\n >\n {children}\n </div>\n )}\n {footer && <div className=\"mt-1 max-w-full\">{footer}</div>}\n </div>\n </div>\n );\n}\n\nexport interface MessageActionsProps extends ComponentProps<'div'> {\n visibility?: 'hover' | 'always';\n}\n\nexport function MessageActions({ visibility = 'hover', children, className, ...props }: MessageActionsProps) {\n return (\n <div\n {...props}\n data-slot=\"message-actions\"\n className={cn(\n 'flex flex-wrap items-center gap-1 group-data-[from=user]/message:flex-row-reverse',\n 'motion-safe:transition-opacity [&_button]:pointer-coarse:min-h-11 [&_button]:pointer-coarse:min-w-11',\n visibility === 'hover' &&\n 'group-focus-within/message:opacity-100 group-hover/message:opacity-100 pointer-fine:opacity-0',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\nexport function MessageMetadata({ className, ...props }: ComponentProps<'span'>) {\n return (\n <Txt\n {...props}\n as=\"span\"\n variant=\"caption\"\n tone=\"muted\"\n className={cn('inline-flex items-center gap-1', className)}\n />\n );\n}\n","import { CopyButton } from '../CopyButton';\n\nexport function MessageCopyButton({ text }: { text: string }) {\n return <CopyButton content={text} size=\"icon-sm\" variant=\"ghost\" tooltip=\"Copy message\" showToast={false} />;\n}\n","import { MessageMetadata } from './message';\nimport { formatDate, toDate } from '@/utils/date-format';\n\nexport function MessageTimestamp({ value }: { value: Date | string }) {\n const time = toDate(value);\n if (!time) return null;\n\n return (\n <MessageMetadata>\n <time dateTime={time.toISOString()} title={formatDate(time, 'date-time')}>\n {formatDate(time, 'time')}\n </time>\n </MessageMetadata>\n );\n}\n"],"mappings":";;;;;;;AAcA,SAAgB,QAAQ,EAAE,MAAM,QAAQ,QAAQ,aAAa,SAAS,UAAU,WAAW,GAAG,SAAuB;CACnH,MAAM,SAAS,SAAS;CAExB,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EACE,GAAI;EACJ,aAAU;EACV,aAAW;EACX,wBAAsB,WAAW,KAAA;EACjC,WAAWA,cAAAA,GACT,oCACA,UAAU,yDACV,CAAC,UAAU,UAAU,QACrB,SACF;EAVF,UAAA,CAYG,QACD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;GAAK,WAAWA,cAAAA,GAAG,WAAW,UAAU,yBAAyB;GAAjE,UAAA;IACG,eACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,aAAU;KAAsB,WAAU;KAC5C,UAAA;IACE,CAAA;IAEN,aAAa,KAAA,KAAa,aAAa,QAAQ,aAAa,SAC3D,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KACE,aAAU;KACV,WAAWA,cAAAA,GACT,4CACA,UAAUA,cAAAA,GAAAA,yEAAwB,WAAW,GAC7C,UAAU,WAAW,sCACrB,CAAC,UAAU,UAAU,sBACvB;KAEC;IACE,CAAA;IAEN,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAU;KAAmB,UAAA;IAAY,CAAA;GACtD;EACF,CAAA,CAAA;;AAET;AAMA,SAAgB,eAAe,EAAE,aAAa,SAAS,UAAU,WAAW,GAAG,SAA8B;CAC3G,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EACE,GAAI;EACJ,aAAU;EACV,WAAWA,cAAAA,GACT,qFACA,wGACA,eAAe,WACb,iGACF,SACF;EAEC;CACE,CAAA;AAET;AAEA,SAAgB,gBAAgB,EAAE,WAAW,GAAG,SAAiC;CAC/E,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,YAAAA,KAAD;EACE,GAAI;EACJ,IAAG;EACH,SAAQ;EACR,MAAK;EACL,WAAWD,cAAAA,GAAG,kCAAkC,SAAS;CAC1D,CAAA;AAEL;;ACtFA,SAAgB,kBAAkB,EAAE,QAA0B;CAC5D,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAACE,oBAAAA,YAAD;EAAY,SAAS;EAAM,MAAK;EAAU,SAAQ;EAAQ,SAAQ;EAAe,WAAW;CAAQ,CAAA;AAC7G;;ACDA,SAAgB,iBAAiB,EAAE,SAAmC;CACpE,MAAM,OAAOC,0BAAAA,OAAO,KAAK;CACzB,IAAI,CAAC,MAAM,OAAO;CAElB,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;EAAM,UAAU,KAAK,YAAY;EAAG,OAAOC,0BAAAA,WAAW,MAAM,WAAW;EACpE,UAAAA,0BAAAA,WAAW,MAAM,MAAM;CACpB,CAAA,EACS,CAAA;AAErB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MessageScroller-CGsfTd1Z.cjs","names":["React","React","mergeRefs","cn","overlaySurfaceStyle","_Fragment","ArrowDownIcon","React"],"sources":["../src/ds/components/MessageScroller/message-scroller-context.ts","../src/ds/components/MessageScroller/message-scroller-geometry.ts","../src/ds/components/MessageScroller/message-scroller-glide.ts","../src/ds/components/MessageScroller/message-scroller-trip.ts","../src/ds/components/MessageScroller/message-scroller.tsx","../src/ds/components/MessageScroller/message-scroller-hooks.ts"],"sourcesContent":["import * as React from 'react';\n\nexport type MessageScrollerDefaultScrollPosition = 'start' | 'end' | 'last-anchor';\nexport type MessageScrollerButtonDirection = 'start' | 'end';\nexport type MessageScrollerScrollAlign = 'start' | 'center' | 'end' | 'nearest';\n\nexport type MessageScrollerScrollOptions = {\n align?: MessageScrollerScrollAlign;\n behavior?: ScrollBehavior;\n scrollMargin?: number;\n};\n\nexport type MessageScrollerScrollable = {\n start: boolean;\n end: boolean;\n};\n\nexport type MessageScrollerVisibility = {\n currentAnchorId: string | undefined;\n visibleMessageIds: string[];\n};\n\nexport type MessageScrollerActionsContextValue = {\n notifyContentResize: () => void;\n notifyScroll: () => void;\n registerItem: (messageId: string, element: HTMLElement, scrollAnchor: boolean) => () => void;\n scrollToEnd: (options?: MessageScrollerScrollOptions) => boolean;\n scrollToMessage: (messageId: string, options?: MessageScrollerScrollOptions) => boolean;\n scrollToStart: (options?: MessageScrollerScrollOptions) => boolean;\n setContentElement: (element: HTMLDivElement | null) => void;\n setRootElement: (element: HTMLDivElement | null) => void;\n setViewportElement: (element: HTMLDivElement | null) => void;\n syncAfterScroll: () => void;\n};\n\nexport const DEFAULT_SCROLLABLE: MessageScrollerScrollable = { start: false, end: false };\nexport const DEFAULT_VISIBILITY: MessageScrollerVisibility = { currentAnchorId: undefined, visibleMessageIds: [] };\nexport const DEFAULT_SCROLL_EDGE_THRESHOLD = 8;\nexport const DEFAULT_SCROLL_MARGIN = 0;\nexport const DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK = 64;\nexport const DEFAULT_REACH_START_THRESHOLD = 160;\n\n// Looser than the edge threshold, which only decides whether the scroll buttons\n// are active: how far from the end a reader may sit and still be carried along\n// by growing content.\nexport const AUTO_SCROLL_ATTACH_THRESHOLD = 160;\n\nexport const MessageScrollerActionsContext = React.createContext<MessageScrollerActionsContextValue | null>(null);\nexport const MessageScrollerScrollableContext = React.createContext<MessageScrollerScrollable | null>(null);\nexport const MessageScrollerVisibilityContext = React.createContext<MessageScrollerVisibility | null>(null);\n\nconst useRequiredContext = <TValue>(context: React.Context<TValue | null>, hookName: string) => {\n const value = React.useContext(context);\n if (!value) throw new Error(`${hookName} must be used within MessageScrollerProvider.`);\n return value;\n};\n\nexport const useRequiredMessageScrollerActionsContext = (hookName: string) =>\n useRequiredContext(MessageScrollerActionsContext, hookName);\n\nexport const useRequiredMessageScrollerScrollableContext = (hookName: string) =>\n useRequiredContext(MessageScrollerScrollableContext, hookName);\n\nexport const useRequiredMessageScrollerVisibilityContext = (hookName: string) =>\n useRequiredContext(MessageScrollerVisibilityContext, hookName);\n","import type { MessageScrollerScrollAlign } from './message-scroller-context';\n\n/**\n * Geometry behind the scroller: how far to scroll for a given alignment, and\n * which anchored message the reader is currently on. Split out from the\n * component so each rule can be reasoned about — and tested — on its own.\n */\n\n/** A message the scroller tracks, and whether a turn is anchored to it. */\nexport type MessageScrollerItemRecord = {\n element: HTMLElement;\n scrollAnchor: boolean;\n};\n\n/** Sub-pixel slack, so a message resting exactly on the anchor line still counts. */\nexport const VISIBILITY_EPSILON = 0.5;\n\nexport const getContentPadding = (contentElement: HTMLElement | null) => {\n if (!contentElement) return { start: 0, end: 0 };\n const styles = window.getComputedStyle(contentElement);\n return {\n start: Number.parseFloat(styles.paddingBlockStart || styles.paddingTop) || 0,\n end: Number.parseFloat(styles.paddingBlockEnd || styles.paddingBottom) || 0,\n };\n};\n\nexport const getMaxScroll = (viewportElement: HTMLElement) =>\n Math.max(0, viewportElement.scrollHeight - viewportElement.clientHeight);\n\nexport const getRelativeTop = (element: HTMLElement, viewportElement: HTMLElement) => {\n const elementRect = element.getBoundingClientRect();\n const viewportRect = viewportElement.getBoundingClientRect();\n return elementRect.top - viewportRect.top + viewportElement.scrollTop;\n};\n\nexport const getScrollTarget = ({\n align,\n contentElement,\n element,\n scrollMargin,\n viewportElement,\n}: {\n align: MessageScrollerScrollAlign;\n /** The padding framing the transcript lives here, however deep the rows nest. */\n contentElement: HTMLElement | null;\n element: HTMLElement;\n scrollMargin: number;\n viewportElement: HTMLElement;\n}) => {\n const contentPadding = getContentPadding(contentElement);\n const elementTop = getRelativeTop(element, viewportElement);\n const elementHeight = element.getBoundingClientRect().height;\n const visibleHeight = Math.max(0, viewportElement.clientHeight - contentPadding.start - contentPadding.end);\n\n if (align === 'center') return elementTop - contentPadding.start - (visibleHeight - elementHeight) / 2 - scrollMargin;\n if (align === 'end')\n return elementTop - viewportElement.clientHeight + elementHeight + contentPadding.end + scrollMargin;\n\n if (align === 'nearest') {\n const elementBottom = elementTop + elementHeight;\n const viewportTop = viewportElement.scrollTop + contentPadding.start;\n const viewportBottom = viewportElement.scrollTop + viewportElement.clientHeight - contentPadding.end;\n if (elementTop >= viewportTop && elementBottom <= viewportBottom) return viewportElement.scrollTop;\n return elementTop < viewportTop\n ? elementTop - contentPadding.start - scrollMargin\n : elementBottom - viewportElement.clientHeight + contentPadding.end + scrollMargin;\n }\n\n return elementTop - contentPadding.start - scrollMargin;\n};\n\n/**\n * Where the reader must sit for the last row to rest at the end of the view.\n *\n * Not the end of the scroll: a chat reserves room under a live turn so a reply\n * grows into empty space, and docks its composer in the flow. Both sit below the\n * last row, so scrolling to the end of the box carries that row — and the message\n * that opened the turn — out of the view above. Reading it from the rows means no\n * one has to publish a height for anyone else to subtract.\n */\nexport const getFollowTarget = ({\n contentElement,\n items,\n viewportElement,\n}: {\n contentElement: HTMLElement | null;\n items: Array<readonly [string, MessageScrollerItemRecord]>;\n viewportElement: HTMLElement;\n}) => {\n const end = getMaxScroll(viewportElement);\n const lastRow = items.at(-1)?.[1].element;\n if (!lastRow || !contentElement) return end;\n\n const contentBottom = getRelativeTop(contentElement, viewportElement) + contentElement.getBoundingClientRect().height;\n const belowContent = Math.max(0, viewportElement.scrollHeight - contentBottom);\n const rowBottom = getRelativeTop(lastRow, viewportElement) + lastRow.getBoundingClientRect().height;\n\n return Math.min(end, Math.max(0, rowBottom + belowContent - viewportElement.clientHeight));\n};\n\nexport const getCurrentAnchorId = ({\n fallbackAnchorId,\n items,\n scrollMargin,\n scrollPreviousItemPeek,\n visibleMessageIds,\n viewportElement,\n}: {\n fallbackAnchorId: string | undefined;\n items: Array<readonly [string, MessageScrollerItemRecord]>;\n scrollMargin: number;\n scrollPreviousItemPeek: number;\n visibleMessageIds: Set<string>;\n viewportElement: HTMLElement;\n}) => {\n const anchorLine = viewportElement.getBoundingClientRect().top + scrollMargin + scrollPreviousItemPeek;\n const anchors = items.filter(([, item]) => item.scrollAnchor);\n let anchoredAboveViewport: string | undefined;\n\n for (const [messageId, item] of anchors) {\n if (item.element.getBoundingClientRect().top <= anchorLine + VISIBILITY_EPSILON) {\n anchoredAboveViewport = messageId;\n }\n }\n\n if (anchoredAboveViewport) return anchoredAboveViewport;\n return anchors.find(([messageId]) => visibleMessageIds.has(messageId))?.[0] ?? fallbackAnchorId;\n};\n","/** Longest single growth worth smoothing. Past it the move is one the reader asked for. */\nconst GLIDE_MAX = 240;\nconst GLIDE_MS = 220;\nconst GLIDE_EASE = 'cubic-bezier(0.33, 1, 0.68, 1)';\n\nfunction currentOffset(element: HTMLElement): number {\n if (typeof DOMMatrixReadOnly === 'undefined') return 0;\n const { transform } = getComputedStyle(element);\n if (!transform || transform === 'none') return 0;\n return new DOMMatrixReadOnly(transform).m42;\n}\n\nconst travels = new WeakMap<HTMLElement, AbortController>();\n\nfunction release(element: HTMLElement): void {\n travels.get(element)?.abort();\n travels.delete(element);\n element.style.transition = '';\n element.style.transform = '';\n}\n\nfunction calm(): boolean {\n if (typeof window === 'undefined' || !window.matchMedia) return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\n/**\n * Hides a scroll that has already happened. The end is pinned instantly, as it must\n * be, then the content is put back where the reader last saw it and travels to zero\n * on the compositor — so a reply growing a line at a time reads as one movement\n * rather than a snap per wrapped line.\n *\n * Transform, not layout: `scrollHeight` never changes, so nothing here can feed the\n * resize that called it. A line landing mid-travel only adds to the distance left.\n */\nexport function glideContent(element: HTMLElement | null, delta: number): void {\n if (!element || delta <= 0 || calm()) return;\n\n const offset = currentOffset(element) + delta;\n if (offset > GLIDE_MAX) {\n release(element);\n return;\n }\n\n element.style.transition = 'none';\n element.style.transform = `translateY(${offset}px)`;\n // Commit the displaced position, or the browser only ever sees the settled one.\n void element.offsetHeight;\n element.style.transition = `transform ${GLIDE_MS}ms ${GLIDE_EASE}`;\n element.style.transform = 'translateY(0)';\n // A settled transform would leave the content a containing block for anything\n // fixed inside it, so the styles come off once the travel is spent. Descendants'\n // transitions bubble here too, so only the content's own settle counts.\n travels.get(element)?.abort();\n const travel = new AbortController();\n travels.set(element, travel);\n const settle = (event: TransitionEvent) => {\n if (event.target !== element) return;\n if (currentOffset(element) === 0) release(element);\n };\n element.addEventListener('transitionend', settle, { signal: travel.signal });\n element.addEventListener('transitioncancel', settle, { signal: travel.signal });\n}\n","import { VISIBILITY_EPSILON } from './message-scroller-geometry';\n\n/** One designed curve for the one scripted trip: fast liftoff, long settle. */\nconst TRIP_MS = 560;\n/** How long past its clock a trip may chase a destination the layout hasn't released yet. */\nconst TRIP_OVERTIME_MS = 240;\n\nconst easeOutQuint = (t: number) => 1 - (1 - t) ** 5;\n\nexport type TripEndReason = 'arrived' | 'interrupted' | 'expired';\n\nexport interface TripAnimation {\n cancel: () => void;\n}\n\n/**\n * Drives the viewport to a destination the way a transition would, not the way\n * `scrollTo({ behavior: 'smooth' })` does: the destination is re-read every frame,\n * so a layout still settling under the trip — the reserved room opening beneath a\n * new turn — bends the path instead of restarting the curve. Writes are clamped by\n * the browser, so until the room has opened far enough the trip simply rides the\n * end of the box down.\n *\n * The reader keeps the last word: a scroll position this trip didn't write ends it.\n */\nexport function startTrip(\n viewportElement: HTMLElement,\n getTarget: () => number | undefined,\n onEnd: (reason: TripEndReason) => void,\n): TripAnimation {\n const reduceMotion =\n typeof window.matchMedia === 'function' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n const duration = reduceMotion ? 0 : TRIP_MS;\n const startedAt = performance.now();\n const from = viewportElement.scrollTop;\n let lastWritten = from;\n let frame = 0;\n let ended = false;\n\n const end = (reason: TripEndReason) => {\n ended = true;\n onEnd(reason);\n };\n\n const step = () => {\n if (Math.abs(viewportElement.scrollTop - lastWritten) > 1) return end('interrupted');\n const target = getTarget();\n if (target === undefined) return end('expired');\n const elapsed = performance.now() - startedAt;\n const progress = duration === 0 ? 1 : Math.min(1, elapsed / duration);\n viewportElement.scrollTop = from + (target - from) * easeOutQuint(progress);\n lastWritten = viewportElement.scrollTop;\n if (progress === 1 && Math.abs(lastWritten - target) <= VISIBILITY_EPSILON) return end('arrived');\n if (elapsed >= duration + TRIP_OVERTIME_MS) return end('expired');\n frame = window.requestAnimationFrame(step);\n };\n\n frame = window.requestAnimationFrame(step);\n\n return {\n cancel: () => {\n if (ended) return;\n ended = true;\n window.cancelAnimationFrame(frame);\n },\n };\n}\n","import { ArrowDownIcon } from 'lucide-react';\nimport * as React from 'react';\n\nimport {\n AUTO_SCROLL_ATTACH_THRESHOLD,\n DEFAULT_REACH_START_THRESHOLD,\n DEFAULT_SCROLL_EDGE_THRESHOLD,\n DEFAULT_SCROLL_MARGIN,\n DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK,\n DEFAULT_SCROLLABLE,\n DEFAULT_VISIBILITY,\n MessageScrollerActionsContext,\n MessageScrollerScrollableContext,\n MessageScrollerVisibilityContext,\n useRequiredMessageScrollerActionsContext,\n useRequiredMessageScrollerScrollableContext,\n} from './message-scroller-context';\nimport type {\n MessageScrollerActionsContextValue,\n MessageScrollerButtonDirection,\n MessageScrollerDefaultScrollPosition,\n MessageScrollerScrollAlign,\n MessageScrollerScrollOptions,\n MessageScrollerScrollable,\n MessageScrollerVisibility,\n} from './message-scroller-context';\n\nimport {\n VISIBILITY_EPSILON,\n getCurrentAnchorId,\n getFollowTarget,\n getMaxScroll,\n getScrollTarget,\n} from './message-scroller-geometry';\nimport type { MessageScrollerItemRecord } from './message-scroller-geometry';\nimport { glideContent } from './message-scroller-glide';\nimport { startTrip } from './message-scroller-trip';\nimport type { TripAnimation } from './message-scroller-trip';\n\nimport { overlaySurfaceStyle } from '@/ds/primitives/raised-surface';\nimport { mergeRefs } from '@/lib/merge-refs';\nimport { cn } from '@/lib/utils';\n\nexport type {\n MessageScrollerButtonDirection,\n MessageScrollerDefaultScrollPosition,\n MessageScrollerScrollAlign,\n MessageScrollerScrollOptions,\n MessageScrollerScrollable,\n MessageScrollerVisibility,\n} from './message-scroller-context';\n\nconst scrollableMatches = (left: MessageScrollerScrollable, right: MessageScrollerScrollable) =>\n left.start === right.start && left.end === right.end;\n\nconst visibilityMatches = (left: MessageScrollerVisibility, right: MessageScrollerVisibility) =>\n left.currentAnchorId === right.currentAnchorId &&\n left.visibleMessageIds.length === right.visibleMessageIds.length &&\n left.visibleMessageIds.every((messageId, index) => messageId === right.visibleMessageIds[index]);\n\nconst orderItemsByDocumentPosition = (items: Array<readonly [string, MessageScrollerItemRecord]>) =>\n items.sort(([, left], [, right]) => {\n const position = left.element.compareDocumentPosition(right.element);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) return -1;\n if (position & Node.DOCUMENT_POSITION_PRECEDING) return 1;\n return 0;\n });\n\nconst scrollViewportTo = (viewportElement: HTMLElement, top: number, behavior: ScrollBehavior) => {\n if (typeof viewportElement.scrollTo === 'function') {\n viewportElement.scrollTo({ top, behavior });\n return;\n }\n\n viewportElement.scrollTop = top;\n};\n\nconst scheduleScrollSync = (callback: () => void) => {\n if (typeof window.requestAnimationFrame === 'function') {\n window.requestAnimationFrame(callback);\n return;\n }\n\n window.setTimeout(callback, 0);\n};\n\nexport interface MessageScrollerProviderProps {\n /** Carry the reader with the stream, re-attaching on a new turn. Off still parks a new turn, without following the reply. */\n autoScroll?: boolean;\n children?: React.ReactNode;\n defaultScrollPosition?: MessageScrollerDefaultScrollPosition;\n /** Called when the reader scrolls near the start — where older history is loaded. */\n onReachStart?: () => void;\n /** Hold the reading position when older items are added above the current ones. */\n preserveScrollOnPrepend?: boolean;\n reachStartThreshold?: number;\n scrollEdgeThreshold?: number;\n scrollMargin?: number;\n scrollPreviousItemPeek?: number;\n}\n\nexport function MessageScrollerProvider({\n autoScroll = false,\n children,\n defaultScrollPosition = 'end',\n onReachStart,\n preserveScrollOnPrepend = false,\n reachStartThreshold = DEFAULT_REACH_START_THRESHOLD,\n scrollEdgeThreshold = DEFAULT_SCROLL_EDGE_THRESHOLD,\n scrollMargin = DEFAULT_SCROLL_MARGIN,\n scrollPreviousItemPeek = DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK,\n}: MessageScrollerProviderProps) {\n const itemsRef = React.useRef<Map<string, MessageScrollerItemRecord> | null>(null);\n itemsRef.current ??= new Map<string, MessageScrollerItemRecord>();\n const itemsRegistry = itemsRef.current;\n // Rebuilt on register/unregister only — scroll runs this too often to sort per event.\n const orderedItemsRef = React.useRef<Array<readonly [string, MessageScrollerItemRecord]> | null>(null);\n const visibleMessageIdsRef = React.useRef<Set<string> | null>(null);\n visibleMessageIdsRef.current ??= new Set<string>();\n const intersectingMessageIds = visibleMessageIdsRef.current;\n const [itemsVersion, setItemsVersion] = React.useState(0);\n const [rootElement, setRootElement] = React.useState<HTMLDivElement | null>(null);\n const [viewportElement, setViewportElement] = React.useState<HTMLDivElement | null>(null);\n const [contentElement, setContentElement] = React.useState<HTMLDivElement | null>(null);\n const defaultScrollAppliedRef = React.useRef(false);\n const deferDefaultScrollRef = React.useRef(false);\n const defaultScrollScheduledRef = React.useRef(false);\n const seenAnchorIdsRef = React.useRef<Set<string> | null>(null);\n seenAnchorIdsRef.current ??= new Set<string>();\n const seenAnchorIds = seenAnchorIdsRef.current;\n // Message ID reconciliation keeps the row element while replacing its ID.\n const seenAnchorElementsRef = React.useRef<WeakSet<HTMLElement> | null>(null);\n seenAnchorElementsRef.current ??= new WeakSet<HTMLElement>();\n const seenAnchorElements = seenAnchorElementsRef.current;\n const turnAnchoringArmedRef = React.useRef(false);\n const [scrollable, setScrollable] = React.useState<MessageScrollerScrollable>(DEFAULT_SCROLLABLE);\n const [visibility, setVisibility] = React.useState<MessageScrollerVisibility>(DEFAULT_VISIBILITY);\n const atEndRef = React.useRef(true);\n // Attachment is a mode, not a measurement: a growing reply moves the end away\n // without the reader having moved, so only the reader detaches it.\n const followingRef = React.useRef(true);\n // A smooth trip in flight, remembered by destination — the end of the stream, or\n // the anchor a new turn parks at. Sampled mid-flight it reads as a reader who\n // left, so it suspends detachment; a position going backwards calls it off.\n const tripRef = React.useRef<'end' | { anchorId: string } | null>(null);\n // The frame loop behind an anchor trip. Owns clearing its trip: it alone can\n // tell the reader taking over from its own writes landing.\n const tripAnimationRef = React.useRef<TripAnimation | null>(null);\n const lastScrollTopRef = React.useRef(0);\n // Only a reader moving backwards asks for older history: a mount sitting at\n // scrollTop 0 before the default scroll lands has not moved.\n const reachStartArmedRef = React.useRef(false);\n const reachStartFiredRef = React.useRef(false);\n const prependAnchorRef = React.useRef<{ scrollHeight: number; scrollTop: number } | null>(null);\n const firstItemIdRef = React.useRef<string | undefined>(undefined);\n // Off notifyScroll's deps on purpose: consumers pass it inline, and a fresh\n // identity per render would republish the actions context to every consumer.\n const onReachStartRef = React.useRef(onReachStart);\n React.useEffect(() => {\n onReachStartRef.current = onReachStart;\n }, [onReachStart]);\n\n const publishScrollable = React.useCallback(\n (nextScrollable: MessageScrollerScrollable) => {\n const scrollableValue = [nextScrollable.start && 'start', nextScrollable.end && 'end'].filter(Boolean).join(' ');\n\n for (const element of [rootElement, viewportElement]) {\n if (!element) continue;\n if (scrollableValue) {\n element.setAttribute('data-scrollable', scrollableValue);\n } else {\n element.removeAttribute('data-scrollable');\n }\n }\n\n setScrollable(current => (scrollableMatches(current, nextScrollable) ? current : nextScrollable));\n },\n [rootElement, viewportElement],\n );\n\n const publishVisibility = React.useCallback((nextVisibility: MessageScrollerVisibility) => {\n setVisibility(current => (visibilityMatches(current, nextVisibility) ? current : nextVisibility));\n }, []);\n\n // Registration is mount order, not document order, once history is prepended.\n const getOrderedItems = React.useCallback(() => {\n orderedItemsRef.current ??= orderItemsByDocumentPosition(Array.from(itemsRegistry.entries()));\n return orderedItemsRef.current;\n }, [itemsRegistry]);\n\n // The one definition of \"the end\" — following it, resting at it, offering the trip\n // back to it. Everything below the last row (reserved room, the docked composer)\n // is room to grow into, never somewhere to scroll.\n const followTarget = React.useCallback(() => {\n if (!viewportElement) return 0;\n\n return getFollowTarget({ contentElement, items: getOrderedItems(), viewportElement });\n }, [contentElement, getOrderedItems, viewportElement]);\n\n const anchorTripTarget = React.useCallback(\n (anchorId: string) => {\n const item = itemsRegistry.get(anchorId);\n if (!item || !viewportElement) return undefined;\n return Math.max(\n 0,\n getScrollTarget({ align: 'start', contentElement, element: item.element, scrollMargin, viewportElement }),\n );\n },\n [contentElement, itemsRegistry, scrollMargin, viewportElement],\n );\n\n // The motion's destination, never the decision's: the room under a fresh turn is\n // still opening when the trip starts — on a short thread the box has not even\n // grown yet — so the cap is re-read per frame and the trip rides the end of the\n // box until the opened room decides where the message rests.\n const parkTripTarget = React.useCallback(\n (anchorId: string) => {\n const target = anchorTripTarget(anchorId);\n if (target === undefined || !viewportElement) return target;\n return Math.min(target, getMaxScroll(viewportElement));\n },\n [anchorTripTarget, viewportElement],\n );\n\n const cancelTripAnimation = React.useCallback(() => {\n tripAnimationRef.current?.cancel();\n tripAnimationRef.current = null;\n }, []);\n\n const updateScrollable = React.useCallback(\n ({ fromScroll = false }: { fromScroll?: boolean } = {}) => {\n if (!viewportElement) {\n atEndRef.current = true;\n publishScrollable(DEFAULT_SCROLLABLE);\n return false;\n }\n\n const { scrollTop } = viewportElement;\n const remainingScroll = followTarget() - scrollTop;\n const wentBack = scrollTop < lastScrollTopRef.current;\n atEndRef.current = remainingScroll < AUTO_SCROLL_ATTACH_THRESHOLD;\n if (tripRef.current === 'end' && (wentBack || atEndRef.current)) tripRef.current = null;\n lastScrollTopRef.current = scrollTop;\n // Scrolling back is the only way out of the stream, the end the only way back in:\n // a position merely left behind by a growing reply is us chasing it, not them leaving.\n if (fromScroll && tripRef.current === null && (wentBack || atEndRef.current)) {\n followingRef.current = atEndRef.current;\n }\n\n publishScrollable({\n start: scrollTop > scrollEdgeThreshold,\n end: remainingScroll > scrollEdgeThreshold && !(autoScroll && followingRef.current),\n });\n\n return wentBack;\n },\n [autoScroll, followTarget, publishScrollable, scrollEdgeThreshold, viewportElement],\n );\n\n const getLastAnchorId = React.useCallback(\n () =>\n getOrderedItems()\n .filter(([, item]) => item.scrollAnchor)\n .at(-1)?.[0],\n [getOrderedItems],\n );\n\n const updateVisibility = React.useCallback(() => {\n const items = getOrderedItems();\n const fallbackAnchorId = getLastAnchorId() ?? items.at(-1)?.[0];\n\n if (items.length === 0) {\n publishVisibility(DEFAULT_VISIBILITY);\n return;\n }\n\n if (!viewportElement) {\n publishVisibility({\n currentAnchorId: fallbackAnchorId,\n visibleMessageIds: fallbackAnchorId ? [fallbackAnchorId] : [],\n });\n return;\n }\n\n const viewportRect = viewportElement.getBoundingClientRect();\n const visibleMessageIds = new Set<string>();\n\n if (typeof IntersectionObserver === 'undefined') {\n const visibilityTop = viewportRect.top + scrollMargin + scrollPreviousItemPeek;\n items.forEach(([messageId, item]) => {\n const rect = item.element.getBoundingClientRect();\n if (rect.bottom > visibilityTop && rect.top < viewportRect.bottom) visibleMessageIds.add(messageId);\n });\n } else {\n intersectingMessageIds.forEach(messageId => visibleMessageIds.add(messageId));\n }\n\n const orderedVisibleMessageIds = items.flatMap(([messageId]) =>\n visibleMessageIds.has(messageId) ? [messageId] : [],\n );\n\n publishVisibility({\n currentAnchorId: getCurrentAnchorId({\n fallbackAnchorId,\n items,\n scrollMargin,\n scrollPreviousItemPeek,\n visibleMessageIds,\n viewportElement,\n }),\n visibleMessageIds:\n orderedVisibleMessageIds.length > 0 ? orderedVisibleMessageIds : fallbackAnchorId ? [fallbackAnchorId] : [],\n });\n }, [\n getLastAnchorId,\n getOrderedItems,\n intersectingMessageIds,\n publishVisibility,\n scrollMargin,\n scrollPreviousItemPeek,\n viewportElement,\n ]);\n\n const syncAfterScroll = React.useCallback(() => {\n updateScrollable();\n updateVisibility();\n }, [updateScrollable, updateVisibility]);\n\n const notifyScroll = React.useCallback(() => {\n const wasScrollable = Boolean(viewportElement && viewportElement.scrollHeight > viewportElement.clientHeight);\n const readerWentBack = updateScrollable({ fromScroll: true });\n updateVisibility();\n if (!viewportElement) return;\n\n if (readerWentBack && wasScrollable) reachStartArmedRef.current = true;\n\n if (!reachStartArmedRef.current) return;\n if (!wasScrollable) return;\n if (viewportElement.scrollTop > reachStartThreshold) {\n reachStartFiredRef.current = false;\n return;\n }\n // One request per trip to the start: staying there must not queue a second.\n if (reachStartFiredRef.current) return;\n if (!onReachStartRef.current) return;\n\n reachStartFiredRef.current = true;\n if (preserveScrollOnPrepend) {\n prependAnchorRef.current = {\n scrollHeight: viewportElement.scrollHeight,\n scrollTop: viewportElement.scrollTop,\n };\n }\n onReachStartRef.current();\n }, [preserveScrollOnPrepend, reachStartThreshold, updateScrollable, updateVisibility, viewportElement]);\n\n const scrollToElement = React.useCallback(\n (\n element: HTMLElement,\n {\n align = 'start',\n behavior = 'auto',\n scrollMargin: optionScrollMargin = scrollMargin,\n }: MessageScrollerScrollOptions = {},\n ) => {\n if (!viewportElement || !contentElement?.contains(element)) return false;\n\n const nextScrollTop = Math.max(\n 0,\n getScrollTarget({ align, contentElement, element, scrollMargin: optionScrollMargin, viewportElement }),\n );\n\n if (Math.abs(viewportElement.scrollTop - nextScrollTop) <= VISIBILITY_EPSILON) {\n scrollViewportTo(viewportElement, nextScrollTop, 'auto');\n syncAfterScroll();\n return true;\n }\n\n scrollViewportTo(viewportElement, nextScrollTop, behavior);\n scheduleScrollSync(syncAfterScroll);\n return true;\n },\n [contentElement, scrollMargin, syncAfterScroll, viewportElement],\n );\n\n const scrollToStart = React.useCallback(\n ({ behavior = 'auto' }: MessageScrollerScrollOptions = {}) => {\n if (!viewportElement) return false;\n cancelTripAnimation();\n tripRef.current = null;\n scrollViewportTo(viewportElement, 0, behavior);\n scheduleScrollSync(syncAfterScroll);\n return true;\n },\n [cancelTripAnimation, syncAfterScroll, viewportElement],\n );\n\n const scrollToEnd = React.useCallback(\n ({ behavior = 'auto' }: MessageScrollerScrollOptions = {}) => {\n if (!viewportElement) return false;\n cancelTripAnimation();\n followingRef.current = true;\n tripRef.current = behavior === 'smooth' ? 'end' : null;\n scrollViewportTo(viewportElement, followTarget(), behavior);\n // Published now, not next frame: a button that hears about the trip late flashes.\n syncAfterScroll();\n scheduleScrollSync(syncAfterScroll);\n return true;\n },\n [cancelTripAnimation, followTarget, syncAfterScroll, viewportElement],\n );\n\n const scrollToMessage = React.useCallback(\n (messageId: string, options?: MessageScrollerScrollOptions) => {\n const item = itemsRegistry.get(messageId);\n if (!item) return false;\n return scrollToElement(item.element, options);\n },\n [itemsRegistry, scrollToElement],\n );\n\n // A reply grows into the room its turn reserved and moves nothing: only once the\n // last row would fall past the end of the view is there anything to follow, and\n // then by exactly what it overflowed — pinned instantly, glided on the compositor.\n const notifyContentResize = React.useCallback(() => {\n const trip = tripRef.current;\n const onAnchorTrip = trip !== null && trip !== 'end';\n // An anchor trip re-reads its destination every frame, so a layout settling\n // under it — the reserved room opening — bends its path without help from here.\n if (!onAnchorTrip && autoScroll && defaultScrollAppliedRef.current && followingRef.current && viewportElement) {\n const overflow = followTarget() - viewportElement.scrollTop;\n if (overflow > VISIBILITY_EPSILON) {\n // A trip already in flight is retargeted rather than cut short; only the\n // instant catch-up needs the glide to read as one movement.\n const travelling = trip === 'end';\n scrollViewportTo(viewportElement, followTarget(), travelling ? 'smooth' : 'auto');\n if (!travelling) glideContent(contentElement, overflow);\n }\n }\n syncAfterScroll();\n }, [autoScroll, contentElement, followTarget, syncAfterScroll, viewportElement]);\n\n const registerItem = React.useCallback(\n (messageId: string, element: HTMLElement, scrollAnchor: boolean) => {\n itemsRegistry.set(messageId, { element, scrollAnchor });\n orderedItemsRef.current = null;\n setItemsVersion(version => version + 1);\n\n return () => {\n const current = itemsRegistry.get(messageId);\n if (current?.element !== element) return;\n itemsRegistry.delete(messageId);\n intersectingMessageIds.delete(messageId);\n orderedItemsRef.current = null;\n setItemsVersion(version => version + 1);\n };\n },\n [intersectingMessageIds, itemsRegistry],\n );\n\n React.useEffect(() => {\n if (!contentElement || !viewportElement || typeof IntersectionObserver === 'undefined') {\n updateVisibility();\n return undefined;\n }\n\n const messageIdByElement = new Map<Element, string>();\n for (const [messageId, item] of itemsRegistry) {\n messageIdByElement.set(item.element, messageId);\n }\n\n const observer = new IntersectionObserver(\n entries => {\n for (const entry of entries) {\n const messageId = messageIdByElement.get(entry.target);\n if (!messageId) continue;\n if (entry.isIntersecting) {\n intersectingMessageIds.add(messageId);\n } else {\n intersectingMessageIds.delete(messageId);\n }\n }\n updateVisibility();\n },\n {\n root: viewportElement,\n rootMargin: `${-(scrollMargin + scrollPreviousItemPeek)}px 0px 0px 0px`,\n threshold: [0, 0.01, 0.5, 1],\n },\n );\n\n for (const [, item] of itemsRegistry) observer.observe(item.element);\n updateVisibility();\n\n return () => observer.disconnect();\n }, [\n contentElement,\n intersectingMessageIds,\n itemsRegistry,\n itemsVersion,\n scrollMargin,\n scrollPreviousItemPeek,\n updateVisibility,\n viewportElement,\n ]);\n\n React.useEffect(() => {\n if (!viewportElement || typeof ResizeObserver === 'undefined') return undefined;\n const observer = new ResizeObserver(syncAfterScroll);\n observer.observe(viewportElement);\n return () => observer.disconnect();\n }, [syncAfterScroll, viewportElement]);\n\n React.useLayoutEffect(() => {\n updateScrollable();\n updateVisibility();\n }, [itemsVersion, updateScrollable, updateVisibility]);\n\n React.useLayoutEffect(() => {\n if (defaultScrollAppliedRef.current || !viewportElement) return undefined;\n if (itemsRegistry.size === 0) {\n deferDefaultScrollRef.current = true;\n return undefined;\n }\n\n const applyDefaultScroll = () => {\n const lastAnchorId = getLastAnchorId();\n // Where a thread opens decides whether it starts attached: a restored reading\n // position has the stream below it. `scrollToEnd` takes this back when it lands.\n followingRef.current = false;\n let didScroll = false;\n if (defaultScrollPosition === 'start') {\n didScroll = scrollToStart({ behavior: 'auto' });\n } else if (defaultScrollPosition === 'last-anchor') {\n didScroll = lastAnchorId\n ? scrollToMessage(lastAnchorId, { align: 'start', behavior: 'auto' })\n : scrollToEnd({ behavior: 'auto' });\n } else {\n didScroll = scrollToEnd({ behavior: 'auto' });\n }\n\n if (!didScroll) return;\n defaultScrollAppliedRef.current = true;\n // A fresh thread opens on its first message with nothing to scroll yet: it is\n // at its end, so the reply streaming in under it is followed.\n if (autoScroll && getMaxScroll(viewportElement) <= VISIBILITY_EPSILON) followingRef.current = true;\n // Settling is what arms turn anchoring: the rows the transcript opened with\n // are recorded as read here, and on a settled thread the next anchor to\n // register is the send itself — an arming left to a later anchoring pass\n // would be eaten by that send instead of parking it.\n for (const [messageId, item] of getOrderedItems()) {\n if (!item.scrollAnchor) continue;\n seenAnchorIds.add(messageId);\n seenAnchorElements.add(item.element);\n }\n turnAnchoringArmedRef.current = true;\n };\n\n if (!deferDefaultScrollRef.current) {\n applyDefaultScroll();\n return undefined;\n }\n if (defaultScrollScheduledRef.current) return undefined;\n\n defaultScrollScheduledRef.current = true;\n let cancelled = false;\n scheduleScrollSync(() => {\n scheduleScrollSync(() => {\n defaultScrollScheduledRef.current = false;\n if (!cancelled && !defaultScrollAppliedRef.current) applyDefaultScroll();\n });\n });\n return () => {\n cancelled = true;\n defaultScrollScheduledRef.current = false;\n };\n }, [\n autoScroll,\n defaultScrollPosition,\n getLastAnchorId,\n getOrderedItems,\n itemsRegistry,\n itemsVersion,\n scrollToEnd,\n scrollToMessage,\n scrollToStart,\n seenAnchorElements,\n seenAnchorIds,\n viewportElement,\n ]);\n\n // A turn opening is the one scripted scroll of a conversation: it carries the\n // reader to the message they just sent and parks it as high as the room the turn\n // reserves under it allows. The answer then grows into that room and moves\n // nothing at all — following only takes over once it outgrows the room.\n React.useLayoutEffect(() => {\n const lastAnchorId = getLastAnchorId();\n const lastAnchor = lastAnchorId ? itemsRegistry.get(lastAnchorId) : undefined;\n const opensTurn =\n turnAnchoringArmedRef.current &&\n lastAnchorId !== undefined &&\n lastAnchor !== undefined &&\n !seenAnchorIds.has(lastAnchorId) &&\n !seenAnchorElements.has(lastAnchor.element);\n\n for (const [messageId, item] of getOrderedItems()) {\n if (!item.scrollAnchor) continue;\n seenAnchorIds.add(messageId);\n seenAnchorElements.add(item.element);\n }\n turnAnchoringArmedRef.current = defaultScrollAppliedRef.current;\n\n if (opensTurn && lastAnchorId) {\n if (autoScroll) followingRef.current = true;\n cancelTripAnimation();\n const target = viewportElement ? anchorTripTarget(lastAnchorId) : undefined;\n // A turn opening at the top of the transcript — the first message of a fresh\n // thread — is already parked: no trip, and nothing moves.\n if (\n target === undefined ||\n !viewportElement ||\n Math.abs(target - viewportElement.scrollTop) <= VISIBILITY_EPSILON\n ) {\n tripRef.current = null;\n } else {\n tripRef.current = { anchorId: lastAnchorId };\n tripAnimationRef.current = startTrip(\n viewportElement,\n () => parkTripTarget(lastAnchorId),\n reason => {\n tripAnimationRef.current = null;\n tripRef.current = null;\n if (reason === 'interrupted') followingRef.current = atEndRef.current;\n syncAfterScroll();\n },\n );\n }\n // Published now: the reader just re-attached, and a button that hears late flashes.\n syncAfterScroll();\n return;\n }\n\n // Rows landing outside a turn — restored history, a notice — still belong to a\n // reader riding the stream, and reach them without a second animation. A trip\n // to an anchor keeps the viewport; a parked reader has new rows growing into\n // the room above the fold, with nothing below to catch up to.\n if (!autoScroll || !defaultScrollAppliedRef.current || !followingRef.current) return;\n if (tripRef.current !== null && tripRef.current !== 'end') return;\n if (viewportElement && followTarget() - viewportElement.scrollTop <= VISIBILITY_EPSILON) return;\n scrollToEnd({ behavior: tripRef.current === 'end' ? 'smooth' : 'auto' });\n }, [\n anchorTripTarget,\n autoScroll,\n cancelTripAnimation,\n followTarget,\n getLastAnchorId,\n getOrderedItems,\n itemsRegistry,\n itemsVersion,\n parkTripTarget,\n scrollToEnd,\n seenAnchorElements,\n seenAnchorIds,\n syncAfterScroll,\n viewportElement,\n ]);\n\n // A viewport going away mid-trip strands the frame loop on a detached element.\n React.useEffect(\n () => () => {\n cancelTripAnimation();\n tripRef.current = null;\n },\n [cancelTripAnimation, viewportElement],\n );\n\n // Older items land above the reader and shove their position down. A prepend is\n // told from an append by the first item's id, then undone by offsetting\n // scrollTop by however much taller the content got.\n React.useLayoutEffect(() => {\n const previousFirstItemId = firstItemIdRef.current;\n // From the DOM, not the registry: prepended items register last, so registry\n // order stops matching reading order.\n const firstItemId = contentElement?.querySelector<HTMLElement>('[data-slot=\"message-scroller-item\"]')?.dataset\n .messageId;\n firstItemIdRef.current = firstItemId;\n\n const anchor = prependAnchorRef.current;\n prependAnchorRef.current = null;\n if (!anchor || !viewportElement || firstItemId === previousFirstItemId) return;\n\n reachStartFiredRef.current = false;\n const grownBy = viewportElement.scrollHeight - anchor.scrollHeight;\n if (grownBy > 0) viewportElement.scrollTop = anchor.scrollTop + grownBy;\n }, [contentElement, itemsVersion, viewportElement]);\n\n const actionsContextValue = React.useMemo<MessageScrollerActionsContextValue>(\n () => ({\n notifyContentResize,\n notifyScroll,\n registerItem,\n scrollToEnd,\n scrollToMessage,\n scrollToStart,\n setContentElement,\n setRootElement,\n setViewportElement,\n syncAfterScroll,\n }),\n [notifyContentResize, notifyScroll, registerItem, scrollToEnd, scrollToMessage, scrollToStart, syncAfterScroll],\n );\n\n const scrollableContextValue = React.useMemo<MessageScrollerScrollable>(\n () => ({\n end: scrollable.end,\n start: scrollable.start,\n }),\n [scrollable.end, scrollable.start],\n );\n\n const visibilityContextValue = React.useMemo<MessageScrollerVisibility>(\n () => ({\n currentAnchorId: visibility.currentAnchorId,\n visibleMessageIds: visibility.visibleMessageIds,\n }),\n [visibility.currentAnchorId, visibility.visibleMessageIds],\n );\n\n return (\n <MessageScrollerActionsContext.Provider value={actionsContextValue}>\n <MessageScrollerScrollableContext.Provider value={scrollableContextValue}>\n <MessageScrollerVisibilityContext.Provider value={visibilityContextValue}>\n {children}\n </MessageScrollerVisibilityContext.Provider>\n </MessageScrollerScrollableContext.Provider>\n </MessageScrollerActionsContext.Provider>\n );\n}\n\nexport type MessageScrollerProps = React.HTMLAttributes<HTMLDivElement>;\n\nexport const MessageScroller = React.forwardRef<HTMLDivElement, MessageScrollerProps>(\n ({ className, ...props }, ref) => {\n const { setRootElement } = useRequiredMessageScrollerActionsContext('MessageScroller');\n return (\n <div\n ref={mergeRefs(setRootElement, ref)}\n data-slot=\"message-scroller\"\n className={cn('group/message-scroller relative flex size-full min-h-0 flex-col', className)}\n {...props}\n />\n );\n },\n);\nMessageScroller.displayName = 'MessageScroller';\n\nexport type MessageScrollerViewportProps = React.HTMLAttributes<HTMLDivElement>;\n\nexport const MessageScrollerViewport = React.forwardRef<HTMLDivElement, MessageScrollerViewportProps>(\n ({ className, onScroll, role, tabIndex, ...props }, ref) => {\n const { setViewportElement, notifyScroll } = useRequiredMessageScrollerActionsContext('MessageScrollerViewport');\n const viewportRef = React.useMemo(() => mergeRefs(setViewportElement, ref), [ref, setViewportElement]);\n\n return (\n <div\n ref={viewportRef}\n role={role ?? 'region'}\n tabIndex={tabIndex ?? 0}\n data-slot=\"message-scroller-viewport\"\n className={cn(\n // Size container so consumers can size the room under a live turn in cqh.\n '[container-type:size] size-full min-h-0 min-w-0 overflow-y-auto overscroll-y-contain',\n 'data-autoscrolling:scrollbar-thumb-transparent data-autoscrolling:scrollbar-track-transparent',\n className,\n )}\n onScroll={event => {\n notifyScroll();\n onScroll?.(event);\n }}\n {...props}\n />\n );\n },\n);\nMessageScrollerViewport.displayName = 'MessageScrollerViewport';\n\nexport type MessageScrollerContentProps = React.HTMLAttributes<HTMLDivElement> & {\n spacerClassName?: string;\n};\n\nexport const MessageScrollerContent = React.forwardRef<HTMLDivElement, MessageScrollerContentProps>(\n ({ children, className, spacerClassName, role, 'aria-relevant': ariaRelevant = 'additions', ...props }, ref) => {\n const { setContentElement, notifyContentResize, syncAfterScroll } =\n useRequiredMessageScrollerActionsContext('MessageScrollerContent');\n const [contentElement, setLocalContentElement] = React.useState<HTMLDivElement | null>(null);\n\n const contentRef = React.useMemo(\n () => mergeRefs<HTMLDivElement>(setContentElement, setLocalContentElement, ref),\n [ref, setContentElement],\n );\n\n React.useLayoutEffect(() => {\n syncAfterScroll();\n }, [syncAfterScroll]);\n\n React.useEffect(() => {\n if (!contentElement || typeof MutationObserver === 'undefined') return undefined;\n const observer = new MutationObserver(notifyContentResize);\n observer.observe(contentElement, { childList: true, subtree: false });\n return () => observer.disconnect();\n }, [contentElement, notifyContentResize]);\n\n React.useEffect(() => {\n if (!contentElement || typeof ResizeObserver === 'undefined') return undefined;\n const observer = new ResizeObserver(notifyContentResize);\n observer.observe(contentElement);\n return () => observer.disconnect();\n }, [contentElement, notifyContentResize]);\n\n return (\n <div\n ref={contentRef}\n role={role ?? 'log'}\n aria-relevant={ariaRelevant}\n data-slot=\"message-scroller-content\"\n className={cn('flex h-max min-h-full flex-col gap-6', className)}\n {...props}\n >\n {children}\n <div aria-hidden=\"true\" data-message-scroller-spacer=\"\" hidden className={spacerClassName} />\n </div>\n );\n },\n);\nMessageScrollerContent.displayName = 'MessageScrollerContent';\n\nexport type MessageScrollerItemProps = React.HTMLAttributes<HTMLDivElement> & {\n messageId?: string;\n scrollAnchor?: boolean;\n};\n\nexport const MessageScrollerItem = React.forwardRef<HTMLDivElement, MessageScrollerItemProps>(\n ({ className, messageId, scrollAnchor = false, ...props }, ref) => {\n // Optional, unlike the other slots: the same row renderer is reused outside a\n // scroller (draft pages, previews), where there is simply nothing to register.\n const registerItem = React.useContext(MessageScrollerActionsContext)?.registerItem;\n const unregisterRef = React.useRef<(() => void) | undefined>(undefined);\n const itemRef = React.useCallback(\n (element: HTMLDivElement | null) => {\n unregisterRef.current?.();\n unregisterRef.current = undefined;\n mergeRefs(ref)(element);\n\n if (!element || !messageId || !registerItem) return;\n unregisterRef.current = registerItem(messageId, element, scrollAnchor);\n },\n [messageId, ref, registerItem, scrollAnchor],\n );\n\n return (\n <div\n ref={itemRef}\n data-slot=\"message-scroller-item\"\n data-message-id={messageId}\n data-scroll-anchor={scrollAnchor ? 'true' : 'false'}\n // content-visibility contains painting. Reserve room for a 2px outline + 2px offset,\n // and compensate with negative margins so message alignment and spacing stay unchanged.\n className={cn(\n '-m-1 min-w-0 shrink-0 p-1 [contain-intrinsic-size:auto_10rem] [content-visibility:auto]',\n className,\n )}\n {...props}\n />\n );\n },\n);\nMessageScrollerItem.displayName = 'MessageScrollerItem';\n\nexport type MessageScrollerButtonProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> & {\n behavior?: ScrollBehavior;\n children?: React.ReactNode;\n direction?: MessageScrollerButtonDirection;\n};\n\nexport const MessageScrollerButton = React.forwardRef<HTMLButtonElement, MessageScrollerButtonProps>(\n (\n { behavior = 'smooth', direction = 'end', className, children, onClick, tabIndex, type = 'button', ...props },\n ref,\n ) => {\n const { scrollToEnd, scrollToStart } = useRequiredMessageScrollerActionsContext('MessageScrollerButton');\n const { start, end } = useRequiredMessageScrollerScrollableContext('MessageScrollerButton');\n const active = direction === 'start' ? start : end;\n\n return (\n <button\n ref={ref}\n type={type}\n {...props}\n data-slot=\"message-scroller-button\"\n data-active={active ? 'true' : 'false'}\n data-direction={direction}\n tabIndex={active ? tabIndex : -1}\n className={cn(\n overlaySurfaceStyle,\n 'absolute inset-s-1/2 inline-flex min-h-5 min-w-7 -translate-x-1/2 items-center justify-center rounded-full text-foreground transition-[scale,opacity] duration-200 hover:[--surface-tint:var(--fill-subtle)] data-[active=false]:pointer-events-none data-[active=false]:scale-95 data-[active=false]:opacity-0 data-[active=false]:duration-400 data-[active=false]:ease-[cubic-bezier(0.7,0,0.84,0)] data-[active=true]:scale-100 data-[active=true]:opacity-100 data-[active=true]:ease-[cubic-bezier(0.23,1,0.32,1)] data-[direction=end]:bottom-4 data-[direction=start]:top-4 rtl:translate-x-1/2 data-[direction=start]:[&_svg]:rotate-180',\n className,\n )}\n onClick={event => {\n if (!active) return;\n onClick?.(event);\n if (event.defaultPrevented) return;\n event.currentTarget.blur();\n if (direction === 'start') {\n scrollToStart({ behavior });\n } else {\n scrollToEnd({ behavior });\n }\n }}\n >\n {children ?? (\n <>\n <ArrowDownIcon className=\"size-4\" aria-hidden />\n <span className=\"sr-only\">{direction === 'end' ? 'Scroll to end' : 'Scroll to start'}</span>\n </>\n )}\n </button>\n );\n },\n);\nMessageScrollerButton.displayName = 'MessageScrollerButton';\n","import * as React from 'react';\n\nimport {\n MessageScrollerActionsContext,\n MessageScrollerScrollableContext,\n MessageScrollerVisibilityContext,\n useRequiredMessageScrollerActionsContext,\n useRequiredMessageScrollerScrollableContext,\n useRequiredMessageScrollerVisibilityContext,\n} from './message-scroller-context';\n\nexport const useMessageScroller = () => {\n const { scrollToEnd, scrollToMessage, scrollToStart } =\n useRequiredMessageScrollerActionsContext('useMessageScroller');\n return React.useMemo(\n () => ({ scrollToEnd, scrollToMessage, scrollToStart }),\n [scrollToEnd, scrollToMessage, scrollToStart],\n );\n};\n\nexport const useOptionalMessageScroller = () => {\n const context = React.useContext(MessageScrollerActionsContext);\n return React.useMemo(() => {\n if (!context) return undefined;\n return {\n scrollToEnd: context.scrollToEnd,\n scrollToMessage: context.scrollToMessage,\n scrollToStart: context.scrollToStart,\n };\n }, [context]);\n};\n\nexport const useMessageScrollerScrollable = () => {\n const { start, end } = useRequiredMessageScrollerScrollableContext('useMessageScrollerScrollable');\n return React.useMemo(() => ({ start, end }), [end, start]);\n};\n\nexport const useOptionalMessageScrollerScrollable = () => {\n const context = React.useContext(MessageScrollerScrollableContext);\n return React.useMemo(() => (context ? { start: context.start, end: context.end } : undefined), [context]);\n};\n\nexport const useMessageScrollerVisibility = () => {\n const { currentAnchorId, visibleMessageIds } =\n useRequiredMessageScrollerVisibilityContext('useMessageScrollerVisibility');\n return React.useMemo(() => ({ currentAnchorId, visibleMessageIds }), [currentAnchorId, visibleMessageIds]);\n};\n\nexport const useOptionalMessageScrollerVisibility = () => {\n const context = React.useContext(MessageScrollerVisibilityContext);\n return React.useMemo(\n () =>\n context\n ? {\n currentAnchorId: context.currentAnchorId,\n visibleMessageIds: context.visibleMessageIds,\n }\n : undefined,\n [context],\n );\n};\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MessageScroller-DvaKlm4O.js","names":["React","React","_Fragment","React"],"sources":["../src/ds/components/MessageScroller/message-scroller-context.ts","../src/ds/components/MessageScroller/message-scroller-geometry.ts","../src/ds/components/MessageScroller/message-scroller-glide.ts","../src/ds/components/MessageScroller/message-scroller-trip.ts","../src/ds/components/MessageScroller/message-scroller.tsx","../src/ds/components/MessageScroller/message-scroller-hooks.ts"],"sourcesContent":["import * as React from 'react';\n\nexport type MessageScrollerDefaultScrollPosition = 'start' | 'end' | 'last-anchor';\nexport type MessageScrollerButtonDirection = 'start' | 'end';\nexport type MessageScrollerScrollAlign = 'start' | 'center' | 'end' | 'nearest';\n\nexport type MessageScrollerScrollOptions = {\n align?: MessageScrollerScrollAlign;\n behavior?: ScrollBehavior;\n scrollMargin?: number;\n};\n\nexport type MessageScrollerScrollable = {\n start: boolean;\n end: boolean;\n};\n\nexport type MessageScrollerVisibility = {\n currentAnchorId: string | undefined;\n visibleMessageIds: string[];\n};\n\nexport type MessageScrollerActionsContextValue = {\n notifyContentResize: () => void;\n notifyScroll: () => void;\n registerItem: (messageId: string, element: HTMLElement, scrollAnchor: boolean) => () => void;\n scrollToEnd: (options?: MessageScrollerScrollOptions) => boolean;\n scrollToMessage: (messageId: string, options?: MessageScrollerScrollOptions) => boolean;\n scrollToStart: (options?: MessageScrollerScrollOptions) => boolean;\n setContentElement: (element: HTMLDivElement | null) => void;\n setRootElement: (element: HTMLDivElement | null) => void;\n setViewportElement: (element: HTMLDivElement | null) => void;\n syncAfterScroll: () => void;\n};\n\nexport const DEFAULT_SCROLLABLE: MessageScrollerScrollable = { start: false, end: false };\nexport const DEFAULT_VISIBILITY: MessageScrollerVisibility = { currentAnchorId: undefined, visibleMessageIds: [] };\nexport const DEFAULT_SCROLL_EDGE_THRESHOLD = 8;\nexport const DEFAULT_SCROLL_MARGIN = 0;\nexport const DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK = 64;\nexport const DEFAULT_REACH_START_THRESHOLD = 160;\n\n// Looser than the edge threshold, which only decides whether the scroll buttons\n// are active: how far from the end a reader may sit and still be carried along\n// by growing content.\nexport const AUTO_SCROLL_ATTACH_THRESHOLD = 160;\n\nexport const MessageScrollerActionsContext = React.createContext<MessageScrollerActionsContextValue | null>(null);\nexport const MessageScrollerScrollableContext = React.createContext<MessageScrollerScrollable | null>(null);\nexport const MessageScrollerVisibilityContext = React.createContext<MessageScrollerVisibility | null>(null);\n\nconst useRequiredContext = <TValue>(context: React.Context<TValue | null>, hookName: string) => {\n const value = React.useContext(context);\n if (!value) throw new Error(`${hookName} must be used within MessageScrollerProvider.`);\n return value;\n};\n\nexport const useRequiredMessageScrollerActionsContext = (hookName: string) =>\n useRequiredContext(MessageScrollerActionsContext, hookName);\n\nexport const useRequiredMessageScrollerScrollableContext = (hookName: string) =>\n useRequiredContext(MessageScrollerScrollableContext, hookName);\n\nexport const useRequiredMessageScrollerVisibilityContext = (hookName: string) =>\n useRequiredContext(MessageScrollerVisibilityContext, hookName);\n","import type { MessageScrollerScrollAlign } from './message-scroller-context';\n\n/**\n * Geometry behind the scroller: how far to scroll for a given alignment, and\n * which anchored message the reader is currently on. Split out from the\n * component so each rule can be reasoned about — and tested — on its own.\n */\n\n/** A message the scroller tracks, and whether a turn is anchored to it. */\nexport type MessageScrollerItemRecord = {\n element: HTMLElement;\n scrollAnchor: boolean;\n};\n\n/** Sub-pixel slack, so a message resting exactly on the anchor line still counts. */\nexport const VISIBILITY_EPSILON = 0.5;\n\nexport const getContentPadding = (contentElement: HTMLElement | null) => {\n if (!contentElement) return { start: 0, end: 0 };\n const styles = window.getComputedStyle(contentElement);\n return {\n start: Number.parseFloat(styles.paddingBlockStart || styles.paddingTop) || 0,\n end: Number.parseFloat(styles.paddingBlockEnd || styles.paddingBottom) || 0,\n };\n};\n\nexport const getMaxScroll = (viewportElement: HTMLElement) =>\n Math.max(0, viewportElement.scrollHeight - viewportElement.clientHeight);\n\nexport const getRelativeTop = (element: HTMLElement, viewportElement: HTMLElement) => {\n const elementRect = element.getBoundingClientRect();\n const viewportRect = viewportElement.getBoundingClientRect();\n return elementRect.top - viewportRect.top + viewportElement.scrollTop;\n};\n\nexport const getScrollTarget = ({\n align,\n contentElement,\n element,\n scrollMargin,\n viewportElement,\n}: {\n align: MessageScrollerScrollAlign;\n /** The padding framing the transcript lives here, however deep the rows nest. */\n contentElement: HTMLElement | null;\n element: HTMLElement;\n scrollMargin: number;\n viewportElement: HTMLElement;\n}) => {\n const contentPadding = getContentPadding(contentElement);\n const elementTop = getRelativeTop(element, viewportElement);\n const elementHeight = element.getBoundingClientRect().height;\n const visibleHeight = Math.max(0, viewportElement.clientHeight - contentPadding.start - contentPadding.end);\n\n if (align === 'center') return elementTop - contentPadding.start - (visibleHeight - elementHeight) / 2 - scrollMargin;\n if (align === 'end')\n return elementTop - viewportElement.clientHeight + elementHeight + contentPadding.end + scrollMargin;\n\n if (align === 'nearest') {\n const elementBottom = elementTop + elementHeight;\n const viewportTop = viewportElement.scrollTop + contentPadding.start;\n const viewportBottom = viewportElement.scrollTop + viewportElement.clientHeight - contentPadding.end;\n if (elementTop >= viewportTop && elementBottom <= viewportBottom) return viewportElement.scrollTop;\n return elementTop < viewportTop\n ? elementTop - contentPadding.start - scrollMargin\n : elementBottom - viewportElement.clientHeight + contentPadding.end + scrollMargin;\n }\n\n return elementTop - contentPadding.start - scrollMargin;\n};\n\n/**\n * Where the reader must sit for the last row to rest at the end of the view.\n *\n * Not the end of the scroll: a chat reserves room under a live turn so a reply\n * grows into empty space, and docks its composer in the flow. Both sit below the\n * last row, so scrolling to the end of the box carries that row — and the message\n * that opened the turn — out of the view above. Reading it from the rows means no\n * one has to publish a height for anyone else to subtract.\n */\nexport const getFollowTarget = ({\n contentElement,\n items,\n viewportElement,\n}: {\n contentElement: HTMLElement | null;\n items: Array<readonly [string, MessageScrollerItemRecord]>;\n viewportElement: HTMLElement;\n}) => {\n const end = getMaxScroll(viewportElement);\n const lastRow = items.at(-1)?.[1].element;\n if (!lastRow || !contentElement) return end;\n\n const contentBottom = getRelativeTop(contentElement, viewportElement) + contentElement.getBoundingClientRect().height;\n const belowContent = Math.max(0, viewportElement.scrollHeight - contentBottom);\n const rowBottom = getRelativeTop(lastRow, viewportElement) + lastRow.getBoundingClientRect().height;\n\n return Math.min(end, Math.max(0, rowBottom + belowContent - viewportElement.clientHeight));\n};\n\nexport const getCurrentAnchorId = ({\n fallbackAnchorId,\n items,\n scrollMargin,\n scrollPreviousItemPeek,\n visibleMessageIds,\n viewportElement,\n}: {\n fallbackAnchorId: string | undefined;\n items: Array<readonly [string, MessageScrollerItemRecord]>;\n scrollMargin: number;\n scrollPreviousItemPeek: number;\n visibleMessageIds: Set<string>;\n viewportElement: HTMLElement;\n}) => {\n const anchorLine = viewportElement.getBoundingClientRect().top + scrollMargin + scrollPreviousItemPeek;\n const anchors = items.filter(([, item]) => item.scrollAnchor);\n let anchoredAboveViewport: string | undefined;\n\n for (const [messageId, item] of anchors) {\n if (item.element.getBoundingClientRect().top <= anchorLine + VISIBILITY_EPSILON) {\n anchoredAboveViewport = messageId;\n }\n }\n\n if (anchoredAboveViewport) return anchoredAboveViewport;\n return anchors.find(([messageId]) => visibleMessageIds.has(messageId))?.[0] ?? fallbackAnchorId;\n};\n","/** Longest single growth worth smoothing. Past it the move is one the reader asked for. */\nconst GLIDE_MAX = 240;\nconst GLIDE_MS = 220;\nconst GLIDE_EASE = 'cubic-bezier(0.33, 1, 0.68, 1)';\n\nfunction currentOffset(element: HTMLElement): number {\n if (typeof DOMMatrixReadOnly === 'undefined') return 0;\n const { transform } = getComputedStyle(element);\n if (!transform || transform === 'none') return 0;\n return new DOMMatrixReadOnly(transform).m42;\n}\n\nconst travels = new WeakMap<HTMLElement, AbortController>();\n\nfunction release(element: HTMLElement): void {\n travels.get(element)?.abort();\n travels.delete(element);\n element.style.transition = '';\n element.style.transform = '';\n}\n\nfunction calm(): boolean {\n if (typeof window === 'undefined' || !window.matchMedia) return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\n/**\n * Hides a scroll that has already happened. The end is pinned instantly, as it must\n * be, then the content is put back where the reader last saw it and travels to zero\n * on the compositor — so a reply growing a line at a time reads as one movement\n * rather than a snap per wrapped line.\n *\n * Transform, not layout: `scrollHeight` never changes, so nothing here can feed the\n * resize that called it. A line landing mid-travel only adds to the distance left.\n */\nexport function glideContent(element: HTMLElement | null, delta: number): void {\n if (!element || delta <= 0 || calm()) return;\n\n const offset = currentOffset(element) + delta;\n if (offset > GLIDE_MAX) {\n release(element);\n return;\n }\n\n element.style.transition = 'none';\n element.style.transform = `translateY(${offset}px)`;\n // Commit the displaced position, or the browser only ever sees the settled one.\n void element.offsetHeight;\n element.style.transition = `transform ${GLIDE_MS}ms ${GLIDE_EASE}`;\n element.style.transform = 'translateY(0)';\n // A settled transform would leave the content a containing block for anything\n // fixed inside it, so the styles come off once the travel is spent. Descendants'\n // transitions bubble here too, so only the content's own settle counts.\n travels.get(element)?.abort();\n const travel = new AbortController();\n travels.set(element, travel);\n const settle = (event: TransitionEvent) => {\n if (event.target !== element) return;\n if (currentOffset(element) === 0) release(element);\n };\n element.addEventListener('transitionend', settle, { signal: travel.signal });\n element.addEventListener('transitioncancel', settle, { signal: travel.signal });\n}\n","import { VISIBILITY_EPSILON } from './message-scroller-geometry';\n\n/** One designed curve for the one scripted trip: fast liftoff, long settle. */\nconst TRIP_MS = 560;\n/** How long past its clock a trip may chase a destination the layout hasn't released yet. */\nconst TRIP_OVERTIME_MS = 240;\n\nconst easeOutQuint = (t: number) => 1 - (1 - t) ** 5;\n\nexport type TripEndReason = 'arrived' | 'interrupted' | 'expired';\n\nexport interface TripAnimation {\n cancel: () => void;\n}\n\n/**\n * Drives the viewport to a destination the way a transition would, not the way\n * `scrollTo({ behavior: 'smooth' })` does: the destination is re-read every frame,\n * so a layout still settling under the trip — the reserved room opening beneath a\n * new turn — bends the path instead of restarting the curve. Writes are clamped by\n * the browser, so until the room has opened far enough the trip simply rides the\n * end of the box down.\n *\n * The reader keeps the last word: a scroll position this trip didn't write ends it.\n */\nexport function startTrip(\n viewportElement: HTMLElement,\n getTarget: () => number | undefined,\n onEnd: (reason: TripEndReason) => void,\n): TripAnimation {\n const reduceMotion =\n typeof window.matchMedia === 'function' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n const duration = reduceMotion ? 0 : TRIP_MS;\n const startedAt = performance.now();\n const from = viewportElement.scrollTop;\n let lastWritten = from;\n let frame = 0;\n let ended = false;\n\n const end = (reason: TripEndReason) => {\n ended = true;\n onEnd(reason);\n };\n\n const step = () => {\n if (Math.abs(viewportElement.scrollTop - lastWritten) > 1) return end('interrupted');\n const target = getTarget();\n if (target === undefined) return end('expired');\n const elapsed = performance.now() - startedAt;\n const progress = duration === 0 ? 1 : Math.min(1, elapsed / duration);\n viewportElement.scrollTop = from + (target - from) * easeOutQuint(progress);\n lastWritten = viewportElement.scrollTop;\n if (progress === 1 && Math.abs(lastWritten - target) <= VISIBILITY_EPSILON) return end('arrived');\n if (elapsed >= duration + TRIP_OVERTIME_MS) return end('expired');\n frame = window.requestAnimationFrame(step);\n };\n\n frame = window.requestAnimationFrame(step);\n\n return {\n cancel: () => {\n if (ended) return;\n ended = true;\n window.cancelAnimationFrame(frame);\n },\n };\n}\n","import { ArrowDownIcon } from 'lucide-react';\nimport * as React from 'react';\n\nimport {\n AUTO_SCROLL_ATTACH_THRESHOLD,\n DEFAULT_REACH_START_THRESHOLD,\n DEFAULT_SCROLL_EDGE_THRESHOLD,\n DEFAULT_SCROLL_MARGIN,\n DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK,\n DEFAULT_SCROLLABLE,\n DEFAULT_VISIBILITY,\n MessageScrollerActionsContext,\n MessageScrollerScrollableContext,\n MessageScrollerVisibilityContext,\n useRequiredMessageScrollerActionsContext,\n useRequiredMessageScrollerScrollableContext,\n} from './message-scroller-context';\nimport type {\n MessageScrollerActionsContextValue,\n MessageScrollerButtonDirection,\n MessageScrollerDefaultScrollPosition,\n MessageScrollerScrollAlign,\n MessageScrollerScrollOptions,\n MessageScrollerScrollable,\n MessageScrollerVisibility,\n} from './message-scroller-context';\n\nimport {\n VISIBILITY_EPSILON,\n getCurrentAnchorId,\n getFollowTarget,\n getMaxScroll,\n getScrollTarget,\n} from './message-scroller-geometry';\nimport type { MessageScrollerItemRecord } from './message-scroller-geometry';\nimport { glideContent } from './message-scroller-glide';\nimport { startTrip } from './message-scroller-trip';\nimport type { TripAnimation } from './message-scroller-trip';\n\nimport { overlaySurfaceStyle } from '@/ds/primitives/raised-surface';\nimport { mergeRefs } from '@/lib/merge-refs';\nimport { cn } from '@/lib/utils';\n\nexport type {\n MessageScrollerButtonDirection,\n MessageScrollerDefaultScrollPosition,\n MessageScrollerScrollAlign,\n MessageScrollerScrollOptions,\n MessageScrollerScrollable,\n MessageScrollerVisibility,\n} from './message-scroller-context';\n\nconst scrollableMatches = (left: MessageScrollerScrollable, right: MessageScrollerScrollable) =>\n left.start === right.start && left.end === right.end;\n\nconst visibilityMatches = (left: MessageScrollerVisibility, right: MessageScrollerVisibility) =>\n left.currentAnchorId === right.currentAnchorId &&\n left.visibleMessageIds.length === right.visibleMessageIds.length &&\n left.visibleMessageIds.every((messageId, index) => messageId === right.visibleMessageIds[index]);\n\nconst orderItemsByDocumentPosition = (items: Array<readonly [string, MessageScrollerItemRecord]>) =>\n items.sort(([, left], [, right]) => {\n const position = left.element.compareDocumentPosition(right.element);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) return -1;\n if (position & Node.DOCUMENT_POSITION_PRECEDING) return 1;\n return 0;\n });\n\nconst scrollViewportTo = (viewportElement: HTMLElement, top: number, behavior: ScrollBehavior) => {\n if (typeof viewportElement.scrollTo === 'function') {\n viewportElement.scrollTo({ top, behavior });\n return;\n }\n\n viewportElement.scrollTop = top;\n};\n\nconst scheduleScrollSync = (callback: () => void) => {\n if (typeof window.requestAnimationFrame === 'function') {\n window.requestAnimationFrame(callback);\n return;\n }\n\n window.setTimeout(callback, 0);\n};\n\nexport interface MessageScrollerProviderProps {\n /** Carry the reader with the stream, re-attaching on a new turn. Off still parks a new turn, without following the reply. */\n autoScroll?: boolean;\n children?: React.ReactNode;\n defaultScrollPosition?: MessageScrollerDefaultScrollPosition;\n /** Called when the reader scrolls near the start — where older history is loaded. */\n onReachStart?: () => void;\n /** Hold the reading position when older items are added above the current ones. */\n preserveScrollOnPrepend?: boolean;\n reachStartThreshold?: number;\n scrollEdgeThreshold?: number;\n scrollMargin?: number;\n scrollPreviousItemPeek?: number;\n}\n\nexport function MessageScrollerProvider({\n autoScroll = false,\n children,\n defaultScrollPosition = 'end',\n onReachStart,\n preserveScrollOnPrepend = false,\n reachStartThreshold = DEFAULT_REACH_START_THRESHOLD,\n scrollEdgeThreshold = DEFAULT_SCROLL_EDGE_THRESHOLD,\n scrollMargin = DEFAULT_SCROLL_MARGIN,\n scrollPreviousItemPeek = DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK,\n}: MessageScrollerProviderProps) {\n const itemsRef = React.useRef<Map<string, MessageScrollerItemRecord> | null>(null);\n itemsRef.current ??= new Map<string, MessageScrollerItemRecord>();\n const itemsRegistry = itemsRef.current;\n // Rebuilt on register/unregister only — scroll runs this too often to sort per event.\n const orderedItemsRef = React.useRef<Array<readonly [string, MessageScrollerItemRecord]> | null>(null);\n const visibleMessageIdsRef = React.useRef<Set<string> | null>(null);\n visibleMessageIdsRef.current ??= new Set<string>();\n const intersectingMessageIds = visibleMessageIdsRef.current;\n const [itemsVersion, setItemsVersion] = React.useState(0);\n const [rootElement, setRootElement] = React.useState<HTMLDivElement | null>(null);\n const [viewportElement, setViewportElement] = React.useState<HTMLDivElement | null>(null);\n const [contentElement, setContentElement] = React.useState<HTMLDivElement | null>(null);\n const defaultScrollAppliedRef = React.useRef(false);\n const deferDefaultScrollRef = React.useRef(false);\n const defaultScrollScheduledRef = React.useRef(false);\n const seenAnchorIdsRef = React.useRef<Set<string> | null>(null);\n seenAnchorIdsRef.current ??= new Set<string>();\n const seenAnchorIds = seenAnchorIdsRef.current;\n // Message ID reconciliation keeps the row element while replacing its ID.\n const seenAnchorElementsRef = React.useRef<WeakSet<HTMLElement> | null>(null);\n seenAnchorElementsRef.current ??= new WeakSet<HTMLElement>();\n const seenAnchorElements = seenAnchorElementsRef.current;\n const turnAnchoringArmedRef = React.useRef(false);\n const [scrollable, setScrollable] = React.useState<MessageScrollerScrollable>(DEFAULT_SCROLLABLE);\n const [visibility, setVisibility] = React.useState<MessageScrollerVisibility>(DEFAULT_VISIBILITY);\n const atEndRef = React.useRef(true);\n // Attachment is a mode, not a measurement: a growing reply moves the end away\n // without the reader having moved, so only the reader detaches it.\n const followingRef = React.useRef(true);\n // A smooth trip in flight, remembered by destination — the end of the stream, or\n // the anchor a new turn parks at. Sampled mid-flight it reads as a reader who\n // left, so it suspends detachment; a position going backwards calls it off.\n const tripRef = React.useRef<'end' | { anchorId: string } | null>(null);\n // The frame loop behind an anchor trip. Owns clearing its trip: it alone can\n // tell the reader taking over from its own writes landing.\n const tripAnimationRef = React.useRef<TripAnimation | null>(null);\n const lastScrollTopRef = React.useRef(0);\n // Only a reader moving backwards asks for older history: a mount sitting at\n // scrollTop 0 before the default scroll lands has not moved.\n const reachStartArmedRef = React.useRef(false);\n const reachStartFiredRef = React.useRef(false);\n const prependAnchorRef = React.useRef<{ scrollHeight: number; scrollTop: number } | null>(null);\n const firstItemIdRef = React.useRef<string | undefined>(undefined);\n // Off notifyScroll's deps on purpose: consumers pass it inline, and a fresh\n // identity per render would republish the actions context to every consumer.\n const onReachStartRef = React.useRef(onReachStart);\n React.useEffect(() => {\n onReachStartRef.current = onReachStart;\n }, [onReachStart]);\n\n const publishScrollable = React.useCallback(\n (nextScrollable: MessageScrollerScrollable) => {\n const scrollableValue = [nextScrollable.start && 'start', nextScrollable.end && 'end'].filter(Boolean).join(' ');\n\n for (const element of [rootElement, viewportElement]) {\n if (!element) continue;\n if (scrollableValue) {\n element.setAttribute('data-scrollable', scrollableValue);\n } else {\n element.removeAttribute('data-scrollable');\n }\n }\n\n setScrollable(current => (scrollableMatches(current, nextScrollable) ? current : nextScrollable));\n },\n [rootElement, viewportElement],\n );\n\n const publishVisibility = React.useCallback((nextVisibility: MessageScrollerVisibility) => {\n setVisibility(current => (visibilityMatches(current, nextVisibility) ? current : nextVisibility));\n }, []);\n\n // Registration is mount order, not document order, once history is prepended.\n const getOrderedItems = React.useCallback(() => {\n orderedItemsRef.current ??= orderItemsByDocumentPosition(Array.from(itemsRegistry.entries()));\n return orderedItemsRef.current;\n }, [itemsRegistry]);\n\n // The one definition of \"the end\" — following it, resting at it, offering the trip\n // back to it. Everything below the last row (reserved room, the docked composer)\n // is room to grow into, never somewhere to scroll.\n const followTarget = React.useCallback(() => {\n if (!viewportElement) return 0;\n\n return getFollowTarget({ contentElement, items: getOrderedItems(), viewportElement });\n }, [contentElement, getOrderedItems, viewportElement]);\n\n const anchorTripTarget = React.useCallback(\n (anchorId: string) => {\n const item = itemsRegistry.get(anchorId);\n if (!item || !viewportElement) return undefined;\n return Math.max(\n 0,\n getScrollTarget({ align: 'start', contentElement, element: item.element, scrollMargin, viewportElement }),\n );\n },\n [contentElement, itemsRegistry, scrollMargin, viewportElement],\n );\n\n // The motion's destination, never the decision's: the room under a fresh turn is\n // still opening when the trip starts — on a short thread the box has not even\n // grown yet — so the cap is re-read per frame and the trip rides the end of the\n // box until the opened room decides where the message rests.\n const parkTripTarget = React.useCallback(\n (anchorId: string) => {\n const target = anchorTripTarget(anchorId);\n if (target === undefined || !viewportElement) return target;\n return Math.min(target, getMaxScroll(viewportElement));\n },\n [anchorTripTarget, viewportElement],\n );\n\n const cancelTripAnimation = React.useCallback(() => {\n tripAnimationRef.current?.cancel();\n tripAnimationRef.current = null;\n }, []);\n\n const updateScrollable = React.useCallback(\n ({ fromScroll = false }: { fromScroll?: boolean } = {}) => {\n if (!viewportElement) {\n atEndRef.current = true;\n publishScrollable(DEFAULT_SCROLLABLE);\n return false;\n }\n\n const { scrollTop } = viewportElement;\n const remainingScroll = followTarget() - scrollTop;\n const wentBack = scrollTop < lastScrollTopRef.current;\n atEndRef.current = remainingScroll < AUTO_SCROLL_ATTACH_THRESHOLD;\n if (tripRef.current === 'end' && (wentBack || atEndRef.current)) tripRef.current = null;\n lastScrollTopRef.current = scrollTop;\n // Scrolling back is the only way out of the stream, the end the only way back in:\n // a position merely left behind by a growing reply is us chasing it, not them leaving.\n if (fromScroll && tripRef.current === null && (wentBack || atEndRef.current)) {\n followingRef.current = atEndRef.current;\n }\n\n publishScrollable({\n start: scrollTop > scrollEdgeThreshold,\n end: remainingScroll > scrollEdgeThreshold && !(autoScroll && followingRef.current),\n });\n\n return wentBack;\n },\n [autoScroll, followTarget, publishScrollable, scrollEdgeThreshold, viewportElement],\n );\n\n const getLastAnchorId = React.useCallback(\n () =>\n getOrderedItems()\n .filter(([, item]) => item.scrollAnchor)\n .at(-1)?.[0],\n [getOrderedItems],\n );\n\n const updateVisibility = React.useCallback(() => {\n const items = getOrderedItems();\n const fallbackAnchorId = getLastAnchorId() ?? items.at(-1)?.[0];\n\n if (items.length === 0) {\n publishVisibility(DEFAULT_VISIBILITY);\n return;\n }\n\n if (!viewportElement) {\n publishVisibility({\n currentAnchorId: fallbackAnchorId,\n visibleMessageIds: fallbackAnchorId ? [fallbackAnchorId] : [],\n });\n return;\n }\n\n const viewportRect = viewportElement.getBoundingClientRect();\n const visibleMessageIds = new Set<string>();\n\n if (typeof IntersectionObserver === 'undefined') {\n const visibilityTop = viewportRect.top + scrollMargin + scrollPreviousItemPeek;\n items.forEach(([messageId, item]) => {\n const rect = item.element.getBoundingClientRect();\n if (rect.bottom > visibilityTop && rect.top < viewportRect.bottom) visibleMessageIds.add(messageId);\n });\n } else {\n intersectingMessageIds.forEach(messageId => visibleMessageIds.add(messageId));\n }\n\n const orderedVisibleMessageIds = items.flatMap(([messageId]) =>\n visibleMessageIds.has(messageId) ? [messageId] : [],\n );\n\n publishVisibility({\n currentAnchorId: getCurrentAnchorId({\n fallbackAnchorId,\n items,\n scrollMargin,\n scrollPreviousItemPeek,\n visibleMessageIds,\n viewportElement,\n }),\n visibleMessageIds:\n orderedVisibleMessageIds.length > 0 ? orderedVisibleMessageIds : fallbackAnchorId ? [fallbackAnchorId] : [],\n });\n }, [\n getLastAnchorId,\n getOrderedItems,\n intersectingMessageIds,\n publishVisibility,\n scrollMargin,\n scrollPreviousItemPeek,\n viewportElement,\n ]);\n\n const syncAfterScroll = React.useCallback(() => {\n updateScrollable();\n updateVisibility();\n }, [updateScrollable, updateVisibility]);\n\n const notifyScroll = React.useCallback(() => {\n const wasScrollable = Boolean(viewportElement && viewportElement.scrollHeight > viewportElement.clientHeight);\n const readerWentBack = updateScrollable({ fromScroll: true });\n updateVisibility();\n if (!viewportElement) return;\n\n if (readerWentBack && wasScrollable) reachStartArmedRef.current = true;\n\n if (!reachStartArmedRef.current) return;\n if (!wasScrollable) return;\n if (viewportElement.scrollTop > reachStartThreshold) {\n reachStartFiredRef.current = false;\n return;\n }\n // One request per trip to the start: staying there must not queue a second.\n if (reachStartFiredRef.current) return;\n if (!onReachStartRef.current) return;\n\n reachStartFiredRef.current = true;\n if (preserveScrollOnPrepend) {\n prependAnchorRef.current = {\n scrollHeight: viewportElement.scrollHeight,\n scrollTop: viewportElement.scrollTop,\n };\n }\n onReachStartRef.current();\n }, [preserveScrollOnPrepend, reachStartThreshold, updateScrollable, updateVisibility, viewportElement]);\n\n const scrollToElement = React.useCallback(\n (\n element: HTMLElement,\n {\n align = 'start',\n behavior = 'auto',\n scrollMargin: optionScrollMargin = scrollMargin,\n }: MessageScrollerScrollOptions = {},\n ) => {\n if (!viewportElement || !contentElement?.contains(element)) return false;\n\n const nextScrollTop = Math.max(\n 0,\n getScrollTarget({ align, contentElement, element, scrollMargin: optionScrollMargin, viewportElement }),\n );\n\n if (Math.abs(viewportElement.scrollTop - nextScrollTop) <= VISIBILITY_EPSILON) {\n scrollViewportTo(viewportElement, nextScrollTop, 'auto');\n syncAfterScroll();\n return true;\n }\n\n scrollViewportTo(viewportElement, nextScrollTop, behavior);\n scheduleScrollSync(syncAfterScroll);\n return true;\n },\n [contentElement, scrollMargin, syncAfterScroll, viewportElement],\n );\n\n const scrollToStart = React.useCallback(\n ({ behavior = 'auto' }: MessageScrollerScrollOptions = {}) => {\n if (!viewportElement) return false;\n cancelTripAnimation();\n tripRef.current = null;\n scrollViewportTo(viewportElement, 0, behavior);\n scheduleScrollSync(syncAfterScroll);\n return true;\n },\n [cancelTripAnimation, syncAfterScroll, viewportElement],\n );\n\n const scrollToEnd = React.useCallback(\n ({ behavior = 'auto' }: MessageScrollerScrollOptions = {}) => {\n if (!viewportElement) return false;\n cancelTripAnimation();\n followingRef.current = true;\n tripRef.current = behavior === 'smooth' ? 'end' : null;\n scrollViewportTo(viewportElement, followTarget(), behavior);\n // Published now, not next frame: a button that hears about the trip late flashes.\n syncAfterScroll();\n scheduleScrollSync(syncAfterScroll);\n return true;\n },\n [cancelTripAnimation, followTarget, syncAfterScroll, viewportElement],\n );\n\n const scrollToMessage = React.useCallback(\n (messageId: string, options?: MessageScrollerScrollOptions) => {\n const item = itemsRegistry.get(messageId);\n if (!item) return false;\n return scrollToElement(item.element, options);\n },\n [itemsRegistry, scrollToElement],\n );\n\n // A reply grows into the room its turn reserved and moves nothing: only once the\n // last row would fall past the end of the view is there anything to follow, and\n // then by exactly what it overflowed — pinned instantly, glided on the compositor.\n const notifyContentResize = React.useCallback(() => {\n const trip = tripRef.current;\n const onAnchorTrip = trip !== null && trip !== 'end';\n // An anchor trip re-reads its destination every frame, so a layout settling\n // under it — the reserved room opening — bends its path without help from here.\n if (!onAnchorTrip && autoScroll && defaultScrollAppliedRef.current && followingRef.current && viewportElement) {\n const overflow = followTarget() - viewportElement.scrollTop;\n if (overflow > VISIBILITY_EPSILON) {\n // A trip already in flight is retargeted rather than cut short; only the\n // instant catch-up needs the glide to read as one movement.\n const travelling = trip === 'end';\n scrollViewportTo(viewportElement, followTarget(), travelling ? 'smooth' : 'auto');\n if (!travelling) glideContent(contentElement, overflow);\n }\n }\n syncAfterScroll();\n }, [autoScroll, contentElement, followTarget, syncAfterScroll, viewportElement]);\n\n const registerItem = React.useCallback(\n (messageId: string, element: HTMLElement, scrollAnchor: boolean) => {\n itemsRegistry.set(messageId, { element, scrollAnchor });\n orderedItemsRef.current = null;\n setItemsVersion(version => version + 1);\n\n return () => {\n const current = itemsRegistry.get(messageId);\n if (current?.element !== element) return;\n itemsRegistry.delete(messageId);\n intersectingMessageIds.delete(messageId);\n orderedItemsRef.current = null;\n setItemsVersion(version => version + 1);\n };\n },\n [intersectingMessageIds, itemsRegistry],\n );\n\n React.useEffect(() => {\n if (!contentElement || !viewportElement || typeof IntersectionObserver === 'undefined') {\n updateVisibility();\n return undefined;\n }\n\n const messageIdByElement = new Map<Element, string>();\n for (const [messageId, item] of itemsRegistry) {\n messageIdByElement.set(item.element, messageId);\n }\n\n const observer = new IntersectionObserver(\n entries => {\n for (const entry of entries) {\n const messageId = messageIdByElement.get(entry.target);\n if (!messageId) continue;\n if (entry.isIntersecting) {\n intersectingMessageIds.add(messageId);\n } else {\n intersectingMessageIds.delete(messageId);\n }\n }\n updateVisibility();\n },\n {\n root: viewportElement,\n rootMargin: `${-(scrollMargin + scrollPreviousItemPeek)}px 0px 0px 0px`,\n threshold: [0, 0.01, 0.5, 1],\n },\n );\n\n for (const [, item] of itemsRegistry) observer.observe(item.element);\n updateVisibility();\n\n return () => observer.disconnect();\n }, [\n contentElement,\n intersectingMessageIds,\n itemsRegistry,\n itemsVersion,\n scrollMargin,\n scrollPreviousItemPeek,\n updateVisibility,\n viewportElement,\n ]);\n\n React.useEffect(() => {\n if (!viewportElement || typeof ResizeObserver === 'undefined') return undefined;\n const observer = new ResizeObserver(syncAfterScroll);\n observer.observe(viewportElement);\n return () => observer.disconnect();\n }, [syncAfterScroll, viewportElement]);\n\n React.useLayoutEffect(() => {\n updateScrollable();\n updateVisibility();\n }, [itemsVersion, updateScrollable, updateVisibility]);\n\n React.useLayoutEffect(() => {\n if (defaultScrollAppliedRef.current || !viewportElement) return undefined;\n if (itemsRegistry.size === 0) {\n deferDefaultScrollRef.current = true;\n return undefined;\n }\n\n const applyDefaultScroll = () => {\n const lastAnchorId = getLastAnchorId();\n // Where a thread opens decides whether it starts attached: a restored reading\n // position has the stream below it. `scrollToEnd` takes this back when it lands.\n followingRef.current = false;\n let didScroll = false;\n if (defaultScrollPosition === 'start') {\n didScroll = scrollToStart({ behavior: 'auto' });\n } else if (defaultScrollPosition === 'last-anchor') {\n didScroll = lastAnchorId\n ? scrollToMessage(lastAnchorId, { align: 'start', behavior: 'auto' })\n : scrollToEnd({ behavior: 'auto' });\n } else {\n didScroll = scrollToEnd({ behavior: 'auto' });\n }\n\n if (!didScroll) return;\n defaultScrollAppliedRef.current = true;\n // A fresh thread opens on its first message with nothing to scroll yet: it is\n // at its end, so the reply streaming in under it is followed.\n if (autoScroll && getMaxScroll(viewportElement) <= VISIBILITY_EPSILON) followingRef.current = true;\n // Settling is what arms turn anchoring: the rows the transcript opened with\n // are recorded as read here, and on a settled thread the next anchor to\n // register is the send itself — an arming left to a later anchoring pass\n // would be eaten by that send instead of parking it.\n for (const [messageId, item] of getOrderedItems()) {\n if (!item.scrollAnchor) continue;\n seenAnchorIds.add(messageId);\n seenAnchorElements.add(item.element);\n }\n turnAnchoringArmedRef.current = true;\n };\n\n if (!deferDefaultScrollRef.current) {\n applyDefaultScroll();\n return undefined;\n }\n if (defaultScrollScheduledRef.current) return undefined;\n\n defaultScrollScheduledRef.current = true;\n let cancelled = false;\n scheduleScrollSync(() => {\n scheduleScrollSync(() => {\n defaultScrollScheduledRef.current = false;\n if (!cancelled && !defaultScrollAppliedRef.current) applyDefaultScroll();\n });\n });\n return () => {\n cancelled = true;\n defaultScrollScheduledRef.current = false;\n };\n }, [\n autoScroll,\n defaultScrollPosition,\n getLastAnchorId,\n getOrderedItems,\n itemsRegistry,\n itemsVersion,\n scrollToEnd,\n scrollToMessage,\n scrollToStart,\n seenAnchorElements,\n seenAnchorIds,\n viewportElement,\n ]);\n\n // A turn opening is the one scripted scroll of a conversation: it carries the\n // reader to the message they just sent and parks it as high as the room the turn\n // reserves under it allows. The answer then grows into that room and moves\n // nothing at all — following only takes over once it outgrows the room.\n React.useLayoutEffect(() => {\n const lastAnchorId = getLastAnchorId();\n const lastAnchor = lastAnchorId ? itemsRegistry.get(lastAnchorId) : undefined;\n const opensTurn =\n turnAnchoringArmedRef.current &&\n lastAnchorId !== undefined &&\n lastAnchor !== undefined &&\n !seenAnchorIds.has(lastAnchorId) &&\n !seenAnchorElements.has(lastAnchor.element);\n\n for (const [messageId, item] of getOrderedItems()) {\n if (!item.scrollAnchor) continue;\n seenAnchorIds.add(messageId);\n seenAnchorElements.add(item.element);\n }\n turnAnchoringArmedRef.current = defaultScrollAppliedRef.current;\n\n if (opensTurn && lastAnchorId) {\n if (autoScroll) followingRef.current = true;\n cancelTripAnimation();\n const target = viewportElement ? anchorTripTarget(lastAnchorId) : undefined;\n // A turn opening at the top of the transcript — the first message of a fresh\n // thread — is already parked: no trip, and nothing moves.\n if (\n target === undefined ||\n !viewportElement ||\n Math.abs(target - viewportElement.scrollTop) <= VISIBILITY_EPSILON\n ) {\n tripRef.current = null;\n } else {\n tripRef.current = { anchorId: lastAnchorId };\n tripAnimationRef.current = startTrip(\n viewportElement,\n () => parkTripTarget(lastAnchorId),\n reason => {\n tripAnimationRef.current = null;\n tripRef.current = null;\n if (reason === 'interrupted') followingRef.current = atEndRef.current;\n syncAfterScroll();\n },\n );\n }\n // Published now: the reader just re-attached, and a button that hears late flashes.\n syncAfterScroll();\n return;\n }\n\n // Rows landing outside a turn — restored history, a notice — still belong to a\n // reader riding the stream, and reach them without a second animation. A trip\n // to an anchor keeps the viewport; a parked reader has new rows growing into\n // the room above the fold, with nothing below to catch up to.\n if (!autoScroll || !defaultScrollAppliedRef.current || !followingRef.current) return;\n if (tripRef.current !== null && tripRef.current !== 'end') return;\n if (viewportElement && followTarget() - viewportElement.scrollTop <= VISIBILITY_EPSILON) return;\n scrollToEnd({ behavior: tripRef.current === 'end' ? 'smooth' : 'auto' });\n }, [\n anchorTripTarget,\n autoScroll,\n cancelTripAnimation,\n followTarget,\n getLastAnchorId,\n getOrderedItems,\n itemsRegistry,\n itemsVersion,\n parkTripTarget,\n scrollToEnd,\n seenAnchorElements,\n seenAnchorIds,\n syncAfterScroll,\n viewportElement,\n ]);\n\n // A viewport going away mid-trip strands the frame loop on a detached element.\n React.useEffect(\n () => () => {\n cancelTripAnimation();\n tripRef.current = null;\n },\n [cancelTripAnimation, viewportElement],\n );\n\n // Older items land above the reader and shove their position down. A prepend is\n // told from an append by the first item's id, then undone by offsetting\n // scrollTop by however much taller the content got.\n React.useLayoutEffect(() => {\n const previousFirstItemId = firstItemIdRef.current;\n // From the DOM, not the registry: prepended items register last, so registry\n // order stops matching reading order.\n const firstItemId = contentElement?.querySelector<HTMLElement>('[data-slot=\"message-scroller-item\"]')?.dataset\n .messageId;\n firstItemIdRef.current = firstItemId;\n\n const anchor = prependAnchorRef.current;\n prependAnchorRef.current = null;\n if (!anchor || !viewportElement || firstItemId === previousFirstItemId) return;\n\n reachStartFiredRef.current = false;\n const grownBy = viewportElement.scrollHeight - anchor.scrollHeight;\n if (grownBy > 0) viewportElement.scrollTop = anchor.scrollTop + grownBy;\n }, [contentElement, itemsVersion, viewportElement]);\n\n const actionsContextValue = React.useMemo<MessageScrollerActionsContextValue>(\n () => ({\n notifyContentResize,\n notifyScroll,\n registerItem,\n scrollToEnd,\n scrollToMessage,\n scrollToStart,\n setContentElement,\n setRootElement,\n setViewportElement,\n syncAfterScroll,\n }),\n [notifyContentResize, notifyScroll, registerItem, scrollToEnd, scrollToMessage, scrollToStart, syncAfterScroll],\n );\n\n const scrollableContextValue = React.useMemo<MessageScrollerScrollable>(\n () => ({\n end: scrollable.end,\n start: scrollable.start,\n }),\n [scrollable.end, scrollable.start],\n );\n\n const visibilityContextValue = React.useMemo<MessageScrollerVisibility>(\n () => ({\n currentAnchorId: visibility.currentAnchorId,\n visibleMessageIds: visibility.visibleMessageIds,\n }),\n [visibility.currentAnchorId, visibility.visibleMessageIds],\n );\n\n return (\n <MessageScrollerActionsContext.Provider value={actionsContextValue}>\n <MessageScrollerScrollableContext.Provider value={scrollableContextValue}>\n <MessageScrollerVisibilityContext.Provider value={visibilityContextValue}>\n {children}\n </MessageScrollerVisibilityContext.Provider>\n </MessageScrollerScrollableContext.Provider>\n </MessageScrollerActionsContext.Provider>\n );\n}\n\nexport type MessageScrollerProps = React.HTMLAttributes<HTMLDivElement>;\n\nexport const MessageScroller = React.forwardRef<HTMLDivElement, MessageScrollerProps>(\n ({ className, ...props }, ref) => {\n const { setRootElement } = useRequiredMessageScrollerActionsContext('MessageScroller');\n return (\n <div\n ref={mergeRefs(setRootElement, ref)}\n data-slot=\"message-scroller\"\n className={cn('group/message-scroller relative flex size-full min-h-0 flex-col', className)}\n {...props}\n />\n );\n },\n);\nMessageScroller.displayName = 'MessageScroller';\n\nexport type MessageScrollerViewportProps = React.HTMLAttributes<HTMLDivElement>;\n\nexport const MessageScrollerViewport = React.forwardRef<HTMLDivElement, MessageScrollerViewportProps>(\n ({ className, onScroll, role, tabIndex, ...props }, ref) => {\n const { setViewportElement, notifyScroll } = useRequiredMessageScrollerActionsContext('MessageScrollerViewport');\n const viewportRef = React.useMemo(() => mergeRefs(setViewportElement, ref), [ref, setViewportElement]);\n\n return (\n <div\n ref={viewportRef}\n role={role ?? 'region'}\n tabIndex={tabIndex ?? 0}\n data-slot=\"message-scroller-viewport\"\n className={cn(\n // Size container so consumers can size the room under a live turn in cqh.\n '[container-type:size] size-full min-h-0 min-w-0 overflow-y-auto overscroll-y-contain',\n 'data-autoscrolling:scrollbar-thumb-transparent data-autoscrolling:scrollbar-track-transparent',\n className,\n )}\n onScroll={event => {\n notifyScroll();\n onScroll?.(event);\n }}\n {...props}\n />\n );\n },\n);\nMessageScrollerViewport.displayName = 'MessageScrollerViewport';\n\nexport type MessageScrollerContentProps = React.HTMLAttributes<HTMLDivElement> & {\n spacerClassName?: string;\n};\n\nexport const MessageScrollerContent = React.forwardRef<HTMLDivElement, MessageScrollerContentProps>(\n ({ children, className, spacerClassName, role, 'aria-relevant': ariaRelevant = 'additions', ...props }, ref) => {\n const { setContentElement, notifyContentResize, syncAfterScroll } =\n useRequiredMessageScrollerActionsContext('MessageScrollerContent');\n const [contentElement, setLocalContentElement] = React.useState<HTMLDivElement | null>(null);\n\n const contentRef = React.useMemo(\n () => mergeRefs<HTMLDivElement>(setContentElement, setLocalContentElement, ref),\n [ref, setContentElement],\n );\n\n React.useLayoutEffect(() => {\n syncAfterScroll();\n }, [syncAfterScroll]);\n\n React.useEffect(() => {\n if (!contentElement || typeof MutationObserver === 'undefined') return undefined;\n const observer = new MutationObserver(notifyContentResize);\n observer.observe(contentElement, { childList: true, subtree: false });\n return () => observer.disconnect();\n }, [contentElement, notifyContentResize]);\n\n React.useEffect(() => {\n if (!contentElement || typeof ResizeObserver === 'undefined') return undefined;\n const observer = new ResizeObserver(notifyContentResize);\n observer.observe(contentElement);\n return () => observer.disconnect();\n }, [contentElement, notifyContentResize]);\n\n return (\n <div\n ref={contentRef}\n role={role ?? 'log'}\n aria-relevant={ariaRelevant}\n data-slot=\"message-scroller-content\"\n className={cn('flex h-max min-h-full flex-col gap-6', className)}\n {...props}\n >\n {children}\n <div aria-hidden=\"true\" data-message-scroller-spacer=\"\" hidden className={spacerClassName} />\n </div>\n );\n },\n);\nMessageScrollerContent.displayName = 'MessageScrollerContent';\n\nexport type MessageScrollerItemProps = React.HTMLAttributes<HTMLDivElement> & {\n messageId?: string;\n scrollAnchor?: boolean;\n};\n\nexport const MessageScrollerItem = React.forwardRef<HTMLDivElement, MessageScrollerItemProps>(\n ({ className, messageId, scrollAnchor = false, ...props }, ref) => {\n // Optional, unlike the other slots: the same row renderer is reused outside a\n // scroller (draft pages, previews), where there is simply nothing to register.\n const registerItem = React.useContext(MessageScrollerActionsContext)?.registerItem;\n const unregisterRef = React.useRef<(() => void) | undefined>(undefined);\n const itemRef = React.useCallback(\n (element: HTMLDivElement | null) => {\n unregisterRef.current?.();\n unregisterRef.current = undefined;\n mergeRefs(ref)(element);\n\n if (!element || !messageId || !registerItem) return;\n unregisterRef.current = registerItem(messageId, element, scrollAnchor);\n },\n [messageId, ref, registerItem, scrollAnchor],\n );\n\n return (\n <div\n ref={itemRef}\n data-slot=\"message-scroller-item\"\n data-message-id={messageId}\n data-scroll-anchor={scrollAnchor ? 'true' : 'false'}\n // content-visibility contains painting. Reserve room for a 2px outline + 2px offset,\n // and compensate with negative margins so message alignment and spacing stay unchanged.\n className={cn(\n '-m-1 min-w-0 shrink-0 p-1 [contain-intrinsic-size:auto_10rem] [content-visibility:auto]',\n className,\n )}\n {...props}\n />\n );\n },\n);\nMessageScrollerItem.displayName = 'MessageScrollerItem';\n\nexport type MessageScrollerButtonProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> & {\n behavior?: ScrollBehavior;\n children?: React.ReactNode;\n direction?: MessageScrollerButtonDirection;\n};\n\nexport const MessageScrollerButton = React.forwardRef<HTMLButtonElement, MessageScrollerButtonProps>(\n (\n { behavior = 'smooth', direction = 'end', className, children, onClick, tabIndex, type = 'button', ...props },\n ref,\n ) => {\n const { scrollToEnd, scrollToStart } = useRequiredMessageScrollerActionsContext('MessageScrollerButton');\n const { start, end } = useRequiredMessageScrollerScrollableContext('MessageScrollerButton');\n const active = direction === 'start' ? start : end;\n\n return (\n <button\n ref={ref}\n type={type}\n {...props}\n data-slot=\"message-scroller-button\"\n data-active={active ? 'true' : 'false'}\n data-direction={direction}\n tabIndex={active ? tabIndex : -1}\n className={cn(\n overlaySurfaceStyle,\n 'absolute inset-s-1/2 inline-flex min-h-5 min-w-7 -translate-x-1/2 items-center justify-center rounded-full text-foreground transition-[scale,opacity] duration-200 hover:[--surface-tint:var(--fill-subtle)] data-[active=false]:pointer-events-none data-[active=false]:scale-95 data-[active=false]:opacity-0 data-[active=false]:duration-400 data-[active=false]:ease-[cubic-bezier(0.7,0,0.84,0)] data-[active=true]:scale-100 data-[active=true]:opacity-100 data-[active=true]:ease-[cubic-bezier(0.23,1,0.32,1)] data-[direction=end]:bottom-4 data-[direction=start]:top-4 rtl:translate-x-1/2 data-[direction=start]:[&_svg]:rotate-180',\n className,\n )}\n onClick={event => {\n if (!active) return;\n onClick?.(event);\n if (event.defaultPrevented) return;\n event.currentTarget.blur();\n if (direction === 'start') {\n scrollToStart({ behavior });\n } else {\n scrollToEnd({ behavior });\n }\n }}\n >\n {children ?? (\n <>\n <ArrowDownIcon className=\"size-4\" aria-hidden />\n <span className=\"sr-only\">{direction === 'end' ? 'Scroll to end' : 'Scroll to start'}</span>\n </>\n )}\n </button>\n );\n },\n);\nMessageScrollerButton.displayName = 'MessageScrollerButton';\n","import * as React from 'react';\n\nimport {\n MessageScrollerActionsContext,\n MessageScrollerScrollableContext,\n MessageScrollerVisibilityContext,\n useRequiredMessageScrollerActionsContext,\n useRequiredMessageScrollerScrollableContext,\n useRequiredMessageScrollerVisibilityContext,\n} from './message-scroller-context';\n\nexport const useMessageScroller = () => {\n const { scrollToEnd, scrollToMessage, scrollToStart } =\n useRequiredMessageScrollerActionsContext('useMessageScroller');\n return React.useMemo(\n () => ({ scrollToEnd, scrollToMessage, scrollToStart }),\n [scrollToEnd, scrollToMessage, scrollToStart],\n );\n};\n\nexport const useOptionalMessageScroller = () => {\n const context = React.useContext(MessageScrollerActionsContext);\n return React.useMemo(() => {\n if (!context) return undefined;\n return {\n scrollToEnd: context.scrollToEnd,\n scrollToMessage: context.scrollToMessage,\n scrollToStart: context.scrollToStart,\n };\n }, [context]);\n};\n\nexport const useMessageScrollerScrollable = () => {\n const { start, end } = useRequiredMessageScrollerScrollableContext('useMessageScrollerScrollable');\n return React.useMemo(() => ({ start, end }), [end, start]);\n};\n\nexport const useOptionalMessageScrollerScrollable = () => {\n const context = React.useContext(MessageScrollerScrollableContext);\n return React.useMemo(() => (context ? { start: context.start, end: context.end } : undefined), [context]);\n};\n\nexport const useMessageScrollerVisibility = () => {\n const { currentAnchorId, visibleMessageIds } =\n useRequiredMessageScrollerVisibilityContext('useMessageScrollerVisibility');\n return React.useMemo(() => ({ currentAnchorId, visibleMessageIds }), [currentAnchorId, visibleMessageIds]);\n};\n\nexport const useOptionalMessageScrollerVisibility = () => {\n const context = React.useContext(MessageScrollerVisibilityContext);\n return React.useMemo(\n () =>\n context\n ? {\n currentAnchorId: context.currentAnchorId,\n visibleMessageIds: context.visibleMessageIds,\n }\n : undefined,\n [context],\n );\n};\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MetricsCard-BEwiS7Pe.cjs","names":["cn","cn","cn","Txt","cn","_Fragment","Skeleton","cn","Spinner","cn","Txt","Card","cn","cn","DropdownMenu","cn","ChevronDownIcon","cn","cn","cn","SkeletonText","MetricsKpiCard"],"sources":["../src/ds/components/MetricsCard/metrics-card-actions.tsx","../src/ds/components/MetricsCard/metrics-card-content.tsx","../src/ds/components/MetricsCard/metrics-card-error.tsx","../src/ds/components/MetricsCard/metrics-card-headline.tsx","../src/ds/components/MetricsCard/metrics-card-loading.tsx","../src/ds/components/MetricsCard/metrics-card-no-data.tsx","../src/ds/components/MetricsCard/metrics-card-root.tsx","../src/ds/components/MetricsCard/metrics-card-title.tsx","../src/ds/components/MetricsCard/metrics-card-title-menu.tsx","../src/ds/components/MetricsCard/metrics-card-toolbar.tsx","../src/ds/components/MetricsCard/metrics-card-top-bar.tsx","../src/ds/components/MetricsCard/metrics-card-total.tsx","../src/ds/components/MetricsCard/metrics-card.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\n/** Container for icon buttons / small actions in the top bar of a MetricsCard,\n * placed between the title and `Total` (which always renders last). Small (28px) buttons sit\n * centered on the 20px title line without making the top bar taller. */\nexport function MetricsCardActions({\n children,\n reveal = 'always',\n className,\n}: {\n children: ReactNode;\n /**\n * `hover`: the actions appear while the card is hovered or one of them has focus, so a page\n * of cards doesn't read as a page of buttons.\n */\n reveal?: 'always' | 'hover';\n className?: string;\n}) {\n return (\n <div\n className={cn(\n '-my-1 flex shrink-0 items-center gap-1 self-start',\n reveal === 'hover' &&\n 'opacity-0 transition-opacity duration-150 group-hover/metrics-card:opacity-100 focus-within:opacity-100',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\n/**\n * Scrolls sideways only (wide tables). Vertical overflow is hidden: a chart filling a card with a\n * fractional height rounds 1px past it, which otherwise turns the content into a scroll box.\n * Tables inside a card drop the last row's border: the card edge already closes them.\n */\nexport function MetricsCardContent({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <div className={cn('overflow-x-auto overflow-y-hidden [&_tbody>tr:last-child]:border-b-0', className)}>\n {children}\n </div>\n );\n}\n","import { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport function MetricsCardError({\n message = 'Failed to load data',\n className,\n}: {\n message?: string;\n className?: string;\n}) {\n return (\n <div className={cn('flex flex-col items-center justify-center gap-3', className)}>\n <Txt variant=\"caption\" className=\"text-destructive-foreground\">\n {message}\n </Txt>\n </div>\n );\n}\n","import { Skeleton } from '@/ds/components/Skeleton';\nimport { cn } from '@/lib/utils';\n\n/**\n * The header of a card with one large chart (an explorer, a detail page): the label over a large\n * value, the change against the previous period beside it. Cards in a grid use the compact title\n * and `MetricsCard.Total` instead. A skeleton while loading, at the value's own trimmed height.\n */\nexport function MetricsCardHeadline({\n label,\n value,\n change,\n isLoading = false,\n className,\n}: {\n label: string;\n value: string;\n /** E.g. \"+71.4%\"; shown as \"+71.4% vs previous\". */\n change?: string;\n isLoading?: boolean;\n className?: string;\n}) {\n return (\n <div className={cn('grid gap-1.5', className)}>\n <h3 className=\"text-body-sm text-muted-foreground\">{label}</h3>\n <span className=\"flex items-baseline gap-2\">\n <span\n className={cn(\n 'text-title text-foreground tabular-nums [text-box:trim-both_cap_alphabetic]',\n isLoading && 'relative min-w-24',\n )}\n >\n {isLoading ? (\n // Hidden text keeps the value's trimmed height, so the row (and the actions centred on\n // it) doesn't move when the value arrives; the bar covers it.\n <>\n <span className=\"invisible\">0</span>\n <Skeleton className=\"absolute inset-0\" />\n </>\n ) : (\n value\n )}\n </span>\n {!isLoading &&\n change && (\n // Trimmed like the value, so its line box doesn't make the row taller than while loading.\n <span className=\"text-body-sm text-muted-foreground tabular-nums [text-box:trim-both_cap_alphabetic]\">\n {change} vs previous\n </span>\n )}\n </span>\n </div>\n );\n}\n","import { Spinner } from '@/ds/components/Spinner/spinner';\nimport { cn } from '@/lib/utils';\n\nexport function MetricsCardLoading({ className }: { className?: string }) {\n return (\n <div className={cn('flex items-center justify-center', className)}>\n <Spinner size=\"md\" variant=\"pulse\" className=\"text-placeholder\" />\n </div>\n );\n}\n","import { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport function MetricsCardNoData({ message = 'No data yet', className }: { message?: string; className?: string }) {\n return (\n <div className={cn('flex h-full items-center justify-center', className)}>\n <Txt tone=\"faint\">{message}</Txt>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Card } from '@/ds/components/Card';\nimport { cn } from '@/lib/utils';\n\nexport function MetricsCardRoot({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <Card\n className={cn(\n 'group/metrics-card grid min-h-72 min-w-80 flex-1 grid-rows-[auto_1fr] gap-4 px-4 py-3 2xl:min-w-120 md:min-w-88 lg:min-w-sm xl:min-w-104',\n className,\n )}\n >\n {children}\n </Card>\n );\n}\n","import { cn } from '@/lib/utils';\n\nexport function MetricsCardTitle({\n children,\n className,\n as: Tag = 'h3',\n}: {\n children: string;\n className?: string;\n as?: 'h2' | 'h3' | 'h4';\n}) {\n return <Tag className={cn('text-body font-medium text-foreground', className)}>{children}</Tag>;\n}\n","import { ChevronDownIcon } from 'lucide-react';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu';\nimport type { DropdownMenuRadioOption } from '@/ds/components/DropdownMenu';\nimport { cn } from '@/lib/utils';\n\nexport type MetricsCardTitleMenuProps<V extends string> = {\n /** The card title for the picked view (e.g. \"Spend by model\"). */\n title: string;\n value: V;\n onValueChange: (value: V) => void;\n /** The views (e.g. \"By model\", \"By provider\"). */\n options: readonly DropdownMenuRadioOption<V>[];\n className?: string;\n};\n\n/**\n * A card title that switches the card's view, as on Vercel's usage cards: the title is the\n * trigger, with a chevron. The hover fill bleeds past the text so the title stays aligned.\n * Wrapped, so the top bar stretches the wrapper rather than the button, and the menu's open-state\n * nodes next to the trigger don't become the top bar's first child.\n */\nexport function MetricsCardTitleMenu<V extends string>({\n title,\n value,\n onValueChange,\n options,\n className,\n}: MetricsCardTitleMenuProps<V>) {\n return (\n <div className=\"flex min-w-0\">\n <DropdownMenu>\n <DropdownMenu.Trigger\n render={\n <button\n type=\"button\"\n className={cn(\n '-mx-1.5 -my-0.5 flex items-center gap-1 self-start rounded-md px-1.5 py-0.5 text-left text-body font-medium text-foreground hover:bg-fill-subtle',\n className,\n )}\n />\n }\n >\n {title}\n <ChevronDownIcon className=\"size-3.5 text-muted-foreground\" />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"start\">\n <DropdownMenu.RadioOptions options={options} value={value} onValueChange={onValueChange} closeOnSelect />\n </DropdownMenu.Content>\n </DropdownMenu>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\n/**\n * One row under the top bar for a card's controls: a legend, list column headers.\n * The first child sits on the left, the last on the right; either side may be omitted. When\n * both don't fit (a narrow card), the right side wraps to its own line, still on the right. At least 24px\n * tall, so toolbars line up across cards in the same row.\n */\nexport function MetricsCardToolbar({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <div\n className={cn(\n 'flex min-h-6 min-w-0 flex-wrap items-center justify-between gap-x-4 gap-y-2 [&>*:first-child]:min-w-0 [&>*:last-child:not(:first-child)]:ml-auto',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport function MetricsCardTopBar({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <div className={cn('flex items-start gap-4 [&>:first-child]:min-w-0 [&>:first-child]:flex-1', className)}>\n {children}\n </div>\n );\n}\n","import { SkeletonText } from '@/ds/components/Skeleton';\nimport { cn } from '@/lib/utils';\n\n/** One of several totals in a card that charts a few series, marked with its series' color. */\nexport type MetricsCardTotalPart = { label: string; value: string; color: string };\n\n/**\n * A card's total, right of the title in the same type (14px, medium). Always the top\n * bar's last item. A skeleton while loading, in the value's own line box. A card charting a\n * few series of different things (resources, threads) can give one total each, each after a\n * marker in its series' color, like the legend.\n */\nexport function MetricsCardTotal({\n value,\n isLoading = false,\n className,\n}: {\n value: string | readonly MetricsCardTotalPart[];\n isLoading?: boolean;\n className?: string;\n}) {\n return (\n <span className={cn('order-last shrink-0 text-body font-medium text-foreground tabular-nums', className)}>\n <TotalValue value={value} isLoading={isLoading} />\n </span>\n );\n}\n\nfunction TotalValue({ value, isLoading }: { value: string | readonly MetricsCardTotalPart[]; isLoading: boolean }) {\n if (isLoading) return <SkeletonText line=\"text-body\" className=\"h-4 w-14\" />;\n if (typeof value === 'string') return value;\n return (\n <span className=\"inline-flex items-center gap-3\">\n {value.map(part => (\n <span key={part.label} className=\"inline-flex items-center gap-1.5\">\n <span aria-hidden className=\"size-2 shrink-0 rounded-[2px]\" style={{ backgroundColor: part.color }} />\n {/* The marker is decorative; screen readers hear which total this is. */}\n <span className=\"sr-only\">{part.label} </span>\n {part.value}\n </span>\n ))}\n </span>\n );\n}\n","import { MetricsCardActions } from './metrics-card-actions';\nimport { MetricsCardContent } from './metrics-card-content';\nimport { MetricsCardError } from './metrics-card-error';\nimport { MetricsCardHeadline } from './metrics-card-headline';\nimport { MetricsCardLoading } from './metrics-card-loading';\nimport { MetricsCardNoData } from './metrics-card-no-data';\nimport { MetricsCardRoot } from './metrics-card-root';\nimport { MetricsCardTitle } from './metrics-card-title';\nimport { MetricsCardTitleMenu } from './metrics-card-title-menu';\nimport { MetricsCardToolbar } from './metrics-card-toolbar';\nimport { MetricsCardTopBar } from './metrics-card-top-bar';\nimport { MetricsCardTotal } from './metrics-card-total';\nimport { MetricsKpiCard } from '@/ds/components/MetricsKpiCard';\n\nexport const MetricsCard = Object.assign(MetricsCardRoot, {\n Root: MetricsCardRoot,\n Kpi: MetricsKpiCard,\n TopBar: MetricsCardTopBar,\n Toolbar: MetricsCardToolbar,\n Actions: MetricsCardActions,\n Title: MetricsCardTitle,\n TitleMenu: MetricsCardTitleMenu,\n Total: MetricsCardTotal,\n Headline: MetricsCardHeadline,\n Loading: MetricsCardLoading,\n Error: MetricsCardError,\n Content: MetricsCardContent,\n NoData: MetricsCardNoData,\n});\n"],"mappings":"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"}
|