@mastra/playground-ui 66.1.0-alpha.2 → 67.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AgentIndicator-Bs2S8AWJ.js +847 -0
- package/dist/AgentIndicator-Bs2S8AWJ.js.map +1 -0
- package/dist/AgentIndicator-to30W73z.cjs +864 -0
- package/dist/AgentIndicator-to30W73z.cjs.map +1 -0
- package/dist/AgentIndicator.css +28 -0
- package/dist/{Arrival-NpBOyV52.js → Arrival-CJFEOXr5.js} +33 -3
- package/dist/Arrival-CJFEOXr5.js.map +1 -0
- package/dist/{Arrival-Dm6Vgn78.cjs → Arrival-Cs1oWjo4.cjs} +43 -1
- package/dist/Arrival-Cs1oWjo4.cjs.map +1 -0
- package/dist/{Comment-CUQvfikb.cjs → Comment-KYUQzeSu.cjs} +2 -2
- package/dist/{Comment-CUQvfikb.cjs.map → Comment-KYUQzeSu.cjs.map} +1 -1
- package/dist/{Comment-CPA3IyPS.js → Comment-VFJq2wRp.js} +2 -2
- package/dist/{Comment-CPA3IyPS.js.map → Comment-VFJq2wRp.js.map} +1 -1
- package/dist/{DataList-Ve3omCXT.js → DataList-2tIlQsLc.js} +95 -3
- package/dist/DataList-2tIlQsLc.js.map +1 -0
- package/dist/{DataList-Cmk08jUV.cjs → DataList-Czwmwyvp.cjs} +93 -1
- package/dist/DataList-Czwmwyvp.cjs.map +1 -0
- package/dist/{DateTimeRangePicker-ByMbLdom.js → DateTimeRangePicker-C_Lie_2P.js} +23 -2
- package/dist/DateTimeRangePicker-C_Lie_2P.js.map +1 -0
- package/dist/{DateTimeRangePicker-DGbH5WOn.cjs → DateTimeRangePicker-HmPOHwAQ.cjs} +23 -2
- package/dist/DateTimeRangePicker-HmPOHwAQ.cjs.map +1 -0
- package/dist/{FilterBar-Dk3QEuT6.js → FilterBar--4oguuVe.js} +4 -4
- package/dist/FilterBar--4oguuVe.js.map +1 -0
- package/dist/{FilterBar-gEvoWDXA.cjs → FilterBar-BUd4f7oi.cjs} +7 -7
- package/dist/FilterBar-BUd4f7oi.cjs.map +1 -0
- package/dist/GrainFill.css +2 -0
- package/dist/{MarkdownRenderer-BgqKfmRm.cjs → MarkdownRenderer-CS6u5drO.cjs} +2 -2
- package/dist/{MarkdownRenderer-BgqKfmRm.cjs.map → MarkdownRenderer-CS6u5drO.cjs.map} +1 -1
- package/dist/{MarkdownRenderer-DKCDXaLy.js → MarkdownRenderer-DME2xKTk.js} +2 -2
- package/dist/{MarkdownRenderer-DKCDXaLy.js.map → MarkdownRenderer-DME2xKTk.js.map} +1 -1
- package/dist/{Message-BF9cpYaw.cjs → Message-DsCNQpou.cjs} +2 -2
- package/dist/{Message-BF9cpYaw.cjs.map → Message-DsCNQpou.cjs.map} +1 -1
- package/dist/{Message-Bkf6Ro9H.js → Message-nVI6tMS3.js} +2 -2
- package/dist/{Message-Bkf6Ro9H.js.map → Message-nVI6tMS3.js.map} +1 -1
- package/dist/{MetricsCard-Dly_H3oX.cjs → MetricsCard-CEB-f2sv.cjs} +91 -109
- package/dist/MetricsCard-CEB-f2sv.cjs.map +1 -0
- package/dist/{MetricsCard-C9GWgT58.js → MetricsCard-M8awJ2B_.js} +91 -109
- package/dist/MetricsCard-M8awJ2B_.js.map +1 -0
- package/dist/{MetricsKpiCard-Uw0nyMgW.cjs → MetricsKpiCard-By_-sagx.cjs} +3 -2
- package/dist/{MetricsKpiCard-Uw0nyMgW.cjs.map → MetricsKpiCard-By_-sagx.cjs.map} +1 -1
- package/dist/{MetricsKpiCard-Idxjl-dn.js → MetricsKpiCard-OHbAElTl.js} +3 -2
- package/dist/{MetricsKpiCard-Idxjl-dn.js.map → MetricsKpiCard-OHbAElTl.js.map} +1 -1
- package/dist/{MetricsLineChart-DKzuRU2q.js → MetricsLineChart-BhHoduO0.js} +21 -39
- package/dist/MetricsLineChart-BhHoduO0.js.map +1 -0
- package/dist/{MetricsLineChart-2m4LVL1N.cjs → MetricsLineChart-CjBm4IXu.cjs} +21 -39
- package/dist/MetricsLineChart-CjBm4IXu.cjs.map +1 -0
- package/dist/{MetricsStackedBarChart-DJB4aByt.js → MetricsStackedBarChart-BRuA6MTE.js} +2 -3
- package/dist/MetricsStackedBarChart-BRuA6MTE.js.map +1 -0
- package/dist/{MetricsStackedBarChart-NATtwA_W.cjs → MetricsStackedBarChart-BdMlKv6G.cjs} +2 -3
- package/dist/MetricsStackedBarChart-BdMlKv6G.cjs.map +1 -0
- package/dist/Notice.css +2 -0
- package/dist/Shimmer.css +7 -0
- package/dist/{activity-ihrl0JtH.js → activity-CM34JyW-.js} +98 -33
- package/dist/activity-CM34JyW-.js.map +1 -0
- package/dist/{activity-QyLJcBKc.cjs → activity-DAK8tj7r.cjs} +108 -31
- package/dist/activity-DAK8tj7r.cjs.map +1 -0
- package/dist/chart-plot.css +15 -0
- package/dist/combobox-8kNAJFlj.cjs +309 -0
- package/dist/combobox-8kNAJFlj.cjs.map +1 -0
- package/dist/{combobox-C-E7_q4j.cjs → combobox-parts-BZVXwbG7.cjs} +7 -300
- package/dist/combobox-parts-BZVXwbG7.cjs.map +1 -0
- package/dist/{combobox-CDS2pBqz.js → combobox-parts-W7KRQUsV.js} +10 -297
- package/dist/combobox-parts-W7KRQUsV.js.map +1 -0
- package/dist/combobox-wFudhN8F.js +302 -0
- package/dist/combobox-wFudhN8F.js.map +1 -0
- package/dist/components/AgentIndicator.cjs.js +5 -0
- package/dist/components/AgentIndicator.d.ts +1 -0
- package/dist/components/AgentIndicator.es.js +1 -0
- package/dist/components/Arrival.cjs.js +3 -1
- package/dist/components/Arrival.es.js +1 -1
- package/dist/components/Combobox.cjs.js +24 -23
- package/dist/components/Combobox.es.js +2 -1
- package/dist/components/Comment.cjs.js +1 -1
- package/dist/components/Comment.es.js +1 -1
- package/dist/components/DataList.cjs.js +2 -2
- package/dist/components/DataList.es.js +2 -2
- package/dist/components/DateTimeRangePicker.cjs.js +1 -1
- package/dist/components/DateTimeRangePicker.es.js +1 -1
- package/dist/components/DiffStat.cjs.js +1 -1
- package/dist/components/DiffStat.es.js +1 -1
- package/dist/components/FilterBar.cjs.js +2 -2
- package/dist/components/FilterBar.es.js +2 -2
- package/dist/components/LogsDataList.cjs.js +1 -1
- package/dist/components/LogsDataList.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/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/PropertyFilter.cjs.js +1 -1
- package/dist/components/PropertyFilter.es.js +1 -1
- package/dist/components/SavedViews.cjs.js +27 -69
- package/dist/components/SavedViews.cjs.js.map +1 -1
- package/dist/components/SavedViews.es.js +26 -68
- package/dist/components/SavedViews.es.js.map +1 -1
- package/dist/components/ai/activity.cjs.js +3 -1
- package/dist/components/ai/activity.es.js +1 -1
- package/dist/components/ai/message-reveal.cjs.js +2 -1
- package/dist/components/ai/message-reveal.cjs.js.map +1 -1
- package/dist/components/ai/message-reveal.es.js +2 -1
- package/dist/components/ai/message-reveal.es.js.map +1 -1
- package/dist/components/ai/plan.cjs.js +1 -1
- package/dist/components/ai/plan.es.js +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 +2 -2
- package/dist/components/ai/tool-call.es.js +2 -2
- package/dist/domains/chat/activity/activity-stretch-line.cjs.js +6 -4
- package/dist/domains/chat/activity/activity-stretch-line.cjs.js.map +1 -1
- package/dist/domains/chat/activity/activity-stretch-line.es.js +6 -4
- package/dist/domains/chat/activity/activity-stretch-line.es.js.map +1 -1
- package/dist/domains/chat/activity/components/activity-fold.cjs.js +81 -28
- package/dist/domains/chat/activity/components/activity-fold.cjs.js.map +1 -1
- package/dist/domains/chat/activity/components/activity-fold.es.js +82 -29
- package/dist/domains/chat/activity/components/activity-fold.es.js.map +1 -1
- package/dist/domains/chat/activity/components/activity-timed-trigger.cjs.js +1 -1
- package/dist/domains/chat/activity/components/activity-timed-trigger.es.js +1 -1
- package/dist/domains/chat/activity/components/calls-panel.cjs.js +1 -1
- package/dist/domains/chat/activity/components/calls-panel.es.js +1 -1
- package/dist/domains/chat/activity/components/stretch-content.cjs.js +1 -1
- package/dist/domains/chat/activity/components/stretch-content.es.js +1 -1
- 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/components/use-fading-edge.cjs.js +26 -0
- package/dist/domains/chat/activity/components/use-fading-edge.cjs.js.map +1 -0
- package/dist/domains/chat/activity/components/use-fading-edge.d.ts +1 -0
- package/dist/domains/chat/activity/components/use-fading-edge.es.js +25 -0
- package/dist/domains/chat/activity/components/use-fading-edge.es.js.map +1 -0
- package/dist/domains/chat/activity/components/use-rolling-words.cjs.js +123 -0
- package/dist/domains/chat/activity/components/use-rolling-words.cjs.js.map +1 -0
- package/dist/domains/chat/activity/components/use-rolling-words.d.ts +1 -0
- package/dist/domains/chat/activity/components/use-rolling-words.es.js +122 -0
- package/dist/domains/chat/activity/components/use-rolling-words.es.js.map +1 -0
- 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 +16 -6
- package/dist/domains/chat/activity/model/activity-words.cjs.js.map +1 -1
- package/dist/domains/chat/activity/model/activity-words.es.js +15 -7
- package/dist/domains/chat/activity/model/activity-words.es.js.map +1 -1
- package/dist/domains/chat/activity.cjs.js +3 -0
- package/dist/domains/chat/activity.es.js +2 -1
- package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
- package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
- package/dist/domains/chat/messages/assistant-message-actions.cjs.js +1 -1
- package/dist/domains/chat/messages/assistant-message-actions.es.js +1 -1
- package/dist/domains/chat/messages/message-row.cjs.js +4 -4
- package/dist/domains/chat/messages/message-row.es.js +4 -4
- package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
- package/dist/domains/chat/messages/notification-signal-notice.es.js +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/message-text.cjs.js +1 -1
- package/dist/domains/chat/messages/renderers/message-text.es.js +1 -1
- 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/tool-part.cjs.js +18 -0
- package/dist/domains/chat/messages/renderers/tool-part.cjs.js.map +1 -1
- package/dist/domains/chat/messages/renderers/tool-part.es.js +18 -0
- package/dist/domains/chat/messages/renderers/tool-part.es.js.map +1 -1
- package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
- package/dist/domains/chat/messages/signal-badge.es.js +1 -1
- package/dist/domains/chat/messages/skill-message.cjs.js +10 -7
- package/dist/domains/chat/messages/skill-message.cjs.js.map +1 -1
- package/dist/domains/chat/messages/skill-message.es.js +10 -7
- package/dist/domains/chat/messages/skill-message.es.js.map +1 -1
- 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/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/file-tree-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/file-tree-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js +111 -0
- package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js.map +1 -0
- package/dist/domains/chat/tools/badges/mcp-task-chip.d.ts +1 -0
- package/dist/domains/chat/tools/badges/mcp-task-chip.es.js +109 -0
- package/dist/domains/chat/tools/badges/mcp-task-chip.es.js.map +1 -0
- package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +8 -6
- package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +9 -7
- package/dist/domains/chat/tools/badges/observation-marker-badge.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js +2 -3
- 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 +2 -3
- package/dist/domains/chat/tools/badges/observation-marker-details.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
- package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +2 -2
- 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 +10 -4
- package/dist/domains/chat/tools/badges/tool-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/tool-badge.es.js +10 -4
- package/dist/domains/chat/tools/badges/tool-badge.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/use-mcp-task-progress.cjs.js +51 -0
- package/dist/domains/chat/tools/badges/use-mcp-task-progress.cjs.js.map +1 -0
- package/dist/domains/chat/tools/badges/use-mcp-task-progress.d.ts +1 -0
- package/dist/domains/chat/tools/badges/use-mcp-task-progress.es.js +49 -0
- package/dist/domains/chat/tools/badges/use-mcp-task-progress.es.js.map +1 -0
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.es.js +1 -1
- package/dist/domains/chat/tools/tool-card-kind.cjs.js +1 -1
- package/dist/domains/chat/tools/tool-card-kind.es.js +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 +1 -1
- package/dist/domains/chat/tools/tool-groups.es.js +1 -1
- package/dist/domains/dashboards/components/dashboard-grid.cjs.js +44 -0
- package/dist/domains/dashboards/components/dashboard-grid.cjs.js.map +1 -0
- package/dist/domains/dashboards/components/dashboard-grid.d.ts +1 -0
- package/dist/domains/dashboards/components/dashboard-grid.es.js +41 -0
- package/dist/domains/dashboards/components/dashboard-grid.es.js.map +1 -0
- package/dist/domains/dashboards/components/dashboard-renderer.cjs.js +72 -0
- package/dist/domains/dashboards/components/dashboard-renderer.cjs.js.map +1 -0
- package/dist/domains/dashboards/components/dashboard-renderer.d.ts +1 -0
- package/dist/domains/dashboards/components/dashboard-renderer.es.js +71 -0
- package/dist/domains/dashboards/components/dashboard-renderer.es.js.map +1 -0
- package/dist/domains/dashboards/components/view-gate.cjs.js +55 -0
- package/dist/domains/dashboards/components/view-gate.cjs.js.map +1 -0
- package/dist/domains/dashboards/components/view-gate.d.ts +1 -0
- package/dist/domains/dashboards/components/view-gate.es.js +54 -0
- package/dist/domains/dashboards/components/view-gate.es.js.map +1 -0
- package/dist/domains/dashboards/components/widget-chrome.cjs.js +16 -0
- package/dist/domains/dashboards/components/widget-chrome.cjs.js.map +1 -0
- package/dist/domains/dashboards/components/widget-chrome.d.ts +1 -0
- package/dist/domains/dashboards/components/widget-chrome.es.js +15 -0
- package/dist/domains/dashboards/components/widget-chrome.es.js.map +1 -0
- package/dist/domains/dashboards/components/widget-controls.cjs.js +21 -0
- package/dist/domains/dashboards/components/widget-controls.cjs.js.map +1 -0
- package/dist/domains/dashboards/components/widget-controls.d.ts +1 -0
- package/dist/domains/dashboards/components/widget-controls.es.js +20 -0
- package/dist/domains/dashboards/components/widget-controls.es.js.map +1 -0
- package/dist/domains/dashboards/components/widget-error.cjs.js +18 -0
- package/dist/domains/dashboards/components/widget-error.cjs.js.map +1 -0
- package/dist/domains/dashboards/components/widget-error.d.ts +1 -0
- package/dist/domains/dashboards/components/widget-error.es.js +17 -0
- package/dist/domains/dashboards/components/widget-error.es.js.map +1 -0
- package/dist/domains/dashboards/hooks/use-dashboard-requests.cjs.js +47 -0
- package/dist/domains/dashboards/hooks/use-dashboard-requests.cjs.js.map +1 -0
- package/dist/domains/dashboards/hooks/use-dashboard-requests.d.ts +1 -0
- package/dist/domains/dashboards/hooks/use-dashboard-requests.es.js +46 -0
- package/dist/domains/dashboards/hooks/use-dashboard-requests.es.js.map +1 -0
- package/dist/domains/dashboards/hooks/use-scorers.cjs.js +41 -0
- package/dist/domains/dashboards/hooks/use-scorers.cjs.js.map +1 -0
- package/dist/domains/dashboards/hooks/use-scorers.d.ts +1 -0
- package/dist/domains/dashboards/hooks/use-scorers.es.js +40 -0
- package/dist/domains/dashboards/hooks/use-scorers.es.js.map +1 -0
- package/dist/domains/dashboards/hooks/use-widget-views.cjs.js +35 -0
- package/dist/domains/dashboards/hooks/use-widget-views.cjs.js.map +1 -0
- package/dist/domains/dashboards/hooks/use-widget-views.d.ts +1 -0
- package/dist/domains/dashboards/hooks/use-widget-views.es.js +32 -0
- package/dist/domains/dashboards/hooks/use-widget-views.es.js.map +1 -0
- package/dist/domains/dashboards/kinds/kpis/kpis-widget.cjs.js +63 -0
- package/dist/domains/dashboards/kinds/kpis/kpis-widget.cjs.js.map +1 -0
- package/dist/domains/dashboards/kinds/kpis/kpis-widget.d.ts +1 -0
- package/dist/domains/dashboards/kinds/kpis/kpis-widget.es.js +62 -0
- package/dist/domains/dashboards/kinds/kpis/kpis-widget.es.js.map +1 -0
- package/dist/domains/dashboards/kinds/kpis/options.cjs.js +72 -0
- package/dist/domains/dashboards/kinds/kpis/options.cjs.js.map +1 -0
- package/dist/domains/dashboards/kinds/kpis/options.d.ts +1 -0
- package/dist/domains/dashboards/kinds/kpis/options.es.js +69 -0
- package/dist/domains/dashboards/kinds/kpis/options.es.js.map +1 -0
- package/dist/domains/dashboards/kinds/kpis.cjs.js +17 -0
- package/dist/domains/dashboards/kinds/kpis.cjs.js.map +1 -0
- package/dist/domains/dashboards/kinds/kpis.d.ts +1 -0
- package/dist/domains/dashboards/kinds/kpis.es.js +14 -0
- package/dist/domains/dashboards/kinds/kpis.es.js.map +1 -0
- package/dist/domains/dashboards/kinds/scores/options.cjs.js +30 -0
- package/dist/domains/dashboards/kinds/scores/options.cjs.js.map +1 -0
- package/dist/domains/dashboards/kinds/scores/options.d.ts +1 -0
- package/dist/domains/dashboards/kinds/scores/options.es.js +28 -0
- package/dist/domains/dashboards/kinds/scores/options.es.js.map +1 -0
- package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js +91 -0
- package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js.map +1 -0
- package/dist/domains/dashboards/kinds/scores/scores-widget.d.ts +1 -0
- package/dist/domains/dashboards/kinds/scores/scores-widget.es.js +90 -0
- package/dist/domains/dashboards/kinds/scores/scores-widget.es.js.map +1 -0
- package/dist/domains/dashboards/kinds/scores.cjs.js +16 -0
- package/dist/domains/dashboards/kinds/scores.cjs.js.map +1 -0
- package/dist/domains/dashboards/kinds/scores.d.ts +1 -0
- package/dist/domains/dashboards/kinds/scores.es.js +14 -0
- package/dist/domains/dashboards/kinds/scores.es.js.map +1 -0
- package/dist/domains/dashboards/kinds/table/table-cells.cjs.js +67 -0
- package/dist/domains/dashboards/kinds/table/table-cells.cjs.js.map +1 -0
- package/dist/domains/dashboards/kinds/table/table-cells.d.ts +1 -0
- package/dist/domains/dashboards/kinds/table/table-cells.es.js +63 -0
- package/dist/domains/dashboards/kinds/table/table-cells.es.js.map +1 -0
- package/dist/domains/dashboards/kinds/table/table-columns.cjs.js +72 -0
- package/dist/domains/dashboards/kinds/table/table-columns.cjs.js.map +1 -0
- package/dist/domains/dashboards/kinds/table/table-columns.d.ts +1 -0
- package/dist/domains/dashboards/kinds/table/table-columns.es.js +71 -0
- package/dist/domains/dashboards/kinds/table/table-columns.es.js.map +1 -0
- package/dist/domains/dashboards/kinds/table/table-frame.cjs.js +16 -0
- package/dist/domains/dashboards/kinds/table/table-frame.cjs.js.map +1 -0
- package/dist/domains/dashboards/kinds/table/table-frame.d.ts +1 -0
- package/dist/domains/dashboards/kinds/table/table-frame.es.js +15 -0
- package/dist/domains/dashboards/kinds/table/table-frame.es.js.map +1 -0
- package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js +55 -0
- package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js.map +1 -0
- package/dist/domains/dashboards/kinds/table/table-tabs.d.ts +1 -0
- package/dist/domains/dashboards/kinds/table/table-tabs.es.js +54 -0
- package/dist/domains/dashboards/kinds/table/table-tabs.es.js.map +1 -0
- package/dist/domains/dashboards/kinds/table/table-view.cjs.js +80 -0
- package/dist/domains/dashboards/kinds/table/table-view.cjs.js.map +1 -0
- package/dist/domains/dashboards/kinds/table/table-view.d.ts +1 -0
- package/dist/domains/dashboards/kinds/table/table-view.es.js +79 -0
- package/dist/domains/dashboards/kinds/table/table-view.es.js.map +1 -0
- package/dist/domains/dashboards/kinds/table/table-widget.cjs.js +30 -0
- package/dist/domains/dashboards/kinds/table/table-widget.cjs.js.map +1 -0
- package/dist/domains/dashboards/kinds/table/table-widget.d.ts +1 -0
- package/dist/domains/dashboards/kinds/table/table-widget.es.js +29 -0
- package/dist/domains/dashboards/kinds/table/table-widget.es.js.map +1 -0
- package/dist/domains/dashboards/kinds/table.cjs.js +17 -0
- package/dist/domains/dashboards/kinds/table.cjs.js.map +1 -0
- package/dist/domains/dashboards/kinds/table.d.ts +1 -0
- package/dist/domains/dashboards/kinds/table.es.js +14 -0
- package/dist/domains/dashboards/kinds/table.es.js.map +1 -0
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js +115 -0
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js.map +1 -0
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.d.ts +1 -0
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js +114 -0
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js.map +1 -0
- package/dist/domains/dashboards/kinds/timeseries.cjs.js +15 -0
- package/dist/domains/dashboards/kinds/timeseries.cjs.js.map +1 -0
- package/dist/domains/dashboards/kinds/timeseries.d.ts +1 -0
- package/dist/domains/dashboards/kinds/timeseries.es.js +14 -0
- package/dist/domains/dashboards/kinds/timeseries.es.js.map +1 -0
- package/dist/domains/dashboards/kinds.cjs.js +20 -0
- package/dist/domains/dashboards/kinds.cjs.js.map +1 -0
- package/dist/domains/dashboards/kinds.d.ts +1 -0
- package/dist/domains/dashboards/kinds.es.js +15 -0
- package/dist/domains/dashboards/kinds.es.js.map +1 -0
- package/dist/domains/dashboards/lib/answers.cjs.js +42 -0
- package/dist/domains/dashboards/lib/answers.cjs.js.map +1 -0
- package/dist/domains/dashboards/lib/answers.d.ts +1 -0
- package/dist/domains/dashboards/lib/answers.es.js +37 -0
- package/dist/domains/dashboards/lib/answers.es.js.map +1 -0
- package/dist/domains/dashboards/lib/chrome.cjs.js +41 -0
- package/dist/domains/dashboards/lib/chrome.cjs.js.map +1 -0
- package/dist/domains/dashboards/lib/chrome.d.ts +1 -0
- package/dist/domains/dashboards/lib/chrome.es.js +37 -0
- package/dist/domains/dashboards/lib/chrome.es.js.map +1 -0
- package/dist/domains/dashboards/lib/definition.cjs.js +59 -0
- package/dist/domains/dashboards/lib/definition.cjs.js.map +1 -0
- package/dist/domains/dashboards/lib/definition.d.ts +1 -0
- package/dist/domains/dashboards/lib/definition.es.js +55 -0
- package/dist/domains/dashboards/lib/definition.es.js.map +1 -0
- package/dist/domains/dashboards/lib/filters.cjs.js +44 -0
- package/dist/domains/dashboards/lib/filters.cjs.js.map +1 -0
- package/dist/domains/dashboards/lib/filters.d.ts +1 -0
- package/dist/domains/dashboards/lib/filters.es.js +43 -0
- package/dist/domains/dashboards/lib/filters.es.js.map +1 -0
- package/dist/domains/dashboards/lib/format.cjs.js +32 -0
- package/dist/domains/dashboards/lib/format.cjs.js.map +1 -0
- package/dist/domains/dashboards/lib/format.d.ts +1 -0
- package/dist/domains/dashboards/lib/format.es.js +30 -0
- package/dist/domains/dashboards/lib/format.es.js.map +1 -0
- package/dist/domains/dashboards/lib/prepare-widget.cjs.js +77 -0
- package/dist/domains/dashboards/lib/prepare-widget.cjs.js.map +1 -0
- package/dist/domains/dashboards/lib/prepare-widget.d.ts +1 -0
- package/dist/domains/dashboards/lib/prepare-widget.es.js +75 -0
- package/dist/domains/dashboards/lib/prepare-widget.es.js.map +1 -0
- package/dist/domains/dashboards/lib/requests.cjs.js +279 -0
- package/dist/domains/dashboards/lib/requests.cjs.js.map +1 -0
- package/dist/domains/dashboards/lib/requests.d.ts +1 -0
- package/dist/domains/dashboards/lib/requests.es.js +273 -0
- package/dist/domains/dashboards/lib/requests.es.js.map +1 -0
- package/dist/domains/dashboards/lib/scores.cjs.js +58 -0
- package/dist/domains/dashboards/lib/scores.cjs.js.map +1 -0
- package/dist/domains/dashboards/lib/scores.d.ts +1 -0
- package/dist/domains/dashboards/lib/scores.es.js +53 -0
- package/dist/domains/dashboards/lib/scores.es.js.map +1 -0
- package/dist/domains/dashboards/lib/table.cjs.js +408 -0
- package/dist/domains/dashboards/lib/table.cjs.js.map +1 -0
- package/dist/domains/dashboards/lib/table.d.ts +1 -0
- package/dist/domains/dashboards/lib/table.es.js +388 -0
- package/dist/domains/dashboards/lib/table.es.js.map +1 -0
- package/dist/domains/dashboards/lib/timeseries.cjs.js +192 -0
- package/dist/domains/dashboards/lib/timeseries.cjs.js.map +1 -0
- package/dist/domains/dashboards/lib/timeseries.d.ts +1 -0
- package/dist/domains/dashboards/lib/timeseries.es.js +188 -0
- package/dist/domains/dashboards/lib/timeseries.es.js.map +1 -0
- package/dist/domains/dashboards/lib/values.cjs.js +155 -0
- package/dist/domains/dashboards/lib/values.cjs.js.map +1 -0
- package/dist/domains/dashboards/lib/values.d.ts +1 -0
- package/dist/domains/dashboards/lib/values.es.js +142 -0
- package/dist/domains/dashboards/lib/values.es.js.map +1 -0
- package/dist/domains/dashboards/metrics-dashboard.cjs.js +737 -0
- package/dist/domains/dashboards/metrics-dashboard.cjs.js.map +1 -0
- package/dist/domains/dashboards/metrics-dashboard.d.ts +1 -0
- package/dist/domains/dashboards/metrics-dashboard.es.js +736 -0
- package/dist/domains/dashboards/metrics-dashboard.es.js.map +1 -0
- package/dist/domains/dashboards/widget-kind.cjs.js +7 -0
- package/dist/domains/dashboards/widget-kind.cjs.js.map +1 -0
- package/dist/domains/dashboards/widget-kind.d.ts +1 -0
- package/dist/domains/dashboards/widget-kind.es.js +6 -0
- package/dist/domains/dashboards/widget-kind.es.js.map +1 -0
- package/dist/domains/dashboards.cjs.js +39 -0
- package/dist/domains/dashboards.d.ts +1 -0
- package/dist/domains/dashboards.es.js +18 -0
- package/dist/domains/logs/components/logs-list-view.cjs.js +1 -1
- package/dist/domains/logs/components/logs-list-view.es.js +1 -1
- package/dist/domains/logs/components/logs-saved-views.cjs.js +14 -0
- package/dist/domains/logs/components/logs-saved-views.cjs.js.map +1 -0
- package/dist/domains/logs/components/logs-saved-views.d.ts +1 -0
- package/dist/domains/logs/components/logs-saved-views.es.js +13 -0
- package/dist/domains/logs/components/logs-saved-views.es.js.map +1 -0
- package/dist/domains/logs/components.cjs.js +2 -0
- package/dist/domains/logs/components.es.js +2 -1
- package/dist/domains/logs/hooks/use-logs-url-state.cjs.js +1 -1
- package/dist/domains/logs/hooks/use-logs-url-state.cjs.js.map +1 -1
- package/dist/domains/logs/hooks/use-logs-url-state.es.js +2 -2
- package/dist/domains/logs/hooks/use-logs-url-state.es.js.map +1 -1
- package/dist/domains/logs/log-filters.cjs.js +11 -0
- package/dist/domains/logs/log-filters.cjs.js.map +1 -1
- package/dist/domains/logs/log-filters.es.js +9 -1
- package/dist/domains/logs/log-filters.es.js.map +1 -1
- package/dist/domains/logs.cjs.js +6 -1
- package/dist/domains/logs.es.js +3 -2
- package/dist/domains/metrics/components/agent-runs-card.cjs.js +38 -15
- package/dist/domains/metrics/components/agent-runs-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/agent-runs-card.es.js +38 -15
- package/dist/domains/metrics/components/agent-runs-card.es.js.map +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-change-cell.cjs.js +4 -11
- package/dist/domains/metrics/components/breakdown/breakdown-change-cell.cjs.js.map +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-change-cell.es.js +4 -11
- package/dist/domains/metrics/components/breakdown/breakdown-change-cell.es.js.map +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-cost-cell.cjs.js +2 -4
- package/dist/domains/metrics/components/breakdown/breakdown-cost-cell.cjs.js.map +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-cost-cell.es.js +2 -4
- package/dist/domains/metrics/components/breakdown/breakdown-cost-cell.es.js.map +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-entity-tab.cjs.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-entity-tab.es.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-frame.cjs.js +16 -27
- package/dist/domains/metrics/components/breakdown/breakdown-frame.cjs.js.map +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-frame.es.js +16 -27
- package/dist/domains/metrics/components/breakdown/breakdown-frame.es.js.map +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-models-tab.cjs.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-models-tab.es.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-name.cjs.js +22 -0
- package/dist/domains/metrics/components/breakdown/breakdown-name.cjs.js.map +1 -0
- package/dist/domains/metrics/components/breakdown/breakdown-name.d.ts +1 -0
- package/dist/domains/metrics/components/breakdown/breakdown-name.es.js +21 -0
- package/dist/domains/metrics/components/breakdown/breakdown-name.es.js.map +1 -0
- package/dist/domains/metrics/components/breakdown/breakdown-not-priced.cjs.js +13 -0
- package/dist/domains/metrics/components/breakdown/breakdown-not-priced.cjs.js.map +1 -0
- package/dist/domains/metrics/components/breakdown/breakdown-not-priced.d.ts +1 -0
- package/dist/domains/metrics/components/breakdown/breakdown-not-priced.es.js +12 -0
- package/dist/domains/metrics/components/breakdown/breakdown-not-priced.es.js.map +1 -0
- package/dist/domains/metrics/components/breakdown/breakdown-projects-first.cjs.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-projects-first.es.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-row-mark.cjs.js +26 -13
- package/dist/domains/metrics/components/breakdown/breakdown-row-mark.cjs.js.map +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-row-mark.es.js +25 -14
- package/dist/domains/metrics/components/breakdown/breakdown-row-mark.es.js.map +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-row-name.cjs.js +10 -13
- package/dist/domains/metrics/components/breakdown/breakdown-row-name.cjs.js.map +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-row-name.es.js +11 -14
- package/dist/domains/metrics/components/breakdown/breakdown-row-name.es.js.map +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-tab-body.cjs.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-tab-body.es.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-table.cjs.js +5 -5
- package/dist/domains/metrics/components/breakdown/breakdown-table.es.js +5 -5
- package/dist/domains/metrics/components/breakdown/breakdown-trace-tab.cjs.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-trace-tab.es.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-trend-text.cjs.js +25 -0
- package/dist/domains/metrics/components/breakdown/breakdown-trend-text.cjs.js.map +1 -0
- package/dist/domains/metrics/components/breakdown/breakdown-trend-text.d.ts +1 -0
- package/dist/domains/metrics/components/breakdown/breakdown-trend-text.es.js +24 -0
- package/dist/domains/metrics/components/breakdown/breakdown-trend-text.es.js.map +1 -0
- package/dist/domains/metrics/components/breakdown-card.cjs.js +3 -3
- package/dist/domains/metrics/components/breakdown-card.es.js +3 -3
- package/dist/domains/metrics/components/card-action-buttons.cjs.js +43 -3
- package/dist/domains/metrics/components/card-action-buttons.cjs.js.map +1 -1
- package/dist/domains/metrics/components/card-action-buttons.es.js +42 -5
- package/dist/domains/metrics/components/card-action-buttons.es.js.map +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 +1 -1
- package/dist/domains/metrics/components/chart-card-error.es.js +1 -1
- package/dist/domains/metrics/components/chart-card.cjs.js +39 -38
- package/dist/domains/metrics/components/chart-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/chart-card.es.js +39 -38
- 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 +15 -16
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js.map +1 -1
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js +16 -16
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js.map +1 -1
- package/dist/domains/metrics/components/distinct-ids-card.cjs.js +0 -1
- package/dist/domains/metrics/components/distinct-ids-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/distinct-ids-card.es.js +1 -2
- package/dist/domains/metrics/components/distinct-ids-card.es.js.map +1 -1
- package/dist/domains/metrics/components/failure-rate-card.cjs.js +11 -14
- package/dist/domains/metrics/components/failure-rate-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/failure-rate-card.es.js +11 -14
- package/dist/domains/metrics/components/failure-rate-card.es.js.map +1 -1
- package/dist/domains/metrics/components/kpi-card.cjs.js +8 -5
- package/dist/domains/metrics/components/kpi-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/kpi-card.es.js +8 -5
- package/dist/domains/metrics/components/kpi-card.es.js.map +1 -1
- package/dist/domains/metrics/components/latency-card.cjs.js +33 -30
- package/dist/domains/metrics/components/latency-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/latency-card.es.js +34 -31
- package/dist/domains/metrics/components/latency-card.es.js.map +1 -1
- package/dist/domains/metrics/components/metrics-grid/metrics-grid.cjs.js +5 -2
- package/dist/domains/metrics/components/metrics-grid/metrics-grid.cjs.js.map +1 -1
- package/dist/domains/metrics/components/metrics-grid/metrics-grid.es.js +5 -2
- package/dist/domains/metrics/components/metrics-grid/metrics-grid.es.js.map +1 -1
- package/dist/domains/metrics/components/scores-card.cjs.js +7 -17
- package/dist/domains/metrics/components/scores-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/scores-card.es.js +7 -17
- package/dist/domains/metrics/components/scores-card.es.js.map +1 -1
- package/dist/domains/metrics/components/token-usage-card.cjs.js +29 -26
- package/dist/domains/metrics/components/token-usage-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/token-usage-card.es.js +30 -27
- package/dist/domains/metrics/components/token-usage-card.es.js.map +1 -1
- package/dist/domains/metrics/components/trace-aggregate-card.cjs.js +3 -2
- package/dist/domains/metrics/components/trace-aggregate-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/trace-aggregate-card.es.js +3 -2
- package/dist/domains/metrics/components/trace-aggregate-card.es.js.map +1 -1
- package/dist/domains/metrics/components/trace-volume-card.cjs.js +31 -35
- package/dist/domains/metrics/components/trace-volume-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/trace-volume-card.es.js +31 -35
- package/dist/domains/metrics/components/trace-volume-card.es.js.map +1 -1
- package/dist/domains/metrics/components/usage-card.cjs.js +29 -28
- package/dist/domains/metrics/components/usage-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/usage-card.es.js +30 -29
- package/dist/domains/metrics/components/usage-card.es.js.map +1 -1
- package/dist/domains/metrics/components.cjs.js +6 -5
- package/dist/domains/metrics/components.es.js +4 -5
- 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 +1 -1
- package/dist/domains/metrics/hooks/use-metrics-span-aggregate.es.js +1 -1
- package/dist/domains/metrics/hooks.cjs.js +1 -1
- package/dist/domains/metrics/hooks.es.js +1 -1
- 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.cjs.js +2 -2
- package/dist/domains/metrics/lib.es.js +2 -2
- package/dist/domains/metrics/metrics-filters.cjs.js +1 -1
- package/dist/domains/metrics/metrics-filters.es.js +1 -1
- package/dist/domains/metrics.cjs.js +14 -13
- package/dist/domains/metrics.es.js +12 -13
- package/dist/domains/observability/components/observability-header-slot.cjs.js +13 -0
- package/dist/domains/observability/components/observability-header-slot.cjs.js.map +1 -0
- package/dist/domains/observability/components/observability-header-slot.d.ts +1 -0
- package/dist/domains/observability/components/observability-header-slot.es.js +11 -0
- package/dist/domains/observability/components/observability-header-slot.es.js.map +1 -0
- package/dist/domains/observability/components/observability-histogram.cjs.js +6 -2
- package/dist/domains/observability/components/observability-histogram.cjs.js.map +1 -1
- package/dist/domains/observability/components/observability-histogram.es.js +6 -2
- package/dist/domains/observability/components/observability-histogram.es.js.map +1 -1
- package/dist/domains/observability/components/observability-page-layout.cjs.js +19 -5
- package/dist/domains/observability/components/observability-page-layout.cjs.js.map +1 -1
- package/dist/domains/observability/components/observability-page-layout.es.js +20 -6
- package/dist/domains/observability/components/observability-page-layout.es.js.map +1 -1
- package/dist/domains/observability/hooks/use-observability-list-filters.cjs.js +75 -18
- package/dist/domains/observability/hooks/use-observability-list-filters.cjs.js.map +1 -1
- package/dist/domains/observability/hooks/use-observability-list-filters.es.js +76 -19
- package/dist/domains/observability/hooks/use-observability-list-filters.es.js.map +1 -1
- package/dist/domains/observability/lib/zoom-memory.cjs.js +24 -0
- package/dist/domains/observability/lib/zoom-memory.cjs.js.map +1 -0
- package/dist/domains/observability/lib/zoom-memory.d.ts +1 -0
- package/dist/domains/observability/lib/zoom-memory.es.js +22 -0
- package/dist/domains/observability/lib/zoom-memory.es.js.map +1 -0
- package/dist/domains/observability/observability-list-url-state.cjs.js +122 -0
- package/dist/domains/observability/observability-list-url-state.cjs.js.map +1 -0
- package/dist/domains/observability/observability-list-url-state.d.ts +1 -0
- package/dist/domains/observability/observability-list-url-state.es.js +111 -0
- package/dist/domains/observability/observability-list-url-state.es.js.map +1 -0
- package/dist/domains/observability/saved-view-state.cjs.js +292 -0
- package/dist/domains/observability/saved-view-state.cjs.js.map +1 -0
- package/dist/domains/observability/saved-view-state.d.ts +1 -0
- package/dist/domains/observability/saved-view-state.es.js +286 -0
- package/dist/domains/observability/saved-view-state.es.js.map +1 -0
- package/dist/domains/observability/saved-views/observability-saved-views.cjs.js +3 -0
- package/dist/domains/observability/saved-views/observability-saved-views.d.ts +1 -0
- package/dist/domains/observability/saved-views/observability-saved-views.es.js +1 -0
- package/dist/domains/observability/saved-views/saved-views-provider.cjs.js +18 -0
- package/dist/domains/observability/saved-views/saved-views-provider.cjs.js.map +1 -0
- package/dist/domains/observability/saved-views/saved-views-provider.d.ts +1 -0
- package/dist/domains/observability/saved-views/saved-views-provider.es.js +17 -0
- package/dist/domains/observability/saved-views/saved-views-provider.es.js.map +1 -0
- package/dist/domains/observability/saved-views/saved-views-source.cjs.js +23 -0
- package/dist/domains/observability/saved-views/saved-views-source.cjs.js.map +1 -0
- package/dist/domains/observability/saved-views/saved-views-source.d.ts +1 -0
- package/dist/domains/observability/saved-views/saved-views-source.es.js +19 -0
- package/dist/domains/observability/saved-views/saved-views-source.es.js.map +1 -0
- package/dist/domains/observability/saved-views/use-hosted-saved-views.cjs.js +235 -0
- package/dist/domains/observability/saved-views/use-hosted-saved-views.cjs.js.map +1 -0
- package/dist/domains/observability/saved-views/use-hosted-saved-views.d.ts +1 -0
- package/dist/domains/observability/saved-views/use-hosted-saved-views.es.js +232 -0
- package/dist/domains/observability/saved-views/use-hosted-saved-views.es.js.map +1 -0
- package/dist/domains/observability/saved-views.cjs.js +7 -0
- package/dist/domains/observability/saved-views.d.ts +1 -0
- package/dist/domains/observability/saved-views.es.js +4 -0
- package/dist/domains/observability.cjs.js +6 -0
- package/dist/domains/observability.es.js +4 -1
- package/dist/domains/scores/components/span-scoring.cjs.js +1 -1
- package/dist/domains/scores/components/span-scoring.es.js +1 -1
- package/dist/domains/scores/components/trace-scores-list.cjs.js +1 -1
- package/dist/domains/scores/components/trace-scores-list.es.js +1 -1
- package/dist/domains/scores/components/trace-scores-tab.cjs.js +1 -1
- package/dist/domains/scores/components/trace-scores-tab.es.js +1 -1
- package/dist/domains/skills/skill-simple-form.cjs.js +1 -1
- package/dist/domains/skills/skill-simple-form.es.js +1 -1
- package/dist/domains/spans/components/spans-explorer-body.cjs.js +64 -18
- package/dist/domains/spans/components/spans-explorer-body.cjs.js.map +1 -1
- package/dist/domains/spans/components/spans-explorer-body.es.js +64 -18
- package/dist/domains/spans/components/spans-explorer-body.es.js.map +1 -1
- package/dist/domains/spans/components/spans-filter-bar.cjs.js +6 -5
- package/dist/domains/spans/components/spans-filter-bar.cjs.js.map +1 -1
- package/dist/domains/spans/components/spans-filter-bar.es.js +6 -5
- package/dist/domains/spans/components/spans-filter-bar.es.js.map +1 -1
- package/dist/domains/spans/hooks/use-spans-filter-bar.cjs.js +15 -3
- package/dist/domains/spans/hooks/use-spans-filter-bar.cjs.js.map +1 -1
- package/dist/domains/spans/hooks/use-spans-filter-bar.es.js +15 -3
- package/dist/domains/spans/hooks/use-spans-filter-bar.es.js.map +1 -1
- package/dist/domains/spans/span-filters.cjs.js +53 -14
- package/dist/domains/spans/span-filters.cjs.js.map +1 -1
- package/dist/domains/spans/span-filters.es.js +52 -15
- package/dist/domains/spans/span-filters.es.js.map +1 -1
- package/dist/domains/spans/span-list-row.cjs.js +6 -1
- package/dist/domains/spans/span-list-row.cjs.js.map +1 -1
- package/dist/domains/spans/span-list-row.es.js +6 -1
- package/dist/domains/spans/span-list-row.es.js.map +1 -1
- package/dist/domains/threads/components/threads-explorer-body.cjs.js +45 -12
- package/dist/domains/threads/components/threads-explorer-body.cjs.js.map +1 -1
- package/dist/domains/threads/components/threads-explorer-body.es.js +46 -12
- package/dist/domains/threads/components/threads-explorer-body.es.js.map +1 -1
- 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 +14 -3
- package/dist/domains/threads/hooks/use-threads-filter-bar.cjs.js.map +1 -1
- package/dist/domains/threads/hooks/use-threads-filter-bar.es.js +14 -3
- package/dist/domains/threads/hooks/use-threads-filter-bar.es.js.map +1 -1
- package/dist/domains/threads/thread-filters.cjs.js +26 -13
- package/dist/domains/threads/thread-filters.cjs.js.map +1 -1
- package/dist/domains/threads/thread-filters.es.js +26 -13
- package/dist/domains/threads/thread-filters.es.js.map +1 -1
- package/dist/domains/threads/thread-list-row.cjs.js +2 -0
- package/dist/domains/threads/thread-list-row.cjs.js.map +1 -1
- package/dist/domains/threads/thread-list-row.es.js +2 -0
- package/dist/domains/threads/thread-list-row.es.js.map +1 -1
- package/dist/domains/traces/components/columns-menu/columns-menu.cjs.js +24 -19
- package/dist/domains/traces/components/columns-menu/columns-menu.cjs.js.map +1 -1
- package/dist/domains/traces/components/columns-menu/columns-menu.es.js +25 -20
- package/dist/domains/traces/components/columns-menu/columns-menu.es.js.map +1 -1
- package/dist/domains/traces/components/feedback-thread.cjs.js +1 -1
- package/dist/domains/traces/components/feedback-thread.es.js +1 -1
- package/dist/domains/traces/components/span-data-panel-view.cjs.js +12 -2
- 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 +12 -2
- package/dist/domains/traces/components/span-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/span-outcome.utils.cjs.js +1 -1
- package/dist/domains/traces/components/span-outcome.utils.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +3 -3
- package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +3 -3
- 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 +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
- 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-mutations.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-processor-mutations.es.js +2 -2
- package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-tools-section.es.js +1 -1
- package/dist/domains/traces/components/span-prompt-changes.cjs.js +1 -1
- package/dist/domains/traces/components/span-prompt-changes.es.js +1 -1
- package/dist/domains/traces/components/trace-columns-menu.cjs.js +2 -1
- package/dist/domains/traces/components/trace-columns-menu.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-columns-menu.es.js +2 -1
- package/dist/domains/traces/components/trace-columns-menu.es.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +9 -2
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.es.js +9 -2
- package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/trace-span-panel.cjs.js +2 -1
- package/dist/domains/traces/components/trace-span-panel.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-span-panel.es.js +2 -1
- package/dist/domains/traces/components/trace-span-panel.es.js.map +1 -1
- package/dist/domains/traces/components/trace-span-timeline-markers.cjs.js +120 -0
- package/dist/domains/traces/components/trace-span-timeline-markers.cjs.js.map +1 -0
- package/dist/domains/traces/components/trace-span-timeline-markers.d.ts +1 -0
- package/dist/domains/traces/components/trace-span-timeline-markers.es.js +119 -0
- package/dist/domains/traces/components/trace-span-timeline-markers.es.js.map +1 -0
- package/dist/domains/traces/components/trace-span-timeline.cjs.js +8 -5
- package/dist/domains/traces/components/trace-span-timeline.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-span-timeline.es.js +8 -5
- package/dist/domains/traces/components/trace-span-timeline.es.js.map +1 -1
- package/dist/domains/traces/components/trace-time-range-chip.cjs.js +5 -5
- package/dist/domains/traces/components/trace-time-range-chip.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-time-range-chip.es.js +5 -5
- package/dist/domains/traces/components/trace-time-range-chip.es.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-actions.cjs.js +15 -11
- package/dist/domains/traces/components/traces-explorer/traces-explorer-actions.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-actions.es.js +15 -12
- package/dist/domains/traces/components/traces-explorer/traces-explorer-actions.es.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-context.cjs.js +4 -3
- package/dist/domains/traces/components/traces-explorer/traces-explorer-context.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-context.es.js +4 -3
- package/dist/domains/traces/components/traces-explorer/traces-explorer-context.es.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js +5 -4
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +5 -4
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-histogram.cjs.js +13 -5
- package/dist/domains/traces/components/traces-explorer/traces-explorer-histogram.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-histogram.es.js +13 -5
- package/dist/domains/traces/components/traces-explorer/traces-explorer-histogram.es.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-list-provider.cjs.js +5 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-list-provider.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-list-provider.es.js +5 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-list-provider.es.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-list.cjs.js +7 -11
- package/dist/domains/traces/components/traces-explorer/traces-explorer-list.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-list.es.js +7 -11
- package/dist/domains/traces/components/traces-explorer/traces-explorer-list.es.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.cjs.js +3 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.es.js +3 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.es.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-root.cjs.js +51 -5
- package/dist/domains/traces/components/traces-explorer/traces-explorer-root.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-root.es.js +51 -5
- package/dist/domains/traces/components/traces-explorer/traces-explorer-root.es.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.cjs.js +20 -0
- package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.cjs.js.map +1 -0
- package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.d.ts +1 -0
- package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.es.js +19 -0
- package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.es.js.map +1 -0
- package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.cjs.js +10 -4
- package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js +10 -4
- package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer.cjs.js +4 -1
- package/dist/domains/traces/components/traces-explorer.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer.es.js +5 -3
- package/dist/domains/traces/components/traces-explorer.es.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view-adapter.cjs.js +5 -1
- package/dist/domains/traces/components/traces-list-view-adapter.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view-adapter.es.js +5 -1
- package/dist/domains/traces/components/traces-list-view-adapter.es.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view.cjs.js +53 -18
- package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view.es.js +53 -18
- package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js +1 -1
- package/dist/domains/traces/components/traces-page-skeleton.es.js +1 -1
- package/dist/domains/traces/trace-filters.cjs.js +5 -1
- package/dist/domains/traces/trace-filters.es.js +1 -1
- package/dist/domains/traces/trace-list-columns.cjs.js +48 -9
- package/dist/domains/traces/trace-list-columns.cjs.js.map +1 -1
- package/dist/domains/traces/trace-list-columns.es.js +48 -9
- package/dist/domains/traces/trace-list-columns.es.js.map +1 -1
- package/dist/domains/traces/trace-query-filters.cjs.js +1 -1
- package/dist/domains/traces/trace-query-filters.es.js +1 -1
- package/dist/domains/traces/utils/timeline-markers.cjs.js +34 -0
- package/dist/domains/traces/utils/timeline-markers.cjs.js.map +1 -0
- package/dist/domains/traces/utils/timeline-markers.d.ts +1 -0
- package/dist/domains/traces/utils/timeline-markers.es.js +33 -0
- package/dist/domains/traces/utils/timeline-markers.es.js.map +1 -0
- package/dist/domains/traces.cjs.js +5 -1
- package/dist/domains/traces.es.js +2 -2
- package/dist/domains/workflows/components/workflow-combobox.cjs.js +1 -1
- package/dist/domains/workflows/components/workflow-combobox.es.js +1 -1
- package/dist/domains/workflows/components/workflows-list/workflows-list.cjs.js +1 -1
- package/dist/domains/workflows/components/workflows-list/workflows-list.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph.es.js +1 -1
- package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +1 -1
- package/dist/domains/workspace/components/workspace-markdown-preview.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-markdown-preview.es.js +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +1 -1
- package/dist/{filter-bar-chip-B3pgpngW.js → filter-bar-chip-7O02P9Vk.js} +27 -9
- package/dist/filter-bar-chip-7O02P9Vk.js.map +1 -0
- package/dist/{filter-bar-chip-CyTAmjt6.cjs → filter-bar-chip-BUyMf8XQ.cjs} +40 -22
- package/dist/filter-bar-chip-BUyMf8XQ.cjs.map +1 -0
- package/dist/layout/tabbed-container.cjs.js +1 -1
- package/dist/layout/tabbed-container.es.js +1 -1
- package/dist/lib/form/json-schema-to-zod-runtime.cjs.js +4 -4
- package/dist/lib/form/json-schema-to-zod-runtime.cjs.js.map +1 -1
- package/dist/lib/form/json-schema-to-zod-runtime.es.js +4 -4
- package/dist/lib/form/json-schema-to-zod-runtime.es.js.map +1 -1
- package/dist/lib/form/zod-provider.cjs.js +5 -1
- package/dist/lib/form/zod-provider.cjs.js.map +1 -1
- package/dist/lib/form/zod-provider.es.js +5 -1
- package/dist/lib/form/zod-provider.es.js.map +1 -1
- package/dist/observability-saved-views-Bo5kLN20.js +297 -0
- package/dist/observability-saved-views-Bo5kLN20.js.map +1 -0
- package/dist/observability-saved-views-CwCii7hh.cjs +302 -0
- package/dist/observability-saved-views-CwCii7hh.cjs.map +1 -0
- package/dist/primitives/chart-axes.cjs.js +44 -0
- package/dist/primitives/chart-axes.cjs.js.map +1 -1
- package/dist/primitives/chart-axes.es.js +43 -1
- package/dist/primitives/chart-axes.es.js.map +1 -1
- package/dist/primitives/chart-frame.cjs.js +5 -3
- package/dist/primitives/chart-frame.cjs.js.map +1 -1
- package/dist/primitives/chart-frame.es.js +6 -4
- package/dist/primitives/chart-frame.es.js.map +1 -1
- package/dist/primitives/chart-time-tick.cjs.js +15 -11
- package/dist/primitives/chart-time-tick.cjs.js.map +1 -1
- package/dist/primitives/chart-time-tick.es.js +16 -12
- package/dist/primitives/chart-time-tick.es.js.map +1 -1
- package/dist/saved-view-schema-DRJYELfK.cjs +71 -0
- package/dist/saved-view-schema-DRJYELfK.cjs.map +1 -0
- package/dist/saved-view-schema-eJXlRRel.js +54 -0
- package/dist/saved-view-schema-eJXlRRel.js.map +1 -0
- package/dist/{span-payload-primitives-D3OO0u6u.cjs → span-payload-primitives-B10Xxmx7.cjs} +4 -4
- package/dist/{span-payload-primitives-D3OO0u6u.cjs.map → span-payload-primitives-B10Xxmx7.cjs.map} +1 -1
- package/dist/{span-payload-primitives-DTV7eUY-.js → span-payload-primitives-Dyhbqaa7.js} +4 -4
- package/dist/{span-payload-primitives-DTV7eUY-.js.map → span-payload-primitives-Dyhbqaa7.js.map} +1 -1
- package/dist/src/domains/chat/activity/activity-stretch-line.d.ts +4 -2
- package/dist/src/domains/chat/activity/components/activity-fold.d.ts +5 -4
- package/dist/src/domains/chat/activity/components/use-fading-edge.d.ts +6 -0
- package/dist/src/domains/chat/activity/components/use-rolling-words.d.ts +7 -0
- package/dist/src/domains/chat/activity/index.d.ts +2 -1
- package/dist/src/domains/chat/activity/model/activity-members.d.ts +1 -0
- package/dist/src/domains/chat/activity/model/activity-words.d.ts +3 -0
- package/dist/src/domains/chat/messages/renderers/tool-part.d.ts +4 -0
- package/dist/src/domains/chat/messages/skill-message.d.ts +3 -1
- package/dist/src/domains/chat/tools/badges/mcp-task-chip.d.ts +14 -0
- package/dist/src/domains/chat/tools/badges/tool-badge.d.ts +5 -1
- package/dist/src/domains/chat/tools/badges/use-mcp-task-progress.d.ts +27 -0
- package/dist/src/domains/chat/tools/tool-card.d.ts +5 -1
- package/dist/src/domains/dashboards/components/dashboard-grid.d.ts +18 -0
- package/dist/src/domains/dashboards/components/dashboard-renderer.d.ts +19 -0
- package/dist/src/domains/dashboards/components/view-gate.d.ts +30 -0
- package/dist/src/domains/dashboards/components/widget-chrome.d.ts +7 -0
- package/dist/src/domains/dashboards/components/widget-controls.d.ts +8 -0
- package/dist/src/domains/dashboards/components/widget-error.d.ts +6 -0
- package/dist/src/domains/dashboards/hooks/use-dashboard-requests.d.ts +10 -0
- package/dist/src/domains/dashboards/hooks/use-scorers.d.ts +66 -0
- package/dist/src/domains/dashboards/hooks/use-widget-views.d.ts +18 -0
- package/dist/src/domains/dashboards/index.d.ts +19 -0
- package/dist/src/domains/dashboards/kinds/index.d.ts +7 -0
- package/dist/src/domains/dashboards/kinds/kpis/index.d.ts +13 -0
- package/dist/src/domains/dashboards/kinds/kpis/kpis-widget.d.ts +3 -0
- package/dist/src/domains/dashboards/kinds/kpis/options.d.ts +35 -0
- package/dist/src/domains/dashboards/kinds/scores/index.d.ts +8 -0
- package/dist/src/domains/dashboards/kinds/scores/options.d.ts +13 -0
- package/dist/src/domains/dashboards/kinds/scores/scores-widget.d.ts +3 -0
- package/dist/src/domains/dashboards/kinds/table/index.d.ts +23 -0
- package/dist/src/domains/dashboards/kinds/table/table-cells.d.ts +26 -0
- package/dist/src/domains/dashboards/kinds/table/table-columns.d.ts +7 -0
- package/dist/src/domains/dashboards/kinds/table/table-frame.d.ts +13 -0
- package/dist/src/domains/dashboards/kinds/table/table-tabs.d.ts +10 -0
- package/dist/src/domains/dashboards/kinds/table/table-view.d.ts +5 -0
- package/dist/src/domains/dashboards/kinds/table/table-widget.d.ts +7 -0
- package/dist/src/domains/dashboards/kinds/timeseries/index.d.ts +30 -0
- package/dist/src/domains/dashboards/kinds/timeseries/timeseries-widget.d.ts +5 -0
- package/dist/src/domains/dashboards/lib/answers.d.ts +43 -0
- package/dist/src/domains/dashboards/lib/chrome.d.ts +14 -0
- package/dist/src/domains/dashboards/lib/definition.d.ts +27 -0
- package/dist/src/domains/dashboards/lib/filters.d.ts +6 -0
- package/dist/src/domains/dashboards/lib/format.d.ts +7 -0
- package/dist/src/domains/dashboards/lib/prepare-widget.d.ts +26 -0
- package/dist/src/domains/dashboards/lib/requests.d.ts +95 -0
- package/dist/src/domains/dashboards/lib/scores.d.ts +35 -0
- package/dist/src/domains/dashboards/lib/table.d.ts +188 -0
- package/dist/src/domains/dashboards/lib/timeseries.d.ts +119 -0
- package/dist/src/domains/dashboards/lib/values.d.ts +86 -0
- package/dist/src/domains/dashboards/metrics-dashboard.d.ts +7 -0
- package/dist/src/domains/dashboards/widget-kind.d.ts +31 -0
- package/dist/src/domains/logs/components/index.d.ts +1 -0
- package/dist/src/domains/logs/components/logs-saved-views.d.ts +4 -0
- package/dist/src/domains/logs/log-filters.d.ts +8 -0
- package/dist/src/domains/metrics/components/agent-runs-card.d.ts +10 -3
- package/dist/src/domains/metrics/components/breakdown/breakdown-name.d.ts +13 -0
- package/dist/src/domains/metrics/components/breakdown/breakdown-not-priced.d.ts +2 -0
- package/dist/src/domains/metrics/components/breakdown/breakdown-row-mark.d.ts +17 -4
- package/dist/src/domains/metrics/components/breakdown/breakdown-trend-text.d.ts +9 -0
- package/dist/src/domains/metrics/components/card-action-buttons.d.ts +9 -0
- package/dist/src/domains/metrics/components/chart-card.d.ts +33 -21
- package/dist/src/domains/metrics/components/distinct-ids/distinct-ids-chart.d.ts +0 -1
- package/dist/src/domains/metrics/components/failure-rate-card.d.ts +5 -2
- package/dist/src/domains/metrics/components/index.d.ts +1 -2
- package/dist/src/domains/metrics/components/metrics-grid/metrics-grid.d.ts +4 -1
- package/dist/src/domains/metrics/components/trace-aggregate-card.d.ts +1 -1
- package/dist/src/domains/observability/components/observability-header-slot.d.ts +6 -0
- package/dist/src/domains/observability/components/observability-histogram.d.ts +1 -1
- package/dist/src/domains/observability/hooks/use-observability-list-filters.d.ts +21 -5
- package/dist/src/domains/observability/index.d.ts +2 -0
- package/dist/src/domains/observability/lib/zoom-memory.d.ts +19 -0
- package/dist/src/domains/observability/observability-list-url-state.d.ts +39 -0
- package/dist/src/domains/observability/saved-view-state.d.ts +46 -0
- package/dist/src/domains/observability/saved-views/index.d.ts +7 -0
- package/dist/src/domains/observability/saved-views/observability-saved-views.d.ts +22 -0
- package/dist/src/domains/observability/saved-views/saved-views-provider.d.ts +15 -0
- package/dist/src/domains/observability/saved-views/saved-views-source.d.ts +41 -0
- package/dist/src/domains/observability/saved-views/use-hosted-saved-views.d.ts +34 -0
- package/dist/src/domains/spans/components/spans-explorer-body.d.ts +4 -1
- package/dist/src/domains/spans/components/spans-filter-bar.d.ts +3 -1
- package/dist/src/domains/spans/hooks/use-spans-filter-bar.d.ts +1 -1
- package/dist/src/domains/spans/hooks/use-spans-list-source.d.ts +3 -0
- package/dist/src/domains/spans/span-filters.d.ts +16 -5
- package/dist/src/domains/threads/components/threads-explorer-body.d.ts +4 -1
- package/dist/src/domains/threads/thread-filters.d.ts +6 -5
- package/dist/src/domains/traces/components/columns-menu/columns-menu.d.ts +3 -3
- package/dist/src/domains/traces/components/trace-data-panel-view.d.ts +7 -1
- package/dist/src/domains/traces/components/trace-span-panel.d.ts +2 -1
- package/dist/src/domains/traces/components/trace-span-timeline-markers.d.ts +5 -0
- package/dist/src/domains/traces/components/trace-span-timeline.d.ts +6 -1
- package/dist/src/domains/traces/components/trace-time-range-chip.d.ts +3 -1
- package/dist/src/domains/traces/components/traces-explorer/index.d.ts +4 -1
- package/dist/src/domains/traces/components/traces-explorer/traces-explorer-actions.d.ts +5 -5
- package/dist/src/domains/traces/components/traces-explorer/traces-explorer-context.d.ts +11 -1
- package/dist/src/domains/traces/components/traces-explorer/traces-explorer-saved-views.d.ts +7 -0
- package/dist/src/domains/traces/components/traces-list-view.d.ts +20 -7
- package/dist/src/domains/traces/hooks/use-traces-list-source.d.ts +5 -0
- package/dist/src/domains/traces/trace-filters.d.ts +27 -3
- package/dist/src/domains/traces/trace-list-columns.d.ts +16 -6
- package/dist/src/domains/traces/utils/timeline-markers.d.ts +25 -0
- package/dist/src/domains/workflows/context/use-persisted-workflow-run.d.ts +2 -0
- package/dist/src/domains/workflows/workflow/input/processor-input.d.ts +5 -535
- package/dist/src/domains/workflows/workflow/use-workflow-trigger.d.ts +1 -1
- package/dist/src/ds/components/AgentIndicator/agent-glyph.d.ts +4 -0
- package/dist/src/ds/components/AgentIndicator/agent-indicator.d.ts +8 -0
- package/dist/src/ds/components/AgentIndicator/animate.d.ts +5 -0
- package/dist/src/ds/components/AgentIndicator/index.d.ts +4 -0
- package/dist/src/ds/components/AgentIndicator/paint.d.ts +21 -0
- package/dist/src/ds/components/AgentIndicator/poses.d.ts +7 -0
- package/dist/src/ds/components/AgentIndicator/shapes.d.ts +41 -0
- package/dist/src/ds/components/Arrival/arrival.d.ts +11 -0
- package/dist/src/ds/components/Arrival/index.d.ts +1 -1
- package/dist/src/ds/components/DataList/TracesDataList/traces-data-list-cells.d.ts +12 -0
- package/dist/src/ds/components/DataList/TracesDataList/traces-data-list.d.ts +3 -1
- package/dist/src/ds/components/FilterBar/types.d.ts +2 -0
- package/dist/src/ds/components/MetricsCard/index.d.ts +1 -1
- package/dist/src/ds/components/MetricsCard/metrics-card-actions.d.ts +2 -1
- package/dist/src/ds/components/MetricsCard/metrics-card-headline.d.ts +13 -0
- package/dist/src/ds/components/MetricsCard/metrics-card-title-menu.d.ts +2 -0
- package/dist/src/ds/components/MetricsCard/metrics-card-title.d.ts +1 -3
- package/dist/src/ds/components/MetricsCard/metrics-card-toolbar.d.ts +3 -3
- package/dist/src/ds/components/MetricsCard/metrics-card-total.d.ts +11 -3
- package/dist/src/ds/components/MetricsCard/metrics-card.d.ts +2 -9
- package/dist/src/ds/components/MetricsCard/metrics-story-data.d.ts +0 -26
- package/dist/src/ds/components/MetricsKpiCard/metrics-kpi-card-root.d.ts +5 -2
- package/dist/src/ds/components/MetricsLineChart/metrics-line-chart-legend.d.ts +3 -4
- package/dist/src/ds/components/MetricsLineChart/metrics-line-chart.d.ts +2 -6
- package/dist/src/ds/components/SavedViews/saved-view-editor.d.ts +3 -1
- package/dist/src/ds/components/SavedViews/saved-view-picker.d.ts +21 -0
- package/dist/src/ds/components/SavedViews/use-saved-views.d.ts +6 -2
- package/dist/src/ds/components/ai/activity/activity.d.ts +12 -7
- package/dist/src/ds/components/ai/activity/index.d.ts +1 -0
- package/dist/src/ds/components/ai/activity/presets/signal-activity.d.ts +4 -1
- package/dist/src/ds/components/ai/activity/use-relative-paths.d.ts +3 -0
- package/dist/src/ds/components/ai/message-reveal/message-reveal.d.ts +2 -1
- package/dist/src/ds/components/ai/tool-call/tool-presentation.d.ts +4 -0
- package/dist/src/ds/primitives/chart-axes.d.ts +24 -0
- package/dist/src/ds/primitives/chart-frame.d.ts +2 -1
- package/dist/src/ds/primitives/chart-time-tick.d.ts +7 -4
- package/dist/src/lib/string.d.ts +1 -0
- package/dist/{string-OAgeMRQ5.js → string-CNKDIc_4.js} +6 -2
- package/dist/string-CNKDIc_4.js.map +1 -0
- package/dist/{string-CymY0aJ9.cjs → string-DdJJdCv2.cjs} +11 -1
- package/dist/string-DdJJdCv2.cjs.map +1 -0
- package/dist/style.css +67 -4
- package/dist/{tabbed-container-x2mfK07d.js → tabbed-container-BKUqfEKy.js} +2 -2
- package/dist/{tabbed-container-x2mfK07d.js.map → tabbed-container-BKUqfEKy.js.map} +1 -1
- package/dist/{tabbed-container-CBTb0LgE.cjs → tabbed-container-CFEImJOK.cjs} +2 -2
- package/dist/{tabbed-container-CBTb0LgE.cjs.map → tabbed-container-CFEImJOK.cjs.map} +1 -1
- package/dist/{tool-approval-6E73C0r6.cjs → tool-approval-BfjoSNOC.cjs} +4 -4
- package/dist/{tool-approval-6E73C0r6.cjs.map → tool-approval-BfjoSNOC.cjs.map} +1 -1
- package/dist/{tool-approval-BXlro6fV.js → tool-approval-FeuyUUcL.js} +4 -4
- package/dist/{tool-approval-BXlro6fV.js.map → tool-approval-FeuyUUcL.js.map} +1 -1
- package/dist/{tool-call-CItJ8KLA.js → tool-call-BxYXs9w0.js} +9 -7
- package/dist/{tool-call-CItJ8KLA.js.map → tool-call-BxYXs9w0.js.map} +1 -1
- package/dist/{tool-call-Dq9xF3WD.cjs → tool-call-CvilN9ti.cjs} +9 -7
- package/dist/{tool-call-Dq9xF3WD.cjs.map → tool-call-CvilN9ti.cjs.map} +1 -1
- package/dist/{tool-card-o5u4YCR0.cjs → tool-card-B7O8AsRl.cjs} +9 -5
- package/dist/tool-card-B7O8AsRl.cjs.map +1 -0
- package/dist/{tool-card-Bd8weXze.js → tool-card-ELW898uw.js} +9 -5
- package/dist/tool-card-ELW898uw.js.map +1 -0
- package/dist/{tool-presentation-D2uUj1AB.cjs → tool-presentation-BLErsb7c.cjs} +38 -40
- package/dist/tool-presentation-BLErsb7c.cjs.map +1 -0
- package/dist/{tool-presentation-DKfIKLQy.js → tool-presentation-BSZYIWx2.js} +38 -40
- package/dist/tool-presentation-BSZYIWx2.js.map +1 -0
- package/dist/{trace-filters-C27yWcan.js → trace-filters-BJaebsxJ.js} +78 -11
- package/dist/trace-filters-BJaebsxJ.js.map +1 -0
- package/dist/{trace-filters-BpeBUjCb.cjs → trace-filters-BNEZ31HX.cjs} +100 -9
- package/dist/trace-filters-BNEZ31HX.cjs.map +1 -0
- package/dist/types-CP7wbYua.cjs.map +1 -1
- package/dist/types-DiiL5mTO.js.map +1 -1
- package/dist/utils/string.cjs.js +2 -1
- package/dist/utils/string.es.js +1 -1
- package/package.json +14 -14
- package/dist/Arrival-Dm6Vgn78.cjs.map +0 -1
- package/dist/Arrival-NpBOyV52.js.map +0 -1
- package/dist/DataList-Cmk08jUV.cjs.map +0 -1
- package/dist/DataList-Ve3omCXT.js.map +0 -1
- package/dist/DateTimeRangePicker-ByMbLdom.js.map +0 -1
- package/dist/DateTimeRangePicker-DGbH5WOn.cjs.map +0 -1
- package/dist/FilterBar-Dk3QEuT6.js.map +0 -1
- package/dist/FilterBar-gEvoWDXA.cjs.map +0 -1
- package/dist/MetricsCard-C9GWgT58.js.map +0 -1
- package/dist/MetricsCard-Dly_H3oX.cjs.map +0 -1
- package/dist/MetricsLineChart-2m4LVL1N.cjs.map +0 -1
- package/dist/MetricsLineChart-DKzuRU2q.js.map +0 -1
- package/dist/MetricsStackedBarChart-DJB4aByt.js.map +0 -1
- package/dist/MetricsStackedBarChart-NATtwA_W.cjs.map +0 -1
- package/dist/activity-QyLJcBKc.cjs.map +0 -1
- package/dist/activity-ihrl0JtH.js.map +0 -1
- package/dist/combobox-C-E7_q4j.cjs.map +0 -1
- package/dist/combobox-CDS2pBqz.js.map +0 -1
- package/dist/domains/metrics/components/metrics-kpis.cjs.js +0 -106
- package/dist/domains/metrics/components/metrics-kpis.cjs.js.map +0 -1
- package/dist/domains/metrics/components/metrics-kpis.d.ts +0 -1
- package/dist/domains/metrics/components/metrics-kpis.es.js +0 -105
- package/dist/domains/metrics/components/metrics-kpis.es.js.map +0 -1
- package/dist/filter-bar-chip-B3pgpngW.js.map +0 -1
- package/dist/filter-bar-chip-CyTAmjt6.cjs.map +0 -1
- package/dist/src/domains/metrics/components/metrics-kpis.d.ts +0 -2
- package/dist/src/ds/components/MetricsCard/metrics-card-description.d.ts +0 -4
- package/dist/src/ds/components/MetricsCard/metrics-card-summary.d.ts +0 -8
- package/dist/src/ds/components/MetricsCard/metrics-card-tabs.d.ts +0 -16
- package/dist/src/ds/components/MetricsCard/metrics-card-title-and-description.d.ts +0 -16
- package/dist/string-CymY0aJ9.cjs.map +0 -1
- package/dist/string-OAgeMRQ5.js.map +0 -1
- package/dist/tool-card-Bd8weXze.js.map +0 -1
- package/dist/tool-card-o5u4YCR0.cjs.map +0 -1
- package/dist/tool-presentation-D2uUj1AB.cjs.map +0 -1
- package/dist/tool-presentation-DKfIKLQy.js.map +0 -1
- package/dist/trace-filters-BpeBUjCb.cjs.map +0 -1
- package/dist/trace-filters-C27yWcan.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FilterBar-Dk3QEuT6.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 operator = draft?.operatorId ? ctx.getOperator(draft.operatorId) : undefined;\n const fieldOperators = useMemo(() => (field ? ctx.getFieldOperators(field) : []), [ctx, field]);\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=\"ml-[-.3em] shrink-0 text-muted-foreground\" />\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 } 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={cn(editableSegmentClass, 'gap-1.5')}\n title=\"Edit advanced filter\"\n >\n <BracesIcon className=\"size-[1.1em] shrink-0\" 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={cn(editableSegmentClass, 'px-1.5')}>\n <XIcon className=\"size-[1.1em]\" />\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={cn(editableSegmentClass, 'px-1.5')}\n onClick={remove}\n >\n <XIcon className=\"size-[1.1em]\" />\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 { XIcon } from 'lucide-react';\nimport { useFilterBarContext } from './filter-bar-context';\nimport { Button } from '@/ds/components/Button/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 <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={label}\n tooltip={label}\n onClick={event => {\n event.stopPropagation();\n ctx.clear();\n ctx.focusInput();\n }}\n >\n <XIcon />\n </Button>\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 { 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',\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;\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":";;;;;;;;;;;;;;;;;;;;;AA8BA,IAAM,gBAAgB,SAAgB,WAAW,QAAQ,KAAK,QAAQ,KAAK,QAAQ,WAAW,OAAO,KAAK,QAAQ;AAElH,IAAM,cAA+B,CAAC;;AAEtC,IAAM,oBAAoB;AAC1B,IAAM,iBAAiC;CACrC,IAAI;CACJ,OAAO;CACP,MAAM;CACN,WAAW,CAAC;AACd;;;;;AAmBA,SAAgB,eAAe,OAA4B;CAEzD,IADY,oBACR,CAAA,CAAI,gBAAgB,MAAM,SAAS,OAAO;CAC9C,OAAO,oBAAC,oBAAD,EAAoB,GAAI,MAAQ,CAAA;AACzC;AAEA,SAAS,mBAAmB,EAC1B,cAAc,WACd,WACA,cAAc,YAAY,cAC1B,SACA,WACsB;CACtB,MAAM,MAAM,oBAAoB;CAChC,MAAM,YAAY,mBAAmB;CACrC,MAAM,WAAW,OAAgC,IAAI;CACrD,MAAM,YAAY,OAAuB,IAAI;CAC7C,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,CAAC,OAAO,YAAY,SAAS,EAAE;CACrC,MAAM,CAAC,aAAa,kBAAkB,SAAsB,IAAI;CAChE,MAAM,CAAC,oBAAoB,yBAAyB,SAAS,KAAK;CAClE,MAAM,gBAAgB,mBAAmB,IAAI,OAAO;CAGpD,MAAM,EAAE,OAAO,UAAU,eAAe,gBAAgB;CACxD,MAAM,OAAa,CAAC,QAAQ,UAAU,CAAC,MAAM,aAAa,aAAa;CACvE,MAAM,QAAQ,QAAQ,IAAI,SAAS,MAAM,OAAO,IAAI,KAAA;CACpD,MAAM,WAAW,OAAO,aAAa,IAAI,YAAY,MAAM,UAAU,IAAI,KAAA;CACzE,MAAM,iBAAiB,cAAe,QAAQ,IAAI,kBAAkB,KAAK,IAAI,CAAC,GAAI,CAAC,KAAK,KAAK,CAAC;CAE9F,MAAM,gBAAgB,IAAI,iBAAiB,YAAY,KAAA;CACvD,MAAM,gBAAgB,cAAc;EAClC,MAAM,SAAS,IAAI,OAAO,QAAO,MAAK,CAAC,EAAE,MAAM;EAC/C,OAAO,gBAAgB,CAAC,GAAG,QAAQ,cAAc,IAAI;CACvD,GAAG,CAAC,IAAI,QAAQ,aAAa,CAAC;CAC9B,MAAM,cAAc,UAAU,UAAU,IAAI,YAAY,OAAO,IAAI,KAAA;CAGnE,gBAAgB;EACd,IAAI,SAAS,SAAS,SAAS,MAAM;CACvC,GAAG,CAAC,OAAO,CAAC;CAKZ,MAAM,qBAAqB,aAAa,WAAuB;EAC7D,gBAAgB,sBAAsB,IAAI,CAAC;EAC3C,OAAO;EACP,sBAAsB,KAAK;CAC7B,GAAG,CAAC,CAAC;CAEL,MAAM,WAAW,aACd,SAAqD,yBAAyB,cAAc,IAAI,CAAC,GAClG,CAAC,oBAAoB,aAAa,CACpC;CAEA,MAAM,QAAQ,kBAAkB;EAC9B,cAAc,IAAI;EAClB,SAAS,EAAE;CACb,GAAG,CAAC,aAAa,CAAC;CAElB,MAAM,QAAQ,kBAAkB;EAC9B,QAAQ,KAAK;EACb,MAAM;CACR,GAAG,CAAC,KAAK,CAAC;CAEV,MAAM,SAAS,aACZ,SAAiB,YAAoB,UAA0B;EAC9D,yBAAyB,YAAY;GAAE;GAAS;EAAW,GAAG,KAAK,CAAC;EACpE,SAAS,EAAE;EACX,SAAS,SAAS,MAAM;CAC1B,GACA,CAAC,oBAAoB,WAAW,CAClC;CAEA,MAAM,iBAAiB,aACpB,SAAiB,SAA4B;EAC5C,IAAI,KAAK,UAAU,QAAQ;GACzB,OAAO,SAAS,KAAK,IAAI,EAAE;GAC3B;EACF;EACA,SAAS;GAAE;GAAS,YAAY,KAAK;EAAG,CAAC;EACzC,SAAS,EAAE;CACb,GACA,CAAC,QAAQ,QAAQ,CACnB;CAEA,MAAM,cAAc,aACjB,SAAyB;EACxB,IAAI,KAAK,OAAO,mBAAmB;GAEjC,MAAM,KAAK,IAAI,SAAS,KAAA,GAAW,IAAI;GACvC,IAAI,aAAa,EAAE;GACnB,IAAI,eAAe,EAAE;GACrB,SAAS,EAAE;GACX,QAAQ,KAAK;GACb;EACF;EACA,MAAM,CAAC,MAAM,GAAG,QAAQ,IAAI,kBAAkB,IAAI;EAGlD,IAAI,KAAK,UAAU,QAAQ,MAAM,KAAK,MAAM,IAAI;GAC9C,OAAO,KAAK,IAAI,KAAK,IAAI,gBAAgB,KAAK,MAAM,KAAK,CAAC;GAC1D;EACF;EAEA,IAAI,QAAQ,KAAK,WAAW,GAAG;GAC7B,eAAe,KAAK,IAAI,IAAI;GAC5B;EACF;EACA,SAAS,EAAE,SAAS,KAAK,GAAG,CAAC;EAC7B,SAAS,EAAE;CACb,GACA;EAAC;EAAK;EAAQ;EAAO;EAAgB;CAAQ,CAC/C;CAEA,MAAM,YAAY,aAAa;EAC7B;EACA;EACA;EACA,SAAS,QAAQ,SAAS;EAC1B;EACA,WAAU,UAAS;GACjB,IAAI,OAAO,YAAY,OAAO,MAAM,SAAS,MAAM,YAAY,KAAK;EACtE;CACF,CAAC;CAID,MAAM,aAAa,kBAAkB;EACnC,IAAI,CAAC,SAAS,OAAO;EACrB,IAAI,eAAe,KAAA,CAAS;EAC5B,UAAU;EACV,OAAO;CACT,GAAG;EAAC;EAAK;EAAS;CAAO,CAAC;CAE1B,MAAM,WAAW,kBAAkB;EACjC,IAAI,SAAS,WAAW,OAAO;GAE7B,MAAM,eAAe,QAAQ,eAAe,WAAW,IAAI;GAC3D,SAAS,eAAe,OAAO,EAAE,SAAS,MAAM,QAAQ,CAAC;EAC3D,OAAO,IAAI,SAAS,YAAY,SAAS,IAAI;OACxC,IAAI,CAAC,WAAW,GAAG,QAAQ,KAAK;EACrC,SAAS,EAAE;CACb,GAAG;EAAC;EAAM;EAAO;EAAO;EAAgB;EAAU;CAAU,CAAC;CAG7D,MAAM,gBAAgB,SAAe;EACnC,IAAI,SAAS,SAAS,YAAY,IAAsB;OACnD,IAAI,SAAS,cAAc,OAAO,eAAe,MAAM,SAAS,IAAyB;OACzF,UAAU,aAAa,IAAuB;CACrD;CAGA,MAAM,iBAAiB,UAAwD;EAC7E,IAAI,MAAM,QAAQ,UAAU;GAC1B,MAAM,eAAe;GAErB,MAAM,gBAAgB;GACtB,MAAM,qBAAqB;GAC3B,SAAS;GACT;EACF;EACA,IAAI,CAAC,SAAS,MAAM,QAAQ,eAAe,MAAM,QAAQ,UAAU;GACjE,MAAM,eAAe;GACrB,MAAM,qBAAqB;GAC3B,QAAQ,IAAI;GACZ;EACF;EACA,IAAI,UAAU,IAAI;GAChB,IAAI,MAAM,QAAQ,aAAa;IAC7B,MAAM,eAAe;IACrB,MAAM,qBAAqB;IAC3B,IAAI,SAAS,SAAS,SAAS;SAC1B,IAAI,aAAa;KAEpB,MAAM,OAAO,YAAY,MAAM,UAAS,SAAQ,CAAC,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;KACzE,IAAI,MAAM,IAAI,WAAW,KAAK,EAAE;UAC3B,WAAW;IAClB,OAAO;KAEL,MAAM,OAAO,IAAI,MAAM,UAAS,SAAQ,CAAC,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;KACjE,IAAI,MAAM,IAAI,WAAW,KAAK,EAAE;IAClC;IACA;GACF;GACA,IAAI,MAAM,QAAQ,eAAe,SAAS,SAAS;IACjD,IAAI,IAAI,UAAU,IAAI,MAAM,SAAS,GAAG,IAAI,QAAQ,GAAG,MAAM,eAAe;IAC5E;GACF;EACF;EACA,IAAI,CAAC,MAAM;EAEX,IAAI,MAAM,QAAQ,SAAS,eAAe,SAAS,YAAY,SAAS,cAAc,UAAU,KAAK;GACnG,MAAM,eAAe;GACrB,MAAM,qBAAqB;GAC3B,aAAa,WAAW;GACxB;EACF;EACA,IAAI,SAAS,SAAS;GACpB,MAAM,oBAAoB,UAAU,iBAAkB,cAAyC;GAG/F,IAFgB,UAAU,cAAc,OAAO,iBAE3C,KAAY,MAAM,QAAQ,WAAW,sBAAsB,MAAO,MAAM,qBAAqB;EACnG;CACF;CAEA,MAAM,iBAAgD;EACpD,OAAO;EACP,UAAU;EACV,OAAO,UAAU;CACnB;CACA,MAAM,QAAyB,qBAAqB,cAAc,eAAe;CAIjF,MAAM,aAAa,aAChB,MAAY,MAAc,iBACxB,YAAY,QAAQ,KAAK,WAAW,QAAS,mBAAmB,MAAM,MAAM,YAAY,GAC3F,CAAC,CACH;CAEA,MAAM,mBACJ,SAAS,UACL,cACA,SAAS,aACP,cACA,UAAU,kBAAkB,UAAU,gBACpC,4BACA,OAAO,SAAS,WACd,YACA;CAEZ,OACE,oBAAAA,YAAA,EAAA,UACE,qBAAC,kBAAkB,MAAnB;EACS;EACP,mBAAmB;EAEnB,QAAQ,SAAS,UAAU,OAAO;EAClC,OAAO;EACP,gBAAgB,MAAM,YAAY;GAEhC,QAAQ,OAAO;GACf,IAAI,MAAM,aAAa,IAAI;EAC7B;EACA,YAAY;EACZ,qBAAqB,MAAM,YAAY;GACrC,IAAI,QAAQ,WAAW,gBAAgB;GACvC,SAAS,IAAI;GACb,IAAI,CAAC,MAAM,QAAQ,IAAI;EACzB;EACA,oBAAmB,SAAQ,eAAe,QAAQ,IAAI;EAChD;EACN,eAAe,MAAM,YAAY;GAE/B,IAAI,CAAC,QAAQ,QAAQ,WAAW,cAAc;GAE9C,IACE,CAAC,QACD,QAAQ,WAAW,mBACnB,QAAQ,MAAM,kBAAkB,QAChC,SAAS,SAAS,SAAS,QAAQ,MAAM,MAAM,GAE/C;GAEF,IAAI,MAAM,QAAQ,IAAI;QACjB,MAAM;EACb;EACA,GAAI;EACJ,OAAO;EAnCT,UAAA,CAqCE,qBAAC,OAAD;GACE,KAAK;GACL,aAAU;GACV,WAAW,GAIT,qBAAqB;IAAE,SAAS;IAAW,MAAA;GAA8B,CAAC,GAC1E,sBACA,8BACA,wBACA,SAAS,UAAU,aAAa,YAChC,SACF;GAbF,UAAA,CAeE,oBAAC,gBAAD;IAAgB,eAAA;IAAY,WAAU;GAA6C,CAAA,GACnF,oBAAC,kBAAkB,OAAnB;IACE,MAAK,OAAM;KACT,SAAS,UAAU;KACnB,IAAI,cAAc,EAAE;IACtB;IACA,cAAY;IACZ,YAAY;IACZ,GAAI;IACJ,aAAU;IACV,aAAW;IACX,eAAa,aAAa;IAC1B,WAAW,SAAS,WAAW,OAAO,SAAS,WAAW,YAAY,KAAA;IACtE,aAAa;IACb,WAAW,GACT,0BACA,iCACA,2HACF;IACA,eAAe,QAAQ,IAAI;IAC3B,WAAW;GACZ,CAAA,CACE;EACL,CAAA,GAAA,oBAAC,kBAAkB,QAAnB;GAAqC;GACnC,UAAA,oBAAC,kBAAkB,YAAnB;IAEE,QAAQ;IACR,OAAM;IACN,YAAA;IACA,gBAAgB;IAChB,WAAW,eAAe;IAE1B,UAAA,qBAAC,kBAAkB,OAAnB;KACE,WAAW,GAAG,eAAe,OAAO,6BAA6B;KACjE,aAAU;KAFZ,UAAA;MAIG,SAAS,WACR,oBAAC,qBAAD;OACE,cAAW;OACX,SAAQ,MAAK,EAAE;OACf,eAAc,MACZ,qBAAAA,YAAA,EAAA,UAAA,CACE,oBAAC,qBAAD,EAAqB,OAAO,EAAI,CAAA,GAC/B,EAAE,UAAU,UAAU,MACrB,qBAAC,QAAD;QAAM,WAAU;QAAhB,UAAA;SACG,IAAI,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE;SAAM;SAAG;SAAM;QACzC;OAER,CAAA,CAAA,EAAA,CAAA;OAEJ,WAAU;MACX,CAAA;MAEF,SAAS,cACR,oBAAC,qBAAD;OACE,cAAW;OACX,SAAQ,MAAK,EAAE;OACf,eAAc,MAAK,EAAE;OACrB,WAAU;MACX,CAAA;MAEF,SAAS,WAAW,UAAU,cAC7B,oBAAC,qBAAD;OACE,cAAW;OACX,wBAAsB,UAAU,UAAU,KAAA;OAC1C,SAAQ,MAAK,EAAE;OACf,eAAc,WAAU,oBAAC,sBAAD,EAA8B,OAAS,CAAA;OAC/D,aAAY,MAAK,UAAU,UAAU,UAAU,SAAS,SAAS,EAAE,KAAK;OACxE,WAAW,UAAU;OACrB,OAAO,UAAU;OACjB,WACE,UAAU,gBAAgB,mDAAmD;MAEhF,CAAA;MAEF,SAAS,WAAW,CAAC,UAAU,kBAC9B,qBAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACE,oBAAC,KAAD;QAAK,SAAQ;QAAU,MAAK;QAAQ,UAAA;OAE/B,CAAA,GACL,qBAAC,QAAD;QACE,MAAK;QACL,SAAQ;QACR,UAAU,CAAC,UAAU;QACrB,cAAa,MAAK,EAAE,eAAe;QACnC,eAAe,UAAU,eAAe;QAL1C,UAAA,CAMC,SAEC,oBAAC,KAAD;SAAK,MAAK;SAAK,UAAA;QAAM,CAAA,CACf;OACL,CAAA,CAAA;;MAEN,SAAS,WAAW,UAAU,UAC7B,oBAAC,OAAD;OAAK,WAAU;OACb,UAAA,qBAAC,QAAD;QACE,MAAK;QACL,SAAQ;QACR,cAAa,MAAK,EAAE,eAAe;QACnC,eAAe,UAAU,WAAW;QAJtC,UAAA,CAKC,QAEC,oBAAC,KAAD;SAAK,MAAK;SAAM,UAAA;QAAmB,CAAA,CAC7B;;MACL,CAAA;KAEgB;;GACG,CAAA;EACN,CAAA,CACJ;CACxB,CAAA,EAAA,CAAA;AAEN;;;ACrcA,SAAgB,iBAAiB,IAAY,SAAkB,SAA8C;CAC3G,MAAM,EAAE,iBAAiB,oBAAoB;CAC7C,gBAAgB;EACd,MAAM,OAAO,QAAQ;EACrB,IAAI,CAAC,WAAW,CAAC,MAAM;EACvB,MAAM,aAAa,OAAO,KAAK,kBAAkB,aAAa,KAAK,cAAc,EAAE,SAAS,KAAK,CAAC,IAAI,CAAC;EACvG,IAAI,WAAW,WAAW,GAAG;GAC3B,aAAa,EAAE;GACf;EACF;EACA,IAAI,YAAY;EAChB,QAAQ,IAAI,WAAW,KAAI,cAAa,UAAU,QAAQ,CAAC,CAAC,CACzD,WAAW;GACV,IAAI,CAAC,WAAW,aAAa,EAAE;EACjC,CAAC,CAAC,CACD,YAAY,CAAC,CAAC;EACjB,aAAa;GACX,YAAY;EACd;CACF,GAAG;EAAC;EAAS;EAAI;EAAc;CAAO,CAAC;AACzC;;ACVA,IAAM,iBACJ;;AASF,SAAgB,qBAAqB,EAAE,SAAS,OAAO,aAAwC;CAC7F,MAAM,MAAM,oBAAoB;CAChC,MAAM,OAAuB,UAAU,QAAQ,OAAO;CACtD,OACE,oBAAC,UAAD;EACE,MAAK;EACL,aAAU;EACV,cAAY;EACZ,cAAY,eAAe,MAAM,cAAc;EAC/C,OAAO,aAAa;EACpB,WAAW,GACT,gBACA,oFACA,uGACA,SACF;EACA,eAAe,IAAI,SAAS,SAAS,IAAI;EAExC,UAAA;CACK,CAAA;AAEZ;;AAGA,SAAS,qBAAqB,EAAE,SAAS,SAAqD;CAC5F,MAAM,MAAM,oBAAoB;CAChC,OACE,oBAAC,OAAD;EACE,MAAK;EACL,cAAW;EACX,WAAU;EAER,UAAA,CAAC,OAAO,IAAI,CAAC,CAAW,KAAI,UAC5B,oBAAC,UAAD;GAEE,MAAK;GACL,MAAK;GACL,gBAAc,UAAU;GACxB,cAAY,aAAa;GACzB,WAAW,GACT,4FACA,+BACA,UAAU,QAAQ,kCAAkC,6CACtD;GACA,eAAe,UAAU,SAAS,IAAI,SAAS,SAAS,KAAK;GAE5D,UAAA;EACK,GAbD,KAaC,CACT;CACE,CAAA;AAET;;;;;;;;AAmBA,SAAgB,qBAAqB,EACnC,OACA,OACA,UACA,cAAc,gBACd,aAC4B;CAC5B,MAAM,MAAM,oBAAoB;CAChC,MAAM,eAAe,OAA0B,IAAI;CACnD,MAAM,iBAAiB,OAAO,KAAK;CACnC,MAAM,WAAW,IAAI,gBAAgB,MAAM;CAC3C,MAAM,UAAU,QAAQ,IAAI;CAG5B,gBAAgB;EACd,IAAI,YAAY,CAAC,eAAe,SAAS;EACzC,eAAe,UAAU;EACzB,aAAa,SAAS,MAAM;CAC9B,GAAG,CAAC,QAAQ,CAAC;CAEb,MAAM,OAAoB,CAAC;CAC3B,MAAM,aAAa,QACjB,KAAK,WAAW,IACd,oBAAC,QAAD;EAA2B,WAAW;EAAgB,UAAA;CAEhD,GAFK,GAAG,IAAI,OAEZ,IAEN,oBAAC,sBAAD;EAA2C,SAAS,MAAM;EAAI,OAAO,MAAM;CAAQ,GAAxD,GAAG,IAAI,OAAiD;CAEvF,KAAK,MAAM,QAAQ,MAAM,OACvB,KAAK,KACH,qBAAC,UAAD,EAAA,UAAA,CACG,UAAU,KAAK,EAAE,GACjB,iBAAiB,IAAI,IACpB,oBAAC,iBAAD;EAAiB,OAAO;EAAM,OAAO,QAAQ;CAAI,CAAA,IAEjD,oBAAC,eAAD;EAAe,MAAM;EAAM,WAAU;CAAS,CAAA,CAExC,EAAA,GAPK,KAAK,EAOV,CACZ;CAEF,IAAI,IAAI,SAAS,IAAI,MAAM,YAAY,MAAM,IAAI;EAC/C,MAAM,EAAE,IAAI,SAAS,aAAa,OAAO,IAAI;EAC7C,KAAK,KACH,qBAAC,UAAD,EAAA,UAAA,CACG,UAAU,EAAE,GACb,oBAAC,eAAD;GAAe,OAAA;GAAM,MAAM;IAAE;IAAI;IAAS;IAAY,OAAO;GAAG;GAAG,WAAU;EAAS,CAAA,CAC9E,EAAA,GAHK,EAGL,CACZ;CACF;CACA,IAAI,UACF,KAAK,KACH,qBAAC,UAAD,EAAA,UAAA,CACG,UAAU,OAAO,GAClB,oBAAC,gBAAD;EACE,SAAS,MAAM;EACf,aAAY;EACZ,eAAe;GACb,eAAe,UAAU;EAC3B;CACD,CAAA,CACO,EAAA,GATI,OASJ,CACZ;CAGF,OACE,qBAAC,OAAD;EACE,aAAU;EACV,cAAY;EACZ,MAAK;EACL,cAAY,0BAA0B,MAAM;EAC5C,WAAW,GAAG,yBAAyB,SAAS;EALlD,UAAA,CAOG,KAAK,SAAS,KACb,oBAAC,OAAD;GAAK,WAAU;GAAyE,UAAA;EAAU,CAAA,GAEpG,qBAAC,OAAD;GACE,aAAU;GACV,WAAW,GAAG,sCAAsC,KAAK,SAAS,KAAK,wBAAwB;GAFjG,UAAA;IAIG,CAAC,YACA,oBAAC,QAAD;KACE,KAAK;KACL,SAAQ;KACR,MAAK;KACL,MAAM,oBAAC,UAAD,CAAW,CAAA;KACjB,eAAe,IAAI,eAAe,MAAM,EAAE;KAC3C,UAAA;IAEO,CAAA;IAEV,oBAAC,QAAD;KACE,SAAQ;KACR,MAAK;KACL,MAAM,oBAAC,gBAAD,CAAiB,CAAA;KACvB,WAAU;KACV,SAAS,UAAU,KAAA,IAAY,mBAAmB,IAAI,SAAS;KAC/D,UAAU,CAAC;KACX,eAAe,IAAI,SAAS,MAAM,IAAI,MAAM,UAAU,QAAQ,OAAO,KAAK;KAC3E,UAAA;IAEO,CAAA;IACP,YACC,oBAAC,QAAD;KACE,SAAQ;KACR,MAAK;KACL,MAAM,oBAAC,YAAD,CAAa,CAAA;KACnB,WAAU;KACV,cAAY;KACZ,SAAS;KACV,UAAA;IAEO,CAAA;GAEP;EACF,CAAA,CAAA;;AAET;AAEA,SAAS,gBAAgB,EAAE,OAAO,SAAmD;CACnF,MAAM,MAAM,oBAAoB;CAChC,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,UAAU,IAAI,QAAQ,IAAI,MAAM,EAAE;CACxC,iBAAiB,MAAM,IAAI,SAAS,OAAO;CAC3C,MAAM,QAAQ,YAAY,KAAK;CAE/B,OACE,qBAAC,OAAD;EACE,KAAK;EACL,aAAU;EACV,gBAAc,WAAW,KAAA;EACzB,eAAa,WAAW,KAAA;EACxB,WAAW,GACT,mFACA,WAAW,qBACb;EARF,UAAA,CAUE,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,oBAAC,YAAD,EAAY,WAAU,iCAAkC,CAAA;IACxD,oBAAC,KAAD;KAAK,IAAG;KAAO,SAAQ;KAAQ,MAAK;KAAM,UAAA;IAErC,CAAA;IACL,qBAAC,KAAD;KAAK,IAAG;KAAO,SAAQ;KAAQ,MAAK;KAApC,UAAA;MAA4C;MACvC;MAAM;MAAE,UAAU,IAAI,cAAc;KACpC;;IACL,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,oBAAC,sBAAD;MAAsB,SAAS,MAAM;MAAI,OAAO,MAAM;KAAQ,CAAA,GAC9D,oBAAC,QAAD;MACE,SAAQ;MACR,MAAK;MACL,SAAQ;MACR,UAAU;MACV,eAAe,IAAI,YAAY,MAAM,EAAE;MAEvC,UAAA,oBAAC,YAAD,CAAa,CAAA;KACP,CAAA,CACL;;GACF;EACL,CAAA,GAAA,oBAAC,sBAAD;GAA6B;GAAc;EAAQ,CAAA,CAChD;;AAET;;;;;;ACxOA,SAAgB,sBAAsB,EAAE,OAAO,aAAyC;CACtF,MAAM,MAAM,oBAAoB;CAChC,MAAM,CAAC,WAAW,eAAe,CAAC,IAAI,OAAO;CAC7C,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,aAAa,OAA0B,IAAI;CACjD,MAAM,UAAU,IAAI,QAAQ,IAAI,MAAM,EAAE;CACxC,MAAM,OAAO,IAAI,gBAAgB,MAAM;CACvC,MAAM,QAAQ,YAAY,KAAK;CAE/B,MAAM,iBAAiB,IAAI,MAAM,WAAU,SAAQ,QAAQ,OAAO,KAAK,EAAE,CAAC;CAC1E,MAAM,QAAQ,mBAAmB,KAAK,IAAI,MAAM,SAAS;CACzD,iBAAiB,MAAM,IAAI,SAAS,OAAO;CAE3C,MAAM,iBAAiB,UAAyC;EAC9D,IAAI,SAAS;EACb,MAAM,WAAW,MAAM,KAAK,QAAQ,SAAS,iBAA8B,2BAA2B,KAAK,CAAC,CAAC;EAC7G,MAAM,UAAU,SAAS,WAAU,OAAM,OAAO,MAAM,MAAM;EAC5D,IAAI,YAAY,IAAI;EACpB,QAAQ,MAAM,KAAd;GACE,KAAK,cAAc;IACjB,MAAM,eAAe;IACrB,MAAM,OAAO,SAAS,UAAU;IAChC,IAAI,MAAM,KAAK,MAAM;SAChB,IAAI,CAAC,IAAI,UAAU,QAAQ,OAAO,GAAG,OAAO,GAAG,IAAI,WAAW;IACnE;GACF;GACA,KAAK,aAAa;IAChB,MAAM,eAAe;IACrB,MAAM,OAAO,SAAS,UAAU;IAChC,IAAI,MAAM,KAAK,MAAM;SAChB,IAAI,UAAU,QAAQ,GAAG,IAAI,QAAQ;IAC1C;GACF;GACA,KAAK;GACL,KAAK;IACH,MAAM,eAAe;IACrB,OAAO;EAGX;CACF;CAEA,MAAM,eAAe;EACnB,IAAI,YAAY,MAAM,EAAE;EACxB,IAAI,iBAAiB,KAAK;CAC5B;CAEA,OACE,qBAAC,SAAD;EAAe;EAAM,eAAc,SAAQ,IAAI,aAAa,OAAO,MAAM,KAAK,IAAI;EAAlF,UAAA,CACE,qBAAC,OAAD;GACE,KAAK;GACL,MAAK;GACL,cAAY,oBAAoB,MAAM,GAAG,UAAU,IAAI,cAAc;GACrE,eAAa,WAAW,KAAA;GACxB,aAAU;GACV,gBAAc,WAAW,KAAA;GACzB,gBAAc,WAAW,KAAA;GACzB,WAAW,GAAG,uBAAuB,WAAW,WAAW,uBAAuB,SAAS;GAC3F,WAAW;GATb,UAAA,CAWE,qBAAC,gBAAD;IACE,MAAK,OAAM;KACT,WAAW,UAAU;KACrB,IAAI,gBAAgB,MAAM,IAAI,SAAS,UAAU,OAAO,EAAE;IAC5D;IACA,QAAQ,oBAAC,UAAD,EAAQ,MAAK,SAAU,CAAA;IAC/B,2BAAwB;IACxB,WAAW,GAAG,sBAAsB,SAAS;IAC7C,OAAM;IARR,UAAA;KAUE,oBAAC,YAAD;MAAY,WAAU;MAAwB,eAAA;KAAa,CAAA;KAC3D,oBAAC,QAAD;MAAM,WAAU;MAAW,UAAA;KAAqB,CAAA;KAC/C,QAAQ,KACP,oBAAC,KAAD;MAAK,IAAG;MAAO,SAAQ;MAAS,MAAK;MAAQ,eAAA;MAC1C,UAAA;KACE,CAAA;IAEO;GACf,CAAA,GAAA,UACC,oBAAC,QAAD;IAAM,eAAA;IAAY,WAAW,GAAG,sBAAsB,QAAQ;IAC5D,UAAA,oBAAC,OAAD,EAAO,WAAU,eAAgB,CAAA;GAC7B,CAAA,IAEN,oBAAC,UAAD;IACE,MAAK;IACL,MAAK,OAAM,IAAI,gBAAgB,MAAM,IAAI,UAAU,EAAE;IACrD,2BAAwB;IACxB,cAAW;IACX,OAAM;IACN,WAAW,GAAG,sBAAsB,QAAQ;IAC5C,SAAS;IAET,UAAA,oBAAC,OAAD,EAAO,WAAU,eAAgB,CAAA;GAC3B,CAAA,CAEP;EACL,CAAA,GAAA,qBAAC,gBAAD;GACE,OAAM;GACN,WAAU;IACH,wBAAwB;GAC/B,YAAY;GAJd,UAAA,CAME,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,oBAAC,YAAD,EAAY,WAAU,iCAAkC,CAAA;KACxD,oBAAC,KAAD;MAAK,IAAG;MAAO,SAAQ;MAAQ,MAAK;MAAM,UAAA;KAErC,CAAA;KACL,oBAAC,KAAD;MAAK,IAAG;MAAO,SAAQ;MAAS,MAAK;MAAQ,WAAU;MACpD,UAAA;KACE,CAAA;KACL,oBAAC,QAAD;MACE,SAAQ;MACR,MAAK;MACL,WAAU;MACV,SAAQ;MACR,eAAe,IAAI,aAAa,IAAI;MAEpC,UAAA,oBAAC,OAAD,CAAQ,CAAA;KACF,CAAA;IACL;GACL,CAAA,GAAA,oBAAC,sBAAD;IACS;IACP,OAAO;IACP,aAAY;IACZ,gBAAgB;KACd,IAAI,aAAa,IAAI;KACrB,OAAO;IACT;GACD,CAAA,CACa;EACT,CAAA,CAAA;;AAEb;AAEA,IAAM,WAAW,OAAuB,WACtC,MAAM,MAAM,MAAK,SAAS,KAAK,OAAO,SAAS,OAAO,UAAU,QAAQ,QAAQ,MAAM,MAAM,CAAE;;;ACzJhG,SAAgB,eAAe,EAAE,SAA4B;CAC3D,MAAM,MAAM,oBAAoB;CAChC,IAAI,CAAC,IAAI,mBAAmB,OAAO;CACnC,OACE,oBAAC,QAAD;EACE,SAAQ;EACR,MAAK;EACL,cAAY;EACZ,SAAS;EACT,UAAS,UAAS;GAChB,MAAM,gBAAgB;GACtB,IAAI,MAAM;GACV,IAAI,WAAW;EACjB;EAEA,UAAA,oBAAC,OAAD,CAAQ,CAAA;CACF,CAAA;AAEZ;;AC2BA,SAAS,iBAAiB,EACxB,WACA,YACA,YAKC;CACD,MAAM,MAAM,oBAAoB;CAChC,OACE,qBAAC,OAAD;EACE,MAAK;EACL,cAAY,IAAI;EAChB,aAAU;GACH,wBAAwB;EAC/B,WAAW,GAIT,4CACA,SACF;EAXF,UAAA;GAaG;GACD,oBAAC,QAAD;IAAM,WAAU;IACd,UAAA,oBAAC,gBAAD,EAAgB,OAAO,WAAa,CAAA;GAChC,CAAA;GACN,oBAAC,gBAAD;IAAgB,aAAU;IAAU,UAAA,IAAI;GAA6B,CAAA;EAClE;;AAET;;;;;;;;;;;;;;;;;AAkBA,SAAgB,UAAU,EACxB,QACA,WACA,OACA,eACA,cACA,UACA,cAAc,YAAY,WAC1B,0BACA,aAAa,iBACb,WACA,YACiB;CACjB,OACE,oBAAC,mBAAD;EACU;EACG;EACJ;EACQ;EACD;EACJ;EACC;EACe;EAE1B,UAAA,oBAAC,kBAAD;GAA6B;GAAuB;GACjD;EACe,CAAA;CACD,CAAA;AAEvB;;;;;;AAOA,SAAgB,eAAe,EAAE,aAAa,qBAA0C;CACtF,MAAM,MAAM,oBAAoB;CAGhC,MAAM,QAAqB,CAAC;CAC5B,KAAK,MAAM,QAAQ,IAAI,WAAW,OAAO;EACvC,MAAM,OAAO,iBAAiB,IAAI,IAAI,oBAAC,uBAAD,EAAuB,OAAO,KAAO,CAAA,IAAI,WAAW,IAAI;EAC9F,IAAI,SAAS,MAAM,MAAM,KAAK,oBAAC,UAAD,EAAA,UAAyB,KAAe,GAAzB,KAAK,EAAoB,CAAC;CACzE;CACA,IAAI,IAAI,SAAS,CAAC,IAAI,MAAM,SAAS;EAEnC,MAAM,EAAE,IAAI,SAAS,aAAa,OAAO,IAAI;EAC7C,MAAM,KACJ,oBAAC,UAAD,EAAA,UACE,oBAAC,eAAD;GAAe,OAAA;GAAM,MAAM;IAAE;IAAI;IAAS;IAAY,OAAO;GAAG;EAAI,CAAA,EAC5D,GAFK,EAEL,CACZ;CACF;CACA,OAAO,oBAAAC,YAAA,EAAA,UAAG,MAAQ,CAAA;AACpB;AAUA,IAAM,qBAAqB,SAAwB,oBAAC,eAAD,EAAqB,KAAO,CAAA;AAE/E,UAAU,QAAQ;AAClB,UAAU,OAAO;AACjB,UAAU,eAAe;AACzB,UAAU,QAAQ;;;ACtKlB,IAAa,2BAAgD;CAC3D;EAAE,IAAI;EAAM,OAAO;EAAM,UAAU;CAAK;CACxC;EAAE,IAAI;EAAU,OAAO;CAAS;CAChC;EAAE,IAAI;EAAY,OAAO;CAAW;CACpC;EAAE,IAAI;EAAgB,OAAO;CAAmB;CAChD;EAAE,IAAI;EAAe,OAAO;CAAc;CAC1C;EAAE,IAAI;EAAM,OAAO;CAAI;CACvB;EAAE,IAAI;EAAM,OAAO;CAAI;CACvB;EAAE,IAAI;EAAO,OAAO;CAAK;CACzB;EAAE,IAAI;EAAO,OAAO;CAAK;CACzB;EAAE,IAAI;EAAY,OAAO;EAAY,OAAO;CAAO;CACnD;EAAE,IAAI;EAAgB,OAAO;EAAgB,OAAO;CAAO;CAC3D;EAAE,IAAI;EAAM,OAAO;EAAM,OAAO;CAAO;AACzC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FilterBar-gEvoWDXA.cjs","names":["BracesIcon","useFilterBarContext","usePortalContainer","useRef","useState","useIsApplePlatform","useMemo","findGroup","useCallback","parseFieldValue","useValueStep","matchesQueryFilter","_Fragment","ComboboxPrimitive","alwaysHighlightProps","cn","comboboxTriggerClass","inputFocusBorderWithin","ListFilterIcon","passwordManagerOptOutProps","unstyledFormElementStyle","FLOATING_POSITION_METHOD","comboboxStyles","FilterBarOptionList","FilterBarFieldLabel","FilterBarOptionLabel","Txt","Button","Kbd","useFilterBarContext","useFilterBarContext","cn","useRef","Fragment","isFilterBarGroup","FilterBarChip","Button","PlusIcon","FolderPlusIcon","Trash2Icon","countLeaves","FolderIcon","Txt","useFilterBarContext","useState","useRef","countLeaves","Popover","cn","chipClass","PopoverTrigger","editableSegmentClass","BracesIcon","Txt","XIcon","PopoverContent","FILTER_BAR_SCOPE_ATTR","Button","useFilterBarContext","Button","XIcon","useFilterBarContext","FILTER_BAR_SCOPE_ATTR","cn","VisuallyHidden","FilterBarProvider","isFilterBarGroup","Fragment","FilterBarChip","_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 operator = draft?.operatorId ? ctx.getOperator(draft.operatorId) : undefined;\n const fieldOperators = useMemo(() => (field ? ctx.getFieldOperators(field) : []), [ctx, field]);\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=\"ml-[-.3em] shrink-0 text-muted-foreground\" />\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 } 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={cn(editableSegmentClass, 'gap-1.5')}\n title=\"Edit advanced filter\"\n >\n <BracesIcon className=\"size-[1.1em] shrink-0\" 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={cn(editableSegmentClass, 'px-1.5')}>\n <XIcon className=\"size-[1.1em]\" />\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={cn(editableSegmentClass, 'px-1.5')}\n onClick={remove}\n >\n <XIcon className=\"size-[1.1em]\" />\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 { XIcon } from 'lucide-react';\nimport { useFilterBarContext } from './filter-bar-context';\nimport { Button } from '@/ds/components/Button/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 <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={label}\n tooltip={label}\n onClick={event => {\n event.stopPropagation();\n ctx.clear();\n ctx.focusInput();\n }}\n >\n <XIcon />\n </Button>\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 { 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',\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;\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":"MetricsCard-C9GWgT58.js","names":[],"sources":["../src/ds/components/MetricsCard/metrics-card-actions.tsx","../src/ds/components/MetricsCard/metrics-card-content.tsx","../src/ds/components/MetricsCard/metrics-card-description.tsx","../src/ds/components/MetricsCard/metrics-card-error.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-summary.tsx","../src/ds/components/MetricsCard/metrics-card-tabs.tsx","../src/ds/components/MetricsCard/metrics-card-title.tsx","../src/ds/components/MetricsCard/metrics-card-title-and-description.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 `TitleAndDescription` and `Summary` (which always renders last). */\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 'flex shrink-0 items-center gap-1 self-center',\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 MetricsCardDescription({ children, className }: { children: string; className?: string }) {\n return (\n <Txt tone=\"faint\" className={cn('mt-0.5', className)}>\n {children}\n </Txt>\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 { 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 { SkeletonText } from '@/ds/components/Skeleton';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\n/** Always the top bar's last item, so action buttons sit to its left and the value hugs the edge. */\nexport function MetricsCardSummary({\n value,\n label,\n isLoading = false,\n className,\n}: {\n value: string;\n label?: string;\n /** Skeletons in the value's and label's own line boxes, so the top bar keeps its height. */\n isLoading?: boolean;\n className?: string;\n}) {\n if (isLoading) {\n return (\n <div className={cn('order-last flex shrink-0 flex-col items-end', className)}>\n <SkeletonText line=\"text-body\" className=\"h-4 w-14\" />\n {label && <SkeletonText line=\"text-body mt-0.5\" className=\"w-10\" />}\n </div>\n );\n }\n return (\n <div className={cn('order-last text-right', className)}>\n <Txt tone=\"muted\" className=\"tabular-nums\">\n {value}\n </Txt>\n {label && (\n <Txt tone=\"faint\" className=\"mt-0.5\">\n {label}\n </Txt>\n )}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Tab, TabList, Tabs } from '@/ds/components/Tabs';\nimport type { TabProps } from '@/ds/components/Tabs';\nimport { cn } from '@/lib/utils';\n\nexport type MetricsCardTabsProps<T extends string> = {\n value: T;\n onValueChange: (value: T) => void;\n /** `MetricsCard.Tab`s. */\n children: ReactNode;\n};\n\n/**\n * The view switch in a metrics card's toolbar (e.g. Agents / Workflows / Tools): ghost tabs a\n * size under the control rung, so the switch stays quieter than the data. Metrics cards only;\n * anywhere else use `TabList`, which lines up with buttons and inputs.\n */\nexport function MetricsCardTabs<T extends string>({ value, onValueChange, children }: MetricsCardTabsProps<T>) {\n return (\n <Tabs<T> value={value} onValueChange={onValueChange} defaultTab={value}>\n <TabList variant=\"pill-ghost\" size=\"sm\">\n {children}\n </TabList>\n </Tabs>\n );\n}\n\n/** One `MetricsCard.Tabs` option: 24px tall with 12px labels. */\nexport function MetricsCardTab({ className, ...props }: TabProps) {\n return <Tab {...props} className={cn('h-6 px-2.5 text-column', className)} />;\n}\n","import { cn } from '@/lib/utils';\n\nexport function MetricsCardTitle({\n children,\n className,\n as: Tag = 'h2',\n weight = 'regular',\n}: {\n children: string;\n className?: string;\n as?: 'h2' | 'h3' | 'h4';\n /** `medium` for compact cards, where the title stands alone without a description. */\n weight?: 'regular' | 'medium';\n}) {\n return (\n <Tag className={cn('text-body text-foreground', weight === 'medium' && 'font-medium', className)}>{children}</Tag>\n );\n}\n","import type { ReactNode } from 'react';\n\nimport { MetricsCardDescription } from './metrics-card-description';\nimport { MetricsCardTitle } from './metrics-card-title';\n\ntype PropsWithTitleDescription = {\n title: string;\n description?: string;\n titleAs?: 'h2' | 'h3' | 'h4';\n children?: never;\n className?: string;\n};\n\ntype PropsWithChildren = {\n title?: never;\n description?: never;\n children: ReactNode;\n className?: string;\n};\n\nexport function MetricsCardTitleAndDescription(props: PropsWithTitleDescription | PropsWithChildren) {\n if ('children' in props) {\n return <div className={props.className}>{props.children}</div>;\n }\n\n const { title, description, titleAs } = props;\n\n return (\n <div className={props.className}>\n <MetricsCardTitle as={titleAs}>{title}</MetricsCardTitle>\n {description && <MetricsCardDescription>{description}</MetricsCardDescription>}\n </div>\n );\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 */\nexport function MetricsCardTitleMenu<V extends string>({\n title,\n value,\n onValueChange,\n options,\n className,\n}: MetricsCardTitleMenuProps<V>) {\n return (\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} />\n </DropdownMenu.Content>\n </DropdownMenu>\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: small tabs, 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 as\n * tall as `MetricsCard.Tabs`, so a legend-only toolbar matches a card with tabs 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/**\n * A compact 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.\n */\nexport function MetricsCardTotal({\n value,\n isLoading = false,\n className,\n}: {\n value: string;\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 {isLoading ? <SkeletonText line=\"text-body\" className=\"h-4 w-14\" /> : value}\n </span>\n );\n}\n","import { MetricsCardActions } from './metrics-card-actions';\nimport { MetricsCardContent } from './metrics-card-content';\nimport { MetricsCardDescription } from './metrics-card-description';\nimport { MetricsCardError } from './metrics-card-error';\nimport { MetricsCardLoading } from './metrics-card-loading';\nimport { MetricsCardNoData } from './metrics-card-no-data';\nimport { MetricsCardRoot } from './metrics-card-root';\nimport { MetricsCardSummary } from './metrics-card-summary';\nimport { MetricsCardTab, MetricsCardTabs } from './metrics-card-tabs';\nimport { MetricsCardTitle } from './metrics-card-title';\nimport { MetricsCardTitleAndDescription } from './metrics-card-title-and-description';\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 Tabs: MetricsCardTabs,\n Tab: MetricsCardTab,\n Actions: MetricsCardActions,\n TitleAndDescription: MetricsCardTitleAndDescription,\n Title: MetricsCardTitle,\n TitleMenu: MetricsCardTitleMenu,\n Description: MetricsCardDescription,\n Summary: MetricsCardSummary,\n Total: MetricsCardTotal,\n Loading: MetricsCardLoading,\n Error: MetricsCardError,\n Content: MetricsCardContent,\n NoData: MetricsCardNoData,\n});\n"],"mappings":";;;;;;;;;;;;;AAKA,SAAgB,mBAAmB,EACjC,UACA,SAAS,UACT,aASC;CACD,OACE,oBAAC,OAAD;EACE,WAAW,GACT,gDACA,WAAW,WACT,2GACF,SACF;EAEC;CACE,CAAA;AAET;;;;;;;ACtBA,SAAgB,mBAAmB,EAAE,UAAU,aAA0D;CACvG,OACE,oBAAC,OAAD;EAAK,WAAW,GAAG,wEAAwE,SAAS;EACjG;CACE,CAAA;AAET;;ACXA,SAAgB,uBAAuB,EAAE,UAAU,aAAuD;CACxG,OACE,oBAAC,KAAD;EAAK,MAAK;EAAQ,WAAW,GAAG,UAAU,SAAS;EAChD;CACE,CAAA;AAET;;ACNA,SAAgB,iBAAiB,EAC/B,UAAU,uBACV,aAIC;CACD,OACE,oBAAC,OAAD;EAAK,WAAW,GAAG,mDAAmD,SAAS;EAC7E,UAAA,oBAAC,KAAD;GAAK,SAAQ;GAAU,WAAU;GAC9B,UAAA;EACE,CAAA;CACF,CAAA;AAET;;ACdA,SAAgB,mBAAmB,EAAE,aAAqC;CACxE,OACE,oBAAC,OAAD;EAAK,WAAW,GAAG,oCAAoC,SAAS;EAC9D,UAAA,oBAAC,SAAD;GAAS,MAAK;GAAK,SAAQ;GAAQ,WAAU;EAAoB,CAAA;CAC9D,CAAA;AAET;;ACNA,SAAgB,kBAAkB,EAAE,UAAU,eAAe,aAAuD;CAClH,OACE,oBAAC,OAAD;EAAK,WAAW,GAAG,2CAA2C,SAAS;EACrE,UAAA,oBAAC,KAAD;GAAK,MAAK;GAAS,UAAA;EAAa,CAAA;CAC7B,CAAA;AAET;;ACLA,SAAgB,gBAAgB,EAAE,UAAU,aAA0D;CACpG,OACE,oBAAC,MAAD;EACE,WAAW,GACT,4IACA,SACF;EAEC;CACG,CAAA;AAEV;;;ACVA,SAAgB,mBAAmB,EACjC,OACA,OACA,YAAY,OACZ,aAOC;CACD,IAAI,WACF,OACE,qBAAC,OAAD;EAAK,WAAW,GAAG,+CAA+C,SAAS;EAA3E,UAAA,CACE,oBAAC,cAAD;GAAc,MAAK;GAAY,WAAU;EAAY,CAAA,GACpD,SAAS,oBAAC,cAAD;GAAc,MAAK;GAAmB,WAAU;EAAQ,CAAA,CAC/D;;CAGT,OACE,qBAAC,OAAD;EAAK,WAAW,GAAG,yBAAyB,SAAS;EAArD,UAAA,CACE,oBAAC,KAAD;GAAK,MAAK;GAAQ,WAAU;GACzB,UAAA;EACE,CAAA,GACJ,SACC,oBAAC,KAAD;GAAK,MAAK;GAAQ,WAAU;GACzB,UAAA;EACE,CAAA,CAEJ;;AAET;;;;;;;ACpBA,SAAgB,gBAAkC,EAAE,OAAO,eAAe,YAAqC;CAC7G,OACE,oBAAC,MAAD;EAAgB;EAAsB;EAAe,YAAY;EAC/D,UAAA,oBAAC,SAAD;GAAS,SAAQ;GAAa,MAAK;GAChC;EACM,CAAA;CACL,CAAA;AAEV;;AAGA,SAAgB,eAAe,EAAE,WAAW,GAAG,SAAmB;CAChE,OAAO,oBAAC,KAAD;EAAK,GAAI;EAAO,WAAW,GAAG,0BAA0B,SAAS;CAAI,CAAA;AAC9E;;AC5BA,SAAgB,iBAAiB,EAC/B,UACA,WACA,IAAI,MAAM,MACV,SAAS,aAOR;CACD,OACE,oBAAC,KAAD;EAAK,WAAW,GAAG,6BAA6B,WAAW,YAAY,eAAe,SAAS;EAAI;CAAc,CAAA;AAErH;;ACGA,SAAgB,+BAA+B,OAAsD;CACnG,IAAI,cAAc,OAChB,OAAO,oBAAC,OAAD;EAAK,WAAW,MAAM;EAAY,UAAA,MAAM;CAAc,CAAA;CAG/D,MAAM,EAAE,OAAO,aAAa,YAAY;CAExC,OACE,qBAAC,OAAD;EAAK,WAAW,MAAM;EAAtB,UAAA,CACE,oBAAC,kBAAD;GAAkB,IAAI;GAAU,UAAA;EAAwB,CAAA,GACvD,eAAe,oBAAC,wBAAD,EAAA,UAAyB,YAAoC,CAAA,CAC1E;;AAET;;;;;;ACdA,SAAgB,qBAAuC,EACrD,OACA,OACA,eACA,SACA,aAC+B;CAC/B,OACE,qBAAC,cAAD,EAAA,UAAA,CACE,qBAAC,aAAa,SAAd;EACE,QACE,oBAAC,UAAD;GACE,MAAK;GACL,WAAW,GACT,oJACA,SACF;EACD,CAAA;EARL,UAAA,CAWG,OACD,oBAAC,iBAAD,EAAiB,WAAU,iCAAkC,CAAA,CACzC;CACtB,CAAA,GAAA,oBAAC,aAAa,SAAd;EAAsB,OAAM;EAC1B,UAAA,oBAAC,aAAa,cAAd;GAAoC;GAAgB;GAAsB;EAAgB,CAAA;CACtE,CAAA,CACV,EAAA,CAAA;AAElB;;;;;;;;ACtCA,SAAgB,mBAAmB,EAAE,UAAU,aAA0D;CACvG,OACE,oBAAC,OAAD;EACE,WAAW,GACT,oJACA,SACF;EAEC;CACE,CAAA;AAET;;ACjBA,SAAgB,kBAAkB,EAAE,UAAU,aAA0D;CACtG,OACE,oBAAC,OAAD;EAAK,WAAW,GAAG,2EAA2E,SAAS;EACpG;CACE,CAAA;AAET;;;;;;ACFA,SAAgB,iBAAiB,EAC/B,OACA,YAAY,OACZ,aAKC;CACD,OACE,oBAAC,QAAD;EAAM,WAAW,GAAG,0EAA0E,SAAS;EACpG,UAAA,YAAY,oBAAC,cAAD;GAAc,MAAK;GAAY,WAAU;EAAY,CAAA,IAAI;CAClE,CAAA;AAEV;;ACJA,IAAa,cAAc,OAAO,OAAO,iBAAiB;CACxD,MAAM;CACN,KAAK;CACL,QAAQ;CACR,SAAS;CACT,MAAM;CACN,KAAK;CACL,SAAS;CACT,qBAAqB;CACrB,OAAO;CACP,WAAW;CACX,aAAa;CACb,SAAS;CACT,OAAO;CACP,SAAS;CACT,OAAO;CACP,SAAS;CACT,QAAQ;AACV,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MetricsCard-Dly_H3oX.cjs","names":["cn","cn","Txt","cn","cn","Txt","cn","Spinner","cn","Txt","Card","cn","cn","SkeletonText","Txt","Tabs","TabList","Tab","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-description.tsx","../src/ds/components/MetricsCard/metrics-card-error.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-summary.tsx","../src/ds/components/MetricsCard/metrics-card-tabs.tsx","../src/ds/components/MetricsCard/metrics-card-title.tsx","../src/ds/components/MetricsCard/metrics-card-title-and-description.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 `TitleAndDescription` and `Summary` (which always renders last). */\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 'flex shrink-0 items-center gap-1 self-center',\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 MetricsCardDescription({ children, className }: { children: string; className?: string }) {\n return (\n <Txt tone=\"faint\" className={cn('mt-0.5', className)}>\n {children}\n </Txt>\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 { 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 { SkeletonText } from '@/ds/components/Skeleton';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\n/** Always the top bar's last item, so action buttons sit to its left and the value hugs the edge. */\nexport function MetricsCardSummary({\n value,\n label,\n isLoading = false,\n className,\n}: {\n value: string;\n label?: string;\n /** Skeletons in the value's and label's own line boxes, so the top bar keeps its height. */\n isLoading?: boolean;\n className?: string;\n}) {\n if (isLoading) {\n return (\n <div className={cn('order-last flex shrink-0 flex-col items-end', className)}>\n <SkeletonText line=\"text-body\" className=\"h-4 w-14\" />\n {label && <SkeletonText line=\"text-body mt-0.5\" className=\"w-10\" />}\n </div>\n );\n }\n return (\n <div className={cn('order-last text-right', className)}>\n <Txt tone=\"muted\" className=\"tabular-nums\">\n {value}\n </Txt>\n {label && (\n <Txt tone=\"faint\" className=\"mt-0.5\">\n {label}\n </Txt>\n )}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Tab, TabList, Tabs } from '@/ds/components/Tabs';\nimport type { TabProps } from '@/ds/components/Tabs';\nimport { cn } from '@/lib/utils';\n\nexport type MetricsCardTabsProps<T extends string> = {\n value: T;\n onValueChange: (value: T) => void;\n /** `MetricsCard.Tab`s. */\n children: ReactNode;\n};\n\n/**\n * The view switch in a metrics card's toolbar (e.g. Agents / Workflows / Tools): ghost tabs a\n * size under the control rung, so the switch stays quieter than the data. Metrics cards only;\n * anywhere else use `TabList`, which lines up with buttons and inputs.\n */\nexport function MetricsCardTabs<T extends string>({ value, onValueChange, children }: MetricsCardTabsProps<T>) {\n return (\n <Tabs<T> value={value} onValueChange={onValueChange} defaultTab={value}>\n <TabList variant=\"pill-ghost\" size=\"sm\">\n {children}\n </TabList>\n </Tabs>\n );\n}\n\n/** One `MetricsCard.Tabs` option: 24px tall with 12px labels. */\nexport function MetricsCardTab({ className, ...props }: TabProps) {\n return <Tab {...props} className={cn('h-6 px-2.5 text-column', className)} />;\n}\n","import { cn } from '@/lib/utils';\n\nexport function MetricsCardTitle({\n children,\n className,\n as: Tag = 'h2',\n weight = 'regular',\n}: {\n children: string;\n className?: string;\n as?: 'h2' | 'h3' | 'h4';\n /** `medium` for compact cards, where the title stands alone without a description. */\n weight?: 'regular' | 'medium';\n}) {\n return (\n <Tag className={cn('text-body text-foreground', weight === 'medium' && 'font-medium', className)}>{children}</Tag>\n );\n}\n","import type { ReactNode } from 'react';\n\nimport { MetricsCardDescription } from './metrics-card-description';\nimport { MetricsCardTitle } from './metrics-card-title';\n\ntype PropsWithTitleDescription = {\n title: string;\n description?: string;\n titleAs?: 'h2' | 'h3' | 'h4';\n children?: never;\n className?: string;\n};\n\ntype PropsWithChildren = {\n title?: never;\n description?: never;\n children: ReactNode;\n className?: string;\n};\n\nexport function MetricsCardTitleAndDescription(props: PropsWithTitleDescription | PropsWithChildren) {\n if ('children' in props) {\n return <div className={props.className}>{props.children}</div>;\n }\n\n const { title, description, titleAs } = props;\n\n return (\n <div className={props.className}>\n <MetricsCardTitle as={titleAs}>{title}</MetricsCardTitle>\n {description && <MetricsCardDescription>{description}</MetricsCardDescription>}\n </div>\n );\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 */\nexport function MetricsCardTitleMenu<V extends string>({\n title,\n value,\n onValueChange,\n options,\n className,\n}: MetricsCardTitleMenuProps<V>) {\n return (\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} />\n </DropdownMenu.Content>\n </DropdownMenu>\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: small tabs, 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 as\n * tall as `MetricsCard.Tabs`, so a legend-only toolbar matches a card with tabs 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/**\n * A compact 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.\n */\nexport function MetricsCardTotal({\n value,\n isLoading = false,\n className,\n}: {\n value: string;\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 {isLoading ? <SkeletonText line=\"text-body\" className=\"h-4 w-14\" /> : value}\n </span>\n );\n}\n","import { MetricsCardActions } from './metrics-card-actions';\nimport { MetricsCardContent } from './metrics-card-content';\nimport { MetricsCardDescription } from './metrics-card-description';\nimport { MetricsCardError } from './metrics-card-error';\nimport { MetricsCardLoading } from './metrics-card-loading';\nimport { MetricsCardNoData } from './metrics-card-no-data';\nimport { MetricsCardRoot } from './metrics-card-root';\nimport { MetricsCardSummary } from './metrics-card-summary';\nimport { MetricsCardTab, MetricsCardTabs } from './metrics-card-tabs';\nimport { MetricsCardTitle } from './metrics-card-title';\nimport { MetricsCardTitleAndDescription } from './metrics-card-title-and-description';\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 Tabs: MetricsCardTabs,\n Tab: MetricsCardTab,\n Actions: MetricsCardActions,\n TitleAndDescription: MetricsCardTitleAndDescription,\n Title: MetricsCardTitle,\n TitleMenu: MetricsCardTitleMenu,\n Description: MetricsCardDescription,\n Summary: MetricsCardSummary,\n Total: MetricsCardTotal,\n Loading: MetricsCardLoading,\n Error: MetricsCardError,\n Content: MetricsCardContent,\n NoData: MetricsCardNoData,\n});\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MetricsLineChart-2m4LVL1N.cjs","names":["cn","Txt","ChartTooltip","Txt","CHART_CURSOR_PROPS","cn","ChartSkeleton","useChartDefsId","useChartSize","compactNumber","ChartPlot","ComposedChart","CHART_MARGIN","CartesianGrid","CHART_GRID_PROPS","timeXAxis","valueYAxis","dataMax","isWholeData","Tooltip","CHART_TOOLTIP_PROPS","ChartTooltipPosition","Line","Area"],"sources":["../src/ds/components/MetricsLineChart/metrics-line-chart-legend.tsx","../src/ds/components/MetricsLineChart/metrics-line-chart-tooltip.tsx","../src/ds/components/MetricsLineChart/metrics-line-chart.tsx"],"sourcesContent":["import type { MetricsLineChartSeries } from './metrics-line-chart';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport function MetricsLineChartLegend({\n data,\n series,\n className,\n}: {\n /** Rows for each series' `aggregate`; omit when no series shows one. */\n data?: Record<string, unknown>[];\n series: MetricsLineChartSeries[];\n className?: string;\n}) {\n return (\n <div className={cn('flex flex-wrap items-center gap-x-4 gap-y-1', className)}>\n {series.map(s => {\n const aggregated = data ? s.aggregate?.(data) : undefined;\n return (\n <div key={s.dataKey} className=\"inline-flex items-center gap-1.5\">\n {s.dashed ? (\n <span className=\"h-0 w-3 shrink-0 border-t-2 border-dashed\" style={{ borderColor: s.color }} />\n ) : (\n <div className=\"size-2 shrink-0 rounded-[2px]\" style={{ backgroundColor: s.color }} />\n )}\n <Txt as=\"span\" variant=\"body-sm\" tone=\"muted\" className=\"max-w-48 truncate\">\n {s.label}\n </Txt>\n {aggregated && (\n <Txt as=\"span\" variant=\"body-sm\" tone=\"muted\" className=\"-ml-1 tabular-nums\">\n {aggregated.value}\n {aggregated.suffix && (\n <Txt as=\"span\" variant=\"body-sm\" tone=\"faint\">\n {' '}\n {aggregated.suffix}\n </Txt>\n )}\n </Txt>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","import { ChartTooltip } from '@/ds/components/ChartTooltip';\nimport { Txt } from '@/ds/components/Txt';\n\nexport function MetricsLineChartTooltip({\n active,\n payload,\n label,\n suffix,\n formatValue = value => value.toLocaleString('en-US'),\n showTotal = false,\n labelKey,\n formatByKey,\n}: {\n active?: boolean;\n payload?: Array<{\n name: string;\n value: number;\n color: string;\n dataKey?: string | number;\n payload?: Record<string, unknown>;\n }>;\n label?: string;\n suffix?: string;\n formatValue?: (value: number) => string;\n /** Adds a \"Total\" row under a hairline: the sum of every row, e.g. a stacked column's height. */\n showTotal?: boolean;\n /** Read the heading from this field of the hovered row instead of the x-axis label. */\n labelKey?: string;\n /** Per-series formatters, by data key, for charts that mix units (counts and durations). */\n formatByKey?: Record<string, (value: number) => string>;\n}) {\n if (!active || !payload?.length) return null;\n // A missing reading (NaN, Infinity) shows as a dash and stays out of the total.\n const finite = (value: unknown): value is number => typeof value === 'number' && Number.isFinite(value);\n const total = payload.reduce((sum, entry) => sum + (finite(entry.value) ? entry.value : 0), 0);\n // A bucket with no readings at all totals to a dash, not 0.\n const hasReading = payload.some(entry => finite(entry.value));\n const heading = labelKey ? String(payload[0]?.payload?.[labelKey] ?? label ?? '') : label;\n const format = (entry: { dataKey?: string | number }) => formatByKey?.[String(entry.dataKey)] ?? formatValue;\n // A number through its formatter; a missing or non-finite one as a dash; text as it is.\n const reading = (entry: (typeof payload)[number]) => {\n if (finite(entry.value)) return format(entry)(entry.value);\n if (typeof entry.value === 'number' || entry.value == null) return '—';\n return entry.value;\n };\n return (\n // A floor like shadcn's chart tooltip, so short readouts don't size it to their own label.\n <ChartTooltip className=\"min-w-32\">\n <Txt variant=\"column\" tone=\"ink\" className=\"mb-1\">\n {heading}\n </Txt>\n <div className=\"grid grid-cols-[auto_1fr_auto] items-center gap-x-2 gap-y-1\">\n {payload.map(entry => (\n <div key={entry.name} className=\"contents\">\n <span className=\"size-2 rounded-[2px]\" style={{ backgroundColor: entry.color }} />\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\" className=\"max-w-40 truncate\">\n {entry.name}\n </Txt>\n <span className=\"text-right font-mono text-foreground tabular-nums\">\n {reading(entry)}\n {finite(entry.value) && suffix}\n </span>\n </div>\n ))}\n {showTotal && (\n <div className=\"col-span-3 grid grid-cols-subgrid items-center border-t border-border pt-1\">\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\" className=\"col-span-2\">\n Total\n </Txt>\n <span className=\"text-right font-mono text-foreground tabular-nums\">\n {hasReading ? formatValue(total) : '—'}\n {hasReading && suffix}\n </span>\n </div>\n )}\n </div>\n </ChartTooltip>\n );\n}\n","import { Area, CartesianGrid, ComposedChart, Line, Tooltip } from 'recharts';\nimport { MetricsLineChartLegend } from './metrics-line-chart-legend';\nimport { MetricsLineChartTooltip } from './metrics-line-chart-tooltip';\nimport { ChartSkeleton } from '@/ds/components/ChartSkeleton';\nimport { CHART_CURSOR_PROPS, CHART_GRID_PROPS, CHART_TOOLTIP_PROPS, useChartSize } from '@/ds/primitives/chart-axes';\nimport type { ChartXLabels } from '@/ds/primitives/chart-axes';\nimport { Y_AXIS_WIDTH, compactNumber, dataMax, isWholeData, timeXAxis, valueYAxis } from '@/ds/primitives/chart-frame';\nimport type { ChartHeight } from '@/ds/primitives/chart-frame';\nimport { CHART_MARGIN } from '@/ds/primitives/chart-layout';\nimport { ChartPlot } from '@/ds/primitives/chart-plot';\nimport { ChartTooltipPosition } from '@/ds/primitives/chart-tooltip-position';\nimport { useChartDefsId } from '@/ds/primitives/use-chart-defs-id';\nimport { cn } from '@/lib/utils';\n\nexport type MetricsLineChartSeries = {\n dataKey: string;\n label: string;\n color: string;\n aggregate?: (data: Record<string, unknown>[]) => { value: string; suffix?: string };\n /** A secondary reading (e.g. an average next to counts): dashed, no fill under it. */\n dashed?: boolean;\n /** The series to read first (e.g. P95 among percentiles): a slightly heavier line. */\n emphasis?: boolean;\n};\n\n/** Line weight; an emphasised series adds half a pixel. */\nconst LINE_WIDTH = 1.75;\n/** Opacity at the top of the fill under a line (it fades to nothing at the base). */\nconst AREA_OPACITY = 0.12;\n\n/**\n * How the series draw.\n * - `default`: 1.75px lines over a fill.\n * - `thin`: 1.5px lines (emphasis included) over a fainter fill (40% of the default), for small\n * cards in a grid.\n */\nexport type MetricsLineChartLineStyle = 'default' | 'thin';\n\nconst LINE_STYLES: Record<MetricsLineChartLineStyle, { width: number; emphasis: number; areaOpacity: number }> = {\n default: { width: LINE_WIDTH, emphasis: LINE_WIDTH + 0.5, areaOpacity: AREA_OPACITY },\n thin: { width: 1.5, emphasis: 1.5, areaOpacity: AREA_OPACITY * 0.4 },\n};\n\n/**\n * Fills fade out sideways over their first and last 24px, so they don't end in a hard vertical\n * edge where the line starts and stops. A mask sized to each fill's own box.\n */\nconst THIN_FILL_FADE = '[&_.recharts-area-area]:mask-x-from-[calc(100%-24px)]';\n/** A series with this few points gets a dot on each: a lone point draws no line at all. */\nconst SPARSE_POINTS = 12;\n\n// Jumps straight to the hovered point, with the dots and the tooltip.\nfunction HoverLine({ points }: { points?: { x: number; y: number }[] }) {\n const [top, bottom] = points ?? [];\n if (!top || !bottom) return null;\n return (\n <line x1={top.x} x2={top.x} y1={top.y} y2={bottom.y} {...CHART_CURSOR_PROPS} className=\"pointer-events-none\" />\n );\n}\n\nexport type MetricsLineChartPointClickHandler = (point: Record<string, unknown>, seriesKey: string) => void;\n\nexport type MetricsLineChartProps = {\n data: Record<string, unknown>[];\n series: MetricsLineChartSeries[];\n /** Pixels, or `fill` to grow with the parent (a flex column, e.g. a card's content). */\n height?: ChartHeight;\n yDomain?: [number, number];\n /** Click on a series' active dot. */\n onPointClick?: MetricsLineChartPointClickHandler;\n /** Click anywhere on a bucket (e.g. to open its traces); the plot shows a pointer cursor. */\n onBucketClick?: (row: Record<string, unknown>, index: number) => void;\n /** Row field printed under the x-axis. */\n xKey?: string;\n /** Row field with the bucket's start time (ms), which places labels on round clock times. */\n timestampKey?: string;\n /** `auto` fits as many labels as the width allows; `edges` prints only the first and last. */\n xLabels?: ChartXLabels;\n /** Row field for the tooltip heading (e.g. a longer date); defaults to the x-axis label. */\n tooltipLabelKey?: string;\n /** Render a visible dot on every point. Series with few points get them anyway. */\n showDots?: boolean;\n /**\n * Point markers. `auto`: on every point of a sparse series (or all with `showDots`). `hover`:\n * none at rest, only the hovered point's.\n */\n dots?: 'auto' | 'hover';\n /** Line weight and fill. `thin` suits small cards in a grid. */\n lineStyle?: MetricsLineChartLineStyle;\n /** Set to `false` to render `MetricsLineChartLegend` elsewhere, e.g. next to tabs. */\n showLegend?: boolean;\n /** Formats tooltip values (e.g. `ms`, `%`), and y-axis ticks unless `axisFormatter` is set. */\n valueFormatter?: (value: number) => string;\n /** Formats y-axis ticks, when they need a shorter form than the tooltip. */\n axisFormatter?: (value: number) => string;\n /**\n * Set to `false` to drop the y-axis labels and let the plot span the card. The gridlines stay\n * for relative scale; exact values come from the tooltip and the card's summary.\n */\n showYAxis?: boolean;\n /** Show a ghost of the chart while data loads, in the chart's own footprint. */\n isLoading?: boolean;\n className?: string;\n};\n\nexport function MetricsLineChart(props: MetricsLineChartProps) {\n const { data, series, height = 210, showLegend = true, isLoading = false, className } = props;\n const root = cn(height === 'fill' && 'flex min-h-0 flex-1 flex-col', className);\n // The legend stays while loading: it comes from the series, not the data.\n return (\n <div className={root}>\n {showLegend && <MetricsLineChartLegend data={isLoading ? undefined : data} series={series} className=\"mb-4\" />}\n {isLoading ? <ChartSkeleton kind=\"line\" height={height} /> : <LinePlot {...props} />}\n </div>\n );\n}\n\n/** The plot itself, once the data is in. */\nfunction LinePlot({\n data,\n series,\n height = 210,\n yDomain,\n onPointClick,\n onBucketClick,\n xKey = 'time',\n timestampKey = 'tsMs',\n xLabels = 'auto',\n tooltipLabelKey,\n showDots = false,\n dots = 'auto',\n lineStyle = 'default',\n valueFormatter,\n axisFormatter,\n showYAxis = true,\n}: MetricsLineChartProps) {\n const id = useChartDefsId();\n const { size, onResize, ref } = useChartSize();\n\n const format = valueFormatter ?? compactNumber.format;\n const isSparse = (key: string) => data.filter(row => typeof row[key] === 'number').length <= SPARSE_POINTS;\n const plotWidth = size.width - (showYAxis ? Y_AXIS_WIDTH : 0);\n const line = LINE_STYLES[lineStyle];\n const restDot = (s: MetricsLineChartSeries) =>\n dots === 'auto' && (showDots || isSparse(s.dataKey)) ? { r: 3, fill: s.color, strokeWidth: 0 } : false;\n const activeDot = (s: MetricsLineChartSeries) => ({\n r: 3.5,\n fill: s.color,\n stroke: 'var(--background)',\n strokeWidth: 2,\n ...(onPointClick && {\n style: { cursor: 'pointer' },\n onClick: (_: unknown, payload: unknown) => {\n // Recharts passes the dot's props; the hovered row is under `payload`.\n if (isRecord(payload) && isRecord(payload.payload)) onPointClick(payload.payload, s.dataKey);\n },\n }),\n });\n\n return (\n <ChartPlot\n height={height}\n plotRef={ref}\n onResize={onResize}\n clickable={!!onBucketClick}\n className={cn(lineStyle === 'thin' && THIN_FILL_FADE)}\n >\n <ComposedChart\n data={data}\n margin={CHART_MARGIN}\n onClick={state => {\n const i = state?.activeTooltipIndex;\n const row = i === undefined || i === null ? undefined : data[Number(i)];\n if (onBucketClick && row) onBucketClick(row, Number(i));\n }}\n >\n <defs>\n {series.map((s, i) => (\n <linearGradient key={s.dataKey} id={`${id}-area-${i}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={s.color} stopOpacity={line.areaOpacity} />\n <stop offset=\"95%\" stopColor={s.color} stopOpacity={0} />\n </linearGradient>\n ))}\n </defs>\n <CartesianGrid {...CHART_GRID_PROPS} />\n {timeXAxis({ data, xKey, timestampKey, xLabels, plotWidth })}\n {valueYAxis({\n show: showYAxis,\n size,\n formatter: axisFormatter ?? format,\n domain: yDomain,\n max: dataMax(\n data,\n series.map(s => s.dataKey),\n ),\n integer: isWholeData(\n data,\n series.map(s => s.dataKey),\n ),\n })}\n <Tooltip\n {...CHART_TOOLTIP_PROPS}\n content={\n <ChartTooltipPosition>\n <MetricsLineChartTooltip formatValue={format} labelKey={tooltipLabelKey} />\n </ChartTooltipPosition>\n }\n cursor={<HoverLine />}\n />\n {series.map((s, i) => {\n const common = {\n type: 'monotone' as const,\n dataKey: s.dataKey,\n name: s.label,\n stroke: s.color,\n strokeWidth: s.emphasis ? line.emphasis : line.width,\n strokeDasharray: s.dashed ? '4 3' : undefined,\n dot: restDot(s),\n activeDot: activeDot(s),\n isAnimationActive: false,\n connectNulls: true,\n };\n return s.dashed ? (\n <Line key={s.dataKey} {...common} />\n ) : (\n <Area key={s.dataKey} {...common} fill={`url(#${id}-area-${i})`} fillOpacity={1} />\n );\n })}\n </ComposedChart>\n </ChartPlot>\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MetricsLineChart-DKzuRU2q.js","names":[],"sources":["../src/ds/components/MetricsLineChart/metrics-line-chart-legend.tsx","../src/ds/components/MetricsLineChart/metrics-line-chart-tooltip.tsx","../src/ds/components/MetricsLineChart/metrics-line-chart.tsx"],"sourcesContent":["import type { MetricsLineChartSeries } from './metrics-line-chart';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport function MetricsLineChartLegend({\n data,\n series,\n className,\n}: {\n /** Rows for each series' `aggregate`; omit when no series shows one. */\n data?: Record<string, unknown>[];\n series: MetricsLineChartSeries[];\n className?: string;\n}) {\n return (\n <div className={cn('flex flex-wrap items-center gap-x-4 gap-y-1', className)}>\n {series.map(s => {\n const aggregated = data ? s.aggregate?.(data) : undefined;\n return (\n <div key={s.dataKey} className=\"inline-flex items-center gap-1.5\">\n {s.dashed ? (\n <span className=\"h-0 w-3 shrink-0 border-t-2 border-dashed\" style={{ borderColor: s.color }} />\n ) : (\n <div className=\"size-2 shrink-0 rounded-[2px]\" style={{ backgroundColor: s.color }} />\n )}\n <Txt as=\"span\" variant=\"body-sm\" tone=\"muted\" className=\"max-w-48 truncate\">\n {s.label}\n </Txt>\n {aggregated && (\n <Txt as=\"span\" variant=\"body-sm\" tone=\"muted\" className=\"-ml-1 tabular-nums\">\n {aggregated.value}\n {aggregated.suffix && (\n <Txt as=\"span\" variant=\"body-sm\" tone=\"faint\">\n {' '}\n {aggregated.suffix}\n </Txt>\n )}\n </Txt>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","import { ChartTooltip } from '@/ds/components/ChartTooltip';\nimport { Txt } from '@/ds/components/Txt';\n\nexport function MetricsLineChartTooltip({\n active,\n payload,\n label,\n suffix,\n formatValue = value => value.toLocaleString('en-US'),\n showTotal = false,\n labelKey,\n formatByKey,\n}: {\n active?: boolean;\n payload?: Array<{\n name: string;\n value: number;\n color: string;\n dataKey?: string | number;\n payload?: Record<string, unknown>;\n }>;\n label?: string;\n suffix?: string;\n formatValue?: (value: number) => string;\n /** Adds a \"Total\" row under a hairline: the sum of every row, e.g. a stacked column's height. */\n showTotal?: boolean;\n /** Read the heading from this field of the hovered row instead of the x-axis label. */\n labelKey?: string;\n /** Per-series formatters, by data key, for charts that mix units (counts and durations). */\n formatByKey?: Record<string, (value: number) => string>;\n}) {\n if (!active || !payload?.length) return null;\n // A missing reading (NaN, Infinity) shows as a dash and stays out of the total.\n const finite = (value: unknown): value is number => typeof value === 'number' && Number.isFinite(value);\n const total = payload.reduce((sum, entry) => sum + (finite(entry.value) ? entry.value : 0), 0);\n // A bucket with no readings at all totals to a dash, not 0.\n const hasReading = payload.some(entry => finite(entry.value));\n const heading = labelKey ? String(payload[0]?.payload?.[labelKey] ?? label ?? '') : label;\n const format = (entry: { dataKey?: string | number }) => formatByKey?.[String(entry.dataKey)] ?? formatValue;\n // A number through its formatter; a missing or non-finite one as a dash; text as it is.\n const reading = (entry: (typeof payload)[number]) => {\n if (finite(entry.value)) return format(entry)(entry.value);\n if (typeof entry.value === 'number' || entry.value == null) return '—';\n return entry.value;\n };\n return (\n // A floor like shadcn's chart tooltip, so short readouts don't size it to their own label.\n <ChartTooltip className=\"min-w-32\">\n <Txt variant=\"column\" tone=\"ink\" className=\"mb-1\">\n {heading}\n </Txt>\n <div className=\"grid grid-cols-[auto_1fr_auto] items-center gap-x-2 gap-y-1\">\n {payload.map(entry => (\n <div key={entry.name} className=\"contents\">\n <span className=\"size-2 rounded-[2px]\" style={{ backgroundColor: entry.color }} />\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\" className=\"max-w-40 truncate\">\n {entry.name}\n </Txt>\n <span className=\"text-right font-mono text-foreground tabular-nums\">\n {reading(entry)}\n {finite(entry.value) && suffix}\n </span>\n </div>\n ))}\n {showTotal && (\n <div className=\"col-span-3 grid grid-cols-subgrid items-center border-t border-border pt-1\">\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\" className=\"col-span-2\">\n Total\n </Txt>\n <span className=\"text-right font-mono text-foreground tabular-nums\">\n {hasReading ? formatValue(total) : '—'}\n {hasReading && suffix}\n </span>\n </div>\n )}\n </div>\n </ChartTooltip>\n );\n}\n","import { Area, CartesianGrid, ComposedChart, Line, Tooltip } from 'recharts';\nimport { MetricsLineChartLegend } from './metrics-line-chart-legend';\nimport { MetricsLineChartTooltip } from './metrics-line-chart-tooltip';\nimport { ChartSkeleton } from '@/ds/components/ChartSkeleton';\nimport { CHART_CURSOR_PROPS, CHART_GRID_PROPS, CHART_TOOLTIP_PROPS, useChartSize } from '@/ds/primitives/chart-axes';\nimport type { ChartXLabels } from '@/ds/primitives/chart-axes';\nimport { Y_AXIS_WIDTH, compactNumber, dataMax, isWholeData, timeXAxis, valueYAxis } from '@/ds/primitives/chart-frame';\nimport type { ChartHeight } from '@/ds/primitives/chart-frame';\nimport { CHART_MARGIN } from '@/ds/primitives/chart-layout';\nimport { ChartPlot } from '@/ds/primitives/chart-plot';\nimport { ChartTooltipPosition } from '@/ds/primitives/chart-tooltip-position';\nimport { useChartDefsId } from '@/ds/primitives/use-chart-defs-id';\nimport { cn } from '@/lib/utils';\n\nexport type MetricsLineChartSeries = {\n dataKey: string;\n label: string;\n color: string;\n aggregate?: (data: Record<string, unknown>[]) => { value: string; suffix?: string };\n /** A secondary reading (e.g. an average next to counts): dashed, no fill under it. */\n dashed?: boolean;\n /** The series to read first (e.g. P95 among percentiles): a slightly heavier line. */\n emphasis?: boolean;\n};\n\n/** Line weight; an emphasised series adds half a pixel. */\nconst LINE_WIDTH = 1.75;\n/** Opacity at the top of the fill under a line (it fades to nothing at the base). */\nconst AREA_OPACITY = 0.12;\n\n/**\n * How the series draw.\n * - `default`: 1.75px lines over a fill.\n * - `thin`: 1.5px lines (emphasis included) over a fainter fill (40% of the default), for small\n * cards in a grid.\n */\nexport type MetricsLineChartLineStyle = 'default' | 'thin';\n\nconst LINE_STYLES: Record<MetricsLineChartLineStyle, { width: number; emphasis: number; areaOpacity: number }> = {\n default: { width: LINE_WIDTH, emphasis: LINE_WIDTH + 0.5, areaOpacity: AREA_OPACITY },\n thin: { width: 1.5, emphasis: 1.5, areaOpacity: AREA_OPACITY * 0.4 },\n};\n\n/**\n * Fills fade out sideways over their first and last 24px, so they don't end in a hard vertical\n * edge where the line starts and stops. A mask sized to each fill's own box.\n */\nconst THIN_FILL_FADE = '[&_.recharts-area-area]:mask-x-from-[calc(100%-24px)]';\n/** A series with this few points gets a dot on each: a lone point draws no line at all. */\nconst SPARSE_POINTS = 12;\n\n// Jumps straight to the hovered point, with the dots and the tooltip.\nfunction HoverLine({ points }: { points?: { x: number; y: number }[] }) {\n const [top, bottom] = points ?? [];\n if (!top || !bottom) return null;\n return (\n <line x1={top.x} x2={top.x} y1={top.y} y2={bottom.y} {...CHART_CURSOR_PROPS} className=\"pointer-events-none\" />\n );\n}\n\nexport type MetricsLineChartPointClickHandler = (point: Record<string, unknown>, seriesKey: string) => void;\n\nexport type MetricsLineChartProps = {\n data: Record<string, unknown>[];\n series: MetricsLineChartSeries[];\n /** Pixels, or `fill` to grow with the parent (a flex column, e.g. a card's content). */\n height?: ChartHeight;\n yDomain?: [number, number];\n /** Click on a series' active dot. */\n onPointClick?: MetricsLineChartPointClickHandler;\n /** Click anywhere on a bucket (e.g. to open its traces); the plot shows a pointer cursor. */\n onBucketClick?: (row: Record<string, unknown>, index: number) => void;\n /** Row field printed under the x-axis. */\n xKey?: string;\n /** Row field with the bucket's start time (ms), which places labels on round clock times. */\n timestampKey?: string;\n /** `auto` fits as many labels as the width allows; `edges` prints only the first and last. */\n xLabels?: ChartXLabels;\n /** Row field for the tooltip heading (e.g. a longer date); defaults to the x-axis label. */\n tooltipLabelKey?: string;\n /** Render a visible dot on every point. Series with few points get them anyway. */\n showDots?: boolean;\n /**\n * Point markers. `auto`: on every point of a sparse series (or all with `showDots`). `hover`:\n * none at rest, only the hovered point's.\n */\n dots?: 'auto' | 'hover';\n /** Line weight and fill. `thin` suits small cards in a grid. */\n lineStyle?: MetricsLineChartLineStyle;\n /** Set to `false` to render `MetricsLineChartLegend` elsewhere, e.g. next to tabs. */\n showLegend?: boolean;\n /** Formats tooltip values (e.g. `ms`, `%`), and y-axis ticks unless `axisFormatter` is set. */\n valueFormatter?: (value: number) => string;\n /** Formats y-axis ticks, when they need a shorter form than the tooltip. */\n axisFormatter?: (value: number) => string;\n /**\n * Set to `false` to drop the y-axis labels and let the plot span the card. The gridlines stay\n * for relative scale; exact values come from the tooltip and the card's summary.\n */\n showYAxis?: boolean;\n /** Show a ghost of the chart while data loads, in the chart's own footprint. */\n isLoading?: boolean;\n className?: string;\n};\n\nexport function MetricsLineChart(props: MetricsLineChartProps) {\n const { data, series, height = 210, showLegend = true, isLoading = false, className } = props;\n const root = cn(height === 'fill' && 'flex min-h-0 flex-1 flex-col', className);\n // The legend stays while loading: it comes from the series, not the data.\n return (\n <div className={root}>\n {showLegend && <MetricsLineChartLegend data={isLoading ? undefined : data} series={series} className=\"mb-4\" />}\n {isLoading ? <ChartSkeleton kind=\"line\" height={height} /> : <LinePlot {...props} />}\n </div>\n );\n}\n\n/** The plot itself, once the data is in. */\nfunction LinePlot({\n data,\n series,\n height = 210,\n yDomain,\n onPointClick,\n onBucketClick,\n xKey = 'time',\n timestampKey = 'tsMs',\n xLabels = 'auto',\n tooltipLabelKey,\n showDots = false,\n dots = 'auto',\n lineStyle = 'default',\n valueFormatter,\n axisFormatter,\n showYAxis = true,\n}: MetricsLineChartProps) {\n const id = useChartDefsId();\n const { size, onResize, ref } = useChartSize();\n\n const format = valueFormatter ?? compactNumber.format;\n const isSparse = (key: string) => data.filter(row => typeof row[key] === 'number').length <= SPARSE_POINTS;\n const plotWidth = size.width - (showYAxis ? Y_AXIS_WIDTH : 0);\n const line = LINE_STYLES[lineStyle];\n const restDot = (s: MetricsLineChartSeries) =>\n dots === 'auto' && (showDots || isSparse(s.dataKey)) ? { r: 3, fill: s.color, strokeWidth: 0 } : false;\n const activeDot = (s: MetricsLineChartSeries) => ({\n r: 3.5,\n fill: s.color,\n stroke: 'var(--background)',\n strokeWidth: 2,\n ...(onPointClick && {\n style: { cursor: 'pointer' },\n onClick: (_: unknown, payload: unknown) => {\n // Recharts passes the dot's props; the hovered row is under `payload`.\n if (isRecord(payload) && isRecord(payload.payload)) onPointClick(payload.payload, s.dataKey);\n },\n }),\n });\n\n return (\n <ChartPlot\n height={height}\n plotRef={ref}\n onResize={onResize}\n clickable={!!onBucketClick}\n className={cn(lineStyle === 'thin' && THIN_FILL_FADE)}\n >\n <ComposedChart\n data={data}\n margin={CHART_MARGIN}\n onClick={state => {\n const i = state?.activeTooltipIndex;\n const row = i === undefined || i === null ? undefined : data[Number(i)];\n if (onBucketClick && row) onBucketClick(row, Number(i));\n }}\n >\n <defs>\n {series.map((s, i) => (\n <linearGradient key={s.dataKey} id={`${id}-area-${i}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={s.color} stopOpacity={line.areaOpacity} />\n <stop offset=\"95%\" stopColor={s.color} stopOpacity={0} />\n </linearGradient>\n ))}\n </defs>\n <CartesianGrid {...CHART_GRID_PROPS} />\n {timeXAxis({ data, xKey, timestampKey, xLabels, plotWidth })}\n {valueYAxis({\n show: showYAxis,\n size,\n formatter: axisFormatter ?? format,\n domain: yDomain,\n max: dataMax(\n data,\n series.map(s => s.dataKey),\n ),\n integer: isWholeData(\n data,\n series.map(s => s.dataKey),\n ),\n })}\n <Tooltip\n {...CHART_TOOLTIP_PROPS}\n content={\n <ChartTooltipPosition>\n <MetricsLineChartTooltip formatValue={format} labelKey={tooltipLabelKey} />\n </ChartTooltipPosition>\n }\n cursor={<HoverLine />}\n />\n {series.map((s, i) => {\n const common = {\n type: 'monotone' as const,\n dataKey: s.dataKey,\n name: s.label,\n stroke: s.color,\n strokeWidth: s.emphasis ? line.emphasis : line.width,\n strokeDasharray: s.dashed ? '4 3' : undefined,\n dot: restDot(s),\n activeDot: activeDot(s),\n isAnimationActive: false,\n connectNulls: true,\n };\n return s.dashed ? (\n <Line key={s.dataKey} {...common} />\n ) : (\n <Area key={s.dataKey} {...common} fill={`url(#${id}-area-${i})`} fillOpacity={1} />\n );\n })}\n </ComposedChart>\n </ChartPlot>\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MetricsStackedBarChart-DJB4aByt.js","names":["_Fragment"],"sources":["../src/ds/components/MetricsStackedBarChart/metrics-stacked-bar-chart.tsx"],"sourcesContent":["import { useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { Bar, CartesianGrid, ComposedChart, LabelList, Line, Rectangle, ReferenceLine, Tooltip } from 'recharts';\nimport type { LabelProps } from 'recharts';\nimport { ChartSkeleton } from '@/ds/components/ChartSkeleton';\nimport type { MetricsLineChartSeries } from '@/ds/components/MetricsLineChart';\nimport { MetricsLineChartLegend, MetricsLineChartTooltip } from '@/ds/components/MetricsLineChart';\nimport { CHART_GRID_PROPS, CHART_TOOLTIP_PROPS, useChartSize } from '@/ds/primitives/chart-axes';\nimport type { ChartXLabels } from '@/ds/primitives/chart-axes';\nimport { singleBarBox, stackedSegmentBox } from '@/ds/primitives/chart-column-layout';\nimport type { SegmentBox } from '@/ds/primitives/chart-column-layout';\nimport {\n CHART_TICK,\n Y_AXIS_WIDTH,\n compactNumber,\n dataMax,\n isWholeData,\n timeXAxis,\n valueYAxis,\n} from '@/ds/primitives/chart-frame';\nimport type { ChartHeight } from '@/ds/primitives/chart-frame';\nimport { CHART_AXIS_FONT_SIZE, CHART_MARGIN } from '@/ds/primitives/chart-layout';\nimport { ChartPlot } from '@/ds/primitives/chart-plot';\nimport { ChartTooltipPosition } from '@/ds/primitives/chart-tooltip-position';\nimport { DragSelectionBand, activeIndex, useDragSelection } from '@/ds/primitives/charts/drag-selection';\nimport type { DragSelectionRange } from '@/ds/primitives/charts/drag-selection';\nimport { useChartDefsId } from '@/ds/primitives/use-chart-defs-id';\nimport { cn } from '@/lib/utils';\n\n/** Corner radius of every segment; thin segments scale it down so they stay crisp rectangles. */\nconst RADIUS = 2;\n/** Pixels between stacked segments, so neighbouring segments read as separate blocks. */\nconst SEGMENT_GAP = 2;\n/** Opacity at the base of a segment's gradient (the top is fully opaque). */\nconst GRADIENT_BASE = 0.75;\n/** Single-series bars: translucent body under a solid cap that marks the value. */\nconst CAP_BODY = 0.55;\nconst CAP_HEIGHT = 3;\n/** Opacity of the other columns while one is hovered. */\nconst DIMMED = 0.3;\nconst COLUMN_LABEL_SPACE = 16;\n\ntype SegmentProps = {\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n index?: number;\n payload?: Record<string, unknown>;\n};\n\nfunction segmentShape({\n fill,\n color,\n capped,\n keys,\n dataKey,\n}: {\n fill: string;\n color: string;\n capped: boolean;\n /** The column's data keys, bottom to top. */\n keys: string[];\n dataKey: string;\n}) {\n return function Segment({ x = 0, width = 0, index, payload, ...geo }: SegmentProps) {\n const values = keys.map(k => Number(payload?.[k]) || 0);\n const self = keys.indexOf(dataKey);\n const box = { y: geo.y ?? 0, height: Math.max(geo.height ?? 0, 0) };\n // Every non-zero value gets a few readable pixels; zeros draw nothing.\n const laid =\n keys.length > 1\n ? stackedSegmentBox(values, self, box, { gap: SEGMENT_GAP })\n : singleBarBox(values[self] ?? 0, box);\n if (!laid) return <g />;\n const { y, height: h } = laid;\n const radius = Math.min(RADIUS, Math.floor(h / 3));\n // Dimming is a CSS rule keyed on `data-bucket` (see `HoverDim`), so hovering re-renders no bars.\n const bucket = { 'data-bucket': index };\n\n if (capped) {\n return (\n <g {...bucket}>\n <Rectangle x={x} y={y} width={width} height={h} radius={radius} fill={color} fillOpacity={CAP_BODY} />\n <Rectangle x={x} y={y} width={width} height={Math.min(CAP_HEIGHT, h)} radius={radius} fill={color} />\n </g>\n );\n }\n return (\n <g {...bucket}>\n <Rectangle x={x} y={y} width={width} height={h} radius={radius} fill={fill} />\n </g>\n );\n };\n}\n\n/**\n * Dims every column outside the hovered one, or outside the range being dragged. Its own tiny\n * state, so a move only re-renders this <style> tag: with hundreds of buckets, re-rendering the\n * bars on each move froze the pointer.\n */\nfunction HoverDim({\n scope,\n setter,\n}: {\n scope: string;\n setter: { current: (range: DragSelectionRange | undefined) => void };\n}) {\n const [lit, setLit] = useState<DragSelectionRange>();\n useLayoutEffect(() => {\n setter.current = setLit;\n }, [setter]);\n if (!lit) return null;\n const columns = `[data-chart-scope=\"${scope}\"] [data-bucket]`;\n const kept = Array.from(\n { length: lit.end - lit.start + 1 },\n (_, i) => `${columns}[data-bucket=\"${lit.start + i}\"]`,\n ).join(',');\n return <style>{`${columns}{opacity:${DIMMED}}${kept}{opacity:1}`}</style>;\n}\n\n/** A line drawn over the bars on its own scale, e.g. average wake time over cold starts. */\nexport type MetricsStackedBarChartOverlay = MetricsLineChartSeries & {\n valueFormatter?: (value: number) => string;\n};\n\nexport type MetricsStackedBarChartProps = {\n data: Record<string, unknown>[];\n series: MetricsLineChartSeries[];\n /** Pixels, or `fill` to grow with the parent (a flex column, e.g. a card's content). */\n height?: ChartHeight;\n yDomain?: [number, number];\n /** Formats tooltip values, and y-axis ticks unless `axisFormatter` is set. */\n valueFormatter?: (value: number) => string;\n /** Formats y-axis ticks, when they need a shorter form than the tooltip. */\n axisFormatter?: (value: number) => string;\n showLegend?: boolean;\n referenceLine?: { value: number; label: string; color: string };\n /**\n * `gradient`: segments fade gently toward the base. Reads best for stacks.\n * `capped`: a translucent body under a solid cap that marks the value. Reads best for one\n * value per column.\n */\n variant?: 'gradient' | 'capped';\n /**\n * Set to `false` to drop the y-axis labels and let the plot span the card. The gridlines stay\n * for relative scale; exact values come from the tooltip and the card's summary.\n */\n showYAxis?: boolean;\n /** Adds a \"Total\" row (the column's height) to the tooltip. Defaults to on for stacks. */\n showTotal?: boolean;\n /** Row field printed under the x-axis. */\n xKey?: string;\n /** Row field with the bucket's start time (ms), which places labels on round clock times. */\n timestampKey?: string;\n /** `auto` fits as many labels as the width allows; `edges` prints only the first and last. */\n xLabels?: ChartXLabels;\n /** Row field for the tooltip heading (e.g. a longer date); defaults to the x-axis label. */\n tooltipLabelKey?: string;\n columnLabelKey?: string;\n /** Widest a column gets, in pixels. Defaults to 28; raise it for dense strips of many thin columns. */\n maxBarSize?: number;\n /** Click a column (e.g. to open its traces); the plot shows a pointer cursor. */\n onBucketClick?: (row: Record<string, unknown>, index: number) => void;\n /**\n * Drag across two or more columns to select them (e.g. to zoom into that time span); reports the\n * first and last selected row indices. A press and release on one column stays a click.\n */\n onZoom?: (range: DragSelectionRange) => void;\n /** One dashed line over the bars, on its own hidden scale (e.g. a duration over counts). */\n overlay?: MetricsStackedBarChartOverlay;\n /** Show a ghost of the chart while data loads, in the chart's own footprint. */\n isLoading?: boolean;\n className?: string;\n};\n\nexport function MetricsStackedBarChart(props: MetricsStackedBarChartProps) {\n const { data, series, overlay, height = 210, showLegend = true, isLoading = false, className } = props;\n const id = useChartDefsId();\n const root = cn(height === 'fill' && 'flex min-h-0 flex-1 flex-col', className);\n const legend = overlay ? [...series, { ...overlay, dashed: true }] : series;\n // The legend stays while loading: it comes from the series, not the data.\n return (\n <div className={root} data-chart-scope={id}>\n {showLegend && <MetricsLineChartLegend data={isLoading ? undefined : data} series={legend} className=\"mb-4\" />}\n {isLoading ? <ChartSkeleton kind=\"bar\" height={height} /> : <BarPlot {...props} id={id} />}\n </div>\n );\n}\n\n/** The plot itself, once the data is in; `id` scopes its gradients and hover rule. */\nfunction BarPlot({\n data,\n series,\n height = 210,\n yDomain,\n valueFormatter,\n axisFormatter,\n referenceLine,\n variant = 'gradient',\n showYAxis = true,\n showTotal = series.length > 1,\n xKey = 'time',\n timestampKey = 'tsMs',\n xLabels = 'auto',\n tooltipLabelKey,\n columnLabelKey,\n maxBarSize = 28,\n onBucketClick,\n onZoom,\n overlay,\n id,\n}: MetricsStackedBarChartProps & { id: string }) {\n const setLit = useRef<(range: DragSelectionRange | undefined) => void>(() => {});\n const { size, onResize, ref } = useChartSize();\n // The dragged columns stay lit through the same rule as hover, so a drag never re-renders the bars.\n const selection = useDragSelection({ onSelect: onZoom, onPreview: range => setLit.current(range) });\n\n const keyList = series.map(s => s.dataKey).join('\\u0000');\n const colorList = series.map(s => s.color).join('\\u0000');\n // Stable shapes, so Recharts doesn't re-render every bar when the parent re-renders.\n const shapes = useMemo(() => {\n const keys = keyList.split('\\u0000');\n const colors = colorList.split('\\u0000');\n return keys.map((dataKey, i) =>\n segmentShape({\n fill: `url(#${id}-bar-${i})`,\n color: colors[i] ?? '',\n capped: variant === 'capped',\n keys,\n dataKey,\n }),\n );\n }, [keyList, colorList, variant, id]);\n\n const format = valueFormatter ?? compactNumber.format;\n const plotWidth = size.width - (showYAxis ? Y_AXIS_WIDTH : 0);\n const margin = columnLabelKey ? { ...CHART_MARGIN, top: CHART_MARGIN.top + COLUMN_LABEL_SPACE } : CHART_MARGIN;\n\n return (\n <>\n <HoverDim scope={id} setter={setLit} />\n <ChartPlot\n height={height}\n plotRef={ref}\n onResize={onResize}\n clickable={!!onBucketClick && !selection.enabled}\n className={selection.className}\n >\n <ComposedChart\n data={data}\n margin={margin}\n onMouseDown={selection.onMouseDown}\n onMouseMove={state => {\n if (selection.isDragging()) return selection.onMouseMove(state);\n const index = activeIndex(state);\n setLit.current(index === undefined ? undefined : { start: index, end: index });\n }}\n onMouseLeave={() => {\n // Mid-drag the selection stays lit until the release.\n if (!selection.isDragging()) setLit.current(undefined);\n }}\n onClick={state => {\n if (selection.consumeReleaseClick()) return;\n const i = activeIndex(state);\n const row = i === undefined ? undefined : data[i];\n if (onBucketClick && row && i !== undefined) onBucketClick(row, i);\n }}\n >\n <defs>\n {series.map((s, i) => (\n <linearGradient key={s.dataKey} id={`${id}-bar-${i}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={s.color} stopOpacity={1} />\n <stop offset=\"100%\" stopColor={s.color} stopOpacity={GRADIENT_BASE} />\n </linearGradient>\n ))}\n </defs>\n <CartesianGrid {...CHART_GRID_PROPS} />\n {selection.enabled && <DragSelectionBand selection={selection} count={data.length} />}\n {timeXAxis({ data, xKey, timestampKey, xLabels, plotWidth })}\n {valueYAxis({\n show: showYAxis,\n size,\n formatter: axisFormatter ?? format,\n domain: yDomain,\n // A reference line above the bars stays on the axis.\n max: Math.max(\n dataMax(\n data,\n series.map(s => s.dataKey),\n true,\n ),\n referenceLine?.value ?? 0,\n ),\n integer: isWholeData(\n data,\n series.map(s => s.dataKey),\n ),\n })}\n {overlay &&\n valueYAxis({\n id: 'overlay',\n show: false,\n size,\n formatter: overlay.valueFormatter ?? compactNumber.format,\n max: dataMax(data, [overlay.dataKey]),\n integer: isWholeData(data, [overlay.dataKey]),\n right: true,\n })}\n <Tooltip\n {...CHART_TOOLTIP_PROPS}\n cursor={false}\n content={\n <ChartTooltipPosition>\n <MetricsLineChartTooltip\n formatValue={format}\n showTotal={showTotal && !overlay}\n labelKey={tooltipLabelKey}\n formatByKey={overlay?.valueFormatter ? { [overlay.dataKey]: overlay.valueFormatter } : undefined}\n />\n </ChartTooltipPosition>\n }\n />\n {series.map((s, i) => (\n <Bar\n key={s.dataKey}\n dataKey={s.dataKey}\n name={s.label}\n stackId=\"1\"\n fill={s.color}\n maxBarSize={maxBarSize}\n isAnimationActive={false}\n shape={shapes[i]}\n >\n {columnLabelKey && (\n <LabelList\n dataKey={columnLabelKey}\n content={(props: LabelProps) => (\n <ColumnLabel\n {...props}\n row={data[Number(props.index)]}\n keys={series.map(({ dataKey }) => dataKey)}\n self={i}\n color={s.color}\n />\n )}\n />\n )}\n </Bar>\n ))}\n {overlay && (\n <Line\n yAxisId=\"overlay\"\n type=\"monotone\"\n dataKey={overlay.dataKey}\n name={overlay.label}\n stroke={overlay.color}\n strokeWidth={1.75}\n strokeDasharray=\"4 3\"\n dot={false}\n activeDot={{ r: 3.5, fill: overlay.color, stroke: 'var(--background)', strokeWidth: 2 }}\n isAnimationActive={false}\n connectNulls\n />\n )}\n {referenceLine && (\n <ReferenceLine\n y={referenceLine.value}\n ifOverflow=\"extendDomain\"\n stroke={referenceLine.color}\n strokeDasharray=\"4 4\"\n label={{ value: referenceLine.label, position: 'insideTopLeft', ...CHART_TICK }}\n />\n )}\n </ComposedChart>\n </ChartPlot>\n </>\n );\n}\n\ntype ColumnLabelProps = LabelProps & {\n row: MetricsStackedBarChartProps['data'][number] | undefined;\n keys: string[];\n self: number;\n color: string;\n};\n\nfunction paintedTop(values: number[], self: number, box: SegmentBox) {\n if (values.length > 1) return stackedSegmentBox(values, self, box, { gap: SEGMENT_GAP })?.y;\n return singleBarBox(values[self] ?? 0, box)?.y;\n}\n\nfunction ColumnLabel({ x, y, width, height, value, row, keys, self, color }: ColumnLabelProps) {\n if (value === undefined || value === null || value === '') return null;\n const values = keys.map(key => Number(row?.[key]) || 0);\n const topmost = values.findLastIndex(v => v > 0);\n if (self !== (topmost === -1 ? keys.length - 1 : topmost)) return null;\n const top = paintedTop(values, self, { y: Number(y), height: Math.max(Number(height), 0) }) ?? Number(y);\n return (\n <text\n x={Number(x) + Number(width) / 2}\n y={top - 6}\n textAnchor=\"middle\"\n fontSize={CHART_AXIS_FONT_SIZE}\n fill={color}\n className=\"tabular-nums\"\n >\n {String(value)}\n </text>\n );\n}\n"],"mappings":"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"}
|