@mastra/playground-ui 69.0.0-alpha.0 → 69.0.0-alpha.2

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 (842) hide show
  1. package/components.css +6 -0
  2. package/dist/{CodeEditor-ZoBu3Gjw.js → CodeEditor-BqAM9L7t.js} +5 -2
  3. package/dist/{CodeEditor-ZoBu3Gjw.js.map → CodeEditor-BqAM9L7t.js.map} +1 -1
  4. package/dist/{CodeEditor-DHIDfP5g.cjs → CodeEditor-zMSUzPdX.cjs} +5 -2
  5. package/dist/{CodeEditor-DHIDfP5g.cjs.map → CodeEditor-zMSUzPdX.cjs.map} +1 -1
  6. package/dist/{Comment-rQxuMDQv.cjs → Comment-A07IvOt2.cjs} +3 -3
  7. package/dist/{Comment-rQxuMDQv.cjs.map → Comment-A07IvOt2.cjs.map} +1 -1
  8. package/dist/{Comment-2q9SomE2.js → Comment-D_gSx7oM.js} +3 -3
  9. package/dist/{Comment-2q9SomE2.js.map → Comment-D_gSx7oM.js.map} +1 -1
  10. package/dist/{Composer-u1K6edoZ.cjs → Composer-D2BqRyb5.cjs} +2 -2
  11. package/dist/Composer-D2BqRyb5.cjs.map +1 -0
  12. package/dist/{Composer-bVE8qK52.js → Composer-kjwmlIgL.js} +2 -2
  13. package/dist/Composer-kjwmlIgL.js.map +1 -0
  14. package/dist/{DataCodeSection-CTodi9wg.js → DataCodeSection-CcX8Z68Y.js} +2 -2
  15. package/dist/{DataCodeSection-CTodi9wg.js.map → DataCodeSection-CcX8Z68Y.js.map} +1 -1
  16. package/dist/{DataCodeSection-7SvRJj6f.cjs → DataCodeSection-JPGTWLcL.cjs} +2 -2
  17. package/dist/{DataCodeSection-7SvRJj6f.cjs.map → DataCodeSection-JPGTWLcL.cjs.map} +1 -1
  18. package/dist/{DataDetailsPanel-BDoD6pxx.cjs → DataDetailsPanel-DCMlaG7j.cjs} +2 -2
  19. package/dist/{DataDetailsPanel-BDoD6pxx.cjs.map → DataDetailsPanel-DCMlaG7j.cjs.map} +1 -1
  20. package/dist/{DataDetailsPanel-BU05psHL.js → DataDetailsPanel-mTfbbQho.js} +2 -2
  21. package/dist/{DataDetailsPanel-BU05psHL.js.map → DataDetailsPanel-mTfbbQho.js.map} +1 -1
  22. package/dist/{DataPanel-BRRAvWYQ.cjs → DataPanel-LfExjFpP.cjs} +2 -2
  23. package/dist/{DataPanel-BRRAvWYQ.cjs.map → DataPanel-LfExjFpP.cjs.map} +1 -1
  24. package/dist/{DataPanel-pVr5LVaK.js → DataPanel-Rv5Mb_pf.js} +2 -2
  25. package/dist/{DataPanel-pVr5LVaK.js.map → DataPanel-Rv5Mb_pf.js.map} +1 -1
  26. package/dist/{FilterBar-Kmn6gMgO.js → FilterBar-DgHNtsDI.js} +5 -5
  27. package/dist/FilterBar-DgHNtsDI.js.map +1 -0
  28. package/dist/{FilterBar-jBz6yaNu.cjs → FilterBar-O8SYau_Q.cjs} +5 -5
  29. package/dist/FilterBar-O8SYau_Q.cjs.map +1 -0
  30. package/dist/KnowledgePageGraph.css +1 -3
  31. package/dist/{MarkdownRenderer-CY8LGt-l.js → MarkdownRenderer-BSGb65Ze.js} +2 -2
  32. package/dist/{MarkdownRenderer-CY8LGt-l.js.map → MarkdownRenderer-BSGb65Ze.js.map} +1 -1
  33. package/dist/{MarkdownRenderer-CUYpmuPh.cjs → MarkdownRenderer-CDwlvw0Y.cjs} +2 -2
  34. package/dist/{MarkdownRenderer-CUYpmuPh.cjs.map → MarkdownRenderer-CDwlvw0Y.cjs.map} +1 -1
  35. package/dist/{MetricsCard-DojbLiEx.cjs → MetricsCard-CSJ4TsNq.cjs} +3 -3
  36. package/dist/MetricsCard-CSJ4TsNq.cjs.map +1 -0
  37. package/dist/{MetricsCard-kAqSCPPe.js → MetricsCard-D6bQfynP.js} +3 -3
  38. package/dist/MetricsCard-D6bQfynP.js.map +1 -0
  39. package/dist/{Tree-Caz4FTCU.cjs → Tree-6pubDJLQ.cjs} +4 -3
  40. package/dist/Tree-6pubDJLQ.cjs.map +1 -0
  41. package/dist/{Tree-od43gLMO.js → Tree-DpRLmis3.js} +4 -3
  42. package/dist/Tree-DpRLmis3.js.map +1 -0
  43. package/dist/{Workflow-mIbUYdv0.js → Workflow-BVVYys0W.js} +3 -3
  44. package/dist/{Workflow-mIbUYdv0.js.map → Workflow-BVVYys0W.js.map} +1 -1
  45. package/dist/{Workflow-XR5L-3cJ.cjs → Workflow-CwIjxwC6.cjs} +3 -3
  46. package/dist/{Workflow-XR5L-3cJ.cjs.map → Workflow-CwIjxwC6.cjs.map} +1 -1
  47. package/dist/{activity-ClFChYfl.js → activity-BH_eegMA.js} +2 -2
  48. package/dist/{activity-ClFChYfl.js.map → activity-BH_eegMA.js.map} +1 -1
  49. package/dist/{activity-BprmG6yH.cjs → activity-Ciolopq8.cjs} +2 -2
  50. package/dist/{activity-BprmG6yH.cjs.map → activity-Ciolopq8.cjs.map} +1 -1
  51. package/dist/{ask-user-D4ezQ6pt.js → ask-user-CqzPUD9E.js} +2 -2
  52. package/dist/{ask-user-D4ezQ6pt.js.map → ask-user-CqzPUD9E.js.map} +1 -1
  53. package/dist/{ask-user-DcnUNMM5.cjs → ask-user-DIYcPkoX.cjs} +2 -2
  54. package/dist/{ask-user-DcnUNMM5.cjs.map → ask-user-DIYcPkoX.cjs.map} +1 -1
  55. package/dist/{combobox-lbSxWRMl.js → combobox-DLdInLYm.js} +2 -2
  56. package/dist/{combobox-lbSxWRMl.js.map → combobox-DLdInLYm.js.map} +1 -1
  57. package/dist/{combobox-i723LxeC.cjs → combobox-DU2jsrGa.cjs} +2 -2
  58. package/dist/{combobox-i723LxeC.cjs.map → combobox-DU2jsrGa.cjs.map} +1 -1
  59. package/dist/{combobox-parts-BeNqgCbj.cjs → combobox-parts-C236ZHtn.cjs} +2 -2
  60. package/dist/combobox-parts-C236ZHtn.cjs.map +1 -0
  61. package/dist/{combobox-parts-C9o4UfH_.js → combobox-parts-_m3Qgmci.js} +2 -2
  62. package/dist/combobox-parts-_m3Qgmci.js.map +1 -0
  63. package/dist/components/Breadcrumb.cjs.js.map +1 -1
  64. package/dist/components/Breadcrumb.es.js.map +1 -1
  65. package/dist/components/CodeBlock.cjs.js +1 -1
  66. package/dist/components/CodeBlock.es.js +1 -1
  67. package/dist/components/CodeEditor.cjs.js +1 -1
  68. package/dist/components/CodeEditor.es.js +1 -1
  69. package/dist/components/Combobox.cjs.js +2 -2
  70. package/dist/components/Combobox.es.js +2 -2
  71. package/dist/components/Command.cjs.js +1 -1
  72. package/dist/components/Command.cjs.js.map +1 -1
  73. package/dist/components/Command.es.js +1 -1
  74. package/dist/components/Command.es.js.map +1 -1
  75. package/dist/components/Comment.cjs.js +1 -1
  76. package/dist/components/Comment.es.js +1 -1
  77. package/dist/components/Composer.cjs.js +1 -1
  78. package/dist/components/Composer.es.js +1 -1
  79. package/dist/components/DataCodeSection.cjs.js +1 -1
  80. package/dist/components/DataCodeSection.es.js +1 -1
  81. package/dist/components/DataDetailsPanel.cjs.js +1 -1
  82. package/dist/components/DataDetailsPanel.es.js +1 -1
  83. package/dist/components/DataList.cjs.js +1 -1
  84. package/dist/components/DataList.es.js +1 -1
  85. package/dist/components/DataPanel.cjs.js +1 -1
  86. package/dist/components/DataPanel.es.js +1 -1
  87. package/dist/components/DateTimePicker.cjs.js +1 -1
  88. package/dist/components/DateTimePicker.es.js +1 -1
  89. package/dist/components/DateTimeRangePicker.cjs.js +1 -1
  90. package/dist/components/DateTimeRangePicker.es.js +1 -1
  91. package/dist/components/DropdownMenu.cjs.js +1 -1
  92. package/dist/components/DropdownMenu.es.js +1 -1
  93. package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
  94. package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
  95. package/dist/components/FilterBar.cjs.js +3 -3
  96. package/dist/components/FilterBar.es.js +3 -3
  97. package/dist/components/FormFieldBlocks.cjs.js +1 -1
  98. package/dist/components/FormFieldBlocks.es.js +1 -1
  99. package/dist/components/Input.cjs.js +1 -1
  100. package/dist/components/Input.es.js +1 -1
  101. package/dist/components/InputGroup.cjs.js +1 -1
  102. package/dist/components/InputGroup.es.js +1 -1
  103. package/dist/components/InputNumber.cjs.js +1 -1
  104. package/dist/components/InputNumber.es.js +1 -1
  105. package/dist/components/JSONSchemaForm.cjs.js +1 -1
  106. package/dist/components/JSONSchemaForm.es.js +1 -1
  107. package/dist/components/MarkdownRenderer.cjs.js +1 -1
  108. package/dist/components/MarkdownRenderer.es.js +1 -1
  109. package/dist/components/MetricsCard.cjs.js +1 -1
  110. package/dist/components/MetricsCard.es.js +1 -1
  111. package/dist/components/PropertyFilter.cjs.js +2 -2
  112. package/dist/components/PropertyFilter.es.js +2 -2
  113. package/dist/components/RuleBuilder.cjs.js +1 -1
  114. package/dist/components/RuleBuilder.es.js +1 -1
  115. package/dist/components/SavedViews.cjs.js +3 -3
  116. package/dist/components/SavedViews.cjs.js.map +1 -1
  117. package/dist/components/SavedViews.es.js +3 -3
  118. package/dist/components/SavedViews.es.js.map +1 -1
  119. package/dist/components/SearchInput.cjs.js +1 -1
  120. package/dist/components/SearchInput.es.js +1 -1
  121. package/dist/components/SideDialog.cjs.js +1 -1
  122. package/dist/components/SideDialog.es.js +1 -1
  123. package/dist/components/Sidebar.cjs.js +1 -1
  124. package/dist/components/Sidebar.es.js +1 -1
  125. package/dist/components/Tabs.cjs.js +2 -2
  126. package/dist/components/Tabs.es.js +2 -2
  127. package/dist/components/Textarea.cjs.js +1 -1
  128. package/dist/components/Textarea.cjs.js.map +1 -1
  129. package/dist/components/Textarea.es.js +1 -1
  130. package/dist/components/Textarea.es.js.map +1 -1
  131. package/dist/components/ThreadRail.cjs.js +2 -0
  132. package/dist/components/ThreadRail.cjs.js.map +1 -1
  133. package/dist/components/ThreadRail.es.js +2 -0
  134. package/dist/components/ThreadRail.es.js.map +1 -1
  135. package/dist/components/Tree.cjs.js +1 -1
  136. package/dist/components/Tree.es.js +1 -1
  137. package/dist/components/Workflow.cjs.js +1 -1
  138. package/dist/components/Workflow.es.js +1 -1
  139. package/dist/components/ai/activity.cjs.js +1 -1
  140. package/dist/components/ai/activity.es.js +1 -1
  141. package/dist/components/ai/ask-user.cjs.js +1 -1
  142. package/dist/components/ai/ask-user.es.js +1 -1
  143. package/dist/components/ai/plan.cjs.js +1 -1
  144. package/dist/components/ai/plan.es.js +1 -1
  145. package/dist/components/ai/tool-approval.cjs.js +1 -1
  146. package/dist/components/ai/tool-approval.es.js +1 -1
  147. package/dist/components/ai/tool-call.cjs.js +1 -1
  148. package/dist/components/ai/tool-call.es.js +1 -1
  149. package/dist/{date-time-range-picker-DdNgKD87.js → date-time-range-picker-CJyhcug7.js} +3 -3
  150. package/dist/{date-time-range-picker-DdNgKD87.js.map → date-time-range-picker-CJyhcug7.js.map} +1 -1
  151. package/dist/{date-time-range-picker-Bq-8IPtS.cjs → date-time-range-picker-Dhnuwa-U.cjs} +3 -3
  152. package/dist/{date-time-range-picker-Bq-8IPtS.cjs.map → date-time-range-picker-Dhnuwa-U.cjs.map} +1 -1
  153. package/dist/domains/chat/activity/activity-stretch-line.cjs.js +1 -1
  154. package/dist/domains/chat/activity/activity-stretch-line.es.js +1 -1
  155. package/dist/domains/chat/activity/components/activity-fold.cjs.js +1 -1
  156. package/dist/domains/chat/activity/components/activity-fold.es.js +1 -1
  157. package/dist/domains/chat/activity/components/calls-panel.cjs.js +1 -1
  158. package/dist/domains/chat/activity/components/calls-panel.es.js +1 -1
  159. package/dist/domains/chat/activity/components/stretch-content.cjs.js +1 -1
  160. package/dist/domains/chat/activity/components/stretch-content.es.js +1 -1
  161. package/dist/domains/chat/activity/components/stretch-thought.cjs.js +1 -1
  162. package/dist/domains/chat/activity/components/stretch-thought.es.js +1 -1
  163. package/dist/domains/chat/activity/model/activity-segments.cjs.js +1 -1
  164. package/dist/domains/chat/activity/model/activity-segments.es.js +1 -1
  165. package/dist/domains/chat/activity/model/activity-words.cjs.js +1 -1
  166. package/dist/domains/chat/activity/model/activity-words.es.js +1 -1
  167. package/dist/domains/chat/attachments/composer-attachment-list.cjs.js +1 -1
  168. package/dist/domains/chat/attachments/composer-attachment-list.es.js +1 -1
  169. package/dist/domains/chat/attachments/split-message-attachments.cjs.js +4 -1
  170. package/dist/domains/chat/attachments/split-message-attachments.cjs.js.map +1 -1
  171. package/dist/domains/chat/attachments/split-message-attachments.es.js +4 -1
  172. package/dist/domains/chat/attachments/split-message-attachments.es.js.map +1 -1
  173. package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
  174. package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
  175. package/dist/domains/chat/components/network-choice-metadata-dialog.cjs.js +1 -1
  176. package/dist/domains/chat/components/network-choice-metadata-dialog.es.js +1 -1
  177. package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js +1 -1
  178. package/dist/domains/chat/knowledge/pinned-knowledge.es.js +1 -1
  179. package/dist/domains/chat/messages/dataset-save-action.cjs.js +1 -1
  180. package/dist/domains/chat/messages/dataset-save-action.es.js +1 -1
  181. package/dist/domains/chat/messages/message-row.cjs.js +2 -2
  182. package/dist/domains/chat/messages/message-row.es.js +2 -2
  183. package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
  184. package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
  185. package/dist/domains/chat/messages/reasoning-content.cjs.js +1 -1
  186. package/dist/domains/chat/messages/reasoning-content.es.js +1 -1
  187. package/dist/domains/chat/messages/renderers/message-text.cjs.js +1 -1
  188. package/dist/domains/chat/messages/renderers/message-text.es.js +1 -1
  189. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js +1 -1
  190. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js +1 -1
  191. package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
  192. package/dist/domains/chat/messages/signal-badge.es.js +1 -1
  193. package/dist/domains/chat/messages/skill-message.cjs.js +2 -2
  194. package/dist/domains/chat/messages/skill-message.es.js +2 -2
  195. package/dist/domains/chat/messages/system-reminder-badge.cjs.js +1 -1
  196. package/dist/domains/chat/messages/system-reminder-badge.es.js +1 -1
  197. package/dist/domains/chat/messages/tripwire-notice.cjs.js +5 -10
  198. package/dist/domains/chat/messages/tripwire-notice.cjs.js.map +1 -1
  199. package/dist/domains/chat/messages/tripwire-notice.es.js +5 -10
  200. package/dist/domains/chat/messages/tripwire-notice.es.js.map +1 -1
  201. package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
  202. package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
  203. package/dist/domains/chat/tools/badges/agent-badge.cjs.js +1 -1
  204. package/dist/domains/chat/tools/badges/agent-badge.es.js +1 -1
  205. package/dist/domains/chat/tools/badges/ask-user-badge.cjs.js +1 -1
  206. package/dist/domains/chat/tools/badges/ask-user-badge.es.js +1 -1
  207. package/dist/domains/chat/tools/badges/background-task-metadata-dialog.cjs.js +1 -1
  208. package/dist/domains/chat/tools/badges/background-task-metadata-dialog.es.js +1 -1
  209. package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js +1 -1
  210. package/dist/domains/chat/tools/badges/code-mode-badge.es.js +1 -1
  211. package/dist/domains/chat/tools/badges/file-tree-badge.cjs.js +1 -1
  212. package/dist/domains/chat/tools/badges/file-tree-badge.es.js +1 -1
  213. package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js +2 -2
  214. package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js +2 -2
  215. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +2 -2
  216. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +2 -2
  217. package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js +2 -2
  218. package/dist/domains/chat/tools/badges/observation-marker-details.es.js +2 -2
  219. package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
  220. package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
  221. package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js +1 -1
  222. package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +1 -1
  223. package/dist/domains/chat/tools/badges/tool-approval-badge.cjs.js +1 -1
  224. package/dist/domains/chat/tools/badges/tool-approval-badge.es.js +1 -1
  225. package/dist/domains/chat/tools/badges/tool-badge.cjs.js +2 -2
  226. package/dist/domains/chat/tools/badges/tool-badge.es.js +2 -2
  227. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +2 -2
  228. package/dist/domains/chat/tools/badges/workflow-badge.es.js +2 -2
  229. package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js +2 -2
  230. package/dist/domains/chat/tools/mcp-input-request-tool.es.js +2 -2
  231. package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
  232. package/dist/domains/chat/tools/tool-card.es.js +1 -1
  233. package/dist/domains/chat/tools/tool-groups.cjs.js +1 -1
  234. package/dist/domains/chat/tools/tool-groups.es.js +1 -1
  235. package/dist/domains/dashboards/components/connected-widget.cjs.js +55 -0
  236. package/dist/domains/dashboards/components/connected-widget.cjs.js.map +1 -0
  237. package/dist/domains/dashboards/components/connected-widget.d.ts +1 -0
  238. package/dist/domains/dashboards/components/connected-widget.es.js +54 -0
  239. package/dist/domains/dashboards/components/connected-widget.es.js.map +1 -0
  240. package/dist/domains/dashboards/components/dashboard-renderer.cjs.js +13 -8
  241. package/dist/domains/dashboards/components/dashboard-renderer.cjs.js.map +1 -1
  242. package/dist/domains/dashboards/components/dashboard-renderer.es.js +13 -8
  243. package/dist/domains/dashboards/components/dashboard-renderer.es.js.map +1 -1
  244. package/dist/domains/dashboards/components/stateless-widget.cjs.js +30 -0
  245. package/dist/domains/dashboards/components/stateless-widget.cjs.js.map +1 -0
  246. package/dist/domains/dashboards/components/stateless-widget.d.ts +1 -0
  247. package/dist/domains/dashboards/components/stateless-widget.es.js +29 -0
  248. package/dist/domains/dashboards/components/stateless-widget.es.js.map +1 -0
  249. package/dist/domains/dashboards/components/view-gate.cjs.js +18 -40
  250. package/dist/domains/dashboards/components/view-gate.cjs.js.map +1 -1
  251. package/dist/domains/dashboards/components/view-gate.es.js +18 -40
  252. package/dist/domains/dashboards/components/view-gate.es.js.map +1 -1
  253. package/dist/domains/dashboards/components/widget-chrome.cjs.js +1 -1
  254. package/dist/domains/dashboards/components/widget-chrome.es.js +1 -1
  255. package/dist/domains/dashboards/components/widget-controls.cjs.js +106 -0
  256. package/dist/domains/dashboards/components/widget-controls.cjs.js.map +1 -1
  257. package/dist/domains/dashboards/components/widget-controls.es.js +107 -3
  258. package/dist/domains/dashboards/components/widget-controls.es.js.map +1 -1
  259. package/dist/domains/dashboards/components/widget-error.cjs.js +1 -1
  260. package/dist/domains/dashboards/components/widget-error.es.js +1 -1
  261. package/dist/domains/dashboards/hooks/use-dashboard-environment.cjs.js +55 -0
  262. package/dist/domains/dashboards/hooks/use-dashboard-environment.cjs.js.map +1 -0
  263. package/dist/domains/dashboards/hooks/use-dashboard-environment.d.ts +1 -0
  264. package/dist/domains/dashboards/hooks/use-dashboard-environment.es.js +53 -0
  265. package/dist/domains/dashboards/hooks/use-dashboard-environment.es.js.map +1 -0
  266. package/dist/domains/dashboards/hooks/use-dashboard-requests.cjs.js +24 -0
  267. package/dist/domains/dashboards/hooks/use-dashboard-requests.cjs.js.map +1 -1
  268. package/dist/domains/dashboards/hooks/use-dashboard-requests.es.js +23 -1
  269. package/dist/domains/dashboards/hooks/use-dashboard-requests.es.js.map +1 -1
  270. package/dist/domains/dashboards/hooks/use-widget-views.cjs.js +10 -6
  271. package/dist/domains/dashboards/hooks/use-widget-views.cjs.js.map +1 -1
  272. package/dist/domains/dashboards/hooks/use-widget-views.es.js +10 -7
  273. package/dist/domains/dashboards/hooks/use-widget-views.es.js.map +1 -1
  274. package/dist/domains/dashboards/kinds/kpis/kpis-plan.cjs.js +11 -0
  275. package/dist/domains/dashboards/kinds/kpis/kpis-plan.cjs.js.map +1 -0
  276. package/dist/domains/dashboards/kinds/kpis/kpis-plan.d.ts +1 -0
  277. package/dist/domains/dashboards/kinds/kpis/kpis-plan.es.js +9 -0
  278. package/dist/domains/dashboards/kinds/kpis/kpis-plan.es.js.map +1 -0
  279. package/dist/domains/dashboards/kinds/kpis/kpis-widget.cjs.js +18 -19
  280. package/dist/domains/dashboards/kinds/kpis/kpis-widget.cjs.js.map +1 -1
  281. package/dist/domains/dashboards/kinds/kpis/kpis-widget.es.js +18 -19
  282. package/dist/domains/dashboards/kinds/kpis/kpis-widget.es.js.map +1 -1
  283. package/dist/domains/dashboards/kinds/kpis.cjs.js +3 -0
  284. package/dist/domains/dashboards/kinds/kpis.cjs.js.map +1 -1
  285. package/dist/domains/dashboards/kinds/kpis.es.js +3 -0
  286. package/dist/domains/dashboards/kinds/kpis.es.js.map +1 -1
  287. package/dist/domains/dashboards/kinds/scores/scores-plan.cjs.js +27 -0
  288. package/dist/domains/dashboards/kinds/scores/scores-plan.cjs.js.map +1 -0
  289. package/dist/domains/dashboards/kinds/scores/scores-plan.d.ts +1 -0
  290. package/dist/domains/dashboards/kinds/scores/scores-plan.es.js +24 -0
  291. package/dist/domains/dashboards/kinds/scores/scores-plan.es.js.map +1 -0
  292. package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js +25 -32
  293. package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js.map +1 -1
  294. package/dist/domains/dashboards/kinds/scores/scores-widget.es.js +26 -33
  295. package/dist/domains/dashboards/kinds/scores/scores-widget.es.js.map +1 -1
  296. package/dist/domains/dashboards/kinds/scores.cjs.js +4 -0
  297. package/dist/domains/dashboards/kinds/scores.cjs.js.map +1 -1
  298. package/dist/domains/dashboards/kinds/scores.es.js +4 -0
  299. package/dist/domains/dashboards/kinds/scores.es.js.map +1 -1
  300. package/dist/domains/dashboards/kinds/table/table-cells.cjs.js +2 -6
  301. package/dist/domains/dashboards/kinds/table/table-cells.cjs.js.map +1 -1
  302. package/dist/domains/dashboards/kinds/table/table-cells.es.js +2 -6
  303. package/dist/domains/dashboards/kinds/table/table-cells.es.js.map +1 -1
  304. package/dist/domains/dashboards/kinds/table/table-columns.cjs.js +5 -3
  305. package/dist/domains/dashboards/kinds/table/table-columns.cjs.js.map +1 -1
  306. package/dist/domains/dashboards/kinds/table/table-columns.es.js +5 -3
  307. package/dist/domains/dashboards/kinds/table/table-columns.es.js.map +1 -1
  308. package/dist/domains/dashboards/kinds/table/table-plan.cjs.js +47 -0
  309. package/dist/domains/dashboards/kinds/table/table-plan.cjs.js.map +1 -0
  310. package/dist/domains/dashboards/kinds/table/table-plan.d.ts +1 -0
  311. package/dist/domains/dashboards/kinds/table/table-plan.es.js +44 -0
  312. package/dist/domains/dashboards/kinds/table/table-plan.es.js.map +1 -0
  313. package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js +20 -26
  314. package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js.map +1 -1
  315. package/dist/domains/dashboards/kinds/table/table-tabs.es.js +22 -28
  316. package/dist/domains/dashboards/kinds/table/table-tabs.es.js.map +1 -1
  317. package/dist/domains/dashboards/kinds/table/table-view.cjs.js +13 -13
  318. package/dist/domains/dashboards/kinds/table/table-view.cjs.js.map +1 -1
  319. package/dist/domains/dashboards/kinds/table/table-view.es.js +14 -14
  320. package/dist/domains/dashboards/kinds/table/table-view.es.js.map +1 -1
  321. package/dist/domains/dashboards/kinds/table/table-widget.cjs.js +13 -17
  322. package/dist/domains/dashboards/kinds/table/table-widget.cjs.js.map +1 -1
  323. package/dist/domains/dashboards/kinds/table/table-widget.es.js +13 -17
  324. package/dist/domains/dashboards/kinds/table/table-widget.es.js.map +1 -1
  325. package/dist/domains/dashboards/kinds/table.cjs.js +4 -0
  326. package/dist/domains/dashboards/kinds/table.cjs.js.map +1 -1
  327. package/dist/domains/dashboards/kinds/table.es.js +4 -0
  328. package/dist/domains/dashboards/kinds/table.es.js.map +1 -1
  329. package/dist/domains/dashboards/kinds/timeseries/timeseries-plan.cjs.js +18 -0
  330. package/dist/domains/dashboards/kinds/timeseries/timeseries-plan.cjs.js.map +1 -0
  331. package/dist/domains/dashboards/kinds/timeseries/timeseries-plan.d.ts +1 -0
  332. package/dist/domains/dashboards/kinds/timeseries/timeseries-plan.es.js +16 -0
  333. package/dist/domains/dashboards/kinds/timeseries/timeseries-plan.es.js.map +1 -0
  334. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js +22 -22
  335. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js.map +1 -1
  336. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js +25 -25
  337. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js.map +1 -1
  338. package/dist/domains/dashboards/kinds/timeseries.cjs.js +3 -0
  339. package/dist/domains/dashboards/kinds/timeseries.cjs.js.map +1 -1
  340. package/dist/domains/dashboards/kinds/timeseries.es.js +3 -0
  341. package/dist/domains/dashboards/kinds/timeseries.es.js.map +1 -1
  342. package/dist/domains/dashboards/lib/alert-actions.cjs.js +123 -0
  343. package/dist/domains/dashboards/lib/alert-actions.cjs.js.map +1 -0
  344. package/dist/domains/dashboards/lib/alert-actions.d.ts +1 -0
  345. package/dist/domains/dashboards/lib/alert-actions.es.js +118 -0
  346. package/dist/domains/dashboards/lib/alert-actions.es.js.map +1 -0
  347. package/dist/domains/dashboards/lib/gate.cjs.js +62 -0
  348. package/dist/domains/dashboards/lib/gate.cjs.js.map +1 -0
  349. package/dist/domains/dashboards/lib/gate.d.ts +1 -0
  350. package/dist/domains/dashboards/lib/gate.es.js +60 -0
  351. package/dist/domains/dashboards/lib/gate.es.js.map +1 -0
  352. package/dist/domains/dashboards/lib/plan-widget.cjs.js +41 -0
  353. package/dist/domains/dashboards/lib/plan-widget.cjs.js.map +1 -0
  354. package/dist/domains/dashboards/lib/plan-widget.d.ts +1 -0
  355. package/dist/domains/dashboards/lib/plan-widget.es.js +38 -0
  356. package/dist/domains/dashboards/lib/plan-widget.es.js.map +1 -0
  357. package/dist/domains/dashboards/lib/requests.cjs.js +47 -0
  358. package/dist/domains/dashboards/lib/requests.cjs.js.map +1 -1
  359. package/dist/domains/dashboards/lib/requests.es.js +46 -1
  360. package/dist/domains/dashboards/lib/requests.es.js.map +1 -1
  361. package/dist/domains/dashboards/lib/scores.cjs.js +32 -0
  362. package/dist/domains/dashboards/lib/scores.cjs.js.map +1 -1
  363. package/dist/domains/dashboards/lib/scores.es.js +31 -1
  364. package/dist/domains/dashboards/lib/scores.es.js.map +1 -1
  365. package/dist/domains/dashboards/lib/timeseries.cjs.js +17 -0
  366. package/dist/domains/dashboards/lib/timeseries.cjs.js.map +1 -1
  367. package/dist/domains/dashboards/lib/timeseries.es.js +17 -1
  368. package/dist/domains/dashboards/lib/timeseries.es.js.map +1 -1
  369. package/dist/domains/dashboards/lib/values.cjs.js.map +1 -1
  370. package/dist/domains/dashboards/lib/values.es.js.map +1 -1
  371. package/dist/domains/dashboards/widget-kind.cjs.js.map +1 -1
  372. package/dist/domains/dashboards/widget-kind.es.js.map +1 -1
  373. package/dist/domains/dashboards.cjs.js +19 -2
  374. package/dist/domains/dashboards.es.js +9 -5
  375. package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.cjs.js +1 -1
  376. package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.es.js +1 -1
  377. package/dist/domains/datasets/components/add-dataset-item-dialog/trajectory-editor.cjs.js +2 -2
  378. package/dist/domains/datasets/components/add-dataset-item-dialog/trajectory-editor.es.js +2 -2
  379. package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js +2 -2
  380. package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js +2 -2
  381. package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js +186 -212
  382. package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js.map +1 -1
  383. package/dist/domains/knowledge/components/KnowledgePageDetail.es.js +188 -215
  384. package/dist/domains/knowledge/components/KnowledgePageDetail.es.js.map +1 -1
  385. package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js +620 -268
  386. package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js.map +1 -1
  387. package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js +622 -270
  388. package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js.map +1 -1
  389. package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js +544 -454
  390. package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js.map +1 -1
  391. package/dist/domains/knowledge/components/KnowledgePageGraph.es.js +548 -458
  392. package/dist/domains/knowledge/components/KnowledgePageGraph.es.js.map +1 -1
  393. package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js +21 -12
  394. package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js.map +1 -1
  395. package/dist/domains/knowledge/components/KnowledgePageTree.es.js +22 -13
  396. package/dist/domains/knowledge/components/KnowledgePageTree.es.js.map +1 -1
  397. package/dist/domains/knowledge/components/KnowledgeSourceIcon.cjs.js +16 -0
  398. package/dist/domains/knowledge/components/KnowledgeSourceIcon.cjs.js.map +1 -0
  399. package/dist/domains/knowledge/components/KnowledgeSourceIcon.d.ts +1 -0
  400. package/dist/domains/knowledge/components/KnowledgeSourceIcon.es.js +15 -0
  401. package/dist/domains/knowledge/components/KnowledgeSourceIcon.es.js.map +1 -0
  402. package/dist/domains/knowledge/components/KnowledgeTooltip.cjs.js +10 -0
  403. package/dist/domains/knowledge/components/KnowledgeTooltip.cjs.js.map +1 -0
  404. package/dist/domains/knowledge/components/KnowledgeTooltip.d.ts +1 -0
  405. package/dist/domains/knowledge/components/KnowledgeTooltip.es.js +9 -0
  406. package/dist/domains/knowledge/components/KnowledgeTooltip.es.js.map +1 -0
  407. package/dist/domains/knowledge/lib/fitViewport.cjs.js +22 -8
  408. package/dist/domains/knowledge/lib/fitViewport.cjs.js.map +1 -1
  409. package/dist/domains/knowledge/lib/fitViewport.es.js +22 -9
  410. package/dist/domains/knowledge/lib/fitViewport.es.js.map +1 -1
  411. package/dist/domains/knowledge/lib/pageAddress.cjs.js +51 -0
  412. package/dist/domains/knowledge/lib/pageAddress.cjs.js.map +1 -1
  413. package/dist/domains/knowledge/lib/pageAddress.es.js +50 -1
  414. package/dist/domains/knowledge/lib/pageAddress.es.js.map +1 -1
  415. package/dist/domains/knowledge/lib/pageRefs.cjs.js +43 -2
  416. package/dist/domains/knowledge/lib/pageRefs.cjs.js.map +1 -1
  417. package/dist/domains/knowledge/lib/pageRefs.es.js +43 -3
  418. package/dist/domains/knowledge/lib/pageRefs.es.js.map +1 -1
  419. package/dist/domains/knowledge/lib/pagesByRefContext.cjs.js +10 -0
  420. package/dist/domains/knowledge/lib/pagesByRefContext.cjs.js.map +1 -0
  421. package/dist/domains/knowledge/lib/pagesByRefContext.d.ts +1 -0
  422. package/dist/domains/knowledge/lib/pagesByRefContext.es.js +10 -0
  423. package/dist/domains/knowledge/lib/pagesByRefContext.es.js.map +1 -0
  424. package/dist/domains/logs/components/log-data-panel.cjs.js +1 -1
  425. package/dist/domains/logs/components/log-data-panel.es.js +1 -1
  426. package/dist/domains/logs/components/logs-saved-views.cjs.js +1 -1
  427. package/dist/domains/logs/components/logs-saved-views.es.js +1 -1
  428. package/dist/domains/logs/components/logs-toolbar.cjs.js +1 -1
  429. package/dist/domains/logs/components/logs-toolbar.es.js +1 -1
  430. package/dist/domains/mcps/components/mcp-app-tool-result.cjs.js +28 -3
  431. package/dist/domains/mcps/components/mcp-app-tool-result.cjs.js.map +1 -1
  432. package/dist/domains/mcps/components/mcp-app-tool-result.es.js +27 -2
  433. package/dist/domains/mcps/components/mcp-app-tool-result.es.js.map +1 -1
  434. package/dist/domains/mcps/components/mcp-app-viewer.cjs.js +163 -2
  435. package/dist/domains/mcps/components/mcp-app-viewer.cjs.js.map +1 -0
  436. package/dist/domains/mcps/components/mcp-app-viewer.es.js +163 -1
  437. package/dist/domains/mcps/components/mcp-app-viewer.es.js.map +1 -0
  438. package/dist/domains/mcps/context/mcp-app-host-context-value.cjs.js +11 -0
  439. package/dist/domains/mcps/context/mcp-app-host-context-value.cjs.js.map +1 -0
  440. package/dist/domains/mcps/context/mcp-app-host-context-value.d.ts +1 -0
  441. package/dist/domains/mcps/context/mcp-app-host-context-value.es.js +9 -0
  442. package/dist/domains/mcps/context/mcp-app-host-context-value.es.js.map +1 -0
  443. package/dist/domains/mcps/context/mcp-app-host-context.cjs.js +14 -0
  444. package/dist/domains/mcps/context/mcp-app-host-context.cjs.js.map +1 -0
  445. package/dist/domains/mcps/context/mcp-app-host-context.d.ts +1 -0
  446. package/dist/domains/mcps/context/mcp-app-host-context.es.js +13 -0
  447. package/dist/domains/mcps/context/mcp-app-host-context.es.js.map +1 -0
  448. package/dist/domains/mcps/hooks/use-mcp-app-tool-call.cjs.js +2 -1
  449. package/dist/domains/mcps/hooks/use-mcp-app-tool-call.cjs.js.map +1 -1
  450. package/dist/domains/mcps/hooks/use-mcp-app-tool-call.es.js +2 -1
  451. package/dist/domains/mcps/hooks/use-mcp-app-tool-call.es.js.map +1 -1
  452. package/dist/domains/mcps.cjs.js +5 -0
  453. package/dist/domains/mcps.d.ts +1 -0
  454. package/dist/domains/mcps.es.js +3 -0
  455. package/dist/domains/metrics/components/agent-runs-card.cjs.js +1 -1
  456. package/dist/domains/metrics/components/agent-runs-card.es.js +1 -1
  457. package/dist/domains/metrics/components/breakdown/breakdown-tab-body.cjs.js +1 -1
  458. package/dist/domains/metrics/components/breakdown/breakdown-tab-body.es.js +1 -1
  459. package/dist/domains/metrics/components/breakdown-card.cjs.js +1 -1
  460. package/dist/domains/metrics/components/breakdown-card.es.js +1 -1
  461. package/dist/domains/metrics/components/chart-area.cjs.js +1 -1
  462. package/dist/domains/metrics/components/chart-area.es.js +1 -1
  463. package/dist/domains/metrics/components/chart-card-error.cjs.js +1 -1
  464. package/dist/domains/metrics/components/chart-card-error.es.js +1 -1
  465. package/dist/domains/metrics/components/chart-card.cjs.js +1 -1
  466. package/dist/domains/metrics/components/chart-card.es.js +1 -1
  467. package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
  468. package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
  469. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js +1 -1
  470. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js +1 -1
  471. package/dist/domains/metrics/components/failure-rate-card.cjs.js +1 -1
  472. package/dist/domains/metrics/components/failure-rate-card.es.js +1 -1
  473. package/dist/domains/metrics/components/latency-card.cjs.js +1 -1
  474. package/dist/domains/metrics/components/latency-card.es.js +1 -1
  475. package/dist/domains/metrics/components/metrics-time-range-chip.cjs.js +1 -1
  476. package/dist/domains/metrics/components/metrics-time-range-chip.es.js +1 -1
  477. package/dist/domains/metrics/components/token-usage-card.cjs.js +1 -1
  478. package/dist/domains/metrics/components/token-usage-card.es.js +1 -1
  479. package/dist/domains/metrics/components/trace-aggregate-card.cjs.js +1 -1
  480. package/dist/domains/metrics/components/trace-aggregate-card.es.js +1 -1
  481. package/dist/domains/metrics.cjs.js +3 -3
  482. package/dist/domains/metrics.es.js +3 -3
  483. package/dist/domains/observability/saved-views/observability-saved-views.cjs.js +1 -1
  484. package/dist/domains/observability/saved-views/observability-saved-views.es.js +1 -1
  485. package/dist/domains/observability/saved-views.cjs.js +1 -1
  486. package/dist/domains/observability/saved-views.es.js +1 -1
  487. package/dist/domains/observability.cjs.js +1 -1
  488. package/dist/domains/observability.es.js +1 -1
  489. package/dist/domains/scores/components/score-data-panel.cjs.js +1 -1
  490. package/dist/domains/scores/components/score-data-panel.es.js +1 -1
  491. package/dist/domains/scores/components/span-scoring.cjs.js +1 -1
  492. package/dist/domains/scores/components/span-scoring.es.js +1 -1
  493. package/dist/domains/scores/components/trace-scores-list.cjs.js +1 -1
  494. package/dist/domains/scores/components/trace-scores-list.es.js +1 -1
  495. package/dist/domains/skills/skill-simple-form.cjs.js +3 -3
  496. package/dist/domains/skills/skill-simple-form.es.js +3 -3
  497. package/dist/domains/spans/components/spans-explorer-body.cjs.js +1 -1
  498. package/dist/domains/spans/components/spans-explorer-body.es.js +1 -1
  499. package/dist/domains/spans/components/spans-filter-bar.cjs.js +2 -2
  500. package/dist/domains/spans/components/spans-filter-bar.es.js +2 -2
  501. package/dist/domains/spans/hooks/use-spans-filter-bar.cjs.js +1 -1
  502. package/dist/domains/spans/hooks/use-spans-filter-bar.es.js +1 -1
  503. package/dist/domains/threads/components/threads-explorer-body.cjs.js +1 -1
  504. package/dist/domains/threads/components/threads-explorer-body.es.js +1 -1
  505. package/dist/domains/threads/components/threads-filter-bar.cjs.js +2 -2
  506. package/dist/domains/threads/components/threads-filter-bar.es.js +2 -2
  507. package/dist/domains/threads/hooks/use-threads-filter-bar.cjs.js +1 -1
  508. package/dist/domains/threads/hooks/use-threads-filter-bar.es.js +1 -1
  509. package/dist/domains/traces/components/feedback-options.cjs.js +0 -0
  510. package/dist/domains/traces/components/feedback-options.d.ts +1 -0
  511. package/dist/domains/traces/components/feedback-options.es.js +0 -0
  512. package/dist/domains/traces/components/feedback-thread.cjs.js +10 -4
  513. package/dist/domains/traces/components/feedback-thread.cjs.js.map +1 -1
  514. package/dist/domains/traces/components/feedback-thread.es.js +10 -4
  515. package/dist/domains/traces/components/feedback-thread.es.js.map +1 -1
  516. package/dist/domains/traces/components/span-data-panel-view.cjs.js +2 -2
  517. package/dist/domains/traces/components/span-data-panel-view.es.js +2 -2
  518. package/dist/domains/traces/components/span-details-view.cjs.js +1 -1
  519. package/dist/domains/traces/components/span-details-view.es.js +1 -1
  520. package/dist/domains/traces/components/span-feedback-tab.cjs.js +8 -5
  521. package/dist/domains/traces/components/span-feedback-tab.cjs.js.map +1 -1
  522. package/dist/domains/traces/components/span-feedback-tab.es.js +8 -5
  523. package/dist/domains/traces/components/span-feedback-tab.es.js.map +1 -1
  524. package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
  525. package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
  526. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
  527. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
  528. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +2 -2
  529. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +2 -2
  530. package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js +1 -1
  531. package/dist/domains/traces/components/span-payload/span-payload-json.es.js +1 -1
  532. package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +2 -2
  533. package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +2 -2
  534. package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
  535. package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
  536. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +1 -1
  537. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
  538. package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +1 -1
  539. package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +1 -1
  540. package/dist/domains/traces/components/span-payload/span-processor-mutations.cjs.js +1 -1
  541. package/dist/domains/traces/components/span-payload/span-processor-mutations.es.js +1 -1
  542. package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js +1 -1
  543. package/dist/domains/traces/components/span-payload/span-tools-section.es.js +1 -1
  544. package/dist/domains/traces/components/span-summary-description.cjs.js +1 -1
  545. package/dist/domains/traces/components/span-summary-description.es.js +1 -1
  546. package/dist/domains/traces/components/thread-trace/thread-trace-details.cjs.js +1 -1
  547. package/dist/domains/traces/components/thread-trace/thread-trace-details.es.js +1 -1
  548. package/dist/domains/traces/components/thread-trace/thread-trace-messages.cjs.js +2 -2
  549. package/dist/domains/traces/components/thread-trace/thread-trace-messages.es.js +2 -2
  550. package/dist/domains/traces/components/thread-trace/thread-trace-row.cjs.js +1 -1
  551. package/dist/domains/traces/components/thread-trace/thread-trace-row.es.js +1 -1
  552. package/dist/domains/traces/components/thread-view-by-trace.cjs.js +5 -3
  553. package/dist/domains/traces/components/thread-view-by-trace.cjs.js.map +1 -1
  554. package/dist/domains/traces/components/thread-view-by-trace.es.js +5 -3
  555. package/dist/domains/traces/components/thread-view-by-trace.es.js.map +1 -1
  556. package/dist/domains/traces/components/trace-columns-menu.cjs.js +2 -2
  557. package/dist/domains/traces/components/trace-columns-menu.es.js +2 -2
  558. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +2 -2
  559. package/dist/domains/traces/components/trace-data-panel-view.es.js +2 -2
  560. package/dist/domains/traces/components/trace-details-view.cjs.js +1 -1
  561. package/dist/domains/traces/components/trace-details-view.es.js +1 -1
  562. package/dist/domains/traces/components/trace-feedback-tab.cjs.js +9 -4
  563. package/dist/domains/traces/components/trace-feedback-tab.cjs.js.map +1 -1
  564. package/dist/domains/traces/components/trace-feedback-tab.es.js +9 -4
  565. package/dist/domains/traces/components/trace-feedback-tab.es.js.map +1 -1
  566. package/dist/domains/traces/components/trace-id-button.cjs.js +1 -1
  567. package/dist/domains/traces/components/trace-id-button.es.js +1 -1
  568. package/dist/domains/traces/components/trace-span-panel.cjs.js +2 -1
  569. package/dist/domains/traces/components/trace-span-panel.cjs.js.map +1 -1
  570. package/dist/domains/traces/components/trace-span-panel.es.js +2 -1
  571. package/dist/domains/traces/components/trace-span-panel.es.js.map +1 -1
  572. package/dist/domains/traces/components/trace-summary-description.cjs.js +1 -1
  573. package/dist/domains/traces/components/trace-summary-description.es.js +1 -1
  574. package/dist/domains/traces/components/trace-thread-panel.cjs.js +3 -2
  575. package/dist/domains/traces/components/trace-thread-panel.cjs.js.map +1 -1
  576. package/dist/domains/traces/components/trace-thread-panel.es.js +3 -2
  577. package/dist/domains/traces/components/trace-thread-panel.es.js.map +1 -1
  578. package/dist/domains/traces/components/traces-explorer/traces-explorer-context.cjs.js.map +1 -1
  579. package/dist/domains/traces/components/traces-explorer/traces-explorer-context.es.js.map +1 -1
  580. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js +2 -2
  581. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +2 -2
  582. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.cjs.js +8 -3
  583. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.cjs.js.map +1 -1
  584. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.es.js +8 -3
  585. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.es.js.map +1 -1
  586. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.cjs.js +14 -1
  587. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.cjs.js.map +1 -1
  588. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.es.js +14 -1
  589. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.es.js.map +1 -1
  590. package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.cjs.js +1 -1
  591. package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.es.js +1 -1
  592. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.cjs.js +1 -1
  593. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js +1 -1
  594. package/dist/domains/traces/components/traces-explorer.cjs.js.map +1 -1
  595. package/dist/domains/traces/components/traces-explorer.es.js.map +1 -1
  596. package/dist/domains/traces/components/traces-list-mode-toggle.cjs.js +1 -1
  597. package/dist/domains/traces/components/traces-list-mode-toggle.es.js +1 -1
  598. package/dist/domains/traces/components/traces-list-view.cjs.js +1 -1
  599. package/dist/domains/traces/components/traces-list-view.es.js +1 -1
  600. package/dist/domains/traces/components/traces-spans-switch.cjs.js +1 -1
  601. package/dist/domains/traces/components/traces-spans-switch.es.js +1 -1
  602. package/dist/domains/workflows/components/workflow-combobox.cjs.js +1 -1
  603. package/dist/domains/workflows/components/workflow-combobox.es.js +1 -1
  604. package/dist/domains/workflows/components/workflow-layout.cjs.js +1 -1
  605. package/dist/domains/workflows/components/workflow-layout.es.js +1 -1
  606. package/dist/domains/workflows/components/workflow-step-detail.cjs.js +2 -2
  607. package/dist/domains/workflows/components/workflow-step-detail.es.js +2 -2
  608. package/dist/domains/workflows/workflow/data/workflow-data-button.cjs.js +1 -1
  609. package/dist/domains/workflows/workflow/data/workflow-data-button.es.js +1 -1
  610. package/dist/domains/workflows/workflow/data/workflow-data-inspector.cjs.js +1 -1
  611. package/dist/domains/workflows/workflow/data/workflow-data-inspector.es.js +1 -1
  612. package/dist/domains/workflows/workflow/input/workflow-json-input.cjs.js +1 -1
  613. package/dist/domains/workflows/workflow/input/workflow-json-input.es.js +1 -1
  614. package/dist/domains/workflows/workflow/use-workflow-graph-runtime.cjs.js +1 -1
  615. package/dist/domains/workflows/workflow/use-workflow-graph-runtime.es.js +1 -1
  616. package/dist/domains/workflows/workflow/utils.cjs.js +1 -1
  617. package/dist/domains/workflows/workflow/utils.es.js +1 -1
  618. package/dist/domains/workflows/workflow/workflow-body-graph.cjs.js +1 -1
  619. package/dist/domains/workflows/workflow/workflow-body-graph.es.js +1 -1
  620. package/dist/domains/workflows/workflow/workflow-data-edge.cjs.js +1 -1
  621. package/dist/domains/workflows/workflow/workflow-data-edge.es.js +1 -1
  622. package/dist/domains/workflows/workflow/workflow-debug-step-controls.cjs.js +1 -1
  623. package/dist/domains/workflows/workflow/workflow-debug-step-controls.es.js +1 -1
  624. package/dist/domains/workflows/workflow/workflow-graph-inner.cjs.js +2 -2
  625. package/dist/domains/workflows/workflow/workflow-graph-inner.es.js +2 -2
  626. package/dist/domains/workflows/workflow/workflow-graph-layout.cjs.js +1 -1
  627. package/dist/domains/workflows/workflow/workflow-graph-layout.es.js +1 -1
  628. package/dist/domains/workflows/workflow/workflow-graph-node.cjs.js +1 -1
  629. package/dist/domains/workflows/workflow/workflow-graph-node.es.js +1 -1
  630. package/dist/domains/workflows/workflow/workflow-graph.cjs.js +1 -1
  631. package/dist/domains/workflows/workflow/workflow-graph.es.js +1 -1
  632. package/dist/domains/workflows/workflow/workflow-map-config-dialog.cjs.js +1 -1
  633. package/dist/domains/workflows/workflow/workflow-map-config-dialog.es.js +1 -1
  634. package/dist/domains/workflows/workflow/workflow-nested-graph.cjs.js +1 -1
  635. package/dist/domains/workflows/workflow/workflow-nested-graph.es.js +1 -1
  636. package/dist/domains/workflows/workflow/workflow-run-data.cjs.js +3 -3
  637. package/dist/domains/workflows/workflow/workflow-run-data.es.js +3 -3
  638. package/dist/domains/workflows/workflow/workflow-status.cjs.js +1 -1
  639. package/dist/domains/workflows/workflow/workflow-status.es.js +1 -1
  640. package/dist/domains/workflows/workflow/workflow-step-action-bar.cjs.js +1 -1
  641. package/dist/domains/workflows/workflow/workflow-step-action-bar.es.js +1 -1
  642. package/dist/domains/workflows/workflow/workflow-step-node-utils.cjs.js +1 -1
  643. package/dist/domains/workflows/workflow/workflow-step-node-utils.es.js +1 -1
  644. package/dist/domains/workflows/workflow/workflow-suspended-steps.cjs.js +1 -1
  645. package/dist/domains/workflows/workflow/workflow-suspended-steps.es.js +1 -1
  646. package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js +1 -1
  647. package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js +1 -1
  648. package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js +1 -1
  649. package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +1 -1
  650. package/dist/domains/workspace/components/workspace-create-directory.cjs.js +1 -1
  651. package/dist/domains/workspace/components/workspace-create-directory.es.js +1 -1
  652. package/dist/domains/workspace/components/workspace-markdown-preview.cjs.js +1 -1
  653. package/dist/domains/workspace/components/workspace-markdown-preview.es.js +1 -1
  654. package/dist/domains/workspace/components/workspace-search.cjs.js +1 -1
  655. package/dist/domains/workspace/components/workspace-search.es.js +1 -1
  656. package/dist/domains/workspace/components/workspace-tree.cjs.js +1 -1
  657. package/dist/domains/workspace/components/workspace-tree.es.js +1 -1
  658. package/dist/{dropdown-menu-Dx-jCOIv.cjs → dropdown-menu-D3D8USIY.cjs} +9 -1
  659. package/dist/dropdown-menu-D3D8USIY.cjs.map +1 -0
  660. package/dist/{dropdown-menu-DKoWI8kD.js → dropdown-menu-jsf9D-J_.js} +9 -1
  661. package/dist/dropdown-menu-jsf9D-J_.js.map +1 -0
  662. package/dist/ee/signals/sankey-signals.cjs.js +1 -1
  663. package/dist/ee/signals/sankey-signals.es.js +1 -1
  664. package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +1 -1
  665. package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +1 -1
  666. package/dist/ee/signals/settings/trace-signal-settings.cjs.js +1 -1
  667. package/dist/ee/signals/settings/trace-signal-settings.es.js +1 -1
  668. package/dist/ee/signals/view-mode-tab.cjs.js +1 -1
  669. package/dist/ee/signals/view-mode-tab.es.js +1 -1
  670. package/dist/{filter-bar-chip-NBtfDca9.js → filter-bar-chip-Cz5GYBWP.js} +2 -2
  671. package/dist/{filter-bar-chip-NBtfDca9.js.map → filter-bar-chip-Cz5GYBWP.js.map} +1 -1
  672. package/dist/{filter-bar-chip-DFsbUZ-V.cjs → filter-bar-chip-q2Zr-cnY.cjs} +2 -2
  673. package/dist/{filter-bar-chip-DFsbUZ-V.cjs.map → filter-bar-chip-q2Zr-cnY.cjs.map} +1 -1
  674. package/dist/{filter-bar-time-range-DlVNjw43.cjs → filter-bar-time-range-D4C3kU0J.cjs} +3 -3
  675. package/dist/{filter-bar-time-range-DlVNjw43.cjs.map → filter-bar-time-range-D4C3kU0J.cjs.map} +1 -1
  676. package/dist/{filter-bar-time-range-D9SnzR2J.js → filter-bar-time-range-ao2YiYEJ.js} +3 -3
  677. package/dist/{filter-bar-time-range-D9SnzR2J.js.map → filter-bar-time-range-ao2YiYEJ.js.map} +1 -1
  678. package/dist/icons/ConfluenceIcon.cjs.js +18 -0
  679. package/dist/icons/ConfluenceIcon.cjs.js.map +1 -0
  680. package/dist/icons/ConfluenceIcon.d.ts +1 -0
  681. package/dist/icons/ConfluenceIcon.es.js +15 -0
  682. package/dist/icons/ConfluenceIcon.es.js.map +1 -0
  683. package/dist/icons/NotionIcon.cjs.js +18 -0
  684. package/dist/icons/NotionIcon.cjs.js.map +1 -0
  685. package/dist/icons/NotionIcon.d.ts +1 -0
  686. package/dist/icons/NotionIcon.es.js +15 -0
  687. package/dist/icons/NotionIcon.es.js.map +1 -0
  688. package/dist/icons/ZendeskIcon.cjs.js +18 -0
  689. package/dist/icons/ZendeskIcon.cjs.js.map +1 -0
  690. package/dist/icons/ZendeskIcon.d.ts +1 -0
  691. package/dist/icons/ZendeskIcon.es.js +15 -0
  692. package/dist/icons/ZendeskIcon.es.js.map +1 -0
  693. package/dist/{input-Cyit5ZSc.js → input-BNykbvOz.js} +2 -2
  694. package/dist/input-BNykbvOz.js.map +1 -0
  695. package/dist/{input-BpnUsQSt.cjs → input-D_V0m95F.cjs} +2 -2
  696. package/dist/input-D_V0m95F.cjs.map +1 -0
  697. package/dist/{input-group-NV4ZzKOk.js → input-group-CCSyY4J5.js} +3 -3
  698. package/dist/{input-group-NV4ZzKOk.js.map → input-group-CCSyY4J5.js.map} +1 -1
  699. package/dist/{input-group-DBCilXjT.cjs → input-group-Da8HBo30.cjs} +3 -3
  700. package/dist/{input-group-DBCilXjT.cjs.map → input-group-Da8HBo30.cjs.map} +1 -1
  701. package/dist/layout/tabbed-container.cjs.js +1 -1
  702. package/dist/layout/tabbed-container.es.js +1 -1
  703. package/dist/lib/form/components/number-field.cjs.js +1 -1
  704. package/dist/lib/form/components/number-field.es.js +1 -1
  705. package/dist/lib/form/components/record-field.cjs.js +1 -1
  706. package/dist/lib/form/components/record-field.es.js +1 -1
  707. package/dist/{observability-saved-views-DgABvgat.cjs → observability-saved-views-CzRPN_9m.cjs} +4 -4
  708. package/dist/{observability-saved-views-DgABvgat.cjs.map → observability-saved-views-CzRPN_9m.cjs.map} +1 -1
  709. package/dist/{observability-saved-views-Ch53fh5_.js → observability-saved-views-hu_hkXVY.js} +4 -4
  710. package/dist/{observability-saved-views-Ch53fh5_.js.map → observability-saved-views-hu_hkXVY.js.map} +1 -1
  711. package/dist/primitives/menu-item.cjs.js +1 -1
  712. package/dist/primitives/menu-item.cjs.js.map +1 -1
  713. package/dist/primitives/menu-item.es.js +1 -1
  714. package/dist/primitives/menu-item.es.js.map +1 -1
  715. package/dist/{property-filter-applied-DuyL4S_K.cjs → property-filter-applied-ML84st6J.cjs} +3 -3
  716. package/dist/{property-filter-applied-DuyL4S_K.cjs.map → property-filter-applied-ML84st6J.cjs.map} +1 -1
  717. package/dist/{property-filter-applied-DoxQHG09.js → property-filter-applied-PaJ7sLsM.js} +3 -3
  718. package/dist/{property-filter-applied-DoxQHG09.js.map → property-filter-applied-PaJ7sLsM.js.map} +1 -1
  719. package/dist/{span-payload-primitives-D2NWznGy.cjs → span-payload-primitives-CL3hlirm.cjs} +3 -3
  720. package/dist/{span-payload-primitives-D2NWznGy.cjs.map → span-payload-primitives-CL3hlirm.cjs.map} +1 -1
  721. package/dist/{span-payload-primitives-BKkRpVVO.js → span-payload-primitives-KxqoXspn.js} +3 -3
  722. package/dist/{span-payload-primitives-BKkRpVVO.js.map → span-payload-primitives-KxqoXspn.js.map} +1 -1
  723. package/dist/src/domains/dashboards/components/connected-widget.d.ts +9 -0
  724. package/dist/src/domains/dashboards/components/dashboard-renderer.d.ts +9 -2
  725. package/dist/src/domains/dashboards/components/stateless-widget.d.ts +40 -0
  726. package/dist/src/domains/dashboards/components/view-gate.d.ts +2 -10
  727. package/dist/src/domains/dashboards/components/widget-controls.d.ts +25 -1
  728. package/dist/src/domains/dashboards/hooks/use-dashboard-environment.d.ts +8 -0
  729. package/dist/src/domains/dashboards/hooks/use-dashboard-requests.d.ts +11 -1
  730. package/dist/src/domains/dashboards/hooks/use-widget-views.d.ts +8 -2
  731. package/dist/src/domains/dashboards/index.d.ts +14 -6
  732. package/dist/src/domains/dashboards/kinds/kpis/kpis-plan.d.ts +355 -0
  733. package/dist/src/domains/dashboards/kinds/kpis/kpis-widget.d.ts +1 -1
  734. package/dist/src/domains/dashboards/kinds/scores/scores-plan.d.ts +358 -0
  735. package/dist/src/domains/dashboards/kinds/scores/scores-widget.d.ts +1 -1
  736. package/dist/src/domains/dashboards/kinds/table/table-cells.d.ts +6 -2
  737. package/dist/src/domains/dashboards/kinds/table/table-columns.d.ts +2 -1
  738. package/dist/src/domains/dashboards/kinds/table/table-plan.d.ts +18 -0
  739. package/dist/src/domains/dashboards/kinds/table/table-tabs.d.ts +1 -1
  740. package/dist/src/domains/dashboards/kinds/table/table-view.d.ts +1 -0
  741. package/dist/src/domains/dashboards/kinds/timeseries/timeseries-plan.d.ts +355 -0
  742. package/dist/src/domains/dashboards/lib/alert-actions.d.ts +36 -0
  743. package/dist/src/domains/dashboards/lib/gate.d.ts +65 -0
  744. package/dist/src/domains/dashboards/lib/plan-widget.d.ts +390 -0
  745. package/dist/src/domains/dashboards/lib/requests.d.ts +22 -0
  746. package/dist/src/domains/dashboards/lib/scores.d.ts +11 -1
  747. package/dist/src/domains/dashboards/lib/timeseries.d.ts +6 -1
  748. package/dist/src/domains/dashboards/lib/values.d.ts +5 -0
  749. package/dist/src/domains/dashboards/widget-kind.d.ts +105 -2
  750. package/dist/src/domains/knowledge/components/KnowledgePageDetail.d.ts +7 -1
  751. package/dist/src/domains/knowledge/components/KnowledgePageExplorer.d.ts +4 -1
  752. package/dist/src/domains/knowledge/components/KnowledgePageGraph.d.ts +3 -0
  753. package/dist/src/domains/knowledge/components/KnowledgeSourceIcon.d.ts +5 -0
  754. package/dist/src/domains/knowledge/components/KnowledgeTooltip.d.ts +5 -0
  755. package/dist/src/domains/knowledge/lib/fitViewport.d.ts +9 -2
  756. package/dist/src/domains/knowledge/lib/pageAddress.d.ts +10 -0
  757. package/dist/src/domains/knowledge/lib/pageRefs.d.ts +12 -1
  758. package/dist/src/domains/knowledge/lib/pagesByRefContext.d.ts +6 -0
  759. package/dist/src/domains/mcps/components/mcp-app-tool-result.d.ts +3 -1
  760. package/dist/src/domains/mcps/components/mcp-app-viewer.d.ts +6 -1
  761. package/dist/src/domains/mcps/context/mcp-app-host-context-value.d.ts +23 -0
  762. package/dist/src/domains/mcps/context/mcp-app-host-context.d.ts +7 -0
  763. package/dist/src/domains/mcps/index.d.ts +3 -0
  764. package/dist/src/domains/traces/components/feedback-options.d.ts +8 -0
  765. package/dist/src/domains/traces/components/feedback-thread.d.ts +2 -1
  766. package/dist/src/domains/traces/components/span-feedback-tab.d.ts +4 -2
  767. package/dist/src/domains/traces/components/thread-view-by-trace.d.ts +4 -1
  768. package/dist/src/domains/traces/components/trace-feedback-tab.d.ts +4 -2
  769. package/dist/src/domains/traces/components/trace-span-panel.d.ts +3 -1
  770. package/dist/src/domains/traces/components/trace-thread-panel.d.ts +3 -1
  771. package/dist/src/domains/traces/components/traces-explorer/index.d.ts +1 -0
  772. package/dist/src/domains/traces/components/traces-explorer/traces-explorer-context.d.ts +2 -0
  773. package/dist/src/domains/traces/components/traces-explorer/traces-explorer-root.d.ts +4 -1
  774. package/dist/src/ds/components/Breadcrumb/Breadcrumb.d.ts +2 -0
  775. package/dist/src/ds/components/DropdownMenu/dropdown-menu.d.ts +3 -0
  776. package/dist/src/ds/components/Tree/tree-label.d.ts +1 -1
  777. package/dist/src/ds/icons/ConfluenceIcon.d.ts +2 -0
  778. package/dist/src/ds/icons/NotionIcon.d.ts +2 -0
  779. package/dist/src/ds/icons/ZendeskIcon.d.ts +2 -0
  780. package/dist/src/ds/icons/index.d.ts +3 -0
  781. package/dist/src/utils/mcp-app-context.d.ts +6 -0
  782. package/dist/style.css +85 -35
  783. package/dist/{tabbed-container-Bhfi-DWr.cjs → tabbed-container-BMLD6mvc.cjs} +4 -4
  784. package/dist/{tabbed-container-Bhfi-DWr.cjs.map → tabbed-container-BMLD6mvc.cjs.map} +1 -1
  785. package/dist/{tabbed-container-DOkHshha.js → tabbed-container-CaS8cZCS.js} +4 -4
  786. package/dist/{tabbed-container-DOkHshha.js.map → tabbed-container-CaS8cZCS.js.map} +1 -1
  787. package/dist/{tabs-content-DwU_eA-a.js → tabs-content-BGkPZ5EQ.js} +2 -2
  788. package/dist/{tabs-content-DwU_eA-a.js.map → tabs-content-BGkPZ5EQ.js.map} +1 -1
  789. package/dist/{tabs-content-BACwMrMG.cjs → tabs-content-D_ic2ZqI.cjs} +2 -2
  790. package/dist/{tabs-content-BACwMrMG.cjs.map → tabs-content-D_ic2ZqI.cjs.map} +1 -1
  791. package/dist/{tabs-tab-BHs639jL.js → tabs-tab-CJVS0WED.js} +2 -2
  792. package/dist/{tabs-tab-BHs639jL.js.map → tabs-tab-CJVS0WED.js.map} +1 -1
  793. package/dist/{tabs-tab-CANh2eAD.cjs → tabs-tab-Dj2huH5T.cjs} +2 -2
  794. package/dist/{tabs-tab-CANh2eAD.cjs.map → tabs-tab-Dj2huH5T.cjs.map} +1 -1
  795. package/dist/{tool-approval-CguPaikn.cjs → tool-approval-C4WNL8VD.cjs} +3 -3
  796. package/dist/{tool-approval-CguPaikn.cjs.map → tool-approval-C4WNL8VD.cjs.map} +1 -1
  797. package/dist/{tool-approval-Cjz0yAzw.js → tool-approval-ZfL3-Vvi.js} +3 -3
  798. package/dist/{tool-approval-Cjz0yAzw.js.map → tool-approval-ZfL3-Vvi.js.map} +1 -1
  799. package/dist/{tool-call-ChJKYCfu.js → tool-call-BLzYTI-x.js} +2 -2
  800. package/dist/{tool-call-ChJKYCfu.js.map → tool-call-BLzYTI-x.js.map} +1 -1
  801. package/dist/{tool-call-BqDI9mrY.cjs → tool-call-C4TBpJ6Y.cjs} +2 -2
  802. package/dist/{tool-call-BqDI9mrY.cjs.map → tool-call-C4TBpJ6Y.cjs.map} +1 -1
  803. package/dist/{tool-card-GSiCfxMz.js → tool-card-CM0aHG3p.js} +4 -3
  804. package/dist/{tool-card-GSiCfxMz.js.map → tool-card-CM0aHG3p.js.map} +1 -1
  805. package/dist/{tool-card-Dg4VOYV6.cjs → tool-card-xDlCD0m6.cjs} +4 -3
  806. package/dist/{tool-card-Dg4VOYV6.cjs.map → tool-card-xDlCD0m6.cjs.map} +1 -1
  807. package/dist/{mcp-app-viewer-BV7FI498.js → types-BwdKiX24.js} +2 -144
  808. package/dist/types-BwdKiX24.js.map +1 -0
  809. package/dist/{mcp-app-viewer-M3-pqAlo.cjs → types-KjLUPShK.cjs} +8 -144
  810. package/dist/types-KjLUPShK.cjs.map +1 -0
  811. package/dist/{use-workflow-graph-runtime-BfCL6nd4.cjs → use-workflow-graph-runtime-DEJA9rk4.cjs} +2 -2
  812. package/dist/{use-workflow-graph-runtime-BfCL6nd4.cjs.map → use-workflow-graph-runtime-DEJA9rk4.cjs.map} +1 -1
  813. package/dist/{use-workflow-graph-runtime-B3VUuhUE.js → use-workflow-graph-runtime-DHOsA1DM.js} +2 -2
  814. package/dist/{use-workflow-graph-runtime-B3VUuhUE.js.map → use-workflow-graph-runtime-DHOsA1DM.js.map} +1 -1
  815. package/dist/utils/mcp-app-context.cjs.js +17 -0
  816. package/dist/utils/mcp-app-context.cjs.js.map +1 -0
  817. package/dist/utils/mcp-app-context.d.ts +1 -0
  818. package/dist/utils/mcp-app-context.es.js +15 -0
  819. package/dist/utils/mcp-app-context.es.js.map +1 -0
  820. package/package.json +8 -8
  821. package/dist/Composer-bVE8qK52.js.map +0 -1
  822. package/dist/Composer-u1K6edoZ.cjs.map +0 -1
  823. package/dist/FilterBar-Kmn6gMgO.js.map +0 -1
  824. package/dist/FilterBar-jBz6yaNu.cjs.map +0 -1
  825. package/dist/MetricsCard-DojbLiEx.cjs.map +0 -1
  826. package/dist/MetricsCard-kAqSCPPe.js.map +0 -1
  827. package/dist/Tree-Caz4FTCU.cjs.map +0 -1
  828. package/dist/Tree-od43gLMO.js.map +0 -1
  829. package/dist/combobox-parts-BeNqgCbj.cjs.map +0 -1
  830. package/dist/combobox-parts-C9o4UfH_.js.map +0 -1
  831. package/dist/domains/dashboards/hooks/use-scorers.cjs.js +0 -41
  832. package/dist/domains/dashboards/hooks/use-scorers.cjs.js.map +0 -1
  833. package/dist/domains/dashboards/hooks/use-scorers.d.ts +0 -1
  834. package/dist/domains/dashboards/hooks/use-scorers.es.js +0 -40
  835. package/dist/domains/dashboards/hooks/use-scorers.es.js.map +0 -1
  836. package/dist/dropdown-menu-DKoWI8kD.js.map +0 -1
  837. package/dist/dropdown-menu-Dx-jCOIv.cjs.map +0 -1
  838. package/dist/input-BpnUsQSt.cjs.map +0 -1
  839. package/dist/input-Cyit5ZSc.js.map +0 -1
  840. package/dist/mcp-app-viewer-BV7FI498.js.map +0 -1
  841. package/dist/mcp-app-viewer-M3-pqAlo.cjs.map +0 -1
  842. package/dist/src/domains/dashboards/hooks/use-scorers.d.ts +0 -66
