@mastra/playground-ui 65.0.0-alpha.9 → 65.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/dist/{ask-user-card-DnvW7jXS.js → ask-user-card-B9q_GFTt.js} +2 -2
  2. package/dist/{ask-user-card-DnvW7jXS.js.map → ask-user-card-B9q_GFTt.js.map} +1 -1
  3. package/dist/{ask-user-card-DiFQcUzM.cjs → ask-user-card-C-N5rpYG.cjs} +2 -2
  4. package/dist/{ask-user-card-DiFQcUzM.cjs.map → ask-user-card-C-N5rpYG.cjs.map} +1 -1
  5. package/dist/components/Button.cjs.js +1 -1
  6. package/dist/components/Button.es.js +1 -1
  7. package/dist/components/CommandPalette.cjs.js +1 -1
  8. package/dist/components/CommandPalette.es.js +1 -1
  9. package/dist/components/Comment.cjs.js +1 -1
  10. package/dist/components/Comment.es.js +1 -1
  11. package/dist/components/DataCodeSection.cjs.js +1 -1
  12. package/dist/components/DataCodeSection.es.js +1 -1
  13. package/dist/components/DataList.cjs.js +15 -17
  14. package/dist/components/DataList.cjs.js.map +1 -1
  15. package/dist/components/DataList.es.js +4 -5
  16. package/dist/components/DataList.es.js.map +1 -1
  17. package/dist/components/DataPanel.cjs.js +1 -1
  18. package/dist/components/DataPanel.es.js +1 -1
  19. package/dist/components/DateTimePicker.cjs.js +1 -1
  20. package/dist/components/DateTimePicker.es.js +1 -1
  21. package/dist/components/DateTimeRangePicker.cjs.js +1 -1
  22. package/dist/components/DateTimeRangePicker.es.js +1 -1
  23. package/dist/components/EnvironmentVariablesEditor.cjs.js +2 -2
  24. package/dist/components/EnvironmentVariablesEditor.es.js +2 -2
  25. package/dist/components/Field.cjs.js +1 -1
  26. package/dist/components/Field.es.js +1 -1
  27. package/dist/components/FilterBar.cjs.js +2 -2
  28. package/dist/components/FilterBar.es.js +2 -2
  29. package/dist/components/JSONSchemaForm.cjs.js +1 -1
  30. package/dist/components/JSONSchemaForm.es.js +1 -1
  31. package/dist/components/Kbd.cjs.js +1 -1
  32. package/dist/components/Kbd.es.js +1 -1
  33. package/dist/components/ListSearch.cjs.js +1 -1
  34. package/dist/components/ListSearch.es.js +1 -1
  35. package/dist/components/LogsDataList.cjs.js +5 -2
  36. package/dist/components/LogsDataList.cjs.js.map +1 -1
  37. package/dist/components/LogsDataList.es.js +5 -2
  38. package/dist/components/LogsDataList.es.js.map +1 -1
  39. package/dist/components/PropertyFilter.cjs.js +1 -1
  40. package/dist/components/PropertyFilter.es.js +1 -1
  41. package/dist/components/SavedViews.cjs.js +1 -1
  42. package/dist/components/SavedViews.es.js +1 -1
  43. package/dist/components/SearchInput.cjs.js +1 -1
  44. package/dist/components/SearchInput.es.js +1 -1
  45. package/dist/components/Section.cjs.js +1 -1
  46. package/dist/components/Section.es.js +1 -1
  47. package/dist/components/SideDialog.cjs.js +225 -2
  48. package/dist/components/SideDialog.cjs.js.map +1 -1
  49. package/dist/components/SideDialog.es.js +210 -1
  50. package/dist/components/SideDialog.es.js.map +1 -1
  51. package/dist/components/Sidebar.cjs.js +63 -59
  52. package/dist/components/Sidebar.cjs.js.map +1 -1
  53. package/dist/components/Sidebar.es.js +64 -61
  54. package/dist/components/Sidebar.es.js.map +1 -1
  55. package/dist/components/ai/activity.cjs.js +1 -1
  56. package/dist/components/ai/activity.es.js +1 -1
  57. package/dist/components/ai/ask-user.cjs.js +1 -1
  58. package/dist/components/ai/ask-user.es.js +1 -1
  59. package/dist/{data-code-section-BjyHoHEB.cjs → data-code-section-BsvdKW08.cjs} +2 -2
  60. package/dist/{data-code-section-BjyHoHEB.cjs.map → data-code-section-BsvdKW08.cjs.map} +1 -1
  61. package/dist/{data-code-section-BWzfg-1n.js → data-code-section-y1BMLr3c.js} +2 -2
  62. package/dist/{data-code-section-BWzfg-1n.js.map → data-code-section-y1BMLr3c.js.map} +1 -1
  63. package/dist/{data-list-top-DJh08vFA.cjs → data-list-4t6Ueon8.cjs} +365 -16
  64. package/dist/data-list-4t6Ueon8.cjs.map +1 -0
  65. package/dist/{data-list-top-Cu4C2Z07.js → data-list-BQMBFAyK.js} +357 -7
  66. package/dist/data-list-BQMBFAyK.js.map +1 -0
  67. package/dist/{data-list-skeleton-sdcaabdX.cjs → data-list-skeleton-CVXZYY0k.cjs} +6 -6
  68. package/dist/{data-list-skeleton-sdcaabdX.cjs.map → data-list-skeleton-CVXZYY0k.cjs.map} +1 -1
  69. package/dist/{data-list-skeleton-CiilOVAl.js → data-list-skeleton-D54r1ycU.js} +2 -2
  70. package/dist/{data-list-skeleton-CiilOVAl.js.map → data-list-skeleton-D54r1ycU.js.map} +1 -1
  71. package/dist/{data-panel-CUqcB4Vn.js → data-panel-DSgidnnv.js} +2 -2
  72. package/dist/{data-panel-CUqcB4Vn.js.map → data-panel-DSgidnnv.js.map} +1 -1
  73. package/dist/{data-panel-CGRPVnEe.cjs → data-panel-xqrai98b.cjs} +2 -2
  74. package/dist/{data-panel-CGRPVnEe.cjs.map → data-panel-xqrai98b.cjs.map} +1 -1
  75. package/dist/{date-time-range-picker-BB6ivHR-.js → date-time-range-picker-BnYWCqei.js} +2 -2
  76. package/dist/{date-time-range-picker-BB6ivHR-.js.map → date-time-range-picker-BnYWCqei.js.map} +1 -1
  77. package/dist/{date-time-range-picker-ExPgeHV_.cjs → date-time-range-picker-_2RJBOUn.cjs} +2 -2
  78. package/dist/{date-time-range-picker-ExPgeHV_.cjs.map → date-time-range-picker-_2RJBOUn.cjs.map} +1 -1
  79. package/dist/domains/capabilities.cjs.js +4 -0
  80. package/dist/domains/capabilities.cjs.js.map +1 -1
  81. package/dist/domains/capabilities.es.js +1 -1
  82. package/dist/domains/chat/messages/dataset-save-action.cjs.js +1 -1
  83. package/dist/domains/chat/messages/dataset-save-action.es.js +1 -1
  84. package/dist/domains/chat/messages/notification-signal-notice.cjs.js +23 -3
  85. package/dist/domains/chat/messages/notification-signal-notice.cjs.js.map +1 -1
  86. package/dist/domains/chat/messages/notification-signal-notice.es.js +24 -6
  87. package/dist/domains/chat/messages/notification-signal-notice.es.js.map +1 -1
  88. package/dist/domains/chat/messages/signal-data.cjs.js +12 -0
  89. package/dist/domains/chat/messages/signal-data.cjs.js.map +1 -1
  90. package/dist/domains/chat/messages/signal-data.es.js +12 -1
  91. package/dist/domains/chat/messages/signal-data.es.js.map +1 -1
  92. package/dist/domains/chat/tools/badges/ask-user-badge.cjs.js +1 -1
  93. package/dist/domains/chat/tools/badges/ask-user-badge.es.js +1 -1
  94. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +3 -0
  95. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js.map +1 -1
  96. package/dist/domains/chat/tools/badges/workflow-badge.es.js +3 -0
  97. package/dist/domains/chat/tools/badges/workflow-badge.es.js.map +1 -1
  98. package/dist/domains/chat.cjs.js +1 -0
  99. package/dist/domains/chat.cjs.js.map +1 -1
  100. package/dist/domains/chat.es.js +1 -1
  101. package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.cjs.js +24 -16
  102. package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.cjs.js.map +1 -1
  103. package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.es.js +24 -16
  104. package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.es.js.map +1 -1
  105. package/dist/domains/datasets/components/add-dataset-item-dialog/build-add-item-payload.cjs.js +7 -8
  106. package/dist/domains/datasets/components/add-dataset-item-dialog/build-add-item-payload.cjs.js.map +1 -1
  107. package/dist/domains/datasets/components/add-dataset-item-dialog/build-add-item-payload.es.js +7 -8
  108. package/dist/domains/datasets/components/add-dataset-item-dialog/build-add-item-payload.es.js.map +1 -1
  109. package/dist/domains/datasets/components/add-dataset-item-dialog/collapsible-settings-row.cjs.js +1 -1
  110. package/dist/domains/datasets/components/add-dataset-item-dialog/collapsible-settings-row.es.js +1 -1
  111. package/dist/domains/datasets/components/add-dataset-item-dialog/dataset-field-errors.cjs.js +1 -1
  112. package/dist/domains/datasets/components/add-dataset-item-dialog/dataset-field-errors.es.js +1 -1
  113. package/dist/domains/datasets/components/add-dataset-item-dialog/dataset-picker.cjs.js +1 -1
  114. package/dist/domains/datasets/components/add-dataset-item-dialog/dataset-picker.es.js +1 -1
  115. package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js +2 -2
  116. package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js +2 -2
  117. package/dist/domains/logs/components/log-data-panel.cjs.js +1 -1
  118. package/dist/domains/logs/components/log-data-panel.es.js +1 -1
  119. package/dist/domains/logs/components/logs-list-view.cjs.js +3 -2
  120. package/dist/domains/logs/components/logs-list-view.cjs.js.map +1 -1
  121. package/dist/domains/logs/components/logs-list-view.es.js +3 -2
  122. package/dist/domains/logs/components/logs-list-view.es.js.map +1 -1
  123. package/dist/domains/memory/components/observation-detail-view.cjs.js +1 -1
  124. package/dist/domains/memory/components/observation-detail-view.es.js +1 -1
  125. package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
  126. package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
  127. package/dist/domains/observability/components/trace-as-item-dialog.cjs.js +14 -2
  128. package/dist/domains/observability/components/trace-as-item-dialog.cjs.js.map +1 -1
  129. package/dist/domains/observability/components/trace-as-item-dialog.es.js +14 -2
  130. package/dist/domains/observability/components/trace-as-item-dialog.es.js.map +1 -1
  131. package/dist/domains/scores/components/score-data-panel.cjs.js +1 -1
  132. package/dist/domains/scores/components/score-data-panel.es.js +1 -1
  133. package/dist/domains/scores/components/trace-scores-tab.cjs.js +2 -1
  134. package/dist/domains/scores/components/trace-scores-tab.cjs.js.map +1 -1
  135. package/dist/domains/scores/components/trace-scores-tab.es.js +2 -1
  136. package/dist/domains/scores/components/trace-scores-tab.es.js.map +1 -1
  137. package/dist/domains/traces/components/span-data-panel-view.cjs.js +1 -1
  138. package/dist/domains/traces/components/span-data-panel-view.es.js +1 -1
  139. package/dist/domains/traces/components/span-summary-description.cjs.js +1 -1
  140. package/dist/domains/traces/components/span-summary-description.es.js +1 -1
  141. package/dist/domains/traces/components/thread-trace/thread-trace-details.cjs.js +1 -1
  142. package/dist/domains/traces/components/thread-trace/thread-trace-details.es.js +1 -1
  143. package/dist/domains/traces/components/trace-columns-menu.cjs.js +1 -1
  144. package/dist/domains/traces/components/trace-columns-menu.es.js +1 -1
  145. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +3 -8
  146. package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
  147. package/dist/domains/traces/components/trace-data-panel-view.es.js +4 -9
  148. package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
  149. package/dist/domains/traces/components/trace-data-panel.cjs.js +2 -0
  150. package/dist/domains/traces/components/trace-data-panel.cjs.js.map +1 -1
  151. package/dist/domains/traces/components/trace-data-panel.es.js +2 -0
  152. package/dist/domains/traces/components/trace-data-panel.es.js.map +1 -1
  153. package/dist/domains/traces/components/trace-error-cell.cjs.js +3 -1
  154. package/dist/domains/traces/components/trace-error-cell.cjs.js.map +1 -1
  155. package/dist/domains/traces/components/trace-error-cell.es.js +3 -1
  156. package/dist/domains/traces/components/trace-error-cell.es.js.map +1 -1
  157. package/dist/domains/traces/components/trace-id-button.cjs.js +1 -1
  158. package/dist/domains/traces/components/trace-id-button.es.js +1 -1
  159. package/dist/domains/traces/components/trace-span-panel.cjs.js +0 -2
  160. package/dist/domains/traces/components/trace-span-panel.cjs.js.map +1 -1
  161. package/dist/domains/traces/components/trace-span-panel.es.js +0 -2
  162. package/dist/domains/traces/components/trace-span-panel.es.js.map +1 -1
  163. package/dist/domains/traces/components/trace-summary-description.cjs.js +1 -1
  164. package/dist/domains/traces/components/trace-summary-description.es.js +1 -1
  165. package/dist/domains/traces/components/trace-thread-panel.cjs.js +1 -1
  166. package/dist/domains/traces/components/trace-thread-panel.es.js +1 -1
  167. package/dist/domains/traces/components/trace-time-range-chip.cjs.js +2 -2
  168. package/dist/domains/traces/components/trace-time-range-chip.es.js +2 -2
  169. package/dist/domains/traces/components/traces-explorer/traces-explorer-auto-refresh.cjs.js +1 -1
  170. package/dist/domains/traces/components/traces-explorer/traces-explorer-auto-refresh.es.js +1 -1
  171. package/dist/domains/traces/components/traces-explorer/traces-explorer-context.cjs.js.map +1 -1
  172. package/dist/domains/traces/components/traces-explorer/traces-explorer-context.es.js.map +1 -1
  173. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js +2 -2
  174. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +2 -2
  175. package/dist/domains/traces/components/traces-explorer/traces-explorer-list-provider.cjs.js +2 -1
  176. package/dist/domains/traces/components/traces-explorer/traces-explorer-list-provider.cjs.js.map +1 -1
  177. package/dist/domains/traces/components/traces-explorer/traces-explorer-list-provider.es.js +2 -1
  178. package/dist/domains/traces/components/traces-explorer/traces-explorer-list-provider.es.js.map +1 -1
  179. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.cjs.js +4 -15
  180. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.cjs.js.map +1 -1
  181. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.es.js +4 -15
  182. package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.es.js.map +1 -1
  183. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.cjs.js +3 -0
  184. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.cjs.js.map +1 -1
  185. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.es.js +4 -1
  186. package/dist/domains/traces/components/traces-explorer/traces-explorer-root.es.js.map +1 -1
  187. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.cjs.js +1 -1
  188. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js +1 -1
  189. package/dist/domains/traces/components/traces-list-view.cjs.js +4 -5
  190. package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
  191. package/dist/domains/traces/components/traces-list-view.es.js +3 -4
  192. package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
  193. package/dist/domains/traces/components/traces-page-skeleton.cjs.js +4 -1
  194. package/dist/domains/traces/components/traces-page-skeleton.cjs.js.map +1 -1
  195. package/dist/domains/traces/components/traces-page-skeleton.es.js +4 -1
  196. package/dist/domains/traces/components/traces-page-skeleton.es.js.map +1 -1
  197. package/dist/domains/traces/hooks/use-traces-list-source.cjs.js +36 -9
  198. package/dist/domains/traces/hooks/use-traces-list-source.cjs.js.map +1 -1
  199. package/dist/domains/traces/hooks/use-traces-list-source.es.js +37 -12
  200. package/dist/domains/traces/hooks/use-traces-list-source.es.js.map +1 -1
  201. package/dist/domains/workflows/components/workflows-list/workflows-list.cjs.js +2 -2
  202. package/dist/domains/workflows/components/workflows-list/workflows-list.es.js +2 -2
  203. package/dist/domains/workflows/workflow/input/workflow-json-input.cjs.js +1 -1
  204. package/dist/domains/workflows/workflow/input/workflow-json-input.es.js +1 -1
  205. package/dist/domains/workflows/workflow/input/workflow-processor-input.cjs.js +1 -1
  206. package/dist/domains/workflows/workflow/input/workflow-processor-input.es.js +1 -1
  207. package/dist/domains/workflows/workflow/workflow-debug-mode-switch.cjs.js +1 -1
  208. package/dist/domains/workflows/workflow/workflow-debug-mode-switch.es.js +1 -1
  209. package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js +1 -1
  210. package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js +1 -1
  211. package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js +2 -2
  212. package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +2 -2
  213. package/dist/ee/signals/components/entity-index-list.cjs.js +3 -1
  214. package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
  215. package/dist/ee/signals/components/entity-index-list.es.js +3 -1
  216. package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
  217. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +4 -2
  218. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js.map +1 -1
  219. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +4 -2
  220. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js.map +1 -1
  221. package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +1 -1
  222. package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +1 -1
  223. package/dist/ee/signals/trace-intelligence-explainer.cjs.js +1 -0
  224. package/dist/ee/signals/trace-intelligence-explainer.cjs.js.map +1 -1
  225. package/dist/ee/signals/trace-intelligence-explainer.es.js +1 -0
  226. package/dist/ee/signals/trace-intelligence-explainer.es.js.map +1 -1
  227. package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +2 -2
  228. package/dist/ee/topics/components/topic-trace-summary-list.es.js +2 -2
  229. package/dist/{field-BCU5ZtWV.cjs → field-CZ5fldpM.cjs} +2 -1
  230. package/dist/{field-BCU5ZtWV.cjs.map → field-CZ5fldpM.cjs.map} +1 -1
  231. package/dist/{field-Dl1zeXTv.js → field-CfA5-ixH.js} +2 -1
  232. package/dist/{field-Dl1zeXTv.js.map → field-CfA5-ixH.js.map} +1 -1
  233. package/dist/{filter-bar-C6NdZctn.cjs → filter-bar-CjBb01b6.cjs} +3 -3
  234. package/dist/{filter-bar-C6NdZctn.cjs.map → filter-bar-CjBb01b6.cjs.map} +1 -1
  235. package/dist/{filter-bar-chip-DgvuQv6c.cjs → filter-bar-chip-C_64m7nX.cjs} +2 -2
  236. package/dist/{filter-bar-chip-DgvuQv6c.cjs.map → filter-bar-chip-C_64m7nX.cjs.map} +1 -1
  237. package/dist/{filter-bar-chip-DM73lTpx.js → filter-bar-chip-D2kKMSRA.js} +2 -2
  238. package/dist/{filter-bar-chip-DM73lTpx.js.map → filter-bar-chip-D2kKMSRA.js.map} +1 -1
  239. package/dist/{filter-bar-DW0fD4bu.js → filter-bar-pXSJt2ye.js} +3 -3
  240. package/dist/{filter-bar-DW0fD4bu.js.map → filter-bar-pXSJt2ye.js.map} +1 -1
  241. package/dist/{kbd-Xgv5HKEi.cjs → kbd-B2zbS_A6.cjs} +2 -2
  242. package/dist/{kbd-Xgv5HKEi.cjs.map → kbd-B2zbS_A6.cjs.map} +1 -1
  243. package/dist/{kbd-7Xx2pm9f.js → kbd-CYtMrOov.js} +2 -2
  244. package/dist/{kbd-7Xx2pm9f.js.map → kbd-CYtMrOov.js.map} +1 -1
  245. package/dist/layout/tabbed-container.cjs.js +2 -2
  246. package/dist/layout/tabbed-container.es.js +2 -2
  247. package/dist/lib/form/components/boolean-field.cjs.js +1 -1
  248. package/dist/lib/form/components/boolean-field.es.js +1 -1
  249. package/dist/lib/form/components/field-wrapper.cjs.js +1 -1
  250. package/dist/lib/form/components/field-wrapper.es.js +1 -1
  251. package/dist/{list-search-ByJdIxIh.js → list-search-8jVOq9LK.js} +2 -2
  252. package/dist/{list-search-ByJdIxIh.js.map → list-search-8jVOq9LK.js.map} +1 -1
  253. package/dist/{list-search-DNJVeHmK.cjs → list-search-C7ckmZHa.cjs} +2 -2
  254. package/dist/{list-search-DNJVeHmK.cjs.map → list-search-C7ckmZHa.cjs.map} +1 -1
  255. package/dist/{logs-data-list-DCj8Pj77.cjs → logs-data-list-C4Z4rw62.cjs} +21 -22
  256. package/dist/{logs-data-list-DCj8Pj77.cjs.map → logs-data-list-C4Z4rw62.cjs.map} +1 -1
  257. package/dist/{logs-data-list-VEEruqHO.js → logs-data-list-CL3iq_6r.js} +2 -3
  258. package/dist/{logs-data-list-VEEruqHO.js.map → logs-data-list-CL3iq_6r.js.map} +1 -1
  259. package/dist/new/settings.cjs.js +1 -1
  260. package/dist/new/settings.es.js +1 -1
  261. package/dist/{notification-activity-BWXHmlTn.js → notification-activity-BRW1Xlj1.js} +9 -5
  262. package/dist/notification-activity-BRW1Xlj1.js.map +1 -0
  263. package/dist/{notification-activity-BSNuqJDd.cjs → notification-activity-DAZOALWI.cjs} +9 -5
  264. package/dist/notification-activity-DAZOALWI.cjs.map +1 -0
  265. package/dist/resize/collapsible-panel.cjs.js +1 -1
  266. package/dist/resize/collapsible-panel.es.js +1 -1
  267. package/dist/{search-input-CMNy0JWd.cjs → search-input-CGNENJDh.cjs} +2 -2
  268. package/dist/{search-input-CMNy0JWd.cjs.map → search-input-CGNENJDh.cjs.map} +1 -1
  269. package/dist/{search-input-C9qFBzn6.js → search-input-cIYk0pl3.js} +2 -2
  270. package/dist/{search-input-C9qFBzn6.js.map → search-input-cIYk0pl3.js.map} +1 -1
  271. package/dist/{section-skBYREaR.cjs → section-BikCyHdf.cjs} +2 -2
  272. package/dist/{section-skBYREaR.cjs.map → section-BikCyHdf.cjs.map} +1 -1
  273. package/dist/{section-eRs4NnCC.js → section-C71zDLKM.js} +2 -2
  274. package/dist/{section-eRs4NnCC.js.map → section-C71zDLKM.js.map} +1 -1
  275. package/dist/{settings-row-Ds-PVocx.cjs → settings-row-C9lT2BJS.cjs} +2 -2
  276. package/dist/{settings-row-Ds-PVocx.cjs.map → settings-row-C9lT2BJS.cjs.map} +1 -1
  277. package/dist/{settings-row-BHtjEfPr.js → settings-row-CRpU1an-.js} +2 -2
  278. package/dist/{settings-row-BHtjEfPr.js.map → settings-row-CRpU1an-.js.map} +1 -1
  279. package/dist/src/domains/capabilities/index.d.ts +1 -1
  280. package/dist/src/domains/chat/messages/notification-signal-notice.d.ts +2 -0
  281. package/dist/src/domains/chat/messages/signal-data.d.ts +9 -0
  282. package/dist/src/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.d.ts +2 -2
  283. package/dist/src/domains/datasets/components/add-dataset-item-dialog/build-add-item-payload.d.ts +2 -0
  284. package/dist/src/domains/traces/components/trace-data-panel-view.d.ts +1 -5
  285. package/dist/src/domains/traces/components/trace-span-panel.d.ts +1 -2
  286. package/dist/src/domains/traces/components/traces-explorer/traces-explorer-context.d.ts +2 -0
  287. package/dist/src/domains/traces/components/traces-explorer/traces-explorer-panel.d.ts +3 -1
  288. package/dist/src/domains/traces/hooks/use-traces-list-source.d.ts +7 -1
  289. package/dist/src/ds/components/DataList/data-list-root.d.ts +2 -0
  290. package/dist/src/ds/components/Sidebar/header/sidebar-badge.d.ts +7 -0
  291. package/dist/src/ds/components/Sidebar/header/sidebar-button-hint.d.ts +7 -0
  292. package/dist/src/ds/components/Sidebar/header/sidebar-search-trigger.d.ts +14 -3
  293. package/dist/src/ds/components/Sidebar/index.d.ts +1 -0
  294. package/dist/src/ds/components/Sidebar/root/sidebar-trigger.d.ts +2 -2
  295. package/dist/src/ds/components/Sidebar/sidebar.d.ts +5 -1
  296. package/dist/src/ds/components/ai/activity/presets/notification-activity.d.ts +5 -1
  297. package/dist/style.css +29 -13
  298. package/dist/{traces-data-list-CF_LFvnf.cjs → traces-data-list-BOHhsgDI.cjs} +18 -20
  299. package/dist/{traces-data-list-CF_LFvnf.cjs.map → traces-data-list-BOHhsgDI.cjs.map} +1 -1
  300. package/dist/{traces-data-list-DgmSuEKb.js → traces-data-list-CP6knkOn.js} +2 -4
  301. package/dist/{traces-data-list-DgmSuEKb.js.map → traces-data-list-CP6knkOn.js.map} +1 -1
  302. package/package.json +11 -11
  303. package/dist/data-list-CD_lls8O.js +0 -138
  304. package/dist/data-list-CD_lls8O.js.map +0 -1
  305. package/dist/data-list-CGD9hzcp.cjs +0 -142
  306. package/dist/data-list-CGD9hzcp.cjs.map +0 -1
  307. package/dist/data-list-spacer-DpXJrZe1.js +0 -209
  308. package/dist/data-list-spacer-DpXJrZe1.js.map +0 -1
  309. package/dist/data-list-spacer-Dpoj55mv.cjs +0 -218
  310. package/dist/data-list-spacer-Dpoj55mv.cjs.map +0 -1
  311. package/dist/data-list-top-Cu4C2Z07.js.map +0 -1
  312. package/dist/data-list-top-DJh08vFA.cjs.map +0 -1
  313. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.cjs.js +0 -205
  314. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.cjs.js.map +0 -1
  315. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.d.ts +0 -2
  316. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.es.js +0 -201
  317. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.es.js.map +0 -1
  318. package/dist/notification-activity-BSNuqJDd.cjs.map +0 -1
  319. package/dist/notification-activity-BWXHmlTn.js.map +0 -1
  320. package/dist/side-dialog-B7a4dasE.cjs +0 -231
  321. package/dist/side-dialog-B7a4dasE.cjs.map +0 -1
  322. package/dist/side-dialog-DVea8YTO.js +0 -211
  323. package/dist/side-dialog-DVea8YTO.js.map +0 -1
  324. package/dist/src/domains/observability/components/add-trace-mocks-to-item-dialog.d.ts +0 -9
