@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.
Files changed (1052) hide show
  1. package/dist/AgentIndicator-Bs2S8AWJ.js +847 -0
  2. package/dist/AgentIndicator-Bs2S8AWJ.js.map +1 -0
  3. package/dist/AgentIndicator-to30W73z.cjs +864 -0
  4. package/dist/AgentIndicator-to30W73z.cjs.map +1 -0
  5. package/dist/AgentIndicator.css +28 -0
  6. package/dist/{Arrival-NpBOyV52.js → Arrival-CJFEOXr5.js} +33 -3
  7. package/dist/Arrival-CJFEOXr5.js.map +1 -0
  8. package/dist/{Arrival-Dm6Vgn78.cjs → Arrival-Cs1oWjo4.cjs} +43 -1
  9. package/dist/Arrival-Cs1oWjo4.cjs.map +1 -0
  10. package/dist/{Comment-CUQvfikb.cjs → Comment-KYUQzeSu.cjs} +2 -2
  11. package/dist/{Comment-CUQvfikb.cjs.map → Comment-KYUQzeSu.cjs.map} +1 -1
  12. package/dist/{Comment-CPA3IyPS.js → Comment-VFJq2wRp.js} +2 -2
  13. package/dist/{Comment-CPA3IyPS.js.map → Comment-VFJq2wRp.js.map} +1 -1
  14. package/dist/{DataList-Ve3omCXT.js → DataList-2tIlQsLc.js} +95 -3
  15. package/dist/DataList-2tIlQsLc.js.map +1 -0
  16. package/dist/{DataList-Cmk08jUV.cjs → DataList-Czwmwyvp.cjs} +93 -1
  17. package/dist/DataList-Czwmwyvp.cjs.map +1 -0
  18. package/dist/{DateTimeRangePicker-ByMbLdom.js → DateTimeRangePicker-C_Lie_2P.js} +23 -2
  19. package/dist/DateTimeRangePicker-C_Lie_2P.js.map +1 -0
  20. package/dist/{DateTimeRangePicker-DGbH5WOn.cjs → DateTimeRangePicker-HmPOHwAQ.cjs} +23 -2
  21. package/dist/DateTimeRangePicker-HmPOHwAQ.cjs.map +1 -0
  22. package/dist/{FilterBar-Dk3QEuT6.js → FilterBar--4oguuVe.js} +4 -4
  23. package/dist/FilterBar--4oguuVe.js.map +1 -0
  24. package/dist/{FilterBar-gEvoWDXA.cjs → FilterBar-BUd4f7oi.cjs} +7 -7
  25. package/dist/FilterBar-BUd4f7oi.cjs.map +1 -0
  26. package/dist/GrainFill.css +2 -0
  27. package/dist/{MarkdownRenderer-BgqKfmRm.cjs → MarkdownRenderer-CS6u5drO.cjs} +2 -2
  28. package/dist/{MarkdownRenderer-BgqKfmRm.cjs.map → MarkdownRenderer-CS6u5drO.cjs.map} +1 -1
  29. package/dist/{MarkdownRenderer-DKCDXaLy.js → MarkdownRenderer-DME2xKTk.js} +2 -2
  30. package/dist/{MarkdownRenderer-DKCDXaLy.js.map → MarkdownRenderer-DME2xKTk.js.map} +1 -1
  31. package/dist/{Message-BF9cpYaw.cjs → Message-DsCNQpou.cjs} +2 -2
  32. package/dist/{Message-BF9cpYaw.cjs.map → Message-DsCNQpou.cjs.map} +1 -1
  33. package/dist/{Message-Bkf6Ro9H.js → Message-nVI6tMS3.js} +2 -2
  34. package/dist/{Message-Bkf6Ro9H.js.map → Message-nVI6tMS3.js.map} +1 -1
  35. package/dist/{MetricsCard-Dly_H3oX.cjs → MetricsCard-CEB-f2sv.cjs} +91 -109
  36. package/dist/MetricsCard-CEB-f2sv.cjs.map +1 -0
  37. package/dist/{MetricsCard-C9GWgT58.js → MetricsCard-M8awJ2B_.js} +91 -109
  38. package/dist/MetricsCard-M8awJ2B_.js.map +1 -0
  39. package/dist/{MetricsKpiCard-Uw0nyMgW.cjs → MetricsKpiCard-By_-sagx.cjs} +3 -2
  40. package/dist/{MetricsKpiCard-Uw0nyMgW.cjs.map → MetricsKpiCard-By_-sagx.cjs.map} +1 -1
  41. package/dist/{MetricsKpiCard-Idxjl-dn.js → MetricsKpiCard-OHbAElTl.js} +3 -2
  42. package/dist/{MetricsKpiCard-Idxjl-dn.js.map → MetricsKpiCard-OHbAElTl.js.map} +1 -1
  43. package/dist/{MetricsLineChart-DKzuRU2q.js → MetricsLineChart-BhHoduO0.js} +21 -39
  44. package/dist/MetricsLineChart-BhHoduO0.js.map +1 -0
  45. package/dist/{MetricsLineChart-2m4LVL1N.cjs → MetricsLineChart-CjBm4IXu.cjs} +21 -39
  46. package/dist/MetricsLineChart-CjBm4IXu.cjs.map +1 -0
  47. package/dist/{MetricsStackedBarChart-DJB4aByt.js → MetricsStackedBarChart-BRuA6MTE.js} +2 -3
  48. package/dist/MetricsStackedBarChart-BRuA6MTE.js.map +1 -0
  49. package/dist/{MetricsStackedBarChart-NATtwA_W.cjs → MetricsStackedBarChart-BdMlKv6G.cjs} +2 -3
  50. package/dist/MetricsStackedBarChart-BdMlKv6G.cjs.map +1 -0
  51. package/dist/Notice.css +2 -0
  52. package/dist/Shimmer.css +7 -0
  53. package/dist/{activity-ihrl0JtH.js → activity-CM34JyW-.js} +98 -33
  54. package/dist/activity-CM34JyW-.js.map +1 -0
  55. package/dist/{activity-QyLJcBKc.cjs → activity-DAK8tj7r.cjs} +108 -31
  56. package/dist/activity-DAK8tj7r.cjs.map +1 -0
  57. package/dist/chart-plot.css +15 -0
  58. package/dist/combobox-8kNAJFlj.cjs +309 -0
  59. package/dist/combobox-8kNAJFlj.cjs.map +1 -0
  60. package/dist/{combobox-C-E7_q4j.cjs → combobox-parts-BZVXwbG7.cjs} +7 -300
  61. package/dist/combobox-parts-BZVXwbG7.cjs.map +1 -0
  62. package/dist/{combobox-CDS2pBqz.js → combobox-parts-W7KRQUsV.js} +10 -297
  63. package/dist/combobox-parts-W7KRQUsV.js.map +1 -0
  64. package/dist/combobox-wFudhN8F.js +302 -0
  65. package/dist/combobox-wFudhN8F.js.map +1 -0
  66. package/dist/components/AgentIndicator.cjs.js +5 -0
  67. package/dist/components/AgentIndicator.d.ts +1 -0
  68. package/dist/components/AgentIndicator.es.js +1 -0
  69. package/dist/components/Arrival.cjs.js +3 -1
  70. package/dist/components/Arrival.es.js +1 -1
  71. package/dist/components/Combobox.cjs.js +24 -23
  72. package/dist/components/Combobox.es.js +2 -1
  73. package/dist/components/Comment.cjs.js +1 -1
  74. package/dist/components/Comment.es.js +1 -1
  75. package/dist/components/DataList.cjs.js +2 -2
  76. package/dist/components/DataList.es.js +2 -2
  77. package/dist/components/DateTimeRangePicker.cjs.js +1 -1
  78. package/dist/components/DateTimeRangePicker.es.js +1 -1
  79. package/dist/components/DiffStat.cjs.js +1 -1
  80. package/dist/components/DiffStat.es.js +1 -1
  81. package/dist/components/FilterBar.cjs.js +2 -2
  82. package/dist/components/FilterBar.es.js +2 -2
  83. package/dist/components/LogsDataList.cjs.js +1 -1
  84. package/dist/components/LogsDataList.es.js +1 -1
  85. package/dist/components/MarkdownRenderer.cjs.js +1 -1
  86. package/dist/components/MarkdownRenderer.es.js +1 -1
  87. package/dist/components/Message.cjs.js +1 -1
  88. package/dist/components/Message.es.js +1 -1
  89. package/dist/components/MetricsCard.cjs.js +1 -1
  90. package/dist/components/MetricsCard.es.js +1 -1
  91. package/dist/components/MetricsKpiCard.cjs.js +1 -1
  92. package/dist/components/MetricsKpiCard.es.js +1 -1
  93. package/dist/components/MetricsLineChart.cjs.js +1 -1
  94. package/dist/components/MetricsLineChart.es.js +1 -1
  95. package/dist/components/MetricsStackedBarChart.cjs.js +1 -1
  96. package/dist/components/MetricsStackedBarChart.es.js +1 -1
  97. package/dist/components/PropertyFilter.cjs.js +1 -1
  98. package/dist/components/PropertyFilter.es.js +1 -1
  99. package/dist/components/SavedViews.cjs.js +27 -69
  100. package/dist/components/SavedViews.cjs.js.map +1 -1
  101. package/dist/components/SavedViews.es.js +26 -68
  102. package/dist/components/SavedViews.es.js.map +1 -1
  103. package/dist/components/ai/activity.cjs.js +3 -1
  104. package/dist/components/ai/activity.es.js +1 -1
  105. package/dist/components/ai/message-reveal.cjs.js +2 -1
  106. package/dist/components/ai/message-reveal.cjs.js.map +1 -1
  107. package/dist/components/ai/message-reveal.es.js +2 -1
  108. package/dist/components/ai/message-reveal.es.js.map +1 -1
  109. package/dist/components/ai/plan.cjs.js +1 -1
  110. package/dist/components/ai/plan.es.js +1 -1
  111. package/dist/components/ai/tool-approval.cjs.js +1 -1
  112. package/dist/components/ai/tool-approval.es.js +1 -1
  113. package/dist/components/ai/tool-call.cjs.js +2 -2
  114. package/dist/components/ai/tool-call.es.js +2 -2
  115. package/dist/domains/chat/activity/activity-stretch-line.cjs.js +6 -4
  116. package/dist/domains/chat/activity/activity-stretch-line.cjs.js.map +1 -1
  117. package/dist/domains/chat/activity/activity-stretch-line.es.js +6 -4
  118. package/dist/domains/chat/activity/activity-stretch-line.es.js.map +1 -1
  119. package/dist/domains/chat/activity/components/activity-fold.cjs.js +81 -28
  120. package/dist/domains/chat/activity/components/activity-fold.cjs.js.map +1 -1
  121. package/dist/domains/chat/activity/components/activity-fold.es.js +82 -29
  122. package/dist/domains/chat/activity/components/activity-fold.es.js.map +1 -1
  123. package/dist/domains/chat/activity/components/activity-timed-trigger.cjs.js +1 -1
  124. package/dist/domains/chat/activity/components/activity-timed-trigger.es.js +1 -1
  125. package/dist/domains/chat/activity/components/calls-panel.cjs.js +1 -1
  126. package/dist/domains/chat/activity/components/calls-panel.es.js +1 -1
  127. package/dist/domains/chat/activity/components/stretch-content.cjs.js +1 -1
  128. package/dist/domains/chat/activity/components/stretch-content.es.js +1 -1
  129. package/dist/domains/chat/activity/components/stretch-thought.cjs.js +1 -1
  130. package/dist/domains/chat/activity/components/stretch-thought.es.js +1 -1
  131. package/dist/domains/chat/activity/components/use-fading-edge.cjs.js +26 -0
  132. package/dist/domains/chat/activity/components/use-fading-edge.cjs.js.map +1 -0
  133. package/dist/domains/chat/activity/components/use-fading-edge.d.ts +1 -0
  134. package/dist/domains/chat/activity/components/use-fading-edge.es.js +25 -0
  135. package/dist/domains/chat/activity/components/use-fading-edge.es.js.map +1 -0
  136. package/dist/domains/chat/activity/components/use-rolling-words.cjs.js +123 -0
  137. package/dist/domains/chat/activity/components/use-rolling-words.cjs.js.map +1 -0
  138. package/dist/domains/chat/activity/components/use-rolling-words.d.ts +1 -0
  139. package/dist/domains/chat/activity/components/use-rolling-words.es.js +122 -0
  140. package/dist/domains/chat/activity/components/use-rolling-words.es.js.map +1 -0
  141. package/dist/domains/chat/activity/model/activity-segments.cjs.js +1 -1
  142. package/dist/domains/chat/activity/model/activity-segments.es.js +1 -1
  143. package/dist/domains/chat/activity/model/activity-words.cjs.js +16 -6
  144. package/dist/domains/chat/activity/model/activity-words.cjs.js.map +1 -1
  145. package/dist/domains/chat/activity/model/activity-words.es.js +15 -7
  146. package/dist/domains/chat/activity/model/activity-words.es.js.map +1 -1
  147. package/dist/domains/chat/activity.cjs.js +3 -0
  148. package/dist/domains/chat/activity.es.js +2 -1
  149. package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
  150. package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
  151. package/dist/domains/chat/messages/assistant-message-actions.cjs.js +1 -1
  152. package/dist/domains/chat/messages/assistant-message-actions.es.js +1 -1
  153. package/dist/domains/chat/messages/message-row.cjs.js +4 -4
  154. package/dist/domains/chat/messages/message-row.es.js +4 -4
  155. package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
  156. package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
  157. package/dist/domains/chat/messages/reasoning-content.cjs.js +1 -1
  158. package/dist/domains/chat/messages/reasoning-content.es.js +1 -1
  159. package/dist/domains/chat/messages/renderers/message-text.cjs.js +1 -1
  160. package/dist/domains/chat/messages/renderers/message-text.es.js +1 -1
  161. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js +1 -1
  162. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js +1 -1
  163. package/dist/domains/chat/messages/renderers/tool-part.cjs.js +18 -0
  164. package/dist/domains/chat/messages/renderers/tool-part.cjs.js.map +1 -1
  165. package/dist/domains/chat/messages/renderers/tool-part.es.js +18 -0
  166. package/dist/domains/chat/messages/renderers/tool-part.es.js.map +1 -1
  167. package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
  168. package/dist/domains/chat/messages/signal-badge.es.js +1 -1
  169. package/dist/domains/chat/messages/skill-message.cjs.js +10 -7
  170. package/dist/domains/chat/messages/skill-message.cjs.js.map +1 -1
  171. package/dist/domains/chat/messages/skill-message.es.js +10 -7
  172. package/dist/domains/chat/messages/skill-message.es.js.map +1 -1
  173. package/dist/domains/chat/messages/system-reminder-badge.cjs.js +1 -1
  174. package/dist/domains/chat/messages/system-reminder-badge.es.js +1 -1
  175. package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
  176. package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
  177. package/dist/domains/chat/tools/badges/agent-badge.cjs.js +1 -1
  178. package/dist/domains/chat/tools/badges/agent-badge.es.js +1 -1
  179. package/dist/domains/chat/tools/badges/file-tree-badge.cjs.js +2 -2
  180. package/dist/domains/chat/tools/badges/file-tree-badge.es.js +2 -2
  181. package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js +111 -0
  182. package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js.map +1 -0
  183. package/dist/domains/chat/tools/badges/mcp-task-chip.d.ts +1 -0
  184. package/dist/domains/chat/tools/badges/mcp-task-chip.es.js +109 -0
  185. package/dist/domains/chat/tools/badges/mcp-task-chip.es.js.map +1 -0
  186. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +8 -6
  187. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js.map +1 -1
  188. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +9 -7
  189. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js.map +1 -1
  190. package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js +2 -3
  191. package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js.map +1 -1
  192. package/dist/domains/chat/tools/badges/observation-marker-details.es.js +2 -3
  193. package/dist/domains/chat/tools/badges/observation-marker-details.es.js.map +1 -1
  194. package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
  195. package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
  196. package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js +2 -2
  197. package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +2 -2
  198. package/dist/domains/chat/tools/badges/tool-approval-badge.cjs.js +1 -1
  199. package/dist/domains/chat/tools/badges/tool-approval-badge.es.js +1 -1
  200. package/dist/domains/chat/tools/badges/tool-badge.cjs.js +10 -4
  201. package/dist/domains/chat/tools/badges/tool-badge.cjs.js.map +1 -1
  202. package/dist/domains/chat/tools/badges/tool-badge.es.js +10 -4
  203. package/dist/domains/chat/tools/badges/tool-badge.es.js.map +1 -1
  204. package/dist/domains/chat/tools/badges/use-mcp-task-progress.cjs.js +51 -0
  205. package/dist/domains/chat/tools/badges/use-mcp-task-progress.cjs.js.map +1 -0
  206. package/dist/domains/chat/tools/badges/use-mcp-task-progress.d.ts +1 -0
  207. package/dist/domains/chat/tools/badges/use-mcp-task-progress.es.js +49 -0
  208. package/dist/domains/chat/tools/badges/use-mcp-task-progress.es.js.map +1 -0
  209. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +1 -1
  210. package/dist/domains/chat/tools/badges/workflow-badge.es.js +1 -1
  211. package/dist/domains/chat/tools/tool-card-kind.cjs.js +1 -1
  212. package/dist/domains/chat/tools/tool-card-kind.es.js +1 -1
  213. package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
  214. package/dist/domains/chat/tools/tool-card.es.js +1 -1
  215. package/dist/domains/chat/tools/tool-groups.cjs.js +1 -1
  216. package/dist/domains/chat/tools/tool-groups.es.js +1 -1
  217. package/dist/domains/dashboards/components/dashboard-grid.cjs.js +44 -0
  218. package/dist/domains/dashboards/components/dashboard-grid.cjs.js.map +1 -0
  219. package/dist/domains/dashboards/components/dashboard-grid.d.ts +1 -0
  220. package/dist/domains/dashboards/components/dashboard-grid.es.js +41 -0
  221. package/dist/domains/dashboards/components/dashboard-grid.es.js.map +1 -0
  222. package/dist/domains/dashboards/components/dashboard-renderer.cjs.js +72 -0
  223. package/dist/domains/dashboards/components/dashboard-renderer.cjs.js.map +1 -0
  224. package/dist/domains/dashboards/components/dashboard-renderer.d.ts +1 -0
  225. package/dist/domains/dashboards/components/dashboard-renderer.es.js +71 -0
  226. package/dist/domains/dashboards/components/dashboard-renderer.es.js.map +1 -0
  227. package/dist/domains/dashboards/components/view-gate.cjs.js +55 -0
  228. package/dist/domains/dashboards/components/view-gate.cjs.js.map +1 -0
  229. package/dist/domains/dashboards/components/view-gate.d.ts +1 -0
  230. package/dist/domains/dashboards/components/view-gate.es.js +54 -0
  231. package/dist/domains/dashboards/components/view-gate.es.js.map +1 -0
  232. package/dist/domains/dashboards/components/widget-chrome.cjs.js +16 -0
  233. package/dist/domains/dashboards/components/widget-chrome.cjs.js.map +1 -0
  234. package/dist/domains/dashboards/components/widget-chrome.d.ts +1 -0
  235. package/dist/domains/dashboards/components/widget-chrome.es.js +15 -0
  236. package/dist/domains/dashboards/components/widget-chrome.es.js.map +1 -0
  237. package/dist/domains/dashboards/components/widget-controls.cjs.js +21 -0
  238. package/dist/domains/dashboards/components/widget-controls.cjs.js.map +1 -0
  239. package/dist/domains/dashboards/components/widget-controls.d.ts +1 -0
  240. package/dist/domains/dashboards/components/widget-controls.es.js +20 -0
  241. package/dist/domains/dashboards/components/widget-controls.es.js.map +1 -0
  242. package/dist/domains/dashboards/components/widget-error.cjs.js +18 -0
  243. package/dist/domains/dashboards/components/widget-error.cjs.js.map +1 -0
  244. package/dist/domains/dashboards/components/widget-error.d.ts +1 -0
  245. package/dist/domains/dashboards/components/widget-error.es.js +17 -0
  246. package/dist/domains/dashboards/components/widget-error.es.js.map +1 -0
  247. package/dist/domains/dashboards/hooks/use-dashboard-requests.cjs.js +47 -0
  248. package/dist/domains/dashboards/hooks/use-dashboard-requests.cjs.js.map +1 -0
  249. package/dist/domains/dashboards/hooks/use-dashboard-requests.d.ts +1 -0
  250. package/dist/domains/dashboards/hooks/use-dashboard-requests.es.js +46 -0
  251. package/dist/domains/dashboards/hooks/use-dashboard-requests.es.js.map +1 -0
  252. package/dist/domains/dashboards/hooks/use-scorers.cjs.js +41 -0
  253. package/dist/domains/dashboards/hooks/use-scorers.cjs.js.map +1 -0
  254. package/dist/domains/dashboards/hooks/use-scorers.d.ts +1 -0
  255. package/dist/domains/dashboards/hooks/use-scorers.es.js +40 -0
  256. package/dist/domains/dashboards/hooks/use-scorers.es.js.map +1 -0
  257. package/dist/domains/dashboards/hooks/use-widget-views.cjs.js +35 -0
  258. package/dist/domains/dashboards/hooks/use-widget-views.cjs.js.map +1 -0
  259. package/dist/domains/dashboards/hooks/use-widget-views.d.ts +1 -0
  260. package/dist/domains/dashboards/hooks/use-widget-views.es.js +32 -0
  261. package/dist/domains/dashboards/hooks/use-widget-views.es.js.map +1 -0
  262. package/dist/domains/dashboards/kinds/kpis/kpis-widget.cjs.js +63 -0
  263. package/dist/domains/dashboards/kinds/kpis/kpis-widget.cjs.js.map +1 -0
  264. package/dist/domains/dashboards/kinds/kpis/kpis-widget.d.ts +1 -0
  265. package/dist/domains/dashboards/kinds/kpis/kpis-widget.es.js +62 -0
  266. package/dist/domains/dashboards/kinds/kpis/kpis-widget.es.js.map +1 -0
  267. package/dist/domains/dashboards/kinds/kpis/options.cjs.js +72 -0
  268. package/dist/domains/dashboards/kinds/kpis/options.cjs.js.map +1 -0
  269. package/dist/domains/dashboards/kinds/kpis/options.d.ts +1 -0
  270. package/dist/domains/dashboards/kinds/kpis/options.es.js +69 -0
  271. package/dist/domains/dashboards/kinds/kpis/options.es.js.map +1 -0
  272. package/dist/domains/dashboards/kinds/kpis.cjs.js +17 -0
  273. package/dist/domains/dashboards/kinds/kpis.cjs.js.map +1 -0
  274. package/dist/domains/dashboards/kinds/kpis.d.ts +1 -0
  275. package/dist/domains/dashboards/kinds/kpis.es.js +14 -0
  276. package/dist/domains/dashboards/kinds/kpis.es.js.map +1 -0
  277. package/dist/domains/dashboards/kinds/scores/options.cjs.js +30 -0
  278. package/dist/domains/dashboards/kinds/scores/options.cjs.js.map +1 -0
  279. package/dist/domains/dashboards/kinds/scores/options.d.ts +1 -0
  280. package/dist/domains/dashboards/kinds/scores/options.es.js +28 -0
  281. package/dist/domains/dashboards/kinds/scores/options.es.js.map +1 -0
  282. package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js +91 -0
  283. package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js.map +1 -0
  284. package/dist/domains/dashboards/kinds/scores/scores-widget.d.ts +1 -0
  285. package/dist/domains/dashboards/kinds/scores/scores-widget.es.js +90 -0
  286. package/dist/domains/dashboards/kinds/scores/scores-widget.es.js.map +1 -0
  287. package/dist/domains/dashboards/kinds/scores.cjs.js +16 -0
  288. package/dist/domains/dashboards/kinds/scores.cjs.js.map +1 -0
  289. package/dist/domains/dashboards/kinds/scores.d.ts +1 -0
  290. package/dist/domains/dashboards/kinds/scores.es.js +14 -0
  291. package/dist/domains/dashboards/kinds/scores.es.js.map +1 -0
  292. package/dist/domains/dashboards/kinds/table/table-cells.cjs.js +67 -0
  293. package/dist/domains/dashboards/kinds/table/table-cells.cjs.js.map +1 -0
  294. package/dist/domains/dashboards/kinds/table/table-cells.d.ts +1 -0
  295. package/dist/domains/dashboards/kinds/table/table-cells.es.js +63 -0
  296. package/dist/domains/dashboards/kinds/table/table-cells.es.js.map +1 -0
  297. package/dist/domains/dashboards/kinds/table/table-columns.cjs.js +72 -0
  298. package/dist/domains/dashboards/kinds/table/table-columns.cjs.js.map +1 -0
  299. package/dist/domains/dashboards/kinds/table/table-columns.d.ts +1 -0
  300. package/dist/domains/dashboards/kinds/table/table-columns.es.js +71 -0
  301. package/dist/domains/dashboards/kinds/table/table-columns.es.js.map +1 -0
  302. package/dist/domains/dashboards/kinds/table/table-frame.cjs.js +16 -0
  303. package/dist/domains/dashboards/kinds/table/table-frame.cjs.js.map +1 -0
  304. package/dist/domains/dashboards/kinds/table/table-frame.d.ts +1 -0
  305. package/dist/domains/dashboards/kinds/table/table-frame.es.js +15 -0
  306. package/dist/domains/dashboards/kinds/table/table-frame.es.js.map +1 -0
  307. package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js +55 -0
  308. package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js.map +1 -0
  309. package/dist/domains/dashboards/kinds/table/table-tabs.d.ts +1 -0
  310. package/dist/domains/dashboards/kinds/table/table-tabs.es.js +54 -0
  311. package/dist/domains/dashboards/kinds/table/table-tabs.es.js.map +1 -0
  312. package/dist/domains/dashboards/kinds/table/table-view.cjs.js +80 -0
  313. package/dist/domains/dashboards/kinds/table/table-view.cjs.js.map +1 -0
  314. package/dist/domains/dashboards/kinds/table/table-view.d.ts +1 -0
  315. package/dist/domains/dashboards/kinds/table/table-view.es.js +79 -0
  316. package/dist/domains/dashboards/kinds/table/table-view.es.js.map +1 -0
  317. package/dist/domains/dashboards/kinds/table/table-widget.cjs.js +30 -0
  318. package/dist/domains/dashboards/kinds/table/table-widget.cjs.js.map +1 -0
  319. package/dist/domains/dashboards/kinds/table/table-widget.d.ts +1 -0
  320. package/dist/domains/dashboards/kinds/table/table-widget.es.js +29 -0
  321. package/dist/domains/dashboards/kinds/table/table-widget.es.js.map +1 -0
  322. package/dist/domains/dashboards/kinds/table.cjs.js +17 -0
  323. package/dist/domains/dashboards/kinds/table.cjs.js.map +1 -0
  324. package/dist/domains/dashboards/kinds/table.d.ts +1 -0
  325. package/dist/domains/dashboards/kinds/table.es.js +14 -0
  326. package/dist/domains/dashboards/kinds/table.es.js.map +1 -0
  327. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js +115 -0
  328. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js.map +1 -0
  329. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.d.ts +1 -0
  330. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js +114 -0
  331. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js.map +1 -0
  332. package/dist/domains/dashboards/kinds/timeseries.cjs.js +15 -0
  333. package/dist/domains/dashboards/kinds/timeseries.cjs.js.map +1 -0
  334. package/dist/domains/dashboards/kinds/timeseries.d.ts +1 -0
  335. package/dist/domains/dashboards/kinds/timeseries.es.js +14 -0
  336. package/dist/domains/dashboards/kinds/timeseries.es.js.map +1 -0
  337. package/dist/domains/dashboards/kinds.cjs.js +20 -0
  338. package/dist/domains/dashboards/kinds.cjs.js.map +1 -0
  339. package/dist/domains/dashboards/kinds.d.ts +1 -0
  340. package/dist/domains/dashboards/kinds.es.js +15 -0
  341. package/dist/domains/dashboards/kinds.es.js.map +1 -0
  342. package/dist/domains/dashboards/lib/answers.cjs.js +42 -0
  343. package/dist/domains/dashboards/lib/answers.cjs.js.map +1 -0
  344. package/dist/domains/dashboards/lib/answers.d.ts +1 -0
  345. package/dist/domains/dashboards/lib/answers.es.js +37 -0
  346. package/dist/domains/dashboards/lib/answers.es.js.map +1 -0
  347. package/dist/domains/dashboards/lib/chrome.cjs.js +41 -0
  348. package/dist/domains/dashboards/lib/chrome.cjs.js.map +1 -0
  349. package/dist/domains/dashboards/lib/chrome.d.ts +1 -0
  350. package/dist/domains/dashboards/lib/chrome.es.js +37 -0
  351. package/dist/domains/dashboards/lib/chrome.es.js.map +1 -0
  352. package/dist/domains/dashboards/lib/definition.cjs.js +59 -0
  353. package/dist/domains/dashboards/lib/definition.cjs.js.map +1 -0
  354. package/dist/domains/dashboards/lib/definition.d.ts +1 -0
  355. package/dist/domains/dashboards/lib/definition.es.js +55 -0
  356. package/dist/domains/dashboards/lib/definition.es.js.map +1 -0
  357. package/dist/domains/dashboards/lib/filters.cjs.js +44 -0
  358. package/dist/domains/dashboards/lib/filters.cjs.js.map +1 -0
  359. package/dist/domains/dashboards/lib/filters.d.ts +1 -0
  360. package/dist/domains/dashboards/lib/filters.es.js +43 -0
  361. package/dist/domains/dashboards/lib/filters.es.js.map +1 -0
  362. package/dist/domains/dashboards/lib/format.cjs.js +32 -0
  363. package/dist/domains/dashboards/lib/format.cjs.js.map +1 -0
  364. package/dist/domains/dashboards/lib/format.d.ts +1 -0
  365. package/dist/domains/dashboards/lib/format.es.js +30 -0
  366. package/dist/domains/dashboards/lib/format.es.js.map +1 -0
  367. package/dist/domains/dashboards/lib/prepare-widget.cjs.js +77 -0
  368. package/dist/domains/dashboards/lib/prepare-widget.cjs.js.map +1 -0
  369. package/dist/domains/dashboards/lib/prepare-widget.d.ts +1 -0
  370. package/dist/domains/dashboards/lib/prepare-widget.es.js +75 -0
  371. package/dist/domains/dashboards/lib/prepare-widget.es.js.map +1 -0
  372. package/dist/domains/dashboards/lib/requests.cjs.js +279 -0
  373. package/dist/domains/dashboards/lib/requests.cjs.js.map +1 -0
  374. package/dist/domains/dashboards/lib/requests.d.ts +1 -0
  375. package/dist/domains/dashboards/lib/requests.es.js +273 -0
  376. package/dist/domains/dashboards/lib/requests.es.js.map +1 -0
  377. package/dist/domains/dashboards/lib/scores.cjs.js +58 -0
  378. package/dist/domains/dashboards/lib/scores.cjs.js.map +1 -0
  379. package/dist/domains/dashboards/lib/scores.d.ts +1 -0
  380. package/dist/domains/dashboards/lib/scores.es.js +53 -0
  381. package/dist/domains/dashboards/lib/scores.es.js.map +1 -0
  382. package/dist/domains/dashboards/lib/table.cjs.js +408 -0
  383. package/dist/domains/dashboards/lib/table.cjs.js.map +1 -0
  384. package/dist/domains/dashboards/lib/table.d.ts +1 -0
  385. package/dist/domains/dashboards/lib/table.es.js +388 -0
  386. package/dist/domains/dashboards/lib/table.es.js.map +1 -0
  387. package/dist/domains/dashboards/lib/timeseries.cjs.js +192 -0
  388. package/dist/domains/dashboards/lib/timeseries.cjs.js.map +1 -0
  389. package/dist/domains/dashboards/lib/timeseries.d.ts +1 -0
  390. package/dist/domains/dashboards/lib/timeseries.es.js +188 -0
  391. package/dist/domains/dashboards/lib/timeseries.es.js.map +1 -0
  392. package/dist/domains/dashboards/lib/values.cjs.js +155 -0
  393. package/dist/domains/dashboards/lib/values.cjs.js.map +1 -0
  394. package/dist/domains/dashboards/lib/values.d.ts +1 -0
  395. package/dist/domains/dashboards/lib/values.es.js +142 -0
  396. package/dist/domains/dashboards/lib/values.es.js.map +1 -0
  397. package/dist/domains/dashboards/metrics-dashboard.cjs.js +737 -0
  398. package/dist/domains/dashboards/metrics-dashboard.cjs.js.map +1 -0
  399. package/dist/domains/dashboards/metrics-dashboard.d.ts +1 -0
  400. package/dist/domains/dashboards/metrics-dashboard.es.js +736 -0
  401. package/dist/domains/dashboards/metrics-dashboard.es.js.map +1 -0
  402. package/dist/domains/dashboards/widget-kind.cjs.js +7 -0
  403. package/dist/domains/dashboards/widget-kind.cjs.js.map +1 -0
  404. package/dist/domains/dashboards/widget-kind.d.ts +1 -0
  405. package/dist/domains/dashboards/widget-kind.es.js +6 -0
  406. package/dist/domains/dashboards/widget-kind.es.js.map +1 -0
  407. package/dist/domains/dashboards.cjs.js +39 -0
  408. package/dist/domains/dashboards.d.ts +1 -0
  409. package/dist/domains/dashboards.es.js +18 -0
  410. package/dist/domains/logs/components/logs-list-view.cjs.js +1 -1
  411. package/dist/domains/logs/components/logs-list-view.es.js +1 -1
  412. package/dist/domains/logs/components/logs-saved-views.cjs.js +14 -0
  413. package/dist/domains/logs/components/logs-saved-views.cjs.js.map +1 -0
  414. package/dist/domains/logs/components/logs-saved-views.d.ts +1 -0
  415. package/dist/domains/logs/components/logs-saved-views.es.js +13 -0
  416. package/dist/domains/logs/components/logs-saved-views.es.js.map +1 -0
  417. package/dist/domains/logs/components.cjs.js +2 -0
  418. package/dist/domains/logs/components.es.js +2 -1
  419. package/dist/domains/logs/hooks/use-logs-url-state.cjs.js +1 -1
  420. package/dist/domains/logs/hooks/use-logs-url-state.cjs.js.map +1 -1
  421. package/dist/domains/logs/hooks/use-logs-url-state.es.js +2 -2
  422. package/dist/domains/logs/hooks/use-logs-url-state.es.js.map +1 -1
  423. package/dist/domains/logs/log-filters.cjs.js +11 -0
  424. package/dist/domains/logs/log-filters.cjs.js.map +1 -1
  425. package/dist/domains/logs/log-filters.es.js +9 -1
  426. package/dist/domains/logs/log-filters.es.js.map +1 -1
  427. package/dist/domains/logs.cjs.js +6 -1
  428. package/dist/domains/logs.es.js +3 -2
  429. package/dist/domains/metrics/components/agent-runs-card.cjs.js +38 -15
  430. package/dist/domains/metrics/components/agent-runs-card.cjs.js.map +1 -1
  431. package/dist/domains/metrics/components/agent-runs-card.es.js +38 -15
  432. package/dist/domains/metrics/components/agent-runs-card.es.js.map +1 -1
  433. package/dist/domains/metrics/components/breakdown/breakdown-change-cell.cjs.js +4 -11
  434. package/dist/domains/metrics/components/breakdown/breakdown-change-cell.cjs.js.map +1 -1
  435. package/dist/domains/metrics/components/breakdown/breakdown-change-cell.es.js +4 -11
  436. package/dist/domains/metrics/components/breakdown/breakdown-change-cell.es.js.map +1 -1
  437. package/dist/domains/metrics/components/breakdown/breakdown-cost-cell.cjs.js +2 -4
  438. package/dist/domains/metrics/components/breakdown/breakdown-cost-cell.cjs.js.map +1 -1
  439. package/dist/domains/metrics/components/breakdown/breakdown-cost-cell.es.js +2 -4
  440. package/dist/domains/metrics/components/breakdown/breakdown-cost-cell.es.js.map +1 -1
  441. package/dist/domains/metrics/components/breakdown/breakdown-entity-tab.cjs.js +1 -1
  442. package/dist/domains/metrics/components/breakdown/breakdown-entity-tab.es.js +1 -1
  443. package/dist/domains/metrics/components/breakdown/breakdown-frame.cjs.js +16 -27
  444. package/dist/domains/metrics/components/breakdown/breakdown-frame.cjs.js.map +1 -1
  445. package/dist/domains/metrics/components/breakdown/breakdown-frame.es.js +16 -27
  446. package/dist/domains/metrics/components/breakdown/breakdown-frame.es.js.map +1 -1
  447. package/dist/domains/metrics/components/breakdown/breakdown-models-tab.cjs.js +1 -1
  448. package/dist/domains/metrics/components/breakdown/breakdown-models-tab.es.js +1 -1
  449. package/dist/domains/metrics/components/breakdown/breakdown-name.cjs.js +22 -0
  450. package/dist/domains/metrics/components/breakdown/breakdown-name.cjs.js.map +1 -0
  451. package/dist/domains/metrics/components/breakdown/breakdown-name.d.ts +1 -0
  452. package/dist/domains/metrics/components/breakdown/breakdown-name.es.js +21 -0
  453. package/dist/domains/metrics/components/breakdown/breakdown-name.es.js.map +1 -0
  454. package/dist/domains/metrics/components/breakdown/breakdown-not-priced.cjs.js +13 -0
  455. package/dist/domains/metrics/components/breakdown/breakdown-not-priced.cjs.js.map +1 -0
  456. package/dist/domains/metrics/components/breakdown/breakdown-not-priced.d.ts +1 -0
  457. package/dist/domains/metrics/components/breakdown/breakdown-not-priced.es.js +12 -0
  458. package/dist/domains/metrics/components/breakdown/breakdown-not-priced.es.js.map +1 -0
  459. package/dist/domains/metrics/components/breakdown/breakdown-projects-first.cjs.js +1 -1
  460. package/dist/domains/metrics/components/breakdown/breakdown-projects-first.es.js +1 -1
  461. package/dist/domains/metrics/components/breakdown/breakdown-row-mark.cjs.js +26 -13
  462. package/dist/domains/metrics/components/breakdown/breakdown-row-mark.cjs.js.map +1 -1
  463. package/dist/domains/metrics/components/breakdown/breakdown-row-mark.es.js +25 -14
  464. package/dist/domains/metrics/components/breakdown/breakdown-row-mark.es.js.map +1 -1
  465. package/dist/domains/metrics/components/breakdown/breakdown-row-name.cjs.js +10 -13
  466. package/dist/domains/metrics/components/breakdown/breakdown-row-name.cjs.js.map +1 -1
  467. package/dist/domains/metrics/components/breakdown/breakdown-row-name.es.js +11 -14
  468. package/dist/domains/metrics/components/breakdown/breakdown-row-name.es.js.map +1 -1
  469. package/dist/domains/metrics/components/breakdown/breakdown-tab-body.cjs.js +1 -1
  470. package/dist/domains/metrics/components/breakdown/breakdown-tab-body.es.js +1 -1
  471. package/dist/domains/metrics/components/breakdown/breakdown-table.cjs.js +5 -5
  472. package/dist/domains/metrics/components/breakdown/breakdown-table.es.js +5 -5
  473. package/dist/domains/metrics/components/breakdown/breakdown-trace-tab.cjs.js +1 -1
  474. package/dist/domains/metrics/components/breakdown/breakdown-trace-tab.es.js +1 -1
  475. package/dist/domains/metrics/components/breakdown/breakdown-trend-text.cjs.js +25 -0
  476. package/dist/domains/metrics/components/breakdown/breakdown-trend-text.cjs.js.map +1 -0
  477. package/dist/domains/metrics/components/breakdown/breakdown-trend-text.d.ts +1 -0
  478. package/dist/domains/metrics/components/breakdown/breakdown-trend-text.es.js +24 -0
  479. package/dist/domains/metrics/components/breakdown/breakdown-trend-text.es.js.map +1 -0
  480. package/dist/domains/metrics/components/breakdown-card.cjs.js +3 -3
  481. package/dist/domains/metrics/components/breakdown-card.es.js +3 -3
  482. package/dist/domains/metrics/components/card-action-buttons.cjs.js +43 -3
  483. package/dist/domains/metrics/components/card-action-buttons.cjs.js.map +1 -1
  484. package/dist/domains/metrics/components/card-action-buttons.es.js +42 -5
  485. package/dist/domains/metrics/components/card-action-buttons.es.js.map +1 -1
  486. package/dist/domains/metrics/components/chart-area.cjs.js +1 -1
  487. package/dist/domains/metrics/components/chart-area.es.js +1 -1
  488. package/dist/domains/metrics/components/chart-card-error.cjs.js +1 -1
  489. package/dist/domains/metrics/components/chart-card-error.es.js +1 -1
  490. package/dist/domains/metrics/components/chart-card.cjs.js +39 -38
  491. package/dist/domains/metrics/components/chart-card.cjs.js.map +1 -1
  492. package/dist/domains/metrics/components/chart-card.es.js +39 -38
  493. package/dist/domains/metrics/components/chart-card.es.js.map +1 -1
  494. package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
  495. package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
  496. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js +15 -16
  497. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js.map +1 -1
  498. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js +16 -16
  499. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js.map +1 -1
  500. package/dist/domains/metrics/components/distinct-ids-card.cjs.js +0 -1
  501. package/dist/domains/metrics/components/distinct-ids-card.cjs.js.map +1 -1
  502. package/dist/domains/metrics/components/distinct-ids-card.es.js +1 -2
  503. package/dist/domains/metrics/components/distinct-ids-card.es.js.map +1 -1
  504. package/dist/domains/metrics/components/failure-rate-card.cjs.js +11 -14
  505. package/dist/domains/metrics/components/failure-rate-card.cjs.js.map +1 -1
  506. package/dist/domains/metrics/components/failure-rate-card.es.js +11 -14
  507. package/dist/domains/metrics/components/failure-rate-card.es.js.map +1 -1
  508. package/dist/domains/metrics/components/kpi-card.cjs.js +8 -5
  509. package/dist/domains/metrics/components/kpi-card.cjs.js.map +1 -1
  510. package/dist/domains/metrics/components/kpi-card.es.js +8 -5
  511. package/dist/domains/metrics/components/kpi-card.es.js.map +1 -1
  512. package/dist/domains/metrics/components/latency-card.cjs.js +33 -30
  513. package/dist/domains/metrics/components/latency-card.cjs.js.map +1 -1
  514. package/dist/domains/metrics/components/latency-card.es.js +34 -31
  515. package/dist/domains/metrics/components/latency-card.es.js.map +1 -1
  516. package/dist/domains/metrics/components/metrics-grid/metrics-grid.cjs.js +5 -2
  517. package/dist/domains/metrics/components/metrics-grid/metrics-grid.cjs.js.map +1 -1
  518. package/dist/domains/metrics/components/metrics-grid/metrics-grid.es.js +5 -2
  519. package/dist/domains/metrics/components/metrics-grid/metrics-grid.es.js.map +1 -1
  520. package/dist/domains/metrics/components/scores-card.cjs.js +7 -17
  521. package/dist/domains/metrics/components/scores-card.cjs.js.map +1 -1
  522. package/dist/domains/metrics/components/scores-card.es.js +7 -17
  523. package/dist/domains/metrics/components/scores-card.es.js.map +1 -1
  524. package/dist/domains/metrics/components/token-usage-card.cjs.js +29 -26
  525. package/dist/domains/metrics/components/token-usage-card.cjs.js.map +1 -1
  526. package/dist/domains/metrics/components/token-usage-card.es.js +30 -27
  527. package/dist/domains/metrics/components/token-usage-card.es.js.map +1 -1
  528. package/dist/domains/metrics/components/trace-aggregate-card.cjs.js +3 -2
  529. package/dist/domains/metrics/components/trace-aggregate-card.cjs.js.map +1 -1
  530. package/dist/domains/metrics/components/trace-aggregate-card.es.js +3 -2
  531. package/dist/domains/metrics/components/trace-aggregate-card.es.js.map +1 -1
  532. package/dist/domains/metrics/components/trace-volume-card.cjs.js +31 -35
  533. package/dist/domains/metrics/components/trace-volume-card.cjs.js.map +1 -1
  534. package/dist/domains/metrics/components/trace-volume-card.es.js +31 -35
  535. package/dist/domains/metrics/components/trace-volume-card.es.js.map +1 -1
  536. package/dist/domains/metrics/components/usage-card.cjs.js +29 -28
  537. package/dist/domains/metrics/components/usage-card.cjs.js.map +1 -1
  538. package/dist/domains/metrics/components/usage-card.es.js +30 -29
  539. package/dist/domains/metrics/components/usage-card.es.js.map +1 -1
  540. package/dist/domains/metrics/components.cjs.js +6 -5
  541. package/dist/domains/metrics/components.es.js +4 -5
  542. package/dist/domains/metrics/drilldown.cjs.js +1 -1
  543. package/dist/domains/metrics/drilldown.es.js +1 -1
  544. package/dist/domains/metrics/hooks/use-metrics-activity.cjs.js +1 -1
  545. package/dist/domains/metrics/hooks/use-metrics-activity.es.js +1 -1
  546. package/dist/domains/metrics/hooks/use-metrics-latency.cjs.js +1 -1
  547. package/dist/domains/metrics/hooks/use-metrics-latency.es.js +1 -1
  548. package/dist/domains/metrics/hooks/use-metrics-scores.cjs.js +1 -1
  549. package/dist/domains/metrics/hooks/use-metrics-scores.es.js +1 -1
  550. package/dist/domains/metrics/hooks/use-metrics-span-aggregate.cjs.js +1 -1
  551. package/dist/domains/metrics/hooks/use-metrics-span-aggregate.es.js +1 -1
  552. package/dist/domains/metrics/hooks.cjs.js +1 -1
  553. package/dist/domains/metrics/hooks.es.js +1 -1
  554. package/dist/domains/metrics/lib/breakdown-table.cjs.js +2 -2
  555. package/dist/domains/metrics/lib/breakdown-table.es.js +2 -2
  556. package/dist/domains/metrics/lib.cjs.js +2 -2
  557. package/dist/domains/metrics/lib.es.js +2 -2
  558. package/dist/domains/metrics/metrics-filters.cjs.js +1 -1
  559. package/dist/domains/metrics/metrics-filters.es.js +1 -1
  560. package/dist/domains/metrics.cjs.js +14 -13
  561. package/dist/domains/metrics.es.js +12 -13
  562. package/dist/domains/observability/components/observability-header-slot.cjs.js +13 -0
  563. package/dist/domains/observability/components/observability-header-slot.cjs.js.map +1 -0
  564. package/dist/domains/observability/components/observability-header-slot.d.ts +1 -0
  565. package/dist/domains/observability/components/observability-header-slot.es.js +11 -0
  566. package/dist/domains/observability/components/observability-header-slot.es.js.map +1 -0
  567. package/dist/domains/observability/components/observability-histogram.cjs.js +6 -2
  568. package/dist/domains/observability/components/observability-histogram.cjs.js.map +1 -1
  569. package/dist/domains/observability/components/observability-histogram.es.js +6 -2
  570. package/dist/domains/observability/components/observability-histogram.es.js.map +1 -1
  571. package/dist/domains/observability/components/observability-page-layout.cjs.js +19 -5
  572. package/dist/domains/observability/components/observability-page-layout.cjs.js.map +1 -1
  573. package/dist/domains/observability/components/observability-page-layout.es.js +20 -6
  574. package/dist/domains/observability/components/observability-page-layout.es.js.map +1 -1
  575. package/dist/domains/observability/hooks/use-observability-list-filters.cjs.js +75 -18
  576. package/dist/domains/observability/hooks/use-observability-list-filters.cjs.js.map +1 -1
  577. package/dist/domains/observability/hooks/use-observability-list-filters.es.js +76 -19
  578. package/dist/domains/observability/hooks/use-observability-list-filters.es.js.map +1 -1
  579. package/dist/domains/observability/lib/zoom-memory.cjs.js +24 -0
  580. package/dist/domains/observability/lib/zoom-memory.cjs.js.map +1 -0
  581. package/dist/domains/observability/lib/zoom-memory.d.ts +1 -0
  582. package/dist/domains/observability/lib/zoom-memory.es.js +22 -0
  583. package/dist/domains/observability/lib/zoom-memory.es.js.map +1 -0
  584. package/dist/domains/observability/observability-list-url-state.cjs.js +122 -0
  585. package/dist/domains/observability/observability-list-url-state.cjs.js.map +1 -0
  586. package/dist/domains/observability/observability-list-url-state.d.ts +1 -0
  587. package/dist/domains/observability/observability-list-url-state.es.js +111 -0
  588. package/dist/domains/observability/observability-list-url-state.es.js.map +1 -0
  589. package/dist/domains/observability/saved-view-state.cjs.js +292 -0
  590. package/dist/domains/observability/saved-view-state.cjs.js.map +1 -0
  591. package/dist/domains/observability/saved-view-state.d.ts +1 -0
  592. package/dist/domains/observability/saved-view-state.es.js +286 -0
  593. package/dist/domains/observability/saved-view-state.es.js.map +1 -0
  594. package/dist/domains/observability/saved-views/observability-saved-views.cjs.js +3 -0
  595. package/dist/domains/observability/saved-views/observability-saved-views.d.ts +1 -0
  596. package/dist/domains/observability/saved-views/observability-saved-views.es.js +1 -0
  597. package/dist/domains/observability/saved-views/saved-views-provider.cjs.js +18 -0
  598. package/dist/domains/observability/saved-views/saved-views-provider.cjs.js.map +1 -0
  599. package/dist/domains/observability/saved-views/saved-views-provider.d.ts +1 -0
  600. package/dist/domains/observability/saved-views/saved-views-provider.es.js +17 -0
  601. package/dist/domains/observability/saved-views/saved-views-provider.es.js.map +1 -0
  602. package/dist/domains/observability/saved-views/saved-views-source.cjs.js +23 -0
  603. package/dist/domains/observability/saved-views/saved-views-source.cjs.js.map +1 -0
  604. package/dist/domains/observability/saved-views/saved-views-source.d.ts +1 -0
  605. package/dist/domains/observability/saved-views/saved-views-source.es.js +19 -0
  606. package/dist/domains/observability/saved-views/saved-views-source.es.js.map +1 -0
  607. package/dist/domains/observability/saved-views/use-hosted-saved-views.cjs.js +235 -0
  608. package/dist/domains/observability/saved-views/use-hosted-saved-views.cjs.js.map +1 -0
  609. package/dist/domains/observability/saved-views/use-hosted-saved-views.d.ts +1 -0
  610. package/dist/domains/observability/saved-views/use-hosted-saved-views.es.js +232 -0
  611. package/dist/domains/observability/saved-views/use-hosted-saved-views.es.js.map +1 -0
  612. package/dist/domains/observability/saved-views.cjs.js +7 -0
  613. package/dist/domains/observability/saved-views.d.ts +1 -0
  614. package/dist/domains/observability/saved-views.es.js +4 -0
  615. package/dist/domains/observability.cjs.js +6 -0
  616. package/dist/domains/observability.es.js +4 -1
  617. package/dist/domains/scores/components/span-scoring.cjs.js +1 -1
  618. package/dist/domains/scores/components/span-scoring.es.js +1 -1
  619. package/dist/domains/scores/components/trace-scores-list.cjs.js +1 -1
  620. package/dist/domains/scores/components/trace-scores-list.es.js +1 -1
  621. package/dist/domains/scores/components/trace-scores-tab.cjs.js +1 -1
  622. package/dist/domains/scores/components/trace-scores-tab.es.js +1 -1
  623. package/dist/domains/skills/skill-simple-form.cjs.js +1 -1
  624. package/dist/domains/skills/skill-simple-form.es.js +1 -1
  625. package/dist/domains/spans/components/spans-explorer-body.cjs.js +64 -18
  626. package/dist/domains/spans/components/spans-explorer-body.cjs.js.map +1 -1
  627. package/dist/domains/spans/components/spans-explorer-body.es.js +64 -18
  628. package/dist/domains/spans/components/spans-explorer-body.es.js.map +1 -1
  629. package/dist/domains/spans/components/spans-filter-bar.cjs.js +6 -5
  630. package/dist/domains/spans/components/spans-filter-bar.cjs.js.map +1 -1
  631. package/dist/domains/spans/components/spans-filter-bar.es.js +6 -5
  632. package/dist/domains/spans/components/spans-filter-bar.es.js.map +1 -1
  633. package/dist/domains/spans/hooks/use-spans-filter-bar.cjs.js +15 -3
  634. package/dist/domains/spans/hooks/use-spans-filter-bar.cjs.js.map +1 -1
  635. package/dist/domains/spans/hooks/use-spans-filter-bar.es.js +15 -3
  636. package/dist/domains/spans/hooks/use-spans-filter-bar.es.js.map +1 -1
  637. package/dist/domains/spans/span-filters.cjs.js +53 -14
  638. package/dist/domains/spans/span-filters.cjs.js.map +1 -1
  639. package/dist/domains/spans/span-filters.es.js +52 -15
  640. package/dist/domains/spans/span-filters.es.js.map +1 -1
  641. package/dist/domains/spans/span-list-row.cjs.js +6 -1
  642. package/dist/domains/spans/span-list-row.cjs.js.map +1 -1
  643. package/dist/domains/spans/span-list-row.es.js +6 -1
  644. package/dist/domains/spans/span-list-row.es.js.map +1 -1
  645. package/dist/domains/threads/components/threads-explorer-body.cjs.js +45 -12
  646. package/dist/domains/threads/components/threads-explorer-body.cjs.js.map +1 -1
  647. package/dist/domains/threads/components/threads-explorer-body.es.js +46 -12
  648. package/dist/domains/threads/components/threads-explorer-body.es.js.map +1 -1
  649. package/dist/domains/threads/components/threads-filter-bar.cjs.js +3 -3
  650. package/dist/domains/threads/components/threads-filter-bar.es.js +3 -3
  651. package/dist/domains/threads/hooks/use-threads-filter-bar.cjs.js +14 -3
  652. package/dist/domains/threads/hooks/use-threads-filter-bar.cjs.js.map +1 -1
  653. package/dist/domains/threads/hooks/use-threads-filter-bar.es.js +14 -3
  654. package/dist/domains/threads/hooks/use-threads-filter-bar.es.js.map +1 -1
  655. package/dist/domains/threads/thread-filters.cjs.js +26 -13
  656. package/dist/domains/threads/thread-filters.cjs.js.map +1 -1
  657. package/dist/domains/threads/thread-filters.es.js +26 -13
  658. package/dist/domains/threads/thread-filters.es.js.map +1 -1
  659. package/dist/domains/threads/thread-list-row.cjs.js +2 -0
  660. package/dist/domains/threads/thread-list-row.cjs.js.map +1 -1
  661. package/dist/domains/threads/thread-list-row.es.js +2 -0
  662. package/dist/domains/threads/thread-list-row.es.js.map +1 -1
  663. package/dist/domains/traces/components/columns-menu/columns-menu.cjs.js +24 -19
  664. package/dist/domains/traces/components/columns-menu/columns-menu.cjs.js.map +1 -1
  665. package/dist/domains/traces/components/columns-menu/columns-menu.es.js +25 -20
  666. package/dist/domains/traces/components/columns-menu/columns-menu.es.js.map +1 -1
  667. package/dist/domains/traces/components/feedback-thread.cjs.js +1 -1
  668. package/dist/domains/traces/components/feedback-thread.es.js +1 -1
  669. package/dist/domains/traces/components/span-data-panel-view.cjs.js +12 -2
  670. package/dist/domains/traces/components/span-data-panel-view.cjs.js.map +1 -1
  671. package/dist/domains/traces/components/span-data-panel-view.es.js +12 -2
  672. package/dist/domains/traces/components/span-data-panel-view.es.js.map +1 -1
  673. package/dist/domains/traces/components/span-outcome.utils.cjs.js +1 -1
  674. package/dist/domains/traces/components/span-outcome.utils.es.js +1 -1
  675. package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
  676. package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
  677. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
  678. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
  679. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +2 -2
  680. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +2 -2
  681. package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +3 -3
  682. package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +3 -3
  683. package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
  684. package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
  685. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +1 -1
  686. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
  687. package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +1 -1
  688. package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +1 -1
  689. package/dist/domains/traces/components/span-payload/span-processor-mutations.cjs.js +2 -2
  690. package/dist/domains/traces/components/span-payload/span-processor-mutations.es.js +2 -2
  691. package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js +1 -1
  692. package/dist/domains/traces/components/span-payload/span-tools-section.es.js +1 -1
  693. package/dist/domains/traces/components/span-prompt-changes.cjs.js +1 -1
  694. package/dist/domains/traces/components/span-prompt-changes.es.js +1 -1
  695. package/dist/domains/traces/components/trace-columns-menu.cjs.js +2 -1
  696. package/dist/domains/traces/components/trace-columns-menu.cjs.js.map +1 -1
  697. package/dist/domains/traces/components/trace-columns-menu.es.js +2 -1
  698. package/dist/domains/traces/components/trace-columns-menu.es.js.map +1 -1
  699. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +9 -2
  700. package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
  701. package/dist/domains/traces/components/trace-data-panel-view.es.js +9 -2
  702. package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
  703. package/dist/domains/traces/components/trace-span-panel.cjs.js +2 -1
  704. package/dist/domains/traces/components/trace-span-panel.cjs.js.map +1 -1
  705. package/dist/domains/traces/components/trace-span-panel.es.js +2 -1
  706. package/dist/domains/traces/components/trace-span-panel.es.js.map +1 -1
  707. package/dist/domains/traces/components/trace-span-timeline-markers.cjs.js +120 -0
  708. package/dist/domains/traces/components/trace-span-timeline-markers.cjs.js.map +1 -0
  709. package/dist/domains/traces/components/trace-span-timeline-markers.d.ts +1 -0
  710. package/dist/domains/traces/components/trace-span-timeline-markers.es.js +119 -0
  711. package/dist/domains/traces/components/trace-span-timeline-markers.es.js.map +1 -0
  712. package/dist/domains/traces/components/trace-span-timeline.cjs.js +8 -5
  713. package/dist/domains/traces/components/trace-span-timeline.cjs.js.map +1 -1
  714. package/dist/domains/traces/components/trace-span-timeline.es.js +8 -5
  715. package/dist/domains/traces/components/trace-span-timeline.es.js.map +1 -1
  716. package/dist/domains/traces/components/trace-time-range-chip.cjs.js +5 -5
  717. package/dist/domains/traces/components/trace-time-range-chip.cjs.js.map +1 -1
  718. package/dist/domains/traces/components/trace-time-range-chip.es.js +5 -5
  719. package/dist/domains/traces/components/trace-time-range-chip.es.js.map +1 -1
  720. package/dist/domains/traces/components/traces-explorer/traces-explorer-actions.cjs.js +15 -11
  721. package/dist/domains/traces/components/traces-explorer/traces-explorer-actions.cjs.js.map +1 -1
  722. package/dist/domains/traces/components/traces-explorer/traces-explorer-actions.es.js +15 -12
  723. package/dist/domains/traces/components/traces-explorer/traces-explorer-actions.es.js.map +1 -1
  724. package/dist/domains/traces/components/traces-explorer/traces-explorer-context.cjs.js +4 -3
  725. package/dist/domains/traces/components/traces-explorer/traces-explorer-context.cjs.js.map +1 -1
  726. package/dist/domains/traces/components/traces-explorer/traces-explorer-context.es.js +4 -3
  727. package/dist/domains/traces/components/traces-explorer/traces-explorer-context.es.js.map +1 -1
  728. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js +5 -4
  729. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js.map +1 -1
  730. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +5 -4
  731. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js.map +1 -1
  732. package/dist/domains/traces/components/traces-explorer/traces-explorer-histogram.cjs.js +13 -5
  733. package/dist/domains/traces/components/traces-explorer/traces-explorer-histogram.cjs.js.map +1 -1
  734. package/dist/domains/traces/components/traces-explorer/traces-explorer-histogram.es.js +13 -5
  735. package/dist/domains/traces/components/traces-explorer/traces-explorer-histogram.es.js.map +1 -1
  736. package/dist/domains/traces/components/traces-explorer/traces-explorer-list-provider.cjs.js +5 -2
  737. package/dist/domains/traces/components/traces-explorer/traces-explorer-list-provider.cjs.js.map +1 -1
  738. package/dist/domains/traces/components/traces-explorer/traces-explorer-list-provider.es.js +5 -2
  739. package/dist/domains/traces/components/traces-explorer/traces-explorer-list-provider.es.js.map +1 -1
  740. package/dist/domains/traces/components/traces-explorer/traces-explorer-list.cjs.js +7 -11
  741. package/dist/domains/traces/components/traces-explorer/traces-explorer-list.cjs.js.map +1 -1
  742. package/dist/domains/traces/components/traces-explorer/traces-explorer-list.es.js +7 -11
  743. package/dist/domains/traces/components/traces-explorer/traces-explorer-list.es.js.map +1 -1
  744. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.cjs.js +3 -1
  745. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.cjs.js.map +1 -1
  746. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.es.js +3 -1
  747. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.es.js.map +1 -1
  748. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.cjs.js +51 -5
  749. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.cjs.js.map +1 -1
  750. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.es.js +51 -5
  751. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.es.js.map +1 -1
  752. package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.cjs.js +20 -0
  753. package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.cjs.js.map +1 -0
  754. package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.d.ts +1 -0
  755. package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.es.js +19 -0
  756. package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.es.js.map +1 -0
  757. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.cjs.js +10 -4
  758. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.cjs.js.map +1 -1
  759. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js +10 -4
  760. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js.map +1 -1
  761. package/dist/domains/traces/components/traces-explorer.cjs.js +4 -1
  762. package/dist/domains/traces/components/traces-explorer.cjs.js.map +1 -1
  763. package/dist/domains/traces/components/traces-explorer.es.js +5 -3
  764. package/dist/domains/traces/components/traces-explorer.es.js.map +1 -1
  765. package/dist/domains/traces/components/traces-list-view-adapter.cjs.js +5 -1
  766. package/dist/domains/traces/components/traces-list-view-adapter.cjs.js.map +1 -1
  767. package/dist/domains/traces/components/traces-list-view-adapter.es.js +5 -1
  768. package/dist/domains/traces/components/traces-list-view-adapter.es.js.map +1 -1
  769. package/dist/domains/traces/components/traces-list-view.cjs.js +53 -18
  770. package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
  771. package/dist/domains/traces/components/traces-list-view.es.js +53 -18
  772. package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
  773. package/dist/domains/traces/components/traces-page-skeleton.cjs.js +1 -1
  774. package/dist/domains/traces/components/traces-page-skeleton.es.js +1 -1
  775. package/dist/domains/traces/trace-filters.cjs.js +5 -1
  776. package/dist/domains/traces/trace-filters.es.js +1 -1
  777. package/dist/domains/traces/trace-list-columns.cjs.js +48 -9
  778. package/dist/domains/traces/trace-list-columns.cjs.js.map +1 -1
  779. package/dist/domains/traces/trace-list-columns.es.js +48 -9
  780. package/dist/domains/traces/trace-list-columns.es.js.map +1 -1
  781. package/dist/domains/traces/trace-query-filters.cjs.js +1 -1
  782. package/dist/domains/traces/trace-query-filters.es.js +1 -1
  783. package/dist/domains/traces/utils/timeline-markers.cjs.js +34 -0
  784. package/dist/domains/traces/utils/timeline-markers.cjs.js.map +1 -0
  785. package/dist/domains/traces/utils/timeline-markers.d.ts +1 -0
  786. package/dist/domains/traces/utils/timeline-markers.es.js +33 -0
  787. package/dist/domains/traces/utils/timeline-markers.es.js.map +1 -0
  788. package/dist/domains/traces.cjs.js +5 -1
  789. package/dist/domains/traces.es.js +2 -2
  790. package/dist/domains/workflows/components/workflow-combobox.cjs.js +1 -1
  791. package/dist/domains/workflows/components/workflow-combobox.es.js +1 -1
  792. package/dist/domains/workflows/components/workflows-list/workflows-list.cjs.js +1 -1
  793. package/dist/domains/workflows/components/workflows-list/workflows-list.es.js +1 -1
  794. package/dist/domains/workflows/workflow/workflow-graph.cjs.js +1 -1
  795. package/dist/domains/workflows/workflow/workflow-graph.es.js +1 -1
  796. package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js +1 -1
  797. package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +1 -1
  798. package/dist/domains/workspace/components/workspace-markdown-preview.cjs.js +1 -1
  799. package/dist/domains/workspace/components/workspace-markdown-preview.es.js +1 -1
  800. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +1 -1
  801. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +1 -1
  802. package/dist/{filter-bar-chip-B3pgpngW.js → filter-bar-chip-7O02P9Vk.js} +27 -9
  803. package/dist/filter-bar-chip-7O02P9Vk.js.map +1 -0
  804. package/dist/{filter-bar-chip-CyTAmjt6.cjs → filter-bar-chip-BUyMf8XQ.cjs} +40 -22
  805. package/dist/filter-bar-chip-BUyMf8XQ.cjs.map +1 -0
  806. package/dist/layout/tabbed-container.cjs.js +1 -1
  807. package/dist/layout/tabbed-container.es.js +1 -1
  808. package/dist/lib/form/json-schema-to-zod-runtime.cjs.js +4 -4
  809. package/dist/lib/form/json-schema-to-zod-runtime.cjs.js.map +1 -1
  810. package/dist/lib/form/json-schema-to-zod-runtime.es.js +4 -4
  811. package/dist/lib/form/json-schema-to-zod-runtime.es.js.map +1 -1
  812. package/dist/lib/form/zod-provider.cjs.js +5 -1
  813. package/dist/lib/form/zod-provider.cjs.js.map +1 -1
  814. package/dist/lib/form/zod-provider.es.js +5 -1
  815. package/dist/lib/form/zod-provider.es.js.map +1 -1
  816. package/dist/observability-saved-views-Bo5kLN20.js +297 -0
  817. package/dist/observability-saved-views-Bo5kLN20.js.map +1 -0
  818. package/dist/observability-saved-views-CwCii7hh.cjs +302 -0
  819. package/dist/observability-saved-views-CwCii7hh.cjs.map +1 -0
  820. package/dist/primitives/chart-axes.cjs.js +44 -0
  821. package/dist/primitives/chart-axes.cjs.js.map +1 -1
  822. package/dist/primitives/chart-axes.es.js +43 -1
  823. package/dist/primitives/chart-axes.es.js.map +1 -1
  824. package/dist/primitives/chart-frame.cjs.js +5 -3
  825. package/dist/primitives/chart-frame.cjs.js.map +1 -1
  826. package/dist/primitives/chart-frame.es.js +6 -4
  827. package/dist/primitives/chart-frame.es.js.map +1 -1
  828. package/dist/primitives/chart-time-tick.cjs.js +15 -11
  829. package/dist/primitives/chart-time-tick.cjs.js.map +1 -1
  830. package/dist/primitives/chart-time-tick.es.js +16 -12
  831. package/dist/primitives/chart-time-tick.es.js.map +1 -1
  832. package/dist/saved-view-schema-DRJYELfK.cjs +71 -0
  833. package/dist/saved-view-schema-DRJYELfK.cjs.map +1 -0
  834. package/dist/saved-view-schema-eJXlRRel.js +54 -0
  835. package/dist/saved-view-schema-eJXlRRel.js.map +1 -0
  836. package/dist/{span-payload-primitives-D3OO0u6u.cjs → span-payload-primitives-B10Xxmx7.cjs} +4 -4
  837. package/dist/{span-payload-primitives-D3OO0u6u.cjs.map → span-payload-primitives-B10Xxmx7.cjs.map} +1 -1
  838. package/dist/{span-payload-primitives-DTV7eUY-.js → span-payload-primitives-Dyhbqaa7.js} +4 -4
  839. package/dist/{span-payload-primitives-DTV7eUY-.js.map → span-payload-primitives-Dyhbqaa7.js.map} +1 -1
  840. package/dist/src/domains/chat/activity/activity-stretch-line.d.ts +4 -2
  841. package/dist/src/domains/chat/activity/components/activity-fold.d.ts +5 -4
  842. package/dist/src/domains/chat/activity/components/use-fading-edge.d.ts +6 -0
  843. package/dist/src/domains/chat/activity/components/use-rolling-words.d.ts +7 -0
  844. package/dist/src/domains/chat/activity/index.d.ts +2 -1
  845. package/dist/src/domains/chat/activity/model/activity-members.d.ts +1 -0
  846. package/dist/src/domains/chat/activity/model/activity-words.d.ts +3 -0
  847. package/dist/src/domains/chat/messages/renderers/tool-part.d.ts +4 -0
  848. package/dist/src/domains/chat/messages/skill-message.d.ts +3 -1
  849. package/dist/src/domains/chat/tools/badges/mcp-task-chip.d.ts +14 -0
  850. package/dist/src/domains/chat/tools/badges/tool-badge.d.ts +5 -1
  851. package/dist/src/domains/chat/tools/badges/use-mcp-task-progress.d.ts +27 -0
  852. package/dist/src/domains/chat/tools/tool-card.d.ts +5 -1
  853. package/dist/src/domains/dashboards/components/dashboard-grid.d.ts +18 -0
  854. package/dist/src/domains/dashboards/components/dashboard-renderer.d.ts +19 -0
  855. package/dist/src/domains/dashboards/components/view-gate.d.ts +30 -0
  856. package/dist/src/domains/dashboards/components/widget-chrome.d.ts +7 -0
  857. package/dist/src/domains/dashboards/components/widget-controls.d.ts +8 -0
  858. package/dist/src/domains/dashboards/components/widget-error.d.ts +6 -0
  859. package/dist/src/domains/dashboards/hooks/use-dashboard-requests.d.ts +10 -0
  860. package/dist/src/domains/dashboards/hooks/use-scorers.d.ts +66 -0
  861. package/dist/src/domains/dashboards/hooks/use-widget-views.d.ts +18 -0
  862. package/dist/src/domains/dashboards/index.d.ts +19 -0
  863. package/dist/src/domains/dashboards/kinds/index.d.ts +7 -0
  864. package/dist/src/domains/dashboards/kinds/kpis/index.d.ts +13 -0
  865. package/dist/src/domains/dashboards/kinds/kpis/kpis-widget.d.ts +3 -0
  866. package/dist/src/domains/dashboards/kinds/kpis/options.d.ts +35 -0
  867. package/dist/src/domains/dashboards/kinds/scores/index.d.ts +8 -0
  868. package/dist/src/domains/dashboards/kinds/scores/options.d.ts +13 -0
  869. package/dist/src/domains/dashboards/kinds/scores/scores-widget.d.ts +3 -0
  870. package/dist/src/domains/dashboards/kinds/table/index.d.ts +23 -0
  871. package/dist/src/domains/dashboards/kinds/table/table-cells.d.ts +26 -0
  872. package/dist/src/domains/dashboards/kinds/table/table-columns.d.ts +7 -0
  873. package/dist/src/domains/dashboards/kinds/table/table-frame.d.ts +13 -0
  874. package/dist/src/domains/dashboards/kinds/table/table-tabs.d.ts +10 -0
  875. package/dist/src/domains/dashboards/kinds/table/table-view.d.ts +5 -0
  876. package/dist/src/domains/dashboards/kinds/table/table-widget.d.ts +7 -0
  877. package/dist/src/domains/dashboards/kinds/timeseries/index.d.ts +30 -0
  878. package/dist/src/domains/dashboards/kinds/timeseries/timeseries-widget.d.ts +5 -0
  879. package/dist/src/domains/dashboards/lib/answers.d.ts +43 -0
  880. package/dist/src/domains/dashboards/lib/chrome.d.ts +14 -0
  881. package/dist/src/domains/dashboards/lib/definition.d.ts +27 -0
  882. package/dist/src/domains/dashboards/lib/filters.d.ts +6 -0
  883. package/dist/src/domains/dashboards/lib/format.d.ts +7 -0
  884. package/dist/src/domains/dashboards/lib/prepare-widget.d.ts +26 -0
  885. package/dist/src/domains/dashboards/lib/requests.d.ts +95 -0
  886. package/dist/src/domains/dashboards/lib/scores.d.ts +35 -0
  887. package/dist/src/domains/dashboards/lib/table.d.ts +188 -0
  888. package/dist/src/domains/dashboards/lib/timeseries.d.ts +119 -0
  889. package/dist/src/domains/dashboards/lib/values.d.ts +86 -0
  890. package/dist/src/domains/dashboards/metrics-dashboard.d.ts +7 -0
  891. package/dist/src/domains/dashboards/widget-kind.d.ts +31 -0
  892. package/dist/src/domains/logs/components/index.d.ts +1 -0
  893. package/dist/src/domains/logs/components/logs-saved-views.d.ts +4 -0
  894. package/dist/src/domains/logs/log-filters.d.ts +8 -0
  895. package/dist/src/domains/metrics/components/agent-runs-card.d.ts +10 -3
  896. package/dist/src/domains/metrics/components/breakdown/breakdown-name.d.ts +13 -0
  897. package/dist/src/domains/metrics/components/breakdown/breakdown-not-priced.d.ts +2 -0
  898. package/dist/src/domains/metrics/components/breakdown/breakdown-row-mark.d.ts +17 -4
  899. package/dist/src/domains/metrics/components/breakdown/breakdown-trend-text.d.ts +9 -0
  900. package/dist/src/domains/metrics/components/card-action-buttons.d.ts +9 -0
  901. package/dist/src/domains/metrics/components/chart-card.d.ts +33 -21
  902. package/dist/src/domains/metrics/components/distinct-ids/distinct-ids-chart.d.ts +0 -1
  903. package/dist/src/domains/metrics/components/failure-rate-card.d.ts +5 -2
  904. package/dist/src/domains/metrics/components/index.d.ts +1 -2
  905. package/dist/src/domains/metrics/components/metrics-grid/metrics-grid.d.ts +4 -1
  906. package/dist/src/domains/metrics/components/trace-aggregate-card.d.ts +1 -1
  907. package/dist/src/domains/observability/components/observability-header-slot.d.ts +6 -0
  908. package/dist/src/domains/observability/components/observability-histogram.d.ts +1 -1
  909. package/dist/src/domains/observability/hooks/use-observability-list-filters.d.ts +21 -5
  910. package/dist/src/domains/observability/index.d.ts +2 -0
  911. package/dist/src/domains/observability/lib/zoom-memory.d.ts +19 -0
  912. package/dist/src/domains/observability/observability-list-url-state.d.ts +39 -0
  913. package/dist/src/domains/observability/saved-view-state.d.ts +46 -0
  914. package/dist/src/domains/observability/saved-views/index.d.ts +7 -0
  915. package/dist/src/domains/observability/saved-views/observability-saved-views.d.ts +22 -0
  916. package/dist/src/domains/observability/saved-views/saved-views-provider.d.ts +15 -0
  917. package/dist/src/domains/observability/saved-views/saved-views-source.d.ts +41 -0
  918. package/dist/src/domains/observability/saved-views/use-hosted-saved-views.d.ts +34 -0
  919. package/dist/src/domains/spans/components/spans-explorer-body.d.ts +4 -1
  920. package/dist/src/domains/spans/components/spans-filter-bar.d.ts +3 -1
  921. package/dist/src/domains/spans/hooks/use-spans-filter-bar.d.ts +1 -1
  922. package/dist/src/domains/spans/hooks/use-spans-list-source.d.ts +3 -0
  923. package/dist/src/domains/spans/span-filters.d.ts +16 -5
  924. package/dist/src/domains/threads/components/threads-explorer-body.d.ts +4 -1
  925. package/dist/src/domains/threads/thread-filters.d.ts +6 -5
  926. package/dist/src/domains/traces/components/columns-menu/columns-menu.d.ts +3 -3
  927. package/dist/src/domains/traces/components/trace-data-panel-view.d.ts +7 -1
  928. package/dist/src/domains/traces/components/trace-span-panel.d.ts +2 -1
  929. package/dist/src/domains/traces/components/trace-span-timeline-markers.d.ts +5 -0
  930. package/dist/src/domains/traces/components/trace-span-timeline.d.ts +6 -1
  931. package/dist/src/domains/traces/components/trace-time-range-chip.d.ts +3 -1
  932. package/dist/src/domains/traces/components/traces-explorer/index.d.ts +4 -1
  933. package/dist/src/domains/traces/components/traces-explorer/traces-explorer-actions.d.ts +5 -5
  934. package/dist/src/domains/traces/components/traces-explorer/traces-explorer-context.d.ts +11 -1
  935. package/dist/src/domains/traces/components/traces-explorer/traces-explorer-saved-views.d.ts +7 -0
  936. package/dist/src/domains/traces/components/traces-list-view.d.ts +20 -7
  937. package/dist/src/domains/traces/hooks/use-traces-list-source.d.ts +5 -0
  938. package/dist/src/domains/traces/trace-filters.d.ts +27 -3
  939. package/dist/src/domains/traces/trace-list-columns.d.ts +16 -6
  940. package/dist/src/domains/traces/utils/timeline-markers.d.ts +25 -0
  941. package/dist/src/domains/workflows/context/use-persisted-workflow-run.d.ts +2 -0
  942. package/dist/src/domains/workflows/workflow/input/processor-input.d.ts +5 -535
  943. package/dist/src/domains/workflows/workflow/use-workflow-trigger.d.ts +1 -1
  944. package/dist/src/ds/components/AgentIndicator/agent-glyph.d.ts +4 -0
  945. package/dist/src/ds/components/AgentIndicator/agent-indicator.d.ts +8 -0
  946. package/dist/src/ds/components/AgentIndicator/animate.d.ts +5 -0
  947. package/dist/src/ds/components/AgentIndicator/index.d.ts +4 -0
  948. package/dist/src/ds/components/AgentIndicator/paint.d.ts +21 -0
  949. package/dist/src/ds/components/AgentIndicator/poses.d.ts +7 -0
  950. package/dist/src/ds/components/AgentIndicator/shapes.d.ts +41 -0
  951. package/dist/src/ds/components/Arrival/arrival.d.ts +11 -0
  952. package/dist/src/ds/components/Arrival/index.d.ts +1 -1
  953. package/dist/src/ds/components/DataList/TracesDataList/traces-data-list-cells.d.ts +12 -0
  954. package/dist/src/ds/components/DataList/TracesDataList/traces-data-list.d.ts +3 -1
  955. package/dist/src/ds/components/FilterBar/types.d.ts +2 -0
  956. package/dist/src/ds/components/MetricsCard/index.d.ts +1 -1
  957. package/dist/src/ds/components/MetricsCard/metrics-card-actions.d.ts +2 -1
  958. package/dist/src/ds/components/MetricsCard/metrics-card-headline.d.ts +13 -0
  959. package/dist/src/ds/components/MetricsCard/metrics-card-title-menu.d.ts +2 -0
  960. package/dist/src/ds/components/MetricsCard/metrics-card-title.d.ts +1 -3
  961. package/dist/src/ds/components/MetricsCard/metrics-card-toolbar.d.ts +3 -3
  962. package/dist/src/ds/components/MetricsCard/metrics-card-total.d.ts +11 -3
  963. package/dist/src/ds/components/MetricsCard/metrics-card.d.ts +2 -9
  964. package/dist/src/ds/components/MetricsCard/metrics-story-data.d.ts +0 -26
  965. package/dist/src/ds/components/MetricsKpiCard/metrics-kpi-card-root.d.ts +5 -2
  966. package/dist/src/ds/components/MetricsLineChart/metrics-line-chart-legend.d.ts +3 -4
  967. package/dist/src/ds/components/MetricsLineChart/metrics-line-chart.d.ts +2 -6
  968. package/dist/src/ds/components/SavedViews/saved-view-editor.d.ts +3 -1
  969. package/dist/src/ds/components/SavedViews/saved-view-picker.d.ts +21 -0
  970. package/dist/src/ds/components/SavedViews/use-saved-views.d.ts +6 -2
  971. package/dist/src/ds/components/ai/activity/activity.d.ts +12 -7
  972. package/dist/src/ds/components/ai/activity/index.d.ts +1 -0
  973. package/dist/src/ds/components/ai/activity/presets/signal-activity.d.ts +4 -1
  974. package/dist/src/ds/components/ai/activity/use-relative-paths.d.ts +3 -0
  975. package/dist/src/ds/components/ai/message-reveal/message-reveal.d.ts +2 -1
  976. package/dist/src/ds/components/ai/tool-call/tool-presentation.d.ts +4 -0
  977. package/dist/src/ds/primitives/chart-axes.d.ts +24 -0
  978. package/dist/src/ds/primitives/chart-frame.d.ts +2 -1
  979. package/dist/src/ds/primitives/chart-time-tick.d.ts +7 -4
  980. package/dist/src/lib/string.d.ts +1 -0
  981. package/dist/{string-OAgeMRQ5.js → string-CNKDIc_4.js} +6 -2
  982. package/dist/string-CNKDIc_4.js.map +1 -0
  983. package/dist/{string-CymY0aJ9.cjs → string-DdJJdCv2.cjs} +11 -1
  984. package/dist/string-DdJJdCv2.cjs.map +1 -0
  985. package/dist/style.css +67 -4
  986. package/dist/{tabbed-container-x2mfK07d.js → tabbed-container-BKUqfEKy.js} +2 -2
  987. package/dist/{tabbed-container-x2mfK07d.js.map → tabbed-container-BKUqfEKy.js.map} +1 -1
  988. package/dist/{tabbed-container-CBTb0LgE.cjs → tabbed-container-CFEImJOK.cjs} +2 -2
  989. package/dist/{tabbed-container-CBTb0LgE.cjs.map → tabbed-container-CFEImJOK.cjs.map} +1 -1
  990. package/dist/{tool-approval-6E73C0r6.cjs → tool-approval-BfjoSNOC.cjs} +4 -4
  991. package/dist/{tool-approval-6E73C0r6.cjs.map → tool-approval-BfjoSNOC.cjs.map} +1 -1
  992. package/dist/{tool-approval-BXlro6fV.js → tool-approval-FeuyUUcL.js} +4 -4
  993. package/dist/{tool-approval-BXlro6fV.js.map → tool-approval-FeuyUUcL.js.map} +1 -1
  994. package/dist/{tool-call-CItJ8KLA.js → tool-call-BxYXs9w0.js} +9 -7
  995. package/dist/{tool-call-CItJ8KLA.js.map → tool-call-BxYXs9w0.js.map} +1 -1
  996. package/dist/{tool-call-Dq9xF3WD.cjs → tool-call-CvilN9ti.cjs} +9 -7
  997. package/dist/{tool-call-Dq9xF3WD.cjs.map → tool-call-CvilN9ti.cjs.map} +1 -1
  998. package/dist/{tool-card-o5u4YCR0.cjs → tool-card-B7O8AsRl.cjs} +9 -5
  999. package/dist/tool-card-B7O8AsRl.cjs.map +1 -0
  1000. package/dist/{tool-card-Bd8weXze.js → tool-card-ELW898uw.js} +9 -5
  1001. package/dist/tool-card-ELW898uw.js.map +1 -0
  1002. package/dist/{tool-presentation-D2uUj1AB.cjs → tool-presentation-BLErsb7c.cjs} +38 -40
  1003. package/dist/tool-presentation-BLErsb7c.cjs.map +1 -0
  1004. package/dist/{tool-presentation-DKfIKLQy.js → tool-presentation-BSZYIWx2.js} +38 -40
  1005. package/dist/tool-presentation-BSZYIWx2.js.map +1 -0
  1006. package/dist/{trace-filters-C27yWcan.js → trace-filters-BJaebsxJ.js} +78 -11
  1007. package/dist/trace-filters-BJaebsxJ.js.map +1 -0
  1008. package/dist/{trace-filters-BpeBUjCb.cjs → trace-filters-BNEZ31HX.cjs} +100 -9
  1009. package/dist/trace-filters-BNEZ31HX.cjs.map +1 -0
  1010. package/dist/types-CP7wbYua.cjs.map +1 -1
  1011. package/dist/types-DiiL5mTO.js.map +1 -1
  1012. package/dist/utils/string.cjs.js +2 -1
  1013. package/dist/utils/string.es.js +1 -1
  1014. package/package.json +14 -14
  1015. package/dist/Arrival-Dm6Vgn78.cjs.map +0 -1
  1016. package/dist/Arrival-NpBOyV52.js.map +0 -1
  1017. package/dist/DataList-Cmk08jUV.cjs.map +0 -1
  1018. package/dist/DataList-Ve3omCXT.js.map +0 -1
  1019. package/dist/DateTimeRangePicker-ByMbLdom.js.map +0 -1
  1020. package/dist/DateTimeRangePicker-DGbH5WOn.cjs.map +0 -1
  1021. package/dist/FilterBar-Dk3QEuT6.js.map +0 -1
  1022. package/dist/FilterBar-gEvoWDXA.cjs.map +0 -1
  1023. package/dist/MetricsCard-C9GWgT58.js.map +0 -1
  1024. package/dist/MetricsCard-Dly_H3oX.cjs.map +0 -1
  1025. package/dist/MetricsLineChart-2m4LVL1N.cjs.map +0 -1
  1026. package/dist/MetricsLineChart-DKzuRU2q.js.map +0 -1
  1027. package/dist/MetricsStackedBarChart-DJB4aByt.js.map +0 -1
  1028. package/dist/MetricsStackedBarChart-NATtwA_W.cjs.map +0 -1
  1029. package/dist/activity-QyLJcBKc.cjs.map +0 -1
  1030. package/dist/activity-ihrl0JtH.js.map +0 -1
  1031. package/dist/combobox-C-E7_q4j.cjs.map +0 -1
  1032. package/dist/combobox-CDS2pBqz.js.map +0 -1
  1033. package/dist/domains/metrics/components/metrics-kpis.cjs.js +0 -106
  1034. package/dist/domains/metrics/components/metrics-kpis.cjs.js.map +0 -1
  1035. package/dist/domains/metrics/components/metrics-kpis.d.ts +0 -1
  1036. package/dist/domains/metrics/components/metrics-kpis.es.js +0 -105
  1037. package/dist/domains/metrics/components/metrics-kpis.es.js.map +0 -1
  1038. package/dist/filter-bar-chip-B3pgpngW.js.map +0 -1
  1039. package/dist/filter-bar-chip-CyTAmjt6.cjs.map +0 -1
  1040. package/dist/src/domains/metrics/components/metrics-kpis.d.ts +0 -2
  1041. package/dist/src/ds/components/MetricsCard/metrics-card-description.d.ts +0 -4
  1042. package/dist/src/ds/components/MetricsCard/metrics-card-summary.d.ts +0 -8
  1043. package/dist/src/ds/components/MetricsCard/metrics-card-tabs.d.ts +0 -16
  1044. package/dist/src/ds/components/MetricsCard/metrics-card-title-and-description.d.ts +0 -16
  1045. package/dist/string-CymY0aJ9.cjs.map +0 -1
  1046. package/dist/string-OAgeMRQ5.js.map +0 -1
  1047. package/dist/tool-card-Bd8weXze.js.map +0 -1
  1048. package/dist/tool-card-o5u4YCR0.cjs.map +0 -1
  1049. package/dist/tool-presentation-D2uUj1AB.cjs.map +0 -1
  1050. package/dist/tool-presentation-DKfIKLQy.js.map +0 -1
  1051. package/dist/trace-filters-BpeBUjCb.cjs.map +0 -1
  1052. package/dist/trace-filters-C27yWcan.js.map +0 -1
