@mastra/playground-ui 60.0.0 → 60.1.0-alpha.1

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 (929) hide show
  1. package/README.md +7 -6
  2. package/dist/{Badge-H8K5WrXg.cjs → Badge-D3EctKQo.cjs} +16 -8
  3. package/dist/Badge-D3EctKQo.cjs.map +1 -0
  4. package/dist/{Badge-Q_pCeeGW.js → Badge-DmOqFpXW.js} +16 -8
  5. package/dist/Badge-DmOqFpXW.js.map +1 -0
  6. package/dist/{Button-BnmR2HRc.cjs → Button-CXhSUBxN.cjs} +3 -3
  7. package/dist/Button-CXhSUBxN.cjs.map +1 -0
  8. package/dist/{Button-C6eUqcPI.js → Button-D43ghVKt.js} +3 -3
  9. package/dist/Button-D43ghVKt.js.map +1 -0
  10. package/dist/{EmptyState-CJ5KC4Db.cjs → EmptyState-CuoMGNP0.cjs} +2 -2
  11. package/dist/EmptyState-CuoMGNP0.cjs.map +1 -0
  12. package/dist/{EmptyState-CynkaZd1.js → EmptyState-DyyUFpzY.js} +2 -2
  13. package/dist/EmptyState-DyyUFpzY.js.map +1 -0
  14. package/dist/{ErrorBoundary-Bb2R5IMR.js → ErrorBoundary-BvwJY6s9.js} +2 -2
  15. package/dist/{ErrorBoundary-Bb2R5IMR.js.map → ErrorBoundary-BvwJY6s9.js.map} +1 -1
  16. package/dist/{ErrorBoundary-CKrwONAU.cjs → ErrorBoundary-D7eIMbMr.cjs} +2 -2
  17. package/dist/{ErrorBoundary-CKrwONAU.cjs.map → ErrorBoundary-D7eIMbMr.cjs.map} +1 -1
  18. package/dist/{Notice-Ce3r5x-7.js → Notice-B8RIClJD.js} +2 -2
  19. package/dist/{Notice-Ce3r5x-7.js.map → Notice-B8RIClJD.js.map} +1 -1
  20. package/dist/{Notice-CEBwitdf.cjs → Notice-C4Tgmtgb.cjs} +2 -2
  21. package/dist/{Notice-CEBwitdf.cjs.map → Notice-C4Tgmtgb.cjs.map} +1 -1
  22. package/dist/{activity-Duth8KP_.js → activity-BoXbE4Kz.js} +3 -3
  23. package/dist/activity-BoXbE4Kz.js.map +1 -0
  24. package/dist/{activity-8egTNbaI.cjs → activity-CbQG59Oc.cjs} +3 -3
  25. package/dist/activity-CbQG59Oc.cjs.map +1 -0
  26. package/dist/{alert-dialog-D1UYVW__.js → alert-dialog-CzRo39mH.js} +3 -3
  27. package/dist/{alert-dialog-D1UYVW__.js.map → alert-dialog-CzRo39mH.js.map} +1 -1
  28. package/dist/{alert-dialog-BcOSIOSW.cjs → alert-dialog-DC-Fapxf.cjs} +3 -3
  29. package/dist/{alert-dialog-BcOSIOSW.cjs.map → alert-dialog-DC-Fapxf.cjs.map} +1 -1
  30. package/dist/{ask-user-DJXmLJzy.cjs → ask-user-CXu4b7Jw.cjs} +4 -4
  31. package/dist/ask-user-CXu4b7Jw.cjs.map +1 -0
  32. package/dist/{ask-user-Crg1O-o6.js → ask-user-Dlz2346n.js} +4 -4
  33. package/dist/ask-user-Dlz2346n.js.map +1 -0
  34. package/dist/buttons-group-CoZP3lJt.cjs.map +1 -1
  35. package/dist/buttons-group-DsZgrZBZ.js.map +1 -1
  36. package/dist/{code-block-C7A4Hv96.cjs → code-block-BzoMjjtf.cjs} +5 -5
  37. package/dist/{code-block-C7A4Hv96.cjs.map → code-block-BzoMjjtf.cjs.map} +1 -1
  38. package/dist/{code-block-C_pvalBv.js → code-block-DY5KsTGY.js} +5 -5
  39. package/dist/{code-block-C_pvalBv.js.map → code-block-DY5KsTGY.js.map} +1 -1
  40. package/dist/{code-editor-Cltwid7c.js → code-editor-28chVxHw.js} +10 -8
  41. package/dist/code-editor-28chVxHw.js.map +1 -0
  42. package/dist/{code-editor-BXchPl_F.cjs → code-editor-B_wPmKPf.cjs} +10 -8
  43. package/dist/code-editor-B_wPmKPf.cjs.map +1 -0
  44. package/dist/{combobox-B_C0cNid.js → combobox-B15qTrWO.js} +4 -4
  45. package/dist/{combobox-B_C0cNid.js.map → combobox-B15qTrWO.js.map} +1 -1
  46. package/dist/{combobox-rKV-Lksj.cjs → combobox-DJ0c4o4S.cjs} +4 -4
  47. package/dist/{combobox-rKV-Lksj.cjs.map → combobox-DJ0c4o4S.cjs.map} +1 -1
  48. package/dist/{combobox-styles-CLxC7VLA.js → combobox-styles-C2MEEpaG.js} +3 -3
  49. package/dist/{combobox-styles-CLxC7VLA.js.map → combobox-styles-C2MEEpaG.js.map} +1 -1
  50. package/dist/{combobox-styles-C4Kq1NFV.cjs → combobox-styles-DLflBH-G.cjs} +3 -3
  51. package/dist/{combobox-styles-C4Kq1NFV.cjs.map → combobox-styles-DLflBH-G.cjs.map} +1 -1
  52. package/dist/{command-CpXMoss8.cjs → command-Bm0VcX7X.cjs} +2 -2
  53. package/dist/{command-CpXMoss8.cjs.map → command-Bm0VcX7X.cjs.map} +1 -1
  54. package/dist/{command-C6JnofUJ.js → command-DFin7kHN.js} +2 -2
  55. package/dist/{command-C6JnofUJ.js.map → command-DFin7kHN.js.map} +1 -1
  56. package/dist/components/AlertDialog.cjs.js +1 -1
  57. package/dist/components/AlertDialog.es.js +1 -1
  58. package/dist/components/Badge.cjs.js +1 -1
  59. package/dist/components/Badge.es.js +1 -1
  60. package/dist/components/Button.cjs.js +1 -1
  61. package/dist/components/Button.es.js +2 -2
  62. package/dist/components/ClampedText.cjs.js +1 -1
  63. package/dist/components/ClampedText.es.js +1 -1
  64. package/dist/components/CodeBlock.cjs.js +1 -1
  65. package/dist/components/CodeBlock.es.js +1 -1
  66. package/dist/components/CodeEditor.cjs.js +1 -1
  67. package/dist/components/CodeEditor.es.js +1 -1
  68. package/dist/components/CollapsibleBox.cjs.js +12 -0
  69. package/dist/components/CollapsibleBox.cjs.js.map +1 -0
  70. package/dist/components/CollapsibleBox.d.ts +2 -0
  71. package/dist/components/CollapsibleBox.es.js +2 -0
  72. package/dist/components/CollapsibleBox.es.js.map +1 -0
  73. package/dist/components/Combobox.cjs.js +2 -2
  74. package/dist/components/Combobox.es.js +2 -2
  75. package/dist/components/Command.cjs.js +1 -1
  76. package/dist/components/Command.es.js +1 -1
  77. package/dist/components/CommandPalette.cjs.js +1 -1
  78. package/dist/components/CommandPalette.es.js +1 -1
  79. package/dist/components/Comment.cjs.js +3 -3
  80. package/dist/components/Comment.es.js +3 -3
  81. package/dist/components/CopyButton.cjs.js +1 -1
  82. package/dist/components/CopyButton.es.js +1 -1
  83. package/dist/components/DataCodeSection.cjs.js +1 -1
  84. package/dist/components/DataCodeSection.es.js +1 -1
  85. package/dist/components/DataDetailsPanel.cjs.js +2 -2
  86. package/dist/components/DataDetailsPanel.es.js +2 -2
  87. package/dist/components/DataList.cjs.js +3 -3
  88. package/dist/components/DataList.es.js +3 -3
  89. package/dist/components/DataPanel.cjs.js +1 -1
  90. package/dist/components/DataPanel.es.js +1 -1
  91. package/dist/components/DateRangeTimeline.cjs.js +1 -1
  92. package/dist/components/DateRangeTimeline.es.js +1 -1
  93. package/dist/components/DateTimePicker.cjs.js +3 -3
  94. package/dist/components/DateTimePicker.es.js +3 -3
  95. package/dist/components/DateTimeRangePicker.cjs.js +1 -1
  96. package/dist/components/DateTimeRangePicker.es.js +1 -1
  97. package/dist/components/Dialog.cjs.js +2 -2
  98. package/dist/components/Dialog.es.js +2 -2
  99. package/dist/components/DisabledFeatureButton.cjs.js +1 -1
  100. package/dist/components/DisabledFeatureButton.es.js +1 -1
  101. package/dist/components/Drawer.cjs.js +1 -1
  102. package/dist/components/Drawer.es.js +1 -1
  103. package/dist/components/EmptyState.cjs.js +1 -1
  104. package/dist/components/EmptyState.es.js +1 -1
  105. package/dist/components/EnvironmentVariablesEditor.cjs.js +9 -9
  106. package/dist/components/EnvironmentVariablesEditor.cjs.js.map +1 -1
  107. package/dist/components/EnvironmentVariablesEditor.es.js +9 -9
  108. package/dist/components/EnvironmentVariablesEditor.es.js.map +1 -1
  109. package/dist/components/ErrorBoundary.cjs.js +1 -1
  110. package/dist/components/ErrorBoundary.es.js +1 -1
  111. package/dist/components/FileDropBackdrop.cjs.js +1 -1
  112. package/dist/components/FileDropBackdrop.es.js +1 -1
  113. package/dist/components/FilterBar.cjs.js +3 -3
  114. package/dist/components/FilterBar.es.js +4 -4
  115. package/dist/components/FormFieldBlocks.cjs.js +5 -5
  116. package/dist/components/FormFieldBlocks.es.js +5 -5
  117. package/dist/components/InputGroup.cjs.js +1 -1
  118. package/dist/components/InputGroup.es.js +1 -1
  119. package/dist/components/JSONSchemaForm.cjs.js +3 -3
  120. package/dist/components/JSONSchemaForm.es.js +3 -3
  121. package/dist/components/ListSearch.cjs.js +1 -1
  122. package/dist/components/ListSearch.es.js +1 -1
  123. package/dist/components/LogsDataList.cjs.js +3 -1
  124. package/dist/components/LogsDataList.cjs.js.map +1 -1
  125. package/dist/components/LogsDataList.es.js +3 -1
  126. package/dist/components/LogsDataList.es.js.map +1 -1
  127. package/dist/components/MainSidebar.cjs.js +1 -1
  128. package/dist/components/MainSidebar.es.js +2 -2
  129. package/dist/components/MarkdownRenderer.cjs.js +1 -1
  130. package/dist/components/MarkdownRenderer.es.js +1 -1
  131. package/dist/components/Message.cjs.js +1 -1
  132. package/dist/components/Message.es.js +1 -1
  133. package/dist/components/MetricsCard.cjs.js +1 -1
  134. package/dist/components/MetricsCard.es.js +1 -1
  135. package/dist/components/MetricsKpiCard.cjs.js +1 -1
  136. package/dist/components/MetricsKpiCard.es.js +1 -1
  137. package/dist/components/Notice.cjs.js +1 -1
  138. package/dist/components/Notice.es.js +1 -1
  139. package/dist/components/PrevNextNav.cjs.js +1 -1
  140. package/dist/components/PrevNextNav.es.js +1 -1
  141. package/dist/components/ProductBadge.cjs.js +1 -1
  142. package/dist/components/ProductBadge.es.js +1 -1
  143. package/dist/components/PropertyFilter.cjs.js +3 -3
  144. package/dist/components/PropertyFilter.es.js +4 -4
  145. package/dist/components/PullRequestIcon.cjs.js +1 -1
  146. package/dist/components/PullRequestIcon.cjs.js.map +1 -1
  147. package/dist/components/PullRequestIcon.es.js +1 -1
  148. package/dist/components/PullRequestIcon.es.js.map +1 -1
  149. package/dist/components/RelativeTimestamp.cjs.js +1 -1
  150. package/dist/components/RelativeTimestamp.es.js +1 -1
  151. package/dist/components/RuleBuilder.cjs.js +3 -3
  152. package/dist/components/RuleBuilder.cjs.js.map +1 -1
  153. package/dist/components/RuleBuilder.es.js +3 -3
  154. package/dist/components/RuleBuilder.es.js.map +1 -1
  155. package/dist/components/SankeyChart.cjs.js +1 -1
  156. package/dist/components/SankeyChart.es.js +1 -1
  157. package/dist/components/Section.cjs.js +1 -1
  158. package/dist/components/Section.es.js +1 -1
  159. package/dist/components/SegmentedControl.cjs.js +11 -0
  160. package/dist/components/SegmentedControl.cjs.js.map +1 -0
  161. package/dist/components/SegmentedControl.d.ts +2 -0
  162. package/dist/components/SegmentedControl.es.js +2 -0
  163. package/dist/components/SegmentedControl.es.js.map +1 -0
  164. package/dist/components/Select.cjs.js +1 -1
  165. package/dist/components/Select.es.js +1 -1
  166. package/dist/components/SideDialog.cjs.js +1 -1
  167. package/dist/components/SideDialog.es.js +1 -1
  168. package/dist/components/Steps.cjs.js +2 -2
  169. package/dist/components/Steps.cjs.js.map +1 -1
  170. package/dist/components/Steps.es.js +2 -2
  171. package/dist/components/Steps.es.js.map +1 -1
  172. package/dist/components/Tabs.cjs.js +3 -3
  173. package/dist/components/Tabs.es.js +3 -3
  174. package/dist/components/ThemeToggle.cjs.js +17 -86
  175. package/dist/components/ThemeToggle.cjs.js.map +1 -1
  176. package/dist/components/ThemeToggle.es.js +18 -87
  177. package/dist/components/ThemeToggle.es.js.map +1 -1
  178. package/dist/components/ThreadList.cjs.js +1 -1
  179. package/dist/components/ThreadList.es.js +1 -1
  180. package/dist/components/TokenBudget.cjs.js +1 -1
  181. package/dist/components/TokenBudget.es.js +1 -1
  182. package/dist/components/Truncate.cjs.js +1 -1
  183. package/dist/components/Truncate.es.js +1 -1
  184. package/dist/components/Workflow.cjs.js +6 -6
  185. package/dist/components/Workflow.es.js +6 -6
  186. package/dist/components/ai/activity.cjs.js +4 -4
  187. package/dist/components/ai/activity.es.js +4 -4
  188. package/dist/components/ai/ask-user.cjs.js +1 -1
  189. package/dist/components/ai/ask-user.es.js +1 -1
  190. package/dist/components/ai/plan.cjs.js +1 -1
  191. package/dist/components/ai/plan.es.js +1 -1
  192. package/dist/components/ai/tool-approval.cjs.js +1 -1
  193. package/dist/components/ai/tool-approval.es.js +1 -1
  194. package/dist/components/ai/tool-call.cjs.js +4 -4
  195. package/dist/components/ai/tool-call.es.js +4 -4
  196. package/dist/{copy-button-C6nXDjBz.cjs → copy-button-CGkFEDHF.cjs} +2 -2
  197. package/dist/{copy-button-C6nXDjBz.cjs.map → copy-button-CGkFEDHF.cjs.map} +1 -1
  198. package/dist/{copy-button-DbmsTUum.js → copy-button-DH8xtrWz.js} +2 -2
  199. package/dist/{copy-button-DbmsTUum.js.map → copy-button-DH8xtrWz.js.map} +1 -1
  200. package/dist/{data-code-section-D5b6_jcB.cjs → data-code-section-DWBfkrmO.cjs} +6 -6
  201. package/dist/data-code-section-DWBfkrmO.cjs.map +1 -0
  202. package/dist/{data-code-section-Bd2Xnckz.js → data-code-section-It6myyvZ.js} +6 -6
  203. package/dist/data-code-section-It6myyvZ.js.map +1 -0
  204. package/dist/{data-list-DL_oFE4j.js → data-list-CyeD_u-6.js} +3 -3
  205. package/dist/{data-list-DL_oFE4j.js.map → data-list-CyeD_u-6.js.map} +1 -1
  206. package/dist/{data-list-D8bACyyK.cjs → data-list-Y42KyuI1.cjs} +3 -3
  207. package/dist/{data-list-D8bACyyK.cjs.map → data-list-Y42KyuI1.cjs.map} +1 -1
  208. package/dist/{data-list-spacer-_bFe0e2u.cjs → data-list-spacer-BSg2hCx7.cjs} +2 -2
  209. package/dist/{data-list-spacer-_bFe0e2u.cjs.map → data-list-spacer-BSg2hCx7.cjs.map} +1 -1
  210. package/dist/{data-list-spacer-CE6-4ZQq.js → data-list-spacer-C8z32twc.js} +2 -2
  211. package/dist/{data-list-spacer-CE6-4ZQq.js.map → data-list-spacer-C8z32twc.js.map} +1 -1
  212. package/dist/{data-panel-CjvoI_lx.cjs → data-panel-D7Qk4iwZ.cjs} +3 -3
  213. package/dist/{data-panel-CjvoI_lx.cjs.map → data-panel-D7Qk4iwZ.cjs.map} +1 -1
  214. package/dist/{data-panel-42fdcagQ.js → data-panel-DuLf5j8S.js} +3 -3
  215. package/dist/{data-panel-42fdcagQ.js.map → data-panel-DuLf5j8S.js.map} +1 -1
  216. package/dist/{date-time-range-picker-C-pSI1u1.js → date-time-range-picker-BDylIIzt.js} +4 -4
  217. package/dist/{date-time-range-picker-C-pSI1u1.js.map → date-time-range-picker-BDylIIzt.js.map} +1 -1
  218. package/dist/{date-time-range-picker-BORAuIJM.cjs → date-time-range-picker-UheN070q.cjs} +4 -4
  219. package/dist/{date-time-range-picker-BORAuIJM.cjs.map → date-time-range-picker-UheN070q.cjs.map} +1 -1
  220. package/dist/{dialog-cKzR2TXI.js → dialog-Dt5kASkl.js} +2 -2
  221. package/dist/{dialog-cKzR2TXI.js.map → dialog-Dt5kASkl.js.map} +1 -1
  222. package/dist/{dialog-action-B3AHq7mU.cjs → dialog-action-C3Tc7ZKI.cjs} +3 -3
  223. package/dist/{dialog-action-B3AHq7mU.cjs.map → dialog-action-C3Tc7ZKI.cjs.map} +1 -1
  224. package/dist/{dialog-action-BGmDoI5T.js → dialog-action-CB3h9Z2J.js} +3 -3
  225. package/dist/{dialog-action-BGmDoI5T.js.map → dialog-action-CB3h9Z2J.js.map} +1 -1
  226. package/dist/{dialog-DYpOpj9s.cjs → dialog-d_AK1NQD.cjs} +2 -2
  227. package/dist/{dialog-DYpOpj9s.cjs.map → dialog-d_AK1NQD.cjs.map} +1 -1
  228. package/dist/domains/auth/components/permission-denied.cjs.js +1 -1
  229. package/dist/domains/auth/components/permission-denied.es.js +1 -1
  230. package/dist/domains/auth/components/session-expired.cjs.js +2 -2
  231. package/dist/domains/auth/components/session-expired.es.js +2 -2
  232. package/dist/domains/chat/attachments/attachment-preview-dialog.cjs.js +2 -2
  233. package/dist/domains/chat/attachments/attachment-preview-dialog.es.js +2 -2
  234. package/dist/domains/chat/attachments/composer-attachment.cjs.js +1 -1
  235. package/dist/domains/chat/attachments/composer-attachment.es.js +1 -1
  236. package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
  237. package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
  238. package/dist/domains/chat/components/network-choice-metadata-dialog.cjs.js +3 -3
  239. package/dist/domains/chat/components/network-choice-metadata-dialog.es.js +3 -3
  240. package/dist/domains/chat/messages/assistant-message-actions.cjs.js +2 -2
  241. package/dist/domains/chat/messages/assistant-message-actions.es.js +2 -2
  242. package/dist/domains/chat/messages/dataset-save-action.cjs.js +5 -5
  243. package/dist/domains/chat/messages/dataset-save-action.es.js +5 -5
  244. package/dist/domains/chat/messages/message-row.cjs.js +5 -5
  245. package/dist/domains/chat/messages/message-row.es.js +5 -5
  246. package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
  247. package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
  248. package/dist/domains/chat/messages/renderers/message-text.cjs.js +3 -3
  249. package/dist/domains/chat/messages/renderers/message-text.es.js +3 -3
  250. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js +1 -1
  251. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js +1 -1
  252. package/dist/domains/chat/messages/renderers/status-renderers.cjs.js +1 -1
  253. package/dist/domains/chat/messages/renderers/status-renderers.es.js +1 -1
  254. package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
  255. package/dist/domains/chat/messages/signal-badge.es.js +1 -1
  256. package/dist/domains/chat/messages/skill-message.cjs.js +3 -3
  257. package/dist/domains/chat/messages/skill-message.es.js +3 -3
  258. package/dist/domains/chat/messages/system-reminder-badge.cjs.js +1 -1
  259. package/dist/domains/chat/messages/system-reminder-badge.es.js +1 -1
  260. package/dist/domains/chat/messages/tripwire-notice.cjs.js +2 -2
  261. package/dist/domains/chat/messages/tripwire-notice.es.js +2 -2
  262. package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
  263. package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
  264. package/dist/domains/chat/tools/badges/agent-badge.cjs.js +4 -4
  265. package/dist/domains/chat/tools/badges/agent-badge.es.js +4 -4
  266. package/dist/domains/chat/tools/badges/ask-user-badge.cjs.js +1 -1
  267. package/dist/domains/chat/tools/badges/ask-user-badge.es.js +1 -1
  268. package/dist/domains/chat/tools/badges/background-task-metadata-dialog.cjs.js +3 -3
  269. package/dist/domains/chat/tools/badges/background-task-metadata-dialog.es.js +3 -3
  270. package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js +3 -3
  271. package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js.map +1 -1
  272. package/dist/domains/chat/tools/badges/code-mode-badge.es.js +3 -3
  273. package/dist/domains/chat/tools/badges/code-mode-badge.es.js.map +1 -1
  274. package/dist/domains/chat/tools/badges/file-tree-badge.cjs.js +3 -3
  275. package/dist/domains/chat/tools/badges/file-tree-badge.es.js +3 -3
  276. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +2 -2
  277. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +2 -2
  278. package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js +2 -2
  279. package/dist/domains/chat/tools/badges/observation-marker-details.es.js +2 -2
  280. package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
  281. package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
  282. package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js +3 -3
  283. package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js.map +1 -1
  284. package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +3 -3
  285. package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js.map +1 -1
  286. package/dist/domains/chat/tools/badges/tool-approval-buttons.cjs.js +1 -1
  287. package/dist/domains/chat/tools/badges/tool-approval-buttons.es.js +1 -1
  288. package/dist/domains/chat/tools/badges/tool-badge.cjs.js +4 -4
  289. package/dist/domains/chat/tools/badges/tool-badge.es.js +4 -4
  290. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +5 -3
  291. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js.map +1 -1
  292. package/dist/domains/chat/tools/badges/workflow-badge.es.js +5 -3
  293. package/dist/domains/chat/tools/badges/workflow-badge.es.js.map +1 -1
  294. package/dist/domains/chat/tools/submit-plan-tool.cjs.js +2 -2
  295. package/dist/domains/chat/tools/submit-plan-tool.es.js +2 -2
  296. package/dist/domains/chat/tools/tool-card-kind.cjs.js +5 -1
  297. package/dist/domains/chat/tools/tool-card-kind.cjs.js.map +1 -1
  298. package/dist/domains/chat/tools/tool-card-kind.es.js +5 -2
  299. package/dist/domains/chat/tools/tool-card-kind.es.js.map +1 -1
  300. package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
  301. package/dist/domains/chat/tools/tool-card.es.js +1 -1
  302. package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js +4 -4
  303. package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js +4 -4
  304. package/dist/domains/logs/components/log-data-panel.cjs.js +3 -3
  305. package/dist/domains/logs/components/log-data-panel.es.js +3 -3
  306. package/dist/domains/logs/components/logs-error-content.cjs.js +1 -1
  307. package/dist/domains/logs/components/logs-error-content.es.js +1 -1
  308. package/dist/domains/logs/components/logs-list-view.cjs.js +1 -1
  309. package/dist/domains/logs/components/logs-list-view.es.js +1 -1
  310. package/dist/domains/logs/components/logs-toolbar.cjs.js +1 -1
  311. package/dist/domains/logs/components/logs-toolbar.es.js +1 -1
  312. package/dist/domains/logs/components/no-logs-info.cjs.js +2 -2
  313. package/dist/domains/logs/components/no-logs-info.es.js +2 -2
  314. package/dist/domains/memory/components/flame-graph.cjs.js +2 -2
  315. package/dist/domains/memory/components/flame-graph.cjs.js.map +1 -1
  316. package/dist/domains/memory/components/flame-graph.es.js +2 -2
  317. package/dist/domains/memory/components/flame-graph.es.js.map +1 -1
  318. package/dist/domains/memory/components/memory-studio-panel.cjs.js +1 -1
  319. package/dist/domains/memory/components/memory-studio-panel.es.js +1 -1
  320. package/dist/domains/memory/components/observation-detail-view.cjs.js +1 -1
  321. package/dist/domains/memory/components/observation-detail-view.es.js +1 -1
  322. package/dist/domains/memory/components/thread-context-progress.cjs.js +1 -1
  323. package/dist/domains/memory/components/thread-context-progress.es.js +1 -1
  324. package/dist/domains/metrics/components/card-action-buttons.cjs.js +1 -1
  325. package/dist/domains/metrics/components/card-action-buttons.es.js +1 -1
  326. package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
  327. package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
  328. package/dist/domains/metrics/components/kpi-card-view.cjs.js +1 -1
  329. package/dist/domains/metrics/components/kpi-card-view.es.js +1 -1
  330. package/dist/domains/metrics/components/latency-card-view.cjs.js +5 -5
  331. package/dist/domains/metrics/components/latency-card-view.cjs.js.map +1 -1
  332. package/dist/domains/metrics/components/latency-card-view.es.js +5 -5
  333. package/dist/domains/metrics/components/latency-card-view.es.js.map +1 -1
  334. package/dist/domains/metrics/components/memory-card-view.cjs.js +5 -5
  335. package/dist/domains/metrics/components/memory-card-view.es.js +5 -5
  336. package/dist/domains/metrics/components/metrics-utils.cjs.js +1 -1
  337. package/dist/domains/metrics/components/metrics-utils.cjs.js.map +1 -1
  338. package/dist/domains/metrics/components/metrics-utils.es.js +1 -1
  339. package/dist/domains/metrics/components/metrics-utils.es.js.map +1 -1
  340. package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js +2 -2
  341. package/dist/domains/metrics/components/model-usage-cost-card-view.es.js +2 -2
  342. package/dist/domains/metrics/components/scores-card-view.cjs.js +6 -6
  343. package/dist/domains/metrics/components/scores-card-view.cjs.js.map +1 -1
  344. package/dist/domains/metrics/components/scores-card-view.es.js +6 -6
  345. package/dist/domains/metrics/components/scores-card-view.es.js.map +1 -1
  346. package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js +4 -4
  347. package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js +4 -4
  348. package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js +5 -5
  349. package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js.map +1 -1
  350. package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js +5 -5
  351. package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js.map +1 -1
  352. package/dist/domains/metrics/components/traces-volume-card-view.cjs.js +4 -4
  353. package/dist/domains/metrics/components/traces-volume-card-view.es.js +4 -4
  354. package/dist/domains/metrics/drilldown.cjs.js +0 -1
  355. package/dist/domains/metrics/drilldown.cjs.js.map +1 -1
  356. package/dist/domains/metrics/drilldown.es.js +0 -1
  357. package/dist/domains/metrics/drilldown.es.js.map +1 -1
  358. package/dist/domains/metrics/metrics-filters.cjs.js +0 -2
  359. package/dist/domains/metrics/metrics-filters.cjs.js.map +1 -1
  360. package/dist/domains/metrics/metrics-filters.es.js +0 -2
  361. package/dist/domains/metrics/metrics-filters.es.js.map +1 -1
  362. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.cjs.js +4 -4
  363. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.es.js +4 -4
  364. package/dist/domains/review/components/review-status-badge.cjs.js +1 -1
  365. package/dist/domains/review/components/review-status-badge.es.js +1 -1
  366. package/dist/domains/scores/components/score-data-panel.cjs.js +2 -2
  367. package/dist/domains/scores/components/score-data-panel.es.js +2 -2
  368. package/dist/domains/scores/components/span-scoring.cjs.js +4 -4
  369. package/dist/domains/scores/components/span-scoring.es.js +4 -4
  370. package/dist/domains/scores/components/trace-scores-tab.cjs.js +5 -4
  371. package/dist/domains/scores/components/trace-scores-tab.cjs.js.map +1 -1
  372. package/dist/domains/scores/components/trace-scores-tab.es.js +5 -4
  373. package/dist/domains/scores/components/trace-scores-tab.es.js.map +1 -1
  374. package/dist/domains/traces/components/feedback-thread.cjs.js +3 -3
  375. package/dist/domains/traces/components/feedback-thread.es.js +3 -3
  376. package/dist/domains/traces/components/format-trace-thread-messages.cjs.js +31 -9
  377. package/dist/domains/traces/components/format-trace-thread-messages.cjs.js.map +1 -1
  378. package/dist/domains/traces/components/format-trace-thread-messages.es.js +31 -9
  379. package/dist/domains/traces/components/format-trace-thread-messages.es.js.map +1 -1
  380. package/dist/domains/traces/components/no-traces-info.cjs.js +1 -1
  381. package/dist/domains/traces/components/no-traces-info.es.js +1 -1
  382. package/dist/domains/traces/components/span-data-panel-view.cjs.js +6 -6
  383. package/dist/domains/traces/components/span-data-panel-view.es.js +6 -6
  384. package/dist/domains/traces/components/span-details-view.cjs.js +1 -1
  385. package/dist/domains/traces/components/span-details-view.es.js +1 -1
  386. package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +2 -2
  387. package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +2 -2
  388. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
  389. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
  390. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +3 -3
  391. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +3 -3
  392. package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js +1 -1
  393. package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js.map +1 -1
  394. package/dist/domains/traces/components/span-payload/span-payload-json.es.js +1 -1
  395. package/dist/domains/traces/components/span-payload/span-payload-json.es.js.map +1 -1
  396. package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +16 -11
  397. package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js.map +1 -1
  398. package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +16 -11
  399. package/dist/domains/traces/components/span-payload/span-payload-messages.es.js.map +1 -1
  400. package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +2 -2
  401. package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +2 -2
  402. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +1 -1
  403. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
  404. package/dist/domains/traces/components/span-payload/span-payload-section.cjs.js +16 -3
  405. package/dist/domains/traces/components/span-payload/span-payload-section.cjs.js.map +1 -1
  406. package/dist/domains/traces/components/span-payload/span-payload-section.es.js +16 -3
  407. package/dist/domains/traces/components/span-payload/span-payload-section.es.js.map +1 -1
  408. package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +2 -2
  409. package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +2 -2
  410. package/dist/domains/traces/components/span-payload/span-processor-attributes.cjs.js +2 -2
  411. package/dist/domains/traces/components/span-payload/span-processor-attributes.es.js +2 -2
  412. package/dist/domains/traces/components/span-summary-description.cjs.js +1 -1
  413. package/dist/domains/traces/components/span-summary-description.es.js +1 -1
  414. package/dist/domains/traces/components/span-type-legend.cjs.js +1 -1
  415. package/dist/domains/traces/components/span-type-legend.es.js +1 -1
  416. package/dist/domains/traces/components/thread-trace/thread-trace-details.cjs.js +1 -1
  417. package/dist/domains/traces/components/thread-trace/thread-trace-details.es.js +1 -1
  418. package/dist/domains/traces/components/thread-trace/thread-trace-messages.cjs.js +6 -6
  419. package/dist/domains/traces/components/thread-trace/thread-trace-messages.cjs.js.map +1 -1
  420. package/dist/domains/traces/components/thread-trace/thread-trace-messages.es.js +6 -6
  421. package/dist/domains/traces/components/thread-trace/thread-trace-messages.es.js.map +1 -1
  422. package/dist/domains/traces/components/thread-trace/thread-trace-spans.cjs.js +1 -1
  423. package/dist/domains/traces/components/thread-trace/thread-trace-spans.es.js +1 -1
  424. package/dist/domains/traces/components/thread-view-by-trace.cjs.js +9 -2
  425. package/dist/domains/traces/components/thread-view-by-trace.cjs.js.map +1 -1
  426. package/dist/domains/traces/components/thread-view-by-trace.es.js +10 -3
  427. package/dist/domains/traces/components/thread-view-by-trace.es.js.map +1 -1
  428. package/dist/domains/traces/components/trace-columns-menu.cjs.js +5 -5
  429. package/dist/domains/traces/components/trace-columns-menu.es.js +5 -5
  430. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +6 -6
  431. package/dist/domains/traces/components/trace-data-panel-view.es.js +6 -6
  432. package/dist/domains/traces/components/trace-data-panel.cjs.js +4 -2
  433. package/dist/domains/traces/components/trace-data-panel.cjs.js.map +1 -1
  434. package/dist/domains/traces/components/trace-data-panel.es.js +4 -2
  435. package/dist/domains/traces/components/trace-data-panel.es.js.map +1 -1
  436. package/dist/domains/traces/components/trace-id-button.cjs.js +1 -1
  437. package/dist/domains/traces/components/trace-id-button.es.js +1 -1
  438. package/dist/domains/traces/components/trace-messages-panel.cjs.js +1 -1
  439. package/dist/domains/traces/components/trace-messages-panel.es.js +1 -1
  440. package/dist/domains/traces/components/trace-status-value.cjs.js +1 -1
  441. package/dist/domains/traces/components/trace-status-value.cjs.js.map +1 -1
  442. package/dist/domains/traces/components/trace-status-value.es.js +1 -1
  443. package/dist/domains/traces/components/trace-status-value.es.js.map +1 -1
  444. package/dist/domains/traces/components/trace-summary-description.cjs.js +1 -1
  445. package/dist/domains/traces/components/trace-summary-description.es.js +1 -1
  446. package/dist/domains/traces/components/trace-thread-item-view.cjs.js +9 -2
  447. package/dist/domains/traces/components/trace-thread-item-view.cjs.js.map +1 -1
  448. package/dist/domains/traces/components/trace-thread-item-view.es.js +10 -3
  449. package/dist/domains/traces/components/trace-thread-item-view.es.js.map +1 -1
  450. package/dist/domains/traces/components/trace-thread-panel.cjs.js +1 -1
  451. package/dist/domains/traces/components/trace-thread-panel.es.js +1 -1
  452. package/dist/domains/traces/components/trace-time-range-chip.cjs.js +2 -2
  453. package/dist/domains/traces/components/trace-time-range-chip.es.js +2 -2
  454. package/dist/domains/traces/components/traces-error-content.cjs.js +1 -1
  455. package/dist/domains/traces/components/traces-error-content.es.js +1 -1
  456. package/dist/domains/traces/components/traces-list-mode-toggle.cjs.js +1 -1
  457. package/dist/domains/traces/components/traces-list-mode-toggle.es.js +1 -1
  458. package/dist/domains/traces/components/traces-list-view.cjs.js +2 -2
  459. package/dist/domains/traces/components/traces-list-view.es.js +2 -2
  460. package/dist/domains/traces/components/traces-page-skeleton.cjs.js +2 -0
  461. package/dist/domains/traces/components/traces-page-skeleton.cjs.js.map +1 -1
  462. package/dist/domains/traces/components/traces-page-skeleton.es.js +2 -0
  463. package/dist/domains/traces/components/traces-page-skeleton.es.js.map +1 -1
  464. package/dist/domains/traces/hooks/use-trace-query.cjs.js +2 -2
  465. package/dist/domains/traces/hooks/use-trace-query.cjs.js.map +1 -1
  466. package/dist/domains/traces/hooks/use-trace-query.es.js +2 -2
  467. package/dist/domains/traces/hooks/use-trace-query.es.js.map +1 -1
  468. package/dist/domains/traces/trace-filters.cjs.js +5 -5
  469. package/dist/domains/traces/trace-filters.cjs.js.map +1 -1
  470. package/dist/domains/traces/trace-filters.es.js +5 -5
  471. package/dist/domains/traces/trace-filters.es.js.map +1 -1
  472. package/dist/domains/workflows/components/workflow-combobox.cjs.js +1 -1
  473. package/dist/domains/workflows/components/workflow-combobox.es.js +1 -1
  474. package/dist/domains/workflows/components/workflow-entity-header.cjs.js +1 -1
  475. package/dist/domains/workflows/components/workflow-entity-header.es.js +1 -1
  476. package/dist/domains/workflows/components/workflow-information.cjs.js +1 -1
  477. package/dist/domains/workflows/components/workflow-information.es.js +1 -1
  478. package/dist/domains/workflows/components/workflow-step-detail.cjs.js +3 -3
  479. package/dist/domains/workflows/components/workflow-step-detail.es.js +3 -3
  480. package/dist/domains/workflows/components/workflows-list/no-workflows-info.cjs.js +2 -2
  481. package/dist/domains/workflows/components/workflows-list/no-workflows-info.es.js +2 -2
  482. package/dist/domains/workflows/components/workflows-list/workflows-list.cjs.js +3 -3
  483. package/dist/domains/workflows/components/workflows-list/workflows-list.cjs.js.map +1 -1
  484. package/dist/domains/workflows/components/workflows-list/workflows-list.es.js +3 -3
  485. package/dist/domains/workflows/components/workflows-list/workflows-list.es.js.map +1 -1
  486. package/dist/domains/workflows/runs/workflow-run-list.cjs.js +2 -2
  487. package/dist/domains/workflows/runs/workflow-run-list.es.js +2 -2
  488. package/dist/domains/workflows/workflow/data/workflow-data-button.cjs.js +1 -1
  489. package/dist/domains/workflows/workflow/data/workflow-data-button.es.js +1 -1
  490. package/dist/domains/workflows/workflow/data/workflow-data-inspector.cjs.js +4 -4
  491. package/dist/domains/workflows/workflow/data/workflow-data-inspector.cjs.js.map +1 -1
  492. package/dist/domains/workflows/workflow/data/workflow-data-inspector.es.js +4 -4
  493. package/dist/domains/workflows/workflow/data/workflow-data-inspector.es.js.map +1 -1
  494. package/dist/domains/workflows/workflow/input/workflow-json-input.cjs.js +2 -2
  495. package/dist/domains/workflows/workflow/input/workflow-json-input.es.js +2 -2
  496. package/dist/domains/workflows/workflow/input/workflow-processor-input.cjs.js +3 -3
  497. package/dist/domains/workflows/workflow/input/workflow-processor-input.es.js +3 -3
  498. package/dist/domains/workflows/workflow/use-workflow-graph-runtime.cjs.js +2 -2
  499. package/dist/domains/workflows/workflow/use-workflow-graph-runtime.es.js +2 -2
  500. package/dist/domains/workflows/workflow/workflow-body-graph.cjs.js +1 -1
  501. package/dist/domains/workflows/workflow/workflow-body-graph.es.js +1 -1
  502. package/dist/domains/workflows/workflow/workflow-cancel-button.cjs.js +1 -1
  503. package/dist/domains/workflows/workflow/workflow-cancel-button.es.js +1 -1
  504. package/dist/domains/workflows/workflow/workflow-data-edge.cjs.js +1 -1
  505. package/dist/domains/workflows/workflow/workflow-data-edge.es.js +1 -1
  506. package/dist/domains/workflows/workflow/workflow-debug-step-controls.cjs.js +1 -1
  507. package/dist/domains/workflows/workflow/workflow-debug-step-controls.es.js +1 -1
  508. package/dist/domains/workflows/workflow/workflow-graph-boundary.cjs.js +3 -3
  509. package/dist/domains/workflows/workflow/workflow-graph-boundary.es.js +3 -3
  510. package/dist/domains/workflows/workflow/workflow-graph-inner.cjs.js +2 -2
  511. package/dist/domains/workflows/workflow/workflow-graph-inner.es.js +2 -2
  512. package/dist/domains/workflows/workflow/workflow-graph-node.cjs.js +2 -2
  513. package/dist/domains/workflows/workflow/workflow-graph-node.es.js +2 -2
  514. package/dist/domains/workflows/workflow/workflow-input-data.cjs.js +1 -1
  515. package/dist/domains/workflows/workflow/workflow-input-data.es.js +1 -1
  516. package/dist/domains/workflows/workflow/workflow-map-config-dialog.cjs.js +3 -3
  517. package/dist/domains/workflows/workflow/workflow-map-config-dialog.es.js +3 -3
  518. package/dist/domains/workflows/workflow/workflow-nested-graph.cjs.js +3 -3
  519. package/dist/domains/workflows/workflow/workflow-nested-graph.es.js +3 -3
  520. package/dist/domains/workflows/workflow/workflow-run-data.cjs.js +4 -4
  521. package/dist/domains/workflows/workflow/workflow-run-data.es.js +4 -4
  522. package/dist/domains/workflows/workflow/workflow-run-error.cjs.js +1 -1
  523. package/dist/domains/workflows/workflow/workflow-run-error.es.js +1 -1
  524. package/dist/domains/workflows/workflow/workflow-run-header.cjs.js +4 -4
  525. package/dist/domains/workflows/workflow/workflow-run-header.cjs.js.map +1 -1
  526. package/dist/domains/workflows/workflow/workflow-run-header.es.js +4 -4
  527. package/dist/domains/workflows/workflow/workflow-run-header.es.js.map +1 -1
  528. package/dist/domains/workflows/workflow/workflow-status.cjs.js +2 -2
  529. package/dist/domains/workflows/workflow/workflow-status.cjs.js.map +1 -1
  530. package/dist/domains/workflows/workflow/workflow-status.es.js +2 -2
  531. package/dist/domains/workflows/workflow/workflow-status.es.js.map +1 -1
  532. package/dist/domains/workflows/workflow/workflow-step-action-bar.cjs.js +3 -3
  533. package/dist/domains/workflows/workflow/workflow-step-action-bar.es.js +3 -3
  534. package/dist/domains/workflows/workflow/workflow-suspended-steps.cjs.js +2 -2
  535. package/dist/domains/workflows/workflow/workflow-suspended-steps.es.js +2 -2
  536. package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js +3 -3
  537. package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js +3 -3
  538. package/dist/domains/workflows/workflow/workflow-timeline-row.cjs.js +1 -1
  539. package/dist/domains/workflows/workflow/workflow-timeline-row.es.js +1 -1
  540. package/dist/domains/workflows/workflow/workflow-timeline.cjs.js +1 -1
  541. package/dist/domains/workflows/workflow/workflow-timeline.es.js +1 -1
  542. package/dist/domains/workflows/workflow/workflow-trigger-form.cjs.js +1 -1
  543. package/dist/domains/workflows/workflow/workflow-trigger-form.es.js +1 -1
  544. package/dist/domains/workflows/workflow/workflow-trigger-header.cjs.js +2 -2
  545. package/dist/domains/workflows/workflow/workflow-trigger-header.es.js +2 -2
  546. package/dist/domains/workflows/workflow-status-tone.cjs.js +2 -2
  547. package/dist/domains/workflows/workflow-status-tone.cjs.js.map +1 -1
  548. package/dist/domains/workflows/workflow-status-tone.es.js +2 -2
  549. package/dist/domains/workflows/workflow-status-tone.es.js.map +1 -1
  550. package/dist/{drawer-DXf50w71.js → drawer-BI3B_krl.js} +2 -2
  551. package/dist/{drawer-DXf50w71.js.map → drawer-BI3B_krl.js.map} +1 -1
  552. package/dist/{drawer-d81cZiSV.cjs → drawer-DnXudVbm.cjs} +2 -2
  553. package/dist/{drawer-d81cZiSV.cjs.map → drawer-DnXudVbm.cjs.map} +1 -1
  554. package/dist/ee/signals/components/entity-index-compact-grid.cjs.js +1 -1
  555. package/dist/ee/signals/components/entity-index-compact-grid.es.js +1 -1
  556. package/dist/ee/signals/components/entity-index-list.cjs.js +4 -2
  557. package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
  558. package/dist/ee/signals/components/entity-index-list.es.js +4 -2
  559. package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
  560. package/dist/ee/signals/components/signals-empty-state.cjs.js +1 -1
  561. package/dist/ee/signals/components/signals-empty-state.es.js +1 -1
  562. package/dist/ee/signals/components/trace-intelligence-entity-detail.cjs.js +1 -1
  563. package/dist/ee/signals/components/trace-intelligence-entity-detail.es.js +1 -1
  564. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +5 -4
  565. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js.map +1 -1
  566. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +5 -4
  567. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js.map +1 -1
  568. package/dist/ee/signals/examples-pager.cjs.js +1 -1
  569. package/dist/ee/signals/examples-pager.es.js +1 -1
  570. package/dist/ee/signals/flow-card.cjs.js +1 -1
  571. package/dist/ee/signals/flow-card.es.js +1 -1
  572. package/dist/ee/signals/noise-detail-panel.cjs.js +3 -3
  573. package/dist/ee/signals/noise-detail-panel.cjs.js.map +1 -1
  574. package/dist/ee/signals/noise-detail-panel.es.js +3 -3
  575. package/dist/ee/signals/noise-detail-panel.es.js.map +1 -1
  576. package/dist/ee/signals/sankey-signals.cjs.js +2 -2
  577. package/dist/ee/signals/sankey-signals.cjs.js.map +1 -1
  578. package/dist/ee/signals/sankey-signals.es.js +2 -2
  579. package/dist/ee/signals/sankey-signals.es.js.map +1 -1
  580. package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +5 -5
  581. package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +5 -5
  582. package/dist/ee/signals/settings/trace-signal-settings.cjs.js +3 -3
  583. package/dist/ee/signals/settings/trace-signal-settings.es.js +3 -3
  584. package/dist/ee/signals/signal-colors.cjs.js +3 -3
  585. package/dist/ee/signals/signal-colors.cjs.js.map +1 -1
  586. package/dist/ee/signals/signal-colors.es.js +3 -3
  587. package/dist/ee/signals/signal-colors.es.js.map +1 -1
  588. package/dist/ee/signals/signals-error-state.cjs.js +2 -2
  589. package/dist/ee/signals/signals-error-state.cjs.js.map +1 -1
  590. package/dist/ee/signals/signals-error-state.es.js +2 -2
  591. package/dist/ee/signals/signals-error-state.es.js.map +1 -1
  592. package/dist/ee/signals/snapshot-timeline.cjs.js +1 -1
  593. package/dist/ee/signals/snapshot-timeline.es.js +1 -1
  594. package/dist/ee/signals/theme-detail-panel.cjs.js +4 -4
  595. package/dist/ee/signals/theme-detail-panel.cjs.js.map +1 -1
  596. package/dist/ee/signals/theme-detail-panel.es.js +4 -4
  597. package/dist/ee/signals/theme-detail-panel.es.js.map +1 -1
  598. package/dist/ee/signals/theme-filter-banner.cjs.js +1 -1
  599. package/dist/ee/signals/theme-filter-banner.es.js +1 -1
  600. package/dist/ee/signals/trace-insight-view.cjs.js +4 -4
  601. package/dist/ee/signals/trace-insight-view.cjs.js.map +1 -1
  602. package/dist/ee/signals/trace-insight-view.es.js +4 -4
  603. package/dist/ee/signals/trace-insight-view.es.js.map +1 -1
  604. package/dist/ee/signals/view-mode-tab.cjs.js +1 -1
  605. package/dist/ee/signals/view-mode-tab.es.js +1 -1
  606. package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +3 -3
  607. package/dist/ee/topics/components/topic-trace-summary-list.es.js +3 -3
  608. package/dist/{field-block-DpejZ6U6.js → field-block--PeppIRb.js} +10 -3
  609. package/dist/field-block--PeppIRb.js.map +1 -0
  610. package/dist/{field-block-BIDi9Bvc.cjs → field-block-DtaPqBa3.cjs} +10 -3
  611. package/dist/field-block-DtaPqBa3.cjs.map +1 -0
  612. package/dist/{field-block-error-msg-B6-wnlAz.cjs → field-block-error-msg-CkhEN6nU.cjs} +2 -2
  613. package/dist/{field-block-error-msg-B6-wnlAz.cjs.map → field-block-error-msg-CkhEN6nU.cjs.map} +1 -1
  614. package/dist/{field-block-error-msg-edlaudVx.js → field-block-error-msg-LXwhKzIq.js} +2 -2
  615. package/dist/{field-block-error-msg-edlaudVx.js.map → field-block-error-msg-LXwhKzIq.js.map} +1 -1
  616. package/dist/{filter-bar-chip-D4CSm9KP.cjs → filter-bar-chip-CBlHsz4A.cjs} +3 -3
  617. package/dist/{filter-bar-chip-D4CSm9KP.cjs.map → filter-bar-chip-CBlHsz4A.cjs.map} +1 -1
  618. package/dist/{filter-bar-chip-BNPOrSrD.js → filter-bar-chip-DFOtEvpW.js} +3 -3
  619. package/dist/{filter-bar-chip-BNPOrSrD.js.map → filter-bar-chip-DFOtEvpW.js.map} +1 -1
  620. package/dist/hooks/use-environment-variables-editor.cjs.js +6 -1
  621. package/dist/hooks/use-environment-variables-editor.cjs.js.map +1 -1
  622. package/dist/hooks/use-environment-variables-editor.es.js +6 -1
  623. package/dist/hooks/use-environment-variables-editor.es.js.map +1 -1
  624. package/dist/{input-group-B8bnoDrA.js → input-group-0G9ZX_cM.js} +2 -2
  625. package/dist/{input-group-B8bnoDrA.js.map → input-group-0G9ZX_cM.js.map} +1 -1
  626. package/dist/{input-group-I8YVM_Ps.cjs → input-group-BRhBfeHC.cjs} +2 -2
  627. package/dist/{input-group-I8YVM_Ps.cjs.map → input-group-BRhBfeHC.cjs.map} +1 -1
  628. package/dist/layout/tabbed-container.cjs.js +6 -6
  629. package/dist/layout/tabbed-container.es.js +6 -6
  630. package/dist/lib/form/components/array-element-wrapper.cjs.js +2 -2
  631. package/dist/lib/form/components/array-element-wrapper.cjs.js.map +1 -1
  632. package/dist/lib/form/components/array-element-wrapper.es.js +2 -2
  633. package/dist/lib/form/components/array-element-wrapper.es.js.map +1 -1
  634. package/dist/lib/form/components/array-wrapper.cjs.js +1 -1
  635. package/dist/lib/form/components/array-wrapper.es.js +1 -1
  636. package/dist/lib/form/components/boolean-field.cjs.js +1 -1
  637. package/dist/lib/form/components/boolean-field.es.js +1 -1
  638. package/dist/lib/form/components/date-field.cjs.js +1 -1
  639. package/dist/lib/form/components/date-field.es.js +1 -1
  640. package/dist/lib/form/components/error-message.cjs.js +1 -1
  641. package/dist/lib/form/components/error-message.es.js +1 -1
  642. package/dist/lib/form/components/field-wrapper.cjs.js +1 -1
  643. package/dist/lib/form/components/field-wrapper.es.js +1 -1
  644. package/dist/lib/form/components/form-submit-row.cjs.js +1 -1
  645. package/dist/lib/form/components/form-submit-row.es.js +1 -1
  646. package/dist/lib/form/components/object-wrapper.cjs.js +1 -1
  647. package/dist/lib/form/components/object-wrapper.cjs.js.map +1 -1
  648. package/dist/lib/form/components/object-wrapper.es.js +1 -1
  649. package/dist/lib/form/components/object-wrapper.es.js.map +1 -1
  650. package/dist/lib/form/components/record-field.cjs.js +1 -1
  651. package/dist/lib/form/components/record-field.es.js +1 -1
  652. package/dist/lib/form/components/select-field.cjs.js +1 -1
  653. package/dist/lib/form/components/select-field.es.js +1 -1
  654. package/dist/lib/form/components/submit-button.cjs.js +1 -1
  655. package/dist/lib/form/components/submit-button.es.js +1 -1
  656. package/dist/{list-search-DXb7HFX8.cjs → list-search-BzAIj0DB.cjs} +2 -2
  657. package/dist/{list-search-DXb7HFX8.cjs.map → list-search-BzAIj0DB.cjs.map} +1 -1
  658. package/dist/{list-search-9l8IEdxZ.js → list-search-DI1DH7vU.js} +2 -2
  659. package/dist/{list-search-9l8IEdxZ.js.map → list-search-DI1DH7vU.js.map} +1 -1
  660. package/dist/{logs-data-list-C77r2FOj.js → logs-data-list-ButZV-2H.js} +3 -3
  661. package/dist/{logs-data-list-C77r2FOj.js.map → logs-data-list-ButZV-2H.js.map} +1 -1
  662. package/dist/{logs-data-list-CEFyG1Xb.cjs → logs-data-list-CtHern11.cjs} +3 -3
  663. package/dist/{logs-data-list-CEFyG1Xb.cjs.map → logs-data-list-CtHern11.cjs.map} +1 -1
  664. package/dist/{main-sidebar-link-active-BNko0jHZ.cjs → main-sidebar-link-active-D8VSuJKx.cjs} +2 -2
  665. package/dist/{main-sidebar-link-active-BNko0jHZ.cjs.map → main-sidebar-link-active-D8VSuJKx.cjs.map} +1 -1
  666. package/dist/{main-sidebar-link-active-1_ktyA8Q.js → main-sidebar-link-active-buZAhlHo.js} +2 -2
  667. package/dist/{main-sidebar-link-active-1_ktyA8Q.js.map → main-sidebar-link-active-buZAhlHo.js.map} +1 -1
  668. package/dist/{markdown-renderer-CSwjfPaf.cjs → markdown-renderer-CZV6neya.cjs} +3 -3
  669. package/dist/{markdown-renderer-CSwjfPaf.cjs.map → markdown-renderer-CZV6neya.cjs.map} +1 -1
  670. package/dist/{markdown-renderer-Bl0V7FCo.js → markdown-renderer-Cy7Iwy1c.js} +3 -3
  671. package/dist/{markdown-renderer-Bl0V7FCo.js.map → markdown-renderer-Cy7Iwy1c.js.map} +1 -1
  672. package/dist/{message-copy-button-DP3U-xA-.js → message-copy-button-C_mFZ3Vg.js} +2 -2
  673. package/dist/{message-copy-button-DP3U-xA-.js.map → message-copy-button-C_mFZ3Vg.js.map} +1 -1
  674. package/dist/{message-copy-button-ClJBX9qx.cjs → message-copy-button-CqMR2T2t.cjs} +2 -2
  675. package/dist/{message-copy-button-ClJBX9qx.cjs.map → message-copy-button-CqMR2T2t.cjs.map} +1 -1
  676. package/dist/{metrics-card-CloSmyRQ.js → metrics-card-C1rTkbcn.js} +3 -3
  677. package/dist/metrics-card-C1rTkbcn.js.map +1 -0
  678. package/dist/{metrics-card-HmQJHDNa.cjs → metrics-card-D7J9JDgn.cjs} +3 -3
  679. package/dist/metrics-card-D7J9JDgn.cjs.map +1 -0
  680. package/dist/{metrics-kpi-card-CW24YjZp.cjs → metrics-kpi-card-1hbihR2T.cjs} +3 -3
  681. package/dist/metrics-kpi-card-1hbihR2T.cjs.map +1 -0
  682. package/dist/{metrics-kpi-card-DLDT28IB.js → metrics-kpi-card-CiB88L41.js} +3 -3
  683. package/dist/metrics-kpi-card-CiB88L41.js.map +1 -0
  684. package/dist/new/settings.cjs.js +1 -1
  685. package/dist/new/settings.es.js +1 -1
  686. package/dist/new/sidebar.cjs.js +3 -3
  687. package/dist/new/sidebar.cjs.js.map +1 -1
  688. package/dist/new/sidebar.es.js +4 -4
  689. package/dist/new/sidebar.es.js.map +1 -1
  690. package/dist/{notification-activity-B1_2BPe_.js → notification-activity-CFR_b8eA.js} +4 -4
  691. package/dist/notification-activity-CFR_b8eA.js.map +1 -0
  692. package/dist/{notification-activity-BAn2fhYd.cjs → notification-activity-Dk50wcE4.cjs} +4 -4
  693. package/dist/notification-activity-Dk50wcE4.cjs.map +1 -0
  694. package/dist/{plan-DJfH1c_u.js → plan-CvTAGIWv.js} +10 -55
  695. package/dist/plan-CvTAGIWv.js.map +1 -0
  696. package/dist/{plan-ZKAT5frg.cjs → plan-DsfNN3a0.cjs} +10 -55
  697. package/dist/plan-DsfNN3a0.cjs.map +1 -0
  698. package/dist/primitives/menu-item.cjs.js +2 -2
  699. package/dist/primitives/menu-item.cjs.js.map +1 -1
  700. package/dist/primitives/menu-item.es.js +2 -2
  701. package/dist/primitives/menu-item.es.js.map +1 -1
  702. package/dist/primitives/trigger-button.cjs.js +1 -1
  703. package/dist/primitives/trigger-button.es.js +1 -1
  704. package/dist/{property-filter-applied-D0F0BYMY.cjs → property-filter-applied-Bp2z4KBv.cjs} +2 -2
  705. package/dist/{property-filter-applied-D0F0BYMY.cjs.map → property-filter-applied-Bp2z4KBv.cjs.map} +1 -1
  706. package/dist/{property-filter-applied-k0TOa9hf.js → property-filter-applied-C9verwDR.js} +2 -2
  707. package/dist/{property-filter-applied-k0TOa9hf.js.map → property-filter-applied-C9verwDR.js.map} +1 -1
  708. package/dist/{reasoning-activity-CO0Ab1Za.cjs → reasoning-activity-BVviIdMe.cjs} +3 -3
  709. package/dist/{reasoning-activity-CO0Ab1Za.cjs.map → reasoning-activity-BVviIdMe.cjs.map} +1 -1
  710. package/dist/{reasoning-activity-D3oCzL58.js → reasoning-activity-OM1-hbCV.js} +3 -3
  711. package/dist/{reasoning-activity-D3oCzL58.js.map → reasoning-activity-OM1-hbCV.js.map} +1 -1
  712. package/dist/{relative-timestamp-D-IvjsVb.cjs → relative-timestamp-BlmN8Vjn.cjs} +2 -2
  713. package/dist/{relative-timestamp-D-IvjsVb.cjs.map → relative-timestamp-BlmN8Vjn.cjs.map} +1 -1
  714. package/dist/{relative-timestamp-wERh5vUE.js → relative-timestamp-Cnp4VeLp.js} +2 -2
  715. package/dist/{relative-timestamp-wERh5vUE.js.map → relative-timestamp-Cnp4VeLp.js.map} +1 -1
  716. package/dist/resize/panel-drawer.cjs.js +1 -1
  717. package/dist/resize/panel-drawer.es.js +1 -1
  718. package/dist/{sankey-chart-D-xMiO2u.js → sankey-chart-D4Idjtth.js} +2 -2
  719. package/dist/sankey-chart-D4Idjtth.js.map +1 -0
  720. package/dist/{sankey-chart-S7iF7d0E.cjs → sankey-chart-DfVMZpz5.cjs} +2 -2
  721. package/dist/sankey-chart-DfVMZpz5.cjs.map +1 -0
  722. package/dist/{search-field-block-Cj9lJsYi.js → search-field-block-BPJh5yuW.js} +3 -3
  723. package/dist/{search-field-block-Cj9lJsYi.js.map → search-field-block-BPJh5yuW.js.map} +1 -1
  724. package/dist/{search-field-block-B1eqMV8x.cjs → search-field-block-DRa-ZNQj.cjs} +3 -3
  725. package/dist/{search-field-block-B1eqMV8x.cjs.map → search-field-block-DRa-ZNQj.cjs.map} +1 -1
  726. package/dist/{section-B5g_0tUo.js → section-BfEsNViI.js} +2 -2
  727. package/dist/{section-B5g_0tUo.js.map → section-BfEsNViI.js.map} +1 -1
  728. package/dist/{section-Bbp-NIR9.cjs → section-dBeXxS69.cjs} +2 -2
  729. package/dist/{section-Bbp-NIR9.cjs.map → section-dBeXxS69.cjs.map} +1 -1
  730. package/dist/segmented-control--I3IgW21.cjs +157 -0
  731. package/dist/segmented-control--I3IgW21.cjs.map +1 -0
  732. package/dist/segmented-control-BxeiypPR.js +135 -0
  733. package/dist/segmented-control-BxeiypPR.js.map +1 -0
  734. package/dist/{select-C0ZGSJYa.cjs → select-DBY9LQFQ.cjs} +2 -2
  735. package/dist/{select-C0ZGSJYa.cjs.map → select-DBY9LQFQ.cjs.map} +1 -1
  736. package/dist/{select-ch8imm15.js → select-DZeNf-kI.js} +2 -2
  737. package/dist/{select-ch8imm15.js.map → select-DZeNf-kI.js.map} +1 -1
  738. package/dist/{select-field-block-_ZUzUs7l.js → select-field-block-C_x9wNpU.js} +3 -3
  739. package/dist/{select-field-block-_ZUzUs7l.js.map → select-field-block-C_x9wNpU.js.map} +1 -1
  740. package/dist/{select-field-block-Dy_N3tWv.cjs → select-field-block-D8AMzoQT.cjs} +3 -3
  741. package/dist/{select-field-block-Dy_N3tWv.cjs.map → select-field-block-D8AMzoQT.cjs.map} +1 -1
  742. package/dist/{settings-row-2hq9Ww8Z.js → settings-row-C1JZDdz_.js} +4 -4
  743. package/dist/settings-row-C1JZDdz_.js.map +1 -0
  744. package/dist/{settings-row-BMRADph-.cjs → settings-row-C7YKfUgY.cjs} +4 -4
  745. package/dist/settings-row-C7YKfUgY.cjs.map +1 -0
  746. package/dist/{side-dialog-D2O3Y7GB.js → side-dialog-DCzCcZs6.js} +5 -5
  747. package/dist/{side-dialog-D2O3Y7GB.js.map → side-dialog-DCzCcZs6.js.map} +1 -1
  748. package/dist/{side-dialog-7P9aEC4v.cjs → side-dialog-DFnD1498.cjs} +5 -5
  749. package/dist/{side-dialog-7P9aEC4v.cjs.map → side-dialog-DFnD1498.cjs.map} +1 -1
  750. package/dist/{signal-activity-1REUU8T_.js → signal-activity-DW2ExjIp.js} +3 -3
  751. package/dist/{signal-activity-1REUU8T_.js.map → signal-activity-DW2ExjIp.js.map} +1 -1
  752. package/dist/{signal-activity-4OJb4kp6.cjs → signal-activity-byCTRP86.cjs} +3 -3
  753. package/dist/{signal-activity-4OJb4kp6.cjs.map → signal-activity-byCTRP86.cjs.map} +1 -1
  754. package/dist/{span-payload-primitives-CbXrqcs-.cjs → span-payload-primitives-D0mhsndj.cjs} +3 -3
  755. package/dist/{span-payload-primitives-CbXrqcs-.cjs.map → span-payload-primitives-D0mhsndj.cjs.map} +1 -1
  756. package/dist/{span-payload-primitives-CEflnpwW.js → span-payload-primitives-DL1Kr0cu.js} +3 -3
  757. package/dist/{span-payload-primitives-CEflnpwW.js.map → span-payload-primitives-DL1Kr0cu.js.map} +1 -1
  758. package/dist/src/domains/chat/tools/tool-card-kind.d.ts +2 -0
  759. package/dist/src/domains/metrics/components/metrics-utils.d.ts +1 -1
  760. package/dist/src/domains/metrics/hooks/use-metrics-filters.d.ts +0 -1
  761. package/dist/src/domains/metrics/metrics-filters.d.ts +0 -2
  762. package/dist/src/domains/traces/components/trace-data-panel-view.stories.d.ts +2 -0
  763. package/dist/src/domains/traces/hooks/use-trace-query.d.ts +1 -1
  764. package/dist/src/ds/components/Badge/Badge.d.ts +3 -3
  765. package/dist/src/ds/components/ButtonsGroup/buttons-group.d.ts +1 -0
  766. package/dist/src/ds/components/ButtonsGroup/buttons-group.stories.d.ts +0 -6
  767. package/dist/src/ds/components/CodeEditor/variable-autocomplete-extension.d.ts +6 -0
  768. package/dist/src/ds/components/CollapsibleBox/collapsible-box.d.ts +10 -0
  769. package/dist/src/ds/components/CollapsibleBox/collapsible-box.stories.d.ts +11 -0
  770. package/dist/src/ds/components/CollapsibleBox/index.d.ts +2 -0
  771. package/dist/src/ds/components/CollapsibleBox/use-collapsible-box.d.ts +14 -0
  772. package/dist/src/ds/components/Combobox/combobox-styles.d.ts +1 -1
  773. package/dist/src/ds/components/SegmentedControl/index.d.ts +1 -0
  774. package/dist/src/ds/components/SegmentedControl/segmented-control.d.ts +38 -0
  775. package/dist/src/ds/components/SegmentedControl/segmented-control.stories.d.ts +11 -0
  776. package/dist/src/ds/components/ThemeToggle/theme-toggle.d.ts +12 -30
  777. package/dist/src/ds/components/ThemeToggle/theme-toggle.stories.d.ts +0 -1
  778. package/dist/src/ds/components/TokenBudget/tones.d.ts +1 -1
  779. package/dist/src/ds/components/Workflow/cards/workflow-card-badge-utils.d.ts +2 -2
  780. package/dist/src/ds/components/ai/plan/plan.d.ts +1 -1
  781. package/dist/src/ds/tokens/colors.d.ts +31 -28
  782. package/dist/src/hooks/use-environment-variables-editor.d.ts +1 -1
  783. package/dist/src/lib/colors.d.ts +1 -1
  784. package/dist/style.css +517 -184
  785. package/dist/{tabs-content-h2qqD8t-.js → tabs-content-CwbkTutf.js} +2 -2
  786. package/dist/{tabs-content-h2qqD8t-.js.map → tabs-content-CwbkTutf.js.map} +1 -1
  787. package/dist/{tabs-content-DQNRMjup.cjs → tabs-content-DnscxcLI.cjs} +2 -2
  788. package/dist/{tabs-content-DQNRMjup.cjs.map → tabs-content-DnscxcLI.cjs.map} +1 -1
  789. package/dist/{tabs-root-BqC8X_h6.cjs → tabs-root-C-ePF1y9.cjs} +4 -4
  790. package/dist/tabs-root-C-ePF1y9.cjs.map +1 -0
  791. package/dist/{tabs-root-4vL8SHCO.js → tabs-root-lrZZ3KwH.js} +4 -4
  792. package/dist/tabs-root-lrZZ3KwH.js.map +1 -0
  793. package/dist/{tabs-tab-lm4xyjtD.cjs → tabs-tab-BmIBFifi.cjs} +2 -2
  794. package/dist/{tabs-tab-lm4xyjtD.cjs.map → tabs-tab-BmIBFifi.cjs.map} +1 -1
  795. package/dist/{tabs-tab-7e2as-AV.js → tabs-tab-DoPSW-1s.js} +2 -2
  796. package/dist/{tabs-tab-7e2as-AV.js.map → tabs-tab-DoPSW-1s.js.map} +1 -1
  797. package/dist/{text-field-block-DYOWjPgO.cjs → text-field-block-DUntfMPu.cjs} +2 -2
  798. package/dist/{text-field-block-DYOWjPgO.cjs.map → text-field-block-DUntfMPu.cjs.map} +1 -1
  799. package/dist/{text-field-block-DJsOk8dJ.js → text-field-block-DZaGiu5D.js} +2 -2
  800. package/dist/{text-field-block-DJsOk8dJ.js.map → text-field-block-DZaGiu5D.js.map} +1 -1
  801. package/dist/{textarea-field-block-DqTd31gF.js → textarea-field-block-BscOSlvI.js} +2 -2
  802. package/dist/{textarea-field-block-DqTd31gF.js.map → textarea-field-block-BscOSlvI.js.map} +1 -1
  803. package/dist/{textarea-field-block-C5fPL2Hn.cjs → textarea-field-block-CKAhmLrz.cjs} +2 -2
  804. package/dist/{textarea-field-block-C5fPL2Hn.cjs.map → textarea-field-block-CKAhmLrz.cjs.map} +1 -1
  805. package/dist/{thread-list-DGI6M6if.js → thread-list-BTpezI4f.js} +2 -2
  806. package/dist/{thread-list-DGI6M6if.js.map → thread-list-BTpezI4f.js.map} +1 -1
  807. package/dist/{thread-list-DwASH1Vl.cjs → thread-list-Drcptd4x.cjs} +2 -2
  808. package/dist/{thread-list-DwASH1Vl.cjs.map → thread-list-Drcptd4x.cjs.map} +1 -1
  809. package/dist/{time-picker-CfZbLgMm.js → time-picker-BElZALzM.js} +2 -2
  810. package/dist/{time-picker-CfZbLgMm.js.map → time-picker-BElZALzM.js.map} +1 -1
  811. package/dist/{time-picker-C0DCPWpR.cjs → time-picker-_QJdolkZ.cjs} +2 -2
  812. package/dist/{time-picker-C0DCPWpR.cjs.map → time-picker-_QJdolkZ.cjs.map} +1 -1
  813. package/dist/tokens.cjs.js +31 -28
  814. package/dist/tokens.cjs.js.map +1 -1
  815. package/dist/tokens.es.js +31 -28
  816. package/dist/tokens.es.js.map +1 -1
  817. package/dist/{tones-DVtXIMPY.js → tones-RD3VjqiN.js} +2 -2
  818. package/dist/tones-RD3VjqiN.js.map +1 -0
  819. package/dist/{tones-BRAQR5Yb.cjs → tones-koH7QNLH.cjs} +2 -2
  820. package/dist/tones-koH7QNLH.cjs.map +1 -0
  821. package/dist/{tool-approval-xZvYiuBP.js → tool-approval-BNJ6MpnV.js} +3 -3
  822. package/dist/tool-approval-BNJ6MpnV.js.map +1 -0
  823. package/dist/{tool-approval-BAER9nxR.cjs → tool-approval-DOPxugSv.cjs} +3 -3
  824. package/dist/tool-approval-DOPxugSv.cjs.map +1 -0
  825. package/dist/{tool-call-arguments-D7PMJ6vj.js → tool-call-arguments-B1MghuMZ.js} +3 -3
  826. package/dist/{tool-call-arguments-D7PMJ6vj.js.map → tool-call-arguments-B1MghuMZ.js.map} +1 -1
  827. package/dist/{tool-call-arguments-ynBfg2dY.cjs → tool-call-arguments-CQYR65FB.cjs} +3 -3
  828. package/dist/{tool-call-arguments-ynBfg2dY.cjs.map → tool-call-arguments-CQYR65FB.cjs.map} +1 -1
  829. package/dist/{tool-call-group-9Dtupqev.cjs → tool-call-group-D_ioE9hT.cjs} +3 -3
  830. package/dist/tool-call-group-D_ioE9hT.cjs.map +1 -0
  831. package/dist/{tool-call-group-DJX7eUYY.js → tool-call-group-ZuYxpyDs.js} +3 -3
  832. package/dist/tool-call-group-ZuYxpyDs.js.map +1 -0
  833. package/dist/{tool-call-mono-gKG9Ek1m.js → tool-call-mono-CC6uzvhS.js} +2 -2
  834. package/dist/{tool-call-mono-gKG9Ek1m.js.map → tool-call-mono-CC6uzvhS.js.map} +1 -1
  835. package/dist/{tool-call-mono-DFSfVZ6E.cjs → tool-call-mono-DXtb4UMm.cjs} +2 -2
  836. package/dist/{tool-call-mono-DFSfVZ6E.cjs.map → tool-call-mono-DXtb4UMm.cjs.map} +1 -1
  837. package/dist/{tool-call-output-DEoCE_Xn.js → tool-call-output-COq3kB-f.js} +3 -3
  838. package/dist/tool-call-output-COq3kB-f.js.map +1 -0
  839. package/dist/{tool-call-output-Dl4sVfCy.cjs → tool-call-output-ht3k1qLQ.cjs} +3 -3
  840. package/dist/tool-call-output-ht3k1qLQ.cjs.map +1 -0
  841. package/dist/{tool-card-BA1YcDoS.js → tool-card-C_K5PwrK.js} +5 -5
  842. package/dist/tool-card-C_K5PwrK.js.map +1 -0
  843. package/dist/{tool-card-DRqhTx-u.cjs → tool-card-rxo27sve.cjs} +5 -5
  844. package/dist/tool-card-rxo27sve.cjs.map +1 -0
  845. package/dist/{traces-data-list-CU93pUfj.cjs → traces-data-list-BsAYYJ9t.cjs} +4 -4
  846. package/dist/{traces-data-list-CU93pUfj.cjs.map → traces-data-list-BsAYYJ9t.cjs.map} +1 -1
  847. package/dist/{traces-data-list-DaedGcID.js → traces-data-list-CnNpGVRN.js} +4 -4
  848. package/dist/{traces-data-list-DaedGcID.js.map → traces-data-list-CnNpGVRN.js.map} +1 -1
  849. package/dist/use-collapsible-box-CCvsF_a9.js +54 -0
  850. package/dist/use-collapsible-box-CCvsF_a9.js.map +1 -0
  851. package/dist/use-collapsible-box-CbQOkokQ.cjs +58 -0
  852. package/dist/use-collapsible-box-CbQOkokQ.cjs.map +1 -0
  853. package/dist/{use-workflow-graph-runtime-D0ODPlNB.cjs → use-workflow-graph-runtime-CIs2HzoP.cjs} +3 -3
  854. package/dist/{use-workflow-graph-runtime-D0ODPlNB.cjs.map → use-workflow-graph-runtime-CIs2HzoP.cjs.map} +1 -1
  855. package/dist/{use-workflow-graph-runtime-XL5zreeR.js → use-workflow-graph-runtime-CexS1ECI.js} +3 -3
  856. package/dist/{use-workflow-graph-runtime-XL5zreeR.js.map → use-workflow-graph-runtime-CexS1ECI.js.map} +1 -1
  857. package/dist/utils/colors.cjs.js +2 -2
  858. package/dist/utils/colors.cjs.js.map +1 -1
  859. package/dist/utils/colors.es.js +2 -2
  860. package/dist/utils/colors.es.js.map +1 -1
  861. package/dist/{workflow-code-dialog-content-vLneZlMd.cjs → workflow-code-dialog-content-BFm2IWDl.cjs} +3 -3
  862. package/dist/{workflow-code-dialog-content-vLneZlMd.cjs.map → workflow-code-dialog-content-BFm2IWDl.cjs.map} +1 -1
  863. package/dist/{workflow-code-dialog-content-Iz2Omi1P.js → workflow-code-dialog-content-BM4ZnrUr.js} +3 -3
  864. package/dist/{workflow-code-dialog-content-Iz2Omi1P.js.map → workflow-code-dialog-content-BM4ZnrUr.js.map} +1 -1
  865. package/dist/{workflow-condition-card-B0Va5Amx.js → workflow-condition-card-3J-As62x.js} +10 -10
  866. package/dist/{workflow-condition-card-B0Va5Amx.js.map → workflow-condition-card-3J-As62x.js.map} +1 -1
  867. package/dist/{workflow-condition-card-CfjhZb0m.cjs → workflow-condition-card-BjEAp0t6.cjs} +10 -10
  868. package/dist/{workflow-condition-card-CfjhZb0m.cjs.map → workflow-condition-card-BjEAp0t6.cjs.map} +1 -1
  869. package/dist/{workflow-data-edge-view-DXeWURnc.cjs → workflow-data-edge-view-7f8O6pVW.cjs} +2 -2
  870. package/dist/{workflow-data-edge-view-DXeWURnc.cjs.map → workflow-data-edge-view-7f8O6pVW.cjs.map} +1 -1
  871. package/dist/{workflow-data-edge-view-o7akvbpB.js → workflow-data-edge-view-BpGLV-at.js} +2 -2
  872. package/dist/{workflow-data-edge-view-o7akvbpB.js.map → workflow-data-edge-view-BpGLV-at.js.map} +1 -1
  873. package/dist/{workflow-debug-controls-Bcb4vcek.cjs → workflow-debug-controls-VbxiluNZ.cjs} +3 -3
  874. package/dist/{workflow-debug-controls-Bcb4vcek.cjs.map → workflow-debug-controls-VbxiluNZ.cjs.map} +1 -1
  875. package/dist/{workflow-debug-controls-DULCFa4s.js → workflow-debug-controls-tty6gLX2.js} +3 -3
  876. package/dist/{workflow-debug-controls-DULCFa4s.js.map → workflow-debug-controls-tty6gLX2.js.map} +1 -1
  877. package/dist/{workflow-edge-data-button-CX-eSbSB.cjs → workflow-edge-data-button-BOVRo4xO.cjs} +4 -4
  878. package/dist/{workflow-edge-data-button-CX-eSbSB.cjs.map → workflow-edge-data-button-BOVRo4xO.cjs.map} +1 -1
  879. package/dist/{workflow-edge-data-button-BuZzeN2n.js → workflow-edge-data-button-C6eyWbcG.js} +4 -4
  880. package/dist/{workflow-edge-data-button-BuZzeN2n.js.map → workflow-edge-data-button-C6eyWbcG.js.map} +1 -1
  881. package/dist/{workflow-step-action-Cf_XmOwj.js → workflow-step-action-B3coZwPr.js} +3 -3
  882. package/dist/{workflow-step-action-Cf_XmOwj.js.map → workflow-step-action-B3coZwPr.js.map} +1 -1
  883. package/dist/{workflow-step-action-JMkWtObA.cjs → workflow-step-action-COOlMQGX.cjs} +3 -3
  884. package/dist/{workflow-step-action-JMkWtObA.cjs.map → workflow-step-action-COOlMQGX.cjs.map} +1 -1
  885. package/package.json +10 -10
  886. package/theme/colors.css +66 -66
  887. package/theme/data-viz.css +3 -3
  888. package/theme/status.css +89 -71
  889. package/theme/surfaces.css +4 -1
  890. package/dist/Badge-H8K5WrXg.cjs.map +0 -1
  891. package/dist/Badge-Q_pCeeGW.js.map +0 -1
  892. package/dist/Button-BnmR2HRc.cjs.map +0 -1
  893. package/dist/Button-C6eUqcPI.js.map +0 -1
  894. package/dist/EmptyState-CJ5KC4Db.cjs.map +0 -1
  895. package/dist/EmptyState-CynkaZd1.js.map +0 -1
  896. package/dist/activity-8egTNbaI.cjs.map +0 -1
  897. package/dist/activity-Duth8KP_.js.map +0 -1
  898. package/dist/ask-user-Crg1O-o6.js.map +0 -1
  899. package/dist/ask-user-DJXmLJzy.cjs.map +0 -1
  900. package/dist/code-editor-BXchPl_F.cjs.map +0 -1
  901. package/dist/code-editor-Cltwid7c.js.map +0 -1
  902. package/dist/data-code-section-Bd2Xnckz.js.map +0 -1
  903. package/dist/data-code-section-D5b6_jcB.cjs.map +0 -1
  904. package/dist/field-block-BIDi9Bvc.cjs.map +0 -1
  905. package/dist/field-block-DpejZ6U6.js.map +0 -1
  906. package/dist/metrics-card-CloSmyRQ.js.map +0 -1
  907. package/dist/metrics-card-HmQJHDNa.cjs.map +0 -1
  908. package/dist/metrics-kpi-card-CW24YjZp.cjs.map +0 -1
  909. package/dist/metrics-kpi-card-DLDT28IB.js.map +0 -1
  910. package/dist/notification-activity-B1_2BPe_.js.map +0 -1
  911. package/dist/notification-activity-BAn2fhYd.cjs.map +0 -1
  912. package/dist/plan-DJfH1c_u.js.map +0 -1
  913. package/dist/plan-ZKAT5frg.cjs.map +0 -1
  914. package/dist/sankey-chart-D-xMiO2u.js.map +0 -1
  915. package/dist/sankey-chart-S7iF7d0E.cjs.map +0 -1
  916. package/dist/settings-row-2hq9Ww8Z.js.map +0 -1
  917. package/dist/settings-row-BMRADph-.cjs.map +0 -1
  918. package/dist/tabs-root-4vL8SHCO.js.map +0 -1
  919. package/dist/tabs-root-BqC8X_h6.cjs.map +0 -1
  920. package/dist/tones-BRAQR5Yb.cjs.map +0 -1
  921. package/dist/tones-DVtXIMPY.js.map +0 -1
  922. package/dist/tool-approval-BAER9nxR.cjs.map +0 -1
  923. package/dist/tool-approval-xZvYiuBP.js.map +0 -1
  924. package/dist/tool-call-group-9Dtupqev.cjs.map +0 -1
  925. package/dist/tool-call-group-DJX7eUYY.js.map +0 -1
  926. package/dist/tool-call-output-DEoCE_Xn.js.map +0 -1
  927. package/dist/tool-call-output-Dl4sVfCy.cjs.map +0 -1
  928. package/dist/tool-card-BA1YcDoS.js.map +0 -1
  929. package/dist/tool-card-DRqhTx-u.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"use-environment-variables-editor.cjs.js","sources":["../../src/hooks/use-environment-variables-editor.ts"],"sourcesContent":["import { useRef, useState } from 'react';\nimport type { RefObject } from 'react';\n\nimport {\n collectEnvironmentVariables,\n createEmptyEnvironmentVariableEntry,\n getDuplicateEnvironmentVariableKeys,\n parseEnvFileText,\n readEnvFile,\n} from '@/lib/env-file';\nimport type { EnvironmentVariableEntry } from '@/lib/env-file';\n\nexport type EnvironmentVariableRow = EnvironmentVariableEntry;\n\nexport interface UseEnvironmentVariablesEditorOptions<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n initialRows?: readonly TRow[];\n rows?: readonly TRow[];\n onRowsChange?: (rows: TRow[]) => void;\n getEditableRows?: (rows: readonly TRow[]) => readonly TRow[];\n getPreservedRows?: (rows: readonly TRow[]) => readonly TRow[];\n maxUploadSize?: number;\n}\n\nexport interface EnvironmentVariablesEditorRowFactories<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n createDefaultRow: () => TRow;\n createRow: (entry: EnvironmentVariableEntry) => TRow;\n}\n\nexport interface EnvironmentVariablesEditorFileUploadEvent {\n target: {\n files?: FileList | readonly File[] | null;\n };\n}\n\nexport interface EnvironmentVariablesEditorController<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n rows: readonly TRow[];\n uploadError: string | null;\n fileInputRef: RefObject<HTMLInputElement | null>;\n duplicateKeys: Set<string>;\n hasDuplicateKeys: boolean;\n isDirty: boolean;\n isRowsDirty: boolean;\n setRows: (rows: readonly TRow[]) => TRow[];\n resetRows: (rows?: readonly TRow[]) => TRow[];\n appendRow: (row?: TRow) => TRow[];\n updateRow: (index: number, patch: Partial<EnvironmentVariableEntry>) => TRow[];\n removeRow: (index: number) => TRow[];\n getRowsForSubmit: () => TRow[];\n getEnvironmentVariablesForSubmit: () => Record<string, string>;\n handleFileUpload: (event: EnvironmentVariablesEditorFileUploadEvent) => Promise<void>;\n handlePaste: (index: number, text: string) => boolean;\n clearUploadError: () => void;\n getRowId: (index: number) => string;\n isValueRevealed: (index: number) => boolean;\n toggleValueVisibility: (index: number) => void;\n rowHasDuplicateKey: (index: number) => boolean;\n}\n\ntype DefaultEnvironmentVariablesEditorOptions = UseEnvironmentVariablesEditorOptions<EnvironmentVariableRow>;\n\ntype CustomEnvironmentVariablesEditorOptions<TRow extends EnvironmentVariableRow> =\n UseEnvironmentVariablesEditorOptions<TRow> & EnvironmentVariablesEditorRowFactories<TRow>;\n\nfunction defaultCreateRow(entry: EnvironmentVariableEntry): EnvironmentVariableRow {\n return { key: entry.key, value: entry.value };\n}\n\nfunction defaultEditableRows<TRow extends EnvironmentVariableRow>(rows: readonly TRow[]) {\n return rows;\n}\n\nfunction defaultPreservedRows() {\n return [];\n}\n\nfunction normalizeRows<TRow extends EnvironmentVariableRow>(\n rows: readonly TRow[] | undefined,\n createDefaultRow: () => TRow,\n) {\n return rows && rows.length > 0 ? rows.map(row => ({ ...row })) : [createDefaultRow()];\n}\n\nfunction hasOnlyEmptyRow(rows: readonly EnvironmentVariableEntry[]) {\n if (rows.length !== 1) return false;\n const [firstRow] = rows;\n if (!firstRow) return false;\n return !firstRow.key.trim() && !firstRow.value;\n}\n\nfunction areRowsEqual(a: readonly EnvironmentVariableEntry[], b: readonly EnvironmentVariableEntry[]) {\n if (a.length !== b.length) return false;\n\n for (let index = 0; index < a.length; index++) {\n const aRow = a[index];\n const bRow = b[index];\n if (!aRow || !bRow || aRow.key !== bRow.key || aRow.value !== bRow.value) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function useEnvironmentVariablesEditor(\n options: DefaultEnvironmentVariablesEditorOptions = {},\n): EnvironmentVariablesEditorController {\n return useCustomEnvironmentVariablesEditor({\n ...options,\n createDefaultRow: createEmptyEnvironmentVariableEntry,\n createRow: defaultCreateRow,\n });\n}\n\nexport function useCustomEnvironmentVariablesEditor<TRow extends EnvironmentVariableRow>({\n initialRows,\n rows: controlledRows,\n onRowsChange,\n createDefaultRow,\n createRow,\n getEditableRows = defaultEditableRows,\n getPreservedRows = defaultPreservedRows,\n maxUploadSize,\n}: CustomEnvironmentVariablesEditorOptions<TRow>): EnvironmentVariablesEditorController<TRow> {\n const initialSourceRows = controlledRows ?? initialRows;\n const nextRowId = useRef(0);\n const fallbackRowIds = useRef<Record<number, string>>({});\n const [uncontrolledRows, setUncontrolledRows] = useState(() => normalizeRows(initialSourceRows, createDefaultRow));\n const [baselineRows, setBaselineRows] = useState(() => normalizeRows(initialSourceRows, createDefaultRow));\n const [rowIds, setRowIds] = useState(() =>\n normalizeRows(initialSourceRows, createDefaultRow).map(() => createRowId()),\n );\n const [uploadError, setUploadError] = useState<string | null>(null);\n const [revealedValues, setRevealedValues] = useState<Record<number, boolean>>({});\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const rows = controlledRows ? normalizeRows(controlledRows, createDefaultRow) : uncontrolledRows;\n const editableRows = (sourceRows: readonly TRow[] = rows) => getEditableRows(sourceRows);\n const preservedRows = (sourceRows: readonly TRow[] = rows) => getPreservedRows(sourceRows);\n\n function createRowId() {\n const rowId = nextRowId.current;\n nextRowId.current += 1;\n return `environment-variable-row-${rowId}`;\n }\n\n function commitRows(nextRows: readonly TRow[], nextRowIds?: readonly string[]) {\n const normalizedRows = normalizeRows(nextRows, createDefaultRow);\n const normalizedRowIds = normalizedRows.map((_, index) => nextRowIds?.[index] ?? rowIds[index] ?? createRowId());\n\n if (!controlledRows) {\n setUncontrolledRows(normalizedRows);\n }\n\n setRowIds(normalizedRowIds);\n onRowsChange?.(normalizedRows);\n return normalizedRows;\n }\n\n function setRows(nextRows: readonly TRow[]) {\n return commitRows(nextRows);\n }\n\n function resetRows(nextRows: readonly TRow[] = baselineRows) {\n const normalizedRows = normalizeRows(nextRows, createDefaultRow);\n commitRows(\n normalizedRows,\n normalizedRows.map(() => createRowId()),\n );\n setBaselineRows(normalizedRows);\n setRevealedValues({});\n setUploadError(null);\n return normalizedRows;\n }\n\n function getRowsForSubmit() {\n return [...rows];\n }\n\n function appendRow(row = createDefaultRow()) {\n return commitRows([...rows, row], [...rowIds, createRowId()]);\n }\n\n function updateRow(index: number, patch: Partial<EnvironmentVariableEntry>) {\n return commitRows(\n rows.map((row, rowIndex) => (rowIndex === index ? { ...row, ...patch } : row)),\n rowIds,\n );\n }\n\n function removeRow(index: number) {\n const nextRows = rows.filter((_, rowIndex) => rowIndex !== index);\n const nextRowIds = rowIds.filter((_, rowIndex) => rowIndex !== index);\n setRevealedValues({});\n return commitRows(\n nextRows.length > 0 ? nextRows : [createDefaultRow()],\n nextRows.length > 0 ? nextRowIds : [createRowId()],\n );\n }\n\n function mergeParsedRows(parsedRows: readonly EnvironmentVariableEntry[], targetIndex?: number) {\n const newRows = parsedRows.map(createRow);\n const newRowIds = newRows.map(() => createRowId());\n const currentEditableRows = editableRows(rows);\n\n if (hasOnlyEmptyRow(currentEditableRows)) {\n const preserved = preservedRows(rows);\n return commitRows([...preserved, ...newRows], [...rowIds.slice(0, preserved.length), ...newRowIds]);\n }\n\n if (typeof targetIndex !== 'number') {\n return commitRows([...rows, ...newRows], [...rowIds, ...newRowIds]);\n }\n\n const targetRow = rows[targetIndex];\n if (!targetRow) {\n return commitRows([...rows, ...newRows], [...rowIds, ...newRowIds]);\n }\n\n const targetIsEmpty = !targetRow.key.trim() && !targetRow.value;\n const before = rows.slice(0, targetIndex + (targetIsEmpty ? 0 : 1));\n const after = rows.slice(targetIndex + 1);\n const beforeIds = rowIds.slice(0, targetIndex + (targetIsEmpty ? 0 : 1));\n const afterIds = rowIds.slice(targetIndex + 1);\n return commitRows([...before, ...newRows, ...after], [...beforeIds, ...newRowIds, ...afterIds]);\n }\n\n function handlePaste(index: number, text: string) {\n const entries = parsePastedEnvText(text);\n if (entries.length === 0) return false;\n\n mergeParsedRows(entries, index);\n setRevealedValues({});\n setUploadError(null);\n return true;\n }\n\n async function handleFileUpload(event: EnvironmentVariablesEditorFileUploadEvent) {\n setUploadError(null);\n const file = event.target.files?.[0];\n if (!file) return;\n\n const result = await readEnvFile(file, { maxSize: maxUploadSize });\n if (!result.ok) {\n setUploadError(result.error);\n if (fileInputRef.current) fileInputRef.current.value = '';\n return;\n }\n\n mergeParsedRows(result.entries);\n setRevealedValues({});\n\n if (fileInputRef.current) fileInputRef.current.value = '';\n }\n\n const duplicateKeys = getDuplicateEnvironmentVariableKeys(rows);\n const rowsDirty = !areRowsEqual(rows, baselineRows);\n\n return {\n rows,\n uploadError,\n fileInputRef,\n duplicateKeys,\n hasDuplicateKeys: duplicateKeys.size > 0,\n isDirty: rowsDirty,\n isRowsDirty: rowsDirty,\n setRows,\n resetRows,\n appendRow,\n updateRow,\n removeRow,\n getRowsForSubmit,\n getEnvironmentVariablesForSubmit: () => collectEnvironmentVariables(getRowsForSubmit()),\n handleFileUpload,\n handlePaste,\n clearUploadError: () => setUploadError(null),\n getRowId: index => rowIds[index] ?? (fallbackRowIds.current[index] ??= createRowId()),\n isValueRevealed: index => Boolean(revealedValues[index]),\n toggleValueVisibility: index => setRevealedValues(previous => ({ ...previous, [index]: !previous[index] })),\n rowHasDuplicateKey: index => duplicateKeys.has(rows[index]?.key.trim() ?? ''),\n };\n}\n\nfunction parsePastedEnvText(text: string) {\n const trimmedText = text.trim();\n const entries = parseEnvFileText(trimmedText);\n\n const firstAssignmentLooksLikeEnvVar = /^(?:export\\s+)?[A-Z_][A-Z0-9_]*\\s*=/.test(trimmedText);\n const hasBulkShape = entries.length > 1 || trimmedText.includes('\\n') || firstAssignmentLooksLikeEnvVar;\n\n return hasBulkShape ? entries : [];\n}\n"],"names":["createEmptyEnvironmentVariableEntry","useRef","useState","readEnvFile","getDuplicateEnvironmentVariableKeys","collectEnvironmentVariables","parseEnvFileText"],"mappings":"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"}