@@ -1 +1 @@
1
- {"version":3,"file":"data-panel-CGRPVnEe.cjs","sources":["../src/ds/components/DataPanel/data-panel-close-button.tsx","../src/ds/components/DataPanel/data-panel-context.tsx","../src/ds/components/DataPanel/data-panel-content.tsx","../src/ds/components/DataPanel/data-panel-copy-id.tsx","../src/ds/components/DataPanel/data-panel-header.tsx","../src/ds/components/DataPanel/data-panel-header-actions.tsx","../src/ds/components/DataPanel/data-panel-header-content.tsx","../src/ds/components/DataPanel/data-panel-heading.tsx","../src/ds/components/DataPanel/data-panel-loading-data.tsx","../src/ds/components/DataPanel/data-panel-metadata.tsx","../src/ds/components/DataPanel/data-panel-next-prev-nav.tsx","../src/ds/components/DataPanel/data-panel-no-data.tsx","../src/ds/components/DataPanel/data-panel-root.tsx","../src/ds/components/DataPanel/data-panel.tsx"],"sourcesContent":["import { ArrowLeftIcon, XIcon } from 'lucide-react';\nimport { Button } from '@/ds/components/Button';\nimport type { ButtonProps } from '@/ds/components/Button';\nimport { cn } from '@/lib/utils';\n\nexport interface DataPanelCloseButtonProps {\n onClick: () => void;\n tooltip?: string;\n /** Accessible name; override it when the arrow leads somewhere other than \"closed\" (e.g. back to a parent view). */\n label?: string;\n /**\n * `arrow` (default) is the leading \"leave this panel\" control, rendered first in the header.\n * `x` dismisses a nested column in place and belongs in `HeaderActions`, on the right.\n */\n icon?: 'arrow' | 'x';\n className?: string;\n variant?: ButtonProps['variant'];\n}\n\nexport function DataPanelCloseButton({\n onClick,\n tooltip = 'Close panel',\n label = 'Close Panel',\n icon = 'arrow',\n className,\n variant = 'ghost',\n}: DataPanelCloseButtonProps) {\n return (\n <Button\n size=\"sm\"\n variant={variant}\n onClick={onClick}\n aria-label={label}\n tooltip={tooltip}\n className={cn('shrink-0', className)}\n >\n {icon === 'x' ? <XIcon /> : <ArrowLeftIcon />}\n </Button>\n );\n}\n","import { createContext, useContext } from 'react';\n\nexport type DataPanelVariant = 'drawer' | 'inline';\n\n// Defaults to `drawer` so sub-components rendered outside a `DataPanel` keep their historical behavior.\nexport const DataPanelVariantContext = createContext<DataPanelVariant>('drawer');\n\nexport const useDataPanelVariant = () => useContext(DataPanelVariantContext);\n","import { Drawer as DrawerPrimitive } from '@base-ui/react/drawer';\nimport type { ReactNode, Ref } from 'react';\n\nimport { useDataPanelVariant } from './data-panel-context';\nimport { cn } from '@/lib/utils';\n\nexport interface DataPanelContentProps {\n children: ReactNode;\n ref?: Ref<HTMLDivElement>;\n /** Layout overrides (e.g. padding) for the scroll container. */\n className?: string;\n}\n\nconst CONTENT_CLASSES = 'min-h-0 flex-1 overflow-y-auto px-2 py-3';\n\n// In the drawer variant, `DrawerPrimitive.Content` marks the region as swipe-exempt\n// so scrolling or selecting text inside the panel body doesn't start a\n// swipe-to-dismiss. The inline variant has no drawer, so a plain div is enough.\nexport function DataPanelContent({ children, ref, className }: DataPanelContentProps) {\n const variant = useDataPanelVariant();\n\n if (variant === 'inline') {\n return (\n <div ref={ref} className={cn(CONTENT_CLASSES, className)}>\n {children}\n </div>\n );\n }\n\n return (\n <DrawerPrimitive.Content ref={ref} className={cn(CONTENT_CLASSES, className)}>\n {children}\n </DrawerPrimitive.Content>\n );\n}\n","import { useState } from 'react';\nimport { Button } from '@/ds/components/Button';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/ds/components/Tooltip';\nimport { useCopyToClipboard } from '@/hooks/use-copy-to-clipboard';\nimport { truncateString } from '@/lib/truncate-string';\n\nexport interface DataPanelCopyIdProps {\n id: string;\n /** Characters kept before the ellipsis. Defaults to 12. */\n maxLength?: number;\n}\n\n/**\n * Truncated identifier rendered inline in a `DataPanel.Heading`; clicking copies the full value.\n */\nexport function DataPanelCopyId({ id, maxLength = 12 }: DataPanelCopyIdProps) {\n const { isCopied, handleCopy } = useCopyToClipboard({ text: id, showToast: false });\n const [open, setOpen] = useState(false);\n\n return (\n <Tooltip open={isCopied || open} onOpenChange={setOpen}>\n <TooltipTrigger\n render={\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={handleCopy}>\n {truncateString(id, maxLength)}\n </Button>\n }\n />\n <TooltipContent>{isCopied ? 'Copied to clipboard' : 'Copy to clipboard'}</TooltipContent>\n </Tooltip>\n );\n}\n","import { cn } from '@/lib/utils';\n\nexport interface DataPanelHeaderProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport function DataPanelHeader({ className, children }: DataPanelHeaderProps) {\n return (\n <div\n className={cn(\n // Same box as the app `Header`. Leading `CloseButton`, then the heading\n // (+ inline metadata via `HeaderContent`), then `HeaderActions` pushed to the right edge.\n // `flex-wrap` drops the actions onto a second row when the panel is too narrow for one.\n // `gap-0.5` is the slight gap between the close arrow and the heading.\n // `py-1` keeps 28px controls + border within the 40px min height, so the divider\n // lines up with an adjacent app `Header` instead of sitting 1px lower.\n 'flex min-h-header-default w-full flex-wrap items-center gap-0.5 px-2 py-1',\n // Bottom border only when something follows the header (i.e. the panel is expanded).\n // When the panel is collapsed and the header is the only child, the border auto-hides.\n // Same edge color as the app `Header` it docks beside.\n 'not-last:border-b not-last:border-surface-rim',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","export interface DataPanelHeaderActionsProps {\n children: React.ReactNode;\n}\n\n/**\n * Right-side action slot of a `DataPanel.Header`. Mirrors `HeaderAction` with `gap-2`\n * (these are `size=\"sm\"` controls, like the page header actions) and wraps when the panel is too narrow.\n */\nexport function DataPanelHeaderActions({ children }: DataPanelHeaderActionsProps) {\n return <div className=\"ml-auto flex min-w-0 flex-wrap items-center justify-end gap-2 self-center\">{children}</div>;\n}\n","import { Children } from 'react';\n\nexport interface DataPanelHeaderContentProps {\n children: React.ReactNode;\n}\n\n/**\n * Left block of a `DataPanel.Header`: heading followed inline by optional `Metadata`, truncated when too long.\n * A vertical separator is rendered between the heading and the metadata when both are present.\n */\nexport function DataPanelHeaderContent({ children }: DataPanelHeaderContentProps) {\n const [heading, ...metadata] = Children.toArray(children);\n\n return (\n <div className=\"flex min-w-0 flex-1 items-center gap-1 overflow-hidden\">\n {heading}\n {metadata.length > 0 && (\n <>\n <div aria-hidden=\"true\" className=\"mx-1 h-4 w-px shrink-0 bg-border-strong\" />\n {metadata}\n </>\n )}\n </div>\n );\n}\n","import { controlSizeClasses } from '@/ds/primitives/control-size';\nimport { cn } from '@/lib/utils';\n\nexport interface DataPanelHeadingProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport function DataPanelHeading({ className, children }: DataPanelHeadingProps) {\n return (\n <h3\n className={cn(\n // Same recipe as a current `Crumb` in the page header, with tight horizontal spacing:\n // inline children like `TraceIdButton` carry their own padding, so `gap-1` + `px-1`\n // is enough to keep the title close to the leading close arrow and the inline metadata.\n // `shrink-0`: the heading keeps its text; the inline `Metadata` row is what gets clipped.\n 'inline-flex max-w-full min-w-0 shrink-0 items-center gap-1 rounded-full px-1',\n controlSizeClasses.sm,\n 'cursor-default text-foreground [&>b]:text-caption [&>b]:text-muted-foreground',\n className,\n )}\n >\n {children}\n </h3>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Spinner } from '@/ds/components/Spinner';\n\nexport interface DataPanelLoadingDataProps {\n children?: ReactNode;\n}\n\nexport function DataPanelLoadingData({ children }: DataPanelLoadingDataProps) {\n return (\n <div className=\"flex min-h-32 items-center justify-center gap-2 px-3 py-4 text-caption text-placeholder\">\n <Spinner size=\"sm\" variant=\"pulse\" className=\"text-placeholder\" /> {children ?? 'Loading...'}\n </div>\n );\n}\n","import { Tooltip, TooltipContent, TooltipTrigger } from '@/ds/components/Tooltip';\nimport { Icon } from '@/ds/icons/Icon';\nimport { controlSizeClasses } from '@/ds/primitives/control-size';\nimport { controlStateColorTransition, transitions } from '@/ds/primitives/transitions';\nimport { quietTextHover } from '@/ds/primitives/typography';\nimport { cn } from '@/lib/utils';\n\nexport interface DataPanelMetadataProps {\n children: React.ReactNode;\n}\n\n/** Row of `Meta` pills next to a `DataPanel.Heading`. Never wraps; overflowing pills are clipped. */\nexport function DataPanelMetadata({ children }: DataPanelMetadataProps) {\n return <ul className=\"flex min-w-0 flex-nowrap items-center gap-0.5 overflow-hidden\">{children}</ul>;\n}\n\nexport interface DataPanelMetaProps extends Omit<React.HTMLAttributes<HTMLElement>, 'children' | 'title'> {\n /** Element/component to render as (e.g. a router `Link`). Defaults to `span`. */\n as?: React.ElementType;\n href?: string;\n to?: string;\n /** Prefix icon (bare SVG). */\n icon?: React.ReactNode;\n /** Shown on hover/focus; for a static (non-link) meta a string tooltip also becomes the accessible name. */\n tooltip?: React.ReactNode;\n children: React.ReactNode;\n 'data-testid'?: string;\n}\n\nexport function DataPanelMeta({ as, icon, tooltip, children, className, ...props }: DataPanelMetaProps) {\n const Root = as ?? 'span';\n const isInteractive = Boolean(as || props.href || props.to || props.onClick);\n\n const hasTooltip = tooltip != null;\n const root = (\n <Root\n aria-label={!isInteractive && typeof tooltip === 'string' ? tooltip : undefined}\n tabIndex={!isInteractive && hasTooltip ? 0 : undefined}\n className={cn(\n // Same box as a `size=\"sm\"` ghost `Button` (e.g. `TraceIdButton`), so pills line up\n // with the heading and the trace ID on the same header row.\n 'inline-flex min-w-0 items-center gap-1.5 overflow-hidden rounded-full px-2',\n controlSizeClasses.sm,\n controlStateColorTransition,\n isInteractive\n ? cn(quietTextHover, 'cursor-pointer hover:bg-fill-subtle active:bg-fill')\n : cn('text-muted-foreground', hasTooltip && 'cursor-help'),\n className,\n )}\n {...props}\n >\n {icon && (\n <Icon size=\"xs\" className={cn('shrink-0 opacity-50 group-hover:opacity-100', transitions.opacity)}>\n {icon}\n </Icon>\n )}\n <span className=\"min-w-0 truncate\">{children}</span>\n </Root>\n );\n\n return (\n <li className=\"group flex h-control-sm min-w-0 shrink-0 items-center\">\n {!hasTooltip ? (\n root\n ) : (\n <Tooltip>\n <TooltipTrigger render={root} />\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n )}\n </li>\n );\n}\n","import { ArrowDownIcon, ArrowUpIcon } from 'lucide-react';\nimport { Button } from '@/ds/components/Button';\nimport type { ButtonProps } from '@/ds/components/Button';\n\nexport interface DataPanelNextPrevNavProps {\n onPrevious?: () => void;\n onNext?: () => void;\n previousLabel?: string;\n nextLabel?: string;\n variant?: ButtonProps['variant'];\n}\n\n/** Two independent previous/next buttons, laid out by the parent `HeaderActions` gap. */\nexport function DataPanelNextPrevNav({\n onPrevious,\n onNext,\n previousLabel = 'Go to previous',\n nextLabel = 'Go to next',\n variant = 'ghost',\n}: DataPanelNextPrevNavProps) {\n return (\n <>\n <Button size=\"sm\" variant={variant} tooltip={previousLabel} onClick={onPrevious} disabled={!onPrevious}>\n <ArrowUpIcon />\n </Button>\n <Button size=\"sm\" variant={variant} tooltip={nextLabel} onClick={onNext} disabled={!onNext}>\n <ArrowDownIcon />\n </Button>\n </>\n );\n}\n","import { Txt } from '@/ds/components/Txt';\nexport interface DataPanelNoDataProps {\n children?: React.ReactNode;\n}\n\nexport function DataPanelNoData({ children }: DataPanelNoDataProps) {\n return (\n <Txt variant=\"caption\" tone=\"faint\" className=\"px-3 py-4\">\n {children ?? 'No data found.'}\n </Txt>\n );\n}\n","import { Drawer as DrawerPrimitive } from '@base-ui/react/drawer';\nimport * as React from 'react';\n\nimport { DataPanelVariantContext } from './data-panel-context';\nimport { PortalContainerProvider } from '@/ds/primitives/portal-container';\nimport { frameFillStyle, frameSurfaceStyle } from '@/ds/primitives/raised-surface';\nimport { cn } from '@/lib/utils';\n\n// `drawer-popup` / `drawer-backdrop` carry the slide + fade transitions.\nimport '../Drawer/drawer.css';\n\ninterface DataPanelBaseProps {\n /** Accessible name (screen-reader only; the visible title comes from `DataPanel.Heading`). */\n title: string;\n /** Accessible description (screen-reader only). */\n description?: string;\n children: React.ReactNode;\n className?: string;\n}\n\nexport interface DataPanelDrawerProps extends DataPanelBaseProps {\n /** `drawer` (default): a modal side drawer portaled to the right edge of the page. */\n variant?: 'drawer';\n /** Whether the drawer is shown. */\n open: boolean;\n /** Called when the user dismisses the panel (close button, Escape, backdrop, swipe). */\n onClose?: () => void;\n /**\n * Elevation level when several sibling panels are open at once (not nested in\n * the React tree, so Base UI's own stacking doesn't apply). A deeper panel is\n * narrower so the one beneath peeks out on the left. Siblings stack in mount\n * order: render the deeper panel after the shallower one.\n */\n depth?: 1 | 2 | 3;\n /**\n * Drawer width. `md` (default) is a narrow detail panel whose width shrinks\n * with `depth`. `half`/`wide`/`full` are for multi-column content (e.g. the\n * trace panel); each `depth` level trims them by a small fixed amount so a\n * same-size parent still peeks out beneath. Changing `size` while open\n * animates the width.\n */\n size?: 'md' | 'half' | 'wide' | 'full';\n}\n\nexport interface DataPanelInlineProps extends DataPanelBaseProps {\n /**\n * `inline`: the panel card is rendered where it is mounted, in the normal\n * document flow (no portal, backdrop, focus trap or dismissal gestures).\n * Mount/unmount it to show/hide it. It fills its container's height, so give\n * the parent a bounded height for `DataPanel.Content` to scroll.\n */\n variant: 'inline';\n open?: never;\n onClose?: never;\n depth?: never;\n size?: never;\n}\n\nexport type DataPanelProps = DataPanelDrawerProps | DataPanelInlineProps;\n\n// The edge comes from the surface's `--surface-rim` inset (no CSS border), like `MainCard`.\n// `p-px` reserves that rim pixel so the header divider doesn't paint over it.\nconst CARD_CLASSES = 'flex max-h-full w-full flex-col overflow-hidden p-px';\n\nconst DEPTH_WIDTH = { 1: 'w-xl', 2: 'w-lg', 3: 'w-md' } as const;\nconst SIZE_WIDTH = { half: 'w-1/2', wide: 'w-4/5', full: 'w-full' } as const;\nconst SIZE_PERCENT = { half: '50%', wide: '80%', full: '100%' } as const;\n// Each extra depth level trims a stacked non-`md` panel so the parent peeks out beneath it.\nconst DEPTH_PEEK_REM = 1.5;\n\nexport function DataPanelRoot(props: DataPanelProps) {\n if (props.variant === 'inline') {\n return <DataPanelInline {...props} />;\n }\n return <DataPanelDrawer {...props} />;\n}\n\nfunction DataPanelInline({ title, description, children, className }: DataPanelInlineProps) {\n const descriptionId = React.useId();\n\n return (\n <DataPanelVariantContext.Provider value=\"inline\">\n <section\n data-slot=\"data-panel\"\n data-variant=\"inline\"\n aria-label={title}\n aria-describedby={description ? descriptionId : undefined}\n // Inline, the card docks beside the app frame, so it shares the frame's rounding.\n className={cn(CARD_CLASSES, frameSurfaceStyle, 'h-full min-h-0 rounded-studio-frame', className)}\n >\n {description && (\n <span id={descriptionId} className=\"sr-only\">\n {description}\n </span>\n )}\n {children}\n </section>\n </DataPanelVariantContext.Provider>\n );\n}\n\nfunction DataPanelDrawer({\n open,\n onClose,\n title,\n description,\n depth = 1,\n size = 'md',\n children,\n className,\n}: DataPanelDrawerProps) {\n // Swipe-exempt mount point for nested popups (Select, DropdownMenu, …) so they\n // stay inside Base UI's modal focus region and don't start a drawer swipe on\n // pointerdown. Same pattern as `SideDialogRoot`; see `portal-container.tsx`.\n const [portalHost, setPortalHost] = React.useState<HTMLDivElement | null>(null);\n\n return (\n <DataPanelVariantContext.Provider value=\"drawer\">\n <DrawerPrimitive.Root\n open={open}\n onOpenChange={nextOpen => {\n if (!nextOpen) onClose?.();\n }}\n swipeDirection=\"right\"\n >\n <DrawerPrimitive.Portal>\n {/* Lighter than the shared `--scrim`: a side panel should keep the page beneath readable. */}\n <DrawerPrimitive.Backdrop className=\"drawer-backdrop fixed inset-0 z-50 bg-scrim/30\" />\n <DrawerPrimitive.Viewport className=\"fixed inset-0 z-50\">\n <DrawerPrimitive.Popup\n data-slot=\"data-panel-popup\"\n data-depth={depth}\n data-size={size}\n className={cn(\n 'drawer-popup fixed inset-y-0 right-0 z-50 flex max-w-full p-4 outline-none',\n size === 'md' ? DEPTH_WIDTH[depth] : SIZE_WIDTH[size],\n )}\n style={\n size !== 'md' && depth > 1\n ? { width: `calc(${SIZE_PERCENT[size]} - ${(depth - 1) * DEPTH_PEEK_REM}rem)` }\n : undefined\n }\n >\n {/* Not a heading: the visible `DataPanel.Heading` already is one; this only names the dialog. */}\n <DrawerPrimitive.Title render={<span />} className=\"sr-only\">\n {title}\n </DrawerPrimitive.Title>\n {description && (\n <DrawerPrimitive.Description className=\"sr-only\">{description}</DrawerPrimitive.Description>\n )}\n\n <DrawerPrimitive.Content render={<div ref={setPortalHost} className=\"absolute\" />} />\n\n <PortalContainerProvider container={portalHost}>\n {/* Whole card is swipe-exempt: pointerdown on tabs/buttons/text must not start a dismiss gesture. */}\n <DrawerPrimitive.Content\n render={<section />}\n className={cn(CARD_CLASSES, frameFillStyle, 'rounded-xl shadow-overlay', className)}\n >\n {children}\n </DrawerPrimitive.Content>\n </PortalContainerProvider>\n </DrawerPrimitive.Popup>\n </DrawerPrimitive.Viewport>\n </DrawerPrimitive.Portal>\n </DrawerPrimitive.Root>\n </DataPanelVariantContext.Provider>\n );\n}\n","import { DataPanelCloseButton } from './data-panel-close-button';\nimport { DataPanelContent } from './data-panel-content';\nimport { DataPanelCopyId } from './data-panel-copy-id';\nimport { DataPanelHeader } from './data-panel-header';\nimport { DataPanelHeaderActions } from './data-panel-header-actions';\nimport { DataPanelHeaderContent } from './data-panel-header-content';\nimport { DataPanelHeading } from './data-panel-heading';\nimport { DataPanelLoadingData } from './data-panel-loading-data';\nimport { DataPanelMeta, DataPanelMetadata } from './data-panel-metadata';\nimport { DataPanelNextPrevNav } from './data-panel-next-prev-nav';\nimport { DataPanelNoData } from './data-panel-no-data';\nimport { DataPanelRoot } from './data-panel-root';\nimport { DataPanelSectionHeading } from './data-panel-section-heading';\nimport { DataCodeSection } from '@/ds/components/DataCodeSection';\n\nexport const DataPanel = Object.assign(DataPanelRoot, {\n Header: DataPanelHeader,\n HeaderContent: DataPanelHeaderContent,\n HeaderActions: DataPanelHeaderActions,\n Heading: DataPanelHeading,\n Metadata: DataPanelMetadata,\n Meta: DataPanelMeta,\n CloseButton: DataPanelCloseButton,\n CopyId: DataPanelCopyId,\n NextPrevNav: DataPanelNextPrevNav,\n LoadingData: DataPanelLoadingData,\n NoData: DataPanelNoData,\n Content: DataPanelContent,\n CodeSection: DataCodeSection,\n SectionHeading: DataPanelSectionHeading,\n});\n"],"names":["jsx","Button","cn","XIcon","ArrowLeftIcon","createContext","useContext","DrawerPrimitive","useCopyToClipboard","useState","Tooltip","TooltipTrigger","truncateString","TooltipContent","Children","jsxs","Fragment","controlSizeClasses","Spinner","tooltip","controlStateColorTransition","quietTextHover","Icon","transitions","ArrowUpIcon","ArrowDownIcon","Txt","React","frameSurfaceStyle","PortalContainerProvider","frameFillStyle","DataCodeSection","DataPanelSectionHeading"],"mappings":"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"}
1
+ {"version":3,"file":"data-panel-xqrai98b.cjs","sources":["../src/ds/components/DataPanel/data-panel-close-button.tsx","../src/ds/components/DataPanel/data-panel-context.tsx","../src/ds/components/DataPanel/data-panel-content.tsx","../src/ds/components/DataPanel/data-panel-copy-id.tsx","../src/ds/components/DataPanel/data-panel-header.tsx","../src/ds/components/DataPanel/data-panel-header-actions.tsx","../src/ds/components/DataPanel/data-panel-header-content.tsx","../src/ds/components/DataPanel/data-panel-heading.tsx","../src/ds/components/DataPanel/data-panel-loading-data.tsx","../src/ds/components/DataPanel/data-panel-metadata.tsx","../src/ds/components/DataPanel/data-panel-next-prev-nav.tsx","../src/ds/components/DataPanel/data-panel-no-data.tsx","../src/ds/components/DataPanel/data-panel-root.tsx","../src/ds/components/DataPanel/data-panel.tsx"],"sourcesContent":["import { ArrowLeftIcon, XIcon } from 'lucide-react';\nimport { Button } from '@/ds/components/Button';\nimport type { ButtonProps } from '@/ds/components/Button';\nimport { cn } from '@/lib/utils';\n\nexport interface DataPanelCloseButtonProps {\n onClick: () => void;\n tooltip?: string;\n /** Accessible name; override it when the arrow leads somewhere other than \"closed\" (e.g. back to a parent view). */\n label?: string;\n /**\n * `arrow` (default) is the leading \"leave this panel\" control, rendered first in the header.\n * `x` dismisses a nested column in place and belongs in `HeaderActions`, on the right.\n */\n icon?: 'arrow' | 'x';\n className?: string;\n variant?: ButtonProps['variant'];\n}\n\nexport function DataPanelCloseButton({\n onClick,\n tooltip = 'Close panel',\n label = 'Close Panel',\n icon = 'arrow',\n className,\n variant = 'ghost',\n}: DataPanelCloseButtonProps) {\n return (\n <Button\n size=\"sm\"\n variant={variant}\n onClick={onClick}\n aria-label={label}\n tooltip={tooltip}\n className={cn('shrink-0', className)}\n >\n {icon === 'x' ? <XIcon /> : <ArrowLeftIcon />}\n </Button>\n );\n}\n","import { createContext, useContext } from 'react';\n\nexport type DataPanelVariant = 'drawer' | 'inline';\n\n// Defaults to `drawer` so sub-components rendered outside a `DataPanel` keep their historical behavior.\nexport const DataPanelVariantContext = createContext<DataPanelVariant>('drawer');\n\nexport const useDataPanelVariant = () => useContext(DataPanelVariantContext);\n","import { Drawer as DrawerPrimitive } from '@base-ui/react/drawer';\nimport type { ReactNode, Ref } from 'react';\n\nimport { useDataPanelVariant } from './data-panel-context';\nimport { cn } from '@/lib/utils';\n\nexport interface DataPanelContentProps {\n children: ReactNode;\n ref?: Ref<HTMLDivElement>;\n /** Layout overrides (e.g. padding) for the scroll container. */\n className?: string;\n}\n\nconst CONTENT_CLASSES = 'min-h-0 flex-1 overflow-y-auto px-2 py-3';\n\n// In the drawer variant, `DrawerPrimitive.Content` marks the region as swipe-exempt\n// so scrolling or selecting text inside the panel body doesn't start a\n// swipe-to-dismiss. The inline variant has no drawer, so a plain div is enough.\nexport function DataPanelContent({ children, ref, className }: DataPanelContentProps) {\n const variant = useDataPanelVariant();\n\n if (variant === 'inline') {\n return (\n <div ref={ref} className={cn(CONTENT_CLASSES, className)}>\n {children}\n </div>\n );\n }\n\n return (\n <DrawerPrimitive.Content ref={ref} className={cn(CONTENT_CLASSES, className)}>\n {children}\n </DrawerPrimitive.Content>\n );\n}\n","import { useState } from 'react';\nimport { Button } from '@/ds/components/Button';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/ds/components/Tooltip';\nimport { useCopyToClipboard } from '@/hooks/use-copy-to-clipboard';\nimport { truncateString } from '@/lib/truncate-string';\n\nexport interface DataPanelCopyIdProps {\n id: string;\n /** Characters kept before the ellipsis. Defaults to 12. */\n maxLength?: number;\n}\n\n/**\n * Truncated identifier rendered inline in a `DataPanel.Heading`; clicking copies the full value.\n */\nexport function DataPanelCopyId({ id, maxLength = 12 }: DataPanelCopyIdProps) {\n const { isCopied, handleCopy } = useCopyToClipboard({ text: id, showToast: false });\n const [open, setOpen] = useState(false);\n\n return (\n <Tooltip open={isCopied || open} onOpenChange={setOpen}>\n <TooltipTrigger\n render={\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={handleCopy}>\n {truncateString(id, maxLength)}\n </Button>\n }\n />\n <TooltipContent>{isCopied ? 'Copied to clipboard' : 'Copy to clipboard'}</TooltipContent>\n </Tooltip>\n );\n}\n","import { cn } from '@/lib/utils';\n\nexport interface DataPanelHeaderProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport function DataPanelHeader({ className, children }: DataPanelHeaderProps) {\n return (\n <div\n className={cn(\n // Same box as the app `Header`. Leading `CloseButton`, then the heading\n // (+ inline metadata via `HeaderContent`), then `HeaderActions` pushed to the right edge.\n // `flex-wrap` drops the actions onto a second row when the panel is too narrow for one.\n // `gap-0.5` is the slight gap between the close arrow and the heading.\n // `py-1` keeps 28px controls + border within the 40px min height, so the divider\n // lines up with an adjacent app `Header` instead of sitting 1px lower.\n 'flex min-h-header-default w-full flex-wrap items-center gap-0.5 px-2 py-1',\n // Bottom border only when something follows the header (i.e. the panel is expanded).\n // When the panel is collapsed and the header is the only child, the border auto-hides.\n // Same edge color as the app `Header` it docks beside.\n 'not-last:border-b not-last:border-surface-rim',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","export interface DataPanelHeaderActionsProps {\n children: React.ReactNode;\n}\n\n/**\n * Right-side action slot of a `DataPanel.Header`. Mirrors `HeaderAction` with `gap-2`\n * (these are `size=\"sm\"` controls, like the page header actions) and wraps when the panel is too narrow.\n */\nexport function DataPanelHeaderActions({ children }: DataPanelHeaderActionsProps) {\n return <div className=\"ml-auto flex min-w-0 flex-wrap items-center justify-end gap-2 self-center\">{children}</div>;\n}\n","import { Children } from 'react';\n\nexport interface DataPanelHeaderContentProps {\n children: React.ReactNode;\n}\n\n/**\n * Left block of a `DataPanel.Header`: heading followed inline by optional `Metadata`, truncated when too long.\n * A vertical separator is rendered between the heading and the metadata when both are present.\n */\nexport function DataPanelHeaderContent({ children }: DataPanelHeaderContentProps) {\n const [heading, ...metadata] = Children.toArray(children);\n\n return (\n <div className=\"flex min-w-0 flex-1 items-center gap-1 overflow-hidden\">\n {heading}\n {metadata.length > 0 && (\n <>\n <div aria-hidden=\"true\" className=\"mx-1 h-4 w-px shrink-0 bg-border-strong\" />\n {metadata}\n </>\n )}\n </div>\n );\n}\n","import { controlSizeClasses } from '@/ds/primitives/control-size';\nimport { cn } from '@/lib/utils';\n\nexport interface DataPanelHeadingProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport function DataPanelHeading({ className, children }: DataPanelHeadingProps) {\n return (\n <h3\n className={cn(\n // Same recipe as a current `Crumb` in the page header, with tight horizontal spacing:\n // inline children like `TraceIdButton` carry their own padding, so `gap-1` + `px-1`\n // is enough to keep the title close to the leading close arrow and the inline metadata.\n // `shrink-0`: the heading keeps its text; the inline `Metadata` row is what gets clipped.\n 'inline-flex max-w-full min-w-0 shrink-0 items-center gap-1 rounded-full px-1',\n controlSizeClasses.sm,\n 'cursor-default text-foreground [&>b]:text-caption [&>b]:text-muted-foreground',\n className,\n )}\n >\n {children}\n </h3>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Spinner } from '@/ds/components/Spinner';\n\nexport interface DataPanelLoadingDataProps {\n children?: ReactNode;\n}\n\nexport function DataPanelLoadingData({ children }: DataPanelLoadingDataProps) {\n return (\n <div className=\"flex min-h-32 items-center justify-center gap-2 px-3 py-4 text-caption text-placeholder\">\n <Spinner size=\"sm\" variant=\"pulse\" className=\"text-placeholder\" /> {children ?? 'Loading...'}\n </div>\n );\n}\n","import { Tooltip, TooltipContent, TooltipTrigger } from '@/ds/components/Tooltip';\nimport { Icon } from '@/ds/icons/Icon';\nimport { controlSizeClasses } from '@/ds/primitives/control-size';\nimport { controlStateColorTransition, transitions } from '@/ds/primitives/transitions';\nimport { quietTextHover } from '@/ds/primitives/typography';\nimport { cn } from '@/lib/utils';\n\nexport interface DataPanelMetadataProps {\n children: React.ReactNode;\n}\n\n/** Row of `Meta` pills next to a `DataPanel.Heading`. Never wraps; overflowing pills are clipped. */\nexport function DataPanelMetadata({ children }: DataPanelMetadataProps) {\n return <ul className=\"flex min-w-0 flex-nowrap items-center gap-0.5 overflow-hidden\">{children}</ul>;\n}\n\nexport interface DataPanelMetaProps extends Omit<React.HTMLAttributes<HTMLElement>, 'children' | 'title'> {\n /** Element/component to render as (e.g. a router `Link`). Defaults to `span`. */\n as?: React.ElementType;\n href?: string;\n to?: string;\n /** Prefix icon (bare SVG). */\n icon?: React.ReactNode;\n /** Shown on hover/focus; for a static (non-link) meta a string tooltip also becomes the accessible name. */\n tooltip?: React.ReactNode;\n children: React.ReactNode;\n 'data-testid'?: string;\n}\n\nexport function DataPanelMeta({ as, icon, tooltip, children, className, ...props }: DataPanelMetaProps) {\n const Root = as ?? 'span';\n const isInteractive = Boolean(as || props.href || props.to || props.onClick);\n\n const hasTooltip = tooltip != null;\n const root = (\n <Root\n aria-label={!isInteractive && typeof tooltip === 'string' ? tooltip : undefined}\n tabIndex={!isInteractive && hasTooltip ? 0 : undefined}\n className={cn(\n // Same box as a `size=\"sm\"` ghost `Button` (e.g. `TraceIdButton`), so pills line up\n // with the heading and the trace ID on the same header row.\n 'inline-flex min-w-0 items-center gap-1.5 overflow-hidden rounded-full px-2',\n controlSizeClasses.sm,\n controlStateColorTransition,\n isInteractive\n ? cn(quietTextHover, 'cursor-pointer hover:bg-fill-subtle active:bg-fill')\n : cn('text-muted-foreground', hasTooltip && 'cursor-help'),\n className,\n )}\n {...props}\n >\n {icon && (\n <Icon size=\"xs\" className={cn('shrink-0 opacity-50 group-hover:opacity-100', transitions.opacity)}>\n {icon}\n </Icon>\n )}\n <span className=\"min-w-0 truncate\">{children}</span>\n </Root>\n );\n\n return (\n <li className=\"group flex h-control-sm min-w-0 shrink-0 items-center\">\n {!hasTooltip ? (\n root\n ) : (\n <Tooltip>\n <TooltipTrigger render={root} />\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n )}\n </li>\n );\n}\n","import { ArrowDownIcon, ArrowUpIcon } from 'lucide-react';\nimport { Button } from '@/ds/components/Button';\nimport type { ButtonProps } from '@/ds/components/Button';\n\nexport interface DataPanelNextPrevNavProps {\n onPrevious?: () => void;\n onNext?: () => void;\n previousLabel?: string;\n nextLabel?: string;\n variant?: ButtonProps['variant'];\n}\n\n/** Two independent previous/next buttons, laid out by the parent `HeaderActions` gap. */\nexport function DataPanelNextPrevNav({\n onPrevious,\n onNext,\n previousLabel = 'Go to previous',\n nextLabel = 'Go to next',\n variant = 'ghost',\n}: DataPanelNextPrevNavProps) {\n return (\n <>\n <Button size=\"sm\" variant={variant} tooltip={previousLabel} onClick={onPrevious} disabled={!onPrevious}>\n <ArrowUpIcon />\n </Button>\n <Button size=\"sm\" variant={variant} tooltip={nextLabel} onClick={onNext} disabled={!onNext}>\n <ArrowDownIcon />\n </Button>\n </>\n );\n}\n","import { Txt } from '@/ds/components/Txt';\nexport interface DataPanelNoDataProps {\n children?: React.ReactNode;\n}\n\nexport function DataPanelNoData({ children }: DataPanelNoDataProps) {\n return (\n <Txt variant=\"caption\" tone=\"faint\" className=\"px-3 py-4\">\n {children ?? 'No data found.'}\n </Txt>\n );\n}\n","import { Drawer as DrawerPrimitive } from '@base-ui/react/drawer';\nimport * as React from 'react';\n\nimport { DataPanelVariantContext } from './data-panel-context';\nimport { PortalContainerProvider } from '@/ds/primitives/portal-container';\nimport { frameFillStyle, frameSurfaceStyle } from '@/ds/primitives/raised-surface';\nimport { cn } from '@/lib/utils';\n\n// `drawer-popup` / `drawer-backdrop` carry the slide + fade transitions.\nimport '../Drawer/drawer.css';\n\ninterface DataPanelBaseProps {\n /** Accessible name (screen-reader only; the visible title comes from `DataPanel.Heading`). */\n title: string;\n /** Accessible description (screen-reader only). */\n description?: string;\n children: React.ReactNode;\n className?: string;\n}\n\nexport interface DataPanelDrawerProps extends DataPanelBaseProps {\n /** `drawer` (default): a modal side drawer portaled to the right edge of the page. */\n variant?: 'drawer';\n /** Whether the drawer is shown. */\n open: boolean;\n /** Called when the user dismisses the panel (close button, Escape, backdrop, swipe). */\n onClose?: () => void;\n /**\n * Elevation level when several sibling panels are open at once (not nested in\n * the React tree, so Base UI's own stacking doesn't apply). A deeper panel is\n * narrower so the one beneath peeks out on the left. Siblings stack in mount\n * order: render the deeper panel after the shallower one.\n */\n depth?: 1 | 2 | 3;\n /**\n * Drawer width. `md` (default) is a narrow detail panel whose width shrinks\n * with `depth`. `half`/`wide`/`full` are for multi-column content (e.g. the\n * trace panel); each `depth` level trims them by a small fixed amount so a\n * same-size parent still peeks out beneath. Changing `size` while open\n * animates the width.\n */\n size?: 'md' | 'half' | 'wide' | 'full';\n}\n\nexport interface DataPanelInlineProps extends DataPanelBaseProps {\n /**\n * `inline`: the panel card is rendered where it is mounted, in the normal\n * document flow (no portal, backdrop, focus trap or dismissal gestures).\n * Mount/unmount it to show/hide it. It fills its container's height, so give\n * the parent a bounded height for `DataPanel.Content` to scroll.\n */\n variant: 'inline';\n open?: never;\n onClose?: never;\n depth?: never;\n size?: never;\n}\n\nexport type DataPanelProps = DataPanelDrawerProps | DataPanelInlineProps;\n\n// The edge comes from the surface's `--surface-rim` inset (no CSS border), like `MainCard`.\n// `p-px` reserves that rim pixel so the header divider doesn't paint over it.\nconst CARD_CLASSES = 'flex max-h-full w-full flex-col overflow-hidden p-px';\n\nconst DEPTH_WIDTH = { 1: 'w-xl', 2: 'w-lg', 3: 'w-md' } as const;\nconst SIZE_WIDTH = { half: 'w-1/2', wide: 'w-4/5', full: 'w-full' } as const;\nconst SIZE_PERCENT = { half: '50%', wide: '80%', full: '100%' } as const;\n// Each extra depth level trims a stacked non-`md` panel so the parent peeks out beneath it.\nconst DEPTH_PEEK_REM = 1.5;\n\nexport function DataPanelRoot(props: DataPanelProps) {\n if (props.variant === 'inline') {\n return <DataPanelInline {...props} />;\n }\n return <DataPanelDrawer {...props} />;\n}\n\nfunction DataPanelInline({ title, description, children, className }: DataPanelInlineProps) {\n const descriptionId = React.useId();\n\n return (\n <DataPanelVariantContext.Provider value=\"inline\">\n <section\n data-slot=\"data-panel\"\n data-variant=\"inline\"\n aria-label={title}\n aria-describedby={description ? descriptionId : undefined}\n // Inline, the card docks beside the app frame, so it shares the frame's rounding.\n className={cn(CARD_CLASSES, frameSurfaceStyle, 'h-full min-h-0 rounded-studio-frame', className)}\n >\n {description && (\n <span id={descriptionId} className=\"sr-only\">\n {description}\n </span>\n )}\n {children}\n </section>\n </DataPanelVariantContext.Provider>\n );\n}\n\nfunction DataPanelDrawer({\n open,\n onClose,\n title,\n description,\n depth = 1,\n size = 'md',\n children,\n className,\n}: DataPanelDrawerProps) {\n // Swipe-exempt mount point for nested popups (Select, DropdownMenu, …) so they\n // stay inside Base UI's modal focus region and don't start a drawer swipe on\n // pointerdown. Same pattern as `SideDialogRoot`; see `portal-container.tsx`.\n const [portalHost, setPortalHost] = React.useState<HTMLDivElement | null>(null);\n\n return (\n <DataPanelVariantContext.Provider value=\"drawer\">\n <DrawerPrimitive.Root\n open={open}\n onOpenChange={nextOpen => {\n if (!nextOpen) onClose?.();\n }}\n swipeDirection=\"right\"\n >\n <DrawerPrimitive.Portal>\n {/* Lighter than the shared `--scrim`: a side panel should keep the page beneath readable. */}\n <DrawerPrimitive.Backdrop className=\"drawer-backdrop fixed inset-0 z-50 bg-scrim/30\" />\n <DrawerPrimitive.Viewport className=\"fixed inset-0 z-50\">\n <DrawerPrimitive.Popup\n data-slot=\"data-panel-popup\"\n data-depth={depth}\n data-size={size}\n className={cn(\n 'drawer-popup fixed inset-y-0 right-0 z-50 flex max-w-full p-4 outline-none',\n size === 'md' ? DEPTH_WIDTH[depth] : SIZE_WIDTH[size],\n )}\n style={\n size !== 'md' && depth > 1\n ? { width: `calc(${SIZE_PERCENT[size]} - ${(depth - 1) * DEPTH_PEEK_REM}rem)` }\n : undefined\n }\n >\n {/* Not a heading: the visible `DataPanel.Heading` already is one; this only names the dialog. */}\n <DrawerPrimitive.Title render={<span />} className=\"sr-only\">\n {title}\n </DrawerPrimitive.Title>\n {description && (\n <DrawerPrimitive.Description className=\"sr-only\">{description}</DrawerPrimitive.Description>\n )}\n\n <DrawerPrimitive.Content render={<div ref={setPortalHost} className=\"absolute\" />} />\n\n <PortalContainerProvider container={portalHost}>\n {/* Whole card is swipe-exempt: pointerdown on tabs/buttons/text must not start a dismiss gesture. */}\n <DrawerPrimitive.Content\n render={<section />}\n className={cn(CARD_CLASSES, frameFillStyle, 'rounded-xl shadow-overlay', className)}\n >\n {children}\n </DrawerPrimitive.Content>\n </PortalContainerProvider>\n </DrawerPrimitive.Popup>\n </DrawerPrimitive.Viewport>\n </DrawerPrimitive.Portal>\n </DrawerPrimitive.Root>\n </DataPanelVariantContext.Provider>\n );\n}\n","import { DataPanelCloseButton } from './data-panel-close-button';\nimport { DataPanelContent } from './data-panel-content';\nimport { DataPanelCopyId } from './data-panel-copy-id';\nimport { DataPanelHeader } from './data-panel-header';\nimport { DataPanelHeaderActions } from './data-panel-header-actions';\nimport { DataPanelHeaderContent } from './data-panel-header-content';\nimport { DataPanelHeading } from './data-panel-heading';\nimport { DataPanelLoadingData } from './data-panel-loading-data';\nimport { DataPanelMeta, DataPanelMetadata } from './data-panel-metadata';\nimport { DataPanelNextPrevNav } from './data-panel-next-prev-nav';\nimport { DataPanelNoData } from './data-panel-no-data';\nimport { DataPanelRoot } from './data-panel-root';\nimport { DataPanelSectionHeading } from './data-panel-section-heading';\nimport { DataCodeSection } from '@/ds/components/DataCodeSection';\n\nexport const DataPanel = Object.assign(DataPanelRoot, {\n Header: DataPanelHeader,\n HeaderContent: DataPanelHeaderContent,\n HeaderActions: DataPanelHeaderActions,\n Heading: DataPanelHeading,\n Metadata: DataPanelMetadata,\n Meta: DataPanelMeta,\n CloseButton: DataPanelCloseButton,\n CopyId: DataPanelCopyId,\n NextPrevNav: DataPanelNextPrevNav,\n LoadingData: DataPanelLoadingData,\n NoData: DataPanelNoData,\n Content: DataPanelContent,\n CodeSection: DataCodeSection,\n SectionHeading: DataPanelSectionHeading,\n});\n"],"names":["jsx","Button","cn","XIcon","ArrowLeftIcon","createContext","useContext","DrawerPrimitive","useCopyToClipboard","useState","Tooltip","TooltipTrigger","truncateString","TooltipContent","Children","jsxs","Fragment","controlSizeClasses","Spinner","tooltip","controlStateColorTransition","quietTextHover","Icon","transitions","ArrowUpIcon","ArrowDownIcon","Txt","React","frameSurfaceStyle","PortalContainerProvider","frameFillStyle","DataCodeSection","DataPanelSectionHeading"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { startOfDay, format, parse, isValid } from 'date-fns';
5
5
  import { B as Button } from './Button-D8a5EWJ5.js';
6
6
  import { D as DatePicker } from './date-picker-D2jMzekn.js';
7
7
  import { T as TimePicker } from './time-picker-D1VsACkg.js';
8
- import { F as Field, c as FieldError } from './field-Dl1zeXTv.js';
8
+ import { F as Field, c as FieldError } from './field-CfA5-ixH.js';
9
9
  import './field-control-aria-DB6y41tQ.js';
10
10
  import { T as Txt } from './Txt-BtIGLRk1.js';
11
11
  import { c as cn } from './cn-CQUhN5Jx.js';
@@ -231,4 +231,4 @@ function DateTimeRangePicker({
231
231
  }
232
232
 
233
233
  export { DateTimeRangePicker as D };
234
- //# sourceMappingURL=date-time-range-picker-BB6ivHR-.js.map
234
+ //# sourceMappingURL=date-time-range-picker-BnYWCqei.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"date-time-range-picker-BB6ivHR-.js","sources":["../src/ds/components/DateTimeRangePicker/custom-range-editor.tsx","../src/ds/components/DateTimeRangePicker/date-time-range-picker.tsx"],"sourcesContent":["import { format, isValid, parse, startOfDay } from 'date-fns';\nimport { Check } from 'lucide-react';\nimport { useId, useState } from 'react';\nimport { Button } from '@/ds/components/Button/Button';\nimport { DatePicker, TimePicker } from '@/ds/components/DateTimePicker';\nimport { Field, FieldError } from '@/ds/components/Field';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nfunction formatDays(ms: number): string {\n const days = Math.round(ms / (24 * 60 * 60 * 1000));\n return `${days} day${days === 1 ? '' : 's'}`;\n}\n\n/** The draft day at the draft time, or the bare day when the time doesn't parse. */\nfunction combineDateAndTime(date: Date | undefined, timeStr: string): Date | undefined {\n if (!date) return undefined;\n const dateOnly = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n const combined = parse(timeStr, 'h:mm a', dateOnly);\n return isValid(combined) ? combined : date;\n}\n\nexport interface CustomRangeEditorProps {\n dateFrom?: Date;\n dateTo?: Date;\n disabled?: boolean;\n /** Widest range that can be applied, in milliseconds. */\n maxRangeMs?: number;\n /** Earliest day a range can start on. Days before it are disabled. */\n minDate?: Date;\n onApply: (from: Date | undefined, to: Date | undefined) => void;\n onShowPresets: () => void;\n}\n\n/**\n * The custom range popover body. It mounts each time the popover opens, so its drafts\n * start from the current range without the picker resetting them.\n */\nexport function CustomRangeEditor({\n dateFrom,\n dateTo,\n disabled,\n maxRangeMs,\n minDate,\n onApply,\n onShowPresets,\n}: CustomRangeEditorProps) {\n const [draftDateFrom, setDraftDateFrom] = useState<Date | undefined>(dateFrom);\n const [draftDateTo, setDraftDateTo] = useState<Date | undefined>(dateTo);\n const [draftTimeFrom, setDraftTimeFrom] = useState('12:00 AM');\n const [draftTimeTo, setDraftTimeTo] = useState('11:59 PM');\n const [applyAttempted, setApplyAttempted] = useState(false);\n const errorId = useId();\n\n const fromDate = combineDateAndTime(draftDateFrom, draftTimeFrom);\n const toDate = combineDateAndTime(draftDateTo, draftTimeTo);\n const rangeReversed = fromDate !== undefined && toDate !== undefined && fromDate.getTime() > toDate.getTime();\n const rangeTooWide =\n fromDate !== undefined && toDate !== undefined && toDate.getTime() - fromDate.getTime() > (maxRangeMs ?? Infinity);\n const firstDay = minDate ? startOfDay(minDate) : undefined;\n const endFirstDay = draftDateFrom && (!firstDay || draftDateFrom > firstDay) ? draftDateFrom : firstDay;\n const rangeTooEarly = fromDate !== undefined && firstDay !== undefined && fromDate < firstDay;\n const rangeInvalid = rangeReversed || rangeTooWide || rangeTooEarly;\n // Shown after a failed Apply, and gone as soon as the drafts form a valid range again.\n let error: string | undefined;\n if (applyAttempted && rangeReversed) error = 'Start date/time must be before end date/time';\n else if (applyAttempted && rangeTooWide) error = `Range cannot be longer than ${formatDays(maxRangeMs ?? 0)}`;\n else if (applyAttempted && firstDay && rangeTooEarly)\n error = `Range cannot start before ${format(firstDay, 'MMM d, yyyy')}`;\n\n const apply = () => {\n if (rangeInvalid) {\n setApplyAttempted(true);\n return;\n }\n onApply(fromDate, toDate);\n };\n\n return (\n <>\n <div\n role=\"group\"\n aria-label=\"Custom date range\"\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? errorId : undefined}\n className=\"flex\"\n >\n <div className={cn('border-r border-border')}>\n <Txt as=\"span\" variant=\"column\" tone=\"muted\" className=\"block px-4 pt-3\">\n Start\n </Txt>\n <DatePicker\n mode=\"single\"\n selected={draftDateFrom}\n month={draftDateFrom}\n onSelect={setDraftDateFrom}\n disabled={disabled}\n fromDate={firstDay}\n toDate={draftDateTo}\n />\n <TimePicker\n label=\"Start time\"\n className=\"mx-4 mb-3 w-auto\"\n defaultValue={draftTimeFrom}\n onValueChange={v => {\n if (!disabled) setDraftTimeFrom(v);\n }}\n />\n </div>\n <div>\n <Txt as=\"span\" variant=\"column\" tone=\"muted\" className=\"block px-4 pt-3\">\n End\n </Txt>\n <DatePicker\n mode=\"single\"\n selected={draftDateTo}\n month={draftDateTo}\n onSelect={setDraftDateTo}\n disabled={disabled}\n fromDate={endFirstDay}\n />\n <TimePicker\n label=\"End time\"\n className=\"mx-4 mb-3 w-auto\"\n defaultValue={draftTimeTo}\n onValueChange={v => {\n if (!disabled) setDraftTimeTo(v);\n }}\n />\n </div>\n </div>\n <Field invalid={Boolean(error)}>\n <FieldError id={errorId} className=\"px-4 pb-1\">\n {error}\n </FieldError>\n </Field>\n <div className={cn('flex items-center justify-between px-4 pb-3')}>\n <Button variant=\"ghost\" size=\"sm\" disabled={disabled} onClick={onShowPresets}>\n &larr; Presets\n </Button>\n <Button icon={<Check />} variant=\"primary\" size=\"sm\" onClick={apply} disabled={disabled}>\n Apply\n </Button>\n </div>\n </>\n );\n}\n","import { CalendarIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport type { ReactElement } from 'react';\nimport { CustomRangeEditor } from './custom-range-editor';\nimport { Button } from '@/ds/components/Button/Button';\nimport type { ButtonProps } from '@/ds/components/Button/Button';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu/dropdown-menu';\nimport { Popover, PopoverTrigger, PopoverContent } from '@/ds/components/Popover/popover';\nimport { cn } from '@/lib/utils';\n\nexport type DateRangePreset = 'all' | 'last-24h' | 'last-3d' | 'last-7d' | 'last-14d' | 'last-30d' | 'custom';\n\nconst DATE_PRESETS: { value: DateRangePreset; label: string; ms?: number }[] = [\n { value: 'all', label: 'All' },\n { value: 'last-24h', label: 'Last 24 hours', ms: 24 * 60 * 60 * 1000 },\n { value: 'last-3d', label: 'Last 3 days', ms: 3 * 24 * 60 * 60 * 1000 },\n { value: 'last-7d', label: 'Last 7 days', ms: 7 * 24 * 60 * 60 * 1000 },\n { value: 'last-14d', label: 'Last 14 days', ms: 14 * 24 * 60 * 60 * 1000 },\n { value: 'last-30d', label: 'Last 30 days', ms: 30 * 24 * 60 * 60 * 1000 },\n { value: 'custom', label: 'Custom range...' },\n];\n\nexport interface DateTimeRangePickerProps {\n preset?: DateRangePreset;\n onPresetChange?: (preset: DateRangePreset) => void;\n dateFrom?: Date;\n dateTo?: Date;\n onDateChange?: (value: Date | undefined, type: 'from' | 'to') => void;\n /**\n * Called once with both ends when a custom range is applied. When provided it replaces\n * the two `onDateChange` calls for that step, so consumers can write the range atomically.\n */\n onDateRangeChange?: (from: Date | undefined, to: Date | undefined) => void;\n disabled?: boolean;\n /** Widest custom range that can be applied, in milliseconds. Presets are unaffected. */\n maxRangeMs?: number;\n /** Earliest day a custom range can start on, e.g. the oldest data still kept. Earlier days are disabled. */\n minDate?: Date;\n /** Subset of presets to show. If omitted, all presets are shown. */\n presets?: readonly DateRangePreset[];\n /** Size passed through to the trigger Button. Defaults to 'md'. */\n size?: ButtonProps['size'];\n /**\n * Replace the default Button trigger. Receives the current label (preset name or\n * custom range) and must return an element the menu/popover can attach to.\n */\n renderTrigger?: (props: { label: string; disabled?: boolean }) => ReactElement;\n}\n\nexport function DateTimeRangePicker({\n preset = 'all',\n onPresetChange,\n dateFrom,\n dateTo,\n onDateChange,\n onDateRangeChange,\n disabled,\n maxRangeMs,\n minDate,\n presets,\n size = 'md',\n renderTrigger,\n}: DateTimeRangePickerProps) {\n const visiblePresets = presets ? DATE_PRESETS.filter(p => presets.includes(p.value)) : DATE_PRESETS;\n const [customRangeOpen, setCustomRangeOpen] = useState(false);\n const [presetMenuOpen, setPresetMenuOpen] = useState(false);\n // The preset active before \"Custom range...\" was picked, until a range is applied.\n // \"← Presets\" restores it instead of jumping to the first preset in the list.\n const [presetBeforeCustom, setPresetBeforeCustom] = useState<DateRangePreset | undefined>();\n\n // \"← Presets\" restores the previous preset through the parent, which may apply it a\n // render later (e.g. a router URL update). Show it right away instead of \"custom\".\n const restoringPreset = presetMenuOpen && preset === 'custom' ? presetBeforeCustom : undefined;\n const shownPreset = restoringPreset ?? preset;\n const datePresetLabel = DATE_PRESETS.find(p => p.value === shownPreset)?.label ?? 'All';\n\n const applyPreset = (value: DateRangePreset) => {\n onPresetChange?.(value);\n const entry = DATE_PRESETS.find(p => p.value === value);\n if (entry?.ms) {\n onDateChange?.(new Date(Date.now() - entry.ms), 'from');\n onDateChange?.(undefined, 'to');\n } else {\n onDateChange?.(undefined, 'from');\n onDateChange?.(undefined, 'to');\n }\n };\n\n const handlePresetSelect = (value: DateRangePreset) => {\n setPresetMenuOpen(false);\n if (value === 'custom') {\n if (preset !== 'custom') setPresetBeforeCustom(preset);\n onPresetChange?.(value);\n setCustomRangeOpen(true);\n return;\n }\n setPresetBeforeCustom(undefined);\n applyPreset(value);\n };\n\n const applyCustomRange = (fromDate: Date | undefined, toDate: Date | undefined) => {\n if (onDateRangeChange) {\n onDateRangeChange(fromDate, toDate);\n } else {\n onDateChange?.(fromDate, 'from');\n onDateChange?.(toDate, 'to');\n }\n setPresetBeforeCustom(undefined);\n setCustomRangeOpen(false);\n };\n\n // Back to the preset list. Restores the preset the user came from; an applied custom\n // range matches no preset, so it stays and the list shows \"Custom range...\" as current.\n const showPresets = () => {\n setCustomRangeOpen(false);\n if (presetBeforeCustom) applyPreset(presetBeforeCustom);\n setPresetMenuOpen(true);\n };\n\n const customLabel = `${dateFrom ? dateFrom.toLocaleDateString() : 'Start'} \\u2013 ${dateTo ? dateTo.toLocaleDateString() : 'End'}`;\n\n if (shownPreset === 'custom' && !presetMenuOpen) {\n return (\n <Popover open={customRangeOpen} onOpenChange={setCustomRangeOpen}>\n {renderTrigger ? (\n <PopoverTrigger render={renderTrigger({ label: customLabel, disabled })} />\n ) : (\n <PopoverTrigger asChild>\n <Button size={size} disabled={disabled} icon={<CalendarIcon />}>\n {customLabel}\n </Button>\n </PopoverTrigger>\n )}\n <PopoverContent align=\"start\" className={cn('w-auto p-0')}>\n <CustomRangeEditor\n dateFrom={dateFrom}\n dateTo={dateTo}\n disabled={disabled}\n maxRangeMs={maxRangeMs}\n minDate={minDate}\n onApply={applyCustomRange}\n onShowPresets={showPresets}\n />\n </PopoverContent>\n </Popover>\n );\n }\n\n const triggerLabel = shownPreset === 'custom' ? customLabel : datePresetLabel;\n\n return (\n <DropdownMenu open={presetMenuOpen} onOpenChange={setPresetMenuOpen}>\n {renderTrigger ? (\n <DropdownMenu.Trigger render={renderTrigger({ label: triggerLabel, disabled })} />\n ) : (\n <DropdownMenu.Trigger asChild>\n <Button size={size} disabled={disabled} icon={<CalendarIcon />}>\n {triggerLabel}\n </Button>\n </DropdownMenu.Trigger>\n )}\n <DropdownMenu.Content align=\"start\">\n {/* Items select on click (not onValueChange) so re-picking the checked\n \"Custom range...\" still reopens the range editor. */}\n <DropdownMenu.RadioGroup value={shownPreset}>\n {visiblePresets.map(p => (\n <DropdownMenu.RadioItem\n key={p.value}\n value={p.value}\n closeOnClick\n onClick={() => handlePresetSelect(p.value)}\n >\n {p.label}\n </DropdownMenu.RadioItem>\n ))}\n </DropdownMenu.RadioGroup>\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"date-time-range-picker-BnYWCqei.js","sources":["../src/ds/components/DateTimeRangePicker/custom-range-editor.tsx","../src/ds/components/DateTimeRangePicker/date-time-range-picker.tsx"],"sourcesContent":["import { format, isValid, parse, startOfDay } from 'date-fns';\nimport { Check } from 'lucide-react';\nimport { useId, useState } from 'react';\nimport { Button } from '@/ds/components/Button/Button';\nimport { DatePicker, TimePicker } from '@/ds/components/DateTimePicker';\nimport { Field, FieldError } from '@/ds/components/Field';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nfunction formatDays(ms: number): string {\n const days = Math.round(ms / (24 * 60 * 60 * 1000));\n return `${days} day${days === 1 ? '' : 's'}`;\n}\n\n/** The draft day at the draft time, or the bare day when the time doesn't parse. */\nfunction combineDateAndTime(date: Date | undefined, timeStr: string): Date | undefined {\n if (!date) return undefined;\n const dateOnly = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n const combined = parse(timeStr, 'h:mm a', dateOnly);\n return isValid(combined) ? combined : date;\n}\n\nexport interface CustomRangeEditorProps {\n dateFrom?: Date;\n dateTo?: Date;\n disabled?: boolean;\n /** Widest range that can be applied, in milliseconds. */\n maxRangeMs?: number;\n /** Earliest day a range can start on. Days before it are disabled. */\n minDate?: Date;\n onApply: (from: Date | undefined, to: Date | undefined) => void;\n onShowPresets: () => void;\n}\n\n/**\n * The custom range popover body. It mounts each time the popover opens, so its drafts\n * start from the current range without the picker resetting them.\n */\nexport function CustomRangeEditor({\n dateFrom,\n dateTo,\n disabled,\n maxRangeMs,\n minDate,\n onApply,\n onShowPresets,\n}: CustomRangeEditorProps) {\n const [draftDateFrom, setDraftDateFrom] = useState<Date | undefined>(dateFrom);\n const [draftDateTo, setDraftDateTo] = useState<Date | undefined>(dateTo);\n const [draftTimeFrom, setDraftTimeFrom] = useState('12:00 AM');\n const [draftTimeTo, setDraftTimeTo] = useState('11:59 PM');\n const [applyAttempted, setApplyAttempted] = useState(false);\n const errorId = useId();\n\n const fromDate = combineDateAndTime(draftDateFrom, draftTimeFrom);\n const toDate = combineDateAndTime(draftDateTo, draftTimeTo);\n const rangeReversed = fromDate !== undefined && toDate !== undefined && fromDate.getTime() > toDate.getTime();\n const rangeTooWide =\n fromDate !== undefined && toDate !== undefined && toDate.getTime() - fromDate.getTime() > (maxRangeMs ?? Infinity);\n const firstDay = minDate ? startOfDay(minDate) : undefined;\n const endFirstDay = draftDateFrom && (!firstDay || draftDateFrom > firstDay) ? draftDateFrom : firstDay;\n const rangeTooEarly = fromDate !== undefined && firstDay !== undefined && fromDate < firstDay;\n const rangeInvalid = rangeReversed || rangeTooWide || rangeTooEarly;\n // Shown after a failed Apply, and gone as soon as the drafts form a valid range again.\n let error: string | undefined;\n if (applyAttempted && rangeReversed) error = 'Start date/time must be before end date/time';\n else if (applyAttempted && rangeTooWide) error = `Range cannot be longer than ${formatDays(maxRangeMs ?? 0)}`;\n else if (applyAttempted && firstDay && rangeTooEarly)\n error = `Range cannot start before ${format(firstDay, 'MMM d, yyyy')}`;\n\n const apply = () => {\n if (rangeInvalid) {\n setApplyAttempted(true);\n return;\n }\n onApply(fromDate, toDate);\n };\n\n return (\n <>\n <div\n role=\"group\"\n aria-label=\"Custom date range\"\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? errorId : undefined}\n className=\"flex\"\n >\n <div className={cn('border-r border-border')}>\n <Txt as=\"span\" variant=\"column\" tone=\"muted\" className=\"block px-4 pt-3\">\n Start\n </Txt>\n <DatePicker\n mode=\"single\"\n selected={draftDateFrom}\n month={draftDateFrom}\n onSelect={setDraftDateFrom}\n disabled={disabled}\n fromDate={firstDay}\n toDate={draftDateTo}\n />\n <TimePicker\n label=\"Start time\"\n className=\"mx-4 mb-3 w-auto\"\n defaultValue={draftTimeFrom}\n onValueChange={v => {\n if (!disabled) setDraftTimeFrom(v);\n }}\n />\n </div>\n <div>\n <Txt as=\"span\" variant=\"column\" tone=\"muted\" className=\"block px-4 pt-3\">\n End\n </Txt>\n <DatePicker\n mode=\"single\"\n selected={draftDateTo}\n month={draftDateTo}\n onSelect={setDraftDateTo}\n disabled={disabled}\n fromDate={endFirstDay}\n />\n <TimePicker\n label=\"End time\"\n className=\"mx-4 mb-3 w-auto\"\n defaultValue={draftTimeTo}\n onValueChange={v => {\n if (!disabled) setDraftTimeTo(v);\n }}\n />\n </div>\n </div>\n <Field invalid={Boolean(error)}>\n <FieldError id={errorId} className=\"px-4 pb-1\">\n {error}\n </FieldError>\n </Field>\n <div className={cn('flex items-center justify-between px-4 pb-3')}>\n <Button variant=\"ghost\" size=\"sm\" disabled={disabled} onClick={onShowPresets}>\n &larr; Presets\n </Button>\n <Button icon={<Check />} variant=\"primary\" size=\"sm\" onClick={apply} disabled={disabled}>\n Apply\n </Button>\n </div>\n </>\n );\n}\n","import { CalendarIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport type { ReactElement } from 'react';\nimport { CustomRangeEditor } from './custom-range-editor';\nimport { Button } from '@/ds/components/Button/Button';\nimport type { ButtonProps } from '@/ds/components/Button/Button';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu/dropdown-menu';\nimport { Popover, PopoverTrigger, PopoverContent } from '@/ds/components/Popover/popover';\nimport { cn } from '@/lib/utils';\n\nexport type DateRangePreset = 'all' | 'last-24h' | 'last-3d' | 'last-7d' | 'last-14d' | 'last-30d' | 'custom';\n\nconst DATE_PRESETS: { value: DateRangePreset; label: string; ms?: number }[] = [\n { value: 'all', label: 'All' },\n { value: 'last-24h', label: 'Last 24 hours', ms: 24 * 60 * 60 * 1000 },\n { value: 'last-3d', label: 'Last 3 days', ms: 3 * 24 * 60 * 60 * 1000 },\n { value: 'last-7d', label: 'Last 7 days', ms: 7 * 24 * 60 * 60 * 1000 },\n { value: 'last-14d', label: 'Last 14 days', ms: 14 * 24 * 60 * 60 * 1000 },\n { value: 'last-30d', label: 'Last 30 days', ms: 30 * 24 * 60 * 60 * 1000 },\n { value: 'custom', label: 'Custom range...' },\n];\n\nexport interface DateTimeRangePickerProps {\n preset?: DateRangePreset;\n onPresetChange?: (preset: DateRangePreset) => void;\n dateFrom?: Date;\n dateTo?: Date;\n onDateChange?: (value: Date | undefined, type: 'from' | 'to') => void;\n /**\n * Called once with both ends when a custom range is applied. When provided it replaces\n * the two `onDateChange` calls for that step, so consumers can write the range atomically.\n */\n onDateRangeChange?: (from: Date | undefined, to: Date | undefined) => void;\n disabled?: boolean;\n /** Widest custom range that can be applied, in milliseconds. Presets are unaffected. */\n maxRangeMs?: number;\n /** Earliest day a custom range can start on, e.g. the oldest data still kept. Earlier days are disabled. */\n minDate?: Date;\n /** Subset of presets to show. If omitted, all presets are shown. */\n presets?: readonly DateRangePreset[];\n /** Size passed through to the trigger Button. Defaults to 'md'. */\n size?: ButtonProps['size'];\n /**\n * Replace the default Button trigger. Receives the current label (preset name or\n * custom range) and must return an element the menu/popover can attach to.\n */\n renderTrigger?: (props: { label: string; disabled?: boolean }) => ReactElement;\n}\n\nexport function DateTimeRangePicker({\n preset = 'all',\n onPresetChange,\n dateFrom,\n dateTo,\n onDateChange,\n onDateRangeChange,\n disabled,\n maxRangeMs,\n minDate,\n presets,\n size = 'md',\n renderTrigger,\n}: DateTimeRangePickerProps) {\n const visiblePresets = presets ? DATE_PRESETS.filter(p => presets.includes(p.value)) : DATE_PRESETS;\n const [customRangeOpen, setCustomRangeOpen] = useState(false);\n const [presetMenuOpen, setPresetMenuOpen] = useState(false);\n // The preset active before \"Custom range...\" was picked, until a range is applied.\n // \"← Presets\" restores it instead of jumping to the first preset in the list.\n const [presetBeforeCustom, setPresetBeforeCustom] = useState<DateRangePreset | undefined>();\n\n // \"← Presets\" restores the previous preset through the parent, which may apply it a\n // render later (e.g. a router URL update). Show it right away instead of \"custom\".\n const restoringPreset = presetMenuOpen && preset === 'custom' ? presetBeforeCustom : undefined;\n const shownPreset = restoringPreset ?? preset;\n const datePresetLabel = DATE_PRESETS.find(p => p.value === shownPreset)?.label ?? 'All';\n\n const applyPreset = (value: DateRangePreset) => {\n onPresetChange?.(value);\n const entry = DATE_PRESETS.find(p => p.value === value);\n if (entry?.ms) {\n onDateChange?.(new Date(Date.now() - entry.ms), 'from');\n onDateChange?.(undefined, 'to');\n } else {\n onDateChange?.(undefined, 'from');\n onDateChange?.(undefined, 'to');\n }\n };\n\n const handlePresetSelect = (value: DateRangePreset) => {\n setPresetMenuOpen(false);\n if (value === 'custom') {\n if (preset !== 'custom') setPresetBeforeCustom(preset);\n onPresetChange?.(value);\n setCustomRangeOpen(true);\n return;\n }\n setPresetBeforeCustom(undefined);\n applyPreset(value);\n };\n\n const applyCustomRange = (fromDate: Date | undefined, toDate: Date | undefined) => {\n if (onDateRangeChange) {\n onDateRangeChange(fromDate, toDate);\n } else {\n onDateChange?.(fromDate, 'from');\n onDateChange?.(toDate, 'to');\n }\n setPresetBeforeCustom(undefined);\n setCustomRangeOpen(false);\n };\n\n // Back to the preset list. Restores the preset the user came from; an applied custom\n // range matches no preset, so it stays and the list shows \"Custom range...\" as current.\n const showPresets = () => {\n setCustomRangeOpen(false);\n if (presetBeforeCustom) applyPreset(presetBeforeCustom);\n setPresetMenuOpen(true);\n };\n\n const customLabel = `${dateFrom ? dateFrom.toLocaleDateString() : 'Start'} \\u2013 ${dateTo ? dateTo.toLocaleDateString() : 'End'}`;\n\n if (shownPreset === 'custom' && !presetMenuOpen) {\n return (\n <Popover open={customRangeOpen} onOpenChange={setCustomRangeOpen}>\n {renderTrigger ? (\n <PopoverTrigger render={renderTrigger({ label: customLabel, disabled })} />\n ) : (\n <PopoverTrigger asChild>\n <Button size={size} disabled={disabled} icon={<CalendarIcon />}>\n {customLabel}\n </Button>\n </PopoverTrigger>\n )}\n <PopoverContent align=\"start\" className={cn('w-auto p-0')}>\n <CustomRangeEditor\n dateFrom={dateFrom}\n dateTo={dateTo}\n disabled={disabled}\n maxRangeMs={maxRangeMs}\n minDate={minDate}\n onApply={applyCustomRange}\n onShowPresets={showPresets}\n />\n </PopoverContent>\n </Popover>\n );\n }\n\n const triggerLabel = shownPreset === 'custom' ? customLabel : datePresetLabel;\n\n return (\n <DropdownMenu open={presetMenuOpen} onOpenChange={setPresetMenuOpen}>\n {renderTrigger ? (\n <DropdownMenu.Trigger render={renderTrigger({ label: triggerLabel, disabled })} />\n ) : (\n <DropdownMenu.Trigger asChild>\n <Button size={size} disabled={disabled} icon={<CalendarIcon />}>\n {triggerLabel}\n </Button>\n </DropdownMenu.Trigger>\n )}\n <DropdownMenu.Content align=\"start\">\n {/* Items select on click (not onValueChange) so re-picking the checked\n \"Custom range...\" still reopens the range editor. */}\n <DropdownMenu.RadioGroup value={shownPreset}>\n {visiblePresets.map(p => (\n <DropdownMenu.RadioItem\n key={p.value}\n value={p.value}\n closeOnClick\n onClick={() => handlePresetSelect(p.value)}\n >\n {p.label}\n </DropdownMenu.RadioItem>\n ))}\n </DropdownMenu.RadioGroup>\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ const dateFns = require('date-fns');
7
7
  const Button = require('./Button-C4I05uT4.cjs');
8
8
  const datePicker = require('./date-picker-CeJkb3uq.cjs');
9
9
  const timePicker = require('./time-picker-BGtAkRRp.cjs');
10
- const field = require('./field-BCU5ZtWV.cjs');
10
+ const field = require('./field-CZ5fldpM.cjs');
11
11
  require('./field-control-aria-WzMGs0A4.cjs');
12
12
  const Txt = require('./Txt-CIS2G5Jx.cjs');
13
13
  const utils_cn = require('./cn-DlOJCxrS.cjs');
@@ -233,4 +233,4 @@ function DateTimeRangePicker({
233
233
  }
234
234
 
235
235
  exports.DateTimeRangePicker = DateTimeRangePicker;
236
- //# sourceMappingURL=date-time-range-picker-ExPgeHV_.cjs.map
236
+ //# sourceMappingURL=date-time-range-picker-_2RJBOUn.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"date-time-range-picker-ExPgeHV_.cjs","sources":["../src/ds/components/DateTimeRangePicker/custom-range-editor.tsx","../src/ds/components/DateTimeRangePicker/date-time-range-picker.tsx"],"sourcesContent":["import { format, isValid, parse, startOfDay } from 'date-fns';\nimport { Check } from 'lucide-react';\nimport { useId, useState } from 'react';\nimport { Button } from '@/ds/components/Button/Button';\nimport { DatePicker, TimePicker } from '@/ds/components/DateTimePicker';\nimport { Field, FieldError } from '@/ds/components/Field';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nfunction formatDays(ms: number): string {\n const days = Math.round(ms / (24 * 60 * 60 * 1000));\n return `${days} day${days === 1 ? '' : 's'}`;\n}\n\n/** The draft day at the draft time, or the bare day when the time doesn't parse. */\nfunction combineDateAndTime(date: Date | undefined, timeStr: string): Date | undefined {\n if (!date) return undefined;\n const dateOnly = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n const combined = parse(timeStr, 'h:mm a', dateOnly);\n return isValid(combined) ? combined : date;\n}\n\nexport interface CustomRangeEditorProps {\n dateFrom?: Date;\n dateTo?: Date;\n disabled?: boolean;\n /** Widest range that can be applied, in milliseconds. */\n maxRangeMs?: number;\n /** Earliest day a range can start on. Days before it are disabled. */\n minDate?: Date;\n onApply: (from: Date | undefined, to: Date | undefined) => void;\n onShowPresets: () => void;\n}\n\n/**\n * The custom range popover body. It mounts each time the popover opens, so its drafts\n * start from the current range without the picker resetting them.\n */\nexport function CustomRangeEditor({\n dateFrom,\n dateTo,\n disabled,\n maxRangeMs,\n minDate,\n onApply,\n onShowPresets,\n}: CustomRangeEditorProps) {\n const [draftDateFrom, setDraftDateFrom] = useState<Date | undefined>(dateFrom);\n const [draftDateTo, setDraftDateTo] = useState<Date | undefined>(dateTo);\n const [draftTimeFrom, setDraftTimeFrom] = useState('12:00 AM');\n const [draftTimeTo, setDraftTimeTo] = useState('11:59 PM');\n const [applyAttempted, setApplyAttempted] = useState(false);\n const errorId = useId();\n\n const fromDate = combineDateAndTime(draftDateFrom, draftTimeFrom);\n const toDate = combineDateAndTime(draftDateTo, draftTimeTo);\n const rangeReversed = fromDate !== undefined && toDate !== undefined && fromDate.getTime() > toDate.getTime();\n const rangeTooWide =\n fromDate !== undefined && toDate !== undefined && toDate.getTime() - fromDate.getTime() > (maxRangeMs ?? Infinity);\n const firstDay = minDate ? startOfDay(minDate) : undefined;\n const endFirstDay = draftDateFrom && (!firstDay || draftDateFrom > firstDay) ? draftDateFrom : firstDay;\n const rangeTooEarly = fromDate !== undefined && firstDay !== undefined && fromDate < firstDay;\n const rangeInvalid = rangeReversed || rangeTooWide || rangeTooEarly;\n // Shown after a failed Apply, and gone as soon as the drafts form a valid range again.\n let error: string | undefined;\n if (applyAttempted && rangeReversed) error = 'Start date/time must be before end date/time';\n else if (applyAttempted && rangeTooWide) error = `Range cannot be longer than ${formatDays(maxRangeMs ?? 0)}`;\n else if (applyAttempted && firstDay && rangeTooEarly)\n error = `Range cannot start before ${format(firstDay, 'MMM d, yyyy')}`;\n\n const apply = () => {\n if (rangeInvalid) {\n setApplyAttempted(true);\n return;\n }\n onApply(fromDate, toDate);\n };\n\n return (\n <>\n <div\n role=\"group\"\n aria-label=\"Custom date range\"\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? errorId : undefined}\n className=\"flex\"\n >\n <div className={cn('border-r border-border')}>\n <Txt as=\"span\" variant=\"column\" tone=\"muted\" className=\"block px-4 pt-3\">\n Start\n </Txt>\n <DatePicker\n mode=\"single\"\n selected={draftDateFrom}\n month={draftDateFrom}\n onSelect={setDraftDateFrom}\n disabled={disabled}\n fromDate={firstDay}\n toDate={draftDateTo}\n />\n <TimePicker\n label=\"Start time\"\n className=\"mx-4 mb-3 w-auto\"\n defaultValue={draftTimeFrom}\n onValueChange={v => {\n if (!disabled) setDraftTimeFrom(v);\n }}\n />\n </div>\n <div>\n <Txt as=\"span\" variant=\"column\" tone=\"muted\" className=\"block px-4 pt-3\">\n End\n </Txt>\n <DatePicker\n mode=\"single\"\n selected={draftDateTo}\n month={draftDateTo}\n onSelect={setDraftDateTo}\n disabled={disabled}\n fromDate={endFirstDay}\n />\n <TimePicker\n label=\"End time\"\n className=\"mx-4 mb-3 w-auto\"\n defaultValue={draftTimeTo}\n onValueChange={v => {\n if (!disabled) setDraftTimeTo(v);\n }}\n />\n </div>\n </div>\n <Field invalid={Boolean(error)}>\n <FieldError id={errorId} className=\"px-4 pb-1\">\n {error}\n </FieldError>\n </Field>\n <div className={cn('flex items-center justify-between px-4 pb-3')}>\n <Button variant=\"ghost\" size=\"sm\" disabled={disabled} onClick={onShowPresets}>\n &larr; Presets\n </Button>\n <Button icon={<Check />} variant=\"primary\" size=\"sm\" onClick={apply} disabled={disabled}>\n Apply\n </Button>\n </div>\n </>\n );\n}\n","import { CalendarIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport type { ReactElement } from 'react';\nimport { CustomRangeEditor } from './custom-range-editor';\nimport { Button } from '@/ds/components/Button/Button';\nimport type { ButtonProps } from '@/ds/components/Button/Button';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu/dropdown-menu';\nimport { Popover, PopoverTrigger, PopoverContent } from '@/ds/components/Popover/popover';\nimport { cn } from '@/lib/utils';\n\nexport type DateRangePreset = 'all' | 'last-24h' | 'last-3d' | 'last-7d' | 'last-14d' | 'last-30d' | 'custom';\n\nconst DATE_PRESETS: { value: DateRangePreset; label: string; ms?: number }[] = [\n { value: 'all', label: 'All' },\n { value: 'last-24h', label: 'Last 24 hours', ms: 24 * 60 * 60 * 1000 },\n { value: 'last-3d', label: 'Last 3 days', ms: 3 * 24 * 60 * 60 * 1000 },\n { value: 'last-7d', label: 'Last 7 days', ms: 7 * 24 * 60 * 60 * 1000 },\n { value: 'last-14d', label: 'Last 14 days', ms: 14 * 24 * 60 * 60 * 1000 },\n { value: 'last-30d', label: 'Last 30 days', ms: 30 * 24 * 60 * 60 * 1000 },\n { value: 'custom', label: 'Custom range...' },\n];\n\nexport interface DateTimeRangePickerProps {\n preset?: DateRangePreset;\n onPresetChange?: (preset: DateRangePreset) => void;\n dateFrom?: Date;\n dateTo?: Date;\n onDateChange?: (value: Date | undefined, type: 'from' | 'to') => void;\n /**\n * Called once with both ends when a custom range is applied. When provided it replaces\n * the two `onDateChange` calls for that step, so consumers can write the range atomically.\n */\n onDateRangeChange?: (from: Date | undefined, to: Date | undefined) => void;\n disabled?: boolean;\n /** Widest custom range that can be applied, in milliseconds. Presets are unaffected. */\n maxRangeMs?: number;\n /** Earliest day a custom range can start on, e.g. the oldest data still kept. Earlier days are disabled. */\n minDate?: Date;\n /** Subset of presets to show. If omitted, all presets are shown. */\n presets?: readonly DateRangePreset[];\n /** Size passed through to the trigger Button. Defaults to 'md'. */\n size?: ButtonProps['size'];\n /**\n * Replace the default Button trigger. Receives the current label (preset name or\n * custom range) and must return an element the menu/popover can attach to.\n */\n renderTrigger?: (props: { label: string; disabled?: boolean }) => ReactElement;\n}\n\nexport function DateTimeRangePicker({\n preset = 'all',\n onPresetChange,\n dateFrom,\n dateTo,\n onDateChange,\n onDateRangeChange,\n disabled,\n maxRangeMs,\n minDate,\n presets,\n size = 'md',\n renderTrigger,\n}: DateTimeRangePickerProps) {\n const visiblePresets = presets ? DATE_PRESETS.filter(p => presets.includes(p.value)) : DATE_PRESETS;\n const [customRangeOpen, setCustomRangeOpen] = useState(false);\n const [presetMenuOpen, setPresetMenuOpen] = useState(false);\n // The preset active before \"Custom range...\" was picked, until a range is applied.\n // \"← Presets\" restores it instead of jumping to the first preset in the list.\n const [presetBeforeCustom, setPresetBeforeCustom] = useState<DateRangePreset | undefined>();\n\n // \"← Presets\" restores the previous preset through the parent, which may apply it a\n // render later (e.g. a router URL update). Show it right away instead of \"custom\".\n const restoringPreset = presetMenuOpen && preset === 'custom' ? presetBeforeCustom : undefined;\n const shownPreset = restoringPreset ?? preset;\n const datePresetLabel = DATE_PRESETS.find(p => p.value === shownPreset)?.label ?? 'All';\n\n const applyPreset = (value: DateRangePreset) => {\n onPresetChange?.(value);\n const entry = DATE_PRESETS.find(p => p.value === value);\n if (entry?.ms) {\n onDateChange?.(new Date(Date.now() - entry.ms), 'from');\n onDateChange?.(undefined, 'to');\n } else {\n onDateChange?.(undefined, 'from');\n onDateChange?.(undefined, 'to');\n }\n };\n\n const handlePresetSelect = (value: DateRangePreset) => {\n setPresetMenuOpen(false);\n if (value === 'custom') {\n if (preset !== 'custom') setPresetBeforeCustom(preset);\n onPresetChange?.(value);\n setCustomRangeOpen(true);\n return;\n }\n setPresetBeforeCustom(undefined);\n applyPreset(value);\n };\n\n const applyCustomRange = (fromDate: Date | undefined, toDate: Date | undefined) => {\n if (onDateRangeChange) {\n onDateRangeChange(fromDate, toDate);\n } else {\n onDateChange?.(fromDate, 'from');\n onDateChange?.(toDate, 'to');\n }\n setPresetBeforeCustom(undefined);\n setCustomRangeOpen(false);\n };\n\n // Back to the preset list. Restores the preset the user came from; an applied custom\n // range matches no preset, so it stays and the list shows \"Custom range...\" as current.\n const showPresets = () => {\n setCustomRangeOpen(false);\n if (presetBeforeCustom) applyPreset(presetBeforeCustom);\n setPresetMenuOpen(true);\n };\n\n const customLabel = `${dateFrom ? dateFrom.toLocaleDateString() : 'Start'} \\u2013 ${dateTo ? dateTo.toLocaleDateString() : 'End'}`;\n\n if (shownPreset === 'custom' && !presetMenuOpen) {\n return (\n <Popover open={customRangeOpen} onOpenChange={setCustomRangeOpen}>\n {renderTrigger ? (\n <PopoverTrigger render={renderTrigger({ label: customLabel, disabled })} />\n ) : (\n <PopoverTrigger asChild>\n <Button size={size} disabled={disabled} icon={<CalendarIcon />}>\n {customLabel}\n </Button>\n </PopoverTrigger>\n )}\n <PopoverContent align=\"start\" className={cn('w-auto p-0')}>\n <CustomRangeEditor\n dateFrom={dateFrom}\n dateTo={dateTo}\n disabled={disabled}\n maxRangeMs={maxRangeMs}\n minDate={minDate}\n onApply={applyCustomRange}\n onShowPresets={showPresets}\n />\n </PopoverContent>\n </Popover>\n );\n }\n\n const triggerLabel = shownPreset === 'custom' ? customLabel : datePresetLabel;\n\n return (\n <DropdownMenu open={presetMenuOpen} onOpenChange={setPresetMenuOpen}>\n {renderTrigger ? (\n <DropdownMenu.Trigger render={renderTrigger({ label: triggerLabel, disabled })} />\n ) : (\n <DropdownMenu.Trigger asChild>\n <Button size={size} disabled={disabled} icon={<CalendarIcon />}>\n {triggerLabel}\n </Button>\n </DropdownMenu.Trigger>\n )}\n <DropdownMenu.Content align=\"start\">\n {/* Items select on click (not onValueChange) so re-picking the checked\n \"Custom range...\" still reopens the range editor. */}\n <DropdownMenu.RadioGroup value={shownPreset}>\n {visiblePresets.map(p => (\n <DropdownMenu.RadioItem\n key={p.value}\n value={p.value}\n closeOnClick\n onClick={() => handlePresetSelect(p.value)}\n >\n {p.label}\n </DropdownMenu.RadioItem>\n ))}\n </DropdownMenu.RadioGroup>\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n}\n"],"names":["parse","isValid","useState","useId","startOfDay","format","jsxs","Fragment","cn","jsx","Txt","DatePicker","TimePicker","Field","FieldError","Button","Check","Popover","PopoverTrigger","CalendarIcon","PopoverContent","DropdownMenu"],"mappings":"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"}
1
+ {"version":3,"file":"date-time-range-picker-_2RJBOUn.cjs","sources":["../src/ds/components/DateTimeRangePicker/custom-range-editor.tsx","../src/ds/components/DateTimeRangePicker/date-time-range-picker.tsx"],"sourcesContent":["import { format, isValid, parse, startOfDay } from 'date-fns';\nimport { Check } from 'lucide-react';\nimport { useId, useState } from 'react';\nimport { Button } from '@/ds/components/Button/Button';\nimport { DatePicker, TimePicker } from '@/ds/components/DateTimePicker';\nimport { Field, FieldError } from '@/ds/components/Field';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nfunction formatDays(ms: number): string {\n const days = Math.round(ms / (24 * 60 * 60 * 1000));\n return `${days} day${days === 1 ? '' : 's'}`;\n}\n\n/** The draft day at the draft time, or the bare day when the time doesn't parse. */\nfunction combineDateAndTime(date: Date | undefined, timeStr: string): Date | undefined {\n if (!date) return undefined;\n const dateOnly = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n const combined = parse(timeStr, 'h:mm a', dateOnly);\n return isValid(combined) ? combined : date;\n}\n\nexport interface CustomRangeEditorProps {\n dateFrom?: Date;\n dateTo?: Date;\n disabled?: boolean;\n /** Widest range that can be applied, in milliseconds. */\n maxRangeMs?: number;\n /** Earliest day a range can start on. Days before it are disabled. */\n minDate?: Date;\n onApply: (from: Date | undefined, to: Date | undefined) => void;\n onShowPresets: () => void;\n}\n\n/**\n * The custom range popover body. It mounts each time the popover opens, so its drafts\n * start from the current range without the picker resetting them.\n */\nexport function CustomRangeEditor({\n dateFrom,\n dateTo,\n disabled,\n maxRangeMs,\n minDate,\n onApply,\n onShowPresets,\n}: CustomRangeEditorProps) {\n const [draftDateFrom, setDraftDateFrom] = useState<Date | undefined>(dateFrom);\n const [draftDateTo, setDraftDateTo] = useState<Date | undefined>(dateTo);\n const [draftTimeFrom, setDraftTimeFrom] = useState('12:00 AM');\n const [draftTimeTo, setDraftTimeTo] = useState('11:59 PM');\n const [applyAttempted, setApplyAttempted] = useState(false);\n const errorId = useId();\n\n const fromDate = combineDateAndTime(draftDateFrom, draftTimeFrom);\n const toDate = combineDateAndTime(draftDateTo, draftTimeTo);\n const rangeReversed = fromDate !== undefined && toDate !== undefined && fromDate.getTime() > toDate.getTime();\n const rangeTooWide =\n fromDate !== undefined && toDate !== undefined && toDate.getTime() - fromDate.getTime() > (maxRangeMs ?? Infinity);\n const firstDay = minDate ? startOfDay(minDate) : undefined;\n const endFirstDay = draftDateFrom && (!firstDay || draftDateFrom > firstDay) ? draftDateFrom : firstDay;\n const rangeTooEarly = fromDate !== undefined && firstDay !== undefined && fromDate < firstDay;\n const rangeInvalid = rangeReversed || rangeTooWide || rangeTooEarly;\n // Shown after a failed Apply, and gone as soon as the drafts form a valid range again.\n let error: string | undefined;\n if (applyAttempted && rangeReversed) error = 'Start date/time must be before end date/time';\n else if (applyAttempted && rangeTooWide) error = `Range cannot be longer than ${formatDays(maxRangeMs ?? 0)}`;\n else if (applyAttempted && firstDay && rangeTooEarly)\n error = `Range cannot start before ${format(firstDay, 'MMM d, yyyy')}`;\n\n const apply = () => {\n if (rangeInvalid) {\n setApplyAttempted(true);\n return;\n }\n onApply(fromDate, toDate);\n };\n\n return (\n <>\n <div\n role=\"group\"\n aria-label=\"Custom date range\"\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? errorId : undefined}\n className=\"flex\"\n >\n <div className={cn('border-r border-border')}>\n <Txt as=\"span\" variant=\"column\" tone=\"muted\" className=\"block px-4 pt-3\">\n Start\n </Txt>\n <DatePicker\n mode=\"single\"\n selected={draftDateFrom}\n month={draftDateFrom}\n onSelect={setDraftDateFrom}\n disabled={disabled}\n fromDate={firstDay}\n toDate={draftDateTo}\n />\n <TimePicker\n label=\"Start time\"\n className=\"mx-4 mb-3 w-auto\"\n defaultValue={draftTimeFrom}\n onValueChange={v => {\n if (!disabled) setDraftTimeFrom(v);\n }}\n />\n </div>\n <div>\n <Txt as=\"span\" variant=\"column\" tone=\"muted\" className=\"block px-4 pt-3\">\n End\n </Txt>\n <DatePicker\n mode=\"single\"\n selected={draftDateTo}\n month={draftDateTo}\n onSelect={setDraftDateTo}\n disabled={disabled}\n fromDate={endFirstDay}\n />\n <TimePicker\n label=\"End time\"\n className=\"mx-4 mb-3 w-auto\"\n defaultValue={draftTimeTo}\n onValueChange={v => {\n if (!disabled) setDraftTimeTo(v);\n }}\n />\n </div>\n </div>\n <Field invalid={Boolean(error)}>\n <FieldError id={errorId} className=\"px-4 pb-1\">\n {error}\n </FieldError>\n </Field>\n <div className={cn('flex items-center justify-between px-4 pb-3')}>\n <Button variant=\"ghost\" size=\"sm\" disabled={disabled} onClick={onShowPresets}>\n &larr; Presets\n </Button>\n <Button icon={<Check />} variant=\"primary\" size=\"sm\" onClick={apply} disabled={disabled}>\n Apply\n </Button>\n </div>\n </>\n );\n}\n","import { CalendarIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport type { ReactElement } from 'react';\nimport { CustomRangeEditor } from './custom-range-editor';\nimport { Button } from '@/ds/components/Button/Button';\nimport type { ButtonProps } from '@/ds/components/Button/Button';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu/dropdown-menu';\nimport { Popover, PopoverTrigger, PopoverContent } from '@/ds/components/Popover/popover';\nimport { cn } from '@/lib/utils';\n\nexport type DateRangePreset = 'all' | 'last-24h' | 'last-3d' | 'last-7d' | 'last-14d' | 'last-30d' | 'custom';\n\nconst DATE_PRESETS: { value: DateRangePreset; label: string; ms?: number }[] = [\n { value: 'all', label: 'All' },\n { value: 'last-24h', label: 'Last 24 hours', ms: 24 * 60 * 60 * 1000 },\n { value: 'last-3d', label: 'Last 3 days', ms: 3 * 24 * 60 * 60 * 1000 },\n { value: 'last-7d', label: 'Last 7 days', ms: 7 * 24 * 60 * 60 * 1000 },\n { value: 'last-14d', label: 'Last 14 days', ms: 14 * 24 * 60 * 60 * 1000 },\n { value: 'last-30d', label: 'Last 30 days', ms: 30 * 24 * 60 * 60 * 1000 },\n { value: 'custom', label: 'Custom range...' },\n];\n\nexport interface DateTimeRangePickerProps {\n preset?: DateRangePreset;\n onPresetChange?: (preset: DateRangePreset) => void;\n dateFrom?: Date;\n dateTo?: Date;\n onDateChange?: (value: Date | undefined, type: 'from' | 'to') => void;\n /**\n * Called once with both ends when a custom range is applied. When provided it replaces\n * the two `onDateChange` calls for that step, so consumers can write the range atomically.\n */\n onDateRangeChange?: (from: Date | undefined, to: Date | undefined) => void;\n disabled?: boolean;\n /** Widest custom range that can be applied, in milliseconds. Presets are unaffected. */\n maxRangeMs?: number;\n /** Earliest day a custom range can start on, e.g. the oldest data still kept. Earlier days are disabled. */\n minDate?: Date;\n /** Subset of presets to show. If omitted, all presets are shown. */\n presets?: readonly DateRangePreset[];\n /** Size passed through to the trigger Button. Defaults to 'md'. */\n size?: ButtonProps['size'];\n /**\n * Replace the default Button trigger. Receives the current label (preset name or\n * custom range) and must return an element the menu/popover can attach to.\n */\n renderTrigger?: (props: { label: string; disabled?: boolean }) => ReactElement;\n}\n\nexport function DateTimeRangePicker({\n preset = 'all',\n onPresetChange,\n dateFrom,\n dateTo,\n onDateChange,\n onDateRangeChange,\n disabled,\n maxRangeMs,\n minDate,\n presets,\n size = 'md',\n renderTrigger,\n}: DateTimeRangePickerProps) {\n const visiblePresets = presets ? DATE_PRESETS.filter(p => presets.includes(p.value)) : DATE_PRESETS;\n const [customRangeOpen, setCustomRangeOpen] = useState(false);\n const [presetMenuOpen, setPresetMenuOpen] = useState(false);\n // The preset active before \"Custom range...\" was picked, until a range is applied.\n // \"← Presets\" restores it instead of jumping to the first preset in the list.\n const [presetBeforeCustom, setPresetBeforeCustom] = useState<DateRangePreset | undefined>();\n\n // \"← Presets\" restores the previous preset through the parent, which may apply it a\n // render later (e.g. a router URL update). Show it right away instead of \"custom\".\n const restoringPreset = presetMenuOpen && preset === 'custom' ? presetBeforeCustom : undefined;\n const shownPreset = restoringPreset ?? preset;\n const datePresetLabel = DATE_PRESETS.find(p => p.value === shownPreset)?.label ?? 'All';\n\n const applyPreset = (value: DateRangePreset) => {\n onPresetChange?.(value);\n const entry = DATE_PRESETS.find(p => p.value === value);\n if (entry?.ms) {\n onDateChange?.(new Date(Date.now() - entry.ms), 'from');\n onDateChange?.(undefined, 'to');\n } else {\n onDateChange?.(undefined, 'from');\n onDateChange?.(undefined, 'to');\n }\n };\n\n const handlePresetSelect = (value: DateRangePreset) => {\n setPresetMenuOpen(false);\n if (value === 'custom') {\n if (preset !== 'custom') setPresetBeforeCustom(preset);\n onPresetChange?.(value);\n setCustomRangeOpen(true);\n return;\n }\n setPresetBeforeCustom(undefined);\n applyPreset(value);\n };\n\n const applyCustomRange = (fromDate: Date | undefined, toDate: Date | undefined) => {\n if (onDateRangeChange) {\n onDateRangeChange(fromDate, toDate);\n } else {\n onDateChange?.(fromDate, 'from');\n onDateChange?.(toDate, 'to');\n }\n setPresetBeforeCustom(undefined);\n setCustomRangeOpen(false);\n };\n\n // Back to the preset list. Restores the preset the user came from; an applied custom\n // range matches no preset, so it stays and the list shows \"Custom range...\" as current.\n const showPresets = () => {\n setCustomRangeOpen(false);\n if (presetBeforeCustom) applyPreset(presetBeforeCustom);\n setPresetMenuOpen(true);\n };\n\n const customLabel = `${dateFrom ? dateFrom.toLocaleDateString() : 'Start'} \\u2013 ${dateTo ? dateTo.toLocaleDateString() : 'End'}`;\n\n if (shownPreset === 'custom' && !presetMenuOpen) {\n return (\n <Popover open={customRangeOpen} onOpenChange={setCustomRangeOpen}>\n {renderTrigger ? (\n <PopoverTrigger render={renderTrigger({ label: customLabel, disabled })} />\n ) : (\n <PopoverTrigger asChild>\n <Button size={size} disabled={disabled} icon={<CalendarIcon />}>\n {customLabel}\n </Button>\n </PopoverTrigger>\n )}\n <PopoverContent align=\"start\" className={cn('w-auto p-0')}>\n <CustomRangeEditor\n dateFrom={dateFrom}\n dateTo={dateTo}\n disabled={disabled}\n maxRangeMs={maxRangeMs}\n minDate={minDate}\n onApply={applyCustomRange}\n onShowPresets={showPresets}\n />\n </PopoverContent>\n </Popover>\n );\n }\n\n const triggerLabel = shownPreset === 'custom' ? customLabel : datePresetLabel;\n\n return (\n <DropdownMenu open={presetMenuOpen} onOpenChange={setPresetMenuOpen}>\n {renderTrigger ? (\n <DropdownMenu.Trigger render={renderTrigger({ label: triggerLabel, disabled })} />\n ) : (\n <DropdownMenu.Trigger asChild>\n <Button size={size} disabled={disabled} icon={<CalendarIcon />}>\n {triggerLabel}\n </Button>\n </DropdownMenu.Trigger>\n )}\n <DropdownMenu.Content align=\"start\">\n {/* Items select on click (not onValueChange) so re-picking the checked\n \"Custom range...\" still reopens the range editor. */}\n <DropdownMenu.RadioGroup value={shownPreset}>\n {visiblePresets.map(p => (\n <DropdownMenu.RadioItem\n key={p.value}\n value={p.value}\n closeOnClick\n onClick={() => handlePresetSelect(p.value)}\n >\n {p.label}\n </DropdownMenu.RadioItem>\n ))}\n </DropdownMenu.RadioGroup>\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n}\n"],"names":["parse","isValid","useState","useId","startOfDay","format","jsxs","Fragment","cn","jsx","Txt","DatePicker","TimePicker","Field","FieldError","Button","Check","Popover","PopoverTrigger","CalendarIcon","PopoverContent","DropdownMenu"],"mappings":"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"}
@@ -18,6 +18,10 @@ Object.defineProperty(exports, "useTraceQueryAvailable", {
18
18
  enumerable: true,
19
19
  get: () => capabilities.useTraceQueryAvailable
20
20
  });
21
+ Object.defineProperty(exports, "useTraceQueryDeltaPollingAvailable", {
22
+ enumerable: true,
23
+ get: () => capabilities.useTraceQueryDeltaPollingAvailable
24
+ });
21
25
  Object.defineProperty(exports, "useTraceQueryDiscoveryAvailable", {
22
26
  enumerable: true,
23
27
  get: () => capabilities.useTraceQueryDiscoveryAvailable
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"capabilities.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,2 +1,2 @@
1
- export { useFeedbackAvailable, useObservabilityCapabilities, useTraceQueryAvailable, useTraceQueryDiscoveryAvailable, useTraceQueryRootDurationAvailable } from '@mastra/react/hooks/capabilities';
1
+ export { useFeedbackAvailable, useObservabilityCapabilities, useTraceQueryAvailable, useTraceQueryDeltaPollingAvailable, useTraceQueryDiscoveryAvailable, useTraceQueryRootDurationAvailable } from '@mastra/react/hooks/capabilities';
2
2
  //# sourceMappingURL=capabilities.es.js.map
@@ -11,7 +11,7 @@ const datasets = require('@mastra/react/hooks/datasets');
11
11
  const Button = require('../../../Button-C4I05uT4.cjs');
12
12
  const codeEditor = require('../../../code-editor-4ukTuvqG.cjs');
13
13
  require('../../../highlight-DfnRU-Am.cjs');
14
- const field = require('../../../field-BCU5ZtWV.cjs');
14
+ const field = require('../../../field-CZ5fldpM.cjs');
15
15
  require('../../../field-control-aria-WzMGs0A4.cjs');
16
16
  const select = require('../../../select-BqHt-fOI.cjs');
17
17
  const Txt = require('../../../Txt-CIS2G5Jx.cjs');
@@ -7,7 +7,7 @@ import { useDatasets, useDatasetMutations } from '@mastra/react/hooks/datasets';
7
7
  import { B as Button } from '../../../Button-D8a5EWJ5.js';
8
8
  import { C as CodeEditor } from '../../../code-editor-8qu58Npy.js';
9
9
  import '../../../highlight-CXDme3FZ.js';
10
- import { F as Field, e as FieldLabel } from '../../../field-Dl1zeXTv.js';
10
+ import { F as Field, e as FieldLabel } from '../../../field-CfA5-ixH.js';
11
11
  import '../../../field-control-aria-DB6y41tQ.js';
12
12
  import { S as Select, e as SelectTrigger, f as SelectValue, a as SelectContent, c as SelectItem } from '../../../select-CCpQUIEg.js';
13
13
  import { T as Txt } from '../../../Txt-BtIGLRk1.js';
@@ -4,8 +4,12 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
5
  const jsxRuntime = require('react/jsx-runtime');
6
6
  const domains_chat_messages_signalData = require('./signal-data.cjs.js');
7
- const notificationActivity = require('../../../notification-activity-BSNuqJDd.cjs');
7
+ const notificationActivity = require('../../../notification-activity-DAZOALWI.cjs');
8
+ const Badge = require('../../../Badge-63UxysBA.cjs');
9
+ const tooltip = require('../../../tooltip-BppwIf6Y.cjs');
8
10
 
11
+ const MCP_EVENT_GAP_MESSAGE = "Gap: events may have been skipped";
12
+ const MCP_EVENT_UNTRUSTED_LABEL = "Untrusted event data from the MCP server";
9
13
  const getNotificationTitle = (signal) => {
10
14
  const notification = domains_chat_messages_signalData.getNotificationMetadata(signal);
11
15
  if (notification?.signal === "summary" || signal.tagName === "notification-summary") return "Notification summary";
@@ -14,8 +18,20 @@ const getNotificationTitle = (signal) => {
14
18
  if (source && kind) return `${source} / ${kind}`;
15
19
  return source ?? kind ?? "Notification";
16
20
  };
21
+ const getMcpEventTitle = (info) => {
22
+ const title = [info.server, info.event].filter(Boolean).join(" · ") || "MCP event";
23
+ return info.kind === "mcp-event-subscription-ended" ? `${title} · subscription ended` : title;
24
+ };
25
+ const GapBadge = () => /* @__PURE__ */ jsxRuntime.jsxs(tooltip.Tooltip, { children: [
26
+ /* @__PURE__ */ jsxRuntime.jsxs(tooltip.TooltipTrigger, { render: /* @__PURE__ */ jsxRuntime.jsx("span", {}), children: [
27
+ /* @__PURE__ */ jsxRuntime.jsx(Badge.Badge, { size: "xs", variant: "amber", children: "gap" }),
28
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: MCP_EVENT_GAP_MESSAGE })
29
+ ] }),
30
+ /* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipContent, { children: MCP_EVENT_GAP_MESSAGE })
31
+ ] });
17
32
  const NotificationSignalNotice = ({ signal }) => {
18
33
  const notification = domains_chat_messages_signalData.getNotificationMetadata(signal);
34
+ const mcpEvent = domains_chat_messages_signalData.getMcpEventSignalInfo(signal);
19
35
  const priority = notification?.priority ?? domains_chat_messages_signalData.formatSignalValue(signal.attributes?.priority);
20
36
  const pending = domains_chat_messages_signalData.formatSignalValue(notification?.pending) ?? domains_chat_messages_signalData.formatSignalValue(signal.attributes?.pending);
21
37
  const status = notification?.status ?? domains_chat_messages_signalData.formatSignalValue(signal.attributes?.status);
@@ -23,14 +39,18 @@ const NotificationSignalNotice = ({ signal }) => {
23
39
  return /* @__PURE__ */ jsxRuntime.jsx(
24
40
  notificationActivity.NotificationActivity,
25
41
  {
26
- label: getNotificationTitle(signal),
42
+ label: mcpEvent ? getMcpEventTitle(mcpEvent) : getNotificationTitle(signal),
27
43
  message: text,
28
44
  priority,
29
45
  status,
30
- pending
46
+ pending,
47
+ extraBadges: mcpEvent?.truncated ? /* @__PURE__ */ jsxRuntime.jsx(GapBadge, {}) : void 0,
48
+ messageLabel: mcpEvent?.kind === "mcp-event" ? MCP_EVENT_UNTRUSTED_LABEL : void 0
31
49
  }
32
50
  );
33
51
  };
34
52
 
53
+ exports.MCP_EVENT_GAP_MESSAGE = MCP_EVENT_GAP_MESSAGE;
54
+ exports.MCP_EVENT_UNTRUSTED_LABEL = MCP_EVENT_UNTRUSTED_LABEL;
35
55
  exports.NotificationSignalNotice = NotificationSignalNotice;
36
56
  //# sourceMappingURL=notification-signal-notice.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"notification-signal-notice.cjs.js","sources":["../../../../src/domains/chat/messages/notification-signal-notice.tsx"],"sourcesContent":["import { formatSignalValue, getNotificationMetadata, signalContentsToText } from './signal-data';\nimport type { SignalData } from './signal-data';\nimport { NotificationActivity } from '@/ds/components/ai/activity';\n\nexport type NotificationSignalNoticeProps = {\n signal: SignalData;\n};\n\nconst getNotificationTitle = (signal: SignalData) => {\n const notification = getNotificationMetadata(signal);\n if (notification?.signal === 'summary' || signal.tagName === 'notification-summary') return 'Notification summary';\n\n const source = notification?.source ?? formatSignalValue(signal.attributes?.source);\n const kind = notification?.kind ?? formatSignalValue(signal.attributes?.kind);\n if (source && kind) return `${source} / ${kind}`;\n return source ?? kind ?? 'Notification';\n};\n\nexport const NotificationSignalNotice = ({ signal }: NotificationSignalNoticeProps) => {\n const notification = getNotificationMetadata(signal);\n const priority = notification?.priority ?? formatSignalValue(signal.attributes?.priority);\n const pending = formatSignalValue(notification?.pending) ?? formatSignalValue(signal.attributes?.pending);\n const status = notification?.status ?? formatSignalValue(signal.attributes?.status);\n const text = signalContentsToText(signal.contents);\n return (\n <NotificationActivity\n label={getNotificationTitle(signal)}\n message={text}\n priority={priority}\n status={status}\n pending={pending}\n />\n );\n};\n"],"names":["getNotificationMetadata","formatSignalValue","signalContentsToText","jsx","NotificationActivity"],"mappings":";;;;;;;;AAQA,MAAM,oBAAA,GAAuB,CAAC,MAAA,KAAuB;AACnD,EAAA,MAAM,YAAA,GAAeA,yDAAwB,MAAM,CAAA;AACnD,EAAA,IAAI,cAAc,MAAA,KAAW,SAAA,IAAa,MAAA,CAAO,OAAA,KAAY,wBAAwB,OAAO,sBAAA;AAE5F,EAAA,MAAM,SAAS,YAAA,EAAc,MAAA,IAAUC,kDAAA,CAAkB,MAAA,CAAO,YAAY,MAAM,CAAA;AAClF,EAAA,MAAM,OAAO,YAAA,EAAc,IAAA,IAAQA,kDAAA,CAAkB,MAAA,CAAO,YAAY,IAAI,CAAA;AAC5E,EAAA,IAAI,UAAU,IAAA,EAAM,OAAO,CAAA,EAAG,MAAM,MAAM,IAAI,CAAA,CAAA;AAC9C,EAAA,OAAO,UAAU,IAAA,IAAQ,cAAA;AAC3B,CAAA;AAEO,MAAM,wBAAA,GAA2B,CAAC,EAAE,MAAA,EAAO,KAAqC;AACrF,EAAA,MAAM,YAAA,GAAeD,yDAAwB,MAAM,CAAA;AACnD,EAAA,MAAM,WAAW,YAAA,EAAc,QAAA,IAAYC,kDAAA,CAAkB,MAAA,CAAO,YAAY,QAAQ,CAAA;AACxF,EAAA,MAAM,OAAA,GAAUA,mDAAkB,YAAA,EAAc,OAAO,KAAKA,kDAAA,CAAkB,MAAA,CAAO,YAAY,OAAO,CAAA;AACxG,EAAA,MAAM,SAAS,YAAA,EAAc,MAAA,IAAUA,kDAAA,CAAkB,MAAA,CAAO,YAAY,MAAM,CAAA;AAClF,EAAA,MAAM,IAAA,GAAOC,qDAAA,CAAqB,MAAA,CAAO,QAAQ,CAAA;AACjD,EAAA,uBACEC,cAAA;AAAA,IAACC,yCAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,qBAAqB,MAAM,CAAA;AAAA,MAClC,OAAA,EAAS,IAAA;AAAA,MACT,QAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;;;;"}
1
+ {"version":3,"file":"notification-signal-notice.cjs.js","sources":["../../../../src/domains/chat/messages/notification-signal-notice.tsx"],"sourcesContent":["import { formatSignalValue, getMcpEventSignalInfo, getNotificationMetadata, signalContentsToText } from './signal-data';\nimport type { McpEventSignalInfo, SignalData } from './signal-data';\nimport { NotificationActivity } from '@/ds/components/ai/activity';\nimport { Badge } from '@/ds/components/Badge';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/ds/components/Tooltip/tooltip';\n\nexport type NotificationSignalNoticeProps = {\n signal: SignalData;\n};\n\nexport const MCP_EVENT_GAP_MESSAGE = 'Gap: events may have been skipped';\nexport const MCP_EVENT_UNTRUSTED_LABEL = 'Untrusted event data from the MCP server';\n\nconst getNotificationTitle = (signal: SignalData) => {\n const notification = getNotificationMetadata(signal);\n if (notification?.signal === 'summary' || signal.tagName === 'notification-summary') return 'Notification summary';\n\n const source = notification?.source ?? formatSignalValue(signal.attributes?.source);\n const kind = notification?.kind ?? formatSignalValue(signal.attributes?.kind);\n if (source && kind) return `${source} / ${kind}`;\n return source ?? kind ?? 'Notification';\n};\n\nconst getMcpEventTitle = (info: McpEventSignalInfo) => {\n const title = [info.server, info.event].filter(Boolean).join(' · ') || 'MCP event';\n return info.kind === 'mcp-event-subscription-ended' ? `${title} · subscription ended` : title;\n};\n\nconst GapBadge = () => (\n <Tooltip>\n <TooltipTrigger render={<span />}>\n <Badge size=\"xs\" variant=\"amber\">\n gap\n </Badge>\n <span className=\"sr-only\">{MCP_EVENT_GAP_MESSAGE}</span>\n </TooltipTrigger>\n <TooltipContent>{MCP_EVENT_GAP_MESSAGE}</TooltipContent>\n </Tooltip>\n);\n\nexport const NotificationSignalNotice = ({ signal }: NotificationSignalNoticeProps) => {\n const notification = getNotificationMetadata(signal);\n const mcpEvent = getMcpEventSignalInfo(signal);\n const priority = notification?.priority ?? formatSignalValue(signal.attributes?.priority);\n const pending = formatSignalValue(notification?.pending) ?? formatSignalValue(signal.attributes?.pending);\n const status = notification?.status ?? formatSignalValue(signal.attributes?.status);\n const text = signalContentsToText(signal.contents);\n return (\n <NotificationActivity\n label={mcpEvent ? getMcpEventTitle(mcpEvent) : getNotificationTitle(signal)}\n message={text}\n priority={priority}\n status={status}\n pending={pending}\n extraBadges={mcpEvent?.truncated ? <GapBadge /> : undefined}\n messageLabel={mcpEvent?.kind === 'mcp-event' ? MCP_EVENT_UNTRUSTED_LABEL : undefined}\n />\n );\n};\n"],"names":["getNotificationMetadata","formatSignalValue","jsxs","Tooltip","TooltipTrigger","jsx","Badge","TooltipContent","getMcpEventSignalInfo","signalContentsToText","NotificationActivity"],"mappings":";;;;;;;;;;AAUO,MAAM,qBAAA,GAAwB;AAC9B,MAAM,yBAAA,GAA4B;AAEzC,MAAM,oBAAA,GAAuB,CAAC,MAAA,KAAuB;AACnD,EAAA,MAAM,YAAA,GAAeA,yDAAwB,MAAM,CAAA;AACnD,EAAA,IAAI,cAAc,MAAA,KAAW,SAAA,IAAa,MAAA,CAAO,OAAA,KAAY,wBAAwB,OAAO,sBAAA;AAE5F,EAAA,MAAM,SAAS,YAAA,EAAc,MAAA,IAAUC,kDAAA,CAAkB,MAAA,CAAO,YAAY,MAAM,CAAA;AAClF,EAAA,MAAM,OAAO,YAAA,EAAc,IAAA,IAAQA,kDAAA,CAAkB,MAAA,CAAO,YAAY,IAAI,CAAA;AAC5E,EAAA,IAAI,UAAU,IAAA,EAAM,OAAO,CAAA,EAAG,MAAM,MAAM,IAAI,CAAA,CAAA;AAC9C,EAAA,OAAO,UAAU,IAAA,IAAQ,cAAA;AAC3B,CAAA;AAEA,MAAM,gBAAA,GAAmB,CAAC,IAAA,KAA6B;AACrD,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA,IAAK,WAAA;AACvE,EAAA,OAAO,IAAA,CAAK,IAAA,KAAS,8BAAA,GAAiC,CAAA,EAAG,KAAK,CAAA,qBAAA,CAAA,GAA0B,KAAA;AAC1F,CAAA;AAEA,MAAM,QAAA,GAAW,sBACfC,eAAA,CAACC,eAAA,EAAA,EACC,QAAA,EAAA;AAAA,kBAAAD,eAAA,CAACE,sBAAA,EAAA,EAAe,MAAA,kBAAQC,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAC5B,QAAA,EAAA;AAAA,oBAAAA,cAAA,CAACC,WAAA,EAAA,EAAM,IAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,SAAQ,QAAA,EAAA,KAAA,EAEjC,CAAA;AAAA,oBACAD,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,qBAAA,EAAsB;AAAA,GAAA,EACnD,CAAA;AAAA,kBACAA,cAAA,CAACE,0BAAgB,QAAA,EAAA,qBAAA,EAAsB;AAAA,CAAA,EACzC,CAAA;AAGK,MAAM,wBAAA,GAA2B,CAAC,EAAE,MAAA,EAAO,KAAqC;AACrF,EAAA,MAAM,YAAA,GAAeP,yDAAwB,MAAM,CAAA;AACnD,EAAA,MAAM,QAAA,GAAWQ,uDAAsB,MAAM,CAAA;AAC7C,EAAA,MAAM,WAAW,YAAA,EAAc,QAAA,IAAYP,kDAAA,CAAkB,MAAA,CAAO,YAAY,QAAQ,CAAA;AACxF,EAAA,MAAM,OAAA,GAAUA,mDAAkB,YAAA,EAAc,OAAO,KAAKA,kDAAA,CAAkB,MAAA,CAAO,YAAY,OAAO,CAAA;AACxG,EAAA,MAAM,SAAS,YAAA,EAAc,MAAA,IAAUA,kDAAA,CAAkB,MAAA,CAAO,YAAY,MAAM,CAAA;AAClF,EAAA,MAAM,IAAA,GAAOQ,qDAAA,CAAqB,MAAA,CAAO,QAAQ,CAAA;AACjD,EAAA,uBACEJ,cAAA;AAAA,IAACK,yCAAA;AAAA,IAAA;AAAA,MACC,OAAO,QAAA,GAAW,gBAAA,CAAiB,QAAQ,CAAA,GAAI,qBAAqB,MAAM,CAAA;AAAA,MAC1E,OAAA,EAAS,IAAA;AAAA,MACT,QAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAA,EAAa,QAAA,EAAU,SAAA,mBAAYL,cAAA,CAAC,YAAS,CAAA,GAAK,MAAA;AAAA,MAClD,YAAA,EAAc,QAAA,EAAU,IAAA,KAAS,WAAA,GAAc,yBAAA,GAA4B;AAAA;AAAA,GAC7E;AAEJ;;;;;;"}
@@ -1,7 +1,11 @@
1
- import { jsx } from 'react/jsx-runtime';
2
- import { getNotificationMetadata, formatSignalValue, signalContentsToText } from './signal-data.es.js';
3
- import { N as NotificationActivity } from '../../../notification-activity-BWXHmlTn.js';
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { getNotificationMetadata, getMcpEventSignalInfo, formatSignalValue, signalContentsToText } from './signal-data.es.js';
3
+ import { N as NotificationActivity } from '../../../notification-activity-BRW1Xlj1.js';
4
+ import { B as Badge } from '../../../Badge-CHGARUEW.js';
5
+ import { T as Tooltip, c as TooltipTrigger, a as TooltipContent } from '../../../tooltip-DrsXZDAj.js';
4
6
 
7
+ const MCP_EVENT_GAP_MESSAGE = "Gap: events may have been skipped";
8
+ const MCP_EVENT_UNTRUSTED_LABEL = "Untrusted event data from the MCP server";
5
9
  const getNotificationTitle = (signal) => {
6
10
  const notification = getNotificationMetadata(signal);
7
11
  if (notification?.signal === "summary" || signal.tagName === "notification-summary") return "Notification summary";
@@ -10,8 +14,20 @@ const getNotificationTitle = (signal) => {
10
14
  if (source && kind) return `${source} / ${kind}`;
11
15
  return source ?? kind ?? "Notification";
12
16
  };
17
+ const getMcpEventTitle = (info) => {
18
+ const title = [info.server, info.event].filter(Boolean).join(" · ") || "MCP event";
19
+ return info.kind === "mcp-event-subscription-ended" ? `${title} · subscription ended` : title;
20
+ };
21
+ const GapBadge = () => /* @__PURE__ */ jsxs(Tooltip, { children: [
22
+ /* @__PURE__ */ jsxs(TooltipTrigger, { render: /* @__PURE__ */ jsx("span", {}), children: [
23
+ /* @__PURE__ */ jsx(Badge, { size: "xs", variant: "amber", children: "gap" }),
24
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: MCP_EVENT_GAP_MESSAGE })
25
+ ] }),
26
+ /* @__PURE__ */ jsx(TooltipContent, { children: MCP_EVENT_GAP_MESSAGE })
27
+ ] });
13
28
  const NotificationSignalNotice = ({ signal }) => {
14
29
  const notification = getNotificationMetadata(signal);
30
+ const mcpEvent = getMcpEventSignalInfo(signal);
15
31
  const priority = notification?.priority ?? formatSignalValue(signal.attributes?.priority);
16
32
  const pending = formatSignalValue(notification?.pending) ?? formatSignalValue(signal.attributes?.pending);
17
33
  const status = notification?.status ?? formatSignalValue(signal.attributes?.status);
@@ -19,14 +35,16 @@ const NotificationSignalNotice = ({ signal }) => {
19
35
  return /* @__PURE__ */ jsx(
20
36
  NotificationActivity,
21
37
  {
22
- label: getNotificationTitle(signal),
38
+ label: mcpEvent ? getMcpEventTitle(mcpEvent) : getNotificationTitle(signal),
23
39
  message: text,
24
40
  priority,
25
41
  status,
26
- pending
42
+ pending,
43
+ extraBadges: mcpEvent?.truncated ? /* @__PURE__ */ jsx(GapBadge, {}) : void 0,
44
+ messageLabel: mcpEvent?.kind === "mcp-event" ? MCP_EVENT_UNTRUSTED_LABEL : void 0
27
45
  }
28
46
  );
29
47
  };
30
48
 
31
- export { NotificationSignalNotice };
49
+ export { MCP_EVENT_GAP_MESSAGE, MCP_EVENT_UNTRUSTED_LABEL, NotificationSignalNotice };
32
50
  //# sourceMappingURL=notification-signal-notice.es.js.map