@@ -0,0 +1,302 @@
1
+ const require_utils = require("./utils-uDc1ofX1.cjs");
2
+ const require_Button = require("./Button-YQRflC47.cjs");
3
+ const require_Txt = require("./Txt-BnoSqxKE.cjs");
4
+ const require_input = require("./input-2hRXcZIu.cjs");
5
+ const require_dropdown_menu = require("./dropdown-menu-BETTTPBB.cjs");
6
+ const require_components_Field = require("./components/Field.cjs.js");
7
+ const require_popover = require("./popover-BJqa6Hz6.cjs");
8
+ const require_combobox_parts = require("./combobox-parts-BZVXwbG7.cjs");
9
+ const require_domains_observability_saved_views_saved_views_source = require("./domains/observability/saved-views/saved-views-source.cjs.js");
10
+ const require_domains_observability_saved_views_use_hosted_saved_views = require("./domains/observability/saved-views/use-hosted-saved-views.cjs.js");
11
+ const require_domains_observability_components_observability_header_slot = require("./domains/observability/components/observability-header-slot.cjs.js");
12
+ let react = require("react");
13
+ let react_jsx_runtime = require("react/jsx-runtime");
14
+ let lucide_react = require("lucide-react");
15
+ let react_dom = require("react-dom");
16
+ // src/ds/components/SavedViews/saved-view-picker.tsx
17
+ var DEFAULT_ITEM_VALUE = "";
18
+ /**
19
+ * A compact saved-views control for a page header: a searchable view picker, the active view's
20
+ * actions, and save / reset once the page differs from the view. Driven by the same controller
21
+ * as `SavedViewTabs`.
22
+ */
23
+ function SavedViewPicker({ views, defaultLabel, newViewSettings, describeView, canEdit = () => true, "aria-label": ariaLabel = "Views", className }) {
24
+ const anchorRef = (0, react.useRef)(null);
25
+ const [renaming, setRenaming] = (0, react.useState)(false);
26
+ const { draft, activeView } = views;
27
+ const creating = draft !== void 0 && draft.viewId === void 0;
28
+ const activeUnsaved = !creating && draft?.viewId !== void 0 && views.unsaved;
29
+ const editable = activeView !== void 0 && canEdit(activeView);
30
+ const items = [{
31
+ value: DEFAULT_ITEM_VALUE,
32
+ label: defaultLabel,
33
+ viewId: void 0
34
+ }, ...views.views.map((view) => ({
35
+ value: view.id,
36
+ label: view.name,
37
+ viewId: view.id
38
+ }))];
39
+ const selected = items.find((item) => item.viewId === activeView?.id) ?? items[0];
40
+ const viewsById = new Map(views.views.map((view) => [view.id, view]));
41
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42
+ role: "group",
43
+ "aria-label": ariaLabel,
44
+ className: require_utils.cn("flex min-w-0 flex-wrap items-center justify-end gap-1.5", className),
45
+ children: [
46
+ views.error && !creating && !renaming && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Txt.Txt, {
47
+ role: "alert",
48
+ variant: "caption",
49
+ className: "min-w-0 truncate text-destructive-foreground",
50
+ children: views.error
51
+ }),
52
+ activeUnsaved && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
53
+ className: "flex shrink-0 items-center gap-1.5",
54
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Button.Button, {
55
+ type: "button",
56
+ variant: "ghost",
57
+ size: "sm",
58
+ disabled: views.pending,
59
+ onClick: views.discard,
60
+ children: "Reset"
61
+ }), editable && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Button.Button, {
62
+ type: "button",
63
+ variant: "default",
64
+ size: "sm",
65
+ disabled: views.pending,
66
+ onClick: views.save,
67
+ children: "Save changes"
68
+ })]
69
+ }),
70
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
71
+ ref: anchorRef,
72
+ className: "flex min-w-0 items-center gap-0.5",
73
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_combobox_parts.ComboboxRoot, {
74
+ items,
75
+ value: selected,
76
+ onValueChange: (item) => {
77
+ if (item) views.select(item.viewId);
78
+ },
79
+ isItemEqualToValue: (item, value) => item.value === value.value,
80
+ autoHighlight: true,
81
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_combobox_parts.ComboboxTrigger, {
82
+ size: "sm",
83
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.LayersIcon, {}),
84
+ "aria-label": `View: ${selected?.label}${activeUnsaved ? ", unsaved changes" : ""}`,
85
+ className: "max-w-60",
86
+ children: [selected?.label, activeUnsaved && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: "ml-1.5 inline-block size-1.5 rounded-full bg-warning-indicator align-middle" })]
87
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_combobox_parts.ComboboxContent, {
88
+ align: "end",
89
+ children: [
90
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_combobox_parts.ComboboxSearch, { placeholder: "Search views…" }),
91
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_combobox_parts.ComboboxEmpty, { children: "No views found." }),
92
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_combobox_parts.ComboboxList, { children: (item) => {
93
+ const view = item.viewId ? viewsById.get(item.viewId) : void 0;
94
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_combobox_parts.ComboboxItem, {
95
+ value: item,
96
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
97
+ className: "truncate",
98
+ children: item.label
99
+ }), view && describeView && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_combobox_parts.ComboboxItemEnd, { children: describeView(view) })]
100
+ }, item.value);
101
+ } })
102
+ ]
103
+ })]
104
+ }), activeView && !creating && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_dropdown_menu.DropdownMenu, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_dropdown_menu.DropdownMenu.Trigger, {
105
+ variant: "ghost",
106
+ size: "icon-sm",
107
+ tooltip: "View actions",
108
+ className: "shrink-0",
109
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.EllipsisIcon, {})
110
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_dropdown_menu.DropdownMenu.Content, {
111
+ align: "end",
112
+ children: [
113
+ editable && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_dropdown_menu.DropdownMenu.Item, {
114
+ onClick: () => setRenaming(true),
115
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.TextCursorInputIcon, { "aria-hidden": true }), "Rename"]
116
+ }),
117
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_dropdown_menu.DropdownMenu.Item, {
118
+ onClick: () => views.duplicate(activeView.id),
119
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.CopyIcon, { "aria-hidden": true }), "Duplicate"]
120
+ }),
121
+ editable && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_dropdown_menu.DropdownMenu.Separator, {}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_dropdown_menu.DropdownMenu.Item, {
122
+ variant: "destructive",
123
+ onClick: () => views.remove(activeView.id),
124
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.Trash2Icon, { "aria-hidden": true }), "Delete view"]
125
+ })] })
126
+ ]
127
+ })] })]
128
+ }),
129
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_popover.Popover, {
130
+ open: creating,
131
+ onOpenChange: (open) => {
132
+ if (open) views.create(newViewSettings);
133
+ else views.discard();
134
+ },
135
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_popover.PopoverTrigger, {
136
+ variant: "ghost",
137
+ size: "icon-sm",
138
+ tooltip: "Save as new view",
139
+ className: "shrink-0",
140
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.LayersPlusIcon, {})
141
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_popover.PopoverContent, {
142
+ align: "end",
143
+ className: "w-72",
144
+ children: creating && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ViewNameForm, {
145
+ title: "Save as new view",
146
+ initialName: draft.name,
147
+ submitLabel: "Save view",
148
+ error: views.error,
149
+ pending: views.pending,
150
+ onNameChange: (name) => views.change({ name }),
151
+ onSubmit: () => views.save(),
152
+ onCancel: views.discard
153
+ })
154
+ })]
155
+ }),
156
+ activeView && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RenamePopover, {
157
+ open: renaming,
158
+ anchorRef,
159
+ name: activeView.name,
160
+ error: views.error,
161
+ pending: views.pending,
162
+ onClose: () => setRenaming(false),
163
+ onRename: (name) => views.rename(activeView.id, name)
164
+ })
165
+ ]
166
+ });
167
+ }
168
+ function RenamePopover({ open, anchorRef, name, error, pending, onClose, onRename }) {
169
+ const [failedName, setFailedName] = (0, react.useState)();
170
+ const [typedName, setTypedName] = (0, react.useState)(name);
171
+ const close = () => {
172
+ setFailedName(void 0);
173
+ setTypedName(name);
174
+ onClose();
175
+ };
176
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_popover.Popover, {
177
+ open,
178
+ onOpenChange: (next) => !next && close(),
179
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_popover.PopoverContent, {
180
+ anchor: anchorRef,
181
+ align: "end",
182
+ className: "w-72",
183
+ children: open && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ViewNameForm, {
184
+ title: "Rename view",
185
+ initialName: name,
186
+ submitLabel: "Rename",
187
+ error: failedName !== void 0 && failedName === typedName ? error : void 0,
188
+ pending,
189
+ onNameChange: setTypedName,
190
+ onSubmit: async (next) => {
191
+ if (await onRename(next)) close();
192
+ else setFailedName(next);
193
+ },
194
+ onCancel: close
195
+ })
196
+ })
197
+ });
198
+ }
199
+ function ViewNameForm({ title, initialName, submitLabel, error, pending, onNameChange, onSubmit, onCancel }) {
200
+ const [name, setName] = (0, react.useState)(initialName);
201
+ const submit = (event) => {
202
+ event.preventDefault();
203
+ if (name.trim()) onSubmit(name);
204
+ };
205
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("form", {
206
+ className: "flex flex-col gap-3",
207
+ onSubmit: submit,
208
+ children: [
209
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Txt.Txt, {
210
+ as: "h2",
211
+ variant: "label",
212
+ children: title
213
+ }),
214
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_components_Field.Field, {
215
+ invalid: error !== void 0,
216
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_input.Input, {
217
+ "aria-label": "View name",
218
+ size: "sm",
219
+ autoFocus: true,
220
+ onFocus: (event) => event.currentTarget.select(),
221
+ maxLength: 80,
222
+ value: name,
223
+ onChange: (event) => {
224
+ setName(event.target.value);
225
+ onNameChange?.(event.target.value);
226
+ }
227
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_components_Field.FieldError, { children: error })]
228
+ }),
229
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
230
+ className: "flex justify-end gap-1.5",
231
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Button.Button, {
232
+ type: "button",
233
+ variant: "ghost",
234
+ size: "sm",
235
+ onClick: onCancel,
236
+ children: "Cancel"
237
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Button.Button, {
238
+ type: "submit",
239
+ variant: "default",
240
+ size: "sm",
241
+ disabled: pending || !name.trim(),
242
+ children: submitLabel
243
+ })]
244
+ })
245
+ ]
246
+ });
247
+ }
248
+ // src/domains/observability/saved-views/observability-saved-views.tsx
249
+ var DEFAULT_LABELS = {
250
+ traces: "All traces",
251
+ spans: "All spans",
252
+ threads: "All threads",
253
+ logs: "All logs"
254
+ };
255
+ /**
256
+ * The saved views of an observability page: a searchable view picker with save and reset actions.
257
+ * Inside the shared traces / spans / threads header it moves into that header's row. Renders nothing
258
+ * unless a `SavedViewsProvider` above it supplies where views are stored.
259
+ */
260
+ function ObservabilitySavedViews(props) {
261
+ const context = require_domains_observability_saved_views_saved_views_source.useSavedViewsSource();
262
+ if (!context) return null;
263
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(HostedSavedViewsBar, {
264
+ ...props,
265
+ ...context
266
+ });
267
+ }
268
+ function HostedSavedViewsBar({ page, searchParams, setSearchParams, columns, defaultDatePreset, className, source, queryKeyScope, canEdit }) {
269
+ const headerSlot = require_domains_observability_components_observability_header_slot.useObservabilityHeaderSlot();
270
+ const views = require_domains_observability_saved_views_use_hosted_saved_views.useHostedSavedViews({
271
+ page,
272
+ source,
273
+ queryKeyScope,
274
+ canEdit,
275
+ searchParams,
276
+ setSearchParams,
277
+ columns,
278
+ defaultDatePreset
279
+ });
280
+ const picker = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SavedViewPicker, {
281
+ views,
282
+ defaultLabel: DEFAULT_LABELS[page],
283
+ "aria-label": "Saved views",
284
+ newViewSettings: { state: {
285
+ schemaVersion: 1,
286
+ page,
287
+ filters: []
288
+ } },
289
+ describeView: (view) => view.settings.record?.scope === "org" ? "Shared" : void 0,
290
+ canEdit: (view) => !canEdit || !view.settings.record || canEdit(view.settings.record),
291
+ className
292
+ });
293
+ return headerSlot ? (0, react_dom.createPortal)(picker, headerSlot) : picker;
294
+ }
295
+ Object.defineProperty(exports, "ObservabilitySavedViews", {
296
+ enumerable: true,
297
+ get: function() {
298
+ return ObservabilitySavedViews;
299
+ }
300
+ });
301
+
302
+ //# sourceMappingURL=observability-saved-views-CwCii7hh.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability-saved-views-CwCii7hh.cjs","names":["useRef","useState","cn","Txt","Button","ComboboxRoot","ComboboxTrigger","LayersIcon","ComboboxContent","ComboboxSearch","ComboboxEmpty","ComboboxList","ComboboxItem","ComboboxItemEnd","DropdownMenu","EllipsisIcon","TextCursorInputIcon","CopyIcon","_Fragment","Trash2Icon","Popover","PopoverTrigger","LayersPlusIcon","PopoverContent","Field","Input","FieldError","useSavedViewsSource","useObservabilityHeaderSlot","useHostedSavedViews","createPortal"],"sources":["../src/ds/components/SavedViews/saved-view-picker.tsx","../src/domains/observability/saved-views/observability-saved-views.tsx"],"sourcesContent":["import { CopyIcon, EllipsisIcon, LayersIcon, LayersPlusIcon, TextCursorInputIcon, Trash2Icon } from 'lucide-react';\nimport { useRef, useState } from 'react';\nimport type { FormEvent, ReactNode, RefObject } from 'react';\nimport { MAX_SAVED_VIEW_NAME_CHARS } from './saved-view-schema';\nimport type { SavedView } from './saved-view-schema';\nimport type { SavedViewsController } from './use-saved-views';\nimport { Button } from '@/ds/components/Button/Button';\nimport {\n ComboboxContent,\n ComboboxEmpty,\n ComboboxItem,\n ComboboxItemEnd,\n ComboboxList,\n ComboboxRoot,\n ComboboxSearch,\n ComboboxTrigger,\n} from '@/ds/components/Combobox/combobox-parts';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu';\nimport { Field, FieldError } from '@/ds/components/Field';\nimport { Input } from '@/ds/components/Input/input';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/ds/components/Popover';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport type SavedViewPickerProps<TSettings> = {\n views: SavedViewsController<TSettings>;\n /** Names the page's unfiltered state, e.g. \"All traces\". */\n defaultLabel: string;\n newViewSettings: NoInfer<TSettings>;\n /** Muted text after a view in the list, e.g. \"Shared\". */\n describeView?: (view: SavedView<TSettings>) => ReactNode;\n /** Whether a view can be renamed, deleted or overwritten. Others can still be applied and duplicated. */\n canEdit?: (view: SavedView<TSettings>) => boolean;\n 'aria-label'?: string;\n className?: string;\n};\n\ntype PickerItem = { value: string; label: string; viewId: string | undefined };\n\nconst DEFAULT_ITEM_VALUE = '';\n\n/**\n * A compact saved-views control for a page header: a searchable view picker, the active view's\n * actions, and save / reset once the page differs from the view. Driven by the same controller\n * as `SavedViewTabs`.\n */\nexport function SavedViewPicker<TSettings>({\n views,\n defaultLabel,\n newViewSettings,\n describeView,\n canEdit = () => true,\n 'aria-label': ariaLabel = 'Views',\n className,\n}: SavedViewPickerProps<TSettings>) {\n const anchorRef = useRef<HTMLDivElement>(null);\n const [renaming, setRenaming] = useState(false);\n const { draft, activeView } = views;\n const creating = draft !== undefined && draft.viewId === undefined;\n const activeUnsaved = !creating && draft?.viewId !== undefined && views.unsaved;\n const editable = activeView !== undefined && canEdit(activeView);\n\n const items: PickerItem[] = [\n { value: DEFAULT_ITEM_VALUE, label: defaultLabel, viewId: undefined },\n ...views.views.map(view => ({ value: view.id, label: view.name, viewId: view.id })),\n ];\n const selected = items.find(item => item.viewId === activeView?.id) ?? items[0];\n const viewsById = new Map(views.views.map(view => [view.id, view]));\n\n return (\n <div\n role=\"group\"\n aria-label={ariaLabel}\n className={cn('flex min-w-0 flex-wrap items-center justify-end gap-1.5', className)}\n >\n {views.error && !creating && !renaming && (\n <Txt role=\"alert\" variant=\"caption\" className=\"min-w-0 truncate text-destructive-foreground\">\n {views.error}\n </Txt>\n )}\n {activeUnsaved && (\n <div className=\"flex shrink-0 items-center gap-1.5\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" disabled={views.pending} onClick={views.discard}>\n Reset\n </Button>\n {editable && (\n <Button type=\"button\" variant=\"default\" size=\"sm\" disabled={views.pending} onClick={views.save}>\n Save changes\n </Button>\n )}\n </div>\n )}\n <div ref={anchorRef} className=\"flex min-w-0 items-center gap-0.5\">\n <ComboboxRoot\n items={items}\n value={selected}\n onValueChange={(item: PickerItem | null) => {\n if (item) views.select(item.viewId);\n }}\n isItemEqualToValue={(item: PickerItem, value: PickerItem) => item.value === value.value}\n autoHighlight\n >\n <ComboboxTrigger\n size=\"sm\"\n icon={<LayersIcon />}\n aria-label={`View: ${selected?.label}${activeUnsaved ? ', unsaved changes' : ''}`}\n className=\"max-w-60\"\n >\n {selected?.label}\n {activeUnsaved && (\n <span className=\"ml-1.5 inline-block size-1.5 rounded-full bg-warning-indicator align-middle\" />\n )}\n </ComboboxTrigger>\n <ComboboxContent align=\"end\">\n <ComboboxSearch placeholder=\"Search views…\" />\n <ComboboxEmpty>No views found.</ComboboxEmpty>\n <ComboboxList>\n {(item: PickerItem) => {\n const view = item.viewId ? viewsById.get(item.viewId) : undefined;\n return (\n <ComboboxItem key={item.value} value={item}>\n <span className=\"truncate\">{item.label}</span>\n {view && describeView && <ComboboxItemEnd>{describeView(view)}</ComboboxItemEnd>}\n </ComboboxItem>\n );\n }}\n </ComboboxList>\n </ComboboxContent>\n </ComboboxRoot>\n {activeView && !creating && (\n <DropdownMenu>\n <DropdownMenu.Trigger variant=\"ghost\" size=\"icon-sm\" tooltip=\"View actions\" className=\"shrink-0\">\n <EllipsisIcon />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">\n {editable && (\n <DropdownMenu.Item onClick={() => setRenaming(true)}>\n <TextCursorInputIcon aria-hidden />\n Rename\n </DropdownMenu.Item>\n )}\n <DropdownMenu.Item onClick={() => views.duplicate(activeView.id)}>\n <CopyIcon aria-hidden />\n Duplicate\n </DropdownMenu.Item>\n {editable && (\n <>\n <DropdownMenu.Separator />\n <DropdownMenu.Item variant=\"destructive\" onClick={() => views.remove(activeView.id)}>\n <Trash2Icon aria-hidden />\n Delete view\n </DropdownMenu.Item>\n </>\n )}\n </DropdownMenu.Content>\n </DropdownMenu>\n )}\n </div>\n <Popover\n open={creating}\n onOpenChange={open => {\n if (open) views.create(newViewSettings);\n else views.discard();\n }}\n >\n <PopoverTrigger variant=\"ghost\" size=\"icon-sm\" tooltip=\"Save as new view\" className=\"shrink-0\">\n <LayersPlusIcon />\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-72\">\n {creating && (\n <ViewNameForm\n title=\"Save as new view\"\n initialName={draft.name}\n submitLabel=\"Save view\"\n error={views.error}\n pending={views.pending}\n onNameChange={name => views.change({ name })}\n onSubmit={() => views.save()}\n onCancel={views.discard}\n />\n )}\n </PopoverContent>\n </Popover>\n {activeView && (\n <RenamePopover\n open={renaming}\n anchorRef={anchorRef}\n name={activeView.name}\n error={views.error}\n pending={views.pending}\n onClose={() => setRenaming(false)}\n onRename={name => views.rename(activeView.id, name)}\n />\n )}\n </div>\n );\n}\n\nfunction RenamePopover({\n open,\n anchorRef,\n name,\n error,\n pending,\n onClose,\n onRename,\n}: {\n open: boolean;\n anchorRef: RefObject<HTMLDivElement | null>;\n name: string;\n error: string | undefined;\n pending: boolean | undefined;\n onClose: () => void;\n onRename: (name: string) => boolean | Promise<boolean>;\n}) {\n // The name that last failed to save: its error shows until the user types something else.\n const [failedName, setFailedName] = useState<string>();\n const [typedName, setTypedName] = useState(name);\n const close = () => {\n setFailedName(undefined);\n setTypedName(name);\n onClose();\n };\n return (\n <Popover open={open} onOpenChange={next => !next && close()}>\n <PopoverContent anchor={anchorRef} align=\"end\" className=\"w-72\">\n {open && (\n <ViewNameForm\n title=\"Rename view\"\n initialName={name}\n submitLabel=\"Rename\"\n error={failedName !== undefined && failedName === typedName ? error : undefined}\n pending={pending}\n onNameChange={setTypedName}\n onSubmit={async next => {\n if (await onRename(next)) close();\n else setFailedName(next);\n }}\n onCancel={close}\n />\n )}\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction ViewNameForm({\n title,\n initialName,\n submitLabel,\n error,\n pending,\n onNameChange,\n onSubmit,\n onCancel,\n}: {\n title: string;\n initialName: string;\n submitLabel: string;\n error?: string;\n pending?: boolean;\n onNameChange?: (name: string) => void;\n onSubmit: (name: string) => void | Promise<void>;\n onCancel: () => void;\n}) {\n const [name, setName] = useState(initialName);\n const submit = (event: FormEvent) => {\n event.preventDefault();\n if (name.trim()) void onSubmit(name);\n };\n return (\n <form className=\"flex flex-col gap-3\" onSubmit={submit}>\n <Txt as=\"h2\" variant=\"label\">\n {title}\n </Txt>\n <Field invalid={error !== undefined}>\n <Input\n aria-label=\"View name\"\n size=\"sm\"\n autoFocus\n onFocus={event => event.currentTarget.select()}\n maxLength={MAX_SAVED_VIEW_NAME_CHARS}\n value={name}\n onChange={event => {\n setName(event.target.value);\n onNameChange?.(event.target.value);\n }}\n />\n <FieldError>{error}</FieldError>\n </Field>\n <div className=\"flex justify-end gap-1.5\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onCancel}>\n Cancel\n </Button>\n <Button type=\"submit\" variant=\"default\" size=\"sm\" disabled={pending || !name.trim()}>\n {submitLabel}\n </Button>\n </div>\n </form>\n );\n}\n","import type { SavedViewPage } from '@mastra/core/storage';\nimport { createPortal } from 'react-dom';\nimport { useSavedViewsSource } from './saved-views-source';\nimport type { SavedViewsContextValue } from './saved-views-source';\nimport { useHostedSavedViews } from './use-hosted-saved-views';\nimport type { SavedViewColumnsControl } from './use-hosted-saved-views';\nimport { useObservabilityHeaderSlot } from '@/domains/observability/components/observability-header-slot';\nimport { SavedViewPicker } from '@/ds/components/SavedViews/saved-view-picker';\nimport type { SetURLSearchParamsLike } from '@/lib/sort/use-url-sort';\nimport { cn } from '@/lib/utils';\n\nconst DEFAULT_LABELS: Record<SavedViewPage, string> = {\n traces: 'All traces',\n spans: 'All spans',\n threads: 'All threads',\n logs: 'All logs',\n};\n\nexport type ObservabilitySavedViewsProps = {\n page: SavedViewPage;\n searchParams: URLSearchParams;\n setSearchParams: SetURLSearchParamsLike;\n /** The page's column picker (traces, spans, threads), so views save and restore columns. */\n columns?: SavedViewColumnsControl;\n /**\n * The range the page shows when the URL names none, when the host's differs from the page's own\n * (the same value passed to `useObservabilityListFilters`).\n */\n defaultDatePreset?: string;\n className?: string;\n};\n\n/**\n * The saved views of an observability page: a searchable view picker with save and reset actions.\n * Inside the shared traces / spans / threads header it moves into that header's row. Renders nothing\n * unless a `SavedViewsProvider` above it supplies where views are stored.\n */\nexport function ObservabilitySavedViews(props: ObservabilitySavedViewsProps) {\n const context = useSavedViewsSource();\n if (!context) return null;\n return <HostedSavedViewsBar {...props} {...context} />;\n}\n\nfunction HostedSavedViewsBar({\n page,\n searchParams,\n setSearchParams,\n columns,\n defaultDatePreset,\n className,\n source,\n queryKeyScope,\n canEdit,\n}: ObservabilitySavedViewsProps & SavedViewsContextValue) {\n const headerSlot = useObservabilityHeaderSlot();\n const views = useHostedSavedViews({\n page,\n source,\n queryKeyScope,\n canEdit,\n searchParams,\n setSearchParams,\n columns,\n defaultDatePreset,\n });\n\n const picker = (\n <SavedViewPicker\n views={views}\n defaultLabel={DEFAULT_LABELS[page]}\n aria-label=\"Saved views\"\n newViewSettings={{ state: { schemaVersion: 1, page, filters: [] } }}\n describeView={view => (view.settings.record?.scope === 'org' ? 'Shared' : undefined)}\n canEdit={view => !canEdit || !view.settings.record || canEdit(view.settings.record)}\n className={className}\n />\n );\n return headerSlot ? createPortal(picker, headerSlot) : picker;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAuCA,IAAM,qBAAqB;;;;;;AAO3B,SAAgB,gBAA2B,EACzC,OACA,cACA,iBACA,cACA,gBAAgB,MAChB,cAAc,YAAY,SAC1B,aACkC;CAClC,MAAM,aAAA,GAAYA,MAAAA,OAAAA,CAAuB,IAAI;CAC7C,MAAM,CAAC,UAAU,gBAAA,GAAeC,MAAAA,SAAAA,CAAS,KAAK;CAC9C,MAAM,EAAE,OAAO,eAAe;CAC9B,MAAM,WAAW,UAAU,KAAA,KAAa,MAAM,WAAW,KAAA;CACzD,MAAM,gBAAgB,CAAC,YAAY,OAAO,WAAW,KAAA,KAAa,MAAM;CACxE,MAAM,WAAW,eAAe,KAAA,KAAa,QAAQ,UAAU;CAE/D,MAAM,QAAsB,CAC1B;EAAE,OAAO;EAAoB,OAAO;EAAc,QAAQ,KAAA;CAAU,GACpE,GAAG,MAAM,MAAM,KAAI,UAAS;EAAE,OAAO,KAAK;EAAI,OAAO,KAAK;EAAM,QAAQ,KAAK;CAAG,EAAE,CACpF;CACA,MAAM,WAAW,MAAM,MAAK,SAAQ,KAAK,WAAW,YAAY,EAAE,KAAK,MAAM;CAC7E,MAAM,YAAY,IAAI,IAAI,MAAM,MAAM,KAAI,SAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;CAElE,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EACE,MAAK;EACL,cAAY;EACZ,WAAWC,cAAAA,GAAG,2DAA2D,SAAS;EAHpF,UAAA;GAKG,MAAM,SAAS,CAAC,YAAY,CAAC,YAC5B,iBAAA,GAAA,kBAAA,IAAA,CAACC,YAAAA,KAAD;IAAK,MAAK;IAAQ,SAAQ;IAAU,WAAU;IAC3C,UAAA,MAAM;GACJ,CAAA;GAEN,iBACC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,eAAAA,QAAD;KAAQ,MAAK;KAAS,SAAQ;KAAQ,MAAK;KAAK,UAAU,MAAM;KAAS,SAAS,MAAM;KAAS,UAAA;IAEzF,CAAA,GACP,YACC,iBAAA,GAAA,kBAAA,IAAA,CAACA,eAAAA,QAAD;KAAQ,MAAK;KAAS,SAAQ;KAAU,MAAK;KAAK,UAAU,MAAM;KAAS,SAAS,MAAM;KAAM,UAAA;IAExF,CAAA,CAEP;;GAEP,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,KAAK;IAAW,WAAU;IAA/B,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAACC,uBAAAA,cAAD;KACS;KACP,OAAO;KACP,gBAAgB,SAA4B;MAC1C,IAAI,MAAM,MAAM,OAAO,KAAK,MAAM;KACpC;KACA,qBAAqB,MAAkB,UAAsB,KAAK,UAAU,MAAM;KAClF,eAAA;KAPF,UAAA,CASE,iBAAA,GAAA,kBAAA,KAAA,CAACC,uBAAAA,iBAAD;MACE,MAAK;MACL,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAACC,aAAAA,YAAD,CAAa,CAAA;MACnB,cAAY,SAAS,UAAU,QAAQ,gBAAgB,sBAAsB;MAC7E,WAAU;MAJZ,UAAA,CAMG,UAAU,OACV,iBACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAM,WAAU,8EAA+E,CAAA,CAElF;KACjB,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAACC,uBAAAA,iBAAD;MAAiB,OAAM;MAAvB,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,uBAAAA,gBAAD,EAAgB,aAAY,gBAAiB,CAAA;OAC7C,iBAAA,GAAA,kBAAA,IAAA,CAACC,uBAAAA,eAAD,EAAA,UAAe,kBAA8B,CAAA;OAC7C,iBAAA,GAAA,kBAAA,IAAA,CAACC,uBAAAA,cAAD,EAAA,WACI,SAAqB;QACrB,MAAM,OAAO,KAAK,SAAS,UAAU,IAAI,KAAK,MAAM,IAAI,KAAA;QACxD,OACE,iBAAA,GAAA,kBAAA,KAAA,CAACC,uBAAAA,cAAD;SAA+B,OAAO;SAAtC,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAU;UAAY,UAAA,KAAK;SAAY,CAAA,GAC5C,QAAQ,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAACC,uBAAAA,iBAAD,EAAA,UAAkB,aAAa,IAAI,EAAmB,CAAA,CACnE;QAHK,GAAA,KAAK,KAGV;OAElB,EACY,CAAA;MACC;KACL,CAAA,CAAA;IACb,CAAA,GAAA,cAAc,CAAC,YACd,iBAAA,GAAA,kBAAA,KAAA,CAACC,sBAAAA,cAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,sBAAAA,aAAa,SAAd;KAAsB,SAAQ;KAAQ,MAAK;KAAU,SAAQ;KAAe,WAAU;KACpF,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,aAAAA,cAAD,CAAe,CAAA;IACK,CAAA,GACtB,iBAAA,GAAA,kBAAA,KAAA,CAACD,sBAAAA,aAAa,SAAd;KAAsB,OAAM;KAA5B,UAAA;MACG,YACC,iBAAA,GAAA,kBAAA,KAAA,CAACA,sBAAAA,aAAa,MAAd;OAAmB,eAAe,YAAY,IAAI;OAAlD,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACE,aAAAA,qBAAD,EAAqB,eAAA,KAAa,CAAA,GAAC,QAElB;;MAErB,iBAAA,GAAA,kBAAA,KAAA,CAACF,sBAAAA,aAAa,MAAd;OAAmB,eAAe,MAAM,UAAU,WAAW,EAAE;OAA/D,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACG,aAAAA,UAAD,EAAU,eAAA,KAAa,CAAA,GAAC,WAEP;;MAClB,YACC,iBAAA,GAAA,kBAAA,KAAA,CAAAC,kBAAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACJ,sBAAAA,aAAa,WAAd,CAAyB,CAAA,GACzB,iBAAA,GAAA,kBAAA,KAAA,CAACA,sBAAAA,aAAa,MAAd;OAAmB,SAAQ;OAAc,eAAe,MAAM,OAAO,WAAW,EAAE;OAAlF,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACK,aAAAA,YAAD,EAAY,eAAA,KAAa,CAAA,GAAC,aAET;MACnB,CAAA,CAAA,EAAA,CAAA;KAEgB;IACV,CAAA,CAAA,EAAA,CAAA,CAEb;;GACL,iBAAA,GAAA,kBAAA,KAAA,CAACC,gBAAAA,SAAD;IACE,MAAM;IACN,eAAc,SAAQ;KACpB,IAAI,MAAM,MAAM,OAAO,eAAe;UACjC,MAAM,QAAQ;IACrB;IALF,UAAA,CAOE,iBAAA,GAAA,kBAAA,IAAA,CAACC,gBAAAA,gBAAD;KAAgB,SAAQ;KAAQ,MAAK;KAAU,SAAQ;KAAmB,WAAU;KAClF,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,aAAAA,gBAAD,CAAiB,CAAA;IACH,CAAA,GAChB,iBAAA,GAAA,kBAAA,IAAA,CAACC,gBAAAA,gBAAD;KAAgB,OAAM;KAAM,WAAU;KACnC,UAAA,YACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;MACE,OAAM;MACN,aAAa,MAAM;MACnB,aAAY;MACZ,OAAO,MAAM;MACb,SAAS,MAAM;MACf,eAAc,SAAQ,MAAM,OAAO,EAAE,KAAK,CAAC;MAC3C,gBAAgB,MAAM,KAAK;MAC3B,UAAU,MAAM;KACjB,CAAA;IAEW,CAAA,CACT;;GACR,cACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;IACE,MAAM;IACK;IACX,MAAM,WAAW;IACjB,OAAO,MAAM;IACb,SAAS,MAAM;IACf,eAAe,YAAY,KAAK;IAChC,WAAU,SAAQ,MAAM,OAAO,WAAW,IAAI,IAAI;GACnD,CAAA;EAEA;;AAET;AAEA,SAAS,cAAc,EACrB,MACA,WACA,MACA,OACA,SACA,SACA,YASC;CAED,MAAM,CAAC,YAAY,kBAAA,GAAiBtB,MAAAA,SAAAA,CAAiB;CACrD,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAS,IAAI;CAC/C,MAAM,cAAc;EAClB,cAAc,KAAA,CAAS;EACvB,aAAa,IAAI;EACjB,QAAQ;CACV;CACA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACmB,gBAAAA,SAAD;EAAe;EAAM,eAAc,SAAQ,CAAC,QAAQ,MAAM;EACxD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACG,gBAAAA,gBAAD;GAAgB,QAAQ;GAAW,OAAM;GAAM,WAAU;GACtD,UAAA,QACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;IACE,OAAM;IACN,aAAa;IACb,aAAY;IACZ,OAAO,eAAe,KAAA,KAAa,eAAe,YAAY,QAAQ,KAAA;IAC7D;IACT,cAAc;IACd,UAAU,OAAM,SAAQ;KACtB,IAAI,MAAM,SAAS,IAAI,GAAG,MAAM;UAC3B,cAAc,IAAI;IACzB;IACA,UAAU;GACX,CAAA;EAEW,CAAA;CACT,CAAA;AAEb;AAEA,SAAS,aAAa,EACpB,OACA,aACA,aACA,OACA,SACA,cACA,UACA,YAUC;CACD,MAAM,CAAC,MAAM,YAAA,GAAWtB,MAAAA,SAAAA,CAAS,WAAW;CAC5C,MAAM,UAAU,UAAqB;EACnC,MAAM,eAAe;EACrB,IAAI,KAAK,KAAK,GAAG,SAAc,IAAI;CACrC;CACA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;EAAM,WAAU;EAAsB,UAAU;EAAhD,UAAA;GACE,iBAAA,GAAA,kBAAA,IAAA,CAACE,YAAAA,KAAD;IAAK,IAAG;IAAK,SAAQ;IAClB,UAAA;GACE,CAAA;GACL,iBAAA,GAAA,kBAAA,KAAA,CAACqB,yBAAAA,OAAD;IAAO,SAAS,UAAU,KAAA;IAA1B,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,cAAAA,OAAD;KACE,cAAW;KACX,MAAK;KACL,WAAA;KACA,UAAS,UAAS,MAAM,cAAc,OAAO;KAC7C,WAAA;KACA,OAAO;KACP,WAAU,UAAS;MACjB,QAAQ,MAAM,OAAO,KAAK;MAC1B,eAAe,MAAM,OAAO,KAAK;KACnC;IACD,CAAA,GACD,iBAAA,GAAA,kBAAA,IAAA,CAACC,yBAAAA,YAAD,EAAA,UAAa,MAAkB,CAAA,CAC1B;;GACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACtB,eAAAA,QAAD;KAAQ,MAAK;KAAS,SAAQ;KAAQ,MAAK;KAAK,SAAS;KAAU,UAAA;IAE3D,CAAA,GACR,iBAAA,GAAA,kBAAA,IAAA,CAACA,eAAAA,QAAD;KAAQ,MAAK;KAAS,SAAQ;KAAU,MAAK;KAAK,UAAU,WAAW,CAAC,KAAK,KAAK;KAC/E,UAAA;IACK,CAAA,CACL;;EACD;;AAEV;;ACjSA,IAAM,iBAAgD;CACpD,QAAQ;CACR,OAAO;CACP,SAAS;CACT,MAAM;AACR;;;;;;AAqBA,SAAgB,wBAAwB,OAAqC;CAC3E,MAAM,UAAUuB,6DAAAA,oBAAoB;CACpC,IAAI,CAAC,SAAS,OAAO;CACrB,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,qBAAD;EAAqB,GAAI;EAAO,GAAI;CAAU,CAAA;AACvD;AAEA,SAAS,oBAAoB,EAC3B,MACA,cACA,iBACA,SACA,mBACA,WACA,QACA,eACA,WACwD;CACxD,MAAM,aAAaC,mEAAAA,2BAA2B;CAC9C,MAAM,QAAQC,iEAAAA,oBAAoB;EAChC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,MAAM,SACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD;EACS;EACP,cAAc,eAAe;EAC7B,cAAW;EACX,iBAAiB,EAAE,OAAO;GAAE,eAAe;GAAG;GAAM,SAAS,CAAC;EAAE,EAAE;EAClE,eAAc,SAAS,KAAK,SAAS,QAAQ,UAAU,QAAQ,WAAW,KAAA;EAC1E,UAAS,SAAQ,CAAC,WAAW,CAAC,KAAK,SAAS,UAAU,QAAQ,KAAK,SAAS,MAAM;EACvE;CACZ,CAAA;CAEH,OAAO,cAAA,GAAaC,UAAAA,aAAAA,CAAa,QAAQ,UAAU,IAAI;AACzD"}
@@ -131,6 +131,28 @@ var LABEL_GAP = 48;
131
131
  /** Rough label width at the axis font size. */