@@ -1 +0,0 @@
1
- {"version":3,"file":"FilterBar-jBz6yaNu.cjs","names":["BracesIcon","useFilterBarContext","usePortalContainer","useRef","useState","useIsApplePlatform","useMemo","findGroup","useCallback","parseFieldValue","useValueStep","matchesQueryFilter","_Fragment","ComboboxPrimitive","alwaysHighlightProps","cn","comboboxTriggerClass","inputFocusBorderWithin","ListFilterIcon","passwordManagerOptOutProps","unstyledFormElementStyle","FLOATING_POSITION_METHOD","comboboxStyles","FilterBarOptionList","FilterBarFieldLabel","FilterBarOptionLabel","Txt","Button","Kbd","useFilterBarContext","useFilterBarContext","cn","useRef","Fragment","isFilterBarGroup","FilterBarChip","Button","PlusIcon","FolderPlusIcon","Trash2Icon","countLeaves","FolderIcon","Txt","useFilterBarContext","useState","useRef","countLeaves","Popover","cn","chipClass","PopoverTrigger","editableSegmentClass","BracesIcon","Txt","removeSegmentClass","XIcon","PopoverContent","FILTER_BAR_SCOPE_ATTR","Button","useFilterBarContext","ClearFiltersButton","useFilterBarContext","FILTER_BAR_SCOPE_ATTR","cn","VisuallyHidden","FilterBarProvider","isFilterBarGroup","Fragment","FilterBarChip","_Fragment","FilterBarTimeRange"],"sources":["../src/ds/components/FilterBar/filter-bar-input.tsx","../src/ds/components/FilterBar/use-settle-on-leave.ts","../src/ds/components/FilterBar/filter-bar-group-editor.tsx","../src/ds/components/FilterBar/filter-bar-advanced-chip.tsx","../src/ds/components/FilterBar/filter-bar-clear.tsx","../src/ds/components/FilterBar/filter-bar.tsx","../src/ds/components/FilterBar/default-operators.ts"],"sourcesContent":["import type { BaseUIEvent } from '@base-ui/react/types';\nimport { BracesIcon, ListFilterIcon } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { KeyboardEvent } from 'react';\nimport { flushSync } from 'react-dom';\nimport { FILTER_BAR_CONTROL_SIZE, FilterBarFieldLabel, alwaysHighlightProps } from './filter-bar-chip';\nimport { useFilterBarContext } from './filter-bar-context';\nimport { FilterBarOptionLabel, FilterBarOptionList } from './filter-bar-option-list';\nimport { findGroup } from './filter-bar-tree';\nimport { matchesQueryFilter } from './match-query';\nimport type { FilterBarDraft, FilterBarField, FilterBarOperator, FilterBarOption, FilterBarValue } from './types';\nimport { parseFieldValue } from './types';\nimport { useValueStep } from './use-value-step';\nimport { Button } from '@/ds/components/Button/Button';\nimport { ComboboxPrimitive, comboboxStyles } from '@/ds/components/Combobox';\nimport { comboboxTriggerClass } from '@/ds/components/Combobox/combobox-styles';\nimport { Kbd } from '@/ds/components/Kbd/kbd';\nimport { Txt } from '@/ds/components/Txt';\nimport { FLOATING_POSITION_METHOD } from '@/ds/primitives/floating';\nimport { inputFocusBorderWithin, unstyledFormElementStyle } from '@/ds/primitives/form-element';\nimport { MENU_SIDE_OFFSET } from '@/ds/primitives/menu-item';\nimport { passwordManagerOptOutProps } from '@/ds/primitives/password-manager-autofill';\nimport { usePortalContainer } from '@/ds/primitives/portal-container';\nimport { useIsApplePlatform } from '@/hooks/use-keyboard-shortcut-label';\nimport { cn } from '@/lib/utils';\n\ntype Step = 'field' | 'operator' | 'value';\n\ntype Item = FilterBarField | FilterBarOperator | FilterBarOption;\n\nconst getItemLabel = (item: Item) => ('label' in item && item.label ? item.label : 'value' in item ? item.value : '');\n\nconst EMPTY_ITEMS: readonly Item[] = [];\n/** Pinned last entry of the field list that spawns an advanced filter (an `or` group) instead of a filter. */\nconst ADVANCED_FIELD_ID = '__filter-bar-advanced__';\nconst ADVANCED_FIELD: FilterBarField = {\n id: ADVANCED_FIELD_ID,\n label: 'Advanced filter…',\n icon: BracesIcon,\n operators: [],\n};\n\nexport type FilterBarInputProps = {\n placeholder?: string;\n className?: string;\n 'aria-label'?: string;\n /**\n * Group this instance commits into; omit for the bar's own input. Only the instance whose\n * `groupId` matches the provider's `inputTarget` renders, so a single input is ever mounted.\n */\n groupId?: string;\n /** Called when Escape is pressed on an empty query inside a group, after the input hands back to the bar. */\n onLeave?: () => void;\n};\n\n/**\n * Typeahead entry point: type to pick a field, then an operator, then a value.\n * Focus never leaves the input; the popup is driven with the arrow keys.\n */\nexport function FilterBarInput(props: FilterBarInputProps) {\n const ctx = useFilterBarContext();\n if (ctx.inputTarget !== props.groupId) return null;\n return <FilterBarInputImpl {...props} />;\n}\n\nfunction FilterBarInputImpl({\n placeholder = 'Filter',\n className,\n 'aria-label': ariaLabel = 'Add filter',\n groupId,\n onLeave,\n}: FilterBarInputProps) {\n const ctx = useFilterBarContext();\n const container = usePortalContainer();\n const inputRef = useRef<HTMLInputElement | null>(null);\n const anchorRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [highlighted, setHighlighted] = useState<Item | null>(null);\n const [emptyForStepChange, setEmptyForStepChange] = useState(false);\n const modEnterLabel = useIsApplePlatform() ? '⌘↵' : 'Ctrl ↵';\n\n // The draft lives in the provider so the chip list can render it; the step follows from it.\n const { draft, setDraft: setDraftState, commitDraft } = ctx;\n const step: Step = !draft ? 'field' : !draft.operatorId ? 'operator' : 'value';\n const field = draft ? ctx.getField(draft.fieldId) : undefined;\n const fieldOperators = useMemo(() => (field ? ctx.getFieldOperators(field) : []), [ctx, field]);\n const operator = draft?.operatorId\n ? (fieldOperators.find(o => o.id === draft.operatorId) ?? ctx.getOperator(draft.operatorId))\n : undefined;\n // The advanced option lives in the bar only; inside a popover, nesting is the editor's `+ Group`.\n const offerAdvanced = ctx.groupsEnabled && groupId === undefined;\n const visibleFields = useMemo(() => {\n const fields = ctx.fields.filter(f => !f.hidden);\n return offerAdvanced ? [...fields, ADVANCED_FIELD] : fields;\n }, [ctx.fields, offerAdvanced]);\n const targetGroup = groupId ? findGroup(ctx.expression, groupId) : undefined;\n\n // A group's input mounts on demand (see `openGroupInput`) and takes focus itself.\n useEffect(() => {\n if (groupId) inputRef.current?.focus();\n }, [groupId]);\n\n // Base UI owns the highlight index and keeps it when the list content changes, so a row\n // reached with ArrowDown would carry over into the step that follows. An empty list committed\n // first drops that index, and `autoHighlight` re-anchors on the first row of the new step.\n const withHighlightReset = useCallback((change: () => void) => {\n flushSync(() => setEmptyForStepChange(true));\n change();\n setEmptyForStepChange(false);\n }, []);\n\n const setDraft = useCallback(\n (next: Omit<FilterBarDraft, 'id' | 'from'> | null) => withHighlightReset(() => setDraftState(next)),\n [withHighlightReset, setDraftState],\n );\n\n const reset = useCallback(() => {\n setDraftState(null);\n setQuery('');\n }, [setDraftState]);\n\n const close = useCallback(() => {\n setOpen(false);\n reset();\n }, [reset]);\n\n const commit = useCallback(\n (fieldId: string, operatorId: string, value: FilterBarValue) => {\n withHighlightReset(() => commitDraft({ fieldId, operatorId }, value));\n setQuery('');\n inputRef.current?.focus();\n },\n [withHighlightReset, commitDraft],\n );\n\n const selectOperator = useCallback(\n (fieldId: string, next: FilterBarOperator) => {\n if (next.arity === 'none') {\n commit(fieldId, next.id, '');\n return;\n }\n setDraft({ fieldId, operatorId: next.id });\n setQuery('');\n },\n [commit, setDraft],\n );\n\n const selectField = useCallback(\n (next: FilterBarField) => {\n if (next.id === ADVANCED_FIELD_ID) {\n // `or` is the useful default: an `and` group is indistinguishable from the root.\n const id = ctx.addGroup(undefined, 'or');\n ctx.setOpenGroup(id);\n ctx.openGroupInput(id);\n setQuery('');\n setOpen(false);\n return;\n }\n const [only, ...rest] = ctx.getFieldOperators(next);\n // Free-text entry with text already typed: that text is the value, so neither the\n // operator nor the value step has anything left to ask.\n if (next.search && only && query.trim() !== '') {\n commit(next.id, only.id, parseFieldValue(next.type, query));\n return;\n }\n // A single allowed operator is implied: skip straight to the value step.\n if (only && rest.length === 0) {\n selectOperator(next.id, only);\n return;\n }\n setDraft({ fieldId: next.id });\n setQuery('');\n },\n [ctx, commit, query, selectOperator, setDraft],\n );\n\n const valueStep = useValueStep({\n field,\n operator,\n query,\n enabled: open && step === 'value',\n setQuery,\n onCommit: value => {\n if (draft?.operatorId) commit(draft.fieldId, draft.operatorId, value);\n },\n });\n\n // Leaving a group's input hands the target back to the bar; empty groups are pruned when the\n // popover closes, never here.\n const leaveGroup = useCallback(() => {\n if (!groupId) return false;\n ctx.openGroupInput(undefined);\n onLeave?.();\n return true;\n }, [ctx, groupId, onLeave]);\n\n const stepBack = useCallback(() => {\n if (step === 'value' && draft) {\n // Back to the field step when the operator was implied (single operator).\n const skipOperator = field ? fieldOperators.length === 1 : false;\n setDraft(skipOperator ? null : { fieldId: draft.fieldId });\n } else if (step === 'operator') setDraft(null);\n else if (!leaveGroup()) setOpen(false);\n setQuery('');\n }, [step, draft, field, fieldOperators, setDraft, leaveGroup]);\n\n // Selection is routed per step and never kept by Base UI (`value` stays null).\n const handleSelect = (item: Item) => {\n if (step === 'field') selectField(item as FilterBarField);\n else if (step === 'operator' && draft) selectOperator(draft.fieldId, item as FilterBarOperator);\n else valueStep.handleSelect(item as FilterBarOption);\n };\n\n // App-level keys run before Base UI's own input handling.\n const handleKeyDown = (event: BaseUIEvent<KeyboardEvent<HTMLInputElement>>) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n // Consumed here: an enclosing popover (advanced filter) must not close on it.\n event.stopPropagation();\n event.preventBaseUIHandler();\n stepBack();\n return;\n }\n if (!open && (event.key === 'ArrowDown' || event.key === 'Enter')) {\n event.preventDefault();\n event.preventBaseUIHandler();\n setOpen(true);\n return;\n }\n if (query === '') {\n if (event.key === 'Backspace') {\n event.preventDefault();\n event.preventBaseUIHandler();\n if (step !== 'field') stepBack();\n else if (targetGroup) {\n // Inside a group: eat its last chip, or drop the group once it is empty.\n const last = targetGroup.nodes.findLast(node => !ctx.leaving.has(node.id));\n if (last) ctx.removeItem(last.id);\n else leaveGroup();\n } else {\n // Chips still animating out are already gone from the value: skip them.\n const last = ctx.items.findLast(item => !ctx.leaving.has(item.id));\n if (last) ctx.removeItem(last.id);\n }\n return;\n }\n if (event.key === 'ArrowLeft' && step === 'field') {\n if (ctx.focusChip(ctx.items.length - 1, -1, 'remove')) event.preventDefault();\n return;\n }\n }\n if (!open) return;\n\n if (event.key === 'Tab' && highlighted && step !== 'value' && (step === 'operator' || query !== '')) {\n event.preventDefault();\n event.preventBaseUIHandler();\n handleSelect(highlighted);\n return;\n }\n if (step === 'value') {\n const highlightedOption = valueStep.hasSuggestions ? (highlighted as FilterBarOption | null) : null;\n const handled = valueStep.handleKeyDown(event, highlightedOption);\n // Base UI closes on Enter when nothing is highlighted (form submission); the draft must stay open.\n if (handled || (event.key === 'Enter' && highlightedOption === null)) event.preventBaseUIHandler();\n }\n };\n\n const optionsForStep: Record<Step, readonly Item[]> = {\n field: visibleFields,\n operator: fieldOperators,\n value: valueStep.options,\n };\n const items: readonly Item[] = emptyForStepChange ? EMPTY_ITEMS : optionsForStep[step];\n\n // A search field is the way out for text that names no field, so it survives the field\n // step's own filtering whatever was typed; every other item matches on its label.\n const filterItem = useCallback(\n (item: Item, text: string, itemToString?: (item: Item) => string) =>\n ('search' in item && item.search === true) || matchesQueryFilter(item, text, itemToString),\n [],\n );\n\n const inputPlaceholder =\n step === 'field'\n ? placeholder\n : step === 'operator'\n ? 'Operator'\n : valueStep.hasSuggestions && valueStep.allowFreeText\n ? 'Search or type a value'\n : field?.type === 'number'\n ? 'Number'\n : 'Value';\n\n return (\n <>\n <ComboboxPrimitive.Root<Item>\n items={items}\n itemToStringLabel={getItemLabel}\n // The value step is already filtered (locally or server-side) by useValueSuggestions.\n filter={step === 'value' ? null : filterItem}\n value={null}\n onValueChange={(item, details) => {\n // Never let Base UI keep the selection, fill the input or close: each step routes it.\n details.cancel();\n if (item) handleSelect(item);\n }}\n inputValue={query}\n onInputValueChange={(next, details) => {\n if (details.reason !== 'input-change') return;\n setQuery(next);\n if (!open) setOpen(true);\n }}\n onItemHighlighted={item => setHighlighted(item ?? null)}\n open={open}\n onOpenChange={(next, details) => {\n // Escape is handled by the input (it steps back rather than closing).\n if (!next && details.reason === 'escape-key') return;\n // The input is the anchor, not a trigger: clicking it must keep the draft open.\n if (\n !next &&\n details.reason === 'outside-press' &&\n details.event.target instanceof Node &&\n inputRef.current?.contains(details.event.target)\n ) {\n return;\n }\n if (next) setOpen(true);\n else close();\n }}\n {...alwaysHighlightProps}\n modal={false}\n >\n <div\n ref={anchorRef}\n data-slot=\"filter-bar-input-trigger\"\n className={cn(\n // Same trigger recipe as every other DS Combobox (fill, radius, `[&>svg]` icon sizing\n // and the Button icon offset); the bar itself has no chrome. Focus lives on the\n // nested input, so the recipe's `focus-visible` border becomes `focus-within`.\n comboboxTriggerClass({ variant: 'default', size: FILTER_BAR_CONTROL_SIZE }),\n 'w-auto cursor-text',\n 'focus-within:bg-fill-hover',\n inputFocusBorderWithin,\n step === 'field' ? 'min-w-40' : 'min-w-28',\n className,\n )}\n >\n <ListFilterIcon aria-hidden className=\"shrink-0\" />\n <ComboboxPrimitive.Input\n ref={el => {\n inputRef.current = el;\n ctx.registerInput(el);\n }}\n aria-label={ariaLabel}\n spellCheck={false}\n {...passwordManagerOptOutProps}\n data-slot=\"filter-bar-input\"\n data-step={step}\n data-target={targetGroup?.id}\n inputMode={step === 'value' && field?.type === 'number' ? 'decimal' : undefined}\n placeholder={inputPlaceholder}\n className={cn(\n unstyledFormElementStyle,\n 'min-w-0 flex-1 bg-transparent',\n 'placeholder:text-muted-foreground placeholder:transition-opacity placeholder:duration-normal focus:placeholder:opacity-70',\n )}\n onFocus={() => setOpen(true)}\n onKeyDown={handleKeyDown}\n />\n </div>\n <ComboboxPrimitive.Portal container={container}>\n <ComboboxPrimitive.Positioner\n // Base UI anchors to the input, which starts after the filter icon; align with the pill instead.\n anchor={anchorRef}\n align=\"start\"\n sideOffset={MENU_SIDE_OFFSET}\n positionMethod={FLOATING_POSITION_METHOD}\n className={comboboxStyles.positioner}\n >\n <ComboboxPrimitive.Popup // Match the pill, with the DS Combobox's 11rem floor (replaces the menu's anchor-width minimum).\n className={cn(comboboxStyles.popup, 'w-(--anchor-width) min-w-44')}\n data-slot=\"filter-bar-editor\"\n >\n {step === 'field' && (\n <FilterBarOptionList<FilterBarField>\n aria-label=\"Fields\"\n getKey={f => f.id}\n renderOption={f => (\n <>\n <FilterBarFieldLabel field={f} />\n {f.search && query !== '' && (\n <span className=\"min-w-0 truncate text-muted-foreground\">\n {ctx.getFieldOperators(f)[0]?.label} \"{query}\"\n </span>\n )}\n </>\n )}\n emptyText=\"No matching field.\"\n />\n )}\n {step === 'operator' && (\n <FilterBarOptionList<FilterBarOperator>\n aria-label=\"Operators\"\n getKey={o => o.id}\n renderOption={o => o.label}\n emptyText=\"No matching operator.\"\n />\n )}\n {step === 'value' && valueStep.hasOptions && (\n <FilterBarOptionList<FilterBarOption>\n aria-label=\"Values\"\n aria-multiselectable={valueStep.isMany || undefined}\n getKey={o => o.value}\n renderOption={option => <FilterBarOptionLabel option={option} />}\n isSelected={o => valueStep.isMany && valueStep.selected.includes(o.value)}\n isLoading={valueStep.isLoading}\n error={valueStep.error}\n emptyText={\n valueStep.allowFreeText ? 'No suggestions. Press Enter to use your text.' : 'No matching value.'\n }\n />\n )}\n {step === 'value' && !valueStep.hasSuggestions && (\n <div className=\"flex items-center justify-between gap-2 py-1 pr-1 pl-[.9em]\">\n <Txt variant=\"caption\" tone=\"muted\">\n Type a value\n </Txt>\n <Button\n size=\"sm\"\n variant=\"default\"\n disabled={!valueStep.canCommitQuery}\n onMouseDown={e => e.preventDefault()}\n onClick={() => valueStep.submitFreeText()}\n >\n Apply\n <Kbd size=\"xs\">↵</Kbd>\n </Button>\n </div>\n )}\n {step === 'value' && valueStep.isMany && (\n <div className=\"flex items-center justify-end gap-1 border-t border-border p-1\">\n <Button\n size=\"sm\"\n variant=\"default\"\n onMouseDown={e => e.preventDefault()}\n onClick={() => valueStep.commitDone()}\n >\n Done\n <Kbd size=\"xs\">{modEnterLabel}</Kbd>\n </Button>\n </div>\n )}\n </ComboboxPrimitive.Popup>\n </ComboboxPrimitive.Positioner>\n </ComboboxPrimitive.Portal>\n </ComboboxPrimitive.Root>\n </>\n );\n}\n","import { useEffect } from 'react';\nimport { useFilterBarContext } from './filter-bar-context';\n\n/** Keeps a leaving node in the DOM until its exit animation has played, then releases it. */\nexport function useSettleOnLeave(id: string, leaving: boolean, rootRef: React.RefObject<HTMLElement | null>) {\n const { settleRemove } = useFilterBarContext();\n useEffect(() => {\n const root = rootRef.current;\n if (!leaving || !root) return;\n const animations = typeof root.getAnimations === 'function' ? root.getAnimations({ subtree: true }) : [];\n if (animations.length === 0) {\n settleRemove(id);\n return;\n }\n let cancelled = false;\n Promise.all(animations.map(animation => animation.finished))\n .then(() => {\n if (!cancelled) settleRemove(id);\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, [leaving, id, settleRemove, rootRef]);\n}\n","import { FolderIcon, FolderPlusIcon, PlusIcon, Trash2Icon } from 'lucide-react';\nimport { Fragment, useEffect, useRef } from 'react';\nimport type { ReactNode } from 'react';\nimport { FilterBarChip } from './filter-bar-chip';\nimport { useFilterBarContext } from './filter-bar-context';\nimport { FilterBarInput } from './filter-bar-input';\nimport { countLeaves } from './filter-bar-tree';\nimport type { FilterBarGroup, FilterBarLogic } from './types';\nimport { isFilterBarGroup } from './types';\nimport { useSettleOnLeave } from './use-settle-on-leave';\nimport { Button } from '@/ds/components/Button/Button';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nconst connectorClass =\n 'flex h-control-sm w-14 shrink-0 items-center justify-center rounded-md text-column tracking-wide text-muted-foreground uppercase';\n\nexport type FilterBarLogicToggleProps = {\n groupId: string;\n logic: FilterBarLogic;\n className?: string;\n};\n\n/** `and` / `or` connector in front of a row; every connector of a group shares its logic. */\nexport function FilterBarLogicToggle({ groupId, logic, className }: FilterBarLogicToggleProps) {\n const ctx = useFilterBarContext();\n const next: FilterBarLogic = logic === 'and' ? 'or' : 'and';\n return (\n <button\n type=\"button\"\n data-slot=\"filter-bar-logic\"\n data-logic={logic}\n aria-label={`Joined with ${logic}, switch to ${next}`}\n title={`Switch to ${next}`}\n className={cn(\n connectorClass,\n 'filter-bar-logic cursor-pointer border border-border bg-fill-subtle outline-none',\n 'hover:bg-fill-hover hover:text-foreground focus-visible:bg-fill-hover focus-visible:text-foreground',\n className,\n )}\n onClick={() => ctx.setLogic(groupId, next)}\n >\n {logic}\n </button>\n );\n}\n\n/** Segmented `and | or` control shown in a nested group's header. */\nfunction FilterBarLogicSwitch({ groupId, logic }: { groupId: string; logic: FilterBarLogic }) {\n const ctx = useFilterBarContext();\n return (\n <div\n role=\"radiogroup\"\n aria-label=\"Group logic\"\n className=\"flex h-control-sm items-center gap-0.5 rounded-md border border-border bg-fill-subtle p-0.5\"\n >\n {(['and', 'or'] as const).map(value => (\n <button\n key={value}\n type=\"button\"\n role=\"radio\"\n aria-checked={logic === value}\n aria-label={`Join with ${value}`}\n className={cn(\n 'h-full cursor-pointer rounded-sm px-1.5 text-column tracking-wide uppercase outline-none',\n 'focus-visible:bg-fill-hover',\n logic === value ? 'bg-fill-hover text-foreground' : 'text-muted-foreground hover:text-foreground',\n )}\n onClick={() => logic !== value && ctx.setLogic(groupId, value)}\n >\n {value}\n </button>\n ))}\n </div>\n );\n}\n\nexport type FilterBarGroupEditorProps = {\n group: FilterBarGroup;\n /** Nesting level of `group` (root-level group = 1). */\n depth: number;\n /** Drops this group; rendered as a trailing `Clear all` in the footer. */\n onRemove?: () => void;\n removeLabel?: string;\n className?: string;\n};\n\n/**\n * Recursive rule builder shown in an advanced-filter popover. Rows are laid out as\n * `connector | condition`: the first row reads `where`, the following ones carry the\n * group's `and` / `or` toggle. Nested groups render as bordered cards with their own\n * header (logic switch + remove) and footer. The shared typeahead input renders as the\n * last row of the group it is pointed at.\n */\nexport function FilterBarGroupEditor({\n group,\n depth,\n onRemove,\n removeLabel = 'Remove group',\n className,\n}: FilterBarGroupEditorProps) {\n const ctx = useFilterBarContext();\n const addFilterRef = useRef<HTMLButtonElement>(null);\n const focusAddFilter = useRef(false);\n const targeted = ctx.inputTarget === group.id;\n const canNest = depth < ctx.maxDepth;\n\n // `+ Condition` is hidden while the input is open; focus it once it remounts.\n useEffect(() => {\n if (targeted || !focusAddFilter.current) return;\n focusAddFilter.current = false;\n addFilterRef.current?.focus();\n }, [targeted]);\n\n const rows: ReactNode[] = [];\n const connector = (key: string) =>\n rows.length === 0 ? (\n <span key={`${key}:where`} className={connectorClass}>\n where\n </span>\n ) : (\n <FilterBarLogicToggle key={`${key}:logic`} groupId={group.id} logic={group.logic} />\n );\n for (const node of group.nodes) {\n rows.push(\n <Fragment key={node.id}>\n {connector(node.id)}\n {isFilterBarGroup(node) ? (\n <NestedGroupCard group={node} depth={depth + 1} />\n ) : (\n <FilterBarChip item={node} className=\"w-fit\" />\n )}\n </Fragment>,\n );\n }\n if (ctx.draft && ctx.draft.groupId === group.id) {\n const { id, fieldId, operatorId = '' } = ctx.draft;\n rows.push(\n <Fragment key={id}>\n {connector(id)}\n <FilterBarChip draft item={{ id, fieldId, operatorId, value: '' }} className=\"w-fit\" />\n </Fragment>,\n );\n }\n if (targeted) {\n rows.push(\n <Fragment key=\"input\">\n {connector('input')}\n <FilterBarInput\n groupId={group.id}\n placeholder=\"Add condition\"\n onLeave={() => {\n focusAddFilter.current = true;\n }}\n />\n </Fragment>,\n );\n }\n\n return (\n <div\n data-slot=\"filter-bar-group-editor\"\n data-depth={depth}\n role=\"group\"\n aria-label={`Conditions joined with ${group.logic}`}\n className={cn('flex min-w-0 flex-col', className)}\n >\n {rows.length > 0 && (\n <div className=\"grid grid-cols-[auto_minmax(0,1fr)] items-start gap-x-2 gap-y-1.5 p-2\">{rows}</div>\n )}\n <div\n data-slot=\"filter-bar-editor-actions\"\n className={cn('flex w-full items-center gap-1 p-1', rows.length > 0 && 'border-t border-border')}\n >\n {!targeted && (\n <Button\n ref={addFilterRef}\n variant=\"ghost\"\n size=\"sm\"\n icon={<PlusIcon />}\n onClick={() => ctx.openGroupInput(group.id)}\n >\n Condition\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n icon={<FolderPlusIcon />}\n className=\"text-muted-foreground\"\n tooltip={canNest ? undefined : `Groups can nest ${ctx.maxDepth} levels deep`}\n disabled={!canNest}\n onClick={() => ctx.addGroup(group.id, group.logic === 'and' ? 'or' : 'and')}\n >\n Group\n </Button>\n {onRemove && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n icon={<Trash2Icon />}\n className=\"ml-auto text-muted-foreground\"\n aria-label={removeLabel}\n onClick={onRemove}\n >\n Clear all\n </Button>\n )}\n </div>\n </div>\n );\n}\n\nfunction NestedGroupCard({ group, depth }: { group: FilterBarGroup; depth: number }) {\n const ctx = useFilterBarContext();\n const rootRef = useRef<HTMLDivElement>(null);\n const leaving = ctx.leaving.has(group.id);\n useSettleOnLeave(group.id, leaving, rootRef);\n const count = countLeaves(group);\n\n return (\n <div\n ref={rootRef}\n data-slot=\"filter-bar-editor-nested\"\n data-leaving={leaving || undefined}\n aria-hidden={leaving || undefined}\n className={cn(\n 'filter-bar-editor-nested w-full overflow-hidden rounded-lg border border-border',\n leaving && 'pointer-events-none',\n )}\n >\n <div className=\"flex items-center gap-2 border-b border-border px-2 py-1\">\n <FolderIcon className=\"size-3.5 text-muted-foreground\" />\n <Txt as=\"span\" variant=\"label\" tone=\"ink\">\n Group\n </Txt>\n <Txt as=\"span\" variant=\"label\" tone=\"muted\">\n {count} {count === 1 ? 'condition' : 'conditions'}\n </Txt>\n <div className=\"ml-auto flex items-center gap-1\">\n <FilterBarLogicSwitch groupId={group.id} logic={group.logic} />\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n tooltip=\"Remove group\"\n disabled={leaving}\n onClick={() => ctx.removeGroup(group.id)}\n >\n <Trash2Icon />\n </Button>\n </div>\n </div>\n <FilterBarGroupEditor group={group} depth={depth} />\n </div>\n );\n}\n","import { BracesIcon, XIcon } from 'lucide-react';\nimport { useRef, useState } from 'react';\nimport type { KeyboardEvent } from 'react';\nimport { chipClass, editableSegmentClass, removeSegmentClass } from './filter-bar-chip';\nimport { FILTER_BAR_SCOPE_ATTR, useFilterBarContext } from './filter-bar-context';\nimport { FilterBarGroupEditor } from './filter-bar-group-editor';\nimport { countLeaves } from './filter-bar-tree';\nimport type { FilterBarGroup } from './types';\nimport { useSettleOnLeave } from './use-settle-on-leave';\nimport { Button } from '@/ds/components/Button/Button';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/ds/components/Popover';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport type FilterBarAdvancedChipProps = {\n group: FilterBarGroup;\n className?: string;\n};\n\n/**\n * A root-level group rendered as one \"Advanced filter\" chip. Its popover hosts the\n * recursive rule builder; the chip's remove button drops the whole subtree.\n */\nexport function FilterBarAdvancedChip({ group, className }: FilterBarAdvancedChipProps) {\n const ctx = useFilterBarContext();\n const [initial] = useState(() => !ctx.mounted);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const leaving = ctx.leaving.has(group.id);\n const open = ctx.openGroupId === group.id;\n const count = countLeaves(group);\n // Position in the flattened item list: navigation from the chip continues from its first leaf.\n const firstLeafIndex = ctx.items.findIndex(item => isUnder(group, item.id));\n const index = firstLeafIndex === -1 ? ctx.items.length : firstLeafIndex;\n useSettleOnLeave(group.id, leaving, rootRef);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (leaving) return;\n const segments = Array.from(rootRef.current?.querySelectorAll<HTMLElement>('[data-filter-bar-segment]') ?? []);\n const current = segments.findIndex(el => el === event.target);\n if (current === -1) return;\n switch (event.key) {\n case 'ArrowRight': {\n event.preventDefault();\n const next = segments[current + 1];\n if (next) next.focus();\n else if (!ctx.focusChip(index + count, 1, 'field')) ctx.focusInput();\n return;\n }\n case 'ArrowLeft': {\n event.preventDefault();\n const prev = segments[current - 1];\n if (prev) prev.focus();\n else ctx.focusChip(index - 1, -1, 'remove');\n return;\n }\n case 'Delete':\n case 'Backspace':\n event.preventDefault();\n remove();\n break;\n default:\n }\n };\n\n const remove = () => {\n ctx.removeGroup(group.id);\n ctx.focusAfterRemove(index);\n };\n\n return (\n <Popover open={open} onOpenChange={next => ctx.setOpenGroup(next ? group.id : null)}>\n <div\n ref={rootRef}\n role=\"group\"\n aria-label={`Advanced filter, ${count} ${count === 1 ? 'condition' : 'conditions'}`}\n aria-hidden={leaving || undefined}\n data-slot=\"filter-bar-advanced\"\n data-initial={initial || undefined}\n data-leaving={leaving || undefined}\n className={cn('filter-bar-advanced', chipClass, leaving && 'pointer-events-none', className)}\n onKeyDown={handleKeyDown}\n >\n <PopoverTrigger\n ref={el => {\n triggerRef.current = el;\n ctx.registerSegment(group.id, 'field', leaving ? null : el);\n }}\n render={<button type=\"button\" />}\n data-filter-bar-segment=\"field\"\n className={editableSegmentClass}\n title=\"Edit advanced filter\"\n >\n <BracesIcon aria-hidden />\n <span className=\"truncate\">Advanced filter</span>\n {count > 0 && (\n <Txt as=\"span\" variant=\"column\" tone=\"muted\" aria-hidden>\n {count}\n </Txt>\n )}\n </PopoverTrigger>\n {leaving ? (\n <span aria-hidden className={removeSegmentClass}>\n <XIcon />\n </span>\n ) : (\n <button\n type=\"button\"\n ref={el => ctx.registerSegment(group.id, 'remove', el)}\n data-filter-bar-segment=\"remove\"\n aria-label=\"Remove advanced filter\"\n title=\"Remove advanced filter\"\n className={removeSegmentClass}\n onClick={remove}\n >\n <XIcon />\n </button>\n )}\n </div>\n <PopoverContent\n align=\"start\"\n className=\"w-[min(92vw,44rem)] p-0\"\n {...{ [FILTER_BAR_SCOPE_ATTR]: 'advanced' }}\n finalFocus={triggerRef}\n >\n <div className=\"flex items-center gap-2 border-b border-border px-3 py-2\">\n <BracesIcon className=\"size-3.5 text-muted-foreground\" />\n <Txt as=\"span\" variant=\"label\" tone=\"ink\">\n Advanced filter\n </Txt>\n <Txt as=\"span\" variant=\"column\" tone=\"muted\" className=\"rounded-md bg-fill-subtle px-1.5\">\n {count}\n </Txt>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"ml-auto\"\n tooltip=\"Close\"\n onClick={() => ctx.setOpenGroup(null)}\n >\n <XIcon />\n </Button>\n </div>\n <FilterBarGroupEditor\n group={group}\n depth={1}\n removeLabel=\"Remove advanced filter\"\n onRemove={() => {\n ctx.setOpenGroup(null);\n remove();\n }}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\nconst isUnder = (group: FilterBarGroup, itemId: string): boolean =>\n group.nodes.some(node => (node.id === itemId ? true : 'kind' in node && isUnder(node, itemId)));\n","import { useFilterBarContext } from './filter-bar-context';\nimport { ClearFiltersButton } from '@/ds/components/ClearFiltersButton/clear-filters-button';\n\n/** Removes every removable filter. Rendered by FilterBar at its trailing edge; hidden while nothing can be removed. */\nexport function FilterBarClear({ label }: { label: string }) {\n const ctx = useFilterBarContext();\n if (!ctx.hasRemovableItems) return null;\n return (\n <ClearFiltersButton\n label={label}\n onClick={event => {\n event.stopPropagation();\n ctx.clear();\n ctx.focusInput();\n }}\n />\n );\n}\n","import { Fragment } from 'react';\nimport type { ReactNode } from 'react';\nimport { FilterBarAdvancedChip } from './filter-bar-advanced-chip';\nimport { FilterBarChip } from './filter-bar-chip';\nimport { FilterBarClear } from './filter-bar-clear';\nimport { FILTER_BAR_SCOPE_ATTR, FilterBarProvider, useFilterBarContext } from './filter-bar-context';\nimport { FilterBarInput } from './filter-bar-input';\nimport { FilterBarTimeRange } from './filter-bar-time-range';\nimport { isFilterBarGroup } from './types';\nimport type { FilterBarExpression, FilterBarField, FilterBarItem, FilterBarOperator } from './types';\nimport { VisuallyHidden } from '@/ds/primitives/visually-hidden';\nimport { cn } from '@/lib/utils';\n\ntype FilterBarValueProps =\n | {\n /** Flat list of filters, implicitly joined with `and`. Advanced filters are never offered. */\n value: FilterBarItem[];\n onValueChange: (items: FilterBarItem[]) => void;\n }\n | {\n /**\n * Tree of filters and groups. Root nodes are joined with `and`; each root group renders\n * as one \"Advanced filter\" chip whose popover edits the nested `and` / `or` logic.\n */\n value: FilterBarExpression;\n onValueChange: (expression: FilterBarExpression) => void;\n };\n\nexport type FilterBarProps = FilterBarValueProps & {\n fields: FilterBarField[];\n operators: FilterBarOperator[];\n /**\n * Id given to a newly added item. Defaults to a random id. Consumers that rebuild `value` from\n * their own store (URL, query params…) should return the id they will rebuild it with, so the\n * draft chip and the committed chip are the same element.\n */\n createItemId?: (fieldId: string) => string;\n /** How deep advanced-filter groups may nest (root-level group = 1). Defaults to 3. */\n maxDepth?: number;\n 'aria-label'?: string;\n /**\n * Text shown in a value list when the field's `suggestions` resolver rejects, for example\n * to explain a server limit. Return `undefined` to keep the default \"Couldn't load values.\".\n */\n describeSuggestionsError?: (error: unknown) => string | undefined;\n /** Accessible label of the trailing \"remove every filter\" button. */\n clearLabel?: string;\n className?: string;\n children: ReactNode;\n};\n\nfunction FilterBarSurface({\n className,\n clearLabel,\n children,\n}: {\n className?: string;\n clearLabel: string;\n children: ReactNode;\n}) {\n const ctx = useFilterBarContext();\n return (\n <div\n role=\"group\"\n aria-label={ctx.ariaLabel}\n data-slot=\"filter-bar\"\n {...{ [FILTER_BAR_SCOPE_ATTR]: 'bar' }}\n className={cn(\n // No chrome of its own: chips and the typeahead input sit directly on the parent surface.\n // Layout: chips, input, then Clear right beside the input — all in one wrapping row so\n // Clear never drifts to the far edge of a wide container.\n 'flex w-full flex-wrap items-center gap-1.5',\n className,\n )}\n >\n {children}\n <span className=\"flex shrink-0 items-center empty:hidden\">\n <FilterBarClear label={clearLabel} />\n </span>\n <VisuallyHidden aria-live=\"polite\">{ctx.announcement}</VisuallyHidden>\n </div>\n );\n}\n\n/**\n * Braintrust-style filter bar: `field → operator → value` filters built from a\n * single typeahead input, rendered as inline editable chips. Domain-agnostic —\n * fields, operators and values are plain strings supplied by the consumer.\n *\n * Pass a `FilterBarExpression` as `value` to enable Linear-style advanced filters:\n * the input offers \"Advanced filter…\", which adds one chip whose popover hosts a\n * recursive rule builder (`and` / `or` connectors, nested groups). The bar itself\n * stays flat. A flat `FilterBarItem[]` stays flat.\n *\n * @example\n * <FilterBar value={items} onValueChange={setItems} fields={fields} operators={DEFAULT_FILTER_OPERATORS}>\n * <FilterBar.Chips />\n * <FilterBar.Input />\n * </FilterBar>\n */\nexport function FilterBar({\n fields,\n operators,\n value,\n onValueChange,\n createItemId,\n maxDepth,\n 'aria-label': ariaLabel = 'Filters',\n describeSuggestionsError,\n clearLabel = 'Clear filters',\n className,\n children,\n}: FilterBarProps) {\n return (\n <FilterBarProvider\n fields={fields}\n operators={operators}\n value={value}\n onValueChange={onValueChange}\n createItemId={createItemId}\n maxDepth={maxDepth}\n ariaLabel={ariaLabel}\n describeSuggestionsError={describeSuggestionsError}\n >\n <FilterBarSurface className={className} clearLabel={clearLabel}>\n {children}\n </FilterBarSurface>\n </FilterBarProvider>\n );\n}\n\n/**\n * Default layout: one editable chip per root item, one \"Advanced filter\" chip per root\n * group, in order, then the chip of the filter being built in the bar's input (which\n * becomes the last item's chip once committed).\n */\nexport function FilterBarChips({ renderChip = defaultRenderChip }: FilterBarChipsProps) {\n const ctx = useFilterBarContext();\n // One keyed array: the draft chip and the item it becomes share a key, so React\n // keeps the element across the commit instead of mounting a new chip.\n const chips: ReactNode[] = [];\n for (const node of ctx.expression.nodes) {\n const chip = isFilterBarGroup(node) ? <FilterBarAdvancedChip group={node} /> : renderChip(node);\n if (chip !== null) chips.push(<Fragment key={node.id}>{chip}</Fragment>);\n }\n if (ctx.draft && !ctx.draft.groupId) {\n // `FilterBarChip` needs a full item; the draft's missing parts are blank until picked.\n const { id, fieldId, operatorId = '' } = ctx.draft;\n chips.push(\n <Fragment key={id}>\n <FilterBarChip draft item={{ id, fieldId, operatorId, value: '' }} />\n </Fragment>,\n );\n }\n return <>{chips}</>;\n}\n\nexport type FilterBarChipsProps = {\n /**\n * Chip for an item; return `null` to render none (e.g. an item only held in the\n * value for scoping). Defaults to a plain editable `FilterBar.Chip`.\n */\n renderChip?: (item: FilterBarItem) => ReactNode;\n};\n\nconst defaultRenderChip = (item: FilterBarItem) => <FilterBarChip item={item} />;\n\nFilterBar.Chips = FilterBarChips;\nFilterBar.Chip = FilterBarChip;\nFilterBar.AdvancedChip = FilterBarAdvancedChip;\nFilterBar.Input = FilterBarInput;\nFilterBar.TimeRange = FilterBarTimeRange;\n","import type { FilterBarOperator } from './types';\n\n/** Opt-in starter set. Pure data: the component attaches no semantics to ids. */\nexport const DEFAULT_FILTER_OPERATORS: FilterBarOperator[] = [\n { id: 'is', label: 'is', widensTo: 'in' },\n { id: 'is-not', label: 'is not' },\n { id: 'contains', label: 'contains' },\n { id: 'not-contains', label: 'does not contain' },\n { id: 'starts-with', label: 'starts with' },\n { id: 'gt', label: '>' },\n { id: 'lt', label: '<' },\n { id: 'gte', label: '>=' },\n { id: 'lte', label: '<=' },\n { id: 'is-empty', label: 'is empty', arity: 'none' },\n { id: 'is-not-empty', label: 'is not empty', arity: 'none' },\n { id: 'in', label: 'in', arity: 'many' },\n];\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MetricsCard-DojbLiEx.cjs","names":["cn","cn","Button","cn","GripVerticalIcon","cn","Txt","cn","_Fragment","Skeleton","cn","Spinner","cn","Txt","Card","cn","cn","DropdownMenu","cn","ChevronDownIcon","cn","cn","cn","SkeletonText","MetricsKpiCard"],"sources":["../src/ds/components/MetricsCard/metrics-card-actions.tsx","../src/ds/components/MetricsCard/metrics-card-content.tsx","../src/ds/components/MetricsCard/metrics-card-drag-handle.tsx","../src/ds/components/MetricsCard/metrics-card-error.tsx","../src/ds/components/MetricsCard/metrics-card-headline.tsx","../src/ds/components/MetricsCard/metrics-card-loading.tsx","../src/ds/components/MetricsCard/metrics-card-no-data.tsx","../src/ds/components/MetricsCard/metrics-card-root.tsx","../src/ds/components/MetricsCard/metrics-card-title.tsx","../src/ds/components/MetricsCard/metrics-card-title-menu.tsx","../src/ds/components/MetricsCard/metrics-card-toolbar.tsx","../src/ds/components/MetricsCard/metrics-card-top-bar.tsx","../src/ds/components/MetricsCard/metrics-card-total.tsx","../src/ds/components/MetricsCard/metrics-card.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\n/** Container for icon buttons / small actions in the top bar of a MetricsCard,\n * placed between the title and `Total` (which always renders last). Small (28px) buttons sit\n * centered on the 20px title line without making the top bar taller. */\nexport function MetricsCardActions({\n children,\n reveal = 'always',\n className,\n}: {\n children: ReactNode;\n /**\n * `hover`: the actions appear while the card is hovered or one of them has focus, so a page\n * of cards doesn't read as a page of buttons.\n */\n reveal?: 'always' | 'hover';\n className?: string;\n}) {\n return (\n <div\n className={cn(\n '-my-1 flex shrink-0 items-center gap-1 self-start',\n reveal === 'hover' &&\n 'opacity-0 transition-opacity duration-150 group-hover/metrics-card:opacity-100 focus-within:opacity-100',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\n/**\n * Scrolls sideways only (wide tables). Vertical overflow is hidden: a chart filling a card with a\n * fractional height rounds 1px past it, which otherwise turns the content into a scroll box.\n * Tables inside a card drop the last row's border: the card edge already closes them.\n */\nexport function MetricsCardContent({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <div className={cn('overflow-x-auto overflow-y-hidden [&_tbody>tr:last-child]:border-b-0', className)}>\n {children}\n </div>\n );\n}\n","import { GripVerticalIcon } from 'lucide-react';\nimport type { DragEventHandler } from 'react';\nimport { Button } from '@/ds/components/Button';\nimport { cn } from '@/lib/utils';\n\n/** What a host's layout hands a card so it can be dragged, e.g. to rearrange a dashboard. */\nexport type MetricsCardDragHandleProps = {\n /** What dragging does, e.g. \"Move widget\". */\n 'aria-label': string;\n draggable?: boolean;\n onDragStart?: DragEventHandler<HTMLElement>;\n onDragEnd?: DragEventHandler<HTMLElement>;\n className?: string;\n};\n\n/** The grip a card is dragged by, left of its title. Its negative margin keeps the top bar's height. */\nexport function MetricsCardDragHandle({ className, ...props }: MetricsCardDragHandleProps) {\n return (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn('-my-1 shrink-0 cursor-grab active:cursor-grabbing', className)}\n {...props}\n >\n <GripVerticalIcon />\n </Button>\n );\n}\n","import { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport function MetricsCardError({\n message = 'Failed to load data',\n className,\n}: {\n message?: string;\n className?: string;\n}) {\n return (\n <div className={cn('flex flex-col items-center justify-center gap-3', className)}>\n <Txt variant=\"caption\" className=\"text-destructive-foreground\">\n {message}\n </Txt>\n </div>\n );\n}\n","import { Skeleton } from '@/ds/components/Skeleton';\nimport { cn } from '@/lib/utils';\n\n/**\n * The header of a card with one large chart (an explorer, a detail page): the label over a large\n * value, the change against the previous period beside it. Cards in a grid use the compact title\n * and `MetricsCard.Total` instead. A skeleton while loading, at the value's own trimmed height.\n */\nexport function MetricsCardHeadline({\n label,\n value,\n change,\n isLoading = false,\n className,\n}: {\n label: string;\n value: string;\n /** E.g. \"+71.4%\"; shown as \"+71.4% vs previous\". */\n change?: string;\n isLoading?: boolean;\n className?: string;\n}) {\n return (\n <div className={cn('grid gap-1.5', className)}>\n <h3 className=\"text-body-sm text-muted-foreground\">{label}</h3>\n <span className=\"flex items-baseline gap-2\">\n <span\n className={cn(\n 'text-title text-foreground tabular-nums [text-box:trim-both_cap_alphabetic]',\n isLoading && 'relative min-w-24',\n )}\n >\n {isLoading ? (\n // Hidden text keeps the value's trimmed height, so the row (and the actions centred on\n // it) doesn't move when the value arrives; the bar covers it.\n <>\n <span className=\"invisible\">0</span>\n <Skeleton className=\"absolute inset-0\" />\n </>\n ) : (\n value\n )}\n </span>\n {!isLoading &&\n change && (\n // Trimmed like the value, so its line box doesn't make the row taller than while loading.\n <span className=\"text-body-sm text-muted-foreground tabular-nums [text-box:trim-both_cap_alphabetic]\">\n {change} vs previous\n </span>\n )}\n </span>\n </div>\n );\n}\n","import { Spinner } from '@/ds/components/Spinner/spinner';\nimport { cn } from '@/lib/utils';\n\nexport function MetricsCardLoading({ className }: { className?: string }) {\n return (\n <div className={cn('flex items-center justify-center', className)}>\n <Spinner size=\"md\" variant=\"pulse\" className=\"text-placeholder\" />\n </div>\n );\n}\n","import { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport function MetricsCardNoData({ message = 'No data yet', className }: { message?: string; className?: string }) {\n return (\n <div className={cn('flex h-full items-center justify-center', className)}>\n <Txt tone=\"faint\">{message}</Txt>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Card } from '@/ds/components/Card';\nimport { cn } from '@/lib/utils';\n\nexport function MetricsCardRoot({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <Card\n className={cn(\n 'group/metrics-card grid min-h-72 min-w-80 flex-1 grid-rows-[auto_1fr] gap-4 px-4 py-3 2xl:min-w-120 md:min-w-88 lg:min-w-sm xl:min-w-104',\n className,\n )}\n >\n {children}\n </Card>\n );\n}\n","import { cn } from '@/lib/utils';\n\nexport function MetricsCardTitle({\n children,\n className,\n as: Tag = 'h3',\n}: {\n children: string;\n className?: string;\n as?: 'h2' | 'h3' | 'h4';\n}) {\n return <Tag className={cn('text-body font-medium text-foreground', className)}>{children}</Tag>;\n}\n","import { ChevronDownIcon } from 'lucide-react';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu';\nimport type { DropdownMenuRadioOption } from '@/ds/components/DropdownMenu';\nimport { cn } from '@/lib/utils';\n\nexport type MetricsCardTitleMenuProps<V extends string> = {\n /** The card title for the picked view (e.g. \"Spend by model\"). */\n title: string;\n value: V;\n onValueChange: (value: V) => void;\n /** The views (e.g. \"By model\", \"By provider\"). */\n options: readonly DropdownMenuRadioOption<V>[];\n className?: string;\n};\n\n/**\n * A card title that switches the card's view, as on Vercel's usage cards: the title is the\n * trigger, with a chevron. The hover fill bleeds past the text so the title stays aligned.\n * Wrapped, so the top bar stretches the wrapper rather than the button, and the menu's open-state\n * nodes next to the trigger don't become the top bar's first child.\n */\nexport function MetricsCardTitleMenu<V extends string>({\n title,\n value,\n onValueChange,\n options,\n className,\n}: MetricsCardTitleMenuProps<V>) {\n return (\n <div className=\"flex min-w-0\">\n <DropdownMenu>\n <DropdownMenu.Trigger\n render={\n <button\n type=\"button\"\n className={cn(\n '-mx-1.5 -my-0.5 flex items-center gap-1 self-start rounded-md px-1.5 py-0.5 text-left text-body font-medium text-foreground hover:bg-fill-subtle',\n className,\n )}\n />\n }\n >\n {title}\n <ChevronDownIcon className=\"size-3.5 text-muted-foreground\" />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"start\">\n <DropdownMenu.RadioOptions options={options} value={value} onValueChange={onValueChange} closeOnSelect />\n </DropdownMenu.Content>\n </DropdownMenu>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\n/**\n * One row under the top bar for a card's controls: a legend, list column headers.\n * The first child sits on the left, the last on the right; either side may be omitted. When\n * both don't fit (a narrow card), the right side wraps to its own line, still on the right. At least 24px\n * tall, so toolbars line up across cards in the same row.\n */\nexport function MetricsCardToolbar({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <div\n className={cn(\n 'flex min-h-6 min-w-0 flex-wrap items-center justify-between gap-x-4 gap-y-2 [&>*:first-child]:min-w-0 [&>*:last-child:not(:first-child)]:ml-auto',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport function MetricsCardTopBar({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <div className={cn('flex items-start gap-4 [&>:first-child]:min-w-0 [&>:first-child]:flex-1', className)}>\n {children}\n </div>\n );\n}\n","import { SkeletonText } from '@/ds/components/Skeleton';\nimport { cn } from '@/lib/utils';\n\n/** One of several totals in a card that charts a few series, marked with its series' color. */\nexport type MetricsCardTotalPart = { label: string; value: string; color: string };\n\n/**\n * A card's total, right of the title in the same type (14px, medium). Always the top\n * bar's last item. A skeleton while loading, in the value's own line box. A card charting a\n * few series of different things (resources, threads) can give one total each, each after a\n * marker in its series' color, like the legend.\n */\nexport function MetricsCardTotal({\n value,\n isLoading = false,\n className,\n}: {\n value: string | readonly MetricsCardTotalPart[];\n isLoading?: boolean;\n className?: string;\n}) {\n return (\n <span className={cn('order-last shrink-0 text-body font-medium text-foreground tabular-nums', className)}>\n <TotalValue value={value} isLoading={isLoading} />\n </span>\n );\n}\n\nfunction TotalValue({ value, isLoading }: { value: string | readonly MetricsCardTotalPart[]; isLoading: boolean }) {\n if (isLoading) return <SkeletonText line=\"text-body\" className=\"h-4 w-14\" />;\n if (typeof value === 'string') return value;\n return (\n <span className=\"inline-flex items-center gap-3\">\n {value.map(part => (\n <span key={part.label} className=\"inline-flex items-center gap-1.5\">\n <span aria-hidden className=\"size-2 shrink-0 rounded-[2px]\" style={{ backgroundColor: part.color }} />\n {/* The marker is decorative; screen readers hear which total this is. */}\n <span className=\"sr-only\">{part.label} </span>\n {part.value}\n </span>\n ))}\n </span>\n );\n}\n","import { MetricsCardActions } from './metrics-card-actions';\nimport { MetricsCardContent } from './metrics-card-content';\nimport { MetricsCardDragHandle } from './metrics-card-drag-handle';\nimport { MetricsCardError } from './metrics-card-error';\nimport { MetricsCardHeadline } from './metrics-card-headline';\nimport { MetricsCardLoading } from './metrics-card-loading';\nimport { MetricsCardNoData } from './metrics-card-no-data';\nimport { MetricsCardRoot } from './metrics-card-root';\nimport { MetricsCardTitle } from './metrics-card-title';\nimport { MetricsCardTitleMenu } from './metrics-card-title-menu';\nimport { MetricsCardToolbar } from './metrics-card-toolbar';\nimport { MetricsCardTopBar } from './metrics-card-top-bar';\nimport { MetricsCardTotal } from './metrics-card-total';\nimport { MetricsKpiCard } from '@/ds/components/MetricsKpiCard';\n\nexport const MetricsCard = Object.assign(MetricsCardRoot, {\n Root: MetricsCardRoot,\n Kpi: MetricsKpiCard,\n TopBar: MetricsCardTopBar,\n Toolbar: MetricsCardToolbar,\n Actions: MetricsCardActions,\n DragHandle: MetricsCardDragHandle,\n Title: MetricsCardTitle,\n TitleMenu: MetricsCardTitleMenu,\n Total: MetricsCardTotal,\n Headline: MetricsCardHeadline,\n Loading: MetricsCardLoading,\n Error: MetricsCardError,\n Content: MetricsCardContent,\n NoData: MetricsCardNoData,\n});\n"],"mappings":";;;;;;;;;;;;;;AAMA,SAAgB,mBAAmB,EACjC,UACA,SAAS,UACT,aASC;CACD,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EACE,WAAWA,cAAAA,GACT,qDACA,WAAW,WACT,2GACF,SACF;EAEC;CACE,CAAA;AAET;;;;;;;ACvBA,SAAgB,mBAAmB,EAAE,UAAU,aAA0D;CACvG,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,WAAWC,cAAAA,GAAG,wEAAwE,SAAS;EACjG;CACE,CAAA;AAET;;;ACEA,SAAgB,sBAAsB,EAAE,WAAW,GAAG,SAAqC;CACzF,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,eAAAA,QAAD;EACE,SAAQ;EACR,MAAK;EACL,WAAWC,cAAAA,GAAG,qDAAqD,SAAS;EAC5E,GAAI;EAEJ,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,aAAAA,kBAAD,CAAmB,CAAA;CACb,CAAA;AAEZ;;ACxBA,SAAgB,iBAAiB,EAC/B,UAAU,uBACV,aAIC;CACD,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,WAAWC,cAAAA,GAAG,mDAAmD,SAAS;EAC7E,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,YAAAA,KAAD;GAAK,SAAQ;GAAU,WAAU;GAC9B,UAAA;EACE,CAAA;CACF,CAAA;AAET;;;;;;;ACTA,SAAgB,oBAAoB,EAClC,OACA,OACA,QACA,YAAY,OACZ,aAQC;CACD,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EAAK,WAAWC,cAAAA,GAAG,gBAAgB,SAAS;EAA5C,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;GAAI,WAAU;GAAsC,UAAA;EAAU,CAAA,GAC9D,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;GAAM,WAAU;GAAhB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;IACE,WAAWA,cAAAA,GACT,+EACA,aAAa,mBACf;IAEC,UAAA,YAGC,iBAAA,GAAA,kBAAA,KAAA,CAAAC,kBAAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,WAAU;KAAY,UAAA;IAAO,CAAA,GACnC,iBAAA,GAAA,kBAAA,IAAA,CAACC,4BAAAA,UAAD,EAAU,WAAU,mBAAoB,CAAA,CACxC,EAAA,CAAA,IAEF;GAEE,CAAA,GACL,CAAC,aACA,UAEE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;IAAM,WAAU;IAAhB,UAAA,CACG,QAAO,cACJ;GAEN,CAAA,CAAA;EACH,CAAA,CAAA;;AAET;;AClDA,SAAgB,mBAAmB,EAAE,aAAqC;CACxE,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,WAAWC,cAAAA,GAAG,oCAAoC,SAAS;EAC9D,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,gBAAAA,SAAD;GAAS,MAAK;GAAK,SAAQ;GAAQ,WAAU;EAAoB,CAAA;CAC9D,CAAA;AAET;;ACNA,SAAgB,kBAAkB,EAAE,UAAU,eAAe,aAAuD;CAClH,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,WAAWC,cAAAA,GAAG,2CAA2C,SAAS;EACrE,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,YAAAA,KAAD;GAAK,MAAK;GAAS,UAAA;EAAa,CAAA;CAC7B,CAAA;AAET;;ACLA,SAAgB,gBAAgB,EAAE,UAAU,aAA0D;CACpG,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,aAAAA,MAAD;EACE,WAAWC,cAAAA,GACT,4IACA,SACF;EAEC;CACG,CAAA;AAEV;;ACbA,SAAgB,iBAAiB,EAC/B,UACA,WACA,IAAI,MAAM,QAKT;CACD,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;EAAK,WAAWC,cAAAA,GAAG,yCAAyC,SAAS;EAAI;CAAc,CAAA;AAChG;;;;;;;;ACSA,SAAgB,qBAAuC,EACrD,OACA,OACA,eACA,SACA,aAC+B;CAC/B,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,WAAU;EACb,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAACC,sBAAAA,cAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAACA,sBAAAA,aAAa,SAAd;GACE,QACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;IACE,MAAK;IACL,WAAWC,cAAAA,GACT,oJACA,SACF;GACD,CAAA;GARL,UAAA,CAWG,OACD,iBAAA,GAAA,kBAAA,IAAA,CAACC,aAAAA,iBAAD,EAAiB,WAAU,iCAAkC,CAAA,CACzC;EACtB,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAACF,sBAAAA,aAAa,SAAd;GAAsB,OAAM;GAC1B,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACA,sBAAAA,aAAa,cAAd;IAAoC;IAAgB;IAAsB;IAAe,eAAA;GAAe,CAAA;EACpF,CAAA,CACV,EAAA,CAAA;CACX,CAAA;AAET;;;;;;;;AC1CA,SAAgB,mBAAmB,EAAE,UAAU,aAA0D;CACvG,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EACE,WAAWG,cAAAA,GACT,oJACA,SACF;EAEC;CACE,CAAA;AAET;;ACjBA,SAAgB,kBAAkB,EAAE,UAAU,aAA0D;CACtG,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,WAAWC,cAAAA,GAAG,2EAA2E,SAAS;EACpG;CACE,CAAA;AAET;;;;;;;;ACGA,SAAgB,iBAAiB,EAC/B,OACA,YAAY,OACZ,aAKC;CACD,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;EAAM,WAAWC,cAAAA,GAAG,0EAA0E,SAAS;EACrG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;GAAmB;GAAkB;EAAY,CAAA;CAC7C,CAAA;AAEV;AAEA,SAAS,WAAW,EAAE,OAAO,aAAsF;CACjH,IAAI,WAAW,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAACC,4BAAAA,cAAD;EAAc,MAAK;EAAY,WAAU;CAAY,CAAA;CAC3E,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;EAAM,WAAU;EACb,UAAA,MAAM,KAAI,SACT,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;GAAuB,WAAU;GAAjC,UAAA;IACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,eAAA;KAAY,WAAU;KAAgC,OAAO,EAAE,iBAAiB,KAAK,MAAM;IAAI,CAAA;IAErG,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;KAAM,WAAU;KAAhB,UAAA,CAA2B,KAAK,OAAM,GAAO;;IAC5C,KAAK;GACF;EALK,GAAA,KAAK,KAKV,CACP;CACG,CAAA;AAEV;;AC5BA,IAAa,cAAc,OAAO,OAAO,iBAAiB;CACxD,MAAM;CACN,KAAKC,uBAAAA;CACL,QAAQ;CACR,SAAS;CACT,SAAS;CACT,YAAY;CACZ,OAAO;CACP,WAAW;CACX,OAAO;CACP,UAAU;CACV,SAAS;CACT,OAAO;CACP,SAAS;CACT,QAAQ;AACV,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MetricsCard-kAqSCPPe.js","names":["_Fragment"],"sources":["../src/ds/components/MetricsCard/metrics-card-actions.tsx","../src/ds/components/MetricsCard/metrics-card-content.tsx","../src/ds/components/MetricsCard/metrics-card-drag-handle.tsx","../src/ds/components/MetricsCard/metrics-card-error.tsx","../src/ds/components/MetricsCard/metrics-card-headline.tsx","../src/ds/components/MetricsCard/metrics-card-loading.tsx","../src/ds/components/MetricsCard/metrics-card-no-data.tsx","../src/ds/components/MetricsCard/metrics-card-root.tsx","../src/ds/components/MetricsCard/metrics-card-title.tsx","../src/ds/components/MetricsCard/metrics-card-title-menu.tsx","../src/ds/components/MetricsCard/metrics-card-toolbar.tsx","../src/ds/components/MetricsCard/metrics-card-top-bar.tsx","../src/ds/components/MetricsCard/metrics-card-total.tsx","../src/ds/components/MetricsCard/metrics-card.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\n/** Container for icon buttons / small actions in the top bar of a MetricsCard,\n * placed between the title and `Total` (which always renders last). Small (28px) buttons sit\n * centered on the 20px title line without making the top bar taller. */\nexport function MetricsCardActions({\n children,\n reveal = 'always',\n className,\n}: {\n children: ReactNode;\n /**\n * `hover`: the actions appear while the card is hovered or one of them has focus, so a page\n * of cards doesn't read as a page of buttons.\n */\n reveal?: 'always' | 'hover';\n className?: string;\n}) {\n return (\n <div\n className={cn(\n '-my-1 flex shrink-0 items-center gap-1 self-start',\n reveal === 'hover' &&\n 'opacity-0 transition-opacity duration-150 group-hover/metrics-card:opacity-100 focus-within:opacity-100',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\n/**\n * Scrolls sideways only (wide tables). Vertical overflow is hidden: a chart filling a card with a\n * fractional height rounds 1px past it, which otherwise turns the content into a scroll box.\n * Tables inside a card drop the last row's border: the card edge already closes them.\n */\nexport function MetricsCardContent({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <div className={cn('overflow-x-auto overflow-y-hidden [&_tbody>tr:last-child]:border-b-0', className)}>\n {children}\n </div>\n );\n}\n","import { GripVerticalIcon } from 'lucide-react';\nimport type { DragEventHandler } from 'react';\nimport { Button } from '@/ds/components/Button';\nimport { cn } from '@/lib/utils';\n\n/** What a host's layout hands a card so it can be dragged, e.g. to rearrange a dashboard. */\nexport type MetricsCardDragHandleProps = {\n /** What dragging does, e.g. \"Move widget\". */\n 'aria-label': string;\n draggable?: boolean;\n onDragStart?: DragEventHandler<HTMLElement>;\n onDragEnd?: DragEventHandler<HTMLElement>;\n className?: string;\n};\n\n/** The grip a card is dragged by, left of its title. Its negative margin keeps the top bar's height. */\nexport function MetricsCardDragHandle({ className, ...props }: MetricsCardDragHandleProps) {\n return (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn('-my-1 shrink-0 cursor-grab active:cursor-grabbing', className)}\n {...props}\n >\n <GripVerticalIcon />\n </Button>\n );\n}\n","import { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport function MetricsCardError({\n message = 'Failed to load data',\n className,\n}: {\n message?: string;\n className?: string;\n}) {\n return (\n <div className={cn('flex flex-col items-center justify-center gap-3', className)}>\n <Txt variant=\"caption\" className=\"text-destructive-foreground\">\n {message}\n </Txt>\n </div>\n );\n}\n","import { Skeleton } from '@/ds/components/Skeleton';\nimport { cn } from '@/lib/utils';\n\n/**\n * The header of a card with one large chart (an explorer, a detail page): the label over a large\n * value, the change against the previous period beside it. Cards in a grid use the compact title\n * and `MetricsCard.Total` instead. A skeleton while loading, at the value's own trimmed height.\n */\nexport function MetricsCardHeadline({\n label,\n value,\n change,\n isLoading = false,\n className,\n}: {\n label: string;\n value: string;\n /** E.g. \"+71.4%\"; shown as \"+71.4% vs previous\". */\n change?: string;\n isLoading?: boolean;\n className?: string;\n}) {\n return (\n <div className={cn('grid gap-1.5', className)}>\n <h3 className=\"text-body-sm text-muted-foreground\">{label}</h3>\n <span className=\"flex items-baseline gap-2\">\n <span\n className={cn(\n 'text-title text-foreground tabular-nums [text-box:trim-both_cap_alphabetic]',\n isLoading && 'relative min-w-24',\n )}\n >\n {isLoading ? (\n // Hidden text keeps the value's trimmed height, so the row (and the actions centred on\n // it) doesn't move when the value arrives; the bar covers it.\n <>\n <span className=\"invisible\">0</span>\n <Skeleton className=\"absolute inset-0\" />\n </>\n ) : (\n value\n )}\n </span>\n {!isLoading &&\n change && (\n // Trimmed like the value, so its line box doesn't make the row taller than while loading.\n <span className=\"text-body-sm text-muted-foreground tabular-nums [text-box:trim-both_cap_alphabetic]\">\n {change} vs previous\n </span>\n )}\n </span>\n </div>\n );\n}\n","import { Spinner } from '@/ds/components/Spinner/spinner';\nimport { cn } from '@/lib/utils';\n\nexport function MetricsCardLoading({ className }: { className?: string }) {\n return (\n <div className={cn('flex items-center justify-center', className)}>\n <Spinner size=\"md\" variant=\"pulse\" className=\"text-placeholder\" />\n </div>\n );\n}\n","import { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport function MetricsCardNoData({ message = 'No data yet', className }: { message?: string; className?: string }) {\n return (\n <div className={cn('flex h-full items-center justify-center', className)}>\n <Txt tone=\"faint\">{message}</Txt>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Card } from '@/ds/components/Card';\nimport { cn } from '@/lib/utils';\n\nexport function MetricsCardRoot({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <Card\n className={cn(\n 'group/metrics-card grid min-h-72 min-w-80 flex-1 grid-rows-[auto_1fr] gap-4 px-4 py-3 2xl:min-w-120 md:min-w-88 lg:min-w-sm xl:min-w-104',\n className,\n )}\n >\n {children}\n </Card>\n );\n}\n","import { cn } from '@/lib/utils';\n\nexport function MetricsCardTitle({\n children,\n className,\n as: Tag = 'h3',\n}: {\n children: string;\n className?: string;\n as?: 'h2' | 'h3' | 'h4';\n}) {\n return <Tag className={cn('text-body font-medium text-foreground', className)}>{children}</Tag>;\n}\n","import { ChevronDownIcon } from 'lucide-react';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu';\nimport type { DropdownMenuRadioOption } from '@/ds/components/DropdownMenu';\nimport { cn } from '@/lib/utils';\n\nexport type MetricsCardTitleMenuProps<V extends string> = {\n /** The card title for the picked view (e.g. \"Spend by model\"). */\n title: string;\n value: V;\n onValueChange: (value: V) => void;\n /** The views (e.g. \"By model\", \"By provider\"). */\n options: readonly DropdownMenuRadioOption<V>[];\n className?: string;\n};\n\n/**\n * A card title that switches the card's view, as on Vercel's usage cards: the title is the\n * trigger, with a chevron. The hover fill bleeds past the text so the title stays aligned.\n * Wrapped, so the top bar stretches the wrapper rather than the button, and the menu's open-state\n * nodes next to the trigger don't become the top bar's first child.\n */\nexport function MetricsCardTitleMenu<V extends string>({\n title,\n value,\n onValueChange,\n options,\n className,\n}: MetricsCardTitleMenuProps<V>) {\n return (\n <div className=\"flex min-w-0\">\n <DropdownMenu>\n <DropdownMenu.Trigger\n render={\n <button\n type=\"button\"\n className={cn(\n '-mx-1.5 -my-0.5 flex items-center gap-1 self-start rounded-md px-1.5 py-0.5 text-left text-body font-medium text-foreground hover:bg-fill-subtle',\n className,\n )}\n />\n }\n >\n {title}\n <ChevronDownIcon className=\"size-3.5 text-muted-foreground\" />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"start\">\n <DropdownMenu.RadioOptions options={options} value={value} onValueChange={onValueChange} closeOnSelect />\n </DropdownMenu.Content>\n </DropdownMenu>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\n/**\n * One row under the top bar for a card's controls: a legend, list column headers.\n * The first child sits on the left, the last on the right; either side may be omitted. When\n * both don't fit (a narrow card), the right side wraps to its own line, still on the right. At least 24px\n * tall, so toolbars line up across cards in the same row.\n */\nexport function MetricsCardToolbar({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <div\n className={cn(\n 'flex min-h-6 min-w-0 flex-wrap items-center justify-between gap-x-4 gap-y-2 [&>*:first-child]:min-w-0 [&>*:last-child:not(:first-child)]:ml-auto',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport function MetricsCardTopBar({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <div className={cn('flex items-start gap-4 [&>:first-child]:min-w-0 [&>:first-child]:flex-1', className)}>\n {children}\n </div>\n );\n}\n","import { SkeletonText } from '@/ds/components/Skeleton';\nimport { cn } from '@/lib/utils';\n\n/** One of several totals in a card that charts a few series, marked with its series' color. */\nexport type MetricsCardTotalPart = { label: string; value: string; color: string };\n\n/**\n * A card's total, right of the title in the same type (14px, medium). Always the top\n * bar's last item. A skeleton while loading, in the value's own line box. A card charting a\n * few series of different things (resources, threads) can give one total each, each after a\n * marker in its series' color, like the legend.\n */\nexport function MetricsCardTotal({\n value,\n isLoading = false,\n className,\n}: {\n value: string | readonly MetricsCardTotalPart[];\n isLoading?: boolean;\n className?: string;\n}) {\n return (\n <span className={cn('order-last shrink-0 text-body font-medium text-foreground tabular-nums', className)}>\n <TotalValue value={value} isLoading={isLoading} />\n </span>\n );\n}\n\nfunction TotalValue({ value, isLoading }: { value: string | readonly MetricsCardTotalPart[]; isLoading: boolean }) {\n if (isLoading) return <SkeletonText line=\"text-body\" className=\"h-4 w-14\" />;\n if (typeof value === 'string') return value;\n return (\n <span className=\"inline-flex items-center gap-3\">\n {value.map(part => (\n <span key={part.label} className=\"inline-flex items-center gap-1.5\">\n <span aria-hidden className=\"size-2 shrink-0 rounded-[2px]\" style={{ backgroundColor: part.color }} />\n {/* The marker is decorative; screen readers hear which total this is. */}\n <span className=\"sr-only\">{part.label} </span>\n {part.value}\n </span>\n ))}\n </span>\n );\n}\n","import { MetricsCardActions } from './metrics-card-actions';\nimport { MetricsCardContent } from './metrics-card-content';\nimport { MetricsCardDragHandle } from './metrics-card-drag-handle';\nimport { MetricsCardError } from './metrics-card-error';\nimport { MetricsCardHeadline } from './metrics-card-headline';\nimport { MetricsCardLoading } from './metrics-card-loading';\nimport { MetricsCardNoData } from './metrics-card-no-data';\nimport { MetricsCardRoot } from './metrics-card-root';\nimport { MetricsCardTitle } from './metrics-card-title';\nimport { MetricsCardTitleMenu } from './metrics-card-title-menu';\nimport { MetricsCardToolbar } from './metrics-card-toolbar';\nimport { MetricsCardTopBar } from './metrics-card-top-bar';\nimport { MetricsCardTotal } from './metrics-card-total';\nimport { MetricsKpiCard } from '@/ds/components/MetricsKpiCard';\n\nexport const MetricsCard = Object.assign(MetricsCardRoot, {\n Root: MetricsCardRoot,\n Kpi: MetricsKpiCard,\n TopBar: MetricsCardTopBar,\n Toolbar: MetricsCardToolbar,\n Actions: MetricsCardActions,\n DragHandle: MetricsCardDragHandle,\n Title: MetricsCardTitle,\n TitleMenu: MetricsCardTitleMenu,\n Total: MetricsCardTotal,\n Headline: MetricsCardHeadline,\n Loading: MetricsCardLoading,\n Error: MetricsCardError,\n Content: MetricsCardContent,\n NoData: MetricsCardNoData,\n});\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Tree-Caz4FTCU.cjs","names":["React","React","cn","transitions","React","cn","Collapsible","React","CollapsibleContent","cn","React","cn","transitions","CollapsibleTrigger","DisclosureChevron","React","cn","React","Folder","File","cn","transitions","passwordManagerOptOutProps","React","cn","React","cn"],"sources":["../src/ds/components/Tree/tree-context.tsx","../src/ds/components/Tree/tree-file.tsx","../src/ds/components/Tree/tree-folder.tsx","../src/ds/components/Tree/tree-folder-content.tsx","../src/ds/components/Tree/tree-folder-trigger.tsx","../src/ds/components/Tree/tree-icon.tsx","../src/ds/components/Tree/tree-input.tsx","../src/ds/components/Tree/tree-label.tsx","../src/ds/components/Tree/tree-root.tsx","../src/ds/components/Tree/tree.tsx"],"sourcesContent":["/* eslint-disable react-refresh/only-export-components */\nimport * as React from 'react';\n\nexport interface TreeContextValue {\n selectedId?: string;\n onSelect?: (id: string) => void;\n focusItem?: (item: HTMLElement, options?: { focus?: boolean }) => void;\n}\n\nconst TreeContext = React.createContext<TreeContextValue | null>(null);\n\nexport function TreeProvider({ children, value }: { children: React.ReactNode; value: TreeContextValue }) {\n return <TreeContext.Provider value={value}>{children}</TreeContext.Provider>;\n}\n\nexport function useTreeContext(): TreeContextValue | null {\n return React.useContext(TreeContext);\n}\n\nexport interface TreeFolderContextValue {\n isFocused: boolean;\n isOpen: boolean;\n}\n\nconst TreeFolderContext = React.createContext<TreeFolderContextValue | null>(null);\n\nexport function TreeFolderProvider({ children, value }: { children: React.ReactNode; value: TreeFolderContextValue }) {\n return <TreeFolderContext.Provider value={value}>{children}</TreeFolderContext.Provider>;\n}\n\nexport function useTreeFolderContext(): TreeFolderContextValue | null {\n return React.useContext(TreeFolderContext);\n}\n\nconst TreeDepthContext = React.createContext<number>(0);\n\nexport function TreeDepthProvider({ children, depth }: { children: React.ReactNode; depth: number }) {\n return <TreeDepthContext.Provider value={depth}>{children}</TreeDepthContext.Provider>;\n}\n\nexport function useTreeDepth(): number {\n return React.useContext(TreeDepthContext);\n}\n","import * as React from 'react';\nimport { useTreeContext, useTreeDepth } from './tree-context';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFileProps {\n id?: string;\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFile = React.forwardRef<HTMLLIElement, TreeFileProps>(({ id, className, children }, ref) => {\n const treeCtx = useTreeContext();\n const depth = useTreeDepth();\n const isSelected = id != null && treeCtx?.selectedId === id;\n\n const handleClick = (e: React.MouseEvent<HTMLLIElement>) => {\n treeCtx?.focusItem?.(e.currentTarget);\n if (id != null && treeCtx?.onSelect) {\n treeCtx.onSelect(id);\n }\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLLIElement>) => {\n treeCtx?.focusItem?.(e.currentTarget, { focus: false });\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if ((e.key === 'Enter' || e.key === ' ') && id != null && treeCtx?.onSelect) {\n e.preventDefault();\n treeCtx.onSelect(id);\n }\n };\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-level={depth + 1}\n aria-selected={isSelected || undefined}\n data-tree-item-kind=\"file\"\n data-tree-item-id={id}\n tabIndex={-1}\n className={cn(\n 'group flex h-7 min-w-0 cursor-pointer items-center gap-1.5 rounded-sm px-1',\n transitions.colors,\n 'outline-hidden hover:bg-fill-subtle focus-visible:bg-fill-subtle focus-visible:text-foreground focus-visible:outline-hidden',\n isSelected && 'bg-fill-hover text-foreground',\n className,\n )}\n // +18 offsets past the chevron (size-3 = 12px) + flex gap (gap-1.5 = 6px) that folders have\n style={{ paddingLeft: depth * 12 + 18 }}\n onClick={handleClick}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n >\n {children}\n </li>\n );\n});\nTreeFile.displayName = 'Tree.File';\n","import * as React from 'react';\nimport { TreeFolderProvider, useTreeContext, useTreeDepth } from './tree-context';\nimport { Collapsible } from '@/ds/components/Collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderProps {\n id?: string;\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFolder = React.forwardRef<HTMLLIElement, TreeFolderProps>(\n ({ id, defaultOpen, open, onOpenChange, className, children }, ref) => {\n const treeCtx = useTreeContext();\n const depth = useTreeDepth();\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen ?? false);\n const [isFocused, setIsFocused] = React.useState(false);\n const isOpen = open ?? internalOpen;\n\n const handleOpenChange = React.useCallback(\n (nextOpen: boolean) => {\n setInternalOpen(nextOpen);\n onOpenChange?.(nextOpen);\n },\n [onOpenChange],\n );\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLLIElement>) => {\n if (e.target !== e.currentTarget) {\n setIsFocused(false);\n return;\n }\n\n setIsFocused(true);\n treeCtx?.focusItem?.(e.currentTarget, { focus: false });\n },\n [treeCtx],\n );\n\n const handleBlur = React.useCallback(() => {\n setIsFocused(false);\n }, []);\n\n const folderContextValue = React.useMemo(() => ({ isFocused, isOpen }), [isFocused, isOpen]);\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-expanded={isOpen}\n aria-level={depth + 1}\n data-tree-item-kind=\"folder\"\n data-tree-item-id={id}\n tabIndex={-1}\n className={cn('flex flex-col outline-hidden', className)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <TreeFolderProvider value={folderContextValue}>\n <Collapsible open={isOpen} onOpenChange={handleOpenChange}>\n {children}\n </Collapsible>\n </TreeFolderProvider>\n </li>\n );\n },\n);\nTreeFolder.displayName = 'Tree.Folder';\n","import * as React from 'react';\nimport { useTreeDepth, TreeDepthProvider } from './tree-context';\nimport { CollapsibleContent } from '@/ds/components/Collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderContentProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFolderContent = React.forwardRef<HTMLDivElement, TreeFolderContentProps>(\n ({ className, children }, ref) => {\n const depth = useTreeDepth();\n\n return (\n <CollapsibleContent ref={ref} fill className={cn(className)}>\n <TreeDepthProvider depth={depth + 1}>\n <ul role=\"group\" className=\"flex flex-col\">\n {children}\n </ul>\n </TreeDepthProvider>\n </CollapsibleContent>\n );\n },\n);\nTreeFolderContent.displayName = 'Tree.FolderContent';\n","import * as React from 'react';\nimport { useTreeContext, useTreeDepth, useTreeFolderContext } from './tree-context';\nimport { CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { DisclosureChevron } from '@/ds/components/DisclosureChevron';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderTriggerProps {\n className?: string;\n children: React.ReactNode;\n actions?: React.ReactNode;\n}\n\nexport const TreeFolderTrigger = React.forwardRef<HTMLDivElement, TreeFolderTriggerProps>(\n ({ className, children, actions }, ref) => {\n const treeCtx = useTreeContext();\n const folderCtx = useTreeFolderContext();\n const depth = useTreeDepth();\n\n const focusFolderItem = React.useCallback(\n (target: HTMLElement, options?: { focus?: boolean }) => {\n const item = target.closest<HTMLElement>('[data-tree-item-kind=\"folder\"]');\n if (item) {\n treeCtx?.focusItem?.(item, options);\n }\n },\n [treeCtx],\n );\n\n return (\n <div\n ref={ref}\n data-tree-folder-row=\"true\"\n className={cn(\n 'group flex h-7 w-full min-w-0 items-center rounded-sm hover:bg-fill-subtle',\n transitions.colors,\n folderCtx?.isFocused && 'bg-fill-hover text-foreground',\n className,\n )}\n >\n <CollapsibleTrigger\n data-tree-folder-trigger=\"true\"\n tabIndex={-1}\n className=\"flex h-7 min-w-0 flex-1 cursor-pointer items-center gap-1.5 rounded-sm px-1 outline-hidden focus-visible:outline-hidden\"\n style={{ paddingLeft: depth * 12 }}\n onMouseDown={e => {\n e.preventDefault();\n focusFolderItem(e.currentTarget);\n }}\n onFocus={e => {\n focusFolderItem(e.currentTarget, { focus: false });\n }}\n >\n <DisclosureChevron direction=\"right\" open={folderCtx?.isOpen} className=\"size-3 text-muted-foreground\" />\n {children}\n </CollapsibleTrigger>\n {actions && (\n <span className=\"shrink-0 pr-1\" onClick={e => e.stopPropagation()}>\n {actions}\n </span>\n )}\n </div>\n );\n },\n);\nTreeFolderTrigger.displayName = 'Tree.FolderTrigger';\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeIconProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeIcon = React.forwardRef<HTMLSpanElement, TreeIconProps>(({ className, children }, ref) => (\n <span ref={ref} className={cn('flex shrink-0 items-center [&>svg]:size-3.5', className)}>\n {children}\n </span>\n));\nTreeIcon.displayName = 'Tree.Icon';\n","import { File, Folder } from 'lucide-react';\nimport * as React from 'react';\nimport { useTreeDepth } from './tree-context';\nimport { passwordManagerOptOutProps } from '@/ds/primitives/password-manager-autofill';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeInputProps {\n type: 'file' | 'folder';\n onSubmit: (name: string) => void;\n onCancel?: () => void;\n defaultValue?: string;\n placeholder?: string;\n autoFocus?: boolean;\n className?: string;\n}\n\nexport const TreeInput = React.forwardRef<HTMLLIElement, TreeInputProps>(\n ({ type, onSubmit, onCancel, defaultValue = '', placeholder, autoFocus = true, className }, ref) => {\n const depth = useTreeDepth();\n const inputRef = React.useRef<HTMLInputElement>(null);\n const submittedRef = React.useRef(false);\n\n const handleSubmit = React.useCallback(\n (value: string) => {\n if (submittedRef.current) return;\n const trimmed = value.trim();\n if (trimmed) {\n submittedRef.current = true;\n onSubmit(trimmed);\n } else {\n onCancel?.();\n }\n },\n [onSubmit, onCancel],\n );\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleSubmit(e.currentTarget.value);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel?.();\n }\n },\n [handleSubmit, onCancel],\n );\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n handleSubmit(e.currentTarget.value);\n },\n [handleSubmit],\n );\n\n const handleFocus = React.useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n e.currentTarget.select();\n }, []);\n\n const Icon = type === 'folder' ? Folder : File;\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-level={depth + 1}\n data-tree-item-kind=\"input\"\n className={cn(\n 'group flex h-7 min-w-0 items-center gap-1.5 rounded-sm px-1',\n transitions.colors,\n 'focus-within:bg-fill-subtle focus-within:text-foreground focus-within:outline-hidden',\n className,\n )}\n style={{ paddingLeft: depth * 12 + 18 }}\n >\n <span className=\"flex shrink-0 items-center [&>svg]:size-3.5\">\n <Icon className=\"text-muted-foreground\" />\n </span>\n <input\n ref={inputRef}\n type=\"text\"\n defaultValue={defaultValue}\n placeholder={placeholder}\n autoFocus={autoFocus}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onFocus={handleFocus}\n {...passwordManagerOptOutProps}\n className=\"min-w-0 flex-1 border-none bg-transparent text-caption text-foreground outline-hidden placeholder:text-muted-foreground\"\n />\n </li>\n );\n },\n);\nTreeInput.displayName = 'Tree.Input';\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeLabelProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeLabel = React.forwardRef<HTMLSpanElement, TreeLabelProps>(({ className, children }, ref) => (\n <span ref={ref} className={cn('truncate text-foreground', className)}>\n {children}\n </span>\n));\nTreeLabel.displayName = 'Tree.Label';\n","import * as React from 'react';\nimport { TreeProvider, TreeDepthProvider } from './tree-context';\nimport { useIsomorphicLayoutEffect } from '@/hooks/use-isomorphic-layout-effect';\nimport { cn } from '@/lib/utils';\n\nconst TREE_FOCUSABLE_ITEM_SELECTOR = '[data-tree-item-kind=\"folder\"], [data-tree-item-kind=\"file\"]';\nconst TREE_FOLDER_TRIGGER_SELECTOR = '[data-tree-folder-trigger=\"true\"]';\n\nexport interface TreeRootProps {\n selectedId?: string;\n onSelect?: (id: string) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nfunction assignRef<T>(ref: React.ForwardedRef<T>, value: T | null) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n}\n\nfunction getTreeItems(root: HTMLElement): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR)).filter(\n item => item.getAttribute('role') === 'treeitem',\n );\n}\n\nfunction setTabStops(items: HTMLElement[], focusableItem: HTMLElement) {\n for (const item of items) {\n item.tabIndex = item === focusableItem ? 0 : -1;\n }\n}\n\nfunction syncTreeItemSetMetadata(root: HTMLElement) {\n const groups = [root, ...Array.from(root.querySelectorAll<HTMLElement>('[role=\"group\"]'))];\n\n for (const group of groups) {\n const items = Array.from(group.children).filter(\n (child): child is HTMLElement =>\n child instanceof HTMLElement &&\n child.getAttribute('role') === 'treeitem' &&\n child.hasAttribute('data-tree-item-kind'),\n );\n\n items.forEach((item, index) => {\n item.setAttribute('aria-posinset', String(index + 1));\n item.setAttribute('aria-setsize', String(items.length));\n });\n }\n}\n\nfunction findSelectedItem(items: HTMLElement[], selectedId: string | undefined): HTMLElement | null {\n if (!selectedId) return null;\n return items.find(item => item.dataset.treeItemId === selectedId) ?? null;\n}\n\nfunction getActiveTreeItem(root: HTMLElement, items: HTMLElement[]): HTMLElement | null {\n const activeElement = root.ownerDocument.activeElement;\n if (!(activeElement instanceof HTMLElement) || !root.contains(activeElement)) return null;\n\n const activeItem = activeElement.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR);\n return activeItem && items.includes(activeItem) ? activeItem : null;\n}\n\nfunction getClosestTreeItem(root: HTMLElement, target: EventTarget | null): HTMLElement | null {\n if (!(target instanceof HTMLElement) || !root.contains(target)) return null;\n const item = target.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR);\n return item?.getAttribute('role') === 'treeitem' ? item : null;\n}\n\nfunction focusTreeItem(root: HTMLElement, item: HTMLElement, options: { focus?: boolean } = {}) {\n const items = getTreeItems(root);\n if (!items.includes(item)) return;\n\n setTabStops(items, item);\n if (options.focus !== false) {\n item.focus();\n }\n}\n\nfunction syncTreeTabStops(root: HTMLElement, selectedId: string | undefined) {\n const items = getTreeItems(root);\n syncTreeItemSetMetadata(root);\n\n const firstItem = items[0];\n if (!firstItem) return;\n\n const activeItem = getActiveTreeItem(root, items);\n const selectedItem = findSelectedItem(items, selectedId);\n setTabStops(items, activeItem ?? selectedItem ?? firstItem);\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.dataset.treeFolderTrigger === 'true') return false;\n if (target.isContentEditable) return true;\n\n return !!target.closest('input, textarea, select, button, [contenteditable=\"true\"]');\n}\n\nfunction getFolderTrigger(item: HTMLElement): HTMLButtonElement | null {\n return item.querySelector<HTMLButtonElement>(TREE_FOLDER_TRIGGER_SELECTOR);\n}\n\nfunction getParentTreeItem(item: HTMLElement): HTMLElement | null {\n const parentGroup = item.parentElement?.closest('[role=\"group\"]');\n return parentGroup?.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR) ?? null;\n}\n\nfunction activateTreeItem(item: HTMLElement) {\n const trigger = getFolderTrigger(item);\n if (trigger) {\n trigger.click();\n } else {\n item.click();\n }\n}\n\nexport const TreeRoot = React.forwardRef<HTMLUListElement, TreeRootProps>(\n ({ selectedId, onSelect, className, children }, ref) => {\n const rootRef = React.useRef<HTMLUListElement | null>(null);\n\n const handleRootRef = React.useCallback(\n (node: HTMLUListElement | null) => {\n rootRef.current = node;\n assignRef(ref, node);\n },\n [ref],\n );\n\n const focusItem = React.useCallback((item: HTMLElement, options?: { focus?: boolean }) => {\n const root = rootRef.current;\n if (!root) return;\n focusTreeItem(root, item, options);\n }, []);\n\n const handleKeyDown = React.useCallback((event: React.KeyboardEvent<HTMLUListElement>) => {\n if (event.defaultPrevented || isEditableTarget(event.target)) return;\n\n const root = rootRef.current;\n if (!root) return;\n\n const items = getTreeItems(root);\n const currentItem =\n getClosestTreeItem(root, event.target) ??\n getActiveTreeItem(root, items) ??\n items.find(item => item.tabIndex === 0);\n if (!currentItem) return;\n\n const currentIndex = items.indexOf(currentItem);\n if (currentIndex < 0) return;\n\n let nextItem: HTMLElement | null = null;\n let handled = true;\n\n switch (event.key) {\n case 'ArrowDown':\n nextItem = items[Math.min(currentIndex + 1, items.length - 1)] ?? null;\n break;\n case 'ArrowUp':\n nextItem = items[Math.max(currentIndex - 1, 0)] ?? null;\n break;\n case 'Home':\n nextItem = items[0] ?? null;\n break;\n case 'End':\n nextItem = items[items.length - 1] ?? null;\n break;\n case 'ArrowRight': {\n const trigger = getFolderTrigger(currentItem);\n if (trigger && currentItem.getAttribute('aria-expanded') !== 'true') {\n trigger.click();\n nextItem = currentItem;\n } else {\n nextItem = items[Math.min(currentIndex + 1, items.length - 1)] ?? null;\n }\n break;\n }\n case 'ArrowLeft': {\n const trigger = getFolderTrigger(currentItem);\n if (trigger && currentItem.getAttribute('aria-expanded') === 'true') {\n trigger.click();\n nextItem = currentItem;\n } else {\n nextItem = getParentTreeItem(currentItem);\n }\n break;\n }\n case 'Enter':\n case ' ':\n case 'Spacebar':\n activateTreeItem(currentItem);\n nextItem = currentItem;\n break;\n default:\n handled = false;\n }\n\n if (!handled) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (nextItem) {\n focusTreeItem(root, nextItem);\n }\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n syncTreeTabStops(root, selectedId);\n }, [children, selectedId]);\n\n React.useEffect(() => {\n const root = rootRef.current;\n if (!root || typeof MutationObserver === 'undefined') return;\n\n const observer = new MutationObserver(() => {\n syncTreeTabStops(root, selectedId);\n });\n observer.observe(root, { childList: true, subtree: true });\n\n return () => {\n observer.disconnect();\n };\n }, [selectedId]);\n\n const contextValue = React.useMemo(() => ({ selectedId, onSelect, focusItem }), [selectedId, onSelect, focusItem]);\n\n return (\n <TreeProvider value={contextValue}>\n <TreeDepthProvider depth={0}>\n <ul\n ref={handleRootRef}\n role=\"tree\"\n className={cn('flex flex-col text-caption', className)}\n onKeyDown={handleKeyDown}\n >\n {children}\n </ul>\n </TreeDepthProvider>\n </TreeProvider>\n );\n },\n);\nTreeRoot.displayName = 'Tree';\n","import { TreeFile } from './tree-file';\nimport { TreeFolder } from './tree-folder';\nimport { TreeFolderContent } from './tree-folder-content';\nimport { TreeFolderTrigger } from './tree-folder-trigger';\nimport { TreeIcon } from './tree-icon';\nimport { TreeInput } from './tree-input';\nimport { TreeLabel } from './tree-label';\nimport { TreeRoot } from './tree-root';\n\nexport const Tree = Object.assign(TreeRoot, {\n Folder: TreeFolder,\n FolderTrigger: TreeFolderTrigger,\n FolderContent: TreeFolderContent,\n File: TreeFile,\n Icon: TreeIcon,\n Label: TreeLabel,\n Input: TreeInput,\n});\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Tree-od43gLMO.js","names":["React","React","React","React","React","React","React","React","React"],"sources":["../src/ds/components/Tree/tree-context.tsx","../src/ds/components/Tree/tree-file.tsx","../src/ds/components/Tree/tree-folder.tsx","../src/ds/components/Tree/tree-folder-content.tsx","../src/ds/components/Tree/tree-folder-trigger.tsx","../src/ds/components/Tree/tree-icon.tsx","../src/ds/components/Tree/tree-input.tsx","../src/ds/components/Tree/tree-label.tsx","../src/ds/components/Tree/tree-root.tsx","../src/ds/components/Tree/tree.tsx"],"sourcesContent":["/* eslint-disable react-refresh/only-export-components */\nimport * as React from 'react';\n\nexport interface TreeContextValue {\n selectedId?: string;\n onSelect?: (id: string) => void;\n focusItem?: (item: HTMLElement, options?: { focus?: boolean }) => void;\n}\n\nconst TreeContext = React.createContext<TreeContextValue | null>(null);\n\nexport function TreeProvider({ children, value }: { children: React.ReactNode; value: TreeContextValue }) {\n return <TreeContext.Provider value={value}>{children}</TreeContext.Provider>;\n}\n\nexport function useTreeContext(): TreeContextValue | null {\n return React.useContext(TreeContext);\n}\n\nexport interface TreeFolderContextValue {\n isFocused: boolean;\n isOpen: boolean;\n}\n\nconst TreeFolderContext = React.createContext<TreeFolderContextValue | null>(null);\n\nexport function TreeFolderProvider({ children, value }: { children: React.ReactNode; value: TreeFolderContextValue }) {\n return <TreeFolderContext.Provider value={value}>{children}</TreeFolderContext.Provider>;\n}\n\nexport function useTreeFolderContext(): TreeFolderContextValue | null {\n return React.useContext(TreeFolderContext);\n}\n\nconst TreeDepthContext = React.createContext<number>(0);\n\nexport function TreeDepthProvider({ children, depth }: { children: React.ReactNode; depth: number }) {\n return <TreeDepthContext.Provider value={depth}>{children}</TreeDepthContext.Provider>;\n}\n\nexport function useTreeDepth(): number {\n return React.useContext(TreeDepthContext);\n}\n","import * as React from 'react';\nimport { useTreeContext, useTreeDepth } from './tree-context';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFileProps {\n id?: string;\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFile = React.forwardRef<HTMLLIElement, TreeFileProps>(({ id, className, children }, ref) => {\n const treeCtx = useTreeContext();\n const depth = useTreeDepth();\n const isSelected = id != null && treeCtx?.selectedId === id;\n\n const handleClick = (e: React.MouseEvent<HTMLLIElement>) => {\n treeCtx?.focusItem?.(e.currentTarget);\n if (id != null && treeCtx?.onSelect) {\n treeCtx.onSelect(id);\n }\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLLIElement>) => {\n treeCtx?.focusItem?.(e.currentTarget, { focus: false });\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if ((e.key === 'Enter' || e.key === ' ') && id != null && treeCtx?.onSelect) {\n e.preventDefault();\n treeCtx.onSelect(id);\n }\n };\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-level={depth + 1}\n aria-selected={isSelected || undefined}\n data-tree-item-kind=\"file\"\n data-tree-item-id={id}\n tabIndex={-1}\n className={cn(\n 'group flex h-7 min-w-0 cursor-pointer items-center gap-1.5 rounded-sm px-1',\n transitions.colors,\n 'outline-hidden hover:bg-fill-subtle focus-visible:bg-fill-subtle focus-visible:text-foreground focus-visible:outline-hidden',\n isSelected && 'bg-fill-hover text-foreground',\n className,\n )}\n // +18 offsets past the chevron (size-3 = 12px) + flex gap (gap-1.5 = 6px) that folders have\n style={{ paddingLeft: depth * 12 + 18 }}\n onClick={handleClick}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n >\n {children}\n </li>\n );\n});\nTreeFile.displayName = 'Tree.File';\n","import * as React from 'react';\nimport { TreeFolderProvider, useTreeContext, useTreeDepth } from './tree-context';\nimport { Collapsible } from '@/ds/components/Collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderProps {\n id?: string;\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFolder = React.forwardRef<HTMLLIElement, TreeFolderProps>(\n ({ id, defaultOpen, open, onOpenChange, className, children }, ref) => {\n const treeCtx = useTreeContext();\n const depth = useTreeDepth();\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen ?? false);\n const [isFocused, setIsFocused] = React.useState(false);\n const isOpen = open ?? internalOpen;\n\n const handleOpenChange = React.useCallback(\n (nextOpen: boolean) => {\n setInternalOpen(nextOpen);\n onOpenChange?.(nextOpen);\n },\n [onOpenChange],\n );\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLLIElement>) => {\n if (e.target !== e.currentTarget) {\n setIsFocused(false);\n return;\n }\n\n setIsFocused(true);\n treeCtx?.focusItem?.(e.currentTarget, { focus: false });\n },\n [treeCtx],\n );\n\n const handleBlur = React.useCallback(() => {\n setIsFocused(false);\n }, []);\n\n const folderContextValue = React.useMemo(() => ({ isFocused, isOpen }), [isFocused, isOpen]);\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-expanded={isOpen}\n aria-level={depth + 1}\n data-tree-item-kind=\"folder\"\n data-tree-item-id={id}\n tabIndex={-1}\n className={cn('flex flex-col outline-hidden', className)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <TreeFolderProvider value={folderContextValue}>\n <Collapsible open={isOpen} onOpenChange={handleOpenChange}>\n {children}\n </Collapsible>\n </TreeFolderProvider>\n </li>\n );\n },\n);\nTreeFolder.displayName = 'Tree.Folder';\n","import * as React from 'react';\nimport { useTreeDepth, TreeDepthProvider } from './tree-context';\nimport { CollapsibleContent } from '@/ds/components/Collapsible';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderContentProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeFolderContent = React.forwardRef<HTMLDivElement, TreeFolderContentProps>(\n ({ className, children }, ref) => {\n const depth = useTreeDepth();\n\n return (\n <CollapsibleContent ref={ref} fill className={cn(className)}>\n <TreeDepthProvider depth={depth + 1}>\n <ul role=\"group\" className=\"flex flex-col\">\n {children}\n </ul>\n </TreeDepthProvider>\n </CollapsibleContent>\n );\n },\n);\nTreeFolderContent.displayName = 'Tree.FolderContent';\n","import * as React from 'react';\nimport { useTreeContext, useTreeDepth, useTreeFolderContext } from './tree-context';\nimport { CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { DisclosureChevron } from '@/ds/components/DisclosureChevron';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeFolderTriggerProps {\n className?: string;\n children: React.ReactNode;\n actions?: React.ReactNode;\n}\n\nexport const TreeFolderTrigger = React.forwardRef<HTMLDivElement, TreeFolderTriggerProps>(\n ({ className, children, actions }, ref) => {\n const treeCtx = useTreeContext();\n const folderCtx = useTreeFolderContext();\n const depth = useTreeDepth();\n\n const focusFolderItem = React.useCallback(\n (target: HTMLElement, options?: { focus?: boolean }) => {\n const item = target.closest<HTMLElement>('[data-tree-item-kind=\"folder\"]');\n if (item) {\n treeCtx?.focusItem?.(item, options);\n }\n },\n [treeCtx],\n );\n\n return (\n <div\n ref={ref}\n data-tree-folder-row=\"true\"\n className={cn(\n 'group flex h-7 w-full min-w-0 items-center rounded-sm hover:bg-fill-subtle',\n transitions.colors,\n folderCtx?.isFocused && 'bg-fill-hover text-foreground',\n className,\n )}\n >\n <CollapsibleTrigger\n data-tree-folder-trigger=\"true\"\n tabIndex={-1}\n className=\"flex h-7 min-w-0 flex-1 cursor-pointer items-center gap-1.5 rounded-sm px-1 outline-hidden focus-visible:outline-hidden\"\n style={{ paddingLeft: depth * 12 }}\n onMouseDown={e => {\n e.preventDefault();\n focusFolderItem(e.currentTarget);\n }}\n onFocus={e => {\n focusFolderItem(e.currentTarget, { focus: false });\n }}\n >\n <DisclosureChevron direction=\"right\" open={folderCtx?.isOpen} className=\"size-3 text-muted-foreground\" />\n {children}\n </CollapsibleTrigger>\n {actions && (\n <span className=\"shrink-0 pr-1\" onClick={e => e.stopPropagation()}>\n {actions}\n </span>\n )}\n </div>\n );\n },\n);\nTreeFolderTrigger.displayName = 'Tree.FolderTrigger';\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeIconProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeIcon = React.forwardRef<HTMLSpanElement, TreeIconProps>(({ className, children }, ref) => (\n <span ref={ref} className={cn('flex shrink-0 items-center [&>svg]:size-3.5', className)}>\n {children}\n </span>\n));\nTreeIcon.displayName = 'Tree.Icon';\n","import { File, Folder } from 'lucide-react';\nimport * as React from 'react';\nimport { useTreeDepth } from './tree-context';\nimport { passwordManagerOptOutProps } from '@/ds/primitives/password-manager-autofill';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeInputProps {\n type: 'file' | 'folder';\n onSubmit: (name: string) => void;\n onCancel?: () => void;\n defaultValue?: string;\n placeholder?: string;\n autoFocus?: boolean;\n className?: string;\n}\n\nexport const TreeInput = React.forwardRef<HTMLLIElement, TreeInputProps>(\n ({ type, onSubmit, onCancel, defaultValue = '', placeholder, autoFocus = true, className }, ref) => {\n const depth = useTreeDepth();\n const inputRef = React.useRef<HTMLInputElement>(null);\n const submittedRef = React.useRef(false);\n\n const handleSubmit = React.useCallback(\n (value: string) => {\n if (submittedRef.current) return;\n const trimmed = value.trim();\n if (trimmed) {\n submittedRef.current = true;\n onSubmit(trimmed);\n } else {\n onCancel?.();\n }\n },\n [onSubmit, onCancel],\n );\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleSubmit(e.currentTarget.value);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel?.();\n }\n },\n [handleSubmit, onCancel],\n );\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n handleSubmit(e.currentTarget.value);\n },\n [handleSubmit],\n );\n\n const handleFocus = React.useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n e.currentTarget.select();\n }, []);\n\n const Icon = type === 'folder' ? Folder : File;\n\n return (\n <li\n ref={ref}\n role=\"treeitem\"\n aria-level={depth + 1}\n data-tree-item-kind=\"input\"\n className={cn(\n 'group flex h-7 min-w-0 items-center gap-1.5 rounded-sm px-1',\n transitions.colors,\n 'focus-within:bg-fill-subtle focus-within:text-foreground focus-within:outline-hidden',\n className,\n )}\n style={{ paddingLeft: depth * 12 + 18 }}\n >\n <span className=\"flex shrink-0 items-center [&>svg]:size-3.5\">\n <Icon className=\"text-muted-foreground\" />\n </span>\n <input\n ref={inputRef}\n type=\"text\"\n defaultValue={defaultValue}\n placeholder={placeholder}\n autoFocus={autoFocus}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onFocus={handleFocus}\n {...passwordManagerOptOutProps}\n className=\"min-w-0 flex-1 border-none bg-transparent text-caption text-foreground outline-hidden placeholder:text-muted-foreground\"\n />\n </li>\n );\n },\n);\nTreeInput.displayName = 'Tree.Input';\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TreeLabelProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport const TreeLabel = React.forwardRef<HTMLSpanElement, TreeLabelProps>(({ className, children }, ref) => (\n <span ref={ref} className={cn('truncate text-foreground', className)}>\n {children}\n </span>\n));\nTreeLabel.displayName = 'Tree.Label';\n","import * as React from 'react';\nimport { TreeProvider, TreeDepthProvider } from './tree-context';\nimport { useIsomorphicLayoutEffect } from '@/hooks/use-isomorphic-layout-effect';\nimport { cn } from '@/lib/utils';\n\nconst TREE_FOCUSABLE_ITEM_SELECTOR = '[data-tree-item-kind=\"folder\"], [data-tree-item-kind=\"file\"]';\nconst TREE_FOLDER_TRIGGER_SELECTOR = '[data-tree-folder-trigger=\"true\"]';\n\nexport interface TreeRootProps {\n selectedId?: string;\n onSelect?: (id: string) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nfunction assignRef<T>(ref: React.ForwardedRef<T>, value: T | null) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n}\n\nfunction getTreeItems(root: HTMLElement): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR)).filter(\n item => item.getAttribute('role') === 'treeitem',\n );\n}\n\nfunction setTabStops(items: HTMLElement[], focusableItem: HTMLElement) {\n for (const item of items) {\n item.tabIndex = item === focusableItem ? 0 : -1;\n }\n}\n\nfunction syncTreeItemSetMetadata(root: HTMLElement) {\n const groups = [root, ...Array.from(root.querySelectorAll<HTMLElement>('[role=\"group\"]'))];\n\n for (const group of groups) {\n const items = Array.from(group.children).filter(\n (child): child is HTMLElement =>\n child instanceof HTMLElement &&\n child.getAttribute('role') === 'treeitem' &&\n child.hasAttribute('data-tree-item-kind'),\n );\n\n items.forEach((item, index) => {\n item.setAttribute('aria-posinset', String(index + 1));\n item.setAttribute('aria-setsize', String(items.length));\n });\n }\n}\n\nfunction findSelectedItem(items: HTMLElement[], selectedId: string | undefined): HTMLElement | null {\n if (!selectedId) return null;\n return items.find(item => item.dataset.treeItemId === selectedId) ?? null;\n}\n\nfunction getActiveTreeItem(root: HTMLElement, items: HTMLElement[]): HTMLElement | null {\n const activeElement = root.ownerDocument.activeElement;\n if (!(activeElement instanceof HTMLElement) || !root.contains(activeElement)) return null;\n\n const activeItem = activeElement.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR);\n return activeItem && items.includes(activeItem) ? activeItem : null;\n}\n\nfunction getClosestTreeItem(root: HTMLElement, target: EventTarget | null): HTMLElement | null {\n if (!(target instanceof HTMLElement) || !root.contains(target)) return null;\n const item = target.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR);\n return item?.getAttribute('role') === 'treeitem' ? item : null;\n}\n\nfunction focusTreeItem(root: HTMLElement, item: HTMLElement, options: { focus?: boolean } = {}) {\n const items = getTreeItems(root);\n if (!items.includes(item)) return;\n\n setTabStops(items, item);\n if (options.focus !== false) {\n item.focus();\n }\n}\n\nfunction syncTreeTabStops(root: HTMLElement, selectedId: string | undefined) {\n const items = getTreeItems(root);\n syncTreeItemSetMetadata(root);\n\n const firstItem = items[0];\n if (!firstItem) return;\n\n const activeItem = getActiveTreeItem(root, items);\n const selectedItem = findSelectedItem(items, selectedId);\n setTabStops(items, activeItem ?? selectedItem ?? firstItem);\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.dataset.treeFolderTrigger === 'true') return false;\n if (target.isContentEditable) return true;\n\n return !!target.closest('input, textarea, select, button, [contenteditable=\"true\"]');\n}\n\nfunction getFolderTrigger(item: HTMLElement): HTMLButtonElement | null {\n return item.querySelector<HTMLButtonElement>(TREE_FOLDER_TRIGGER_SELECTOR);\n}\n\nfunction getParentTreeItem(item: HTMLElement): HTMLElement | null {\n const parentGroup = item.parentElement?.closest('[role=\"group\"]');\n return parentGroup?.closest<HTMLElement>(TREE_FOCUSABLE_ITEM_SELECTOR) ?? null;\n}\n\nfunction activateTreeItem(item: HTMLElement) {\n const trigger = getFolderTrigger(item);\n if (trigger) {\n trigger.click();\n } else {\n item.click();\n }\n}\n\nexport const TreeRoot = React.forwardRef<HTMLUListElement, TreeRootProps>(\n ({ selectedId, onSelect, className, children }, ref) => {\n const rootRef = React.useRef<HTMLUListElement | null>(null);\n\n const handleRootRef = React.useCallback(\n (node: HTMLUListElement | null) => {\n rootRef.current = node;\n assignRef(ref, node);\n },\n [ref],\n );\n\n const focusItem = React.useCallback((item: HTMLElement, options?: { focus?: boolean }) => {\n const root = rootRef.current;\n if (!root) return;\n focusTreeItem(root, item, options);\n }, []);\n\n const handleKeyDown = React.useCallback((event: React.KeyboardEvent<HTMLUListElement>) => {\n if (event.defaultPrevented || isEditableTarget(event.target)) return;\n\n const root = rootRef.current;\n if (!root) return;\n\n const items = getTreeItems(root);\n const currentItem =\n getClosestTreeItem(root, event.target) ??\n getActiveTreeItem(root, items) ??\n items.find(item => item.tabIndex === 0);\n if (!currentItem) return;\n\n const currentIndex = items.indexOf(currentItem);\n if (currentIndex < 0) return;\n\n let nextItem: HTMLElement | null = null;\n let handled = true;\n\n switch (event.key) {\n case 'ArrowDown':\n nextItem = items[Math.min(currentIndex + 1, items.length - 1)] ?? null;\n break;\n case 'ArrowUp':\n nextItem = items[Math.max(currentIndex - 1, 0)] ?? null;\n break;\n case 'Home':\n nextItem = items[0] ?? null;\n break;\n case 'End':\n nextItem = items[items.length - 1] ?? null;\n break;\n case 'ArrowRight': {\n const trigger = getFolderTrigger(currentItem);\n if (trigger && currentItem.getAttribute('aria-expanded') !== 'true') {\n trigger.click();\n nextItem = currentItem;\n } else {\n nextItem = items[Math.min(currentIndex + 1, items.length - 1)] ?? null;\n }\n break;\n }\n case 'ArrowLeft': {\n const trigger = getFolderTrigger(currentItem);\n if (trigger && currentItem.getAttribute('aria-expanded') === 'true') {\n trigger.click();\n nextItem = currentItem;\n } else {\n nextItem = getParentTreeItem(currentItem);\n }\n break;\n }\n case 'Enter':\n case ' ':\n case 'Spacebar':\n activateTreeItem(currentItem);\n nextItem = currentItem;\n break;\n default:\n handled = false;\n }\n\n if (!handled) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (nextItem) {\n focusTreeItem(root, nextItem);\n }\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n syncTreeTabStops(root, selectedId);\n }, [children, selectedId]);\n\n React.useEffect(() => {\n const root = rootRef.current;\n if (!root || typeof MutationObserver === 'undefined') return;\n\n const observer = new MutationObserver(() => {\n syncTreeTabStops(root, selectedId);\n });\n observer.observe(root, { childList: true, subtree: true });\n\n return () => {\n observer.disconnect();\n };\n }, [selectedId]);\n\n const contextValue = React.useMemo(() => ({ selectedId, onSelect, focusItem }), [selectedId, onSelect, focusItem]);\n\n return (\n <TreeProvider value={contextValue}>\n <TreeDepthProvider depth={0}>\n <ul\n ref={handleRootRef}\n role=\"tree\"\n className={cn('flex flex-col text-caption', className)}\n onKeyDown={handleKeyDown}\n >\n {children}\n </ul>\n </TreeDepthProvider>\n </TreeProvider>\n );\n },\n);\nTreeRoot.displayName = 'Tree';\n","import { TreeFile } from './tree-file';\nimport { TreeFolder } from './tree-folder';\nimport { TreeFolderContent } from './tree-folder-content';\nimport { TreeFolderTrigger } from './tree-folder-trigger';\nimport { TreeIcon } from './tree-icon';\nimport { TreeInput } from './tree-input';\nimport { TreeLabel } from './tree-label';\nimport { TreeRoot } from './tree-root';\n\nexport const Tree = Object.assign(TreeRoot, {\n Folder: TreeFolder,\n FolderTrigger: TreeFolderTrigger,\n FolderContent: TreeFolderContent,\n File: TreeFile,\n Icon: TreeIcon,\n Label: TreeLabel,\n Input: TreeInput,\n});\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"combobox-parts-BeNqgCbj.cjs","names":["cn","buttonVariants","isIconButtonSize","controlTriggerOpenState","fieldTriggerErrorBorder","cva","menuItemClass","menuPopupClass","menuPositionerClass","menuSearchClasses","menuEmptyClass","menuItemCheckClass","BaseCombobox","cn","ChevronDown","isIconButtonSize","_Fragment","ButtonIcon","ButtonChevron","X","passwordManagerOptOutProps","Search","usePopupAnchor","usePortalContainer","FLOATING_POSITION_METHOD","ScrollArea","ScrollAreaViewport","Check","menuLabelClass","menuSeparatorClass","React"],"sources":["../src/ds/components/Combobox/combobox-styles.ts","../src/ds/components/Combobox/combobox-parts.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport { buttonVariants, isIconButtonSize } from '../Button/Button';\nimport type { ButtonSize } from '../Button/Button';\nimport { controlTriggerOpenState } from '@/ds/primitives/control-size';\nimport type { ControlTriggerVisualVariant } from '@/ds/primitives/control-size';\nimport { fieldTriggerErrorBorder, fieldTriggerStyle, fieldTriggerWidthStyle } from '@/ds/primitives/form-element';\nimport {\n menuItemCheckClass,\n menuItemClass,\n menuPopupClass,\n menuPositionerClass,\n menuSearchClasses,\n menuEmptyClass,\n} from '@/ds/primitives/menu-item';\nimport { cn } from '@/lib/utils';\n\n/**\n * A combobox is a form field, so it reuses the Button's size/shape recipe,\n * mirroring `SelectTrigger`: `default` (the Input's overlay surface — the\n * default here too) and `ghost` (borderless, for breadcrumbs/inline pickers). Only the high-emphasis `primary`\n * look is intentionally NOT offered (a field is not a call-to-action).\n */\nexport type ComboboxVisualVariant = ControlTriggerVisualVariant;\nexport type ComboboxLegacyVariant = 'link';\nexport type ComboboxVariant = ComboboxVisualVariant | ComboboxLegacyVariant;\n\nfunction normalizeComboboxVariant(variant: ComboboxVariant): ComboboxVisualVariant {\n return variant === 'link' ? 'ghost' : variant;\n}\n\n/**\n * Single source of truth for both the single- and multi-select combobox\n * triggers. A combobox = a button + a trailing chevron, so it reuses the Button\n * recipe (variant colors, size = height/text/padding/radius, unified border\n * focus, disabled) and layers only the combobox-specific extras — exactly like\n * `SelectTrigger`.\n */\nexport function comboboxTriggerClass({\n variant,\n size,\n className,\n}: {\n variant: ComboboxVariant;\n size: ButtonSize;\n className?: string;\n}): string {\n const visualVariant = normalizeComboboxVariant(variant);\n\n return cn(\n buttonVariants({ variant: visualVariant, size }),\n visualVariant === 'default' && fieldTriggerStyle,\n // Fill the field and push the value left / chevron right (Button's base\n // centers its content with `justify-center`). Icon sizes are a fixed square\n // showing only the chevron, so they keep Button's centering.\n !isIconButtonSize(size) && cn(fieldTriggerWidthStyle, 'justify-between'),\n // Read as \"active\" while the popup is open, per variant (see map above).\n controlTriggerOpenState[visualVariant],\n 'data-[placeholder]:text-muted-foreground',\n fieldTriggerErrorBorder,\n className,\n );\n}\n\n/** Options are shared menu items, which already grow to fit a second line. */\nexport const comboboxItemClass = cva(menuItemClass, {\n variants: {\n multiple: {\n false: '',\n true: '',\n },\n },\n defaultVariants: {\n multiple: false,\n },\n});\n\n/** Fixed popup widths a call site can pick; without one the popup takes the trigger's width. Never narrower than the trigger or wider than the screen. */\nexport type ComboboxPopupWidth = 'sm' | 'md' | 'lg' | 'xl';\n\nexport const comboboxPopupWidthClass: Record<ComboboxPopupWidth, string> = {\n sm: 'w-48',\n md: 'w-64',\n lg: 'w-80',\n xl: 'w-96',\n};\n\nexport const comboboxStyles = {\n /** @deprecated A `Field` lays out the combobox and its error. */\n root: 'flex flex-col gap-1.5',\n\n /** Chevron icon in trigger — decorative icon token shared by every field. */\n\n /** Placeholder text color */\n placeholder: 'text-muted-foreground',\n\n /**\n * Popup container — shared menu popup, but the search row sits edge-to-edge\n * above the list, so padding/scrolling move to the list itself.\n */\n popup: cn(menuPopupClass, 'max-h-none overflow-hidden p-0'),\n\n /** Positioner */\n positioner: cn(menuPositionerClass, 'pointer-events-auto'),\n\n /** Search input container — borderless top section, hairline divider below. */\n searchContainer: menuSearchClasses.container,\n\n /** Search icon */\n searchIcon: menuSearchClasses.icon,\n\n /** Search input */\n searchInput: cn(menuSearchClasses.input, 'disabled:cursor-not-allowed disabled:opacity-50'),\n\n /** Empty state */\n empty: cn(menuEmptyClass, 'empty:hidden'),\n\n /** Options list */\n // `empty:p-0` — Empty renders outside the List, so an empty List must not leave its padding behind.\n list: 'p-1 empty:p-0',\n\n /** Scroll container around the List. */\n listScroller: 'max-h-dropdown overflow-y-auto overflow-x-hidden',\n\n /** Option item base — rounded-lg sits concentrically inside rounded-xl + p-1. */\n item: comboboxItemClass({ multiple: false }),\n\n /** An item's content beside its check: start slot, text, end slot. */\n itemContent: 'flex min-w-0 flex-1 items-center gap-2',\n\n /** Multi-select item — same item rhythm with a right-aligned selected check. */\n itemMulti: comboboxItemClass({ multiple: true }),\n\n /** Right-aligned slot grouping end content + selection check. */\n itemRightSlot: 'ml-auto flex items-center gap-2 shrink-0',\n\n /** Check indicator container — inline, shown only when item is selected. */\n checkContainer: cn(menuItemCheckClass, 'ml-0'),\n\n /** Check icon (single select) */\n checkIcon: 'size-full',\n\n /** Option label/description wrapper */\n optionText: 'flex flex-col gap-0.5 min-w-0',\n\n /** Option label: wraps (ids break anywhere) and clamps at two lines, so a long label stays readable without growing the row. */\n optionLabel: 'line-clamp-2 whitespace-normal wrap-anywhere',\n\n /** Option description: same two-line clamp as the label. */\n optionDescription: 'text-caption text-muted-foreground line-clamp-2 whitespace-normal wrap-anywhere',\n\n /** Option end slot — `ml-auto` makes it push right inside flex containers (used by multi-select). */\n optionEnd: 'ml-auto flex items-center shrink-0',\n\n /** @deprecated A `FieldError` colors the error. */\n error: 'text-body-sm text-destructive-foreground',\n} as const;\n","// Composable Combobox parts: shadcn's structure and names (https://ui.shadcn.com/docs/components/combobox),\n// built on Base UI like theirs, styled with our design system. The root is `ComboboxRoot` because\n// `Combobox` is the options-driven component in combobox.tsx.\nimport { Combobox as BaseCombobox } from '@base-ui/react/combobox';\nimport { Check, ChevronDown, Search, X } from 'lucide-react';\nimport * as React from 'react';\nimport { comboboxItemClass, comboboxStyles, comboboxTriggerClass } from './combobox-styles';\nimport type { ComboboxVariant } from './combobox-styles';\nimport { ButtonChevron, ButtonIcon, isIconButtonSize } from '@/ds/components/Button/Button';\nimport type { ButtonSize, TextButtonSize } from '@/ds/components/Button/Button';\nimport { ScrollArea, ScrollAreaViewport } from '@/ds/components/ScrollArea';\nimport { FLOATING_POSITION_METHOD } from '@/ds/primitives/floating';\nimport { menuLabelClass, menuSeparatorClass } from '@/ds/primitives/menu-item';\nimport { passwordManagerOptOutProps } from '@/ds/primitives/password-manager-autofill';\nimport { usePopupAnchor } from '@/ds/primitives/popup-anchor';\nimport { usePortalContainer } from '@/ds/primitives/portal-container';\nimport type { PortalContainer } from '@/ds/primitives/portal-container';\nimport { cn } from '@/lib/utils';\n\n/**\n * Root. Same props as Base UI's `Combobox.Root` (`items`, `value`, `onValueChange`, `multiple`,\n * `autoHighlight`, `filter`, ...). Pick one of three shapes:\n * - Search in the field: `ComboboxInput` + `ComboboxContent`.\n * - Multiple, chips in the field: `ComboboxChips` (chips + `ComboboxChipsInput`) + `ComboboxContent`.\n * - Compact trigger, search in the popup: `ComboboxTrigger` + `ComboboxContent` starting with\n * `ComboboxSearch`. For small triggers (an icon, a ghost button in a toolbar).\n */\nfunction ComboboxRoot<Value, Multiple extends boolean | undefined = false>(\n props: BaseCombobox.Root.Props<Value, Multiple>,\n) {\n return <BaseCombobox.Root {...props} />;\n}\n\n/**\n * The field surface: today's trigger look, focus shown while the input inside has focus. The\n * chevron ends every field, at the same padding as today's Combobox trigger.\n */\nconst fieldClass = (size: TextButtonSize = 'md') =>\n cn(\n comboboxTriggerClass({ variant: 'default', size }),\n 'cursor-text gap-2 focus-within:[--surface-rim:var(--field-rim-focus)]',\n // Disabled like other form elements (muted text, not-allowed cursor), keyed off the input.\n 'has-[input:disabled]:cursor-not-allowed has-[input:disabled]:bg-field-disabled has-[input:disabled]:[&_*]:cursor-not-allowed has-[input:disabled]:[&_*]:text-muted-foreground',\n // The input inside carries `aria-invalid`; the field shows it like other invalid fields.\n 'has-[[aria-invalid=true]]:[--field-rim-focus:var(--destructive-indicator)] has-[[aria-invalid=true]]:[--field-rim:var(--destructive-indicator)]',\n );\n\n/**\n * Text starts 0.9em in (the Button recipe's padding, shared with Select and today's Combobox).\n * The chevron is a 22px circle; its arrow's ink sits 6.33px inside the circle's edge (3px circle\n * inset + 3.33px icon inset), so the end padding puts that ink 0.9em from the end, like the text.\n */\nconst fieldPx = '0.9em';\n\n/** Inline so it wins over the Button recipe's `px` (same layer, later in the sheet). */\nconst fieldStyle: React.CSSProperties = {\n paddingInlineStart: fieldPx,\n paddingInlineEnd: `calc(${fieldPx} - 6.33px)`,\n};\n\n/**\n * Chips sit 4px from the field's edge on top, bottom and left: 3px visible inside the 1px rim,\n * the same 3px as the gap between chips. A chip is the field height minus that padding (22px).\n */\nconst chipsFieldStyle: React.CSSProperties = {\n // Longhands only: a `padding` shorthand here would also reset the chevron's end padding.\n paddingBlock: '4px',\n paddingInlineStart: '4px',\n paddingInlineEnd: fieldStyle.paddingInlineEnd,\n};\n\n// `w-0` + `flex-1`: an input's default width (about 20 characters) would otherwise set the field's\n// minimum width, so it couldn't shrink into a narrow column.\nconst inputClass =\n 'h-full w-0 min-w-0 flex-1 bg-transparent text-foreground outline-none placeholder:text-muted-foreground';\n\n/** Caret at the end of the value instead of selecting it, the way a text field behaves. */\nfunction moveCaretToEnd(event: React.FocusEvent<HTMLInputElement>) {\n const input = event.currentTarget;\n // Deferred one frame so it runs after the click places the caret; clicking the label lands here too.\n requestAnimationFrame(() => input.setSelectionRange(input.value.length, input.value.length));\n}\n\n/**\n * The selected value, for a compact `ComboboxTrigger` or a custom display. `children` can be a\n * function of the value; `placeholder` shows while nothing is selected.\n */\nfunction ComboboxValue(props: BaseCombobox.Value.Props) {\n return <BaseCombobox.Value data-slot=\"combobox-value\" {...props} />;\n}\n\n/** The round chevron button that ends ComboboxInput and ComboboxChips. */\nfunction ComboboxFieldTrigger() {\n return (\n <BaseCombobox.Trigger\n data-slot=\"combobox-field-trigger\"\n aria-label=\"Show options\"\n // A round button target: the circle fills on hover, the chevron keeps its color.\n className=\"flex size-5.5 shrink-0 cursor-pointer items-center justify-center rounded-full text-muted-foreground not-data-disabled:hover:bg-fill\"\n >\n {/* Sized like Select's chevron: outside the icon rung, so it keeps Lucide's default stroke\n (1.33px at 16px) instead of the rung's 1px. */}\n <ChevronDown className=\"size-4\" />\n </BaseCombobox.Trigger>\n );\n}\n\ntype ComboboxTriggerProps = Omit<BaseCombobox.Trigger.Props, 'className'> & {\n className?: string;\n /** The Button-recipe look, like Select: `default` (field surface), `outline` or `ghost`. */\n variant?: ComboboxVariant;\n /** Icon sizes (`icon-*`) show only `icon` (or the chevron); `children` stay as accessible text. */\n size?: ButtonSize;\n /** Shown before the value, or alone at icon sizes (e.g. a filter icon), replacing the chevron there. */\n icon?: React.ReactNode;\n showChevron?: boolean;\n};\n\n/**\n * A compact trigger that opens the list, with the search inside the popup (`ComboboxSearch`). For\n * small triggers such as an icon or a ghost button; a form field uses ComboboxInput instead.\n * `children` is what the trigger shows, usually `<ComboboxValue placeholder=\"…\" />`.\n */\nfunction ComboboxTrigger({\n className,\n children,\n variant = 'default',\n size = 'md',\n icon,\n showChevron = !(icon && isIconButtonSize(size)),\n ...props\n}: ComboboxTriggerProps) {\n const iconOnly = isIconButtonSize(size);\n return (\n <BaseCombobox.Trigger\n data-slot=\"combobox-trigger\"\n data-shape={iconOnly ? 'icon' : undefined}\n className={comboboxTriggerClass({ variant, size, className })}\n {...props}\n >\n {isIconButtonSize(size) ? (\n <>\n {icon}\n <span className=\"sr-only\">{children}</span>\n </>\n ) : (\n <>\n {icon && <ButtonIcon size={size}>{icon}</ButtonIcon>}\n <span className=\"min-w-0 flex-1 truncate text-left\">{children}</span>\n </>\n )}\n {showChevron && <ButtonChevron size={size} />}\n </BaseCombobox.Trigger>\n );\n}\n\n/** An × that clears the value. ComboboxInput renders it with `showClear`. */\nfunction ComboboxClear({ className, ...props }: BaseCombobox.Clear.Props) {\n return (\n <BaseCombobox.Clear\n data-slot=\"combobox-clear\"\n aria-label=\"Clear\"\n className={cn(\n 'flex size-4 shrink-0 items-center justify-center rounded-full text-muted-foreground hover:text-foreground',\n className,\n )}\n {...props}\n >\n <X className=\"size-3.5\" />\n </BaseCombobox.Clear>\n );\n}\n\ntype ComboboxInputProps = Omit<BaseCombobox.Input.Props, 'size'> & {\n /** The field height, from the control sizes. `md` by default. */\n size?: TextButtonSize;\n /** Shown before the text, e.g. the selected item's icon. */\n start?: React.ReactNode;\n /** The chevron button at the end. On by default. */\n showTrigger?: boolean;\n /** An × before the chevron that clears the value. */\n showClear?: boolean;\n};\n\n/**\n * The field you type in to filter, showing the selected value while it's closed. `children` render\n * inside the field before the chevron (e.g. a muted \"4 items\" detail). The list opens at the\n * field's width. Inside a `Field`, the label and errors link to it.\n */\nfunction ComboboxInput({\n className,\n children,\n showTrigger = true,\n showClear = false,\n size,\n start,\n onFocus,\n ...props\n}: ComboboxInputProps) {\n return (\n <BaseCombobox.InputGroup data-slot=\"combobox-input\" className={cn(fieldClass(size), className)} style={fieldStyle}>\n {start ? <span className=\"flex shrink-0 items-center\">{start}</span> : null}\n <BaseCombobox.Input\n onFocus={event => {\n moveCaretToEnd(event);\n onFocus?.(event);\n }}\n className={inputClass}\n {...passwordManagerOptOutProps}\n {...props}\n />\n {children ? <span className=\"flex shrink-0 items-center gap-2 text-muted-foreground\">{children}</span> : null}\n {showClear ? <ComboboxClear /> : null}\n {showTrigger ? <ComboboxFieldTrigger /> : null}\n </BaseCombobox.InputGroup>\n );\n}\n\n/**\n * The search row at the top of the popup, for a compact `ComboboxTrigger`. The same row as today's\n * Combobox: a search icon, a borderless input and a hairline under it.\n */\nfunction ComboboxSearch({ className, ...props }: BaseCombobox.Input.Props) {\n return (\n <div data-slot=\"combobox-search\" className={comboboxStyles.searchContainer}>\n <Search className={comboboxStyles.searchIcon} />\n <BaseCombobox.Input\n className={cn(comboboxStyles.searchInput, className)}\n {...passwordManagerOptOutProps}\n {...props}\n />\n </div>\n );\n}\n\ntype ComboboxContentProps = BaseCombobox.Popup.Props &\n Pick<BaseCombobox.Positioner.Props, 'side' | 'align' | 'sideOffset' | 'alignOffset' | 'anchor'> & {\n /** Where the popup portals to. Defaults to the nearest dialog or drawer, so it stays interactive there. */\n container?: PortalContainer;\n };\n\n/**\n * The popup. Under a field (ComboboxInput or ComboboxChips) it opens at the field's width; under a\n * compact ComboboxTrigger it takes the trigger's width, at least 11rem. Either way the width never\n * follows the filtered items, so it holds still while you type. (`Combobox`'s `popupWidth` picks a\n * fixed, wider width for long options instead.)\n */\nfunction ComboboxContent({\n className,\n side = 'bottom',\n sideOffset = 4,\n align = 'start',\n alignOffset = 0,\n anchor,\n container,\n ...props\n}: ComboboxContentProps) {\n const popupAnchor = usePopupAnchor();\n const resolvedContainer = usePortalContainer(container);\n return (\n <BaseCombobox.Portal container={resolvedContainer}>\n <BaseCombobox.Positioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n // Base UI anchors to the field (the InputGroup of ComboboxInput or ComboboxChips), or to the\n // trigger when the input is in the popup; a crumb switcher anchors to the whole crumb.\n anchor={anchor ?? popupAnchor}\n positionMethod={FLOATING_POSITION_METHOD}\n className={comboboxStyles.positioner}\n >\n <BaseCombobox.Popup\n data-slot=\"combobox-content\"\n // With the popup's `min-w-[max(11rem,var(--anchor-width))]`: the anchor's width, at least 11rem.\n className={cn(comboboxStyles.popup, 'w-(--anchor-width)', className)}\n {...props}\n />\n </BaseCombobox.Positioner>\n </BaseCombobox.Portal>\n );\n}\n\n/** The scrolling list. Children: a render function per item (or per group), like Base UI's List. */\nfunction ComboboxList({ className, ...props }: BaseCombobox.List.Props) {\n return (\n <ScrollArea maxHeight=\"var(--spacing-dropdown)\">\n <ScrollAreaViewport className=\"scroll-py-8\">\n <BaseCombobox.List data-slot=\"combobox-list\" className={cn(comboboxStyles.list, className)} {...props} />\n </ScrollAreaViewport>\n </ScrollArea>\n );\n}\n\n/** One option. A check shows on the right while it's selected. */\nfunction ComboboxItem({ className, children, ref, ...props }: BaseCombobox.Item.Props) {\n return (\n <BaseCombobox.Item ref={ref} data-slot=\"combobox-item\" className={cn(comboboxItemClass({}), className)} {...props}>\n <span className={comboboxStyles.itemContent}>{children}</span>\n <span className={comboboxStyles.checkContainer}>\n <BaseCombobox.ItemIndicator>\n <Check className={comboboxStyles.checkIcon} />\n </BaseCombobox.ItemIndicator>\n </span>\n </BaseCombobox.Item>\n );\n}\n\n/** Title over a description inside an item (shadcn's Item / ItemTitle / ItemDescription). */\nfunction ComboboxItemContent({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span data-slot=\"combobox-item-content\" className={cn('flex min-w-0 flex-col gap-0.5', className)} {...props} />\n );\n}\n\nfunction ComboboxItemTitle({ className, ...props }: React.ComponentProps<'span'>) {\n return <span data-slot=\"combobox-item-title\" className={cn('truncate', className)} {...props} />;\n}\n\n/** Muted, up to two lines. */\nfunction ComboboxItemDescription({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"combobox-item-description\"\n // `whitespace-normal`: the item recipe's `[&>span]:truncate` makes its content `nowrap`, which\n // would cut the description off mid-word on one line instead of clamping it at two.\n className={cn('line-clamp-2 text-caption whitespace-normal text-muted-foreground', className)}\n {...props}\n />\n );\n}\n\n/** Muted text at the end of an item, e.g. its kind (\"Agent\"). */\nfunction ComboboxItemEnd({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"combobox-item-end\"\n className={cn('ml-auto shrink-0 text-caption text-muted-foreground', className)}\n {...props}\n />\n );\n}\n\n/** A section of items. Pass the section's `items`; render them with ComboboxCollection. */\nfunction ComboboxGroup(props: BaseCombobox.Group.Props) {\n return <BaseCombobox.Group data-slot=\"combobox-group\" {...props} />;\n}\n\n/** A group's heading, styled like menu section labels. */\nfunction ComboboxLabel({ className, ...props }: BaseCombobox.GroupLabel.Props) {\n return <BaseCombobox.GroupLabel data-slot=\"combobox-label\" className={cn(menuLabelClass, className)} {...props} />;\n}\n\n/** Renders a group's filtered items, one render function call per item. */\nfunction ComboboxCollection(props: BaseCombobox.Collection.Props) {\n return <BaseCombobox.Collection data-slot=\"combobox-collection\" {...props} />;\n}\n\n/** Shows its children only when the filter matches nothing. */\nfunction ComboboxEmpty({ className, ...props }: BaseCombobox.Empty.Props) {\n return <BaseCombobox.Empty data-slot=\"combobox-empty\" className={cn(comboboxStyles.empty, className)} {...props} />;\n}\n\nfunction ComboboxSeparator({ className, ...props }: BaseCombobox.Separator.Props) {\n return (\n <BaseCombobox.Separator data-slot=\"combobox-separator\" className={cn(menuSeparatorClass, className)} {...props} />\n );\n}\n\n/**\n * Multi-select field: chips for the picked items, then ComboboxChipsInput. The chips and input wrap\n * inside their own area so the chevron keeps its place on the first row. While the field is one\n * line it keeps the pill shape of every other field; once chips wrap it takes the Textarea corner.\n */\nfunction ComboboxChips({ className, children, 'aria-label': ariaLabel, ...props }: BaseCombobox.InputGroup.Props) {\n // On the inner chips area, so a caller's `ref` reaches the field without merging refs.\n const chipsRef = React.useRef<HTMLDivElement>(null);\n const [multiline, setMultiline] = React.useState(false);\n\n React.useLayoutEffect(() => {\n const field = chipsRef.current?.parentElement;\n // No observer (e.g. jsdom in tests): the field keeps its one-row shape.\n if (!field || typeof ResizeObserver === 'undefined') return;\n // One row is the control height (the field's `min-height`); anything taller means the chips wrapped.\n // The 1px slack absorbs subpixel rounding.\n const rowHeight = parseFloat(getComputedStyle(field).minHeight) || 0;\n const observer = new ResizeObserver(() => setMultiline(field.offsetHeight > rowHeight + 1));\n observer.observe(field);\n return () => observer.disconnect();\n }, []);\n\n // Chips inside an InputGroup, like Base UI's multi-select example: the popup anchors to the group.\n return (\n <BaseCombobox.InputGroup\n data-slot=\"combobox-chips\"\n data-multiline={multiline ? '' : undefined}\n style={chipsFieldStyle}\n className={cn(\n fieldClass(),\n 'h-auto min-h-control-md items-start data-multiline:rounded-xl',\n // The chips field keeps its resting look: no open tint, no placeholder color. InputGroup sets those\n // attributes, which the trigger recipe styles.\n 'data-[placeholder]:text-foreground data-[popup-open]:[--surface-tint:transparent]',\n className,\n )}\n {...props}\n >\n {/* The label names the chips toolbar, as it did when Chips was the outer element. */}\n <BaseCombobox.Chips ref={chipsRef} aria-label={ariaLabel} className=\"flex min-w-0 flex-1 flex-wrap gap-[3px]\">\n {children}\n </BaseCombobox.Chips>\n {/* Same height as a chip, so the chevron centers on the first row. */}\n <span className=\"flex h-5.5 shrink-0 items-center\">\n <ComboboxFieldTrigger />\n </span>\n </BaseCombobox.InputGroup>\n );\n}\n\n/** One picked item inside ComboboxChips. The × (or Backspace in the input) removes it. */\nfunction ComboboxChip({\n className,\n children,\n showRemove = true,\n ...props\n}: BaseCombobox.Chip.Props & { showRemove?: boolean }) {\n return (\n <BaseCombobox.Chip\n data-slot=\"combobox-chip\"\n className={cn(\n // 8px from the left edge to the text, 6px from the text to the ×'s ink, 8px from the ink to\n // the right edge. Text in the controls' role (`text-label`), like the field value.\n 'flex h-5.5 items-center rounded-full bg-fill pl-2 text-label text-foreground',\n !showRemove && 'pr-2',\n className,\n )}\n {...props}\n >\n {children}\n {showRemove ? (\n <BaseCombobox.ChipRemove\n data-slot=\"combobox-chip-remove\"\n aria-label={typeof children === 'string' ? `Remove ${children}` : 'Remove'}\n // The whole right end is the hit area: full height, from the gap to the chip's edge. The ×'s\n // ink sits 2.5px inside its 12px icon, so 3.5px / 5.5px padding put it 6px / 8px out.\n className=\"flex h-full cursor-pointer items-center rounded-r-full pr-[5.5px] pl-[3.5px] text-muted-foreground not-data-disabled:hover:text-foreground\"\n >\n {/* Inline so the button's color wins over the field's `[&_svg]` icon colors. */}\n <X className=\"size-3\" style={{ color: 'inherit' }} />\n </BaseCombobox.ChipRemove>\n ) : null}\n </BaseCombobox.Chip>\n );\n}\n\n/** The text input after the chips in ComboboxChips. */\nfunction ComboboxChipsInput({ className, onFocus, ...props }: BaseCombobox.Input.Props) {\n return (\n <BaseCombobox.Input\n data-slot=\"combobox-chip-input\"\n onFocus={event => {\n moveCaretToEnd(event);\n onFocus?.(event);\n }}\n className={cn(\n inputClass,\n // Text lines up with other fields' text when there are no chips; 4px after a chip otherwise.\n // Not `first:`: Base UI inserts a hidden Dismiss element before the input while open.\n 'h-5.5 w-0 min-w-12 flex-1 pl-[calc(0.9em_-_4px)] [[data-slot=combobox-chip]~&]:pl-1',\n className,\n )}\n {...passwordManagerOptOutProps}\n {...props}\n />\n );\n}\n\nexport type { ComboboxTriggerProps, ComboboxInputProps, ComboboxContentProps };\n\nexport {\n ComboboxRoot,\n ComboboxInput,\n ComboboxTrigger,\n ComboboxSearch,\n ComboboxValue,\n ComboboxClear,\n ComboboxContent,\n ComboboxList,\n ComboboxItem,\n ComboboxItemContent,\n ComboboxItemTitle,\n ComboboxItemDescription,\n ComboboxItemEnd,\n ComboboxGroup,\n ComboboxLabel,\n ComboboxCollection,\n ComboboxEmpty,\n ComboboxSeparator,\n ComboboxChips,\n ComboboxChip,\n ComboboxChipsInput,\n};\n"],"mappings":"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"}