1
+ {"version":3,"file":"use-environment-variables-editor.cjs.js","sources":["../../src/hooks/use-environment-variables-editor.ts"],"sourcesContent":["import { useRef, useState } from 'react';\nimport type { RefObject } from 'react';\n\nimport {\n collectEnvironmentVariables,\n createEmptyEnvironmentVariableEntry,\n getDuplicateEnvironmentVariableKeys,\n parseEnvFileText,\n readEnvFile,\n} from '@/lib/env-file';\nimport type { EnvironmentVariableEntry } from '@/lib/env-file';\n\nconst ENV_ASSIGNMENT_LINE = /^(?:export\\s+)?[A-Za-z_][A-Za-z0-9_]*\\s*=/;\n\nexport type EnvironmentVariableRow = EnvironmentVariableEntry;\n\nexport interface UseEnvironmentVariablesEditorOptions<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n initialRows?: readonly TRow[];\n rows?: readonly TRow[];\n onRowsChange?: (rows: TRow[]) => void;\n getEditableRows?: (rows: readonly TRow[]) => readonly TRow[];\n getPreservedRows?: (rows: readonly TRow[]) => readonly TRow[];\n maxUploadSize?: number;\n}\n\nexport interface EnvironmentVariablesEditorRowFactories<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n createDefaultRow: () => TRow;\n createRow: (entry: EnvironmentVariableEntry) => TRow;\n}\n\nexport interface EnvironmentVariablesEditorFileUploadEvent {\n target: {\n files?: FileList | readonly File[] | null;\n };\n}\n\nexport interface EnvironmentVariablesEditorController<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n rows: readonly TRow[];\n uploadError: string | null;\n fileInputRef: RefObject<HTMLInputElement | null>;\n duplicateKeys: Set<string>;\n hasDuplicateKeys: boolean;\n isDirty: boolean;\n isRowsDirty: boolean;\n setRows: (rows: readonly TRow[]) => TRow[];\n resetRows: (rows?: readonly TRow[]) => TRow[];\n appendRow: (row?: TRow) => TRow[];\n updateRow: (index: number, patch: Partial<EnvironmentVariableEntry>) => TRow[];\n removeRow: (index: number) => TRow[];\n getRowsForSubmit: () => TRow[];\n getEnvironmentVariablesForSubmit: () => Record<string, string>;\n handleFileUpload: (event: EnvironmentVariablesEditorFileUploadEvent) => Promise<void>;\n handlePaste: (index: number, text: string, field: 'key' | 'value') => boolean;\n clearUploadError: () => void;\n getRowId: (index: number) => string;\n isValueRevealed: (index: number) => boolean;\n toggleValueVisibility: (index: number) => void;\n rowHasDuplicateKey: (index: number) => boolean;\n}\n\ntype DefaultEnvironmentVariablesEditorOptions = UseEnvironmentVariablesEditorOptions<EnvironmentVariableRow>;\n\ntype CustomEnvironmentVariablesEditorOptions<TRow extends EnvironmentVariableRow> =\n UseEnvironmentVariablesEditorOptions<TRow> & EnvironmentVariablesEditorRowFactories<TRow>;\n\nfunction defaultCreateRow(entry: EnvironmentVariableEntry): EnvironmentVariableRow {\n return { key: entry.key, value: entry.value };\n}\n\nfunction defaultEditableRows<TRow extends EnvironmentVariableRow>(rows: readonly TRow[]) {\n return rows;\n}\n\nfunction defaultPreservedRows() {\n return [];\n}\n\nfunction normalizeRows<TRow extends EnvironmentVariableRow>(\n rows: readonly TRow[] | undefined,\n createDefaultRow: () => TRow,\n) {\n return rows && rows.length > 0 ? rows.map(row => ({ ...row })) : [createDefaultRow()];\n}\n\nfunction hasOnlyEmptyRow(rows: readonly EnvironmentVariableEntry[]) {\n if (rows.length !== 1) return false;\n const [firstRow] = rows;\n if (!firstRow) return false;\n return !firstRow.key.trim() && !firstRow.value;\n}\n\nfunction areRowsEqual(a: readonly EnvironmentVariableEntry[], b: readonly EnvironmentVariableEntry[]) {\n if (a.length !== b.length) return false;\n\n for (let index = 0; index < a.length; index++) {\n const aRow = a[index];\n const bRow = b[index];\n if (!aRow || !bRow || aRow.key !== bRow.key || aRow.value !== bRow.value) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function useEnvironmentVariablesEditor(\n options: DefaultEnvironmentVariablesEditorOptions = {},\n): EnvironmentVariablesEditorController {\n return useCustomEnvironmentVariablesEditor({\n ...options,\n createDefaultRow: createEmptyEnvironmentVariableEntry,\n createRow: defaultCreateRow,\n });\n}\n\nexport function useCustomEnvironmentVariablesEditor<TRow extends EnvironmentVariableRow>({\n initialRows,\n rows: controlledRows,\n onRowsChange,\n createDefaultRow,\n createRow,\n getEditableRows = defaultEditableRows,\n getPreservedRows = defaultPreservedRows,\n maxUploadSize,\n}: CustomEnvironmentVariablesEditorOptions<TRow>): EnvironmentVariablesEditorController<TRow> {\n const initialSourceRows = controlledRows ?? initialRows;\n const nextRowId = useRef(0);\n const fallbackRowIds = useRef<Record<number, string>>({});\n const [uncontrolledRows, setUncontrolledRows] = useState(() => normalizeRows(initialSourceRows, createDefaultRow));\n const [baselineRows, setBaselineRows] = useState(() => normalizeRows(initialSourceRows, createDefaultRow));\n const [rowIds, setRowIds] = useState(() =>\n normalizeRows(initialSourceRows, createDefaultRow).map(() => createRowId()),\n );\n const [uploadError, setUploadError] = useState<string | null>(null);\n const [revealedValues, setRevealedValues] = useState<Record<number, boolean>>({});\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const rows = controlledRows ? normalizeRows(controlledRows, createDefaultRow) : uncontrolledRows;\n const editableRows = (sourceRows: readonly TRow[] = rows) => getEditableRows(sourceRows);\n const preservedRows = (sourceRows: readonly TRow[] = rows) => getPreservedRows(sourceRows);\n\n function createRowId() {\n const rowId = nextRowId.current;\n nextRowId.current += 1;\n return `environment-variable-row-${rowId}`;\n }\n\n function commitRows(nextRows: readonly TRow[], nextRowIds?: readonly string[]) {\n const normalizedRows = normalizeRows(nextRows, createDefaultRow);\n const normalizedRowIds = normalizedRows.map((_, index) => nextRowIds?.[index] ?? rowIds[index] ?? createRowId());\n\n if (!controlledRows) {\n setUncontrolledRows(normalizedRows);\n }\n\n setRowIds(normalizedRowIds);\n onRowsChange?.(normalizedRows);\n return normalizedRows;\n }\n\n function setRows(nextRows: readonly TRow[]) {\n return commitRows(nextRows);\n }\n\n function resetRows(nextRows: readonly TRow[] = baselineRows) {\n const normalizedRows = normalizeRows(nextRows, createDefaultRow);\n commitRows(\n normalizedRows,\n normalizedRows.map(() => createRowId()),\n );\n setBaselineRows(normalizedRows);\n setRevealedValues({});\n setUploadError(null);\n return normalizedRows;\n }\n\n function getRowsForSubmit() {\n return [...rows];\n }\n\n function appendRow(row = createDefaultRow()) {\n return commitRows([...rows, row], [...rowIds, createRowId()]);\n }\n\n function updateRow(index: number, patch: Partial<EnvironmentVariableEntry>) {\n return commitRows(\n rows.map((row, rowIndex) => (rowIndex === index ? { ...row, ...patch } : row)),\n rowIds,\n );\n }\n\n function removeRow(index: number) {\n const nextRows = rows.filter((_, rowIndex) => rowIndex !== index);\n const nextRowIds = rowIds.filter((_, rowIndex) => rowIndex !== index);\n setRevealedValues({});\n return commitRows(\n nextRows.length > 0 ? nextRows : [createDefaultRow()],\n nextRows.length > 0 ? nextRowIds : [createRowId()],\n );\n }\n\n function mergeParsedRows(parsedRows: readonly EnvironmentVariableEntry[], targetIndex?: number) {\n const newRows = parsedRows.map(createRow);\n const newRowIds = newRows.map(() => createRowId());\n const currentEditableRows = editableRows(rows);\n\n if (hasOnlyEmptyRow(currentEditableRows)) {\n const preserved = preservedRows(rows);\n return commitRows([...preserved, ...newRows], [...rowIds.slice(0, preserved.length), ...newRowIds]);\n }\n\n if (typeof targetIndex !== 'number') {\n return commitRows([...rows, ...newRows], [...rowIds, ...newRowIds]);\n }\n\n const targetRow = rows[targetIndex];\n if (!targetRow) {\n return commitRows([...rows, ...newRows], [...rowIds, ...newRowIds]);\n }\n\n const targetIsEmpty = !targetRow.key.trim() && !targetRow.value;\n const before = rows.slice(0, targetIndex + (targetIsEmpty ? 0 : 1));\n const after = rows.slice(targetIndex + 1);\n const beforeIds = rowIds.slice(0, targetIndex + (targetIsEmpty ? 0 : 1));\n const afterIds = rowIds.slice(targetIndex + 1);\n return commitRows([...before, ...newRows, ...after], [...beforeIds, ...newRowIds, ...afterIds]);\n }\n\n function handlePaste(index: number, text: string, field: 'key' | 'value') {\n // Values (connection strings, PEM keys, JSON) stay literal unless every line is a KEY= assignment\n if (field === 'value') {\n const lines = text.split(/\\r?\\n/).filter(line => line.trim());\n if (lines.length < 2 || !lines.every(line => ENV_ASSIGNMENT_LINE.test(line.trim()))) return false;\n }\n\n const entries = parsePastedEnvText(text);\n if (entries.length === 0) return false;\n\n mergeParsedRows(entries, index);\n setRevealedValues({});\n setUploadError(null);\n return true;\n }\n\n async function handleFileUpload(event: EnvironmentVariablesEditorFileUploadEvent) {\n setUploadError(null);\n const file = event.target.files?.[0];\n if (!file) return;\n\n const result = await readEnvFile(file, { maxSize: maxUploadSize });\n if (!result.ok) {\n setUploadError(result.error);\n if (fileInputRef.current) fileInputRef.current.value = '';\n return;\n }\n\n mergeParsedRows(result.entries);\n setRevealedValues({});\n\n if (fileInputRef.current) fileInputRef.current.value = '';\n }\n\n const duplicateKeys = getDuplicateEnvironmentVariableKeys(rows);\n const rowsDirty = !areRowsEqual(rows, baselineRows);\n\n return {\n rows,\n uploadError,\n fileInputRef,\n duplicateKeys,\n hasDuplicateKeys: duplicateKeys.size > 0,\n isDirty: rowsDirty,\n isRowsDirty: rowsDirty,\n setRows,\n resetRows,\n appendRow,\n updateRow,\n removeRow,\n getRowsForSubmit,\n getEnvironmentVariablesForSubmit: () => collectEnvironmentVariables(getRowsForSubmit()),\n handleFileUpload,\n handlePaste,\n clearUploadError: () => setUploadError(null),\n getRowId: index => rowIds[index] ?? (fallbackRowIds.current[index] ??= createRowId()),\n isValueRevealed: index => Boolean(revealedValues[index]),\n toggleValueVisibility: index => setRevealedValues(previous => ({ ...previous, [index]: !previous[index] })),\n rowHasDuplicateKey: index => duplicateKeys.has(rows[index]?.key.trim() ?? ''),\n };\n}\n\nfunction parsePastedEnvText(text: string) {\n const trimmedText = text.trim();\n const entries = parseEnvFileText(trimmedText);\n\n const firstAssignmentLooksLikeEnvVar = /^(?:export\\s+)?[A-Z_][A-Z0-9_]*\\s*=/.test(trimmedText);\n const hasBulkShape = entries.length > 1 || trimmedText.includes('\\n') || firstAssignmentLooksLikeEnvVar;\n\n return hasBulkShape ? entries : [];\n}\n"],"names":["createEmptyEnvironmentVariableEntry","useRef","useState","readEnvFile","getDuplicateEnvironmentVariableKeys","collectEnvironmentVariables","parseEnvFileText"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { useRef, useState } from 'react';
2
2
  import { g as getDuplicateEnvironmentVariableKeys, c as collectEnvironmentVariables, a as createEmptyEnvironmentVariableEntry, r as readEnvFile, p as parseEnvFileText } from '../env-file-BITYowCx.js';
3
3
 
4
+ const ENV_ASSIGNMENT_LINE = /^(?:export\s+)?[A-Za-z_][A-Za-z0-9_]*\s*=/;
4
5
  function defaultCreateRow(entry) {
5
6
  return { key: entry.key, value: entry.value };
6
7
  }
@@ -133,7 +134,11 @@ function useCustomEnvironmentVariablesEditor({
133
134
  const afterIds = rowIds.slice(targetIndex + 1);
134
135
  return commitRows([...before, ...newRows, ...after], [...beforeIds, ...newRowIds, ...afterIds]);
135
136
  }
136
- function handlePaste(index, text) {
137
+ function handlePaste(index, text, field) {
138
+ if (field === "value") {
139
+ const lines = text.split(/\r?\n/).filter((line) => line.trim());
140
+ if (lines.length < 2 || !lines.every((line) => ENV_ASSIGNMENT_LINE.test(line.trim()))) return false;
141
+ }
137
142
  const entries = parsePastedEnvText(text);
138
143
  if (entries.length === 0) return false;
139
144
  mergeParsedRows(entries, index);
@@ -1 +1 @@
1
- {"version":3,"file":"use-environment-variables-editor.es.js","sources":["../../src/hooks/use-environment-variables-editor.ts"],"sourcesContent":["import { useRef, useState } from 'react';\nimport type { RefObject } from 'react';\n\nimport {\n collectEnvironmentVariables,\n createEmptyEnvironmentVariableEntry,\n getDuplicateEnvironmentVariableKeys,\n parseEnvFileText,\n readEnvFile,\n} from '@/lib/env-file';\nimport type { EnvironmentVariableEntry } from '@/lib/env-file';\n\nexport type EnvironmentVariableRow = EnvironmentVariableEntry;\n\nexport interface UseEnvironmentVariablesEditorOptions<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n initialRows?: readonly TRow[];\n rows?: readonly TRow[];\n onRowsChange?: (rows: TRow[]) => void;\n getEditableRows?: (rows: readonly TRow[]) => readonly TRow[];\n getPreservedRows?: (rows: readonly TRow[]) => readonly TRow[];\n maxUploadSize?: number;\n}\n\nexport interface EnvironmentVariablesEditorRowFactories<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n createDefaultRow: () => TRow;\n createRow: (entry: EnvironmentVariableEntry) => TRow;\n}\n\nexport interface EnvironmentVariablesEditorFileUploadEvent {\n target: {\n files?: FileList | readonly File[] | null;\n };\n}\n\nexport interface EnvironmentVariablesEditorController<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n rows: readonly TRow[];\n uploadError: string | null;\n fileInputRef: RefObject<HTMLInputElement | null>;\n duplicateKeys: Set<string>;\n hasDuplicateKeys: boolean;\n isDirty: boolean;\n isRowsDirty: boolean;\n setRows: (rows: readonly TRow[]) => TRow[];\n resetRows: (rows?: readonly TRow[]) => TRow[];\n appendRow: (row?: TRow) => TRow[];\n updateRow: (index: number, patch: Partial<EnvironmentVariableEntry>) => TRow[];\n removeRow: (index: number) => TRow[];\n getRowsForSubmit: () => TRow[];\n getEnvironmentVariablesForSubmit: () => Record<string, string>;\n handleFileUpload: (event: EnvironmentVariablesEditorFileUploadEvent) => Promise<void>;\n handlePaste: (index: number, text: string) => boolean;\n clearUploadError: () => void;\n getRowId: (index: number) => string;\n isValueRevealed: (index: number) => boolean;\n toggleValueVisibility: (index: number) => void;\n rowHasDuplicateKey: (index: number) => boolean;\n}\n\ntype DefaultEnvironmentVariablesEditorOptions = UseEnvironmentVariablesEditorOptions<EnvironmentVariableRow>;\n\ntype CustomEnvironmentVariablesEditorOptions<TRow extends EnvironmentVariableRow> =\n UseEnvironmentVariablesEditorOptions<TRow> & EnvironmentVariablesEditorRowFactories<TRow>;\n\nfunction defaultCreateRow(entry: EnvironmentVariableEntry): EnvironmentVariableRow {\n return { key: entry.key, value: entry.value };\n}\n\nfunction defaultEditableRows<TRow extends EnvironmentVariableRow>(rows: readonly TRow[]) {\n return rows;\n}\n\nfunction defaultPreservedRows() {\n return [];\n}\n\nfunction normalizeRows<TRow extends EnvironmentVariableRow>(\n rows: readonly TRow[] | undefined,\n createDefaultRow: () => TRow,\n) {\n return rows && rows.length > 0 ? rows.map(row => ({ ...row })) : [createDefaultRow()];\n}\n\nfunction hasOnlyEmptyRow(rows: readonly EnvironmentVariableEntry[]) {\n if (rows.length !== 1) return false;\n const [firstRow] = rows;\n if (!firstRow) return false;\n return !firstRow.key.trim() && !firstRow.value;\n}\n\nfunction areRowsEqual(a: readonly EnvironmentVariableEntry[], b: readonly EnvironmentVariableEntry[]) {\n if (a.length !== b.length) return false;\n\n for (let index = 0; index < a.length; index++) {\n const aRow = a[index];\n const bRow = b[index];\n if (!aRow || !bRow || aRow.key !== bRow.key || aRow.value !== bRow.value) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function useEnvironmentVariablesEditor(\n options: DefaultEnvironmentVariablesEditorOptions = {},\n): EnvironmentVariablesEditorController {\n return useCustomEnvironmentVariablesEditor({\n ...options,\n createDefaultRow: createEmptyEnvironmentVariableEntry,\n createRow: defaultCreateRow,\n });\n}\n\nexport function useCustomEnvironmentVariablesEditor<TRow extends EnvironmentVariableRow>({\n initialRows,\n rows: controlledRows,\n onRowsChange,\n createDefaultRow,\n createRow,\n getEditableRows = defaultEditableRows,\n getPreservedRows = defaultPreservedRows,\n maxUploadSize,\n}: CustomEnvironmentVariablesEditorOptions<TRow>): EnvironmentVariablesEditorController<TRow> {\n const initialSourceRows = controlledRows ?? initialRows;\n const nextRowId = useRef(0);\n const fallbackRowIds = useRef<Record<number, string>>({});\n const [uncontrolledRows, setUncontrolledRows] = useState(() => normalizeRows(initialSourceRows, createDefaultRow));\n const [baselineRows, setBaselineRows] = useState(() => normalizeRows(initialSourceRows, createDefaultRow));\n const [rowIds, setRowIds] = useState(() =>\n normalizeRows(initialSourceRows, createDefaultRow).map(() => createRowId()),\n );\n const [uploadError, setUploadError] = useState<string | null>(null);\n const [revealedValues, setRevealedValues] = useState<Record<number, boolean>>({});\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const rows = controlledRows ? normalizeRows(controlledRows, createDefaultRow) : uncontrolledRows;\n const editableRows = (sourceRows: readonly TRow[] = rows) => getEditableRows(sourceRows);\n const preservedRows = (sourceRows: readonly TRow[] = rows) => getPreservedRows(sourceRows);\n\n function createRowId() {\n const rowId = nextRowId.current;\n nextRowId.current += 1;\n return `environment-variable-row-${rowId}`;\n }\n\n function commitRows(nextRows: readonly TRow[], nextRowIds?: readonly string[]) {\n const normalizedRows = normalizeRows(nextRows, createDefaultRow);\n const normalizedRowIds = normalizedRows.map((_, index) => nextRowIds?.[index] ?? rowIds[index] ?? createRowId());\n\n if (!controlledRows) {\n setUncontrolledRows(normalizedRows);\n }\n\n setRowIds(normalizedRowIds);\n onRowsChange?.(normalizedRows);\n return normalizedRows;\n }\n\n function setRows(nextRows: readonly TRow[]) {\n return commitRows(nextRows);\n }\n\n function resetRows(nextRows: readonly TRow[] = baselineRows) {\n const normalizedRows = normalizeRows(nextRows, createDefaultRow);\n commitRows(\n normalizedRows,\n normalizedRows.map(() => createRowId()),\n );\n setBaselineRows(normalizedRows);\n setRevealedValues({});\n setUploadError(null);\n return normalizedRows;\n }\n\n function getRowsForSubmit() {\n return [...rows];\n }\n\n function appendRow(row = createDefaultRow()) {\n return commitRows([...rows, row], [...rowIds, createRowId()]);\n }\n\n function updateRow(index: number, patch: Partial<EnvironmentVariableEntry>) {\n return commitRows(\n rows.map((row, rowIndex) => (rowIndex === index ? { ...row, ...patch } : row)),\n rowIds,\n );\n }\n\n function removeRow(index: number) {\n const nextRows = rows.filter((_, rowIndex) => rowIndex !== index);\n const nextRowIds = rowIds.filter((_, rowIndex) => rowIndex !== index);\n setRevealedValues({});\n return commitRows(\n nextRows.length > 0 ? nextRows : [createDefaultRow()],\n nextRows.length > 0 ? nextRowIds : [createRowId()],\n );\n }\n\n function mergeParsedRows(parsedRows: readonly EnvironmentVariableEntry[], targetIndex?: number) {\n const newRows = parsedRows.map(createRow);\n const newRowIds = newRows.map(() => createRowId());\n const currentEditableRows = editableRows(rows);\n\n if (hasOnlyEmptyRow(currentEditableRows)) {\n const preserved = preservedRows(rows);\n return commitRows([...preserved, ...newRows], [...rowIds.slice(0, preserved.length), ...newRowIds]);\n }\n\n if (typeof targetIndex !== 'number') {\n return commitRows([...rows, ...newRows], [...rowIds, ...newRowIds]);\n }\n\n const targetRow = rows[targetIndex];\n if (!targetRow) {\n return commitRows([...rows, ...newRows], [...rowIds, ...newRowIds]);\n }\n\n const targetIsEmpty = !targetRow.key.trim() && !targetRow.value;\n const before = rows.slice(0, targetIndex + (targetIsEmpty ? 0 : 1));\n const after = rows.slice(targetIndex + 1);\n const beforeIds = rowIds.slice(0, targetIndex + (targetIsEmpty ? 0 : 1));\n const afterIds = rowIds.slice(targetIndex + 1);\n return commitRows([...before, ...newRows, ...after], [...beforeIds, ...newRowIds, ...afterIds]);\n }\n\n function handlePaste(index: number, text: string) {\n const entries = parsePastedEnvText(text);\n if (entries.length === 0) return false;\n\n mergeParsedRows(entries, index);\n setRevealedValues({});\n setUploadError(null);\n return true;\n }\n\n async function handleFileUpload(event: EnvironmentVariablesEditorFileUploadEvent) {\n setUploadError(null);\n const file = event.target.files?.[0];\n if (!file) return;\n\n const result = await readEnvFile(file, { maxSize: maxUploadSize });\n if (!result.ok) {\n setUploadError(result.error);\n if (fileInputRef.current) fileInputRef.current.value = '';\n return;\n }\n\n mergeParsedRows(result.entries);\n setRevealedValues({});\n\n if (fileInputRef.current) fileInputRef.current.value = '';\n }\n\n const duplicateKeys = getDuplicateEnvironmentVariableKeys(rows);\n const rowsDirty = !areRowsEqual(rows, baselineRows);\n\n return {\n rows,\n uploadError,\n fileInputRef,\n duplicateKeys,\n hasDuplicateKeys: duplicateKeys.size > 0,\n isDirty: rowsDirty,\n isRowsDirty: rowsDirty,\n setRows,\n resetRows,\n appendRow,\n updateRow,\n removeRow,\n getRowsForSubmit,\n getEnvironmentVariablesForSubmit: () => collectEnvironmentVariables(getRowsForSubmit()),\n handleFileUpload,\n handlePaste,\n clearUploadError: () => setUploadError(null),\n getRowId: index => rowIds[index] ?? (fallbackRowIds.current[index] ??= createRowId()),\n isValueRevealed: index => Boolean(revealedValues[index]),\n toggleValueVisibility: index => setRevealedValues(previous => ({ ...previous, [index]: !previous[index] })),\n rowHasDuplicateKey: index => duplicateKeys.has(rows[index]?.key.trim() ?? ''),\n };\n}\n\nfunction parsePastedEnvText(text: string) {\n const trimmedText = text.trim();\n const entries = parseEnvFileText(trimmedText);\n\n const firstAssignmentLooksLikeEnvVar = /^(?:export\\s+)?[A-Z_][A-Z0-9_]*\\s*=/.test(trimmedText);\n const hasBulkShape = entries.length > 1 || trimmedText.includes('\\n') || firstAssignmentLooksLikeEnvVar;\n\n return hasBulkShape ? entries : [];\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-environment-variables-editor.es.js","sources":["../../src/hooks/use-environment-variables-editor.ts"],"sourcesContent":["import { useRef, useState } from 'react';\nimport type { RefObject } from 'react';\n\nimport {\n collectEnvironmentVariables,\n createEmptyEnvironmentVariableEntry,\n getDuplicateEnvironmentVariableKeys,\n parseEnvFileText,\n readEnvFile,\n} from '@/lib/env-file';\nimport type { EnvironmentVariableEntry } from '@/lib/env-file';\n\nconst ENV_ASSIGNMENT_LINE = /^(?:export\\s+)?[A-Za-z_][A-Za-z0-9_]*\\s*=/;\n\nexport type EnvironmentVariableRow = EnvironmentVariableEntry;\n\nexport interface UseEnvironmentVariablesEditorOptions<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n initialRows?: readonly TRow[];\n rows?: readonly TRow[];\n onRowsChange?: (rows: TRow[]) => void;\n getEditableRows?: (rows: readonly TRow[]) => readonly TRow[];\n getPreservedRows?: (rows: readonly TRow[]) => readonly TRow[];\n maxUploadSize?: number;\n}\n\nexport interface EnvironmentVariablesEditorRowFactories<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n createDefaultRow: () => TRow;\n createRow: (entry: EnvironmentVariableEntry) => TRow;\n}\n\nexport interface EnvironmentVariablesEditorFileUploadEvent {\n target: {\n files?: FileList | readonly File[] | null;\n };\n}\n\nexport interface EnvironmentVariablesEditorController<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n rows: readonly TRow[];\n uploadError: string | null;\n fileInputRef: RefObject<HTMLInputElement | null>;\n duplicateKeys: Set<string>;\n hasDuplicateKeys: boolean;\n isDirty: boolean;\n isRowsDirty: boolean;\n setRows: (rows: readonly TRow[]) => TRow[];\n resetRows: (rows?: readonly TRow[]) => TRow[];\n appendRow: (row?: TRow) => TRow[];\n updateRow: (index: number, patch: Partial<EnvironmentVariableEntry>) => TRow[];\n removeRow: (index: number) => TRow[];\n getRowsForSubmit: () => TRow[];\n getEnvironmentVariablesForSubmit: () => Record<string, string>;\n handleFileUpload: (event: EnvironmentVariablesEditorFileUploadEvent) => Promise<void>;\n handlePaste: (index: number, text: string, field: 'key' | 'value') => boolean;\n clearUploadError: () => void;\n getRowId: (index: number) => string;\n isValueRevealed: (index: number) => boolean;\n toggleValueVisibility: (index: number) => void;\n rowHasDuplicateKey: (index: number) => boolean;\n}\n\ntype DefaultEnvironmentVariablesEditorOptions = UseEnvironmentVariablesEditorOptions<EnvironmentVariableRow>;\n\ntype CustomEnvironmentVariablesEditorOptions<TRow extends EnvironmentVariableRow> =\n UseEnvironmentVariablesEditorOptions<TRow> & EnvironmentVariablesEditorRowFactories<TRow>;\n\nfunction defaultCreateRow(entry: EnvironmentVariableEntry): EnvironmentVariableRow {\n return { key: entry.key, value: entry.value };\n}\n\nfunction defaultEditableRows<TRow extends EnvironmentVariableRow>(rows: readonly TRow[]) {\n return rows;\n}\n\nfunction defaultPreservedRows() {\n return [];\n}\n\nfunction normalizeRows<TRow extends EnvironmentVariableRow>(\n rows: readonly TRow[] | undefined,\n createDefaultRow: () => TRow,\n) {\n return rows && rows.length > 0 ? rows.map(row => ({ ...row })) : [createDefaultRow()];\n}\n\nfunction hasOnlyEmptyRow(rows: readonly EnvironmentVariableEntry[]) {\n if (rows.length !== 1) return false;\n const [firstRow] = rows;\n if (!firstRow) return false;\n return !firstRow.key.trim() && !firstRow.value;\n}\n\nfunction areRowsEqual(a: readonly EnvironmentVariableEntry[], b: readonly EnvironmentVariableEntry[]) {\n if (a.length !== b.length) return false;\n\n for (let index = 0; index < a.length; index++) {\n const aRow = a[index];\n const bRow = b[index];\n if (!aRow || !bRow || aRow.key !== bRow.key || aRow.value !== bRow.value) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function useEnvironmentVariablesEditor(\n options: DefaultEnvironmentVariablesEditorOptions = {},\n): EnvironmentVariablesEditorController {\n return useCustomEnvironmentVariablesEditor({\n ...options,\n createDefaultRow: createEmptyEnvironmentVariableEntry,\n createRow: defaultCreateRow,\n });\n}\n\nexport function useCustomEnvironmentVariablesEditor<TRow extends EnvironmentVariableRow>({\n initialRows,\n rows: controlledRows,\n onRowsChange,\n createDefaultRow,\n createRow,\n getEditableRows = defaultEditableRows,\n getPreservedRows = defaultPreservedRows,\n maxUploadSize,\n}: CustomEnvironmentVariablesEditorOptions<TRow>): EnvironmentVariablesEditorController<TRow> {\n const initialSourceRows = controlledRows ?? initialRows;\n const nextRowId = useRef(0);\n const fallbackRowIds = useRef<Record<number, string>>({});\n const [uncontrolledRows, setUncontrolledRows] = useState(() => normalizeRows(initialSourceRows, createDefaultRow));\n const [baselineRows, setBaselineRows] = useState(() => normalizeRows(initialSourceRows, createDefaultRow));\n const [rowIds, setRowIds] = useState(() =>\n normalizeRows(initialSourceRows, createDefaultRow).map(() => createRowId()),\n );\n const [uploadError, setUploadError] = useState<string | null>(null);\n const [revealedValues, setRevealedValues] = useState<Record<number, boolean>>({});\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const rows = controlledRows ? normalizeRows(controlledRows, createDefaultRow) : uncontrolledRows;\n const editableRows = (sourceRows: readonly TRow[] = rows) => getEditableRows(sourceRows);\n const preservedRows = (sourceRows: readonly TRow[] = rows) => getPreservedRows(sourceRows);\n\n function createRowId() {\n const rowId = nextRowId.current;\n nextRowId.current += 1;\n return `environment-variable-row-${rowId}`;\n }\n\n function commitRows(nextRows: readonly TRow[], nextRowIds?: readonly string[]) {\n const normalizedRows = normalizeRows(nextRows, createDefaultRow);\n const normalizedRowIds = normalizedRows.map((_, index) => nextRowIds?.[index] ?? rowIds[index] ?? createRowId());\n\n if (!controlledRows) {\n setUncontrolledRows(normalizedRows);\n }\n\n setRowIds(normalizedRowIds);\n onRowsChange?.(normalizedRows);\n return normalizedRows;\n }\n\n function setRows(nextRows: readonly TRow[]) {\n return commitRows(nextRows);\n }\n\n function resetRows(nextRows: readonly TRow[] = baselineRows) {\n const normalizedRows = normalizeRows(nextRows, createDefaultRow);\n commitRows(\n normalizedRows,\n normalizedRows.map(() => createRowId()),\n );\n setBaselineRows(normalizedRows);\n setRevealedValues({});\n setUploadError(null);\n return normalizedRows;\n }\n\n function getRowsForSubmit() {\n return [...rows];\n }\n\n function appendRow(row = createDefaultRow()) {\n return commitRows([...rows, row], [...rowIds, createRowId()]);\n }\n\n function updateRow(index: number, patch: Partial<EnvironmentVariableEntry>) {\n return commitRows(\n rows.map((row, rowIndex) => (rowIndex === index ? { ...row, ...patch } : row)),\n rowIds,\n );\n }\n\n function removeRow(index: number) {\n const nextRows = rows.filter((_, rowIndex) => rowIndex !== index);\n const nextRowIds = rowIds.filter((_, rowIndex) => rowIndex !== index);\n setRevealedValues({});\n return commitRows(\n nextRows.length > 0 ? nextRows : [createDefaultRow()],\n nextRows.length > 0 ? nextRowIds : [createRowId()],\n );\n }\n\n function mergeParsedRows(parsedRows: readonly EnvironmentVariableEntry[], targetIndex?: number) {\n const newRows = parsedRows.map(createRow);\n const newRowIds = newRows.map(() => createRowId());\n const currentEditableRows = editableRows(rows);\n\n if (hasOnlyEmptyRow(currentEditableRows)) {\n const preserved = preservedRows(rows);\n return commitRows([...preserved, ...newRows], [...rowIds.slice(0, preserved.length), ...newRowIds]);\n }\n\n if (typeof targetIndex !== 'number') {\n return commitRows([...rows, ...newRows], [...rowIds, ...newRowIds]);\n }\n\n const targetRow = rows[targetIndex];\n if (!targetRow) {\n return commitRows([...rows, ...newRows], [...rowIds, ...newRowIds]);\n }\n\n const targetIsEmpty = !targetRow.key.trim() && !targetRow.value;\n const before = rows.slice(0, targetIndex + (targetIsEmpty ? 0 : 1));\n const after = rows.slice(targetIndex + 1);\n const beforeIds = rowIds.slice(0, targetIndex + (targetIsEmpty ? 0 : 1));\n const afterIds = rowIds.slice(targetIndex + 1);\n return commitRows([...before, ...newRows, ...after], [...beforeIds, ...newRowIds, ...afterIds]);\n }\n\n function handlePaste(index: number, text: string, field: 'key' | 'value') {\n // Values (connection strings, PEM keys, JSON) stay literal unless every line is a KEY= assignment\n if (field === 'value') {\n const lines = text.split(/\\r?\\n/).filter(line => line.trim());\n if (lines.length < 2 || !lines.every(line => ENV_ASSIGNMENT_LINE.test(line.trim()))) return false;\n }\n\n const entries = parsePastedEnvText(text);\n if (entries.length === 0) return false;\n\n mergeParsedRows(entries, index);\n setRevealedValues({});\n setUploadError(null);\n return true;\n }\n\n async function handleFileUpload(event: EnvironmentVariablesEditorFileUploadEvent) {\n setUploadError(null);\n const file = event.target.files?.[0];\n if (!file) return;\n\n const result = await readEnvFile(file, { maxSize: maxUploadSize });\n if (!result.ok) {\n setUploadError(result.error);\n if (fileInputRef.current) fileInputRef.current.value = '';\n return;\n }\n\n mergeParsedRows(result.entries);\n setRevealedValues({});\n\n if (fileInputRef.current) fileInputRef.current.value = '';\n }\n\n const duplicateKeys = getDuplicateEnvironmentVariableKeys(rows);\n const rowsDirty = !areRowsEqual(rows, baselineRows);\n\n return {\n rows,\n uploadError,\n fileInputRef,\n duplicateKeys,\n hasDuplicateKeys: duplicateKeys.size > 0,\n isDirty: rowsDirty,\n isRowsDirty: rowsDirty,\n setRows,\n resetRows,\n appendRow,\n updateRow,\n removeRow,\n getRowsForSubmit,\n getEnvironmentVariablesForSubmit: () => collectEnvironmentVariables(getRowsForSubmit()),\n handleFileUpload,\n handlePaste,\n clearUploadError: () => setUploadError(null),\n getRowId: index => rowIds[index] ?? (fallbackRowIds.current[index] ??= createRowId()),\n isValueRevealed: index => Boolean(revealedValues[index]),\n toggleValueVisibility: index => setRevealedValues(previous => ({ ...previous, [index]: !previous[index] })),\n rowHasDuplicateKey: index => duplicateKeys.has(rows[index]?.key.trim() ?? ''),\n };\n}\n\nfunction parsePastedEnvText(text: string) {\n const trimmedText = text.trim();\n const entries = parseEnvFileText(trimmedText);\n\n const firstAssignmentLooksLikeEnvVar = /^(?:export\\s+)?[A-Z_][A-Z0-9_]*\\s*=/.test(trimmedText);\n const hasBulkShape = entries.length > 1 || trimmedText.includes('\\n') || firstAssignmentLooksLikeEnvVar;\n\n return hasBulkShape ? entries : [];\n}\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { c as cva } from './index-Dubp6Qv4.js';
3
3
  import * as React from 'react';
4
- import { B as Button } from './Button-C6eUqcPI.js';
4
+ import { B as Button } from './Button-D43ghVKt.js';
5
5
  import { ControlSizeContext, controlHeight } from './primitives/control-size.es.js';
6
6
  import { fieldErrorRimWithin, inputSurfaceAndFocusWithinStyle } from './primitives/form-element.es.js';
7
7
  import { c as cn } from './cn-65Adrsfj.js';
@@ -193,4 +193,4 @@ const InputGroupButton = React.forwardRef(
193
193
  InputGroupButton.displayName = "InputGroupButton";
194
194
 
195
195
  export { InputGroup as I, InputGroupAddon as a, InputGroupButton as b, InputGroupInput as c, InputGroupText as d, InputGroupTextarea as e };
196
- //# sourceMappingURL=input-group-B8bnoDrA.js.map
196
+ //# sourceMappingURL=input-group-0G9ZX_cM.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"input-group-B8bnoDrA.js","sources":["../src/ds/components/InputGroup/input-group.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport type { VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { Button } from '@/ds/components/Button';\nimport type { ButtonProps } from '@/ds/components/Button/Button';\nimport { ControlSizeContext, controlHeight } from '@/ds/primitives/control-size';\nimport type { ControlSize } from '@/ds/primitives/control-size';\nimport { fieldErrorRimWithin, inputSurfaceAndFocusWithinStyle } from '@/ds/primitives/form-element';\nimport { cn } from '@/lib/utils';\n\n// Size flows down as `data-size` on the named group root (`group/input-group`), read by the\n// control through `group-data-[size=…]` variants — no prop drilling. The one context read is\n// upward: a wrapper that owns the rung (ButtonsGroup) hands it to the field.\n\nconst inputGroupBaseClassName = cn(\n // `flex-1` (not `min-w-0`) lets the root fill a flex row while keeping its content-floor\n // so it never collapses to 0. `items-center` centres the control: it carries its own\n // h-form-* (2px taller than the root's content box), so stretch would push its text low\n // / overflow the bottom border, while centring overlaps the (transparent) borders cleanly.\n 'group/input-group relative flex w-full flex-1 items-center',\n // The wrapper owns its control's width — a bare control has no width of its own,\n // so the group is the one that decides the input fills the remaining space.\n '[&>[data-slot=input-group-control]]:min-w-0 [&>[data-slot=input-group-control]]:flex-1',\n 'text-foreground',\n 'has-[:disabled]:cursor-not-allowed has-[:disabled]:text-muted-foreground',\n // Height is on the root (border-box) so the group matches a same-size sibling control.\n // Auto height when vertical (block-* addon) or wrapping a textarea.\n 'has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col',\n 'has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col',\n 'has-[textarea]:h-auto',\n 'has-[>[data-align=inline-start]]:[&>[data-slot=input-group-control]]:pl-0',\n 'has-[>[data-align=inline-end]]:[&>[data-slot=input-group-control]]:pr-0',\n // In flex-col, flex-1 zeroes the control's height; force flex-none + w-full instead.\n 'has-[>[data-align=block-start]]:[&>[data-slot=input-group-control]]:w-full has-[>[data-align=block-start]]:[&>[data-slot=input-group-control]]:flex-none',\n 'has-[>[data-align=block-end]]:[&>[data-slot=input-group-control]]:w-full has-[>[data-align=block-end]]:[&>[data-slot=input-group-control]]:flex-none',\n);\n\nconst inputGroupRoundedTextareaClassName = cn(\n // Pill (rounded-full) only fits single-line inline shapes. Fall back to rounded-xl\n // whenever the group goes vertical (block-* addon) or wraps a textarea.\n 'has-[>[data-align=block-start]]:rounded-xl',\n 'has-[>[data-align=block-end]]:rounded-xl',\n 'has-[textarea]:rounded-xl',\n);\n\n// A group wears the field material — the same `bg-card` plus rim an Input wears — so a\n// group and a bare field beside it are one surface. Its states move the rim, and they\n// read the nested control's focus (`focus-within`) because the wrapper never takes focus\n// itself. There is no second look: a transparent `outline` group existed alongside this\n// one and only ever produced two boundary languages for the same control, which is why\n// four of its call sites had wrapped it in a hand-made `bg-card rounded-full` div to get\n// the material back.\nconst inputGroupClassName = cn(\n inputGroupBaseClassName,\n 'rounded-full',\n inputSurfaceAndFocusWithinStyle,\n fieldErrorRimWithin,\n inputGroupRoundedTextareaClassName,\n);\n\nexport type InputGroupProps = React.ComponentPropsWithoutRef<'div'> & {\n size?: ControlSize;\n};\n\nconst InputGroup = React.forwardRef<HTMLDivElement, InputGroupProps>(({ className, size, ...props }, ref) => {\n // A wrapper's rung wins over the field's own: inside a ButtonsGroup the group owns the\n // height of every segment, so a field that kept its own type scale would sit at one rung\n // and read at another.\n const groupSize = React.useContext(ControlSizeContext);\n const resolved = groupSize ?? size ?? 'md';\n return (\n <div\n ref={ref}\n role=\"group\"\n data-slot=\"input-group\"\n data-size={resolved}\n className={cn(inputGroupClassName, controlHeight[resolved], className)}\n {...props}\n />\n );\n});\nInputGroup.displayName = 'InputGroup';\n\nconst inputGroupControlTextBySize = cn(\n 'group-data-[size=sm]/input-group:text-caption',\n 'group-data-[size=md]/input-group:text-body-sm',\n 'group-data-[size=lg]/input-group:text-body',\n);\n\nconst inputGroupAddonVariants = cva(\n cn(\n 'flex items-center justify-center gap-2 text-muted-foreground select-none',\n inputGroupControlTextBySize,\n 'group-has-[:disabled]/input-group:text-muted-foreground',\n \"[&>svg:not([class*='size-'])]:size-4\",\n ),\n {\n variants: {\n align: {\n 'inline-start': 'order-first pr-1 pl-3 has-[>button]:pl-1',\n 'inline-end': 'order-last pr-3 pl-1 has-[>button]:pr-1',\n 'block-start': 'order-first w-full justify-start border-b border-border px-3 pt-2 pb-1',\n 'block-end': 'order-last w-full justify-start border-t border-border px-3 pt-1 pb-2',\n },\n },\n defaultVariants: {\n align: 'inline-start',\n },\n },\n);\n\nexport type InputGroupAddonProps = React.ComponentPropsWithoutRef<'div'> & VariantProps<typeof inputGroupAddonVariants>;\n\nconst InputGroupAddon = React.forwardRef<HTMLDivElement, InputGroupAddonProps>(\n ({ className, align = 'inline-start', onClick, ...props }, ref) => {\n return (\n <div\n ref={ref}\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={event => {\n // Click on non-interactive addon area focuses the control inside the group.\n // Skip when a button/input handled the click itself.\n const target = event.target as HTMLElement;\n if (!target.closest('button, input, textarea, [role=\"button\"]')) {\n event.currentTarget.parentElement\n ?.querySelector<HTMLInputElement | HTMLTextAreaElement>('[data-slot=input-group-control]')\n ?.focus();\n }\n onClick?.(event);\n }}\n {...props}\n />\n );\n },\n);\nInputGroupAddon.displayName = 'InputGroupAddon';\n\n// Size flows from the parent group's `data-size` (no React context). All four sizes are\n// written out so Tailwind's scanner emits them. The control is sized to the root's\n// content box (token height minus the 1px border on each side) so it never overflows the\n// root — otherwise, in a flex-column parent, the root's content-based minimum would win\n// over its explicit height and the group would render 2px taller than a sibling control.\n// The explicit height also keeps the control from collapsing to the line-height in block\n// mode (flex-col + flex-none).\nconst inputGroupControlHeightBySize = cn(\n 'group-data-[size=sm]/input-group:h-[calc(var(--spacing-control-sm)-2px)]',\n 'group-data-[size=md]/input-group:h-[calc(var(--spacing-control-md)-2px)]',\n 'group-data-[size=lg]/input-group:h-[calc(var(--spacing-control-lg)-2px)]',\n);\nexport type InputGroupInputProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> & {\n testId?: string;\n error?: boolean;\n};\n\nconst InputGroupInput = React.forwardRef<HTMLInputElement, InputGroupInputProps>(\n ({ className, testId, error, type = 'text', ...props }, ref) => {\n return (\n <input\n ref={ref}\n type={type}\n data-slot=\"input-group-control\"\n data-testid={testId}\n aria-invalid={error}\n className={cn(\n // Height fits the root's content box (see inputGroupControlHeightBySize).\n 'min-w-0 flex-1 bg-transparent px-3 text-foreground outline-hidden',\n inputGroupControlHeightBySize,\n inputGroupControlTextBySize,\n 'placeholder:text-muted-foreground placeholder:transition-opacity placeholder:duration-normal',\n 'focus:placeholder:opacity-70',\n 'disabled:cursor-not-allowed',\n // Hide native number-spinner arrows so consumers can compose their own\n // stepper (see the NumberWithStepper story). WebKit uses the spin-button\n // pseudo-elements; Firefox needs `appearance: textfield` on the input.\n '[&::-webkit-outer-spin-button]:m-0 [&::-webkit-outer-spin-button]:appearance-none',\n '[&::-webkit-inner-spin-button]:m-0 [&::-webkit-inner-spin-button]:appearance-none',\n '[&[type=number]]:[appearance:textfield]',\n // type=\"search\": drop WebKit's native clear button so it doesn't double up with a\n // custom clear control (e.g. the scorers toolbar's InputGroupButton).\n '[&::-webkit-search-cancel-button]:appearance-none',\n className,\n )}\n {...props}\n />\n );\n },\n);\nInputGroupInput.displayName = 'InputGroupInput';\n\nexport type InputGroupTextareaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement> & {\n testId?: string;\n error?: boolean;\n};\n\nconst InputGroupTextarea = React.forwardRef<HTMLTextAreaElement, InputGroupTextareaProps>(\n ({ className, testId, error, ...props }, ref) => {\n return (\n <textarea\n ref={ref}\n data-slot=\"input-group-control\"\n data-testid={testId}\n aria-invalid={error}\n className={cn(\n 'min-h-15 min-w-0 flex-1 resize-y bg-transparent px-3 py-2 text-foreground outline-hidden',\n inputGroupControlTextBySize,\n 'placeholder:text-muted-foreground placeholder:transition-opacity placeholder:duration-normal',\n 'focus:placeholder:opacity-70',\n 'disabled:cursor-not-allowed',\n className,\n )}\n {...props}\n />\n );\n },\n);\nInputGroupTextarea.displayName = 'InputGroupTextarea';\n\nexport type InputGroupTextProps = React.ComponentPropsWithoutRef<'span'>;\n\nconst InputGroupText = React.forwardRef<HTMLSpanElement, InputGroupTextProps>(({ className, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={cn(\n 'flex items-center gap-2 text-caption text-muted-foreground [&_svg]:pointer-events-none',\n \"[&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n );\n});\nInputGroupText.displayName = 'InputGroupText';\n\nexport type InputGroupButtonProps = Omit<ButtonProps, 'size' | 'variant'> & {\n size?: ButtonProps['size'];\n variant?: ButtonProps['variant'];\n};\n\nconst InputGroupButton = React.forwardRef<HTMLButtonElement, InputGroupButtonProps>(\n ({ size = 'icon-sm', variant = 'ghost', type = 'button', ...props }, ref) => {\n return <Button ref={ref} type={type} size={size} variant={variant} {...props} />;\n },\n);\nInputGroupButton.displayName = 'InputGroupButton';\n\nexport { InputGroup, InputGroupAddon, InputGroupInput, InputGroupTextarea, InputGroupText, InputGroupButton };\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"input-group-0G9ZX_cM.js","sources":["../src/ds/components/InputGroup/input-group.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport type { VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { Button } from '@/ds/components/Button';\nimport type { ButtonProps } from '@/ds/components/Button/Button';\nimport { ControlSizeContext, controlHeight } from '@/ds/primitives/control-size';\nimport type { ControlSize } from '@/ds/primitives/control-size';\nimport { fieldErrorRimWithin, inputSurfaceAndFocusWithinStyle } from '@/ds/primitives/form-element';\nimport { cn } from '@/lib/utils';\n\n// Size flows down as `data-size` on the named group root (`group/input-group`), read by the\n// control through `group-data-[size=…]` variants — no prop drilling. The one context read is\n// upward: a wrapper that owns the rung (ButtonsGroup) hands it to the field.\n\nconst inputGroupBaseClassName = cn(\n // `flex-1` (not `min-w-0`) lets the root fill a flex row while keeping its content-floor\n // so it never collapses to 0. `items-center` centres the control: it carries its own\n // h-form-* (2px taller than the root's content box), so stretch would push its text low\n // / overflow the bottom border, while centring overlaps the (transparent) borders cleanly.\n 'group/input-group relative flex w-full flex-1 items-center',\n // The wrapper owns its control's width — a bare control has no width of its own,\n // so the group is the one that decides the input fills the remaining space.\n '[&>[data-slot=input-group-control]]:min-w-0 [&>[data-slot=input-group-control]]:flex-1',\n 'text-foreground',\n 'has-[:disabled]:cursor-not-allowed has-[:disabled]:text-muted-foreground',\n // Height is on the root (border-box) so the group matches a same-size sibling control.\n // Auto height when vertical (block-* addon) or wrapping a textarea.\n 'has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col',\n 'has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col',\n 'has-[textarea]:h-auto',\n 'has-[>[data-align=inline-start]]:[&>[data-slot=input-group-control]]:pl-0',\n 'has-[>[data-align=inline-end]]:[&>[data-slot=input-group-control]]:pr-0',\n // In flex-col, flex-1 zeroes the control's height; force flex-none + w-full instead.\n 'has-[>[data-align=block-start]]:[&>[data-slot=input-group-control]]:w-full has-[>[data-align=block-start]]:[&>[data-slot=input-group-control]]:flex-none',\n 'has-[>[data-align=block-end]]:[&>[data-slot=input-group-control]]:w-full has-[>[data-align=block-end]]:[&>[data-slot=input-group-control]]:flex-none',\n);\n\nconst inputGroupRoundedTextareaClassName = cn(\n // Pill (rounded-full) only fits single-line inline shapes. Fall back to rounded-xl\n // whenever the group goes vertical (block-* addon) or wraps a textarea.\n 'has-[>[data-align=block-start]]:rounded-xl',\n 'has-[>[data-align=block-end]]:rounded-xl',\n 'has-[textarea]:rounded-xl',\n);\n\n// A group wears the field material — the same `bg-card` plus rim an Input wears — so a\n// group and a bare field beside it are one surface. Its states move the rim, and they\n// read the nested control's focus (`focus-within`) because the wrapper never takes focus\n// itself. There is no second look: a transparent `outline` group existed alongside this\n// one and only ever produced two boundary languages for the same control, which is why\n// four of its call sites had wrapped it in a hand-made `bg-card rounded-full` div to get\n// the material back.\nconst inputGroupClassName = cn(\n inputGroupBaseClassName,\n 'rounded-full',\n inputSurfaceAndFocusWithinStyle,\n fieldErrorRimWithin,\n inputGroupRoundedTextareaClassName,\n);\n\nexport type InputGroupProps = React.ComponentPropsWithoutRef<'div'> & {\n size?: ControlSize;\n};\n\nconst InputGroup = React.forwardRef<HTMLDivElement, InputGroupProps>(({ className, size, ...props }, ref) => {\n // A wrapper's rung wins over the field's own: inside a ButtonsGroup the group owns the\n // height of every segment, so a field that kept its own type scale would sit at one rung\n // and read at another.\n const groupSize = React.useContext(ControlSizeContext);\n const resolved = groupSize ?? size ?? 'md';\n return (\n <div\n ref={ref}\n role=\"group\"\n data-slot=\"input-group\"\n data-size={resolved}\n className={cn(inputGroupClassName, controlHeight[resolved], className)}\n {...props}\n />\n );\n});\nInputGroup.displayName = 'InputGroup';\n\nconst inputGroupControlTextBySize = cn(\n 'group-data-[size=sm]/input-group:text-caption',\n 'group-data-[size=md]/input-group:text-body-sm',\n 'group-data-[size=lg]/input-group:text-body',\n);\n\nconst inputGroupAddonVariants = cva(\n cn(\n 'flex items-center justify-center gap-2 text-muted-foreground select-none',\n inputGroupControlTextBySize,\n 'group-has-[:disabled]/input-group:text-muted-foreground',\n \"[&>svg:not([class*='size-'])]:size-4\",\n ),\n {\n variants: {\n align: {\n 'inline-start': 'order-first pr-1 pl-3 has-[>button]:pl-1',\n 'inline-end': 'order-last pr-3 pl-1 has-[>button]:pr-1',\n 'block-start': 'order-first w-full justify-start border-b border-border px-3 pt-2 pb-1',\n 'block-end': 'order-last w-full justify-start border-t border-border px-3 pt-1 pb-2',\n },\n },\n defaultVariants: {\n align: 'inline-start',\n },\n },\n);\n\nexport type InputGroupAddonProps = React.ComponentPropsWithoutRef<'div'> & VariantProps<typeof inputGroupAddonVariants>;\n\nconst InputGroupAddon = React.forwardRef<HTMLDivElement, InputGroupAddonProps>(\n ({ className, align = 'inline-start', onClick, ...props }, ref) => {\n return (\n <div\n ref={ref}\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={event => {\n // Click on non-interactive addon area focuses the control inside the group.\n // Skip when a button/input handled the click itself.\n const target = event.target as HTMLElement;\n if (!target.closest('button, input, textarea, [role=\"button\"]')) {\n event.currentTarget.parentElement\n ?.querySelector<HTMLInputElement | HTMLTextAreaElement>('[data-slot=input-group-control]')\n ?.focus();\n }\n onClick?.(event);\n }}\n {...props}\n />\n );\n },\n);\nInputGroupAddon.displayName = 'InputGroupAddon';\n\n// Size flows from the parent group's `data-size` (no React context). All four sizes are\n// written out so Tailwind's scanner emits them. The control is sized to the root's\n// content box (token height minus the 1px border on each side) so it never overflows the\n// root — otherwise, in a flex-column parent, the root's content-based minimum would win\n// over its explicit height and the group would render 2px taller than a sibling control.\n// The explicit height also keeps the control from collapsing to the line-height in block\n// mode (flex-col + flex-none).\nconst inputGroupControlHeightBySize = cn(\n 'group-data-[size=sm]/input-group:h-[calc(var(--spacing-control-sm)-2px)]',\n 'group-data-[size=md]/input-group:h-[calc(var(--spacing-control-md)-2px)]',\n 'group-data-[size=lg]/input-group:h-[calc(var(--spacing-control-lg)-2px)]',\n);\nexport type InputGroupInputProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> & {\n testId?: string;\n error?: boolean;\n};\n\nconst InputGroupInput = React.forwardRef<HTMLInputElement, InputGroupInputProps>(\n ({ className, testId, error, type = 'text', ...props }, ref) => {\n return (\n <input\n ref={ref}\n type={type}\n data-slot=\"input-group-control\"\n data-testid={testId}\n aria-invalid={error}\n className={cn(\n // Height fits the root's content box (see inputGroupControlHeightBySize).\n 'min-w-0 flex-1 bg-transparent px-3 text-foreground outline-hidden',\n inputGroupControlHeightBySize,\n inputGroupControlTextBySize,\n 'placeholder:text-muted-foreground placeholder:transition-opacity placeholder:duration-normal',\n 'focus:placeholder:opacity-70',\n 'disabled:cursor-not-allowed',\n // Hide native number-spinner arrows so consumers can compose their own\n // stepper (see the NumberWithStepper story). WebKit uses the spin-button\n // pseudo-elements; Firefox needs `appearance: textfield` on the input.\n '[&::-webkit-outer-spin-button]:m-0 [&::-webkit-outer-spin-button]:appearance-none',\n '[&::-webkit-inner-spin-button]:m-0 [&::-webkit-inner-spin-button]:appearance-none',\n '[&[type=number]]:[appearance:textfield]',\n // type=\"search\": drop WebKit's native clear button so it doesn't double up with a\n // custom clear control (e.g. the scorers toolbar's InputGroupButton).\n '[&::-webkit-search-cancel-button]:appearance-none',\n className,\n )}\n {...props}\n />\n );\n },\n);\nInputGroupInput.displayName = 'InputGroupInput';\n\nexport type InputGroupTextareaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement> & {\n testId?: string;\n error?: boolean;\n};\n\nconst InputGroupTextarea = React.forwardRef<HTMLTextAreaElement, InputGroupTextareaProps>(\n ({ className, testId, error, ...props }, ref) => {\n return (\n <textarea\n ref={ref}\n data-slot=\"input-group-control\"\n data-testid={testId}\n aria-invalid={error}\n className={cn(\n 'min-h-15 min-w-0 flex-1 resize-y bg-transparent px-3 py-2 text-foreground outline-hidden',\n inputGroupControlTextBySize,\n 'placeholder:text-muted-foreground placeholder:transition-opacity placeholder:duration-normal',\n 'focus:placeholder:opacity-70',\n 'disabled:cursor-not-allowed',\n className,\n )}\n {...props}\n />\n );\n },\n);\nInputGroupTextarea.displayName = 'InputGroupTextarea';\n\nexport type InputGroupTextProps = React.ComponentPropsWithoutRef<'span'>;\n\nconst InputGroupText = React.forwardRef<HTMLSpanElement, InputGroupTextProps>(({ className, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={cn(\n 'flex items-center gap-2 text-caption text-muted-foreground [&_svg]:pointer-events-none',\n \"[&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n );\n});\nInputGroupText.displayName = 'InputGroupText';\n\nexport type InputGroupButtonProps = Omit<ButtonProps, 'size' | 'variant'> & {\n size?: ButtonProps['size'];\n variant?: ButtonProps['variant'];\n};\n\nconst InputGroupButton = React.forwardRef<HTMLButtonElement, InputGroupButtonProps>(\n ({ size = 'icon-sm', variant = 'ghost', type = 'button', ...props }, ref) => {\n return <Button ref={ref} type={type} size={size} variant={variant} {...props} />;\n },\n);\nInputGroupButton.displayName = 'InputGroupButton';\n\nexport { InputGroup, InputGroupAddon, InputGroupInput, InputGroupTextarea, InputGroupText, InputGroupButton };\n"],"names":[],"mappings":";;;;;;;;AAeA,MAAM,uBAAA,GAA0B,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAK9B,4DAAA;AAAA;AAAA;AAAA,EAGA,wFAAA;AAAA,EACA,iBAAA;AAAA,EACA,0EAAA;AAAA;AAAA;AAAA,EAGA,iFAAA;AAAA,EACA,6EAAA;AAAA,EACA,uBAAA;AAAA,EACA,2EAAA;AAAA,EACA,yEAAA;AAAA;AAAA,EAEA,0JAAA;AAAA,EACA;AACF,CAAA;AAEA,MAAM,kCAAA,GAAqC,EAAA;AAAA;AAAA;AAAA,EAGzC,4CAAA;AAAA,EACA,0CAAA;AAAA,EACA;AACF,CAAA;AASA,MAAM,mBAAA,GAAsB,EAAA;AAAA,EAC1B,uBAAA;AAAA,EACA,cAAA;AAAA,EACA,+BAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF,CAAA;AAMA,MAAM,UAAA,GAAa,KAAA,CAAM,UAAA,CAA4C,CAAC,EAAE,WAAW,IAAA,EAAM,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAI3G,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,UAAA,CAAW,kBAAkB,CAAA;AACrD,EAAA,MAAM,QAAA,GAAW,aAAa,IAAA,IAAQ,IAAA;AACtC,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,OAAA;AAAA,MACL,WAAA,EAAU,aAAA;AAAA,MACV,WAAA,EAAW,QAAA;AAAA,MACX,WAAW,EAAA,CAAG,mBAAA,EAAqB,aAAA,CAAc,QAAQ,GAAG,SAAS,CAAA;AAAA,MACpE,GAAG;AAAA;AAAA,GACN;AAEJ,CAAC;AACD,UAAA,CAAW,WAAA,GAAc,YAAA;AAEzB,MAAM,2BAAA,GAA8B,EAAA;AAAA,EAClC,+CAAA;AAAA,EACA,+CAAA;AAAA,EACA;AACF,CAAA;AAEA,MAAM,uBAAA,GAA0B,GAAA;AAAA,EAC9B,EAAA;AAAA,IACE,0EAAA;AAAA,IACA,2BAAA;AAAA,IACA,yDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,KAAA,EAAO;AAAA,QACL,cAAA,EAAgB,0CAAA;AAAA,QAChB,YAAA,EAAc,yCAAA;AAAA,QACd,aAAA,EAAe,wEAAA;AAAA,QACf,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,KAAA,EAAO;AAAA;AACT;AAEJ,CAAA;AAIA,MAAM,kBAAkB,KAAA,CAAM,UAAA;AAAA,EAC5B,CAAC,EAAE,SAAA,EAAW,KAAA,GAAQ,gBAAgB,OAAA,EAAS,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACjE,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,OAAA;AAAA,QACL,WAAA,EAAU,mBAAA;AAAA,QACV,YAAA,EAAY,KAAA;AAAA,QACZ,WAAW,EAAA,CAAG,uBAAA,CAAwB,EAAE,KAAA,EAAO,GAAG,SAAS,CAAA;AAAA,QAC3D,SAAS,CAAA,KAAA,KAAS;AAGhB,UAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,UAAA,IAAI,CAAC,MAAA,CAAO,OAAA,CAAQ,0CAA0C,CAAA,EAAG;AAC/D,YAAA,KAAA,CAAM,aAAA,CAAc,aAAA,EAChB,aAAA,CAAsD,iCAAiC,GACvF,KAAA,EAAM;AAAA,UACZ;AACA,UAAA,OAAA,GAAU,KAAK,CAAA;AAAA,QACjB,CAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,eAAA,CAAgB,WAAA,GAAc,iBAAA;AAS9B,MAAM,6BAAA,GAAgC,EAAA;AAAA,EACpC,0EAAA;AAAA,EACA,0EAAA;AAAA,EACA;AACF,CAAA;AAMA,MAAM,kBAAkB,KAAA,CAAM,UAAA;AAAA,EAC5B,CAAC,EAAE,SAAA,EAAW,MAAA,EAAQ,KAAA,EAAO,OAAO,MAAA,EAAQ,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC9D,IAAA,uBACE,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA;AAAA,QACA,WAAA,EAAU,qBAAA;AAAA,QACV,aAAA,EAAa,MAAA;AAAA,QACb,cAAA,EAAc,KAAA;AAAA,QACd,SAAA,EAAW,EAAA;AAAA;AAAA,UAET,mEAAA;AAAA,UACA,6BAAA;AAAA,UACA,2BAAA;AAAA,UACA,8FAAA;AAAA,UACA,8BAAA;AAAA,UACA,6BAAA;AAAA;AAAA;AAAA;AAAA,UAIA,mFAAA;AAAA,UACA,mFAAA;AAAA,UACA,yCAAA;AAAA;AAAA;AAAA,UAGA,mDAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,eAAA,CAAgB,WAAA,GAAc,iBAAA;AAO9B,MAAM,qBAAqB,KAAA,CAAM,UAAA;AAAA,EAC/B,CAAC,EAAE,SAAA,EAAW,MAAA,EAAQ,OAAO,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC/C,IAAA,uBACE,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,qBAAA;AAAA,QACV,aAAA,EAAa,MAAA;AAAA,QACb,cAAA,EAAc,KAAA;AAAA,QACd,SAAA,EAAW,EAAA;AAAA,UACT,0FAAA;AAAA,UACA,2BAAA;AAAA,UACA,8FAAA;AAAA,UACA,8BAAA;AAAA,UACA,6BAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,kBAAA,CAAmB,WAAA,GAAc,oBAAA;AAIjC,MAAM,cAAA,GAAiB,MAAM,UAAA,CAAiD,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC9G,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,wFAAA;AAAA,QACA,sCAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ,CAAC;AACD,cAAA,CAAe,WAAA,GAAc,gBAAA;AAO7B,MAAM,mBAAmB,KAAA,CAAM,UAAA;AAAA,EAC7B,CAAC,EAAE,IAAA,GAAO,SAAA,EAAW,OAAA,GAAU,OAAA,EAAS,IAAA,GAAO,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC3E,IAAA,2BAAQ,MAAA,EAAA,EAAO,GAAA,EAAU,MAAY,IAAA,EAAY,OAAA,EAAmB,GAAG,KAAA,EAAO,CAAA;AAAA,EAChF;AACF;AACA,gBAAA,CAAiB,WAAA,GAAc,kBAAA;;;;"}
@@ -3,7 +3,7 @@
3
3
  const jsxRuntime = require('react/jsx-runtime');
4
4
  const index = require('./index-C-fBJhpb.cjs');
5
5
  const React = require('react');
6
- const Button = require('./Button-BnmR2HRc.cjs');
6
+ const Button = require('./Button-CXhSUBxN.cjs');
7
7
  const primitives_controlSize = require('./primitives/control-size.cjs.js');
8
8
  const primitives_formElement = require('./primitives/form-element.cjs.js');
9
9
  const utils_cn = require('./cn-DG0X1KEP.cjs');
@@ -219,4 +219,4 @@ exports.InputGroupButton = InputGroupButton;
219
219
  exports.InputGroupInput = InputGroupInput;
220
220
  exports.InputGroupText = InputGroupText;
221
221
  exports.InputGroupTextarea = InputGroupTextarea;
222
- //# sourceMappingURL=input-group-I8YVM_Ps.cjs.map
222
+ //# sourceMappingURL=input-group-BRhBfeHC.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"input-group-I8YVM_Ps.cjs","sources":["../src/ds/components/InputGroup/input-group.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport type { VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { Button } from '@/ds/components/Button';\nimport type { ButtonProps } from '@/ds/components/Button/Button';\nimport { ControlSizeContext, controlHeight } from '@/ds/primitives/control-size';\nimport type { ControlSize } from '@/ds/primitives/control-size';\nimport { fieldErrorRimWithin, inputSurfaceAndFocusWithinStyle } from '@/ds/primitives/form-element';\nimport { cn } from '@/lib/utils';\n\n// Size flows down as `data-size` on the named group root (`group/input-group`), read by the\n// control through `group-data-[size=…]` variants — no prop drilling. The one context read is\n// upward: a wrapper that owns the rung (ButtonsGroup) hands it to the field.\n\nconst inputGroupBaseClassName = cn(\n // `flex-1` (not `min-w-0`) lets the root fill a flex row while keeping its content-floor\n // so it never collapses to 0. `items-center` centres the control: it carries its own\n // h-form-* (2px taller than the root's content box), so stretch would push its text low\n // / overflow the bottom border, while centring overlaps the (transparent) borders cleanly.\n 'group/input-group relative flex w-full flex-1 items-center',\n // The wrapper owns its control's width — a bare control has no width of its own,\n // so the group is the one that decides the input fills the remaining space.\n '[&>[data-slot=input-group-control]]:min-w-0 [&>[data-slot=input-group-control]]:flex-1',\n 'text-foreground',\n 'has-[:disabled]:cursor-not-allowed has-[:disabled]:text-muted-foreground',\n // Height is on the root (border-box) so the group matches a same-size sibling control.\n // Auto height when vertical (block-* addon) or wrapping a textarea.\n 'has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col',\n 'has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col',\n 'has-[textarea]:h-auto',\n 'has-[>[data-align=inline-start]]:[&>[data-slot=input-group-control]]:pl-0',\n 'has-[>[data-align=inline-end]]:[&>[data-slot=input-group-control]]:pr-0',\n // In flex-col, flex-1 zeroes the control's height; force flex-none + w-full instead.\n 'has-[>[data-align=block-start]]:[&>[data-slot=input-group-control]]:w-full has-[>[data-align=block-start]]:[&>[data-slot=input-group-control]]:flex-none',\n 'has-[>[data-align=block-end]]:[&>[data-slot=input-group-control]]:w-full has-[>[data-align=block-end]]:[&>[data-slot=input-group-control]]:flex-none',\n);\n\nconst inputGroupRoundedTextareaClassName = cn(\n // Pill (rounded-full) only fits single-line inline shapes. Fall back to rounded-xl\n // whenever the group goes vertical (block-* addon) or wraps a textarea.\n 'has-[>[data-align=block-start]]:rounded-xl',\n 'has-[>[data-align=block-end]]:rounded-xl',\n 'has-[textarea]:rounded-xl',\n);\n\n// A group wears the field material — the same `bg-card` plus rim an Input wears — so a\n// group and a bare field beside it are one surface. Its states move the rim, and they\n// read the nested control's focus (`focus-within`) because the wrapper never takes focus\n// itself. There is no second look: a transparent `outline` group existed alongside this\n// one and only ever produced two boundary languages for the same control, which is why\n// four of its call sites had wrapped it in a hand-made `bg-card rounded-full` div to get\n// the material back.\nconst inputGroupClassName = cn(\n inputGroupBaseClassName,\n 'rounded-full',\n inputSurfaceAndFocusWithinStyle,\n fieldErrorRimWithin,\n inputGroupRoundedTextareaClassName,\n);\n\nexport type InputGroupProps = React.ComponentPropsWithoutRef<'div'> & {\n size?: ControlSize;\n};\n\nconst InputGroup = React.forwardRef<HTMLDivElement, InputGroupProps>(({ className, size, ...props }, ref) => {\n // A wrapper's rung wins over the field's own: inside a ButtonsGroup the group owns the\n // height of every segment, so a field that kept its own type scale would sit at one rung\n // and read at another.\n const groupSize = React.useContext(ControlSizeContext);\n const resolved = groupSize ?? size ?? 'md';\n return (\n <div\n ref={ref}\n role=\"group\"\n data-slot=\"input-group\"\n data-size={resolved}\n className={cn(inputGroupClassName, controlHeight[resolved], className)}\n {...props}\n />\n );\n});\nInputGroup.displayName = 'InputGroup';\n\nconst inputGroupControlTextBySize = cn(\n 'group-data-[size=sm]/input-group:text-caption',\n 'group-data-[size=md]/input-group:text-body-sm',\n 'group-data-[size=lg]/input-group:text-body',\n);\n\nconst inputGroupAddonVariants = cva(\n cn(\n 'flex items-center justify-center gap-2 text-muted-foreground select-none',\n inputGroupControlTextBySize,\n 'group-has-[:disabled]/input-group:text-muted-foreground',\n \"[&>svg:not([class*='size-'])]:size-4\",\n ),\n {\n variants: {\n align: {\n 'inline-start': 'order-first pr-1 pl-3 has-[>button]:pl-1',\n 'inline-end': 'order-last pr-3 pl-1 has-[>button]:pr-1',\n 'block-start': 'order-first w-full justify-start border-b border-border px-3 pt-2 pb-1',\n 'block-end': 'order-last w-full justify-start border-t border-border px-3 pt-1 pb-2',\n },\n },\n defaultVariants: {\n align: 'inline-start',\n },\n },\n);\n\nexport type InputGroupAddonProps = React.ComponentPropsWithoutRef<'div'> & VariantProps<typeof inputGroupAddonVariants>;\n\nconst InputGroupAddon = React.forwardRef<HTMLDivElement, InputGroupAddonProps>(\n ({ className, align = 'inline-start', onClick, ...props }, ref) => {\n return (\n <div\n ref={ref}\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={event => {\n // Click on non-interactive addon area focuses the control inside the group.\n // Skip when a button/input handled the click itself.\n const target = event.target as HTMLElement;\n if (!target.closest('button, input, textarea, [role=\"button\"]')) {\n event.currentTarget.parentElement\n ?.querySelector<HTMLInputElement | HTMLTextAreaElement>('[data-slot=input-group-control]')\n ?.focus();\n }\n onClick?.(event);\n }}\n {...props}\n />\n );\n },\n);\nInputGroupAddon.displayName = 'InputGroupAddon';\n\n// Size flows from the parent group's `data-size` (no React context). All four sizes are\n// written out so Tailwind's scanner emits them. The control is sized to the root's\n// content box (token height minus the 1px border on each side) so it never overflows the\n// root — otherwise, in a flex-column parent, the root's content-based minimum would win\n// over its explicit height and the group would render 2px taller than a sibling control.\n// The explicit height also keeps the control from collapsing to the line-height in block\n// mode (flex-col + flex-none).\nconst inputGroupControlHeightBySize = cn(\n 'group-data-[size=sm]/input-group:h-[calc(var(--spacing-control-sm)-2px)]',\n 'group-data-[size=md]/input-group:h-[calc(var(--spacing-control-md)-2px)]',\n 'group-data-[size=lg]/input-group:h-[calc(var(--spacing-control-lg)-2px)]',\n);\nexport type InputGroupInputProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> & {\n testId?: string;\n error?: boolean;\n};\n\nconst InputGroupInput = React.forwardRef<HTMLInputElement, InputGroupInputProps>(\n ({ className, testId, error, type = 'text', ...props }, ref) => {\n return (\n <input\n ref={ref}\n type={type}\n data-slot=\"input-group-control\"\n data-testid={testId}\n aria-invalid={error}\n className={cn(\n // Height fits the root's content box (see inputGroupControlHeightBySize).\n 'min-w-0 flex-1 bg-transparent px-3 text-foreground outline-hidden',\n inputGroupControlHeightBySize,\n inputGroupControlTextBySize,\n 'placeholder:text-muted-foreground placeholder:transition-opacity placeholder:duration-normal',\n 'focus:placeholder:opacity-70',\n 'disabled:cursor-not-allowed',\n // Hide native number-spinner arrows so consumers can compose their own\n // stepper (see the NumberWithStepper story). WebKit uses the spin-button\n // pseudo-elements; Firefox needs `appearance: textfield` on the input.\n '[&::-webkit-outer-spin-button]:m-0 [&::-webkit-outer-spin-button]:appearance-none',\n '[&::-webkit-inner-spin-button]:m-0 [&::-webkit-inner-spin-button]:appearance-none',\n '[&[type=number]]:[appearance:textfield]',\n // type=\"search\": drop WebKit's native clear button so it doesn't double up with a\n // custom clear control (e.g. the scorers toolbar's InputGroupButton).\n '[&::-webkit-search-cancel-button]:appearance-none',\n className,\n )}\n {...props}\n />\n );\n },\n);\nInputGroupInput.displayName = 'InputGroupInput';\n\nexport type InputGroupTextareaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement> & {\n testId?: string;\n error?: boolean;\n};\n\nconst InputGroupTextarea = React.forwardRef<HTMLTextAreaElement, InputGroupTextareaProps>(\n ({ className, testId, error, ...props }, ref) => {\n return (\n <textarea\n ref={ref}\n data-slot=\"input-group-control\"\n data-testid={testId}\n aria-invalid={error}\n className={cn(\n 'min-h-15 min-w-0 flex-1 resize-y bg-transparent px-3 py-2 text-foreground outline-hidden',\n inputGroupControlTextBySize,\n 'placeholder:text-muted-foreground placeholder:transition-opacity placeholder:duration-normal',\n 'focus:placeholder:opacity-70',\n 'disabled:cursor-not-allowed',\n className,\n )}\n {...props}\n />\n );\n },\n);\nInputGroupTextarea.displayName = 'InputGroupTextarea';\n\nexport type InputGroupTextProps = React.ComponentPropsWithoutRef<'span'>;\n\nconst InputGroupText = React.forwardRef<HTMLSpanElement, InputGroupTextProps>(({ className, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={cn(\n 'flex items-center gap-2 text-caption text-muted-foreground [&_svg]:pointer-events-none',\n \"[&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n );\n});\nInputGroupText.displayName = 'InputGroupText';\n\nexport type InputGroupButtonProps = Omit<ButtonProps, 'size' | 'variant'> & {\n size?: ButtonProps['size'];\n variant?: ButtonProps['variant'];\n};\n\nconst InputGroupButton = React.forwardRef<HTMLButtonElement, InputGroupButtonProps>(\n ({ size = 'icon-sm', variant = 'ghost', type = 'button', ...props }, ref) => {\n return <Button ref={ref} type={type} size={size} variant={variant} {...props} />;\n },\n);\nInputGroupButton.displayName = 'InputGroupButton';\n\nexport { InputGroup, InputGroupAddon, InputGroupInput, InputGroupTextarea, InputGroupText, InputGroupButton };\n"],"names":["cn","inputSurfaceAndFocusWithinStyle","fieldErrorRimWithin","React","ControlSizeContext","jsx","controlHeight","cva","Button"],"mappings":"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"}
1
+ {"version":3,"file":"input-group-BRhBfeHC.cjs","sources":["../src/ds/components/InputGroup/input-group.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport type { VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { Button } from '@/ds/components/Button';\nimport type { ButtonProps } from '@/ds/components/Button/Button';\nimport { ControlSizeContext, controlHeight } from '@/ds/primitives/control-size';\nimport type { ControlSize } from '@/ds/primitives/control-size';\nimport { fieldErrorRimWithin, inputSurfaceAndFocusWithinStyle } from '@/ds/primitives/form-element';\nimport { cn } from '@/lib/utils';\n\n// Size flows down as `data-size` on the named group root (`group/input-group`), read by the\n// control through `group-data-[size=…]` variants — no prop drilling. The one context read is\n// upward: a wrapper that owns the rung (ButtonsGroup) hands it to the field.\n\nconst inputGroupBaseClassName = cn(\n // `flex-1` (not `min-w-0`) lets the root fill a flex row while keeping its content-floor\n // so it never collapses to 0. `items-center` centres the control: it carries its own\n // h-form-* (2px taller than the root's content box), so stretch would push its text low\n // / overflow the bottom border, while centring overlaps the (transparent) borders cleanly.\n 'group/input-group relative flex w-full flex-1 items-center',\n // The wrapper owns its control's width — a bare control has no width of its own,\n // so the group is the one that decides the input fills the remaining space.\n '[&>[data-slot=input-group-control]]:min-w-0 [&>[data-slot=input-group-control]]:flex-1',\n 'text-foreground',\n 'has-[:disabled]:cursor-not-allowed has-[:disabled]:text-muted-foreground',\n // Height is on the root (border-box) so the group matches a same-size sibling control.\n // Auto height when vertical (block-* addon) or wrapping a textarea.\n 'has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col',\n 'has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col',\n 'has-[textarea]:h-auto',\n 'has-[>[data-align=inline-start]]:[&>[data-slot=input-group-control]]:pl-0',\n 'has-[>[data-align=inline-end]]:[&>[data-slot=input-group-control]]:pr-0',\n // In flex-col, flex-1 zeroes the control's height; force flex-none + w-full instead.\n 'has-[>[data-align=block-start]]:[&>[data-slot=input-group-control]]:w-full has-[>[data-align=block-start]]:[&>[data-slot=input-group-control]]:flex-none',\n 'has-[>[data-align=block-end]]:[&>[data-slot=input-group-control]]:w-full has-[>[data-align=block-end]]:[&>[data-slot=input-group-control]]:flex-none',\n);\n\nconst inputGroupRoundedTextareaClassName = cn(\n // Pill (rounded-full) only fits single-line inline shapes. Fall back to rounded-xl\n // whenever the group goes vertical (block-* addon) or wraps a textarea.\n 'has-[>[data-align=block-start]]:rounded-xl',\n 'has-[>[data-align=block-end]]:rounded-xl',\n 'has-[textarea]:rounded-xl',\n);\n\n// A group wears the field material — the same `bg-card` plus rim an Input wears — so a\n// group and a bare field beside it are one surface. Its states move the rim, and they\n// read the nested control's focus (`focus-within`) because the wrapper never takes focus\n// itself. There is no second look: a transparent `outline` group existed alongside this\n// one and only ever produced two boundary languages for the same control, which is why\n// four of its call sites had wrapped it in a hand-made `bg-card rounded-full` div to get\n// the material back.\nconst inputGroupClassName = cn(\n inputGroupBaseClassName,\n 'rounded-full',\n inputSurfaceAndFocusWithinStyle,\n fieldErrorRimWithin,\n inputGroupRoundedTextareaClassName,\n);\n\nexport type InputGroupProps = React.ComponentPropsWithoutRef<'div'> & {\n size?: ControlSize;\n};\n\nconst InputGroup = React.forwardRef<HTMLDivElement, InputGroupProps>(({ className, size, ...props }, ref) => {\n // A wrapper's rung wins over the field's own: inside a ButtonsGroup the group owns the\n // height of every segment, so a field that kept its own type scale would sit at one rung\n // and read at another.\n const groupSize = React.useContext(ControlSizeContext);\n const resolved = groupSize ?? size ?? 'md';\n return (\n <div\n ref={ref}\n role=\"group\"\n data-slot=\"input-group\"\n data-size={resolved}\n className={cn(inputGroupClassName, controlHeight[resolved], className)}\n {...props}\n />\n );\n});\nInputGroup.displayName = 'InputGroup';\n\nconst inputGroupControlTextBySize = cn(\n 'group-data-[size=sm]/input-group:text-caption',\n 'group-data-[size=md]/input-group:text-body-sm',\n 'group-data-[size=lg]/input-group:text-body',\n);\n\nconst inputGroupAddonVariants = cva(\n cn(\n 'flex items-center justify-center gap-2 text-muted-foreground select-none',\n inputGroupControlTextBySize,\n 'group-has-[:disabled]/input-group:text-muted-foreground',\n \"[&>svg:not([class*='size-'])]:size-4\",\n ),\n {\n variants: {\n align: {\n 'inline-start': 'order-first pr-1 pl-3 has-[>button]:pl-1',\n 'inline-end': 'order-last pr-3 pl-1 has-[>button]:pr-1',\n 'block-start': 'order-first w-full justify-start border-b border-border px-3 pt-2 pb-1',\n 'block-end': 'order-last w-full justify-start border-t border-border px-3 pt-1 pb-2',\n },\n },\n defaultVariants: {\n align: 'inline-start',\n },\n },\n);\n\nexport type InputGroupAddonProps = React.ComponentPropsWithoutRef<'div'> & VariantProps<typeof inputGroupAddonVariants>;\n\nconst InputGroupAddon = React.forwardRef<HTMLDivElement, InputGroupAddonProps>(\n ({ className, align = 'inline-start', onClick, ...props }, ref) => {\n return (\n <div\n ref={ref}\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={event => {\n // Click on non-interactive addon area focuses the control inside the group.\n // Skip when a button/input handled the click itself.\n const target = event.target as HTMLElement;\n if (!target.closest('button, input, textarea, [role=\"button\"]')) {\n event.currentTarget.parentElement\n ?.querySelector<HTMLInputElement | HTMLTextAreaElement>('[data-slot=input-group-control]')\n ?.focus();\n }\n onClick?.(event);\n }}\n {...props}\n />\n );\n },\n);\nInputGroupAddon.displayName = 'InputGroupAddon';\n\n// Size flows from the parent group's `data-size` (no React context). All four sizes are\n// written out so Tailwind's scanner emits them. The control is sized to the root's\n// content box (token height minus the 1px border on each side) so it never overflows the\n// root — otherwise, in a flex-column parent, the root's content-based minimum would win\n// over its explicit height and the group would render 2px taller than a sibling control.\n// The explicit height also keeps the control from collapsing to the line-height in block\n// mode (flex-col + flex-none).\nconst inputGroupControlHeightBySize = cn(\n 'group-data-[size=sm]/input-group:h-[calc(var(--spacing-control-sm)-2px)]',\n 'group-data-[size=md]/input-group:h-[calc(var(--spacing-control-md)-2px)]',\n 'group-data-[size=lg]/input-group:h-[calc(var(--spacing-control-lg)-2px)]',\n);\nexport type InputGroupInputProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> & {\n testId?: string;\n error?: boolean;\n};\n\nconst InputGroupInput = React.forwardRef<HTMLInputElement, InputGroupInputProps>(\n ({ className, testId, error, type = 'text', ...props }, ref) => {\n return (\n <input\n ref={ref}\n type={type}\n data-slot=\"input-group-control\"\n data-testid={testId}\n aria-invalid={error}\n className={cn(\n // Height fits the root's content box (see inputGroupControlHeightBySize).\n 'min-w-0 flex-1 bg-transparent px-3 text-foreground outline-hidden',\n inputGroupControlHeightBySize,\n inputGroupControlTextBySize,\n 'placeholder:text-muted-foreground placeholder:transition-opacity placeholder:duration-normal',\n 'focus:placeholder:opacity-70',\n 'disabled:cursor-not-allowed',\n // Hide native number-spinner arrows so consumers can compose their own\n // stepper (see the NumberWithStepper story). WebKit uses the spin-button\n // pseudo-elements; Firefox needs `appearance: textfield` on the input.\n '[&::-webkit-outer-spin-button]:m-0 [&::-webkit-outer-spin-button]:appearance-none',\n '[&::-webkit-inner-spin-button]:m-0 [&::-webkit-inner-spin-button]:appearance-none',\n '[&[type=number]]:[appearance:textfield]',\n // type=\"search\": drop WebKit's native clear button so it doesn't double up with a\n // custom clear control (e.g. the scorers toolbar's InputGroupButton).\n '[&::-webkit-search-cancel-button]:appearance-none',\n className,\n )}\n {...props}\n />\n );\n },\n);\nInputGroupInput.displayName = 'InputGroupInput';\n\nexport type InputGroupTextareaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement> & {\n testId?: string;\n error?: boolean;\n};\n\nconst InputGroupTextarea = React.forwardRef<HTMLTextAreaElement, InputGroupTextareaProps>(\n ({ className, testId, error, ...props }, ref) => {\n return (\n <textarea\n ref={ref}\n data-slot=\"input-group-control\"\n data-testid={testId}\n aria-invalid={error}\n className={cn(\n 'min-h-15 min-w-0 flex-1 resize-y bg-transparent px-3 py-2 text-foreground outline-hidden',\n inputGroupControlTextBySize,\n 'placeholder:text-muted-foreground placeholder:transition-opacity placeholder:duration-normal',\n 'focus:placeholder:opacity-70',\n 'disabled:cursor-not-allowed',\n className,\n )}\n {...props}\n />\n );\n },\n);\nInputGroupTextarea.displayName = 'InputGroupTextarea';\n\nexport type InputGroupTextProps = React.ComponentPropsWithoutRef<'span'>;\n\nconst InputGroupText = React.forwardRef<HTMLSpanElement, InputGroupTextProps>(({ className, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={cn(\n 'flex items-center gap-2 text-caption text-muted-foreground [&_svg]:pointer-events-none',\n \"[&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n );\n});\nInputGroupText.displayName = 'InputGroupText';\n\nexport type InputGroupButtonProps = Omit<ButtonProps, 'size' | 'variant'> & {\n size?: ButtonProps['size'];\n variant?: ButtonProps['variant'];\n};\n\nconst InputGroupButton = React.forwardRef<HTMLButtonElement, InputGroupButtonProps>(\n ({ size = 'icon-sm', variant = 'ghost', type = 'button', ...props }, ref) => {\n return <Button ref={ref} type={type} size={size} variant={variant} {...props} />;\n },\n);\nInputGroupButton.displayName = 'InputGroupButton';\n\nexport { InputGroup, InputGroupAddon, InputGroupInput, InputGroupTextarea, InputGroupText, InputGroupButton };\n"],"names":["cn","inputSurfaceAndFocusWithinStyle","fieldErrorRimWithin","React","ControlSizeContext","jsx","controlHeight","cva","Button"],"mappings":"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"}
@@ -5,12 +5,12 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
5
5
  require('../tabbed-container.css');const jsxRuntime = require('react/jsx-runtime');
6
6
  const lucideReact = require('lucide-react');
7
7
  const React = require('react');
8
- const combobox = require('../combobox-rKV-Lksj.cjs');
9
- const dataList = require('../data-list-D8bACyyK.cjs');
10
- const listSearch = require('../list-search-DXb7HFX8.cjs');
11
- const tabsContent = require('../tabs-content-DQNRMjup.cjs');
12
- const tabsTab = require('../tabs-tab-lm4xyjtD.cjs');
13
- const tabsRoot = require('../tabs-root-BqC8X_h6.cjs');
8
+ const combobox = require('../combobox-DJ0c4o4S.cjs');
9
+ const dataList = require('../data-list-Y42KyuI1.cjs');
10
+ const listSearch = require('../list-search-BzAIj0DB.cjs');
11
+ const tabsContent = require('../tabs-content-DnscxcLI.cjs');
12
+ const tabsTab = require('../tabs-tab-BmIBFifi.cjs');
13
+ const tabsRoot = require('../tabs-root-C-ePF1y9.cjs');
14
14
  const tooltip = require('../tooltip-DIZ5oqjV.cjs');
15
15
  const Txt = require('../Txt-DPmEpNbp.cjs');
16
16
  const utils_cn = require('../cn-DG0X1KEP.cjs');
@@ -1,12 +1,12 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { ListFilterIcon } from 'lucide-react';
3
3
  import { Children, isValidElement, useContext } from 'react';
4
- import { C as Combobox } from '../combobox-B_C0cNid.js';
5
- import { D as DataList } from '../data-list-DL_oFE4j.js';
6
- import { L as ListSearch } from '../list-search-9l8IEdxZ.js';
7
- import { T as TabContent } from '../tabs-content-h2qqD8t-.js';
8
- import { T as Tab, a as TabsContext } from '../tabs-tab-7e2as-AV.js';
9
- import { a as Tabs, T as TabList } from '../tabs-root-4vL8SHCO.js';
4
+ import { C as Combobox } from '../combobox-B15qTrWO.js';
5
+ import { D as DataList } from '../data-list-CyeD_u-6.js';
6
+ import { L as ListSearch } from '../list-search-DI1DH7vU.js';
7
+ import { T as TabContent } from '../tabs-content-CwbkTutf.js';
8
+ import { T as Tab, a as TabsContext } from '../tabs-tab-DoPSW-1s.js';
9
+ import { a as Tabs, T as TabList } from '../tabs-root-lrZZ3KwH.js';
10
10
  import { b as TooltipProvider, T as Tooltip, c as TooltipTrigger, a as TooltipContent } from '../tooltip-DsQPiynb.js';
11
11
  import { T as Txt } from '../Txt-BP1SRHmL.js';
12
12
  import { c as cn } from '../cn-65Adrsfj.js';
@@ -9,7 +9,7 @@ const reactHookForm = require('react-hook-form');
9
9
  const lib_form_fieldContext = require('../field-context.cjs.js');
10
10
  const lib_form_useSectionDisclosure = require('../use-section-disclosure.cjs.js');
11
11
  const lib_form_utils = require('../utils.cjs.js');
12
- const Button = require('../../../Button-BnmR2HRc.cjs');
12
+ const Button = require('../../../Button-CXhSUBxN.cjs');
13
13
  const collapsible = require('../../../collapsible-jfzzU7Gp.cjs');
14
14
  const Txt = require('../../../Txt-DPmEpNbp.cjs');
15
15
 
@@ -54,7 +54,7 @@ function ArrayElementWrapper({ children, onRemove, index }) {
54
54
  index + 1
55
55
  ] }),
56
56
  summary && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-foreground", title: summary, children: summary }),
57
- invalid && /* @__PURE__ */ jsxRuntime.jsx(Txt.Txt, { as: "span", variant: "meta", className: "ml-auto shrink-0 text-destructive-indicator", children: "Needs input" })
57
+ invalid && /* @__PURE__ */ jsxRuntime.jsx(Txt.Txt, { as: "span", variant: "meta", className: "ml-auto shrink-0 text-destructive-foreground", children: "Needs input" })
58
58
  ]
59
59
  }
60
60
  ),
@@ -1 +1 @@
1
- {"version":3,"file":"array-element-wrapper.cjs.js","sources":["../../../../src/lib/form/components/array-element-wrapper.tsx"],"sourcesContent":["import type { ArrayElementWrapperProps } from '@autoform/react';\nimport { Check, ChevronRight, Trash2 } from 'lucide-react';\nimport { useContext, useRef } from 'react';\nimport { useFormContext, useWatch } from 'react-hook-form';\nimport { ArrayAddButtonContext, FieldPathContext, FormReadOnlyContext } from '../field-context';\nimport { useSectionDisclosure } from '../use-section-disclosure';\nimport { isPlainObject } from '../utils';\nimport { Button } from '@/ds/components/Button';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { Txt } from '@/ds/components/Txt';\n\nconst HUMAN_SUMMARY_KEYS = ['title', 'name', 'label'];\n\nfunction firstFilledText(values: unknown[]) {\n return values.find((value): value is string => typeof value === 'string' && value.trim().length > 0);\n}\n\nfunction itemSummary(value: unknown) {\n if (typeof value === 'string') return value.trim();\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (!isPlainObject(value)) return undefined;\n return firstFilledText(HUMAN_SUMMARY_KEYS.map(key => value[key])) ?? firstFilledText(Object.values(value));\n}\n\nexport function ArrayElementWrapper({ children, onRemove, index }: ArrayElementWrapperProps) {\n const path = useContext(FieldPathContext);\n const readOnly = useContext(FormReadOnlyContext);\n const addButtonRef = useContext(ArrayAddButtonContext);\n const { control } = useFormContext();\n const value: unknown = useWatch({ control, name: path });\n const summary = itemSummary(value);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const { expanded, invalid, setExpanded } = useSectionDisclosure(path, !summary);\n const itemLabel = `Item ${index + 1}${summary ? `: ${summary}` : ''}`;\n\n return (\n <Collapsible\n open={expanded}\n onOpenChange={setExpanded}\n className=\"overflow-hidden rounded-lg border border-border bg-background motion-reduce:[&_[data-slot=collapsible-content]]:transition-none motion-reduce:[&_svg]:transition-none\"\n >\n <div className=\"flex min-w-0 items-center gap-1 pr-1\">\n <CollapsibleTrigger\n ref={triggerRef}\n aria-label={invalid ? `${itemLabel}, Needs input` : itemLabel}\n className=\"flex min-h-11 min-w-0 flex-1 items-center gap-2 rounded-lg px-3 text-left text-caption focus-visible:-outline-offset-1\"\n >\n <ChevronRight aria-hidden className=\"size-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"shrink-0 text-muted-foreground\">Item {index + 1}</span>\n {summary && (\n <span className=\"truncate text-foreground\" title={summary}>\n {summary}\n </span>\n )}\n {invalid && (\n <Txt as=\"span\" variant=\"meta\" className=\"ml-auto shrink-0 text-destructive-indicator\">\n Needs input\n </Txt>\n )}\n </CollapsibleTrigger>\n {!readOnly && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-md\"\n className=\"size-11\"\n aria-label={`Remove item ${index + 1}`}\n onClick={() => {\n onRemove();\n addButtonRef?.current?.focus();\n }}\n >\n <Trash2 />\n </Button>\n )}\n </div>\n <CollapsibleContent keepMounted className=\"border-t border-border p-3\">\n {children}\n {!readOnly && (\n <div className=\"flex justify-end pt-2\">\n <Button\n type=\"button\"\n className=\"min-h-11\"\n aria-label={`Done editing item ${index + 1}`}\n onClick={() => {\n setExpanded(false);\n triggerRef.current?.focus();\n }}\n icon={<Check />}\n >\n Done\n </Button>\n </div>\n )}\n </CollapsibleContent>\n </Collapsible>\n );\n}\n"],"names":["isPlainObject","useContext","FieldPathContext","FormReadOnlyContext","ArrayAddButtonContext","useFormContext","useWatch","useRef","useSectionDisclosure","jsxs","Collapsible","CollapsibleTrigger","jsx","ChevronRight","Txt","Button","Trash2","CollapsibleContent","Check"],"mappings":"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"}
1
+ {"version":3,"file":"array-element-wrapper.cjs.js","sources":["../../../../src/lib/form/components/array-element-wrapper.tsx"],"sourcesContent":["import type { ArrayElementWrapperProps } from '@autoform/react';\nimport { Check, ChevronRight, Trash2 } from 'lucide-react';\nimport { useContext, useRef } from 'react';\nimport { useFormContext, useWatch } from 'react-hook-form';\nimport { ArrayAddButtonContext, FieldPathContext, FormReadOnlyContext } from '../field-context';\nimport { useSectionDisclosure } from '../use-section-disclosure';\nimport { isPlainObject } from '../utils';\nimport { Button } from '@/ds/components/Button';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { Txt } from '@/ds/components/Txt';\n\nconst HUMAN_SUMMARY_KEYS = ['title', 'name', 'label'];\n\nfunction firstFilledText(values: unknown[]) {\n return values.find((value): value is string => typeof value === 'string' && value.trim().length > 0);\n}\n\nfunction itemSummary(value: unknown) {\n if (typeof value === 'string') return value.trim();\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (!isPlainObject(value)) return undefined;\n return firstFilledText(HUMAN_SUMMARY_KEYS.map(key => value[key])) ?? firstFilledText(Object.values(value));\n}\n\nexport function ArrayElementWrapper({ children, onRemove, index }: ArrayElementWrapperProps) {\n const path = useContext(FieldPathContext);\n const readOnly = useContext(FormReadOnlyContext);\n const addButtonRef = useContext(ArrayAddButtonContext);\n const { control } = useFormContext();\n const value: unknown = useWatch({ control, name: path });\n const summary = itemSummary(value);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const { expanded, invalid, setExpanded } = useSectionDisclosure(path, !summary);\n const itemLabel = `Item ${index + 1}${summary ? `: ${summary}` : ''}`;\n\n return (\n <Collapsible\n open={expanded}\n onOpenChange={setExpanded}\n className=\"overflow-hidden rounded-lg border border-border bg-background motion-reduce:[&_[data-slot=collapsible-content]]:transition-none motion-reduce:[&_svg]:transition-none\"\n >\n <div className=\"flex min-w-0 items-center gap-1 pr-1\">\n <CollapsibleTrigger\n ref={triggerRef}\n aria-label={invalid ? `${itemLabel}, Needs input` : itemLabel}\n className=\"flex min-h-11 min-w-0 flex-1 items-center gap-2 rounded-lg px-3 text-left text-caption focus-visible:-outline-offset-1\"\n >\n <ChevronRight aria-hidden className=\"size-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"shrink-0 text-muted-foreground\">Item {index + 1}</span>\n {summary && (\n <span className=\"truncate text-foreground\" title={summary}>\n {summary}\n </span>\n )}\n {invalid && (\n <Txt as=\"span\" variant=\"meta\" className=\"ml-auto shrink-0 text-destructive-foreground\">\n Needs input\n </Txt>\n )}\n </CollapsibleTrigger>\n {!readOnly && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-md\"\n className=\"size-11\"\n aria-label={`Remove item ${index + 1}`}\n onClick={() => {\n onRemove();\n addButtonRef?.current?.focus();\n }}\n >\n <Trash2 />\n </Button>\n )}\n </div>\n <CollapsibleContent keepMounted className=\"border-t border-border p-3\">\n {children}\n {!readOnly && (\n <div className=\"flex justify-end pt-2\">\n <Button\n type=\"button\"\n className=\"min-h-11\"\n aria-label={`Done editing item ${index + 1}`}\n onClick={() => {\n setExpanded(false);\n triggerRef.current?.focus();\n }}\n icon={<Check />}\n >\n Done\n </Button>\n </div>\n )}\n </CollapsibleContent>\n </Collapsible>\n );\n}\n"],"names":["isPlainObject","useContext","FieldPathContext","FormReadOnlyContext","ArrayAddButtonContext","useFormContext","useWatch","useRef","useSectionDisclosure","jsxs","Collapsible","CollapsibleTrigger","jsx","ChevronRight","Txt","Button","Trash2","CollapsibleContent","Check"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { useFormContext, useWatch } from 'react-hook-form';
5
5
  import { FieldPathContext, FormReadOnlyContext, ArrayAddButtonContext } from '../field-context.es.js';
6
6
  import { useSectionDisclosure } from '../use-section-disclosure.es.js';
7
7
  import { isPlainObject } from '../utils.es.js';
8
- import { B as Button } from '../../../Button-C6eUqcPI.js';
8
+ import { B as Button } from '../../../Button-D43ghVKt.js';
9
9
  import { C as Collapsible, b as CollapsibleTrigger, a as CollapsibleContent } from '../../../collapsible-BNUn4644.js';
10
10
  import { T as Txt } from '../../../Txt-BP1SRHmL.js';
11
11
 
@@ -50,7 +50,7 @@ function ArrayElementWrapper({ children, onRemove, index }) {
50
50
  index + 1
51
51
  ] }),
52
52
  summary && /* @__PURE__ */ jsx("span", { className: "truncate text-foreground", title: summary, children: summary }),
53
- invalid && /* @__PURE__ */ jsx(Txt, { as: "span", variant: "meta", className: "ml-auto shrink-0 text-destructive-indicator", children: "Needs input" })
53
+ invalid && /* @__PURE__ */ jsx(Txt, { as: "span", variant: "meta", className: "ml-auto shrink-0 text-destructive-foreground", children: "Needs input" })
54
54
  ]
55
55
  }
56
56
  ),
@@ -1 +1 @@
1
- {"version":3,"file":"array-element-wrapper.es.js","sources":["../../../../src/lib/form/components/array-element-wrapper.tsx"],"sourcesContent":["import type { ArrayElementWrapperProps } from '@autoform/react';\nimport { Check, ChevronRight, Trash2 } from 'lucide-react';\nimport { useContext, useRef } from 'react';\nimport { useFormContext, useWatch } from 'react-hook-form';\nimport { ArrayAddButtonContext, FieldPathContext, FormReadOnlyContext } from '../field-context';\nimport { useSectionDisclosure } from '../use-section-disclosure';\nimport { isPlainObject } from '../utils';\nimport { Button } from '@/ds/components/Button';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { Txt } from '@/ds/components/Txt';\n\nconst HUMAN_SUMMARY_KEYS = ['title', 'name', 'label'];\n\nfunction firstFilledText(values: unknown[]) {\n return values.find((value): value is string => typeof value === 'string' && value.trim().length > 0);\n}\n\nfunction itemSummary(value: unknown) {\n if (typeof value === 'string') return value.trim();\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (!isPlainObject(value)) return undefined;\n return firstFilledText(HUMAN_SUMMARY_KEYS.map(key => value[key])) ?? firstFilledText(Object.values(value));\n}\n\nexport function ArrayElementWrapper({ children, onRemove, index }: ArrayElementWrapperProps) {\n const path = useContext(FieldPathContext);\n const readOnly = useContext(FormReadOnlyContext);\n const addButtonRef = useContext(ArrayAddButtonContext);\n const { control } = useFormContext();\n const value: unknown = useWatch({ control, name: path });\n const summary = itemSummary(value);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const { expanded, invalid, setExpanded } = useSectionDisclosure(path, !summary);\n const itemLabel = `Item ${index + 1}${summary ? `: ${summary}` : ''}`;\n\n return (\n <Collapsible\n open={expanded}\n onOpenChange={setExpanded}\n className=\"overflow-hidden rounded-lg border border-border bg-background motion-reduce:[&_[data-slot=collapsible-content]]:transition-none motion-reduce:[&_svg]:transition-none\"\n >\n <div className=\"flex min-w-0 items-center gap-1 pr-1\">\n <CollapsibleTrigger\n ref={triggerRef}\n aria-label={invalid ? `${itemLabel}, Needs input` : itemLabel}\n className=\"flex min-h-11 min-w-0 flex-1 items-center gap-2 rounded-lg px-3 text-left text-caption focus-visible:-outline-offset-1\"\n >\n <ChevronRight aria-hidden className=\"size-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"shrink-0 text-muted-foreground\">Item {index + 1}</span>\n {summary && (\n <span className=\"truncate text-foreground\" title={summary}>\n {summary}\n </span>\n )}\n {invalid && (\n <Txt as=\"span\" variant=\"meta\" className=\"ml-auto shrink-0 text-destructive-indicator\">\n Needs input\n </Txt>\n )}\n </CollapsibleTrigger>\n {!readOnly && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-md\"\n className=\"size-11\"\n aria-label={`Remove item ${index + 1}`}\n onClick={() => {\n onRemove();\n addButtonRef?.current?.focus();\n }}\n >\n <Trash2 />\n </Button>\n )}\n </div>\n <CollapsibleContent keepMounted className=\"border-t border-border p-3\">\n {children}\n {!readOnly && (\n <div className=\"flex justify-end pt-2\">\n <Button\n type=\"button\"\n className=\"min-h-11\"\n aria-label={`Done editing item ${index + 1}`}\n onClick={() => {\n setExpanded(false);\n triggerRef.current?.focus();\n }}\n icon={<Check />}\n >\n Done\n </Button>\n </div>\n )}\n </CollapsibleContent>\n </Collapsible>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"array-element-wrapper.es.js","sources":["../../../../src/lib/form/components/array-element-wrapper.tsx"],"sourcesContent":["import type { ArrayElementWrapperProps } from '@autoform/react';\nimport { Check, ChevronRight, Trash2 } from 'lucide-react';\nimport { useContext, useRef } from 'react';\nimport { useFormContext, useWatch } from 'react-hook-form';\nimport { ArrayAddButtonContext, FieldPathContext, FormReadOnlyContext } from '../field-context';\nimport { useSectionDisclosure } from '../use-section-disclosure';\nimport { isPlainObject } from '../utils';\nimport { Button } from '@/ds/components/Button';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { Txt } from '@/ds/components/Txt';\n\nconst HUMAN_SUMMARY_KEYS = ['title', 'name', 'label'];\n\nfunction firstFilledText(values: unknown[]) {\n return values.find((value): value is string => typeof value === 'string' && value.trim().length > 0);\n}\n\nfunction itemSummary(value: unknown) {\n if (typeof value === 'string') return value.trim();\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (!isPlainObject(value)) return undefined;\n return firstFilledText(HUMAN_SUMMARY_KEYS.map(key => value[key])) ?? firstFilledText(Object.values(value));\n}\n\nexport function ArrayElementWrapper({ children, onRemove, index }: ArrayElementWrapperProps) {\n const path = useContext(FieldPathContext);\n const readOnly = useContext(FormReadOnlyContext);\n const addButtonRef = useContext(ArrayAddButtonContext);\n const { control } = useFormContext();\n const value: unknown = useWatch({ control, name: path });\n const summary = itemSummary(value);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const { expanded, invalid, setExpanded } = useSectionDisclosure(path, !summary);\n const itemLabel = `Item ${index + 1}${summary ? `: ${summary}` : ''}`;\n\n return (\n <Collapsible\n open={expanded}\n onOpenChange={setExpanded}\n className=\"overflow-hidden rounded-lg border border-border bg-background motion-reduce:[&_[data-slot=collapsible-content]]:transition-none motion-reduce:[&_svg]:transition-none\"\n >\n <div className=\"flex min-w-0 items-center gap-1 pr-1\">\n <CollapsibleTrigger\n ref={triggerRef}\n aria-label={invalid ? `${itemLabel}, Needs input` : itemLabel}\n className=\"flex min-h-11 min-w-0 flex-1 items-center gap-2 rounded-lg px-3 text-left text-caption focus-visible:-outline-offset-1\"\n >\n <ChevronRight aria-hidden className=\"size-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"shrink-0 text-muted-foreground\">Item {index + 1}</span>\n {summary && (\n <span className=\"truncate text-foreground\" title={summary}>\n {summary}\n </span>\n )}\n {invalid && (\n <Txt as=\"span\" variant=\"meta\" className=\"ml-auto shrink-0 text-destructive-foreground\">\n Needs input\n </Txt>\n )}\n </CollapsibleTrigger>\n {!readOnly && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-md\"\n className=\"size-11\"\n aria-label={`Remove item ${index + 1}`}\n onClick={() => {\n onRemove();\n addButtonRef?.current?.focus();\n }}\n >\n <Trash2 />\n </Button>\n )}\n </div>\n <CollapsibleContent keepMounted className=\"border-t border-border p-3\">\n {children}\n {!readOnly && (\n <div className=\"flex justify-end pt-2\">\n <Button\n type=\"button\"\n className=\"min-h-11\"\n aria-label={`Done editing item ${index + 1}`}\n onClick={() => {\n setExpanded(false);\n triggerRef.current?.focus();\n }}\n icon={<Check />}\n >\n Done\n </Button>\n </div>\n )}\n </CollapsibleContent>\n </Collapsible>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ const jsxRuntime = require('react/jsx-runtime');
6
6
  const lucideReact = require('lucide-react');
7
7
  const React = require('react');
8
8
  const lib_form_fieldContext = require('../field-context.cjs.js');
9
- const Button = require('../../../Button-BnmR2HRc.cjs');
9
+ const Button = require('../../../Button-CXhSUBxN.cjs');
10
10
  const Txt = require('../../../Txt-DPmEpNbp.cjs');
11
11
 
12
12
  function ArrayWrapper({ label, children, onAddItem }) {
@@ -2,7 +2,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { Brackets, Plus } from 'lucide-react';
3
3
  import { useContext, Children, useRef } from 'react';
4
4
  import { FormReadOnlyContext, ArrayAddButtonContext } from '../field-context.es.js';
5
- import { B as Button } from '../../../Button-C6eUqcPI.js';
5
+ import { B as Button } from '../../../Button-D43ghVKt.js';
6
6
  import { T as Txt } from '../../../Txt-BP1SRHmL.js';
7
7
 
8
8
  function ArrayWrapper({ label, children, onAddItem }) {
@@ -4,7 +4,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
5
  const jsxRuntime = require('react/jsx-runtime');
6
6
  const checkbox = require('../../../checkbox-CI8JtZKS.cjs');
7
- const fieldBlock = require('../../../field-block-BIDi9Bvc.cjs');
7
+ const fieldBlock = require('../../../field-block-DtaPqBa3.cjs');
8
8
 
9
9
  const BooleanField = ({ field, label, id, inputProps }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center space-x-2", children: [
10
10
  /* @__PURE__ */ jsxRuntime.jsx(