132
132
  var labelWidth = (text) => text.length * 11 * .58;
133
133
  /**
134
+ * Where a label goes: centred on its bucket, or pinned to the plot's edge when centring would
135
+ * push it out. A pinned label anchors on that edge, so it ends exactly there whatever the font's
136
+ * real widths (`labelWidth` is only an estimate).
137
+ */
138
+ function placeTimeTick({ x, index, offset = 0, count, plotWidth, textWidth }) {
139
+ const left = offset > 0 ? x - offset * (2 * index + 1) : x - index * plotWidth / Math.max(count - 1, 1);
140
+ const right = left + plotWidth;
141
+ const half = textWidth / 2;
142
+ if (x + half > right) return {
143
+ x: right,
144
+ anchor: "end"
145
+ };
146
+ if (x - half < left) return {
147
+ x: left,
148
+ anchor: "start"
149
+ };
150
+ return {
151
+ x,
152
+ anchor: "middle"
153
+ };
154
+ }
155
+ /**
134
156
  * Which buckets get a label: the smallest round step whose labels fit the width, on the first
135
157
  * bucket at or after each clock-aligned time (hours divisible by the step, days on local
136
158
  * midnight or, for daily buckets, on their local date). Without
@@ -172,13 +194,35 @@ function pickTimeTicks(timestamps, labels, plotWidth, mode = "auto") {
172
194
  function isFiniteNumber(value) {
173
195
  return typeof value === "number" && Number.isFinite(value);
174
196
  }
197
+ var fmtDay = (ts) => new Date(ts).toLocaleDateString("en-US", {
198
+ month: "short",
199
+ day: "numeric"
200
+ });
201
+ /**
202
+ * Date-only labels for the two ends of an `edges` axis when the hour on them says nothing: buckets
203
+ * shorter than a day whose first and last start at the same clock time on different days, as on
204
+ * rolling ranges (last 24 hours, 3 days, 7 days). Same-day or uneven ends keep their labels.
205
+ */
206
+ function edgeDateLabels(timestamps, mode) {
207
+ const last = timestamps.length - 1;
208
+ const [first, second] = timestamps;
209
+ const end = timestamps[last];
210
+ if (mode !== "edges" || last < 1 || !isFiniteNumber(first) || !isFiniteNumber(end)) return /* @__PURE__ */ new Map();
211
+ if (isFiniteNumber(second) && second - first >= DAY) return /* @__PURE__ */ new Map();
212
+ const a = new Date(first);
213
+ const b = new Date(end);
214
+ if (!(a.getHours() === b.getHours() && a.getMinutes() === b.getMinutes()) || a.toDateString() === b.toDateString()) return /* @__PURE__ */ new Map();
215
+ return /* @__PURE__ */ new Map([[0, fmtDay(first)], [last, fmtDay(end)]]);
216
+ }
175
217
  exports.CHART_CURSOR_PROPS = CHART_CURSOR_PROPS;
176
218
  exports.CHART_GRID_PROPS = CHART_GRID_PROPS;
177
219
  exports.CHART_TOOLTIP_PROPS = CHART_TOOLTIP_PROPS;
178
220
  exports.chartYTickCount = chartYTickCount;
221
+ exports.edgeDateLabels = edgeDateLabels;
179
222
  exports.labelWidth = labelWidth;
180
223
  exports.niceYTicks = niceYTicks;
181
224
  exports.pickTimeTicks = pickTimeTicks;
225
+ exports.placeTimeTick = placeTimeTick;
182
226
  exports.useChartSize = useChartSize;
183
227
 
184
228
  //# sourceMappingURL=chart-axes.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-axes.cjs.js","names":["useRef","useState","CHART_MARGIN"],"sources":["../../src/ds/primitives/chart-axes.ts"],"sourcesContent":["import { useLayoutEffect, useRef, useState } from 'react';\nimport { CHART_AXIS_FONT_SIZE, CHART_MARGIN, X_AXIS_HEIGHT } from './chart-layout';\n\n/** Horizontal rulers: short dashes on the border color at half strength. */\nexport const CHART_GRID_PROPS = {\n vertical: false,\n stroke: 'var(--border)',\n strokeDasharray: '3 3',\n strokeOpacity: 0.5,\n} as const;\n\n/** Hover line of line charts: dashed like the grid, full border color, a hair thinner than a series. */\nexport const CHART_CURSOR_PROPS = { stroke: 'var(--border)', strokeDasharray: '3 3', strokeWidth: 0.8 } as const;\n\n/**\n * Recharts `<Tooltip>` settings for the metrics charts, used with `ChartTooltipPosition`:\n * - No animation: the tooltip snaps to the hovered point, like the hover line and dots.\n * - `filterNull: false`: a bucket with no readings still gets a tooltip (with dashes); Recharts\n * otherwise drops every empty reading and renders nothing.\n * - The wrapper stays at the chart's origin and may leave the plot; `ChartTooltipPosition` portals\n * the box to `document.body` and places it there.\n */\nexport const CHART_TOOLTIP_PROPS = {\n isAnimationActive: false,\n filterNull: false,\n position: { x: 0, y: 0 },\n allowEscapeViewBox: { x: true, y: true },\n};\n\n/**\n * How x-axis labels are placed.\n * - `auto`: as many labels as fit the width, on round clock times (12 AM, 6 AM, ...) when the\n * rows carry timestamps, so every chart on a page shares one time grid.\n * - `edges`: only the first and last bucket, pinned to the plot's edges (small cards).\n */\nexport type ChartXLabels = 'auto' | 'edges';\n\nexport type ChartSize = { width: number; height: number };\n\n/**\n * The chart's size, read before the first paint (so labels and the y tick count are right on\n * the first frame, no jump) and kept current by ResponsiveContainer's `onResize`.\n */\nexport function useChartSize() {\n const ref = useRef<HTMLDivElement>(null);\n const [size, setSize] = useState<ChartSize>({ width: 0, height: 0 });\n useLayoutEffect(() => {\n const rect = ref.current?.getBoundingClientRect();\n if (rect) setSize({ width: rect.width, height: rect.height });\n }, []);\n const onResize = (width: number, height: number) =>\n setSize(prev => (prev.width === width && prev.height === height ? prev : { width, height }));\n return { size, onResize, ref };\n}\n\n/** About one gridline per 48px of plot: 3 to 5 ticks. */\nexport function chartYTickCount(height: number) {\n if (!height) return 3;\n const plot = height - X_AXIS_HEIGHT - CHART_MARGIN.top;\n return Math.min(5, Math.max(3, Math.round(plot / 48) + 1));\n}\n\n/** Round tick steps per power of ten. */\nconst NICE_STEPS = [1, 2, 2.5, 5];\n/** Fewest ticks an axis shows (0, a middle line, the top). */\nconst MIN_Y_TICKS = 3;\n\n/**\n * Round y ticks from 0 to just above `max`, at most `maxCount` of them. Of the round steps whose\n * tick count fits, the one with the lowest top wins (a $4.40 peak gets a $5 axis, not $8); a tie\n * takes the finer step. With `integer` (counts), only whole steps, so labels never round to\n * uneven values (2.5 printed as 3). Undefined when there's nothing to scale (no data, zeros,\n * negatives) or no step fits.\n */\nexport function niceYTicks(max: number, maxCount: number, integer = false): number[] | undefined {\n if (!Number.isFinite(max) || max <= 0) return undefined;\n const magnitude = 10 ** Math.floor(Math.log10(max));\n let best: { top: number; step: number; count: number } | undefined;\n for (const scale of [magnitude / 10, magnitude, magnitude * 10]) {\n for (const nice of NICE_STEPS) {\n const step = Number((nice * scale).toPrecision(12));\n if (integer && !Number.isInteger(step)) continue;\n // Rounding the ratio drops float noise (0.3 / 0.1) without letting the top fall under `max`.\n const count = Math.ceil(Number((max / step).toPrecision(12))) + 1;\n if (count < MIN_Y_TICKS || count > maxCount) continue;\n const top = (count - 1) * step;\n if (!best || top < best.top || (top === best.top && count > best.count)) best = { top, step, count };\n }\n }\n if (!best) return undefined;\n const { step, count } = best;\n // toPrecision drops float noise (0.30000000000000004).\n return Array.from({ length: count }, (_, i) => Number((i * step).toPrecision(12)));\n}\n\nconst MINUTE = 60_000;\nconst DAY = 24 * 60 * MINUTE;\n/** Round label steps, in minutes: 5m ... 30m, 1h ... 12h, then days and a week. */\nconst STEPS = [5, 10, 15, 30, 60, 120, 180, 240, 360, 720, 1440, 2880, 10080];\n/** Minimum clear space between two x-axis labels. */\nconst LABEL_GAP = 48;\n/** Rough label width at the axis font size. */\nexport const labelWidth = (text: string) => text.length * CHART_AXIS_FONT_SIZE * 0.58;\n\n/**\n * Which buckets get a label: the smallest round step whose labels fit the width, on the first\n * bucket at or after each clock-aligned time (hours divisible by the step, days on local\n * midnight or, for daily buckets, on their local date). Without\n * timestamps, evenly spaced buckets that fit; when fewer than three would show, just the\n * first and last bucket.\n */\nexport function pickTimeTicks(\n timestamps: Array<number | undefined>,\n labels: string[],\n plotWidth: number,\n mode: ChartXLabels = 'auto',\n): Set<number> {\n const last = labels.length - 1;\n if (last < 0) return new Set();\n const ends = new Set([0, last]);\n if (mode === 'edges' || labels.length < 3) return ends;\n const widest = Math.max(...labels.map(l => labelWidth(l)));\n const fit = Math.floor(plotWidth / (widest + LABEL_GAP));\n if (fit < 3) return ends;\n const ts = timestamps.every(isFiniteNumber) ? timestamps : undefined;\n const bucket = ts ? (ts[1] ?? 0) - (ts[0] ?? 0) : 0;\n // From the full range, so gaps (missing buckets) can't make the series look shorter.\n const span = ts ? ((ts[last] ?? 0) - (ts[0] ?? 0) + bucket) / MINUTE : 0;\n // The smallest round step that is a whole number of buckets and whose labels fit.\n const step = ts ? STEPS.find(n => n * MINUTE >= bucket && (n * MINUTE) % bucket === 0 && span / n <= fit) : undefined;\n if (!ts || !(bucket > 0) || step === undefined) {\n // No time grid to align to (or buckets longer than a week): every `every`-th bucket,\n // ending on the last one.\n const every = Math.ceil(labels.length / fit);\n const even = new Set<number>();\n for (let i = 0; i <= last; i += every) even.add(i);\n if (!even.has(last)) {\n if (last % every < every / 2) even.delete(last - (last % every));\n even.add(last);\n }\n return even.size < 3 ? ends : even;\n }\n const picked = new Set<number>();\n const bucketMinutes = bucket / MINUTE;\n ts.forEach((t, i) => {\n const d = new Date(t);\n const midnight = new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n // Buckets are cut on UTC, so in a zone off the step (Paris in winter, Kolkata) none starts on\n // the round local time: label the first bucket that starts at or after it.\n const sinceMidnight = (t - midnight) / MINUTE;\n // Daily buckets align by local date.\n const onClock = bucket >= DAY || sinceMidnight < bucketMinutes;\n const onStep =\n step < 1440 ? sinceMidnight % step < bucketMinutes : onClock && Math.round(midnight / DAY) % (step / 1440) === 0;\n if (onStep) picked.add(i);\n });\n // Two clock labels land off-centre (one mid-plot, one at an edge): label the ends instead.\n return picked.size < 3 ? ends : picked;\n}\n\nfunction isFiniteNumber(value: number | undefined): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"chart-axes.cjs.js","names":["useRef","useState","CHART_MARGIN"],"sources":["../../src/ds/primitives/chart-axes.ts"],"sourcesContent":["import { useLayoutEffect, useRef, useState } from 'react';\nimport { CHART_AXIS_FONT_SIZE, CHART_MARGIN, X_AXIS_HEIGHT } from './chart-layout';\n\n/** Horizontal rulers: short dashes on the border color at half strength. */\nexport const CHART_GRID_PROPS = {\n vertical: false,\n stroke: 'var(--border)',\n strokeDasharray: '3 3',\n strokeOpacity: 0.5,\n} as const;\n\n/** Hover line of line charts: dashed like the grid, full border color, a hair thinner than a series. */\nexport const CHART_CURSOR_PROPS = { stroke: 'var(--border)', strokeDasharray: '3 3', strokeWidth: 0.8 } as const;\n\n/**\n * Recharts `<Tooltip>` settings for the metrics charts, used with `ChartTooltipPosition`:\n * - No animation: the tooltip snaps to the hovered point, like the hover line and dots.\n * - `filterNull: false`: a bucket with no readings still gets a tooltip (with dashes); Recharts\n * otherwise drops every empty reading and renders nothing.\n * - The wrapper stays at the chart's origin and may leave the plot; `ChartTooltipPosition` portals\n * the box to `document.body` and places it there.\n */\nexport const CHART_TOOLTIP_PROPS = {\n isAnimationActive: false,\n filterNull: false,\n position: { x: 0, y: 0 },\n allowEscapeViewBox: { x: true, y: true },\n};\n\n/**\n * How x-axis labels are placed.\n * - `auto`: as many labels as fit the width, on round clock times (12 AM, 6 AM, ...) when the\n * rows carry timestamps, so every chart on a page shares one time grid.\n * - `edges`: only the first and last bucket, pinned to the plot's edges (small cards).\n */\nexport type ChartXLabels = 'auto' | 'edges';\n\nexport type ChartSize = { width: number; height: number };\n\n/**\n * The chart's size, read before the first paint (so labels and the y tick count are right on\n * the first frame, no jump) and kept current by ResponsiveContainer's `onResize`.\n */\nexport function useChartSize() {\n const ref = useRef<HTMLDivElement>(null);\n const [size, setSize] = useState<ChartSize>({ width: 0, height: 0 });\n useLayoutEffect(() => {\n const rect = ref.current?.getBoundingClientRect();\n if (rect) setSize({ width: rect.width, height: rect.height });\n }, []);\n const onResize = (width: number, height: number) =>\n setSize(prev => (prev.width === width && prev.height === height ? prev : { width, height }));\n return { size, onResize, ref };\n}\n\n/** About one gridline per 48px of plot: 3 to 5 ticks. */\nexport function chartYTickCount(height: number) {\n if (!height) return 3;\n const plot = height - X_AXIS_HEIGHT - CHART_MARGIN.top;\n return Math.min(5, Math.max(3, Math.round(plot / 48) + 1));\n}\n\n/** Round tick steps per power of ten. */\nconst NICE_STEPS = [1, 2, 2.5, 5];\n/** Fewest ticks an axis shows (0, a middle line, the top). */\nconst MIN_Y_TICKS = 3;\n\n/**\n * Round y ticks from 0 to just above `max`, at most `maxCount` of them. Of the round steps whose\n * tick count fits, the one with the lowest top wins (a $4.40 peak gets a $5 axis, not $8); a tie\n * takes the finer step. With `integer` (counts), only whole steps, so labels never round to\n * uneven values (2.5 printed as 3). Undefined when there's nothing to scale (no data, zeros,\n * negatives) or no step fits.\n */\nexport function niceYTicks(max: number, maxCount: number, integer = false): number[] | undefined {\n if (!Number.isFinite(max) || max <= 0) return undefined;\n const magnitude = 10 ** Math.floor(Math.log10(max));\n let best: { top: number; step: number; count: number } | undefined;\n for (const scale of [magnitude / 10, magnitude, magnitude * 10]) {\n for (const nice of NICE_STEPS) {\n const step = Number((nice * scale).toPrecision(12));\n if (integer && !Number.isInteger(step)) continue;\n // Rounding the ratio drops float noise (0.3 / 0.1) without letting the top fall under `max`.\n const count = Math.ceil(Number((max / step).toPrecision(12))) + 1;\n if (count < MIN_Y_TICKS || count > maxCount) continue;\n const top = (count - 1) * step;\n if (!best || top < best.top || (top === best.top && count > best.count)) best = { top, step, count };\n }\n }\n if (!best) return undefined;\n const { step, count } = best;\n // toPrecision drops float noise (0.30000000000000004).\n return Array.from({ length: count }, (_, i) => Number((i * step).toPrecision(12)));\n}\n\nconst MINUTE = 60_000;\nconst DAY = 24 * 60 * MINUTE;\n/** Round label steps, in minutes: 5m ... 30m, 1h ... 12h, then days and a week. */\nconst STEPS = [5, 10, 15, 30, 60, 120, 180, 240, 360, 720, 1440, 2880, 10080];\n/** Minimum clear space between two x-axis labels. */\nconst LABEL_GAP = 48;\n/** Rough label width at the axis font size. */\nexport const labelWidth = (text: string) => text.length * CHART_AXIS_FONT_SIZE * 0.58;\n\nexport type TimeTickPlacement = { x: number; anchor: 'start' | 'middle' | 'end' };\n\n/**\n * Where a label goes: centred on its bucket, or pinned to the plot's edge when centring would\n * push it out. A pinned label anchors on that edge, so it ends exactly there whatever the font's\n * real widths (`labelWidth` is only an estimate).\n */\nexport function placeTimeTick({\n x,\n index,\n offset = 0,\n count,\n plotWidth,\n textWidth,\n}: {\n x: number;\n index: number;\n /** Half a band (bars); 0 for points (lines). */\n offset?: number;\n count: number;\n plotWidth: number;\n textWidth: number;\n}): TimeTickPlacement {\n // Bars sit in bands (label at the band's centre); lines sit on points (first at the edge).\n const left = offset > 0 ? x - offset * (2 * index + 1) : x - (index * plotWidth) / Math.max(count - 1, 1);\n const right = left + plotWidth;\n const half = textWidth / 2;\n if (x + half > right) return { x: right, anchor: 'end' };\n if (x - half < left) return { x: left, anchor: 'start' };\n return { x, anchor: 'middle' };\n}\n\n/**\n * Which buckets get a label: the smallest round step whose labels fit the width, on the first\n * bucket at or after each clock-aligned time (hours divisible by the step, days on local\n * midnight or, for daily buckets, on their local date). Without\n * timestamps, evenly spaced buckets that fit; when fewer than three would show, just the\n * first and last bucket.\n */\nexport function pickTimeTicks(\n timestamps: Array<number | undefined>,\n labels: string[],\n plotWidth: number,\n mode: ChartXLabels = 'auto',\n): Set<number> {\n const last = labels.length - 1;\n if (last < 0) return new Set();\n const ends = new Set([0, last]);\n if (mode === 'edges' || labels.length < 3) return ends;\n const widest = Math.max(...labels.map(l => labelWidth(l)));\n const fit = Math.floor(plotWidth / (widest + LABEL_GAP));\n if (fit < 3) return ends;\n const ts = timestamps.every(isFiniteNumber) ? timestamps : undefined;\n const bucket = ts ? (ts[1] ?? 0) - (ts[0] ?? 0) : 0;\n // From the full range, so gaps (missing buckets) can't make the series look shorter.\n const span = ts ? ((ts[last] ?? 0) - (ts[0] ?? 0) + bucket) / MINUTE : 0;\n // The smallest round step that is a whole number of buckets and whose labels fit.\n const step = ts ? STEPS.find(n => n * MINUTE >= bucket && (n * MINUTE) % bucket === 0 && span / n <= fit) : undefined;\n if (!ts || !(bucket > 0) || step === undefined) {\n // No time grid to align to (or buckets longer than a week): every `every`-th bucket,\n // ending on the last one.\n const every = Math.ceil(labels.length / fit);\n const even = new Set<number>();\n for (let i = 0; i <= last; i += every) even.add(i);\n if (!even.has(last)) {\n if (last % every < every / 2) even.delete(last - (last % every));\n even.add(last);\n }\n return even.size < 3 ? ends : even;\n }\n const picked = new Set<number>();\n const bucketMinutes = bucket / MINUTE;\n ts.forEach((t, i) => {\n const d = new Date(t);\n const midnight = new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n // Buckets are cut on UTC, so in a zone off the step (Paris in winter, Kolkata) none starts on\n // the round local time: label the first bucket that starts at or after it.\n const sinceMidnight = (t - midnight) / MINUTE;\n // Daily buckets align by local date.\n const onClock = bucket >= DAY || sinceMidnight < bucketMinutes;\n const onStep =\n step < 1440 ? sinceMidnight % step < bucketMinutes : onClock && Math.round(midnight / DAY) % (step / 1440) === 0;\n if (onStep) picked.add(i);\n });\n // Two clock labels land off-centre (one mid-plot, one at an edge): label the ends instead.\n return picked.size < 3 ? ends : picked;\n}\n\nfunction isFiniteNumber(value: number | undefined): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nconst fmtDay = (ts: number) => new Date(ts).toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n\n/**\n * Date-only labels for the two ends of an `edges` axis when the hour on them says nothing: buckets\n * shorter than a day whose first and last start at the same clock time on different days, as on\n * rolling ranges (last 24 hours, 3 days, 7 days). Same-day or uneven ends keep their labels.\n */\nexport function edgeDateLabels(timestamps: Array<number | undefined>, mode: ChartXLabels): Map<number, string> {\n const last = timestamps.length - 1;\n const [first, second] = timestamps;\n const end = timestamps[last];\n if (mode !== 'edges' || last < 1 || !isFiniteNumber(first) || !isFiniteNumber(end)) return new Map();\n // Daily buckets are already labelled by date.\n if (isFiniteNumber(second) && second - first >= DAY) return new Map();\n const a = new Date(first);\n const b = new Date(end);\n const sameClock = a.getHours() === b.getHours() && a.getMinutes() === b.getMinutes();\n if (!sameClock || a.toDateString() === b.toDateString()) return new Map();\n return new Map([\n [0, fmtDay(first)],\n [last, fmtDay(end)],\n ]);\n}\n"],"mappings":"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"}
@@ -130,6 +130,28 @@ var LABEL_GAP = 48;
130
130
  /** Rough label width at the axis font size. */
131
131
  var labelWidth = (text) => text.length * 11 * .58;
132
132
  /**
133
+ * Where a label goes: centred on its bucket, or pinned to the plot's edge when centring would
134
+ * push it out. A pinned label anchors on that edge, so it ends exactly there whatever the font's
135
+ * real widths (`labelWidth` is only an estimate).
136
+ */
137
+ function placeTimeTick({ x, index, offset = 0, count, plotWidth, textWidth }) {
138
+ const left = offset > 0 ? x - offset * (2 * index + 1) : x - index * plotWidth / Math.max(count - 1, 1);
139
+ const right = left + plotWidth;
140
+ const half = textWidth / 2;
141
+ if (x + half > right) return {
142
+ x: right,
143
+ anchor: "end"
144
+ };
145
+ if (x - half < left) return {
146
+ x: left,
147
+ anchor: "start"
148
+ };
149
+ return {
150
+ x,
151
+ anchor: "middle"
152
+ };
153
+ }
154
+ /**
133
155
  * Which buckets get a label: the smallest round step whose labels fit the width, on the first
134
156
  * bucket at or after each clock-aligned time (hours divisible by the step, days on local
135
157
  * midnight or, for daily buckets, on their local date). Without
@@ -171,6 +193,26 @@ function pickTimeTicks(timestamps, labels, plotWidth, mode = "auto") {
171
193
  function isFiniteNumber(value) {
172
194
  return typeof value === "number" && Number.isFinite(value);
173
195
  }
174
- export { CHART_CURSOR_PROPS, CHART_GRID_PROPS, CHART_TOOLTIP_PROPS, chartYTickCount, labelWidth, niceYTicks, pickTimeTicks, useChartSize };
196
+ var fmtDay = (ts) => new Date(ts).toLocaleDateString("en-US", {
197
+ month: "short",
198
+ day: "numeric"
199
+ });
200
+ /**
201
+ * Date-only labels for the two ends of an `edges` axis when the hour on them says nothing: buckets
202
+ * shorter than a day whose first and last start at the same clock time on different days, as on
203
+ * rolling ranges (last 24 hours, 3 days, 7 days). Same-day or uneven ends keep their labels.
204
+ */
205
+ function edgeDateLabels(timestamps, mode) {
206
+ const last = timestamps.length - 1;
207
+ const [first, second] = timestamps;
208
+ const end = timestamps[last];
209
+ if (mode !== "edges" || last < 1 || !isFiniteNumber(first) || !isFiniteNumber(end)) return /* @__PURE__ */ new Map();
210
+ if (isFiniteNumber(second) && second - first >= DAY) return /* @__PURE__ */ new Map();
211
+ const a = new Date(first);
212
+ const b = new Date(end);
213
+ if (!(a.getHours() === b.getHours() && a.getMinutes() === b.getMinutes()) || a.toDateString() === b.toDateString()) return /* @__PURE__ */ new Map();
214
+ return /* @__PURE__ */ new Map([[0, fmtDay(first)], [last, fmtDay(end)]]);
215
+ }
216
+ export { CHART_CURSOR_PROPS, CHART_GRID_PROPS, CHART_TOOLTIP_PROPS, chartYTickCount, edgeDateLabels, labelWidth, niceYTicks, pickTimeTicks, placeTimeTick, useChartSize };
175
217
 
176
218
  //# sourceMappingURL=chart-axes.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-axes.es.js","names":[],"sources":["../../src/ds/primitives/chart-axes.ts"],"sourcesContent":["import { useLayoutEffect, useRef, useState } from 'react';\nimport { CHART_AXIS_FONT_SIZE, CHART_MARGIN, X_AXIS_HEIGHT } from './chart-layout';\n\n/** Horizontal rulers: short dashes on the border color at half strength. */\nexport const CHART_GRID_PROPS = {\n vertical: false,\n stroke: 'var(--border)',\n strokeDasharray: '3 3',\n strokeOpacity: 0.5,\n} as const;\n\n/** Hover line of line charts: dashed like the grid, full border color, a hair thinner than a series. */\nexport const CHART_CURSOR_PROPS = { stroke: 'var(--border)', strokeDasharray: '3 3', strokeWidth: 0.8 } as const;\n\n/**\n * Recharts `<Tooltip>` settings for the metrics charts, used with `ChartTooltipPosition`:\n * - No animation: the tooltip snaps to the hovered point, like the hover line and dots.\n * - `filterNull: false`: a bucket with no readings still gets a tooltip (with dashes); Recharts\n * otherwise drops every empty reading and renders nothing.\n * - The wrapper stays at the chart's origin and may leave the plot; `ChartTooltipPosition` portals\n * the box to `document.body` and places it there.\n */\nexport const CHART_TOOLTIP_PROPS = {\n isAnimationActive: false,\n filterNull: false,\n position: { x: 0, y: 0 },\n allowEscapeViewBox: { x: true, y: true },\n};\n\n/**\n * How x-axis labels are placed.\n * - `auto`: as many labels as fit the width, on round clock times (12 AM, 6 AM, ...) when the\n * rows carry timestamps, so every chart on a page shares one time grid.\n * - `edges`: only the first and last bucket, pinned to the plot's edges (small cards).\n */\nexport type ChartXLabels = 'auto' | 'edges';\n\nexport type ChartSize = { width: number; height: number };\n\n/**\n * The chart's size, read before the first paint (so labels and the y tick count are right on\n * the first frame, no jump) and kept current by ResponsiveContainer's `onResize`.\n */\nexport function useChartSize() {\n const ref = useRef<HTMLDivElement>(null);\n const [size, setSize] = useState<ChartSize>({ width: 0, height: 0 });\n useLayoutEffect(() => {\n const rect = ref.current?.getBoundingClientRect();\n if (rect) setSize({ width: rect.width, height: rect.height });\n }, []);\n const onResize = (width: number, height: number) =>\n setSize(prev => (prev.width === width && prev.height === height ? prev : { width, height }));\n return { size, onResize, ref };\n}\n\n/** About one gridline per 48px of plot: 3 to 5 ticks. */\nexport function chartYTickCount(height: number) {\n if (!height) return 3;\n const plot = height - X_AXIS_HEIGHT - CHART_MARGIN.top;\n return Math.min(5, Math.max(3, Math.round(plot / 48) + 1));\n}\n\n/** Round tick steps per power of ten. */\nconst NICE_STEPS = [1, 2, 2.5, 5];\n/** Fewest ticks an axis shows (0, a middle line, the top). */\nconst MIN_Y_TICKS = 3;\n\n/**\n * Round y ticks from 0 to just above `max`, at most `maxCount` of them. Of the round steps whose\n * tick count fits, the one with the lowest top wins (a $4.40 peak gets a $5 axis, not $8); a tie\n * takes the finer step. With `integer` (counts), only whole steps, so labels never round to\n * uneven values (2.5 printed as 3). Undefined when there's nothing to scale (no data, zeros,\n * negatives) or no step fits.\n */\nexport function niceYTicks(max: number, maxCount: number, integer = false): number[] | undefined {\n if (!Number.isFinite(max) || max <= 0) return undefined;\n const magnitude = 10 ** Math.floor(Math.log10(max));\n let best: { top: number; step: number; count: number } | undefined;\n for (const scale of [magnitude / 10, magnitude, magnitude * 10]) {\n for (const nice of NICE_STEPS) {\n const step = Number((nice * scale).toPrecision(12));\n if (integer && !Number.isInteger(step)) continue;\n // Rounding the ratio drops float noise (0.3 / 0.1) without letting the top fall under `max`.\n const count = Math.ceil(Number((max / step).toPrecision(12))) + 1;\n if (count < MIN_Y_TICKS || count > maxCount) continue;\n const top = (count - 1) * step;\n if (!best || top < best.top || (top === best.top && count > best.count)) best = { top, step, count };\n }\n }\n if (!best) return undefined;\n const { step, count } = best;\n // toPrecision drops float noise (0.30000000000000004).\n return Array.from({ length: count }, (_, i) => Number((i * step).toPrecision(12)));\n}\n\nconst MINUTE = 60_000;\nconst DAY = 24 * 60 * MINUTE;\n/** Round label steps, in minutes: 5m ... 30m, 1h ... 12h, then days and a week. */\nconst STEPS = [5, 10, 15, 30, 60, 120, 180, 240, 360, 720, 1440, 2880, 10080];\n/** Minimum clear space between two x-axis labels. */\nconst LABEL_GAP = 48;\n/** Rough label width at the axis font size. */\nexport const labelWidth = (text: string) => text.length * CHART_AXIS_FONT_SIZE * 0.58;\n\n/**\n * Which buckets get a label: the smallest round step whose labels fit the width, on the first\n * bucket at or after each clock-aligned time (hours divisible by the step, days on local\n * midnight or, for daily buckets, on their local date). Without\n * timestamps, evenly spaced buckets that fit; when fewer than three would show, just the\n * first and last bucket.\n */\nexport function pickTimeTicks(\n timestamps: Array<number | undefined>,\n labels: string[],\n plotWidth: number,\n mode: ChartXLabels = 'auto',\n): Set<number> {\n const last = labels.length - 1;\n if (last < 0) return new Set();\n const ends = new Set([0, last]);\n if (mode === 'edges' || labels.length < 3) return ends;\n const widest = Math.max(...labels.map(l => labelWidth(l)));\n const fit = Math.floor(plotWidth / (widest + LABEL_GAP));\n if (fit < 3) return ends;\n const ts = timestamps.every(isFiniteNumber) ? timestamps : undefined;\n const bucket = ts ? (ts[1] ?? 0) - (ts[0] ?? 0) : 0;\n // From the full range, so gaps (missing buckets) can't make the series look shorter.\n const span = ts ? ((ts[last] ?? 0) - (ts[0] ?? 0) + bucket) / MINUTE : 0;\n // The smallest round step that is a whole number of buckets and whose labels fit.\n const step = ts ? STEPS.find(n => n * MINUTE >= bucket && (n * MINUTE) % bucket === 0 && span / n <= fit) : undefined;\n if (!ts || !(bucket > 0) || step === undefined) {\n // No time grid to align to (or buckets longer than a week): every `every`-th bucket,\n // ending on the last one.\n const every = Math.ceil(labels.length / fit);\n const even = new Set<number>();\n for (let i = 0; i <= last; i += every) even.add(i);\n if (!even.has(last)) {\n if (last % every < every / 2) even.delete(last - (last % every));\n even.add(last);\n }\n return even.size < 3 ? ends : even;\n }\n const picked = new Set<number>();\n const bucketMinutes = bucket / MINUTE;\n ts.forEach((t, i) => {\n const d = new Date(t);\n const midnight = new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n // Buckets are cut on UTC, so in a zone off the step (Paris in winter, Kolkata) none starts on\n // the round local time: label the first bucket that starts at or after it.\n const sinceMidnight = (t - midnight) / MINUTE;\n // Daily buckets align by local date.\n const onClock = bucket >= DAY || sinceMidnight < bucketMinutes;\n const onStep =\n step < 1440 ? sinceMidnight % step < bucketMinutes : onClock && Math.round(midnight / DAY) % (step / 1440) === 0;\n if (onStep) picked.add(i);\n });\n // Two clock labels land off-centre (one mid-plot, one at an edge): label the ends instead.\n return picked.size < 3 ? ends : picked;\n}\n\nfunction isFiniteNumber(value: number | undefined): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"chart-axes.es.js","names":[],"sources":["../../src/ds/primitives/chart-axes.ts"],"sourcesContent":["import { useLayoutEffect, useRef, useState } from 'react';\nimport { CHART_AXIS_FONT_SIZE, CHART_MARGIN, X_AXIS_HEIGHT } from './chart-layout';\n\n/** Horizontal rulers: short dashes on the border color at half strength. */\nexport const CHART_GRID_PROPS = {\n vertical: false,\n stroke: 'var(--border)',\n strokeDasharray: '3 3',\n strokeOpacity: 0.5,\n} as const;\n\n/** Hover line of line charts: dashed like the grid, full border color, a hair thinner than a series. */\nexport const CHART_CURSOR_PROPS = { stroke: 'var(--border)', strokeDasharray: '3 3', strokeWidth: 0.8 } as const;\n\n/**\n * Recharts `<Tooltip>` settings for the metrics charts, used with `ChartTooltipPosition`:\n * - No animation: the tooltip snaps to the hovered point, like the hover line and dots.\n * - `filterNull: false`: a bucket with no readings still gets a tooltip (with dashes); Recharts\n * otherwise drops every empty reading and renders nothing.\n * - The wrapper stays at the chart's origin and may leave the plot; `ChartTooltipPosition` portals\n * the box to `document.body` and places it there.\n */\nexport const CHART_TOOLTIP_PROPS = {\n isAnimationActive: false,\n filterNull: false,\n position: { x: 0, y: 0 },\n allowEscapeViewBox: { x: true, y: true },\n};\n\n/**\n * How x-axis labels are placed.\n * - `auto`: as many labels as fit the width, on round clock times (12 AM, 6 AM, ...) when the\n * rows carry timestamps, so every chart on a page shares one time grid.\n * - `edges`: only the first and last bucket, pinned to the plot's edges (small cards).\n */\nexport type ChartXLabels = 'auto' | 'edges';\n\nexport type ChartSize = { width: number; height: number };\n\n/**\n * The chart's size, read before the first paint (so labels and the y tick count are right on\n * the first frame, no jump) and kept current by ResponsiveContainer's `onResize`.\n */\nexport function useChartSize() {\n const ref = useRef<HTMLDivElement>(null);\n const [size, setSize] = useState<ChartSize>({ width: 0, height: 0 });\n useLayoutEffect(() => {\n const rect = ref.current?.getBoundingClientRect();\n if (rect) setSize({ width: rect.width, height: rect.height });\n }, []);\n const onResize = (width: number, height: number) =>\n setSize(prev => (prev.width === width && prev.height === height ? prev : { width, height }));\n return { size, onResize, ref };\n}\n\n/** About one gridline per 48px of plot: 3 to 5 ticks. */\nexport function chartYTickCount(height: number) {\n if (!height) return 3;\n const plot = height - X_AXIS_HEIGHT - CHART_MARGIN.top;\n return Math.min(5, Math.max(3, Math.round(plot / 48) + 1));\n}\n\n/** Round tick steps per power of ten. */\nconst NICE_STEPS = [1, 2, 2.5, 5];\n/** Fewest ticks an axis shows (0, a middle line, the top). */\nconst MIN_Y_TICKS = 3;\n\n/**\n * Round y ticks from 0 to just above `max`, at most `maxCount` of them. Of the round steps whose\n * tick count fits, the one with the lowest top wins (a $4.40 peak gets a $5 axis, not $8); a tie\n * takes the finer step. With `integer` (counts), only whole steps, so labels never round to\n * uneven values (2.5 printed as 3). Undefined when there's nothing to scale (no data, zeros,\n * negatives) or no step fits.\n */\nexport function niceYTicks(max: number, maxCount: number, integer = false): number[] | undefined {\n if (!Number.isFinite(max) || max <= 0) return undefined;\n const magnitude = 10 ** Math.floor(Math.log10(max));\n let best: { top: number; step: number; count: number } | undefined;\n for (const scale of [magnitude / 10, magnitude, magnitude * 10]) {\n for (const nice of NICE_STEPS) {\n const step = Number((nice * scale).toPrecision(12));\n if (integer && !Number.isInteger(step)) continue;\n // Rounding the ratio drops float noise (0.3 / 0.1) without letting the top fall under `max`.\n const count = Math.ceil(Number((max / step).toPrecision(12))) + 1;\n if (count < MIN_Y_TICKS || count > maxCount) continue;\n const top = (count - 1) * step;\n if (!best || top < best.top || (top === best.top && count > best.count)) best = { top, step, count };\n }\n }\n if (!best) return undefined;\n const { step, count } = best;\n // toPrecision drops float noise (0.30000000000000004).\n return Array.from({ length: count }, (_, i) => Number((i * step).toPrecision(12)));\n}\n\nconst MINUTE = 60_000;\nconst DAY = 24 * 60 * MINUTE;\n/** Round label steps, in minutes: 5m ... 30m, 1h ... 12h, then days and a week. */\nconst STEPS = [5, 10, 15, 30, 60, 120, 180, 240, 360, 720, 1440, 2880, 10080];\n/** Minimum clear space between two x-axis labels. */\nconst LABEL_GAP = 48;\n/** Rough label width at the axis font size. */\nexport const labelWidth = (text: string) => text.length * CHART_AXIS_FONT_SIZE * 0.58;\n\nexport type TimeTickPlacement = { x: number; anchor: 'start' | 'middle' | 'end' };\n\n/**\n * Where a label goes: centred on its bucket, or pinned to the plot's edge when centring would\n * push it out. A pinned label anchors on that edge, so it ends exactly there whatever the font's\n * real widths (`labelWidth` is only an estimate).\n */\nexport function placeTimeTick({\n x,\n index,\n offset = 0,\n count,\n plotWidth,\n textWidth,\n}: {\n x: number;\n index: number;\n /** Half a band (bars); 0 for points (lines). */\n offset?: number;\n count: number;\n plotWidth: number;\n textWidth: number;\n}): TimeTickPlacement {\n // Bars sit in bands (label at the band's centre); lines sit on points (first at the edge).\n const left = offset > 0 ? x - offset * (2 * index + 1) : x - (index * plotWidth) / Math.max(count - 1, 1);\n const right = left + plotWidth;\n const half = textWidth / 2;\n if (x + half > right) return { x: right, anchor: 'end' };\n if (x - half < left) return { x: left, anchor: 'start' };\n return { x, anchor: 'middle' };\n}\n\n/**\n * Which buckets get a label: the smallest round step whose labels fit the width, on the first\n * bucket at or after each clock-aligned time (hours divisible by the step, days on local\n * midnight or, for daily buckets, on their local date). Without\n * timestamps, evenly spaced buckets that fit; when fewer than three would show, just the\n * first and last bucket.\n */\nexport function pickTimeTicks(\n timestamps: Array<number | undefined>,\n labels: string[],\n plotWidth: number,\n mode: ChartXLabels = 'auto',\n): Set<number> {\n const last = labels.length - 1;\n if (last < 0) return new Set();\n const ends = new Set([0, last]);\n if (mode === 'edges' || labels.length < 3) return ends;\n const widest = Math.max(...labels.map(l => labelWidth(l)));\n const fit = Math.floor(plotWidth / (widest + LABEL_GAP));\n if (fit < 3) return ends;\n const ts = timestamps.every(isFiniteNumber) ? timestamps : undefined;\n const bucket = ts ? (ts[1] ?? 0) - (ts[0] ?? 0) : 0;\n // From the full range, so gaps (missing buckets) can't make the series look shorter.\n const span = ts ? ((ts[last] ?? 0) - (ts[0] ?? 0) + bucket) / MINUTE : 0;\n // The smallest round step that is a whole number of buckets and whose labels fit.\n const step = ts ? STEPS.find(n => n * MINUTE >= bucket && (n * MINUTE) % bucket === 0 && span / n <= fit) : undefined;\n if (!ts || !(bucket > 0) || step === undefined) {\n // No time grid to align to (or buckets longer than a week): every `every`-th bucket,\n // ending on the last one.\n const every = Math.ceil(labels.length / fit);\n const even = new Set<number>();\n for (let i = 0; i <= last; i += every) even.add(i);\n if (!even.has(last)) {\n if (last % every < every / 2) even.delete(last - (last % every));\n even.add(last);\n }\n return even.size < 3 ? ends : even;\n }\n const picked = new Set<number>();\n const bucketMinutes = bucket / MINUTE;\n ts.forEach((t, i) => {\n const d = new Date(t);\n const midnight = new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n // Buckets are cut on UTC, so in a zone off the step (Paris in winter, Kolkata) none starts on\n // the round local time: label the first bucket that starts at or after it.\n const sinceMidnight = (t - midnight) / MINUTE;\n // Daily buckets align by local date.\n const onClock = bucket >= DAY || sinceMidnight < bucketMinutes;\n const onStep =\n step < 1440 ? sinceMidnight % step < bucketMinutes : onClock && Math.round(midnight / DAY) % (step / 1440) === 0;\n if (onStep) picked.add(i);\n });\n // Two clock labels land off-centre (one mid-plot, one at an edge): label the ends instead.\n return picked.size < 3 ? ends : picked;\n}\n\nfunction isFiniteNumber(value: number | undefined): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nconst fmtDay = (ts: number) => new Date(ts).toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n\n/**\n * Date-only labels for the two ends of an `edges` axis when the hour on them says nothing: buckets\n * shorter than a day whose first and last start at the same clock time on different days, as on\n * rolling ranges (last 24 hours, 3 days, 7 days). Same-day or uneven ends keep their labels.\n */\nexport function edgeDateLabels(timestamps: Array<number | undefined>, mode: ChartXLabels): Map<number, string> {\n const last = timestamps.length - 1;\n const [first, second] = timestamps;\n const end = timestamps[last];\n if (mode !== 'edges' || last < 1 || !isFiniteNumber(first) || !isFiniteNumber(end)) return new Map();\n // Daily buckets are already labelled by date.\n if (isFiniteNumber(second) && second - first >= DAY) return new Map();\n const a = new Date(first);\n const b = new Date(end);\n const sameClock = a.getHours() === b.getHours() && a.getMinutes() === b.getMinutes();\n if (!sameClock || a.toDateString() === b.toDateString()) return new Map();\n return new Map([\n [0, fmtDay(first)],\n [last, fmtDay(end)],\n ]);\n}\n"],"mappings":"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"}
@@ -22,14 +22,15 @@ function timeXAxis({ data, xKey, timestampKey, xLabels, plotWidth }) {
22
22
  return typeof t === "number" ? t : void 0;
23
23
  });
24
24
  const picked = require_primitives_chart_axes.pickTimeTicks(timestamps, labels, plotWidth, xLabels);
25
+ const edgeLabels = require_primitives_chart_axes.edgeDateLabels(timestamps, xLabels);
25
26
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(recharts.XAxis, {
26
27
  dataKey: xKey,
27
28
  height: 22,
28
29
  tick: (props) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_primitives_chart_time_tick.ChartTimeTick, {
29
30
  ...props,
30
31
  picked,
31
- count: data.length,
32
- plotWidth
32
+ labels: edgeLabels,
33
+ count: data.length
33
34
  }),
34
35
  tickLine: false,
35
36
  axisLine: false,
@@ -39,7 +40,8 @@ function timeXAxis({ data, xKey, timestampKey, xLabels, plotWidth }) {
39
40
  }
40
41
  /**
41
42
  * Room the y-axis labels take at most. The axis itself is as wide as its longest label, so the
42
- * labels line up with the card's content; this only sizes the plot for spacing the x labels.
43
+ * labels line up with the card's content; this only estimates the plot width for how many x
44
+ * labels fit. The labels themselves pin to the plot's real edges (Recharts' axis width).
43
45
  */
44
46
  var Y_AXIS_WIDTH = 44;
45
47
  function valueYAxis({ id = 0, show, size, formatter, domain, max, integer = false, right = false }) {