@mastra/playground-ui 57.0.0 → 58.0.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 (763) hide show
  1. package/README.md +25 -0
  2. package/dist/{Button-KUj0U-5I.js → Button-B8nF87ai.js} +2 -8
  3. package/dist/Button-B8nF87ai.js.map +1 -0
  4. package/dist/{Button-MMZPEb_q.cjs → Button-BAMnPqos.cjs} +1 -7
  5. package/dist/Button-BAMnPqos.cjs.map +1 -0
  6. package/dist/{Card-DwGasv0K.cjs → Card-BbwF20OW.cjs} +3 -3
  7. package/dist/Card-BbwF20OW.cjs.map +1 -0
  8. package/dist/{Card-B_buJ5yF.js → Card-DmT57Pve.js} +3 -3
  9. package/dist/Card-DmT57Pve.js.map +1 -0
  10. package/dist/{EmptyState-DiSP6UIy.cjs → EmptyState-2XQgeju6.cjs} +12 -3
  11. package/dist/EmptyState-2XQgeju6.cjs.map +1 -0
  12. package/dist/{EmptyState-B6cyZw6m.js → EmptyState-Bc4nJ9QH.js} +13 -4
  13. package/dist/EmptyState-Bc4nJ9QH.js.map +1 -0
  14. package/dist/{Notice-CPyYcX5J.cjs → Notice-AUNd8fqT.cjs} +2 -2
  15. package/dist/{Notice-CPyYcX5J.cjs.map → Notice-AUNd8fqT.cjs.map} +1 -1
  16. package/dist/{Notice-KC18b8Nd.js → Notice-WT8G4OA6.js} +2 -2
  17. package/dist/{Notice-KC18b8Nd.js.map → Notice-WT8G4OA6.js.map} +1 -1
  18. package/dist/{ask-user-DaRRR4qQ.cjs → ask-user-BPpgiE7k.cjs} +3 -3
  19. package/dist/{ask-user-DaRRR4qQ.cjs.map → ask-user-BPpgiE7k.cjs.map} +1 -1
  20. package/dist/{ask-user-C4DTzEQF.js → ask-user-jDUt7hgT.js} +3 -3
  21. package/dist/{ask-user-C4DTzEQF.js.map → ask-user-jDUt7hgT.js.map} +1 -1
  22. package/dist/buttons-group.css +2 -14
  23. package/dist/{chat-notification-DeKD1Ifx.js → chat-notification-CmdRGO_D.js} +2 -2
  24. package/dist/{chat-notification-DeKD1Ifx.js.map → chat-notification-CmdRGO_D.js.map} +1 -1
  25. package/dist/{chat-notification-C5Ox5tuS.cjs → chat-notification-DJykWtoj.cjs} +2 -2
  26. package/dist/{chat-notification-C5Ox5tuS.cjs.map → chat-notification-DJykWtoj.cjs.map} +1 -1
  27. package/dist/{chat-signal-DiAHks6_.js → chat-signal-Vg8pGXwH.js} +2 -2
  28. package/dist/{chat-signal-DiAHks6_.js.map → chat-signal-Vg8pGXwH.js.map} +1 -1
  29. package/dist/{chat-signal-ClyJeml8.cjs → chat-signal-xs3FkPts.cjs} +2 -2
  30. package/dist/{chat-signal-ClyJeml8.cjs.map → chat-signal-xs3FkPts.cjs.map} +1 -1
  31. package/dist/{code-block-D37olB3O.js → code-block-BD2N5Yi2.js} +5 -5
  32. package/dist/{code-block-D37olB3O.js.map → code-block-BD2N5Yi2.js.map} +1 -1
  33. package/dist/{code-block-BoTq0TMr.cjs → code-block-fI67m2KV.cjs} +5 -5
  34. package/dist/{code-block-BoTq0TMr.cjs.map → code-block-fI67m2KV.cjs.map} +1 -1
  35. package/dist/{code-editor-BQTDma1I.js → code-editor-C-0srcj0.js} +4 -3
  36. package/dist/code-editor-C-0srcj0.js.map +1 -0
  37. package/dist/{code-editor-BfoJXq9l.cjs → code-editor-CFu_BYpQ.cjs} +4 -3
  38. package/dist/code-editor-CFu_BYpQ.cjs.map +1 -0
  39. package/dist/{combobox-Bn_uyUSB.cjs → combobox-BoSB-muq.cjs} +17 -9
  40. package/dist/combobox-BoSB-muq.cjs.map +1 -0
  41. package/dist/{combobox-Cykfy5wc.js → combobox-Cd0JPUQW.js} +17 -9
  42. package/dist/combobox-Cd0JPUQW.js.map +1 -0
  43. package/dist/{combobox-styles-iuJUkJEQ.js → combobox-styles-BhUqhOvz.js} +4 -2
  44. package/dist/combobox-styles-BhUqhOvz.js.map +1 -0
  45. package/dist/{combobox-styles-CSsS2LEx.cjs → combobox-styles-LHrC0tU0.cjs} +4 -2
  46. package/dist/combobox-styles-LHrC0tU0.cjs.map +1 -0
  47. package/dist/{command-B7H-emho.cjs → command-AVQzLcYR.cjs} +2 -2
  48. package/dist/{command-B7H-emho.cjs.map → command-AVQzLcYR.cjs.map} +1 -1
  49. package/dist/{command-Bmy4PznC.js → command-DhiJvyMM.js} +2 -2
  50. package/dist/{command-Bmy4PznC.js.map → command-DhiJvyMM.js.map} +1 -1
  51. package/dist/components/AlertDialog.cjs.js +2 -2
  52. package/dist/components/AlertDialog.cjs.js.map +1 -1
  53. package/dist/components/AlertDialog.es.js +3 -3
  54. package/dist/components/AlertDialog.es.js.map +1 -1
  55. package/dist/components/Button.cjs.js +1 -1
  56. package/dist/components/Button.es.js +2 -2
  57. package/dist/components/Card.cjs.js +1 -1
  58. package/dist/components/Card.es.js +1 -1
  59. package/dist/components/ClampedText.cjs.js +1 -1
  60. package/dist/components/ClampedText.es.js +1 -1
  61. package/dist/components/CodeBlock.cjs.js +1 -1
  62. package/dist/components/CodeBlock.es.js +1 -1
  63. package/dist/components/CodeEditor.cjs.js +1 -1
  64. package/dist/components/CodeEditor.es.js +1 -1
  65. package/dist/components/Columns.cjs.js +2 -106
  66. package/dist/components/Columns.cjs.js.map +1 -1
  67. package/dist/components/Columns.es.js +4 -107
  68. package/dist/components/Columns.es.js.map +1 -1
  69. package/dist/components/Combobox.cjs.js +2 -2
  70. package/dist/components/Combobox.es.js +2 -2
  71. package/dist/components/Command.cjs.js +1 -1
  72. package/dist/components/Command.es.js +1 -1
  73. package/dist/components/CommandPalette.cjs.js +1 -1
  74. package/dist/components/CommandPalette.es.js +1 -1
  75. package/dist/components/Comment.cjs.js +3 -3
  76. package/dist/components/Comment.cjs.js.map +1 -1
  77. package/dist/components/Comment.es.js +3 -3
  78. package/dist/components/Comment.es.js.map +1 -1
  79. package/dist/components/CopyButton.cjs.js +1 -1
  80. package/dist/components/CopyButton.es.js +1 -1
  81. package/dist/components/DataCodeSection.cjs.js +1 -1
  82. package/dist/components/DataCodeSection.es.js +1 -1
  83. package/dist/components/DataDetailsPanel.cjs.js +2 -2
  84. package/dist/components/DataDetailsPanel.es.js +2 -2
  85. package/dist/components/DataKeysAndValues.cjs.js +1 -1
  86. package/dist/components/DataKeysAndValues.es.js +1 -1
  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 +10 -4
  94. package/dist/components/DateTimePicker.cjs.js.map +1 -1
  95. package/dist/components/DateTimePicker.es.js +10 -4
  96. package/dist/components/DateTimePicker.es.js.map +1 -1
  97. package/dist/components/DateTimeRangePicker.cjs.js +1 -1
  98. package/dist/components/DateTimeRangePicker.es.js +1 -1
  99. package/dist/components/Dialog.cjs.js +2 -2
  100. package/dist/components/Dialog.es.js +3 -3
  101. package/dist/components/DisabledFeatureButton.cjs.js +1 -1
  102. package/dist/components/DisabledFeatureButton.es.js +1 -1
  103. package/dist/components/Drawer.cjs.js +1 -1
  104. package/dist/components/Drawer.es.js +1 -1
  105. package/dist/components/EmptyState.cjs.js +1 -1
  106. package/dist/components/EmptyState.es.js +1 -1
  107. package/dist/components/EnvironmentVariablesEditor.cjs.js +4 -4
  108. package/dist/components/EnvironmentVariablesEditor.es.js +4 -4
  109. package/dist/components/ErrorBoundary.cjs.js +1 -1
  110. package/dist/components/ErrorBoundary.es.js +1 -1
  111. package/dist/components/FilterBar.cjs.js +3 -3
  112. package/dist/components/FilterBar.es.js +4 -4
  113. package/dist/components/FormFieldBlocks.cjs.js +4 -4
  114. package/dist/components/FormFieldBlocks.es.js +4 -4
  115. package/dist/components/Input.cjs.js +1 -1
  116. package/dist/components/Input.es.js +1 -1
  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 +1 -3
  124. package/dist/components/LogsDataList.cjs.js.map +1 -1
  125. package/dist/components/LogsDataList.es.js +1 -3
  126. package/dist/components/LogsDataList.es.js.map +1 -1
  127. package/dist/components/MainSidebar.cjs.js +125 -11
  128. package/dist/components/MainSidebar.cjs.js.map +1 -1
  129. package/dist/components/MainSidebar.es.js +120 -1
  130. package/dist/components/MainSidebar.es.js.map +1 -1
  131. package/dist/components/MarkdownRenderer.cjs.js +1 -1
  132. package/dist/components/MarkdownRenderer.es.js +1 -1
  133. package/dist/components/Message.cjs.js +1 -1
  134. package/dist/components/Message.es.js +1 -1
  135. package/dist/components/MetricsCard.cjs.js +1 -1
  136. package/dist/components/MetricsCard.es.js +1 -1
  137. package/dist/components/MetricsKpiCard.cjs.js +1 -1
  138. package/dist/components/MetricsKpiCard.es.js +1 -1
  139. package/dist/components/Notice.cjs.js +1 -1
  140. package/dist/components/Notice.es.js +1 -1
  141. package/dist/components/PageHeader.cjs.js +1 -1
  142. package/dist/components/PageHeader.es.js +1 -1
  143. package/dist/components/PageLayout.cjs.js +26 -3
  144. package/dist/components/PageLayout.cjs.js.map +1 -1
  145. package/dist/components/PageLayout.es.js +27 -4
  146. package/dist/components/PageLayout.es.js.map +1 -1
  147. package/dist/components/PrevNextNav.cjs.js +1 -1
  148. package/dist/components/PrevNextNav.es.js +1 -1
  149. package/dist/components/PropertyFilter.cjs.js +5 -5
  150. package/dist/components/PropertyFilter.cjs.js.map +1 -1
  151. package/dist/components/PropertyFilter.es.js +6 -6
  152. package/dist/components/PropertyFilter.es.js.map +1 -1
  153. package/dist/components/RuleBuilder.cjs.js +3 -3
  154. package/dist/components/RuleBuilder.es.js +3 -3
  155. package/dist/components/Select.cjs.js +1 -1
  156. package/dist/components/Select.es.js +1 -1
  157. package/dist/components/SideDialog.cjs.js +3 -3
  158. package/dist/components/SideDialog.es.js +3 -3
  159. package/dist/components/Tabs.cjs.js +3 -3
  160. package/dist/components/Tabs.es.js +3 -3
  161. package/dist/components/Textarea.cjs.js +1 -1
  162. package/dist/components/Textarea.es.js +1 -1
  163. package/dist/components/ThreadList.cjs.js +1 -1
  164. package/dist/components/ThreadList.es.js +1 -1
  165. package/dist/components/Truncate.cjs.js +1 -1
  166. package/dist/components/Truncate.es.js +1 -1
  167. package/dist/components/Workflow.cjs.js +4 -4
  168. package/dist/components/Workflow.es.js +4 -4
  169. package/dist/components/ai/ask-user.cjs.js +1 -1
  170. package/dist/components/ai/ask-user.es.js +1 -1
  171. package/dist/components/ai/chat-event.cjs.js +3 -3
  172. package/dist/components/ai/chat-event.es.js +4 -4
  173. package/dist/components/ai/plan.cjs.js +2 -2
  174. package/dist/components/ai/plan.es.js +2 -2
  175. package/dist/components/ai/tool-approval.cjs.js +1 -1
  176. package/dist/components/ai/tool-approval.es.js +1 -1
  177. package/dist/components/ai/tool-call.cjs.js +2 -2
  178. package/dist/components/ai/tool-call.es.js +3 -3
  179. package/dist/{copy-button-B5ZCtnTb.cjs → copy-button-D2MTGxq_.cjs} +2 -2
  180. package/dist/{copy-button-B5ZCtnTb.cjs.map → copy-button-D2MTGxq_.cjs.map} +1 -1
  181. package/dist/{copy-button-DZqxEuiE.js → copy-button-DcZ1mdw4.js} +2 -2
  182. package/dist/{copy-button-DZqxEuiE.js.map → copy-button-DcZ1mdw4.js.map} +1 -1
  183. package/dist/{data-code-section-DJRr65hS.js → data-code-section-C75shCII.js} +5 -5
  184. package/dist/{data-code-section-DJRr65hS.js.map → data-code-section-C75shCII.js.map} +1 -1
  185. package/dist/{data-code-section-iXzoOYMX.cjs → data-code-section-DzLc9O0B.cjs} +5 -5
  186. package/dist/{data-code-section-iXzoOYMX.cjs.map → data-code-section-DzLc9O0B.cjs.map} +1 -1
  187. package/dist/{data-keys-and-values-DhC4U4Yl.js → data-keys-and-values-BTYDB-K2.js} +3 -20
  188. package/dist/data-keys-and-values-BTYDB-K2.js.map +1 -0
  189. package/dist/{data-keys-and-values-BduKvvC5.cjs → data-keys-and-values-CMJ9zHKm.cjs} +3 -20
  190. package/dist/data-keys-and-values-CMJ9zHKm.cjs.map +1 -0
  191. package/dist/{data-list-DSbuTWLI.cjs → data-list-CH3HAhK5.cjs} +5 -5
  192. package/dist/data-list-CH3HAhK5.cjs.map +1 -0
  193. package/dist/{data-list-Cn0Ls4l2.js → data-list-DXjH5wkB.js} +5 -5
  194. package/dist/data-list-DXjH5wkB.js.map +1 -0
  195. package/dist/{data-list-spacer-C0YimRXC.js → data-list-spacer-BQ4_YeyT.js} +2 -2
  196. package/dist/{data-list-spacer-C0YimRXC.js.map → data-list-spacer-BQ4_YeyT.js.map} +1 -1
  197. package/dist/{data-list-spacer-DUBpzv_H.cjs → data-list-spacer-GIVW2hB1.cjs} +2 -2
  198. package/dist/{data-list-spacer-DUBpzv_H.cjs.map → data-list-spacer-GIVW2hB1.cjs.map} +1 -1
  199. package/dist/{data-panel-Bd_Xsz-W.cjs → data-panel-CIu6JToM.cjs} +3 -3
  200. package/dist/{data-panel-Bd_Xsz-W.cjs.map → data-panel-CIu6JToM.cjs.map} +1 -1
  201. package/dist/{data-panel-Y7wD0xlR.js → data-panel-CPZ2GuZN.js} +3 -3
  202. package/dist/{data-panel-Y7wD0xlR.js.map → data-panel-CPZ2GuZN.js.map} +1 -1
  203. package/dist/{date-time-range-picker-D2g3RU5B.cjs → date-time-range-picker-BCzvSYx3.cjs} +3 -3
  204. package/dist/{date-time-range-picker-D2g3RU5B.cjs.map → date-time-range-picker-BCzvSYx3.cjs.map} +1 -1
  205. package/dist/{date-time-range-picker-Cb86jLFc.js → date-time-range-picker-C-t3Kdpk.js} +3 -3
  206. package/dist/{date-time-range-picker-Cb86jLFc.js.map → date-time-range-picker-C-t3Kdpk.js.map} +1 -1
  207. package/dist/{dialog-DMOXPT0N.js → dialog-Dtfe1ylw.js} +5 -5
  208. package/dist/dialog-Dtfe1ylw.js.map +1 -0
  209. package/dist/{dialog-Bilo4jEU.cjs → dialog-Vvcjm0rZ.cjs} +4 -4
  210. package/dist/dialog-Vvcjm0rZ.cjs.map +1 -0
  211. package/dist/domains/auth/components/permission-denied.cjs.js +22 -0
  212. package/dist/domains/auth/components/permission-denied.cjs.js.map +1 -0
  213. package/dist/domains/auth/components/permission-denied.d.ts +2 -0
  214. package/dist/domains/auth/components/permission-denied.es.js +18 -0
  215. package/dist/domains/auth/components/permission-denied.es.js.map +1 -0
  216. package/dist/domains/auth/components/session-expired.cjs.js +40 -0
  217. package/dist/domains/auth/components/session-expired.cjs.js.map +1 -0
  218. package/dist/domains/auth/components/session-expired.d.ts +2 -0
  219. package/dist/domains/auth/components/session-expired.es.js +36 -0
  220. package/dist/domains/auth/components/session-expired.es.js.map +1 -0
  221. package/dist/domains/auth/services/sso-login.cjs.js +28 -0
  222. package/dist/domains/auth/services/sso-login.cjs.js.map +1 -0
  223. package/dist/domains/auth/services/sso-login.d.ts +2 -0
  224. package/dist/domains/auth/services/sso-login.es.js +24 -0
  225. package/dist/domains/auth/services/sso-login.es.js.map +1 -0
  226. package/dist/domains/chat/attachments/attachment-preview-dialog.cjs.js +2 -3
  227. package/dist/domains/chat/attachments/attachment-preview-dialog.cjs.js.map +1 -1
  228. package/dist/domains/chat/attachments/attachment-preview-dialog.es.js +2 -3
  229. package/dist/domains/chat/attachments/attachment-preview-dialog.es.js.map +1 -1
  230. package/dist/domains/chat/attachments/composer-attachment.cjs.js +1 -2
  231. package/dist/domains/chat/attachments/composer-attachment.cjs.js.map +1 -1
  232. package/dist/domains/chat/attachments/composer-attachment.es.js +1 -2
  233. package/dist/domains/chat/attachments/composer-attachment.es.js.map +1 -1
  234. package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
  235. package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
  236. package/dist/domains/chat/components/network-choice-metadata-dialog.cjs.js +3 -3
  237. package/dist/domains/chat/components/network-choice-metadata-dialog.es.js +3 -3
  238. package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
  239. package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
  240. package/dist/domains/chat/messages/reasoning.cjs.js +1 -1
  241. package/dist/domains/chat/messages/reasoning.es.js +1 -1
  242. package/dist/domains/chat/messages/renderers/message-text.cjs.js +2 -2
  243. package/dist/domains/chat/messages/renderers/message-text.es.js +2 -2
  244. package/dist/domains/chat/messages/renderers/status-renderers.cjs.js +1 -1
  245. package/dist/domains/chat/messages/renderers/status-renderers.es.js +1 -1
  246. package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
  247. package/dist/domains/chat/messages/signal-badge.es.js +1 -1
  248. package/dist/domains/chat/messages/tripwire-notice.cjs.js +1 -1
  249. package/dist/domains/chat/messages/tripwire-notice.es.js +1 -1
  250. package/dist/domains/chat/tools/badges/ask-user-badge.cjs.js +1 -1
  251. package/dist/domains/chat/tools/badges/ask-user-badge.es.js +1 -1
  252. package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js +2 -2
  253. package/dist/domains/chat/tools/badges/code-mode-badge.es.js +2 -2
  254. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +1 -1
  255. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +1 -1
  256. package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
  257. package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
  258. package/dist/domains/chat/tools/badges/tool-approval-buttons.cjs.js +1 -1
  259. package/dist/domains/chat/tools/badges/tool-approval-buttons.es.js +1 -1
  260. package/dist/domains/logs/components/log-details-view.cjs.js +2 -2
  261. package/dist/domains/logs/components/log-details-view.es.js +2 -2
  262. package/dist/domains/logs/components/logs-error-content.cjs.js +6 -7
  263. package/dist/domains/logs/components/logs-error-content.cjs.js.map +1 -1
  264. package/dist/domains/logs/components/logs-error-content.es.js +4 -5
  265. package/dist/domains/logs/components/logs-error-content.es.js.map +1 -1
  266. package/dist/domains/logs/components/logs-list-view.cjs.js +1 -1
  267. package/dist/domains/logs/components/logs-list-view.es.js +1 -1
  268. package/dist/domains/logs/components/logs-toolbar.cjs.js +1 -1
  269. package/dist/domains/logs/components/logs-toolbar.es.js +1 -1
  270. package/dist/domains/logs/components/no-logs-info.cjs.js +2 -2
  271. package/dist/domains/logs/components/no-logs-info.es.js +2 -2
  272. package/dist/domains/memory/components/flame-graph.cjs.js +1 -1
  273. package/dist/domains/memory/components/flame-graph.es.js +1 -1
  274. package/dist/domains/memory/components/memory-studio-panel.cjs.js +1 -1
  275. package/dist/domains/memory/components/memory-studio-panel.es.js +1 -1
  276. package/dist/domains/memory/components/observation-detail-view.cjs.js +1 -1
  277. package/dist/domains/memory/components/observation-detail-view.es.js +1 -1
  278. package/dist/domains/metrics/components/card-action-buttons.cjs.js +1 -1
  279. package/dist/domains/metrics/components/card-action-buttons.es.js +1 -1
  280. package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
  281. package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
  282. package/dist/domains/metrics/components/kpi-card-view.cjs.js +1 -1
  283. package/dist/domains/metrics/components/kpi-card-view.es.js +1 -1
  284. package/dist/domains/metrics/components/latency-card-view.cjs.js +4 -4
  285. package/dist/domains/metrics/components/latency-card-view.es.js +4 -4
  286. package/dist/domains/metrics/components/memory-card-view.cjs.js +5 -5
  287. package/dist/domains/metrics/components/memory-card-view.es.js +5 -5
  288. package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js +2 -2
  289. package/dist/domains/metrics/components/model-usage-cost-card-view.es.js +2 -2
  290. package/dist/domains/metrics/components/scores-card-view.cjs.js +5 -5
  291. package/dist/domains/metrics/components/scores-card-view.es.js +5 -5
  292. package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js +4 -4
  293. package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js +4 -4
  294. package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js +4 -4
  295. package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js +4 -4
  296. package/dist/domains/metrics/components/traces-volume-card-view.cjs.js +4 -4
  297. package/dist/domains/metrics/components/traces-volume-card-view.es.js +4 -4
  298. package/dist/domains/traces/components/no-traces-info.cjs.js +1 -1
  299. package/dist/domains/traces/components/no-traces-info.es.js +1 -1
  300. package/dist/domains/traces/components/span-data-panel-view.cjs.js +19 -8
  301. package/dist/domains/traces/components/span-data-panel-view.cjs.js.map +1 -1
  302. package/dist/domains/traces/components/span-data-panel-view.es.js +20 -9
  303. package/dist/domains/traces/components/span-data-panel-view.es.js.map +1 -1
  304. package/dist/domains/traces/components/span-details-view.cjs.js +5 -3
  305. package/dist/domains/traces/components/span-details-view.cjs.js.map +1 -1
  306. package/dist/domains/traces/components/span-details-view.es.js +6 -4
  307. package/dist/domains/traces/components/span-details-view.es.js.map +1 -1
  308. package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +3 -3
  309. package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +3 -3
  310. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +5 -3
  311. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js.map +1 -1
  312. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +5 -3
  313. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js.map +1 -1
  314. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +13 -12
  315. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js.map +1 -1
  316. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +7 -6
  317. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js.map +1 -1
  318. package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +1 -1
  319. package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +1 -1
  320. package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +2 -2
  321. package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +2 -2
  322. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +79 -0
  323. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js.map +1 -0
  324. package/dist/domains/traces/components/span-payload/span-payload-processor.d.ts +2 -0
  325. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +75 -0
  326. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js.map +1 -0
  327. package/dist/domains/traces/components/span-payload/span-payload-registry.cjs.js +2 -0
  328. package/dist/domains/traces/components/span-payload/span-payload-registry.cjs.js.map +1 -1
  329. package/dist/domains/traces/components/span-payload/span-payload-registry.es.js +2 -1
  330. package/dist/domains/traces/components/span-payload/span-payload-registry.es.js.map +1 -1
  331. package/dist/domains/traces/components/span-payload/span-payload-section.cjs.js +2 -2
  332. package/dist/domains/traces/components/span-payload/span-payload-section.es.js +2 -2
  333. package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +2 -2
  334. package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +2 -2
  335. package/dist/domains/traces/components/span-payload/span-processor-attributes.cjs.js +85 -0
  336. package/dist/domains/traces/components/span-payload/span-processor-attributes.cjs.js.map +1 -0
  337. package/dist/domains/traces/components/span-payload/span-processor-attributes.d.ts +2 -0
  338. package/dist/domains/traces/components/span-payload/span-processor-attributes.es.js +81 -0
  339. package/dist/domains/traces/components/span-payload/span-processor-attributes.es.js.map +1 -0
  340. package/dist/domains/traces/components/span-payload.cjs.js +4 -0
  341. package/dist/domains/traces/components/span-payload.cjs.js.map +1 -1
  342. package/dist/domains/traces/components/span-payload.es.js +2 -0
  343. package/dist/domains/traces/components/span-payload.es.js.map +1 -1
  344. package/dist/domains/traces/components/span-summary-description.cjs.js +1 -1
  345. package/dist/domains/traces/components/span-summary-description.es.js +1 -1
  346. package/dist/domains/traces/components/span-timing-hover-card.cjs.js +1 -1
  347. package/dist/domains/traces/components/span-timing-hover-card.es.js +1 -1
  348. package/dist/domains/traces/components/span-token-usage.cjs.js +1 -1
  349. package/dist/domains/traces/components/span-token-usage.es.js +1 -1
  350. package/dist/domains/traces/components/thread-trace/thread-trace-details.cjs.js +1 -1
  351. package/dist/domains/traces/components/thread-trace/thread-trace-details.es.js +1 -1
  352. package/dist/domains/traces/components/thread-trace/thread-trace-messages.cjs.js +4 -4
  353. package/dist/domains/traces/components/thread-trace/thread-trace-messages.es.js +4 -4
  354. package/dist/domains/traces/components/thread-trace/thread-trace-spans.cjs.js +1 -1
  355. package/dist/domains/traces/components/thread-trace/thread-trace-spans.es.js +1 -1
  356. package/dist/domains/traces/components/trace-columns-menu.cjs.js +4 -4
  357. package/dist/domains/traces/components/trace-columns-menu.cjs.js.map +1 -1
  358. package/dist/domains/traces/components/trace-columns-menu.es.js +4 -4
  359. package/dist/domains/traces/components/trace-columns-menu.es.js.map +1 -1
  360. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +12 -16
  361. package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
  362. package/dist/domains/traces/components/trace-data-panel-view.es.js +12 -16
  363. package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
  364. package/dist/domains/traces/components/trace-id-button.cjs.js +1 -1
  365. package/dist/domains/traces/components/trace-id-button.es.js +1 -1
  366. package/dist/domains/traces/components/trace-summary-description.cjs.js +8 -1
  367. package/dist/domains/traces/components/trace-summary-description.cjs.js.map +1 -1
  368. package/dist/domains/traces/components/trace-summary-description.es.js +8 -1
  369. package/dist/domains/traces/components/trace-summary-description.es.js.map +1 -1
  370. package/dist/domains/traces/components/trace-time-range-chip.cjs.js +2 -2
  371. package/dist/domains/traces/components/trace-time-range-chip.es.js +2 -2
  372. package/dist/domains/traces/components/traces-error-content.cjs.js +6 -6
  373. package/dist/domains/traces/components/traces-error-content.cjs.js.map +1 -1
  374. package/dist/domains/traces/components/traces-error-content.es.js +4 -4
  375. package/dist/domains/traces/components/traces-error-content.es.js.map +1 -1
  376. package/dist/domains/traces/components/traces-list-mode-toggle.cjs.js +1 -1
  377. package/dist/domains/traces/components/traces-list-mode-toggle.es.js +1 -1
  378. package/dist/domains/traces/components/traces-list-view.cjs.js +2 -2
  379. package/dist/domains/traces/components/traces-list-view.es.js +2 -2
  380. package/dist/domains/traces/components/traces-page-skeleton.cjs.js +0 -2
  381. package/dist/domains/traces/components/traces-page-skeleton.cjs.js.map +1 -1
  382. package/dist/domains/traces/components/traces-page-skeleton.es.js +0 -2
  383. package/dist/domains/traces/components/traces-page-skeleton.es.js.map +1 -1
  384. package/dist/domains/traces/components.cjs.js +4 -2
  385. package/dist/domains/traces/components.cjs.js.map +1 -1
  386. package/dist/domains/traces/components.es.js +2 -1
  387. package/dist/domains/traces/components.es.js.map +1 -1
  388. package/dist/domains/traces.cjs.js +4 -2
  389. package/dist/domains/traces.cjs.js.map +1 -1
  390. package/dist/domains/traces.es.js +2 -1
  391. package/dist/domains/traces.es.js.map +1 -1
  392. package/dist/{drawer-CnCsgToD.js → drawer-DZnqDb9H.js} +4 -4
  393. package/dist/drawer-DZnqDb9H.js.map +1 -0
  394. package/dist/{drawer-B6Ftum77.cjs → drawer-DpldATv1.cjs} +3 -3
  395. package/dist/drawer-DpldATv1.cjs.map +1 -0
  396. package/dist/ee/signals/components/entity-index-compact-grid.cjs.js +1 -1
  397. package/dist/ee/signals/components/entity-index-compact-grid.es.js +1 -1
  398. package/dist/ee/signals/components/entity-index-list.cjs.js +1 -3
  399. package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
  400. package/dist/ee/signals/components/entity-index-list.es.js +1 -3
  401. package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
  402. package/dist/ee/signals/components/signals-empty-state.cjs.js +2 -3
  403. package/dist/ee/signals/components/signals-empty-state.cjs.js.map +1 -1
  404. package/dist/ee/signals/components/signals-empty-state.es.js +2 -3
  405. package/dist/ee/signals/components/signals-empty-state.es.js.map +1 -1
  406. package/dist/ee/signals/components/trace-intelligence-entity-detail.cjs.js +1 -1
  407. package/dist/ee/signals/components/trace-intelligence-entity-detail.es.js +1 -1
  408. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +11 -13
  409. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js.map +1 -1
  410. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +9 -11
  411. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js.map +1 -1
  412. package/dist/ee/signals/examples-pager.cjs.js +1 -3
  413. package/dist/ee/signals/examples-pager.cjs.js.map +1 -1
  414. package/dist/ee/signals/examples-pager.es.js +1 -3
  415. package/dist/ee/signals/examples-pager.es.js.map +1 -1
  416. package/dist/ee/signals/flow-card.cjs.js +1 -1
  417. package/dist/ee/signals/flow-card.es.js +1 -1
  418. package/dist/ee/signals/noise-detail-panel.cjs.js +1 -1
  419. package/dist/ee/signals/noise-detail-panel.es.js +1 -1
  420. package/dist/ee/signals/sankey-signals.cjs.js +1 -1
  421. package/dist/ee/signals/sankey-signals.es.js +1 -1
  422. package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +5 -5
  423. package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +5 -5
  424. package/dist/ee/signals/settings/trace-signal-settings.cjs.js +2 -2
  425. package/dist/ee/signals/settings/trace-signal-settings.es.js +2 -2
  426. package/dist/ee/signals/signals-error-state.cjs.js +2 -2
  427. package/dist/ee/signals/signals-error-state.cjs.js.map +1 -1
  428. package/dist/ee/signals/signals-error-state.es.js +2 -2
  429. package/dist/ee/signals/signals-error-state.es.js.map +1 -1
  430. package/dist/ee/signals/snapshot-timeline.cjs.js +1 -2
  431. package/dist/ee/signals/snapshot-timeline.cjs.js.map +1 -1
  432. package/dist/ee/signals/snapshot-timeline.es.js +1 -2
  433. package/dist/ee/signals/snapshot-timeline.es.js.map +1 -1
  434. package/dist/ee/signals/theme-detail-panel.cjs.js +1 -1
  435. package/dist/ee/signals/theme-detail-panel.es.js +1 -1
  436. package/dist/ee/signals/theme-filter-banner.cjs.js +1 -1
  437. package/dist/ee/signals/theme-filter-banner.es.js +1 -1
  438. package/dist/ee/signals/trace-insight-view.cjs.js +3 -12
  439. package/dist/ee/signals/trace-insight-view.cjs.js.map +1 -1
  440. package/dist/ee/signals/trace-insight-view.es.js +3 -12
  441. package/dist/ee/signals/trace-insight-view.es.js.map +1 -1
  442. package/dist/ee/signals/view-mode-tab.cjs.js +1 -1
  443. package/dist/ee/signals/view-mode-tab.es.js +1 -1
  444. package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +10 -19
  445. package/dist/ee/topics/components/topic-trace-summary-list.cjs.js.map +1 -1
  446. package/dist/ee/topics/components/topic-trace-summary-list.es.js +10 -19
  447. package/dist/ee/topics/components/topic-trace-summary-list.es.js.map +1 -1
  448. package/dist/{filter-bar-chip-BlvuAPve.js → filter-bar-chip-7X4Aw_WH.js} +3 -3
  449. package/dist/{filter-bar-chip-BlvuAPve.js.map → filter-bar-chip-7X4Aw_WH.js.map} +1 -1
  450. package/dist/{filter-bar-chip-B_k_vbip.cjs → filter-bar-chip-BdZHI76J.cjs} +3 -3
  451. package/dist/{filter-bar-chip-B_k_vbip.cjs.map → filter-bar-chip-BdZHI76J.cjs.map} +1 -1
  452. package/dist/hooks/use-fluid-hover.cjs.js +2 -4
  453. package/dist/hooks/use-fluid-hover.cjs.js.map +1 -1
  454. package/dist/hooks/use-fluid-hover.es.js +2 -4
  455. package/dist/hooks/use-fluid-hover.es.js.map +1 -1
  456. package/dist/{input-B1RysHyq.js → input-CHghVv3k.js} +3 -3
  457. package/dist/input-CHghVv3k.js.map +1 -0
  458. package/dist/{input-CDLMprJS.cjs → input-bd223EJW.cjs} +2 -2
  459. package/dist/input-bd223EJW.cjs.map +1 -0
  460. package/dist/{input-group-DaIV9Orp.cjs → input-group-BfnJ0RIj.cjs} +3 -3
  461. package/dist/input-group-BfnJ0RIj.cjs.map +1 -0
  462. package/dist/{input-group-B-pskRGt.js → input-group-Jt7lZsN9.js} +4 -4
  463. package/dist/input-group-Jt7lZsN9.js.map +1 -0
  464. package/dist/layout/tabbed-container.cjs.js +6 -6
  465. package/dist/layout/tabbed-container.es.js +6 -6
  466. package/dist/{list-search-DK2yMiME.js → list-search-FJ1O5F3S.js} +2 -2
  467. package/dist/{list-search-DK2yMiME.js.map → list-search-FJ1O5F3S.js.map} +1 -1
  468. package/dist/{list-search-DhReauU5.cjs → list-search-S1mco9Bl.cjs} +2 -2
  469. package/dist/{list-search-DhReauU5.cjs.map → list-search-S1mco9Bl.cjs.map} +1 -1
  470. package/dist/{logs-data-list-DgoCLb6k.cjs → logs-data-list-BGJTRyO_.cjs} +2 -2
  471. package/dist/{logs-data-list-DgoCLb6k.cjs.map → logs-data-list-BGJTRyO_.cjs.map} +1 -1
  472. package/dist/{logs-data-list-B24gfDle.js → logs-data-list-XU1hCwI5.js} +2 -2
  473. package/dist/{logs-data-list-B24gfDle.js.map → logs-data-list-XU1hCwI5.js.map} +1 -1
  474. package/dist/{main-sidebar-Cf5G9iaC.js → main-sidebar-link-active-C9QPj3D6.js} +7 -119
  475. package/dist/main-sidebar-link-active-C9QPj3D6.js.map +1 -0
  476. package/dist/{main-sidebar-DYfRxFn4.cjs → main-sidebar-link-active-UEuukSeT.cjs} +5 -118
  477. package/dist/main-sidebar-link-active-UEuukSeT.cjs.map +1 -0
  478. package/dist/{markdown-renderer-BUqHHH4y.js → markdown-renderer-BBYgxsXL.js} +3 -3
  479. package/dist/{markdown-renderer-BUqHHH4y.js.map → markdown-renderer-BBYgxsXL.js.map} +1 -1
  480. package/dist/{markdown-renderer-CZLwgva-.cjs → markdown-renderer-Du_Zd1T-.cjs} +3 -3
  481. package/dist/{markdown-renderer-CZLwgva-.cjs.map → markdown-renderer-Du_Zd1T-.cjs.map} +1 -1
  482. package/dist/{metrics-card-CN4VRQQJ.js → metrics-card-Bzm6m1dy.js} +3 -3
  483. package/dist/{metrics-card-CN4VRQQJ.js.map → metrics-card-Bzm6m1dy.js.map} +1 -1
  484. package/dist/{metrics-card-DStXI6yn.cjs → metrics-card-DCCHIG-z.cjs} +3 -3
  485. package/dist/{metrics-card-DStXI6yn.cjs.map → metrics-card-DCCHIG-z.cjs.map} +1 -1
  486. package/dist/{metrics-kpi-card-CvOXyEGn.cjs → metrics-kpi-card-Bhb4R4z0.cjs} +2 -2
  487. package/dist/{metrics-kpi-card-CvOXyEGn.cjs.map → metrics-kpi-card-Bhb4R4z0.cjs.map} +1 -1
  488. package/dist/{metrics-kpi-card-C-XLN_Us.js → metrics-kpi-card-BrnFhFQm.js} +2 -2
  489. package/dist/{metrics-kpi-card-C-XLN_Us.js.map → metrics-kpi-card-BrnFhFQm.js.map} +1 -1
  490. package/dist/new/layout/app-shell.cjs.js +13 -0
  491. package/dist/new/layout/app-shell.cjs.js.map +1 -1
  492. package/dist/new/layout/app-shell.es.js +13 -1
  493. package/dist/new/layout/app-shell.es.js.map +1 -1
  494. package/dist/new/layout/page-header.cjs.js +1 -1
  495. package/dist/new/layout/page-header.es.js +1 -1
  496. package/dist/new/settings.cjs.js +42 -2
  497. package/dist/new/settings.cjs.js.map +1 -1
  498. package/dist/new/settings.es.js +43 -3
  499. package/dist/new/settings.es.js.map +1 -1
  500. package/dist/new/sidebar.cjs.js +33 -33
  501. package/dist/new/sidebar.cjs.js.map +1 -1
  502. package/dist/new/sidebar.es.js +3 -3
  503. package/dist/new/sidebar.es.js.map +1 -1
  504. package/dist/{page-header-CSigVThQ.js → page-header-CyXAezlZ.js} +25 -26
  505. package/dist/page-header-CyXAezlZ.js.map +1 -0
  506. package/dist/{page-header-DzEEkOca.cjs → page-header-Dk3s3XtC.cjs} +25 -26
  507. package/dist/page-header-Dk3s3XtC.cjs.map +1 -0
  508. package/dist/primitives/control-size.cjs.js +1 -2
  509. package/dist/primitives/control-size.cjs.js.map +1 -1
  510. package/dist/primitives/control-size.es.js +1 -2
  511. package/dist/primitives/control-size.es.js.map +1 -1
  512. package/dist/primitives/form-element.cjs.js +10 -5
  513. package/dist/primitives/form-element.cjs.js.map +1 -1
  514. package/dist/primitives/form-element.es.js +8 -5
  515. package/dist/primitives/form-element.es.js.map +1 -1
  516. package/dist/primitives/menu-item.cjs.js +1 -1
  517. package/dist/primitives/menu-item.cjs.js.map +1 -1
  518. package/dist/primitives/menu-item.es.js +1 -1
  519. package/dist/primitives/menu-item.es.js.map +1 -1
  520. package/dist/primitives/raised-surface.cjs.js +8 -3
  521. package/dist/primitives/raised-surface.cjs.js.map +1 -1
  522. package/dist/primitives/raised-surface.es.js +8 -4
  523. package/dist/primitives/raised-surface.es.js.map +1 -1
  524. package/dist/primitives/trigger-button.cjs.js +1 -1
  525. package/dist/primitives/trigger-button.es.js +1 -1
  526. package/dist/{property-filter-applied-uYr-sCdm.js → property-filter-applied-CYDiZtR7.js} +3 -3
  527. package/dist/{property-filter-applied-uYr-sCdm.js.map → property-filter-applied-CYDiZtR7.js.map} +1 -1
  528. package/dist/{property-filter-applied-DxSZN3Om.cjs → property-filter-applied-F6cN2lrX.cjs} +3 -3
  529. package/dist/{property-filter-applied-DxSZN3Om.cjs.map → property-filter-applied-F6cN2lrX.cjs.map} +1 -1
  530. package/dist/resize/panel-drawer.cjs.js +1 -1
  531. package/dist/resize/panel-drawer.es.js +1 -1
  532. package/dist/{search-field-block-Bg9GPPaA.cjs → search-field-block-7-ufp4uG.cjs} +3 -3
  533. package/dist/{search-field-block-Bg9GPPaA.cjs.map → search-field-block-7-ufp4uG.cjs.map} +1 -1
  534. package/dist/{search-field-block-B0twxGWI.js → search-field-block-fU3tStmB.js} +3 -3
  535. package/dist/{search-field-block-B0twxGWI.js.map → search-field-block-fU3tStmB.js.map} +1 -1
  536. package/dist/{select-65j5NjtJ.cjs → select-BByMAS0L.cjs} +4 -2
  537. package/dist/select-BByMAS0L.cjs.map +1 -0
  538. package/dist/{select-BiY-SoMJ.js → select-Dkmx3L5p.js} +4 -2
  539. package/dist/select-Dkmx3L5p.js.map +1 -0
  540. package/dist/{select-field-block-D_b9N7od.js → select-field-block-BfiHq9t6.js} +2 -2
  541. package/dist/{select-field-block-D_b9N7od.js.map → select-field-block-BfiHq9t6.js.map} +1 -1
  542. package/dist/{select-field-block-CZbN1w__.cjs → select-field-block-DJo2cX9Y.cjs} +2 -2
  543. package/dist/{select-field-block-CZbN1w__.cjs.map → select-field-block-DJo2cX9Y.cjs.map} +1 -1
  544. package/dist/{span-payload-primitives-DlIOpCII.js → span-payload-primitives-CzLh6axt.js} +3 -3
  545. package/dist/{span-payload-primitives-DlIOpCII.js.map → span-payload-primitives-CzLh6axt.js.map} +1 -1
  546. package/dist/{span-payload-primitives-BjBTICfq.cjs → span-payload-primitives-KEXwIaeZ.cjs} +3 -3
  547. package/dist/{span-payload-primitives-BjBTICfq.cjs.map → span-payload-primitives-KEXwIaeZ.cjs.map} +1 -1
  548. package/dist/src/domains/auth/components/permission-denied.d.ts +6 -0
  549. package/dist/src/{ds/components/PermissionDenied → domains/auth/components}/permission-denied.stories.d.ts +1 -3
  550. package/dist/src/domains/auth/components/session-expired.d.ts +5 -0
  551. package/dist/src/{ds/components/SessionExpired → domains/auth/components}/session-expired.stories.d.ts +1 -2
  552. package/dist/src/domains/auth/services/sso-login.d.ts +7 -0
  553. package/dist/src/domains/logs/components/logs-error-content.d.ts +2 -2
  554. package/dist/src/domains/traces/components/index.d.ts +0 -1
  555. package/dist/src/domains/traces/components/span-payload/index.d.ts +2 -0
  556. package/dist/src/domains/traces/components/span-payload/span-payload-processor.d.ts +10 -0
  557. package/dist/src/domains/traces/components/span-payload/span-payload-registry.d.ts +1 -0
  558. package/dist/src/domains/traces/components/span-payload/span-payload.stories.d.ts +2 -0
  559. package/dist/src/domains/traces/components/span-payload/span-processor-attributes.d.ts +10 -0
  560. package/dist/src/domains/traces/components/trace-data-panel-view.stories.d.ts +94 -0
  561. package/dist/src/domains/traces/components/trace-summary-description.d.ts +1 -0
  562. package/dist/src/domains/traces/components/traces-error-content.d.ts +2 -2
  563. package/dist/src/ds/components/Button/Button.d.ts +1 -1
  564. package/dist/src/ds/components/ButtonsGroup/buttons-group.stories.d.ts +2 -2
  565. package/dist/src/ds/components/Columns/column-root.d.ts +1 -3
  566. package/dist/src/ds/components/Columns/columns.stories.d.ts +0 -1
  567. package/dist/src/ds/components/Columns/index.d.ts +0 -1
  568. package/dist/src/ds/components/Combobox/combobox-styles.d.ts +1 -2
  569. package/dist/src/ds/components/Combobox/combobox.d.ts +3 -0
  570. package/dist/src/ds/components/Combobox/combobox.stories.d.ts +1 -0
  571. package/dist/src/ds/components/DataKeysAndValues/data-keys-and-values-root.d.ts +1 -2
  572. package/dist/src/ds/components/DataKeysAndValues/data-keys-and-values.stories.d.ts +1 -2
  573. package/dist/src/ds/components/EmptyState/EmptyState.d.ts +6 -2
  574. package/dist/src/ds/components/EmptyState/empty-state.stories.d.ts +1 -0
  575. package/dist/src/ds/components/PageLayout/page-layout.d.ts +8 -3
  576. package/dist/src/ds/components/PageLayout/page-layout.stories.d.ts +3 -0
  577. package/dist/src/ds/components/Select/select.d.ts +3 -4
  578. package/dist/src/ds/components/Select/select.stories.d.ts +2 -2
  579. package/dist/src/ds/new/layout/app-shell/index.d.ts +1 -0
  580. package/dist/src/ds/new/layout/app-shell/main-card.d.ts +5 -0
  581. package/dist/src/ds/new/settings/index.d.ts +1 -1
  582. package/dist/src/ds/new/settings/settings.stories.d.ts +2 -0
  583. package/dist/src/ds/primitives/control-size.d.ts +1 -1
  584. package/dist/src/ds/primitives/fields-on-surfaces.stories.d.ts +6 -0
  585. package/dist/src/ds/primitives/form-element.d.ts +3 -1
  586. package/dist/src/ds/primitives/raised-surface.d.ts +4 -31
  587. package/dist/src/ds/tokens/colors.d.ts +3 -0
  588. package/dist/src/ds/tokens/shadows.d.ts +1 -0
  589. package/dist/src/{ds/components/IntegrationDialog/integration-dialog.stories.d.ts → hooks/stories/browser/use-autoscroll.stories.d.ts} +6 -8
  590. package/dist/src/hooks/stories/browser/use-copy-to-clipboard.stories.d.ts +22 -0
  591. package/dist/src/hooks/stories/browser/use-fluid-hover.stories.d.ts +17 -0
  592. package/dist/src/hooks/stories/browser/use-in-view.stories.d.ts +17 -0
  593. package/dist/src/hooks/stories/browser/use-is-apple-platform.stories.d.ts +17 -0
  594. package/dist/src/hooks/stories/browser/use-is-mobile.stories.d.ts +32 -0
  595. package/dist/src/hooks/stories/browser/use-isomorphic-layout-effect.stories.d.ts +32 -0
  596. package/dist/src/hooks/stories/browser/use-keyboard-shortcut-label.stories.d.ts +22 -0
  597. package/dist/src/hooks/stories/browser/use-register-fluid-hover-item.stories.d.ts +17 -0
  598. package/dist/src/hooks/stories/environment/use-custom-environment-variables-editor.stories.d.ts +17 -0
  599. package/dist/src/hooks/stories/environment/use-environment-variables-editor.stories.d.ts +17 -0
  600. package/dist/src/hooks/stories/state/use-debounced-value.stories.d.ts +32 -0
  601. package/dist/src/hooks/stories/state/use-expiring-local-storage-state.stories.d.ts +17 -0
  602. package/dist/src/hooks/stories/state/use-local-storage-state.stories.d.ts +17 -0
  603. package/dist/src/hooks/stories/text/use-is-clamped.stories.d.ts +17 -0
  604. package/dist/src/hooks/stories/text/use-measured-auto-height.stories.d.ts +17 -0
  605. package/dist/src/hooks/stories/text/use-scroll-to-first-highlight.stories.d.ts +17 -0
  606. package/dist/src/hooks/stories/text/use-text-highlight.stories.d.ts +17 -0
  607. package/dist/src/lib/keyboard/use-keyboard-scope-depth.stories.d.ts +17 -0
  608. package/dist/src/lib/keyboard/use-keyboard-shortcuts-context.stories.d.ts +17 -0
  609. package/dist/src/lib/keyboard/use-table-keydown.stories.d.ts +15 -0
  610. package/dist/style.css +147 -107
  611. package/dist/{tabs-content-DMrffE9p.js → tabs-content-7ODUUdQ0.js} +2 -2
  612. package/dist/{tabs-content-DMrffE9p.js.map → tabs-content-7ODUUdQ0.js.map} +1 -1
  613. package/dist/{tabs-content-CuUlcS67.cjs → tabs-content-DlCJoQUW.cjs} +2 -2
  614. package/dist/{tabs-content-CuUlcS67.cjs.map → tabs-content-DlCJoQUW.cjs.map} +1 -1
  615. package/dist/{tabs-root-DrK1hxeV.cjs → tabs-root-COCL6jcx.cjs} +2 -2
  616. package/dist/{tabs-root-DrK1hxeV.cjs.map → tabs-root-COCL6jcx.cjs.map} +1 -1
  617. package/dist/{tabs-root-B2sdkQ3A.js → tabs-root-UNPxoGhW.js} +2 -2
  618. package/dist/{tabs-root-B2sdkQ3A.js.map → tabs-root-UNPxoGhW.js.map} +1 -1
  619. package/dist/{tabs-tab-ClmulJmM.cjs → tabs-tab-DFmRMdi3.cjs} +2 -2
  620. package/dist/{tabs-tab-ClmulJmM.cjs.map → tabs-tab-DFmRMdi3.cjs.map} +1 -1
  621. package/dist/{tabs-tab-u6LS5twu.js → tabs-tab-DluwCnDF.js} +2 -2
  622. package/dist/{tabs-tab-u6LS5twu.js.map → tabs-tab-DluwCnDF.js.map} +1 -1
  623. package/dist/{text-field-block-Cihf0IRw.js → text-field-block-DGIM1i3Z.js} +2 -2
  624. package/dist/{text-field-block-Cihf0IRw.js.map → text-field-block-DGIM1i3Z.js.map} +1 -1
  625. package/dist/{text-field-block-BmWGMw3a.cjs → text-field-block-DePCgDOh.cjs} +2 -2
  626. package/dist/{text-field-block-BmWGMw3a.cjs.map → text-field-block-DePCgDOh.cjs.map} +1 -1
  627. package/dist/{textarea-DdnzLrI9.js → textarea-B6wvS_CQ.js} +3 -3
  628. package/dist/textarea-B6wvS_CQ.js.map +1 -0
  629. package/dist/{textarea-5b6XcMrq.cjs → textarea-gUBUqpol.cjs} +2 -2
  630. package/dist/textarea-gUBUqpol.cjs.map +1 -0
  631. package/dist/{time-picker-PXFCgAuR.cjs → time-picker-BNhe7Zpb.cjs} +2 -2
  632. package/dist/{time-picker-PXFCgAuR.cjs.map → time-picker-BNhe7Zpb.cjs.map} +1 -1
  633. package/dist/{time-picker-DMroqHbw.js → time-picker-kvCsW78V.js} +2 -2
  634. package/dist/{time-picker-DMroqHbw.js.map → time-picker-kvCsW78V.js.map} +1 -1
  635. package/dist/tokens.cjs.js +4 -0
  636. package/dist/tokens.cjs.js.map +1 -1
  637. package/dist/tokens.es.js +4 -0
  638. package/dist/tokens.es.js.map +1 -1
  639. package/dist/{tool-approval-DzOGIKRh.js → tool-approval-DXUFyrSl.js} +2 -2
  640. package/dist/{tool-approval-DzOGIKRh.js.map → tool-approval-DXUFyrSl.js.map} +1 -1
  641. package/dist/{tool-approval-DYX_ZNWc.cjs → tool-approval-LIy1nZZJ.cjs} +2 -2
  642. package/dist/{tool-approval-DYX_ZNWc.cjs.map → tool-approval-LIy1nZZJ.cjs.map} +1 -1
  643. package/dist/{tool-call-HNNRcirD.js → tool-call-Bs-9Cah5.js} +2 -2
  644. package/dist/{tool-call-HNNRcirD.js.map → tool-call-Bs-9Cah5.js.map} +1 -1
  645. package/dist/{tool-call-vZeZ5XT5.cjs → tool-call-C0JeHe8Z.cjs} +2 -2
  646. package/dist/{tool-call-vZeZ5XT5.cjs.map → tool-call-C0JeHe8Z.cjs.map} +1 -1
  647. package/dist/{traces-data-list-DHrC158-.js → traces-data-list-Cjy5a-1f.js} +3 -3
  648. package/dist/{traces-data-list-DHrC158-.js.map → traces-data-list-Cjy5a-1f.js.map} +1 -1
  649. package/dist/{traces-data-list-DNOtQze4.cjs → traces-data-list-DLeKSbaZ.cjs} +3 -3
  650. package/dist/{traces-data-list-DNOtQze4.cjs.map → traces-data-list-DLeKSbaZ.cjs.map} +1 -1
  651. package/package.json +13 -13
  652. package/theme/surfaces.css +8 -0
  653. package/theme.css +7 -0
  654. package/dist/Button-KUj0U-5I.js.map +0 -1
  655. package/dist/Button-MMZPEb_q.cjs.map +0 -1
  656. package/dist/Card-B_buJ5yF.js.map +0 -1
  657. package/dist/Card-DwGasv0K.cjs.map +0 -1
  658. package/dist/EmptyState-B6cyZw6m.js.map +0 -1
  659. package/dist/EmptyState-DiSP6UIy.cjs.map +0 -1
  660. package/dist/ErrorState-B0839u-q.cjs +0 -21
  661. package/dist/ErrorState-B0839u-q.cjs.map +0 -1
  662. package/dist/ErrorState-HyRJdaA2.js +0 -19
  663. package/dist/ErrorState-HyRJdaA2.js.map +0 -1
  664. package/dist/PermissionDenied-CTqnE57B.js +0 -27
  665. package/dist/PermissionDenied-CTqnE57B.js.map +0 -1
  666. package/dist/PermissionDenied-fdVmTjjf.cjs +0 -29
  667. package/dist/PermissionDenied-fdVmTjjf.cjs.map +0 -1
  668. package/dist/SessionExpired-B9e1Kx4I.js +0 -44
  669. package/dist/SessionExpired-B9e1Kx4I.js.map +0 -1
  670. package/dist/SessionExpired-GSQkcV9f.cjs +0 -46
  671. package/dist/SessionExpired-GSQkcV9f.cjs.map +0 -1
  672. package/dist/code-editor-BQTDma1I.js.map +0 -1
  673. package/dist/code-editor-BfoJXq9l.cjs.map +0 -1
  674. package/dist/combobox-Bn_uyUSB.cjs.map +0 -1
  675. package/dist/combobox-Cykfy5wc.js.map +0 -1
  676. package/dist/combobox-styles-CSsS2LEx.cjs.map +0 -1
  677. package/dist/combobox-styles-iuJUkJEQ.js.map +0 -1
  678. package/dist/components/DataFilter.cjs.js +0 -173
  679. package/dist/components/DataFilter.cjs.js.map +0 -1
  680. package/dist/components/DataFilter.d.ts +0 -2
  681. package/dist/components/DataFilter.es.js +0 -169
  682. package/dist/components/DataFilter.es.js.map +0 -1
  683. package/dist/components/ErrorState.cjs.js +0 -10
  684. package/dist/components/ErrorState.cjs.js.map +0 -1
  685. package/dist/components/ErrorState.d.ts +0 -2
  686. package/dist/components/ErrorState.es.js +0 -2
  687. package/dist/components/ErrorState.es.js.map +0 -1
  688. package/dist/components/IntegrationDialog.cjs.js +0 -104
  689. package/dist/components/IntegrationDialog.cjs.js.map +0 -1
  690. package/dist/components/IntegrationDialog.d.ts +0 -2
  691. package/dist/components/IntegrationDialog.es.js +0 -100
  692. package/dist/components/IntegrationDialog.es.js.map +0 -1
  693. package/dist/components/PermissionDenied.cjs.js +0 -10
  694. package/dist/components/PermissionDenied.cjs.js.map +0 -1
  695. package/dist/components/PermissionDenied.d.ts +0 -2
  696. package/dist/components/PermissionDenied.es.js +0 -2
  697. package/dist/components/PermissionDenied.es.js.map +0 -1
  698. package/dist/components/Sections.cjs.js +0 -13
  699. package/dist/components/Sections.cjs.js.map +0 -1
  700. package/dist/components/Sections.d.ts +0 -2
  701. package/dist/components/Sections.es.js +0 -9
  702. package/dist/components/Sections.es.js.map +0 -1
  703. package/dist/components/SessionExpired.cjs.js +0 -10
  704. package/dist/components/SessionExpired.cjs.js.map +0 -1
  705. package/dist/components/SessionExpired.d.ts +0 -2
  706. package/dist/components/SessionExpired.es.js +0 -2
  707. package/dist/components/SessionExpired.es.js.map +0 -1
  708. package/dist/components/SettingsLayout.cjs.js +0 -10
  709. package/dist/components/SettingsLayout.cjs.js.map +0 -1
  710. package/dist/components/SettingsLayout.d.ts +0 -2
  711. package/dist/components/SettingsLayout.es.js +0 -2
  712. package/dist/components/SettingsLayout.es.js.map +0 -1
  713. package/dist/data-keys-and-values-BduKvvC5.cjs.map +0 -1
  714. package/dist/data-keys-and-values-DhC4U4Yl.js.map +0 -1
  715. package/dist/data-list-Cn0Ls4l2.js.map +0 -1
  716. package/dist/data-list-DSbuTWLI.cjs.map +0 -1
  717. package/dist/dialog-Bilo4jEU.cjs.map +0 -1
  718. package/dist/dialog-DMOXPT0N.js.map +0 -1
  719. package/dist/domains/traces/components/trace-keys-and-values.cjs.js +0 -70
  720. package/dist/domains/traces/components/trace-keys-and-values.cjs.js.map +0 -1
  721. package/dist/domains/traces/components/trace-keys-and-values.d.ts +0 -2
  722. package/dist/domains/traces/components/trace-keys-and-values.es.js +0 -66
  723. package/dist/domains/traces/components/trace-keys-and-values.es.js.map +0 -1
  724. package/dist/drawer-B6Ftum77.cjs.map +0 -1
  725. package/dist/drawer-CnCsgToD.js.map +0 -1
  726. package/dist/input-B1RysHyq.js.map +0 -1
  727. package/dist/input-CDLMprJS.cjs.map +0 -1
  728. package/dist/input-group-B-pskRGt.js.map +0 -1
  729. package/dist/input-group-DaIV9Orp.cjs.map +0 -1
  730. package/dist/main-sidebar-Cf5G9iaC.js.map +0 -1
  731. package/dist/main-sidebar-DYfRxFn4.cjs.map +0 -1
  732. package/dist/page-header-CSigVThQ.js.map +0 -1
  733. package/dist/page-header-DzEEkOca.cjs.map +0 -1
  734. package/dist/select-65j5NjtJ.cjs.map +0 -1
  735. package/dist/select-BiY-SoMJ.js.map +0 -1
  736. package/dist/settings-layout-BGvMSClL.cjs +0 -49
  737. package/dist/settings-layout-BGvMSClL.cjs.map +0 -1
  738. package/dist/settings-layout-DA-JWqW3.js +0 -47
  739. package/dist/settings-layout-DA-JWqW3.js.map +0 -1
  740. package/dist/src/domains/traces/components/trace-keys-and-values.d.ts +0 -24
  741. package/dist/src/domains/traces/components/trace-keys-and-values.stories.d.ts +0 -28
  742. package/dist/src/ds/components/Columns/multi-column.d.ts +0 -7
  743. package/dist/src/ds/components/DataFilter/index.d.ts +0 -2
  744. package/dist/src/ds/components/DataFilter/select-data-filter.d.ts +0 -40
  745. package/dist/src/ds/components/DataFilter/select-data-filter.stories.d.ts +0 -8
  746. package/dist/src/ds/components/ErrorState/ErrorState.d.ts +0 -8
  747. package/dist/src/ds/components/ErrorState/error-state.stories.d.ts +0 -8
  748. package/dist/src/ds/components/ErrorState/index.d.ts +0 -2
  749. package/dist/src/ds/components/IntegrationDialog/__fixtures__/integrations-catalog.d.ts +0 -2
  750. package/dist/src/ds/components/IntegrationDialog/index.d.ts +0 -2
  751. package/dist/src/ds/components/IntegrationDialog/integration-dialog.d.ts +0 -28
  752. package/dist/src/ds/components/PermissionDenied/PermissionDenied.d.ts +0 -16
  753. package/dist/src/ds/components/PermissionDenied/index.d.ts +0 -2
  754. package/dist/src/ds/components/Sections/index.d.ts +0 -1
  755. package/dist/src/ds/components/Sections/sections.d.ts +0 -5
  756. package/dist/src/ds/components/Sections/sections.stories.d.ts +0 -8
  757. package/dist/src/ds/components/SessionExpired/SessionExpired.d.ts +0 -11
  758. package/dist/src/ds/components/SessionExpired/index.d.ts +0 -2
  759. package/dist/src/ds/components/SettingsLayout/index.d.ts +0 -1
  760. package/dist/src/ds/components/SettingsLayout/settings-layout.stories.d.ts +0 -52
  761. package/dist/textarea-5b6XcMrq.cjs.map +0 -1
  762. package/dist/textarea-DdnzLrI9.js.map +0 -1
  763. /package/dist/src/ds/{components/SettingsLayout → new/settings}/settings-layout.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"use-fluid-hover.cjs.js","sources":["../../src/hooks/use-fluid-hover.ts"],"sourcesContent":["'use client';\n\nimport { useRef, useState, useCallback, useEffect, type Dispatch, type RefObject, type SetStateAction } from 'react';\n\nexport interface ItemRect {\n top: number;\n height: number;\n left: number;\n width: number;\n}\n\nexport interface UseFluidHoverOptions {\n /**\n * Which direction to resolve the nearest item along.\n * \"y\" — vertical lists (default): closest by top/height\n * \"x\" — horizontal strips: closest by left/width\n * \"xy\" — 2-D grids: closest card across both rows AND columns,\n * measured by Euclidean distance to each item's center\n */\n axis?: 'x' | 'y' | 'xy';\n /**\n * Makes an item invisible to hit-testing without unregistering it — for\n * rows that stay mounted while clipped away (a collapsed sub-tree).\n * Unregistering would invalidate every measurement; a skipped item keeps\n * the set stable. Consulted per mouse move, so keep it cheap.\n */\n isItemDisabled?: (element: HTMLElement) => boolean;\n /**\n * Whether a click that lands between items (a gap, the padding, past the\n * last row) is routed to the highlighted item, so what is lit is what a\n * click hits. On by default: in a menu or a list the highlight is a\n * promise about the click. Pass `false` where empty space should stay\n * inert (rows with destructive actions, generous whitespace), or\n * `{ maxDistance }` to route only clicks within that many pixels of the\n * highlighted item's edge.\n */\n gapClick?: boolean | { maxDistance?: number };\n}\n\nexport interface UseFluidHoverReturn {\n activeIndex: number | null;\n setActiveIndex: Dispatch<SetStateAction<number | null>>;\n itemRects: ItemRect[];\n /**\n * True once every registered item has been measured and no remeasure is\n * pending, i.e. `itemRects` describes the current item set. Gate absolutely\n * positioned overlays on it: an overlay that mounts against a rect a later\n * pass still corrects animates from the wrong place to the right one, which\n * reads as the highlight sliding in from another row.\n */\n isMeasured: boolean;\n sessionRef: RefObject<number>;\n /**\n * Events whose target sits outside the container in the DOM are ignored:\n * React bubbles events from a portaled child (a submenu) through its React\n * parents, and those must not steer or click this list.\n */\n handlers: {\n onMouseMove: (e: React.MouseEvent) => void;\n onMouseEnter: (e: React.MouseEvent) => void;\n onMouseLeave: (e: React.MouseEvent) => void;\n /**\n * Routes a click that lands between items (a gap, the padding, past the\n * last row) to the highlighted item, so the highlight and the click agree:\n * what is lit is what a click hits. A click inside an item is left to the\n * item. Disabled items (`isItemDisabled`) are never activated.\n */\n onClick: (e: React.MouseEvent) => void;\n };\n registerItem: (index: number, element: HTMLElement | null) => void;\n /**\n * Invalidates the published rects and runs the hook's coalesced measurement\n * pass again, holding `isMeasured` false until it settles. Reach for it when\n * the rects may be wrong and showing an overlay against them would misplace\n * it: a popup that stays mounted between opens keeps its items registered,\n * so nothing else would notice that its rects were taken while it was\n * hidden. Registration, item resize, and container resize already trigger\n * a pass; do not call this on `children` changes.\n */\n remeasure: () => void;\n /**\n * Re-reads the rects synchronously, keeping `isMeasured` as it is. Only for\n * layout that moves the rows under a visible overlay frame by frame (the\n * accordion re-measures inside its height animation). Everything else\n * wants `remeasure`, or nothing.\n */\n measureItems: () => void;\n}\n\nexport interface PickNearestInput {\n axis: 'x' | 'y' | 'xy';\n /** The pointer, in viewport coordinates. */\n point: { x: number; y: number };\n /** Item rects in the container's layout space (sparse: unregistered slots\n * are undefined). */\n rects: readonly (ItemRect | undefined)[];\n /** The container's bounding rect and live scroll / border offsets, which\n * map layout rects into the pointer's viewport space. */\n containerRect: { left: number; top: number; width: number; height: number };\n scroll: { x: number; y: number };\n border: { x: number; y: number };\n /** Layout size of the container, so a cumulative ancestor `transform:\n * scale` (a popup mid scale-in) can be factored out per axis. */\n layoutSize: { width: number; height: number };\n /** Skips an item without unregistering it. */\n isDisabled?: (index: number) => boolean;\n}\n\n/**\n * The rule, as one pure function: an item the pointer is inside wins;\n * otherwise the item whose center is nearest does, so a pointer in a gap, in\n * the padding, or past the last row still lands. `y` and `x` measure one\n * coordinate; `xy` measures the straight line to each center. Ties keep the\n * first item. The hook calls this once per animation frame; the docs page\n * times it.\n */\nexport function pickNearest({\n axis,\n point,\n rects,\n containerRect,\n scroll,\n border,\n layoutSize,\n isDisabled,\n}: PickNearestInput): number | null {\n const scaleX = layoutSize.width > 0 ? containerRect.width / layoutSize.width : 1;\n const scaleY = layoutSize.height > 0 ? containerRect.height / layoutSize.height : 1;\n let closestIndex: number | null = null;\n let closestDistance = Infinity;\n let containingIndex: number | null = null;\n\n for (let index = 0; index < rects.length; index++) {\n const r = rects[index];\n if (!r) continue;\n if (isDisabled?.(index)) continue;\n\n if (axis === 'xy') {\n const left = containerRect.left + (border.x + r.left - scroll.x) * scaleX;\n const top = containerRect.top + (border.y + r.top - scroll.y) * scaleY;\n const width = r.width * scaleX;\n const height = r.height * scaleY;\n if (point.x >= left && point.x <= left + width && point.y >= top && point.y <= top + height) {\n containingIndex = index;\n }\n const distance = Math.hypot(point.x - (left + width / 2), point.y - (top + height / 2));\n if (distance < closestDistance) {\n closestDistance = distance;\n closestIndex = index;\n }\n continue;\n }\n\n const horizontal = axis === 'x';\n const mousePos = horizontal ? point.x : point.y;\n const scale = horizontal ? scaleX : scaleY;\n const itemStart =\n (horizontal ? containerRect.left : containerRect.top) +\n ((horizontal ? border.x : border.y) + (horizontal ? r.left : r.top) - (horizontal ? scroll.x : scroll.y)) * scale;\n const itemSize = (horizontal ? r.width : r.height) * scale;\n if (mousePos >= itemStart && mousePos <= itemStart + itemSize) {\n containingIndex = index;\n }\n const distance = Math.abs(mousePos - (itemStart + itemSize / 2));\n if (distance < closestDistance) {\n closestDistance = distance;\n closestIndex = index;\n }\n }\n\n return containingIndex ?? closestIndex;\n}\n\n/** Set on the highlighted item (boolean attribute). */\nexport const ACTIVE_ATTR = 'data-fluid-hover-active';\n/** Set on the container: the highlighted index, or absent. */\nexport const ACTIVE_INDEX_ATTR = 'data-fluid-hover-active-index';\n\n/** False for an event bubbled through React from a portal outside the container, and for a detached target. */\nfunction isFromInside(e: React.SyntheticEvent) {\n return e.target instanceof Node && e.currentTarget.contains(e.target);\n}\n\nconst ACTIVATOR_SELECTOR =\n \"a[href], button, [role='menuitem'], [role='menuitemradio'], [role='menuitemcheckbox'], [role='option'], [role='radio'], [role='checkbox'], [role='tab'], [role='link'], [role='button']\";\n\n/**\n * The element a routed click should land on. A registered item is usually\n * the interactive row itself; when it is only a box around one (a sidebar\n * row around its button, a card around its link), the first control inside\n * is what a real click on the row would have reached.\n */\nfunction resolveActivator(element: HTMLElement): HTMLElement {\n if (element.matches(ACTIVATOR_SELECTOR) || element.hasAttribute('tabindex')) {\n return element;\n }\n return element.querySelector<HTMLElement>(ACTIVATOR_SELECTOR) ?? element;\n}\n\n/**\n * How many frames the coalesced remeasure retries while the registered items\n * still have no layout box. A popup can be in the DOM one frame before it is\n * laid out; retrying beats publishing zeroed rects, and the cap keeps a list\n * that stays hidden for good from spinning frames forever.\n */\nconst measurementAttempts = 3;\n\nexport function useFluidHover<T extends HTMLElement>(\n containerRef: RefObject<T | null>,\n options: UseFluidHoverOptions = {},\n): UseFluidHoverReturn {\n const { axis = 'y', isItemDisabled, gapClick = true } = options;\n const gapClickMaxDistance = typeof gapClick === 'object' ? (gapClick.maxDistance ?? Infinity) : Infinity;\n const itemsRef = useRef(new Map<number, HTMLElement>());\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n // Mirrored for handlers that read it outside a render (the gap click).\n const activeIndexRef = useRef<number | null>(null);\n activeIndexRef.current = activeIndex;\n\n // The state, in the DOM: `data-fluid-hover-active` on the highlighted item\n // and `data-fluid-hover-active-index` on the container. Devtools shows it\n // and a test asserts on it without waiting for a frame. React does not\n // manage these attributes, so it never clobbers them.\n useEffect(() => {\n const container = containerRef.current;\n if (activeIndex === null) container?.removeAttribute(ACTIVE_INDEX_ATTR);\n else container?.setAttribute(ACTIVE_INDEX_ATTR, String(activeIndex));\n const active = activeIndex === null ? undefined : itemsRef.current.get(activeIndex);\n active?.setAttribute(ACTIVE_ATTR, '');\n return () => {\n active?.removeAttribute(ACTIVE_ATTR);\n // A row that re-registered under this index while it was highlighted\n // (a remount under a new key) was marked by registerItem, not by this\n // effect: drop the mark from whatever element holds the index now.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- itemsRef is a registry Map, reading it at cleanup is the point\n if (activeIndex !== null) itemsRef.current.get(activeIndex)?.removeAttribute(ACTIVE_ATTR);\n };\n }, [activeIndex, containerRef]);\n const [itemRects, setItemRects] = useState<ItemRect[]>([]);\n const [isMeasured, setIsMeasured] = useState(false);\n const itemRectsRef = useRef<ItemRect[]>([]);\n const sessionRef = useRef(0);\n const rafIdRef = useRef<number | null>(null);\n const remeasureRafIdRef = useRef<number | null>(null);\n\n /**\n * Publishes a rect for every registered item. Returns false when the\n * measurement could not be completed (no container, or an item without a\n * layout box) — nothing is published in that case, so the last complete\n * measurement stands instead of being overwritten with zeroes.\n */\n const runMeasurement = useCallback(() => {\n const container = containerRef.current;\n if (!container) return false;\n const rects: ItemRect[] = [];\n let everyItemHasLayout = true;\n itemsRef.current.forEach((element, index) => {\n // An element inside a display:none / not-yet-laid-out popup has no\n // offsetParent and reports every offset as 0. Publishing that would pin\n // overlays to the top of the list, so treat the whole pass as\n // incomplete. A boxless element is the only case: `position: fixed`\n // items also have no offsetParent but do have a size.\n const hasLayoutBox = element.offsetParent !== null || element.offsetWidth > 0 || element.offsetHeight > 0;\n if (!hasLayoutBox) {\n everyItemHasLayout = false;\n return;\n }\n // Use offset* instead of getBoundingClientRect so measurements are\n // unaffected by CSS transforms (e.g. scaleY animation on the parent\n // motion.div). offsetTop/offsetLeft are layout values relative to the\n // offsetParent (the scroll container), matching the coordinate space\n // used by `position: absolute` children. Items nested inside positioned\n // descendants of the container (a sidebar sub-menu's rows live inside a\n // positioned row) accumulate those ancestors' offsets, so every rect\n // lands in the container's own coordinate space; for a flat list the\n // loop never runs and this is exactly the plain offsetTop/offsetLeft.\n let top = element.offsetTop;\n let left = element.offsetLeft;\n let ancestor = element.offsetParent;\n while (ancestor instanceof HTMLElement && ancestor !== container && container.contains(ancestor)) {\n top += ancestor.offsetTop + ancestor.clientTop;\n left += ancestor.offsetLeft + ancestor.clientLeft;\n ancestor = ancestor.offsetParent;\n }\n rects[index] = {\n top,\n height: element.offsetHeight,\n left,\n width: element.offsetWidth,\n };\n });\n if (!everyItemHasLayout) return false;\n // Skip the state update when nothing moved (a cheap top/left/width/height\n // compare) so redundant remeasures don't churn re-renders.\n const prev = itemRectsRef.current;\n let changed = prev.length !== rects.length;\n for (let i = 0; !changed && i < rects.length; i++) {\n const p = prev[i];\n const r = rects[i];\n if (p === r) continue; // both undefined (sparse slot)\n changed = !p || !r || p.top !== r.top || p.left !== r.left || p.width !== r.width || p.height !== r.height;\n }\n if (changed) {\n itemRectsRef.current = rects;\n setItemRects(rects);\n }\n return true;\n }, [containerRef]);\n\n const measureItems = useCallback(() => {\n runMeasurement();\n }, [runMeasurement]);\n\n /**\n * The hook's single measurement pass: coalesces every trigger (item\n * registration, container resize) into one remeasure on the next frame and\n * is the only place readiness is reported, so `isMeasured` can never turn\n * true while another pass is still queued.\n */\n const scheduleMeasurement = useCallback(\n (attemptsLeft: number) => {\n if (remeasureRafIdRef.current !== null) {\n cancelAnimationFrame(remeasureRafIdRef.current);\n }\n remeasureRafIdRef.current = requestAnimationFrame(() => {\n remeasureRafIdRef.current = null;\n if (runMeasurement()) {\n setIsMeasured(true);\n } else if (attemptsLeft > 1) {\n scheduleMeasurement(attemptsLeft - 1);\n }\n });\n },\n [runMeasurement],\n );\n\n const remeasure = useCallback(() => {\n // Readiness drops first: until the pass below settles, the published rects\n // may not describe what is on screen, and an overlay positioned from them\n // would be corrected after mounting — which animates as a slide.\n setIsMeasured(false);\n scheduleMeasurement(measurementAttempts);\n }, [scheduleMeasurement]);\n\n // Observes the registered items themselves (not just the container): rows\n // that change size in place — e.g. the site-wide size step flipping while a\n // selection background is up — must invalidate the published rects even when\n // the container the effect below captured has since been remounted and the\n // ref points at a different element than the one being observed.\n const itemRoRef = useRef<ResizeObserver | null>(null);\n const getItemRo = useCallback(() => {\n if (itemRoRef.current === null && typeof ResizeObserver !== 'undefined') {\n itemRoRef.current = new ResizeObserver(() => scheduleMeasurement(measurementAttempts));\n }\n return itemRoRef.current;\n }, [scheduleMeasurement]);\n\n const registerItem = useCallback(\n (index: number, element: HTMLElement | null) => {\n if (element) {\n itemsRef.current.set(index, element);\n getItemRo()?.observe(element);\n if (index === activeIndexRef.current) element.setAttribute(ACTIVE_ATTR, '');\n } else {\n const previous = itemsRef.current.get(index);\n if (previous) itemRoRef.current?.unobserve(previous);\n // The mark leaves with the element: a row that only moved to another\n // index (a filtering list re-ordering) must not carry it there.\n previous?.removeAttribute(ACTIVE_ATTR);\n itemsRef.current.delete(index);\n // The highlighted row is gone: nothing should stay lit or receive a\n // routed click until the pointer picks again. Decided when the\n // update applies, after this commit's registrations, so a row that\n // only moved index hands the highlight to the row now under it.\n if (index === activeIndexRef.current) {\n setActiveIndex(current => (current === index && !itemsRef.current.has(index) ? null : current));\n }\n }\n // Coalesce rapid register/unregister calls (e.g. when an AnimatePresence\n // remounts a list of rows) into a single remeasure on the next frame,\n // so consumers don't have to manually call measureItems after the\n // container's children swap. A lit row keeps its element (unregistering\n // it clears the highlight), so its rect stays good while the pass runs:\n // dropping readiness then would blink the highlight every time a\n // virtualized list mounts a row while scrolling.\n if (activeIndexRef.current === null) remeasure();\n else scheduleMeasurement(measurementAttempts);\n },\n [remeasure, scheduleMeasurement, getItemRo],\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n if (!isFromInside(e)) return;\n const mouseX = e.clientX;\n const mouseY = e.clientY;\n\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n }\n\n rafIdRef.current = requestAnimationFrame(() => {\n rafIdRef.current = null;\n const container = containerRef.current;\n if (!container) return;\n setActiveIndex(\n pickNearest({\n axis,\n point: { x: mouseX, y: mouseY },\n rects: itemRectsRef.current,\n containerRect: container.getBoundingClientRect(),\n scroll: { x: container.scrollLeft, y: container.scrollTop },\n border: { x: container.clientLeft, y: container.clientTop },\n layoutSize: { width: container.offsetWidth, height: container.offsetHeight },\n isDisabled: isItemDisabled\n ? index => {\n const el = itemsRef.current.get(index);\n return !!el && isItemDisabled(el);\n }\n : undefined,\n }),\n );\n });\n },\n [axis, containerRef, isItemDisabled],\n );\n\n const handleMouseEnter = useCallback((e: React.MouseEvent) => {\n if (!isFromInside(e)) return;\n sessionRef.current += 1;\n }, []);\n\n const handleMouseLeave = useCallback((e: React.MouseEvent) => {\n if (!isFromInside(e)) return;\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n setActiveIndex(null);\n }, []);\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n // Outside the container in the DOM: a portaled child's click, or a row\n // that unmounted while its own click was still bubbling (a pick whose\n // primitive re-renders the list synchronously). Neither is a gap.\n const { target } = e;\n if (!(target instanceof Element) || !isFromInside(e)) return;\n // Inside an item: the item owns the click.\n for (const element of itemsRef.current.values()) {\n if (element.contains(target)) return;\n }\n // A control that sits between the rows (a search field at the top of\n // a menu, a footer button) keeps its own click too.\n const control = target.closest(\n \"input, textarea, select, button, a, summary, [contenteditable], [role='textbox'], [role='searchbox'], [role='button']\",\n );\n if (control) return;\n if (gapClick === false) return;\n const index = activeIndexRef.current;\n if (index === null) return;\n const element = itemsRef.current.get(index);\n if (!element || isItemDisabled?.(element)) return;\n if (gapClickMaxDistance !== Infinity) {\n const r = element.getBoundingClientRect();\n const dx = Math.max(r.left - e.clientX, 0, e.clientX - r.right);\n const dy = Math.max(r.top - e.clientY, 0, e.clientY - r.bottom);\n if (Math.hypot(dx, dy) > gapClickMaxDistance) return;\n }\n // A real DOM click on the item, so its own handlers (and the primitive\n // wrapping it, if any) run exactly as if the pointer had been inside.\n resolveActivator(element).click();\n },\n [isItemDisabled, gapClick, gapClickMaxDistance],\n );\n\n // Remeasure when the container resizes — a reflow moves items even though\n // the registered set is unchanged, which would otherwise leave itemRects\n // stale. Coalesced through the same rAF as register/unregister. Readiness is\n // deliberately not dropped: the item set is unchanged, so the published rects\n // stay usable, and hiding overlays on every reflow would flicker them.\n useEffect(() => {\n const container = containerRef.current;\n if (!container || typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(() => scheduleMeasurement(measurementAttempts));\n ro.observe(container);\n return () => ro.disconnect();\n }, [containerRef, scheduleMeasurement]);\n\n // Clean up rAF and the item observer on unmount\n useEffect(() => {\n return () => {\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n }\n if (remeasureRafIdRef.current !== null) {\n cancelAnimationFrame(remeasureRafIdRef.current);\n }\n itemRoRef.current?.disconnect();\n itemRoRef.current = null;\n };\n }, []);\n\n return {\n activeIndex,\n setActiveIndex,\n itemRects,\n isMeasured,\n sessionRef,\n handlers: {\n onMouseMove: handleMouseMove,\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n onClick: handleClick,\n },\n registerItem,\n remeasure,\n measureItems,\n };\n}\n\n/**\n * Registers an item's element with its list for as long as it is mounted.\n * The one way rows join a list: pass the hook's `registerItem` (or the copy\n * a context hands down), the row's index, and its ref. Either may be\n * missing for a row rendered outside a list (a standalone card, an accordion\n * item that is not grouped); then nothing is registered.\n */\nexport function useRegisterFluidHoverItem(\n registerItem: ((index: number, element: HTMLElement | null) => void) | undefined,\n index: number | undefined,\n ref: RefObject<HTMLElement | null>,\n) {\n useEffect(() => {\n if (!registerItem || index === undefined) return;\n registerItem(index, ref.current);\n return () => registerItem(index, null);\n }, [index, registerItem, ref]);\n}\n"],"names":["distance","useRef","useState","useEffect","useCallback","element"],"mappings":";;;;;;AAoHO,SAAS,WAAA,CAAY;AAAA,EAC1B,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAAoC;AAClC,EAAA,MAAM,SAAS,UAAA,CAAW,KAAA,GAAQ,IAAI,aAAA,CAAc,KAAA,GAAQ,WAAW,KAAA,GAAQ,CAAA;AAC/E,EAAA,MAAM,SAAS,UAAA,CAAW,MAAA,GAAS,IAAI,aAAA,CAAc,MAAA,GAAS,WAAW,MAAA,GAAS,CAAA;AAClF,EAAA,IAAI,YAAA,GAA8B,IAAA;AAClC,EAAA,IAAI,eAAA,GAAkB,QAAA;AACtB,EAAA,IAAI,eAAA,GAAiC,IAAA;AAErC,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,KAAA,CAAM,QAAQ,KAAA,EAAA,EAAS;AACjD,IAAA,MAAM,CAAA,GAAI,MAAM,KAAK,CAAA;AACrB,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,IAAI,UAAA,GAAa,KAAK,CAAA,EAAG;AAEzB,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,MAAM,IAAA,GAAO,cAAc,IAAA,GAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,CAAE,IAAA,GAAO,OAAO,CAAA,IAAK,MAAA;AACnE,MAAA,MAAM,GAAA,GAAM,cAAc,GAAA,GAAA,CAAO,MAAA,CAAO,IAAI,CAAA,CAAE,GAAA,GAAM,OAAO,CAAA,IAAK,MAAA;AAChE,MAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,GAAQ,MAAA;AACxB,MAAA,MAAM,MAAA,GAAS,EAAE,MAAA,GAAS,MAAA;AAC1B,MAAA,IAAI,KAAA,CAAM,CAAA,IAAK,IAAA,IAAQ,KAAA,CAAM,CAAA,IAAK,IAAA,GAAO,KAAA,IAAS,KAAA,CAAM,CAAA,IAAK,GAAA,IAAO,KAAA,CAAM,CAAA,IAAK,MAAM,MAAA,EAAQ;AAC3F,QAAA,eAAA,GAAkB,KAAA;AAAA,MACpB;AACA,MAAA,MAAMA,SAAAA,GAAW,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAA,IAAK,IAAA,GAAO,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAA,CAAM,CAAA,IAAK,GAAA,GAAM,MAAA,GAAS,CAAA,CAAE,CAAA;AACtF,MAAA,IAAIA,YAAW,eAAA,EAAiB;AAC9B,QAAA,eAAA,GAAkBA,SAAAA;AAClB,QAAA,YAAA,GAAe,KAAA;AAAA,MACjB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,aAAa,IAAA,KAAS,GAAA;AAC5B,IAAA,MAAM,QAAA,GAAW,UAAA,GAAa,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,CAAA;AAC9C,IAAA,MAAM,KAAA,GAAQ,aAAa,MAAA,GAAS,MAAA;AACpC,IAAA,MAAM,SAAA,GAAA,CACH,aAAa,aAAA,CAAc,IAAA,GAAO,cAAc,GAAA,IAAA,CAAA,CAC/C,UAAA,GAAa,OAAO,CAAA,GAAI,MAAA,CAAO,MAAM,UAAA,GAAa,CAAA,CAAE,OAAO,CAAA,CAAE,GAAA,CAAA,IAAQ,aAAa,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,CAAA,IAAM,KAAA;AAC9G,IAAA,MAAM,QAAA,GAAA,CAAY,UAAA,GAAa,CAAA,CAAE,KAAA,GAAQ,EAAE,MAAA,IAAU,KAAA;AACrD,IAAA,IAAI,QAAA,IAAY,SAAA,IAAa,QAAA,IAAY,SAAA,GAAY,QAAA,EAAU;AAC7D,MAAA,eAAA,GAAkB,KAAA;AAAA,IACpB;AACA,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,QAAA,IAAY,SAAA,GAAY,WAAW,CAAA,CAAE,CAAA;AAC/D,IAAA,IAAI,WAAW,eAAA,EAAiB;AAC9B,MAAA,eAAA,GAAkB,QAAA;AAClB,MAAA,YAAA,GAAe,KAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,OAAO,eAAA,IAAmB,YAAA;AAC5B;AAGO,MAAM,WAAA,GAAc;AAEpB,MAAM,iBAAA,GAAoB;AAGjC,SAAS,aAAa,CAAA,EAAyB;AAC7C,EAAA,OAAO,EAAE,MAAA,YAAkB,IAAA,IAAQ,EAAE,aAAA,CAAc,QAAA,CAAS,EAAE,MAAM,CAAA;AACtE;AAEA,MAAM,kBAAA,GACJ,yLAAA;AAQF,SAAS,iBAAiB,OAAA,EAAmC;AAC3D,EAAA,IAAI,QAAQ,OAAA,CAAQ,kBAAkB,KAAK,OAAA,CAAQ,YAAA,CAAa,UAAU,CAAA,EAAG;AAC3E,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA,CAAQ,aAAA,CAA2B,kBAAkB,CAAA,IAAK,OAAA;AACnE;AAQA,MAAM,mBAAA,GAAsB,CAAA;AAErB,SAAS,aAAA,CACd,YAAA,EACA,OAAA,GAAgC,EAAC,EACZ;AACrB,EAAA,MAAM,EAAE,IAAA,GAAO,GAAA,EAAK,cAAA,EAAgB,QAAA,GAAW,MAAK,GAAI,OAAA;AACxD,EAAA,MAAM,sBAAsB,OAAO,QAAA,KAAa,QAAA,GAAY,QAAA,CAAS,eAAe,QAAA,GAAY,QAAA;AAChG,EAAA,MAAM,QAAA,GAAWC,YAAA,iBAAO,IAAI,GAAA,EAA0B,CAAA;AACtD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIC,eAAwB,IAAI,CAAA;AAElE,EAAA,MAAM,cAAA,GAAiBD,aAAsB,IAAI,CAAA;AACjD,EAAA,cAAA,CAAe,OAAA,GAAU,WAAA;AAMzB,EAAAE,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,WAAA,KAAgB,IAAA,EAAM,SAAA,EAAW,eAAA,CAAgB,iBAAiB,CAAA;AAAA,SACjE,SAAA,EAAW,YAAA,CAAa,iBAAA,EAAmB,MAAA,CAAO,WAAW,CAAC,CAAA;AACnE,IAAA,MAAM,SAAS,WAAA,KAAgB,IAAA,GAAO,SAAY,QAAA,CAAS,OAAA,CAAQ,IAAI,WAAW,CAAA;AAClF,IAAA,MAAA,EAAQ,YAAA,CAAa,aAAa,EAAE,CAAA;AACpC,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,EAAQ,gBAAgB,WAAW,CAAA;AAKnC,MAAA,IAAI,WAAA,KAAgB,MAAM,QAAA,CAAS,OAAA,CAAQ,IAAI,WAAW,CAAA,EAAG,gBAAgB,WAAW,CAAA;AAAA,IAC1F,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,YAAY,CAAC,CAAA;AAC9B,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAID,cAAA,CAAqB,EAAE,CAAA;AACzD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,YAAA,GAAeD,YAAA,CAAmB,EAAE,CAAA;AAC1C,EAAA,MAAM,UAAA,GAAaA,aAAO,CAAC,CAAA;AAC3B,EAAA,MAAM,QAAA,GAAWA,aAAsB,IAAI,CAAA;AAC3C,EAAA,MAAM,iBAAA,GAAoBA,aAAsB,IAAI,CAAA;AAQpD,EAAA,MAAM,cAAA,GAAiBG,kBAAY,MAAM;AACvC,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,CAAC,WAAW,OAAO,KAAA;AACvB,IAAA,MAAM,QAAoB,EAAC;AAC3B,IAAA,IAAI,kBAAA,GAAqB,IAAA;AACzB,IAAA,QAAA,CAAS,OAAA,CAAQ,OAAA,CAAQ,CAAC,OAAA,EAAS,KAAA,KAAU;AAM3C,MAAA,MAAM,YAAA,GAAe,QAAQ,YAAA,KAAiB,IAAA,IAAQ,QAAQ,WAAA,GAAc,CAAA,IAAK,QAAQ,YAAA,GAAe,CAAA;AACxG,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,kBAAA,GAAqB,KAAA;AACrB,QAAA;AAAA,MACF;AAUA,MAAA,IAAI,MAAM,OAAA,CAAQ,SAAA;AAClB,MAAA,IAAI,OAAO,OAAA,CAAQ,UAAA;AACnB,MAAA,IAAI,WAAW,OAAA,CAAQ,YAAA;AACvB,MAAA,OAAO,oBAAoB,WAAA,IAAe,QAAA,KAAa,aAAa,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,EAAG;AAChG,QAAA,GAAA,IAAO,QAAA,CAAS,YAAY,QAAA,CAAS,SAAA;AACrC,QAAA,IAAA,IAAQ,QAAA,CAAS,aAAa,QAAA,CAAS,UAAA;AACvC,QAAA,QAAA,GAAW,QAAA,CAAS,YAAA;AAAA,MACtB;AACA,MAAA,KAAA,CAAM,KAAK,CAAA,GAAI;AAAA,QACb,GAAA;AAAA,QACA,QAAQ,OAAA,CAAQ,YAAA;AAAA,QAChB,IAAA;AAAA,QACA,OAAO,OAAA,CAAQ;AAAA,OACjB;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAI,CAAC,oBAAoB,OAAO,KAAA;AAGhC,IAAA,MAAM,OAAO,YAAA,CAAa,OAAA;AAC1B,IAAA,IAAI,OAAA,GAAU,IAAA,CAAK,MAAA,KAAW,KAAA,CAAM,MAAA;AACpC,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAC,WAAW,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACjD,MAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,MAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,MAAA,IAAI,MAAM,CAAA,EAAG;AACb,MAAA,OAAA,GAAU,CAAC,CAAA,IAAK,CAAC,KAAK,CAAA,CAAE,GAAA,KAAQ,EAAE,GAAA,IAAO,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA,KAAU,EAAE,KAAA,IAAS,CAAA,CAAE,WAAW,CAAA,CAAE,MAAA;AAAA,IACtG;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,YAAA,GAAeA,kBAAY,MAAM;AACrC,IAAA,cAAA,EAAe;AAAA,EACjB,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAQnB,EAAA,MAAM,mBAAA,GAAsBA,iBAAA;AAAA,IAC1B,CAAC,YAAA,KAAyB;AACxB,MAAA,IAAI,iBAAA,CAAkB,YAAY,IAAA,EAAM;AACtC,QAAA,oBAAA,CAAqB,kBAAkB,OAAO,CAAA;AAAA,MAChD;AACA,MAAA,iBAAA,CAAkB,OAAA,GAAU,sBAAsB,MAAM;AACtD,QAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAC5B,QAAA,IAAI,gBAAe,EAAG;AACpB,UAAA,aAAA,CAAc,IAAI,CAAA;AAAA,QACpB,CAAA,MAAA,IAAW,eAAe,CAAA,EAAG;AAC3B,UAAA,mBAAA,CAAoB,eAAe,CAAC,CAAA;AAAA,QACtC;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,MAAM,SAAA,GAAYA,kBAAY,MAAM;AAIlC,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,mBAAA,CAAoB,mBAAmB,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,mBAAmB,CAAC,CAAA;AAOxB,EAAA,MAAM,SAAA,GAAYH,aAA8B,IAAI,CAAA;AACpD,EAAA,MAAM,SAAA,GAAYG,kBAAY,MAAM;AAClC,IAAA,IAAI,SAAA,CAAU,OAAA,KAAY,IAAA,IAAQ,OAAO,mBAAmB,WAAA,EAAa;AACvE,MAAA,SAAA,CAAU,UAAU,IAAI,cAAA,CAAe,MAAM,mBAAA,CAAoB,mBAAmB,CAAC,CAAA;AAAA,IACvF;AACA,IAAA,OAAO,SAAA,CAAU,OAAA;AAAA,EACnB,CAAA,EAAG,CAAC,mBAAmB,CAAC,CAAA;AAExB,EAAA,MAAM,YAAA,GAAeA,iBAAA;AAAA,IACnB,CAAC,OAAe,OAAA,KAAgC;AAC9C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,OAAO,CAAA;AACnC,QAAA,SAAA,EAAU,EAAG,QAAQ,OAAO,CAAA;AAC5B,QAAA,IAAI,UAAU,cAAA,CAAe,OAAA,EAAS,OAAA,CAAQ,YAAA,CAAa,aAAa,EAAE,CAAA;AAAA,MAC5E,CAAA,MAAO;AACL,QAAA,MAAM,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAC3C,QAAA,IAAI,QAAA,EAAU,SAAA,CAAU,OAAA,EAAS,SAAA,CAAU,QAAQ,CAAA;AAGnD,QAAA,QAAA,EAAU,gBAAgB,WAAW,CAAA;AACrC,QAAA,QAAA,CAAS,OAAA,CAAQ,OAAO,KAAK,CAAA;AAK7B,QAAA,IAAI,KAAA,KAAU,eAAe,OAAA,EAAS;AACpC,UAAA,cAAA,CAAe,CAAA,OAAA,KAAY,OAAA,KAAY,KAAA,IAAS,CAAC,QAAA,CAAS,QAAQ,GAAA,CAAI,KAAK,CAAA,GAAI,IAAA,GAAO,OAAQ,CAAA;AAAA,QAChG;AAAA,MACF;AAQA,MAAA,IAAI,cAAA,CAAe,OAAA,KAAY,IAAA,EAAM,SAAA,EAAU;AAAA,+BACtB,mBAAmB,CAAA;AAAA,IAC9C,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,mBAAA,EAAqB,SAAS;AAAA,GAC5C;AAEA,EAAA,MAAM,eAAA,GAAkBA,iBAAA;AAAA,IACtB,CAAC,CAAA,KAAwB;AACvB,MAAA,IAAI,CAAC,YAAA,CAAa,CAAC,CAAA,EAAG;AACtB,MAAA,MAAM,SAAS,CAAA,CAAE,OAAA;AACjB,MAAA,MAAM,SAAS,CAAA,CAAE,OAAA;AAEjB,MAAA,IAAI,QAAA,CAAS,YAAY,IAAA,EAAM;AAC7B,QAAA,oBAAA,CAAqB,SAAS,OAAO,CAAA;AAAA,MACvC;AAEA,MAAA,QAAA,CAAS,OAAA,GAAU,sBAAsB,MAAM;AAC7C,QAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,QAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,QAAA,IAAI,CAAC,SAAA,EAAW;AAChB,QAAA,cAAA;AAAA,UACE,WAAA,CAAY;AAAA,YACV,IAAA;AAAA,YACA,KAAA,EAAO,EAAE,CAAA,EAAG,MAAA,EAAQ,GAAG,MAAA,EAAO;AAAA,YAC9B,OAAO,YAAA,CAAa,OAAA;AAAA,YACpB,aAAA,EAAe,UAAU,qBAAA,EAAsB;AAAA,YAC/C,QAAQ,EAAE,CAAA,EAAG,UAAU,UAAA,EAAY,CAAA,EAAG,UAAU,SAAA,EAAU;AAAA,YAC1D,QAAQ,EAAE,CAAA,EAAG,UAAU,UAAA,EAAY,CAAA,EAAG,UAAU,SAAA,EAAU;AAAA,YAC1D,YAAY,EAAE,KAAA,EAAO,UAAU,WAAA,EAAa,MAAA,EAAQ,UAAU,YAAA,EAAa;AAAA,YAC3E,UAAA,EAAY,iBACR,CAAA,KAAA,KAAS;AACP,cAAA,MAAM,EAAA,GAAK,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AACrC,cAAA,OAAO,CAAC,CAAC,EAAA,IAAM,cAAA,CAAe,EAAE,CAAA;AAAA,YAClC,CAAA,GACA;AAAA,WACL;AAAA,SACH;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,YAAA,EAAc,cAAc;AAAA,GACrC;AAEA,EAAA,MAAM,gBAAA,GAAmBA,iBAAA,CAAY,CAAC,CAAA,KAAwB;AAC5D,IAAA,IAAI,CAAC,YAAA,CAAa,CAAC,CAAA,EAAG;AACtB,IAAA,UAAA,CAAW,OAAA,IAAW,CAAA;AAAA,EACxB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBA,iBAAA,CAAY,CAAC,CAAA,KAAwB;AAC5D,IAAA,IAAI,CAAC,YAAA,CAAa,CAAC,CAAA,EAAG;AACtB,IAAA,IAAI,QAAA,CAAS,YAAY,IAAA,EAAM;AAC7B,MAAA,oBAAA,CAAqB,SAAS,OAAO,CAAA;AACrC,MAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,IACrB;AACA,IAAA,cAAA,CAAe,IAAI,CAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAcA,iBAAA;AAAA,IAClB,CAAC,CAAA,KAAwB;AAIvB,MAAA,MAAM,EAAE,QAAO,GAAI,CAAA;AACnB,MAAA,IAAI,EAAE,MAAA,YAAkB,OAAA,CAAA,IAAY,CAAC,YAAA,CAAa,CAAC,CAAA,EAAG;AAEtD,MAAA,KAAA,MAAWC,QAAAA,IAAW,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC/C,QAAA,IAAIA,QAAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAAA,MAChC;AAGA,MAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AAAA,QACrB;AAAA,OACF;AACA,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,IAAI,aAAa,KAAA,EAAO;AACxB,MAAA,MAAM,QAAQ,cAAA,CAAe,OAAA;AAC7B,MAAA,IAAI,UAAU,IAAA,EAAM;AACpB,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAC1C,MAAA,IAAI,CAAC,OAAA,IAAW,cAAA,GAAiB,OAAO,CAAA,EAAG;AAC3C,MAAA,IAAI,wBAAwB,QAAA,EAAU;AACpC,QAAA,MAAM,CAAA,GAAI,QAAQ,qBAAA,EAAsB;AACxC,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,KAAK,CAAA;AAC9D,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,GAAA,GAAM,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,MAAM,CAAA;AAC9D,QAAA,IAAI,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,IAAI,mBAAA,EAAqB;AAAA,MAChD;AAGA,MAAA,gBAAA,CAAiB,OAAO,EAAE,KAAA,EAAM;AAAA,IAClC,CAAA;AAAA,IACA,CAAC,cAAA,EAAgB,QAAA,EAAU,mBAAmB;AAAA,GAChD;AAOA,EAAAF,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,CAAC,SAAA,IAAa,OAAO,cAAA,KAAmB,WAAA,EAAa;AACzD,IAAA,MAAM,KAAK,IAAI,cAAA,CAAe,MAAM,mBAAA,CAAoB,mBAAmB,CAAC,CAAA;AAC5E,IAAA,EAAA,CAAG,QAAQ,SAAS,CAAA;AACpB,IAAA,OAAO,MAAM,GAAG,UAAA,EAAW;AAAA,EAC7B,CAAA,EAAG,CAAC,YAAA,EAAc,mBAAmB,CAAC,CAAA;AAGtC,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,QAAA,CAAS,YAAY,IAAA,EAAM;AAC7B,QAAA,oBAAA,CAAqB,SAAS,OAAO,CAAA;AAAA,MACvC;AACA,MAAA,IAAI,iBAAA,CAAkB,YAAY,IAAA,EAAM;AACtC,QAAA,oBAAA,CAAqB,kBAAkB,OAAO,CAAA;AAAA,MAChD;AACA,MAAA,SAAA,CAAU,SAAS,UAAA,EAAW;AAC9B,MAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACR,WAAA,EAAa,eAAA;AAAA,MACb,YAAA,EAAc,gBAAA;AAAA,MACd,YAAA,EAAc,gBAAA;AAAA,MACd,OAAA,EAAS;AAAA,KACX;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;AASO,SAAS,yBAAA,CACd,YAAA,EACA,KAAA,EACA,GAAA,EACA;AACA,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAA,IAAgB,KAAA,KAAU,MAAA,EAAW;AAC1C,IAAA,YAAA,CAAa,KAAA,EAAO,IAAI,OAAO,CAAA;AAC/B,IAAA,OAAO,MAAM,YAAA,CAAa,KAAA,EAAO,IAAI,CAAA;AAAA,EACvC,CAAA,EAAG,CAAC,KAAA,EAAO,YAAA,EAAc,GAAG,CAAC,CAAA;AAC/B;;;;;;;;"}
1
+ {"version":3,"file":"use-fluid-hover.cjs.js","sources":["../../src/hooks/use-fluid-hover.ts"],"sourcesContent":["'use client';\n\nimport { useRef, useState, useCallback, useEffect, type Dispatch, type RefObject, type SetStateAction } from 'react';\n\nexport interface ItemRect {\n top: number;\n height: number;\n left: number;\n width: number;\n}\n\nexport interface UseFluidHoverOptions {\n /**\n * Which direction to resolve the nearest item along.\n * \"y\" — vertical lists (default): closest by top/height\n * \"x\" — horizontal strips: closest by left/width\n * \"xy\" — 2-D grids: closest card across both rows AND columns,\n * measured by Euclidean distance to each item's center\n */\n axis?: 'x' | 'y' | 'xy';\n /**\n * Makes an item invisible to hit-testing without unregistering it — for\n * rows that stay mounted while clipped away (a collapsed sub-tree).\n * Unregistering would invalidate every measurement; a skipped item keeps\n * the set stable. Consulted per mouse move, so keep it cheap.\n */\n isItemDisabled?: (element: HTMLElement) => boolean;\n /**\n * Whether a click that lands between items (a gap, the padding, past the\n * last row) is routed to the highlighted item, so what is lit is what a\n * click hits. On by default: in a menu or a list the highlight is a\n * promise about the click. Pass `false` where empty space should stay\n * inert (rows with destructive actions, generous whitespace), or\n * `{ maxDistance }` to route only clicks within that many pixels of the\n * highlighted item's edge.\n */\n gapClick?: boolean | { maxDistance?: number };\n}\n\nexport interface UseFluidHoverReturn {\n activeIndex: number | null;\n setActiveIndex: Dispatch<SetStateAction<number | null>>;\n itemRects: ItemRect[];\n /**\n * True once every registered item has been measured and no remeasure is\n * pending, i.e. `itemRects` describes the current item set. Gate absolutely\n * positioned overlays on it: an overlay that mounts against a rect a later\n * pass still corrects animates from the wrong place to the right one, which\n * reads as the highlight sliding in from another row.\n */\n isMeasured: boolean;\n sessionRef: RefObject<number>;\n /**\n * Events whose target sits outside the container in the DOM are ignored:\n * React bubbles events from a portaled child (a submenu) through its React\n * parents, and those must not steer or click this list.\n */\n handlers: {\n onMouseMove: (e: React.MouseEvent) => void;\n onMouseEnter: (e: React.MouseEvent) => void;\n onMouseLeave: (e: React.MouseEvent) => void;\n /**\n * Routes a click that lands between items (a gap, the padding, past the\n * last row) to the highlighted item, so the highlight and the click agree:\n * what is lit is what a click hits. A click inside an item is left to the\n * item. Disabled items (`isItemDisabled`) are never activated.\n */\n onClick: (e: React.MouseEvent) => void;\n };\n registerItem: (index: number, element: HTMLElement | null) => void;\n /**\n * Invalidates the published rects and runs the hook's coalesced measurement\n * pass again, holding `isMeasured` false until it settles. Reach for it when\n * the rects may be wrong and showing an overlay against them would misplace\n * it: a popup that stays mounted between opens keeps its items registered,\n * so nothing else would notice that its rects were taken while it was\n * hidden. Registration, item resize, and container resize already trigger\n * a pass; do not call this on `children` changes.\n */\n remeasure: () => void;\n /**\n * Re-reads the rects synchronously, keeping `isMeasured` as it is. Only for\n * layout that moves the rows under a visible overlay frame by frame (the\n * accordion re-measures inside its height animation). Everything else\n * wants `remeasure`, or nothing.\n */\n measureItems: () => void;\n}\n\nexport interface PickNearestInput {\n axis: 'x' | 'y' | 'xy';\n /** The pointer, in viewport coordinates. */\n point: { x: number; y: number };\n /** Item rects in the container's layout space (sparse: unregistered slots\n * are undefined). */\n rects: readonly (ItemRect | undefined)[];\n /** The container's bounding rect and live scroll / border offsets, which\n * map layout rects into the pointer's viewport space. */\n containerRect: { left: number; top: number; width: number; height: number };\n scroll: { x: number; y: number };\n border: { x: number; y: number };\n /** Layout size of the container, so a cumulative ancestor `transform:\n * scale` (a popup mid scale-in) can be factored out per axis. */\n layoutSize: { width: number; height: number };\n /** Skips an item without unregistering it. */\n isDisabled?: (index: number) => boolean;\n}\n\n/**\n * The rule, as one pure function: an item the pointer is inside wins;\n * otherwise the item whose center is nearest does, so a pointer in a gap, in\n * the padding, or past the last row still lands. `y` and `x` measure one\n * coordinate; `xy` measures the straight line to each center. Ties keep the\n * first item. The hook calls this once per animation frame; the docs page\n * times it.\n */\nexport function pickNearest({\n axis,\n point,\n rects,\n containerRect,\n scroll,\n border,\n layoutSize,\n isDisabled,\n}: PickNearestInput): number | null {\n const scaleX = layoutSize.width > 0 ? containerRect.width / layoutSize.width : 1;\n const scaleY = layoutSize.height > 0 ? containerRect.height / layoutSize.height : 1;\n let closestIndex: number | null = null;\n let closestDistance = Infinity;\n let containingIndex: number | null = null;\n\n for (let index = 0; index < rects.length; index++) {\n const r = rects[index];\n if (!r) continue;\n if (isDisabled?.(index)) continue;\n\n if (axis === 'xy') {\n const left = containerRect.left + (border.x + r.left - scroll.x) * scaleX;\n const top = containerRect.top + (border.y + r.top - scroll.y) * scaleY;\n const width = r.width * scaleX;\n const height = r.height * scaleY;\n if (point.x >= left && point.x <= left + width && point.y >= top && point.y <= top + height) {\n containingIndex = index;\n }\n const distance = Math.hypot(point.x - (left + width / 2), point.y - (top + height / 2));\n if (distance < closestDistance) {\n closestDistance = distance;\n closestIndex = index;\n }\n continue;\n }\n\n const horizontal = axis === 'x';\n const mousePos = horizontal ? point.x : point.y;\n const scale = horizontal ? scaleX : scaleY;\n const itemStart =\n (horizontal ? containerRect.left : containerRect.top) +\n ((horizontal ? border.x : border.y) + (horizontal ? r.left : r.top) - (horizontal ? scroll.x : scroll.y)) * scale;\n const itemSize = (horizontal ? r.width : r.height) * scale;\n if (mousePos >= itemStart && mousePos <= itemStart + itemSize) {\n containingIndex = index;\n }\n const distance = Math.abs(mousePos - (itemStart + itemSize / 2));\n if (distance < closestDistance) {\n closestDistance = distance;\n closestIndex = index;\n }\n }\n\n return containingIndex ?? closestIndex;\n}\n\n/** Set on the highlighted item (boolean attribute). */\nexport const ACTIVE_ATTR = 'data-fluid-hover-active';\n/** Set on the container: the highlighted index, or absent. */\nexport const ACTIVE_INDEX_ATTR = 'data-fluid-hover-active-index';\n\n/** False for an event bubbled through React from a portal outside the container, and for a detached target. */\nfunction isFromInside(e: React.SyntheticEvent) {\n return e.target instanceof Node && e.currentTarget.contains(e.target);\n}\n\nconst ACTIVATOR_SELECTOR =\n \"a[href], button, [role='menuitem'], [role='menuitemradio'], [role='menuitemcheckbox'], [role='option'], [role='radio'], [role='checkbox'], [role='tab'], [role='link'], [role='button']\";\n\n/**\n * The element a routed click should land on. A registered item is usually\n * the interactive row itself; when it is only a box around one (a sidebar\n * row around its button, a card around its link), the first control inside\n * is what a real click on the row would have reached.\n */\nfunction resolveActivator(element: HTMLElement): HTMLElement {\n if (element.matches(ACTIVATOR_SELECTOR) || element.hasAttribute('tabindex')) {\n return element;\n }\n return element.querySelector<HTMLElement>(ACTIVATOR_SELECTOR) ?? element;\n}\n\n/**\n * How many frames the coalesced remeasure retries while the registered items\n * still have no layout box. A popup can be in the DOM one frame before it is\n * laid out; retrying beats publishing zeroed rects, and the cap keeps a list\n * that stays hidden for good from spinning frames forever.\n */\nconst measurementAttempts = 3;\n\nconst CONTROL_BETWEEN_ROWS =\n \"input, textarea, select, button, a, label, summary, [contenteditable], [role='textbox'], [role='searchbox'], [role='button'], [role='link'], [role='radio'], [role='checkbox'], [role='switch'], [role='slider'], [role='spinbutton'], [role='tab'], [role='radiogroup'], [role='tablist'], [role='toolbar']\";\n\nexport function useFluidHover<T extends HTMLElement>(\n containerRef: RefObject<T | null>,\n options: UseFluidHoverOptions = {},\n): UseFluidHoverReturn {\n const { axis = 'y', isItemDisabled, gapClick = true } = options;\n const gapClickMaxDistance = typeof gapClick === 'object' ? (gapClick.maxDistance ?? Infinity) : Infinity;\n const itemsRef = useRef(new Map<number, HTMLElement>());\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n // Mirrored for handlers that read it outside a render (the gap click).\n const activeIndexRef = useRef<number | null>(null);\n activeIndexRef.current = activeIndex;\n\n // The state, in the DOM: `data-fluid-hover-active` on the highlighted item\n // and `data-fluid-hover-active-index` on the container. Devtools shows it\n // and a test asserts on it without waiting for a frame. React does not\n // manage these attributes, so it never clobbers them.\n useEffect(() => {\n const container = containerRef.current;\n if (activeIndex === null) container?.removeAttribute(ACTIVE_INDEX_ATTR);\n else container?.setAttribute(ACTIVE_INDEX_ATTR, String(activeIndex));\n const active = activeIndex === null ? undefined : itemsRef.current.get(activeIndex);\n active?.setAttribute(ACTIVE_ATTR, '');\n return () => {\n active?.removeAttribute(ACTIVE_ATTR);\n // A row that re-registered under this index while it was highlighted\n // (a remount under a new key) was marked by registerItem, not by this\n // effect: drop the mark from whatever element holds the index now.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- itemsRef is a registry Map, reading it at cleanup is the point\n if (activeIndex !== null) itemsRef.current.get(activeIndex)?.removeAttribute(ACTIVE_ATTR);\n };\n }, [activeIndex, containerRef]);\n const [itemRects, setItemRects] = useState<ItemRect[]>([]);\n const [isMeasured, setIsMeasured] = useState(false);\n const itemRectsRef = useRef<ItemRect[]>([]);\n const sessionRef = useRef(0);\n const rafIdRef = useRef<number | null>(null);\n const remeasureRafIdRef = useRef<number | null>(null);\n\n /**\n * Publishes a rect for every registered item. Returns false when the\n * measurement could not be completed (no container, or an item without a\n * layout box) — nothing is published in that case, so the last complete\n * measurement stands instead of being overwritten with zeroes.\n */\n const runMeasurement = useCallback(() => {\n const container = containerRef.current;\n if (!container) return false;\n const rects: ItemRect[] = [];\n let everyItemHasLayout = true;\n itemsRef.current.forEach((element, index) => {\n // An element inside a display:none / not-yet-laid-out popup has no\n // offsetParent and reports every offset as 0. Publishing that would pin\n // overlays to the top of the list, so treat the whole pass as\n // incomplete. A boxless element is the only case: `position: fixed`\n // items also have no offsetParent but do have a size.\n const hasLayoutBox = element.offsetParent !== null || element.offsetWidth > 0 || element.offsetHeight > 0;\n if (!hasLayoutBox) {\n everyItemHasLayout = false;\n return;\n }\n // Use offset* instead of getBoundingClientRect so measurements are\n // unaffected by CSS transforms (e.g. scaleY animation on the parent\n // motion.div). offsetTop/offsetLeft are layout values relative to the\n // offsetParent (the scroll container), matching the coordinate space\n // used by `position: absolute` children. Items nested inside positioned\n // descendants of the container (a sidebar sub-menu's rows live inside a\n // positioned row) accumulate those ancestors' offsets, so every rect\n // lands in the container's own coordinate space; for a flat list the\n // loop never runs and this is exactly the plain offsetTop/offsetLeft.\n let top = element.offsetTop;\n let left = element.offsetLeft;\n let ancestor = element.offsetParent;\n while (ancestor instanceof HTMLElement && ancestor !== container && container.contains(ancestor)) {\n top += ancestor.offsetTop + ancestor.clientTop;\n left += ancestor.offsetLeft + ancestor.clientLeft;\n ancestor = ancestor.offsetParent;\n }\n rects[index] = {\n top,\n height: element.offsetHeight,\n left,\n width: element.offsetWidth,\n };\n });\n if (!everyItemHasLayout) return false;\n // Skip the state update when nothing moved (a cheap top/left/width/height\n // compare) so redundant remeasures don't churn re-renders.\n const prev = itemRectsRef.current;\n let changed = prev.length !== rects.length;\n for (let i = 0; !changed && i < rects.length; i++) {\n const p = prev[i];\n const r = rects[i];\n if (p === r) continue; // both undefined (sparse slot)\n changed = !p || !r || p.top !== r.top || p.left !== r.left || p.width !== r.width || p.height !== r.height;\n }\n if (changed) {\n itemRectsRef.current = rects;\n setItemRects(rects);\n }\n return true;\n }, [containerRef]);\n\n const measureItems = useCallback(() => {\n runMeasurement();\n }, [runMeasurement]);\n\n /**\n * The hook's single measurement pass: coalesces every trigger (item\n * registration, container resize) into one remeasure on the next frame and\n * is the only place readiness is reported, so `isMeasured` can never turn\n * true while another pass is still queued.\n */\n const scheduleMeasurement = useCallback(\n (attemptsLeft: number) => {\n if (remeasureRafIdRef.current !== null) {\n cancelAnimationFrame(remeasureRafIdRef.current);\n }\n remeasureRafIdRef.current = requestAnimationFrame(() => {\n remeasureRafIdRef.current = null;\n if (runMeasurement()) {\n setIsMeasured(true);\n } else if (attemptsLeft > 1) {\n scheduleMeasurement(attemptsLeft - 1);\n }\n });\n },\n [runMeasurement],\n );\n\n const remeasure = useCallback(() => {\n // Readiness drops first: until the pass below settles, the published rects\n // may not describe what is on screen, and an overlay positioned from them\n // would be corrected after mounting — which animates as a slide.\n setIsMeasured(false);\n scheduleMeasurement(measurementAttempts);\n }, [scheduleMeasurement]);\n\n // Observes the registered items themselves (not just the container): rows\n // that change size in place — e.g. the site-wide size step flipping while a\n // selection background is up — must invalidate the published rects even when\n // the container the effect below captured has since been remounted and the\n // ref points at a different element than the one being observed.\n const itemRoRef = useRef<ResizeObserver | null>(null);\n const getItemRo = useCallback(() => {\n if (itemRoRef.current === null && typeof ResizeObserver !== 'undefined') {\n itemRoRef.current = new ResizeObserver(() => scheduleMeasurement(measurementAttempts));\n }\n return itemRoRef.current;\n }, [scheduleMeasurement]);\n\n const registerItem = useCallback(\n (index: number, element: HTMLElement | null) => {\n if (element) {\n itemsRef.current.set(index, element);\n getItemRo()?.observe(element);\n if (index === activeIndexRef.current) element.setAttribute(ACTIVE_ATTR, '');\n } else {\n const previous = itemsRef.current.get(index);\n if (previous) itemRoRef.current?.unobserve(previous);\n // The mark leaves with the element: a row that only moved to another\n // index (a filtering list re-ordering) must not carry it there.\n previous?.removeAttribute(ACTIVE_ATTR);\n itemsRef.current.delete(index);\n // The highlighted row is gone: nothing should stay lit or receive a\n // routed click until the pointer picks again. Decided when the\n // update applies, after this commit's registrations, so a row that\n // only moved index hands the highlight to the row now under it.\n if (index === activeIndexRef.current) {\n setActiveIndex(current => (current === index && !itemsRef.current.has(index) ? null : current));\n }\n }\n // Coalesce rapid register/unregister calls (e.g. when an AnimatePresence\n // remounts a list of rows) into a single remeasure on the next frame,\n // so consumers don't have to manually call measureItems after the\n // container's children swap. A lit row keeps its element (unregistering\n // it clears the highlight), so its rect stays good while the pass runs:\n // dropping readiness then would blink the highlight every time a\n // virtualized list mounts a row while scrolling.\n if (activeIndexRef.current === null) remeasure();\n else scheduleMeasurement(measurementAttempts);\n },\n [remeasure, scheduleMeasurement, getItemRo],\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n if (!isFromInside(e)) return;\n const mouseX = e.clientX;\n const mouseY = e.clientY;\n\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n }\n\n rafIdRef.current = requestAnimationFrame(() => {\n rafIdRef.current = null;\n const container = containerRef.current;\n if (!container) return;\n setActiveIndex(\n pickNearest({\n axis,\n point: { x: mouseX, y: mouseY },\n rects: itemRectsRef.current,\n containerRect: container.getBoundingClientRect(),\n scroll: { x: container.scrollLeft, y: container.scrollTop },\n border: { x: container.clientLeft, y: container.clientTop },\n layoutSize: { width: container.offsetWidth, height: container.offsetHeight },\n isDisabled: isItemDisabled\n ? index => {\n const el = itemsRef.current.get(index);\n return !!el && isItemDisabled(el);\n }\n : undefined,\n }),\n );\n });\n },\n [axis, containerRef, isItemDisabled],\n );\n\n const handleMouseEnter = useCallback((e: React.MouseEvent) => {\n if (!isFromInside(e)) return;\n sessionRef.current += 1;\n }, []);\n\n const handleMouseLeave = useCallback((e: React.MouseEvent) => {\n if (!isFromInside(e)) return;\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n setActiveIndex(null);\n }, []);\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n // Outside the container in the DOM: a portaled child's click, or a row\n // that unmounted while its own click was still bubbling (a pick whose\n // primitive re-renders the list synchronously). Neither is a gap.\n const { target } = e;\n if (!(target instanceof Element) || !isFromInside(e)) return;\n // Inside an item: the item owns the click.\n for (const element of itemsRef.current.values()) {\n if (element.contains(target)) return;\n }\n // A control that sits between the rows (a search field at the top of\n // a menu, a footer button, a theme toggle) keeps its own click too.\n if (target.closest(CONTROL_BETWEEN_ROWS)) return;\n if (gapClick === false) return;\n const index = activeIndexRef.current;\n if (index === null) return;\n const element = itemsRef.current.get(index);\n if (!element || isItemDisabled?.(element)) return;\n if (gapClickMaxDistance !== Infinity) {\n const r = element.getBoundingClientRect();\n const dx = Math.max(r.left - e.clientX, 0, e.clientX - r.right);\n const dy = Math.max(r.top - e.clientY, 0, e.clientY - r.bottom);\n if (Math.hypot(dx, dy) > gapClickMaxDistance) return;\n }\n // A real DOM click on the item, so its own handlers (and the primitive\n // wrapping it, if any) run exactly as if the pointer had been inside.\n resolveActivator(element).click();\n },\n [isItemDisabled, gapClick, gapClickMaxDistance],\n );\n\n // Remeasure when the container resizes — a reflow moves items even though\n // the registered set is unchanged, which would otherwise leave itemRects\n // stale. Coalesced through the same rAF as register/unregister. Readiness is\n // deliberately not dropped: the item set is unchanged, so the published rects\n // stay usable, and hiding overlays on every reflow would flicker them.\n useEffect(() => {\n const container = containerRef.current;\n if (!container || typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(() => scheduleMeasurement(measurementAttempts));\n ro.observe(container);\n return () => ro.disconnect();\n }, [containerRef, scheduleMeasurement]);\n\n // Clean up rAF and the item observer on unmount\n useEffect(() => {\n return () => {\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n }\n if (remeasureRafIdRef.current !== null) {\n cancelAnimationFrame(remeasureRafIdRef.current);\n }\n itemRoRef.current?.disconnect();\n itemRoRef.current = null;\n };\n }, []);\n\n return {\n activeIndex,\n setActiveIndex,\n itemRects,\n isMeasured,\n sessionRef,\n handlers: {\n onMouseMove: handleMouseMove,\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n onClick: handleClick,\n },\n registerItem,\n remeasure,\n measureItems,\n };\n}\n\n/**\n * Registers an item's element with its list for as long as it is mounted.\n * The one way rows join a list: pass the hook's `registerItem` (or the copy\n * a context hands down), the row's index, and its ref. Either may be\n * missing for a row rendered outside a list (a standalone card, an accordion\n * item that is not grouped); then nothing is registered.\n */\nexport function useRegisterFluidHoverItem(\n registerItem: ((index: number, element: HTMLElement | null) => void) | undefined,\n index: number | undefined,\n ref: RefObject<HTMLElement | null>,\n) {\n useEffect(() => {\n if (!registerItem || index === undefined) return;\n registerItem(index, ref.current);\n return () => registerItem(index, null);\n }, [index, registerItem, ref]);\n}\n"],"names":["distance","useRef","useState","useEffect","useCallback","element"],"mappings":"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"}
@@ -63,6 +63,7 @@ function resolveActivator(element) {
63
63
  return element.querySelector(ACTIVATOR_SELECTOR) ?? element;
64
64
  }
65
65
  const measurementAttempts = 3;
66
+ const CONTROL_BETWEEN_ROWS = "input, textarea, select, button, a, label, summary, [contenteditable], [role='textbox'], [role='searchbox'], [role='button'], [role='link'], [role='radio'], [role='checkbox'], [role='switch'], [role='slider'], [role='spinbutton'], [role='tab'], [role='radiogroup'], [role='tablist'], [role='toolbar']";
66
67
  function useFluidHover(containerRef, options = {}) {
67
68
  const { axis = "y", isItemDisabled, gapClick = true } = options;
68
69
  const gapClickMaxDistance = typeof gapClick === "object" ? gapClick.maxDistance ?? Infinity : Infinity;
@@ -228,10 +229,7 @@ function useFluidHover(containerRef, options = {}) {
228
229
  for (const element2 of itemsRef.current.values()) {
229
230
  if (element2.contains(target)) return;
230
231
  }
231
- const control = target.closest(
232
- "input, textarea, select, button, a, summary, [contenteditable], [role='textbox'], [role='searchbox'], [role='button']"
233
- );
234
- if (control) return;
232
+ if (target.closest(CONTROL_BETWEEN_ROWS)) return;
235
233
  if (gapClick === false) return;
236
234
  const index = activeIndexRef.current;
237
235
  if (index === null) return;
@@ -1 +1 @@
1
- {"version":3,"file":"use-fluid-hover.es.js","sources":["../../src/hooks/use-fluid-hover.ts"],"sourcesContent":["'use client';\n\nimport { useRef, useState, useCallback, useEffect, type Dispatch, type RefObject, type SetStateAction } from 'react';\n\nexport interface ItemRect {\n top: number;\n height: number;\n left: number;\n width: number;\n}\n\nexport interface UseFluidHoverOptions {\n /**\n * Which direction to resolve the nearest item along.\n * \"y\" — vertical lists (default): closest by top/height\n * \"x\" — horizontal strips: closest by left/width\n * \"xy\" — 2-D grids: closest card across both rows AND columns,\n * measured by Euclidean distance to each item's center\n */\n axis?: 'x' | 'y' | 'xy';\n /**\n * Makes an item invisible to hit-testing without unregistering it — for\n * rows that stay mounted while clipped away (a collapsed sub-tree).\n * Unregistering would invalidate every measurement; a skipped item keeps\n * the set stable. Consulted per mouse move, so keep it cheap.\n */\n isItemDisabled?: (element: HTMLElement) => boolean;\n /**\n * Whether a click that lands between items (a gap, the padding, past the\n * last row) is routed to the highlighted item, so what is lit is what a\n * click hits. On by default: in a menu or a list the highlight is a\n * promise about the click. Pass `false` where empty space should stay\n * inert (rows with destructive actions, generous whitespace), or\n * `{ maxDistance }` to route only clicks within that many pixels of the\n * highlighted item's edge.\n */\n gapClick?: boolean | { maxDistance?: number };\n}\n\nexport interface UseFluidHoverReturn {\n activeIndex: number | null;\n setActiveIndex: Dispatch<SetStateAction<number | null>>;\n itemRects: ItemRect[];\n /**\n * True once every registered item has been measured and no remeasure is\n * pending, i.e. `itemRects` describes the current item set. Gate absolutely\n * positioned overlays on it: an overlay that mounts against a rect a later\n * pass still corrects animates from the wrong place to the right one, which\n * reads as the highlight sliding in from another row.\n */\n isMeasured: boolean;\n sessionRef: RefObject<number>;\n /**\n * Events whose target sits outside the container in the DOM are ignored:\n * React bubbles events from a portaled child (a submenu) through its React\n * parents, and those must not steer or click this list.\n */\n handlers: {\n onMouseMove: (e: React.MouseEvent) => void;\n onMouseEnter: (e: React.MouseEvent) => void;\n onMouseLeave: (e: React.MouseEvent) => void;\n /**\n * Routes a click that lands between items (a gap, the padding, past the\n * last row) to the highlighted item, so the highlight and the click agree:\n * what is lit is what a click hits. A click inside an item is left to the\n * item. Disabled items (`isItemDisabled`) are never activated.\n */\n onClick: (e: React.MouseEvent) => void;\n };\n registerItem: (index: number, element: HTMLElement | null) => void;\n /**\n * Invalidates the published rects and runs the hook's coalesced measurement\n * pass again, holding `isMeasured` false until it settles. Reach for it when\n * the rects may be wrong and showing an overlay against them would misplace\n * it: a popup that stays mounted between opens keeps its items registered,\n * so nothing else would notice that its rects were taken while it was\n * hidden. Registration, item resize, and container resize already trigger\n * a pass; do not call this on `children` changes.\n */\n remeasure: () => void;\n /**\n * Re-reads the rects synchronously, keeping `isMeasured` as it is. Only for\n * layout that moves the rows under a visible overlay frame by frame (the\n * accordion re-measures inside its height animation). Everything else\n * wants `remeasure`, or nothing.\n */\n measureItems: () => void;\n}\n\nexport interface PickNearestInput {\n axis: 'x' | 'y' | 'xy';\n /** The pointer, in viewport coordinates. */\n point: { x: number; y: number };\n /** Item rects in the container's layout space (sparse: unregistered slots\n * are undefined). */\n rects: readonly (ItemRect | undefined)[];\n /** The container's bounding rect and live scroll / border offsets, which\n * map layout rects into the pointer's viewport space. */\n containerRect: { left: number; top: number; width: number; height: number };\n scroll: { x: number; y: number };\n border: { x: number; y: number };\n /** Layout size of the container, so a cumulative ancestor `transform:\n * scale` (a popup mid scale-in) can be factored out per axis. */\n layoutSize: { width: number; height: number };\n /** Skips an item without unregistering it. */\n isDisabled?: (index: number) => boolean;\n}\n\n/**\n * The rule, as one pure function: an item the pointer is inside wins;\n * otherwise the item whose center is nearest does, so a pointer in a gap, in\n * the padding, or past the last row still lands. `y` and `x` measure one\n * coordinate; `xy` measures the straight line to each center. Ties keep the\n * first item. The hook calls this once per animation frame; the docs page\n * times it.\n */\nexport function pickNearest({\n axis,\n point,\n rects,\n containerRect,\n scroll,\n border,\n layoutSize,\n isDisabled,\n}: PickNearestInput): number | null {\n const scaleX = layoutSize.width > 0 ? containerRect.width / layoutSize.width : 1;\n const scaleY = layoutSize.height > 0 ? containerRect.height / layoutSize.height : 1;\n let closestIndex: number | null = null;\n let closestDistance = Infinity;\n let containingIndex: number | null = null;\n\n for (let index = 0; index < rects.length; index++) {\n const r = rects[index];\n if (!r) continue;\n if (isDisabled?.(index)) continue;\n\n if (axis === 'xy') {\n const left = containerRect.left + (border.x + r.left - scroll.x) * scaleX;\n const top = containerRect.top + (border.y + r.top - scroll.y) * scaleY;\n const width = r.width * scaleX;\n const height = r.height * scaleY;\n if (point.x >= left && point.x <= left + width && point.y >= top && point.y <= top + height) {\n containingIndex = index;\n }\n const distance = Math.hypot(point.x - (left + width / 2), point.y - (top + height / 2));\n if (distance < closestDistance) {\n closestDistance = distance;\n closestIndex = index;\n }\n continue;\n }\n\n const horizontal = axis === 'x';\n const mousePos = horizontal ? point.x : point.y;\n const scale = horizontal ? scaleX : scaleY;\n const itemStart =\n (horizontal ? containerRect.left : containerRect.top) +\n ((horizontal ? border.x : border.y) + (horizontal ? r.left : r.top) - (horizontal ? scroll.x : scroll.y)) * scale;\n const itemSize = (horizontal ? r.width : r.height) * scale;\n if (mousePos >= itemStart && mousePos <= itemStart + itemSize) {\n containingIndex = index;\n }\n const distance = Math.abs(mousePos - (itemStart + itemSize / 2));\n if (distance < closestDistance) {\n closestDistance = distance;\n closestIndex = index;\n }\n }\n\n return containingIndex ?? closestIndex;\n}\n\n/** Set on the highlighted item (boolean attribute). */\nexport const ACTIVE_ATTR = 'data-fluid-hover-active';\n/** Set on the container: the highlighted index, or absent. */\nexport const ACTIVE_INDEX_ATTR = 'data-fluid-hover-active-index';\n\n/** False for an event bubbled through React from a portal outside the container, and for a detached target. */\nfunction isFromInside(e: React.SyntheticEvent) {\n return e.target instanceof Node && e.currentTarget.contains(e.target);\n}\n\nconst ACTIVATOR_SELECTOR =\n \"a[href], button, [role='menuitem'], [role='menuitemradio'], [role='menuitemcheckbox'], [role='option'], [role='radio'], [role='checkbox'], [role='tab'], [role='link'], [role='button']\";\n\n/**\n * The element a routed click should land on. A registered item is usually\n * the interactive row itself; when it is only a box around one (a sidebar\n * row around its button, a card around its link), the first control inside\n * is what a real click on the row would have reached.\n */\nfunction resolveActivator(element: HTMLElement): HTMLElement {\n if (element.matches(ACTIVATOR_SELECTOR) || element.hasAttribute('tabindex')) {\n return element;\n }\n return element.querySelector<HTMLElement>(ACTIVATOR_SELECTOR) ?? element;\n}\n\n/**\n * How many frames the coalesced remeasure retries while the registered items\n * still have no layout box. A popup can be in the DOM one frame before it is\n * laid out; retrying beats publishing zeroed rects, and the cap keeps a list\n * that stays hidden for good from spinning frames forever.\n */\nconst measurementAttempts = 3;\n\nexport function useFluidHover<T extends HTMLElement>(\n containerRef: RefObject<T | null>,\n options: UseFluidHoverOptions = {},\n): UseFluidHoverReturn {\n const { axis = 'y', isItemDisabled, gapClick = true } = options;\n const gapClickMaxDistance = typeof gapClick === 'object' ? (gapClick.maxDistance ?? Infinity) : Infinity;\n const itemsRef = useRef(new Map<number, HTMLElement>());\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n // Mirrored for handlers that read it outside a render (the gap click).\n const activeIndexRef = useRef<number | null>(null);\n activeIndexRef.current = activeIndex;\n\n // The state, in the DOM: `data-fluid-hover-active` on the highlighted item\n // and `data-fluid-hover-active-index` on the container. Devtools shows it\n // and a test asserts on it without waiting for a frame. React does not\n // manage these attributes, so it never clobbers them.\n useEffect(() => {\n const container = containerRef.current;\n if (activeIndex === null) container?.removeAttribute(ACTIVE_INDEX_ATTR);\n else container?.setAttribute(ACTIVE_INDEX_ATTR, String(activeIndex));\n const active = activeIndex === null ? undefined : itemsRef.current.get(activeIndex);\n active?.setAttribute(ACTIVE_ATTR, '');\n return () => {\n active?.removeAttribute(ACTIVE_ATTR);\n // A row that re-registered under this index while it was highlighted\n // (a remount under a new key) was marked by registerItem, not by this\n // effect: drop the mark from whatever element holds the index now.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- itemsRef is a registry Map, reading it at cleanup is the point\n if (activeIndex !== null) itemsRef.current.get(activeIndex)?.removeAttribute(ACTIVE_ATTR);\n };\n }, [activeIndex, containerRef]);\n const [itemRects, setItemRects] = useState<ItemRect[]>([]);\n const [isMeasured, setIsMeasured] = useState(false);\n const itemRectsRef = useRef<ItemRect[]>([]);\n const sessionRef = useRef(0);\n const rafIdRef = useRef<number | null>(null);\n const remeasureRafIdRef = useRef<number | null>(null);\n\n /**\n * Publishes a rect for every registered item. Returns false when the\n * measurement could not be completed (no container, or an item without a\n * layout box) — nothing is published in that case, so the last complete\n * measurement stands instead of being overwritten with zeroes.\n */\n const runMeasurement = useCallback(() => {\n const container = containerRef.current;\n if (!container) return false;\n const rects: ItemRect[] = [];\n let everyItemHasLayout = true;\n itemsRef.current.forEach((element, index) => {\n // An element inside a display:none / not-yet-laid-out popup has no\n // offsetParent and reports every offset as 0. Publishing that would pin\n // overlays to the top of the list, so treat the whole pass as\n // incomplete. A boxless element is the only case: `position: fixed`\n // items also have no offsetParent but do have a size.\n const hasLayoutBox = element.offsetParent !== null || element.offsetWidth > 0 || element.offsetHeight > 0;\n if (!hasLayoutBox) {\n everyItemHasLayout = false;\n return;\n }\n // Use offset* instead of getBoundingClientRect so measurements are\n // unaffected by CSS transforms (e.g. scaleY animation on the parent\n // motion.div). offsetTop/offsetLeft are layout values relative to the\n // offsetParent (the scroll container), matching the coordinate space\n // used by `position: absolute` children. Items nested inside positioned\n // descendants of the container (a sidebar sub-menu's rows live inside a\n // positioned row) accumulate those ancestors' offsets, so every rect\n // lands in the container's own coordinate space; for a flat list the\n // loop never runs and this is exactly the plain offsetTop/offsetLeft.\n let top = element.offsetTop;\n let left = element.offsetLeft;\n let ancestor = element.offsetParent;\n while (ancestor instanceof HTMLElement && ancestor !== container && container.contains(ancestor)) {\n top += ancestor.offsetTop + ancestor.clientTop;\n left += ancestor.offsetLeft + ancestor.clientLeft;\n ancestor = ancestor.offsetParent;\n }\n rects[index] = {\n top,\n height: element.offsetHeight,\n left,\n width: element.offsetWidth,\n };\n });\n if (!everyItemHasLayout) return false;\n // Skip the state update when nothing moved (a cheap top/left/width/height\n // compare) so redundant remeasures don't churn re-renders.\n const prev = itemRectsRef.current;\n let changed = prev.length !== rects.length;\n for (let i = 0; !changed && i < rects.length; i++) {\n const p = prev[i];\n const r = rects[i];\n if (p === r) continue; // both undefined (sparse slot)\n changed = !p || !r || p.top !== r.top || p.left !== r.left || p.width !== r.width || p.height !== r.height;\n }\n if (changed) {\n itemRectsRef.current = rects;\n setItemRects(rects);\n }\n return true;\n }, [containerRef]);\n\n const measureItems = useCallback(() => {\n runMeasurement();\n }, [runMeasurement]);\n\n /**\n * The hook's single measurement pass: coalesces every trigger (item\n * registration, container resize) into one remeasure on the next frame and\n * is the only place readiness is reported, so `isMeasured` can never turn\n * true while another pass is still queued.\n */\n const scheduleMeasurement = useCallback(\n (attemptsLeft: number) => {\n if (remeasureRafIdRef.current !== null) {\n cancelAnimationFrame(remeasureRafIdRef.current);\n }\n remeasureRafIdRef.current = requestAnimationFrame(() => {\n remeasureRafIdRef.current = null;\n if (runMeasurement()) {\n setIsMeasured(true);\n } else if (attemptsLeft > 1) {\n scheduleMeasurement(attemptsLeft - 1);\n }\n });\n },\n [runMeasurement],\n );\n\n const remeasure = useCallback(() => {\n // Readiness drops first: until the pass below settles, the published rects\n // may not describe what is on screen, and an overlay positioned from them\n // would be corrected after mounting — which animates as a slide.\n setIsMeasured(false);\n scheduleMeasurement(measurementAttempts);\n }, [scheduleMeasurement]);\n\n // Observes the registered items themselves (not just the container): rows\n // that change size in place — e.g. the site-wide size step flipping while a\n // selection background is up — must invalidate the published rects even when\n // the container the effect below captured has since been remounted and the\n // ref points at a different element than the one being observed.\n const itemRoRef = useRef<ResizeObserver | null>(null);\n const getItemRo = useCallback(() => {\n if (itemRoRef.current === null && typeof ResizeObserver !== 'undefined') {\n itemRoRef.current = new ResizeObserver(() => scheduleMeasurement(measurementAttempts));\n }\n return itemRoRef.current;\n }, [scheduleMeasurement]);\n\n const registerItem = useCallback(\n (index: number, element: HTMLElement | null) => {\n if (element) {\n itemsRef.current.set(index, element);\n getItemRo()?.observe(element);\n if (index === activeIndexRef.current) element.setAttribute(ACTIVE_ATTR, '');\n } else {\n const previous = itemsRef.current.get(index);\n if (previous) itemRoRef.current?.unobserve(previous);\n // The mark leaves with the element: a row that only moved to another\n // index (a filtering list re-ordering) must not carry it there.\n previous?.removeAttribute(ACTIVE_ATTR);\n itemsRef.current.delete(index);\n // The highlighted row is gone: nothing should stay lit or receive a\n // routed click until the pointer picks again. Decided when the\n // update applies, after this commit's registrations, so a row that\n // only moved index hands the highlight to the row now under it.\n if (index === activeIndexRef.current) {\n setActiveIndex(current => (current === index && !itemsRef.current.has(index) ? null : current));\n }\n }\n // Coalesce rapid register/unregister calls (e.g. when an AnimatePresence\n // remounts a list of rows) into a single remeasure on the next frame,\n // so consumers don't have to manually call measureItems after the\n // container's children swap. A lit row keeps its element (unregistering\n // it clears the highlight), so its rect stays good while the pass runs:\n // dropping readiness then would blink the highlight every time a\n // virtualized list mounts a row while scrolling.\n if (activeIndexRef.current === null) remeasure();\n else scheduleMeasurement(measurementAttempts);\n },\n [remeasure, scheduleMeasurement, getItemRo],\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n if (!isFromInside(e)) return;\n const mouseX = e.clientX;\n const mouseY = e.clientY;\n\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n }\n\n rafIdRef.current = requestAnimationFrame(() => {\n rafIdRef.current = null;\n const container = containerRef.current;\n if (!container) return;\n setActiveIndex(\n pickNearest({\n axis,\n point: { x: mouseX, y: mouseY },\n rects: itemRectsRef.current,\n containerRect: container.getBoundingClientRect(),\n scroll: { x: container.scrollLeft, y: container.scrollTop },\n border: { x: container.clientLeft, y: container.clientTop },\n layoutSize: { width: container.offsetWidth, height: container.offsetHeight },\n isDisabled: isItemDisabled\n ? index => {\n const el = itemsRef.current.get(index);\n return !!el && isItemDisabled(el);\n }\n : undefined,\n }),\n );\n });\n },\n [axis, containerRef, isItemDisabled],\n );\n\n const handleMouseEnter = useCallback((e: React.MouseEvent) => {\n if (!isFromInside(e)) return;\n sessionRef.current += 1;\n }, []);\n\n const handleMouseLeave = useCallback((e: React.MouseEvent) => {\n if (!isFromInside(e)) return;\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n setActiveIndex(null);\n }, []);\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n // Outside the container in the DOM: a portaled child's click, or a row\n // that unmounted while its own click was still bubbling (a pick whose\n // primitive re-renders the list synchronously). Neither is a gap.\n const { target } = e;\n if (!(target instanceof Element) || !isFromInside(e)) return;\n // Inside an item: the item owns the click.\n for (const element of itemsRef.current.values()) {\n if (element.contains(target)) return;\n }\n // A control that sits between the rows (a search field at the top of\n // a menu, a footer button) keeps its own click too.\n const control = target.closest(\n \"input, textarea, select, button, a, summary, [contenteditable], [role='textbox'], [role='searchbox'], [role='button']\",\n );\n if (control) return;\n if (gapClick === false) return;\n const index = activeIndexRef.current;\n if (index === null) return;\n const element = itemsRef.current.get(index);\n if (!element || isItemDisabled?.(element)) return;\n if (gapClickMaxDistance !== Infinity) {\n const r = element.getBoundingClientRect();\n const dx = Math.max(r.left - e.clientX, 0, e.clientX - r.right);\n const dy = Math.max(r.top - e.clientY, 0, e.clientY - r.bottom);\n if (Math.hypot(dx, dy) > gapClickMaxDistance) return;\n }\n // A real DOM click on the item, so its own handlers (and the primitive\n // wrapping it, if any) run exactly as if the pointer had been inside.\n resolveActivator(element).click();\n },\n [isItemDisabled, gapClick, gapClickMaxDistance],\n );\n\n // Remeasure when the container resizes — a reflow moves items even though\n // the registered set is unchanged, which would otherwise leave itemRects\n // stale. Coalesced through the same rAF as register/unregister. Readiness is\n // deliberately not dropped: the item set is unchanged, so the published rects\n // stay usable, and hiding overlays on every reflow would flicker them.\n useEffect(() => {\n const container = containerRef.current;\n if (!container || typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(() => scheduleMeasurement(measurementAttempts));\n ro.observe(container);\n return () => ro.disconnect();\n }, [containerRef, scheduleMeasurement]);\n\n // Clean up rAF and the item observer on unmount\n useEffect(() => {\n return () => {\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n }\n if (remeasureRafIdRef.current !== null) {\n cancelAnimationFrame(remeasureRafIdRef.current);\n }\n itemRoRef.current?.disconnect();\n itemRoRef.current = null;\n };\n }, []);\n\n return {\n activeIndex,\n setActiveIndex,\n itemRects,\n isMeasured,\n sessionRef,\n handlers: {\n onMouseMove: handleMouseMove,\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n onClick: handleClick,\n },\n registerItem,\n remeasure,\n measureItems,\n };\n}\n\n/**\n * Registers an item's element with its list for as long as it is mounted.\n * The one way rows join a list: pass the hook's `registerItem` (or the copy\n * a context hands down), the row's index, and its ref. Either may be\n * missing for a row rendered outside a list (a standalone card, an accordion\n * item that is not grouped); then nothing is registered.\n */\nexport function useRegisterFluidHoverItem(\n registerItem: ((index: number, element: HTMLElement | null) => void) | undefined,\n index: number | undefined,\n ref: RefObject<HTMLElement | null>,\n) {\n useEffect(() => {\n if (!registerItem || index === undefined) return;\n registerItem(index, ref.current);\n return () => registerItem(index, null);\n }, [index, registerItem, ref]);\n}\n"],"names":["distance","element"],"mappings":"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"}
1
+ {"version":3,"file":"use-fluid-hover.es.js","sources":["../../src/hooks/use-fluid-hover.ts"],"sourcesContent":["'use client';\n\nimport { useRef, useState, useCallback, useEffect, type Dispatch, type RefObject, type SetStateAction } from 'react';\n\nexport interface ItemRect {\n top: number;\n height: number;\n left: number;\n width: number;\n}\n\nexport interface UseFluidHoverOptions {\n /**\n * Which direction to resolve the nearest item along.\n * \"y\" — vertical lists (default): closest by top/height\n * \"x\" — horizontal strips: closest by left/width\n * \"xy\" — 2-D grids: closest card across both rows AND columns,\n * measured by Euclidean distance to each item's center\n */\n axis?: 'x' | 'y' | 'xy';\n /**\n * Makes an item invisible to hit-testing without unregistering it — for\n * rows that stay mounted while clipped away (a collapsed sub-tree).\n * Unregistering would invalidate every measurement; a skipped item keeps\n * the set stable. Consulted per mouse move, so keep it cheap.\n */\n isItemDisabled?: (element: HTMLElement) => boolean;\n /**\n * Whether a click that lands between items (a gap, the padding, past the\n * last row) is routed to the highlighted item, so what is lit is what a\n * click hits. On by default: in a menu or a list the highlight is a\n * promise about the click. Pass `false` where empty space should stay\n * inert (rows with destructive actions, generous whitespace), or\n * `{ maxDistance }` to route only clicks within that many pixels of the\n * highlighted item's edge.\n */\n gapClick?: boolean | { maxDistance?: number };\n}\n\nexport interface UseFluidHoverReturn {\n activeIndex: number | null;\n setActiveIndex: Dispatch<SetStateAction<number | null>>;\n itemRects: ItemRect[];\n /**\n * True once every registered item has been measured and no remeasure is\n * pending, i.e. `itemRects` describes the current item set. Gate absolutely\n * positioned overlays on it: an overlay that mounts against a rect a later\n * pass still corrects animates from the wrong place to the right one, which\n * reads as the highlight sliding in from another row.\n */\n isMeasured: boolean;\n sessionRef: RefObject<number>;\n /**\n * Events whose target sits outside the container in the DOM are ignored:\n * React bubbles events from a portaled child (a submenu) through its React\n * parents, and those must not steer or click this list.\n */\n handlers: {\n onMouseMove: (e: React.MouseEvent) => void;\n onMouseEnter: (e: React.MouseEvent) => void;\n onMouseLeave: (e: React.MouseEvent) => void;\n /**\n * Routes a click that lands between items (a gap, the padding, past the\n * last row) to the highlighted item, so the highlight and the click agree:\n * what is lit is what a click hits. A click inside an item is left to the\n * item. Disabled items (`isItemDisabled`) are never activated.\n */\n onClick: (e: React.MouseEvent) => void;\n };\n registerItem: (index: number, element: HTMLElement | null) => void;\n /**\n * Invalidates the published rects and runs the hook's coalesced measurement\n * pass again, holding `isMeasured` false until it settles. Reach for it when\n * the rects may be wrong and showing an overlay against them would misplace\n * it: a popup that stays mounted between opens keeps its items registered,\n * so nothing else would notice that its rects were taken while it was\n * hidden. Registration, item resize, and container resize already trigger\n * a pass; do not call this on `children` changes.\n */\n remeasure: () => void;\n /**\n * Re-reads the rects synchronously, keeping `isMeasured` as it is. Only for\n * layout that moves the rows under a visible overlay frame by frame (the\n * accordion re-measures inside its height animation). Everything else\n * wants `remeasure`, or nothing.\n */\n measureItems: () => void;\n}\n\nexport interface PickNearestInput {\n axis: 'x' | 'y' | 'xy';\n /** The pointer, in viewport coordinates. */\n point: { x: number; y: number };\n /** Item rects in the container's layout space (sparse: unregistered slots\n * are undefined). */\n rects: readonly (ItemRect | undefined)[];\n /** The container's bounding rect and live scroll / border offsets, which\n * map layout rects into the pointer's viewport space. */\n containerRect: { left: number; top: number; width: number; height: number };\n scroll: { x: number; y: number };\n border: { x: number; y: number };\n /** Layout size of the container, so a cumulative ancestor `transform:\n * scale` (a popup mid scale-in) can be factored out per axis. */\n layoutSize: { width: number; height: number };\n /** Skips an item without unregistering it. */\n isDisabled?: (index: number) => boolean;\n}\n\n/**\n * The rule, as one pure function: an item the pointer is inside wins;\n * otherwise the item whose center is nearest does, so a pointer in a gap, in\n * the padding, or past the last row still lands. `y` and `x` measure one\n * coordinate; `xy` measures the straight line to each center. Ties keep the\n * first item. The hook calls this once per animation frame; the docs page\n * times it.\n */\nexport function pickNearest({\n axis,\n point,\n rects,\n containerRect,\n scroll,\n border,\n layoutSize,\n isDisabled,\n}: PickNearestInput): number | null {\n const scaleX = layoutSize.width > 0 ? containerRect.width / layoutSize.width : 1;\n const scaleY = layoutSize.height > 0 ? containerRect.height / layoutSize.height : 1;\n let closestIndex: number | null = null;\n let closestDistance = Infinity;\n let containingIndex: number | null = null;\n\n for (let index = 0; index < rects.length; index++) {\n const r = rects[index];\n if (!r) continue;\n if (isDisabled?.(index)) continue;\n\n if (axis === 'xy') {\n const left = containerRect.left + (border.x + r.left - scroll.x) * scaleX;\n const top = containerRect.top + (border.y + r.top - scroll.y) * scaleY;\n const width = r.width * scaleX;\n const height = r.height * scaleY;\n if (point.x >= left && point.x <= left + width && point.y >= top && point.y <= top + height) {\n containingIndex = index;\n }\n const distance = Math.hypot(point.x - (left + width / 2), point.y - (top + height / 2));\n if (distance < closestDistance) {\n closestDistance = distance;\n closestIndex = index;\n }\n continue;\n }\n\n const horizontal = axis === 'x';\n const mousePos = horizontal ? point.x : point.y;\n const scale = horizontal ? scaleX : scaleY;\n const itemStart =\n (horizontal ? containerRect.left : containerRect.top) +\n ((horizontal ? border.x : border.y) + (horizontal ? r.left : r.top) - (horizontal ? scroll.x : scroll.y)) * scale;\n const itemSize = (horizontal ? r.width : r.height) * scale;\n if (mousePos >= itemStart && mousePos <= itemStart + itemSize) {\n containingIndex = index;\n }\n const distance = Math.abs(mousePos - (itemStart + itemSize / 2));\n if (distance < closestDistance) {\n closestDistance = distance;\n closestIndex = index;\n }\n }\n\n return containingIndex ?? closestIndex;\n}\n\n/** Set on the highlighted item (boolean attribute). */\nexport const ACTIVE_ATTR = 'data-fluid-hover-active';\n/** Set on the container: the highlighted index, or absent. */\nexport const ACTIVE_INDEX_ATTR = 'data-fluid-hover-active-index';\n\n/** False for an event bubbled through React from a portal outside the container, and for a detached target. */\nfunction isFromInside(e: React.SyntheticEvent) {\n return e.target instanceof Node && e.currentTarget.contains(e.target);\n}\n\nconst ACTIVATOR_SELECTOR =\n \"a[href], button, [role='menuitem'], [role='menuitemradio'], [role='menuitemcheckbox'], [role='option'], [role='radio'], [role='checkbox'], [role='tab'], [role='link'], [role='button']\";\n\n/**\n * The element a routed click should land on. A registered item is usually\n * the interactive row itself; when it is only a box around one (a sidebar\n * row around its button, a card around its link), the first control inside\n * is what a real click on the row would have reached.\n */\nfunction resolveActivator(element: HTMLElement): HTMLElement {\n if (element.matches(ACTIVATOR_SELECTOR) || element.hasAttribute('tabindex')) {\n return element;\n }\n return element.querySelector<HTMLElement>(ACTIVATOR_SELECTOR) ?? element;\n}\n\n/**\n * How many frames the coalesced remeasure retries while the registered items\n * still have no layout box. A popup can be in the DOM one frame before it is\n * laid out; retrying beats publishing zeroed rects, and the cap keeps a list\n * that stays hidden for good from spinning frames forever.\n */\nconst measurementAttempts = 3;\n\nconst CONTROL_BETWEEN_ROWS =\n \"input, textarea, select, button, a, label, summary, [contenteditable], [role='textbox'], [role='searchbox'], [role='button'], [role='link'], [role='radio'], [role='checkbox'], [role='switch'], [role='slider'], [role='spinbutton'], [role='tab'], [role='radiogroup'], [role='tablist'], [role='toolbar']\";\n\nexport function useFluidHover<T extends HTMLElement>(\n containerRef: RefObject<T | null>,\n options: UseFluidHoverOptions = {},\n): UseFluidHoverReturn {\n const { axis = 'y', isItemDisabled, gapClick = true } = options;\n const gapClickMaxDistance = typeof gapClick === 'object' ? (gapClick.maxDistance ?? Infinity) : Infinity;\n const itemsRef = useRef(new Map<number, HTMLElement>());\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n // Mirrored for handlers that read it outside a render (the gap click).\n const activeIndexRef = useRef<number | null>(null);\n activeIndexRef.current = activeIndex;\n\n // The state, in the DOM: `data-fluid-hover-active` on the highlighted item\n // and `data-fluid-hover-active-index` on the container. Devtools shows it\n // and a test asserts on it without waiting for a frame. React does not\n // manage these attributes, so it never clobbers them.\n useEffect(() => {\n const container = containerRef.current;\n if (activeIndex === null) container?.removeAttribute(ACTIVE_INDEX_ATTR);\n else container?.setAttribute(ACTIVE_INDEX_ATTR, String(activeIndex));\n const active = activeIndex === null ? undefined : itemsRef.current.get(activeIndex);\n active?.setAttribute(ACTIVE_ATTR, '');\n return () => {\n active?.removeAttribute(ACTIVE_ATTR);\n // A row that re-registered under this index while it was highlighted\n // (a remount under a new key) was marked by registerItem, not by this\n // effect: drop the mark from whatever element holds the index now.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- itemsRef is a registry Map, reading it at cleanup is the point\n if (activeIndex !== null) itemsRef.current.get(activeIndex)?.removeAttribute(ACTIVE_ATTR);\n };\n }, [activeIndex, containerRef]);\n const [itemRects, setItemRects] = useState<ItemRect[]>([]);\n const [isMeasured, setIsMeasured] = useState(false);\n const itemRectsRef = useRef<ItemRect[]>([]);\n const sessionRef = useRef(0);\n const rafIdRef = useRef<number | null>(null);\n const remeasureRafIdRef = useRef<number | null>(null);\n\n /**\n * Publishes a rect for every registered item. Returns false when the\n * measurement could not be completed (no container, or an item without a\n * layout box) — nothing is published in that case, so the last complete\n * measurement stands instead of being overwritten with zeroes.\n */\n const runMeasurement = useCallback(() => {\n const container = containerRef.current;\n if (!container) return false;\n const rects: ItemRect[] = [];\n let everyItemHasLayout = true;\n itemsRef.current.forEach((element, index) => {\n // An element inside a display:none / not-yet-laid-out popup has no\n // offsetParent and reports every offset as 0. Publishing that would pin\n // overlays to the top of the list, so treat the whole pass as\n // incomplete. A boxless element is the only case: `position: fixed`\n // items also have no offsetParent but do have a size.\n const hasLayoutBox = element.offsetParent !== null || element.offsetWidth > 0 || element.offsetHeight > 0;\n if (!hasLayoutBox) {\n everyItemHasLayout = false;\n return;\n }\n // Use offset* instead of getBoundingClientRect so measurements are\n // unaffected by CSS transforms (e.g. scaleY animation on the parent\n // motion.div). offsetTop/offsetLeft are layout values relative to the\n // offsetParent (the scroll container), matching the coordinate space\n // used by `position: absolute` children. Items nested inside positioned\n // descendants of the container (a sidebar sub-menu's rows live inside a\n // positioned row) accumulate those ancestors' offsets, so every rect\n // lands in the container's own coordinate space; for a flat list the\n // loop never runs and this is exactly the plain offsetTop/offsetLeft.\n let top = element.offsetTop;\n let left = element.offsetLeft;\n let ancestor = element.offsetParent;\n while (ancestor instanceof HTMLElement && ancestor !== container && container.contains(ancestor)) {\n top += ancestor.offsetTop + ancestor.clientTop;\n left += ancestor.offsetLeft + ancestor.clientLeft;\n ancestor = ancestor.offsetParent;\n }\n rects[index] = {\n top,\n height: element.offsetHeight,\n left,\n width: element.offsetWidth,\n };\n });\n if (!everyItemHasLayout) return false;\n // Skip the state update when nothing moved (a cheap top/left/width/height\n // compare) so redundant remeasures don't churn re-renders.\n const prev = itemRectsRef.current;\n let changed = prev.length !== rects.length;\n for (let i = 0; !changed && i < rects.length; i++) {\n const p = prev[i];\n const r = rects[i];\n if (p === r) continue; // both undefined (sparse slot)\n changed = !p || !r || p.top !== r.top || p.left !== r.left || p.width !== r.width || p.height !== r.height;\n }\n if (changed) {\n itemRectsRef.current = rects;\n setItemRects(rects);\n }\n return true;\n }, [containerRef]);\n\n const measureItems = useCallback(() => {\n runMeasurement();\n }, [runMeasurement]);\n\n /**\n * The hook's single measurement pass: coalesces every trigger (item\n * registration, container resize) into one remeasure on the next frame and\n * is the only place readiness is reported, so `isMeasured` can never turn\n * true while another pass is still queued.\n */\n const scheduleMeasurement = useCallback(\n (attemptsLeft: number) => {\n if (remeasureRafIdRef.current !== null) {\n cancelAnimationFrame(remeasureRafIdRef.current);\n }\n remeasureRafIdRef.current = requestAnimationFrame(() => {\n remeasureRafIdRef.current = null;\n if (runMeasurement()) {\n setIsMeasured(true);\n } else if (attemptsLeft > 1) {\n scheduleMeasurement(attemptsLeft - 1);\n }\n });\n },\n [runMeasurement],\n );\n\n const remeasure = useCallback(() => {\n // Readiness drops first: until the pass below settles, the published rects\n // may not describe what is on screen, and an overlay positioned from them\n // would be corrected after mounting — which animates as a slide.\n setIsMeasured(false);\n scheduleMeasurement(measurementAttempts);\n }, [scheduleMeasurement]);\n\n // Observes the registered items themselves (not just the container): rows\n // that change size in place — e.g. the site-wide size step flipping while a\n // selection background is up — must invalidate the published rects even when\n // the container the effect below captured has since been remounted and the\n // ref points at a different element than the one being observed.\n const itemRoRef = useRef<ResizeObserver | null>(null);\n const getItemRo = useCallback(() => {\n if (itemRoRef.current === null && typeof ResizeObserver !== 'undefined') {\n itemRoRef.current = new ResizeObserver(() => scheduleMeasurement(measurementAttempts));\n }\n return itemRoRef.current;\n }, [scheduleMeasurement]);\n\n const registerItem = useCallback(\n (index: number, element: HTMLElement | null) => {\n if (element) {\n itemsRef.current.set(index, element);\n getItemRo()?.observe(element);\n if (index === activeIndexRef.current) element.setAttribute(ACTIVE_ATTR, '');\n } else {\n const previous = itemsRef.current.get(index);\n if (previous) itemRoRef.current?.unobserve(previous);\n // The mark leaves with the element: a row that only moved to another\n // index (a filtering list re-ordering) must not carry it there.\n previous?.removeAttribute(ACTIVE_ATTR);\n itemsRef.current.delete(index);\n // The highlighted row is gone: nothing should stay lit or receive a\n // routed click until the pointer picks again. Decided when the\n // update applies, after this commit's registrations, so a row that\n // only moved index hands the highlight to the row now under it.\n if (index === activeIndexRef.current) {\n setActiveIndex(current => (current === index && !itemsRef.current.has(index) ? null : current));\n }\n }\n // Coalesce rapid register/unregister calls (e.g. when an AnimatePresence\n // remounts a list of rows) into a single remeasure on the next frame,\n // so consumers don't have to manually call measureItems after the\n // container's children swap. A lit row keeps its element (unregistering\n // it clears the highlight), so its rect stays good while the pass runs:\n // dropping readiness then would blink the highlight every time a\n // virtualized list mounts a row while scrolling.\n if (activeIndexRef.current === null) remeasure();\n else scheduleMeasurement(measurementAttempts);\n },\n [remeasure, scheduleMeasurement, getItemRo],\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n if (!isFromInside(e)) return;\n const mouseX = e.clientX;\n const mouseY = e.clientY;\n\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n }\n\n rafIdRef.current = requestAnimationFrame(() => {\n rafIdRef.current = null;\n const container = containerRef.current;\n if (!container) return;\n setActiveIndex(\n pickNearest({\n axis,\n point: { x: mouseX, y: mouseY },\n rects: itemRectsRef.current,\n containerRect: container.getBoundingClientRect(),\n scroll: { x: container.scrollLeft, y: container.scrollTop },\n border: { x: container.clientLeft, y: container.clientTop },\n layoutSize: { width: container.offsetWidth, height: container.offsetHeight },\n isDisabled: isItemDisabled\n ? index => {\n const el = itemsRef.current.get(index);\n return !!el && isItemDisabled(el);\n }\n : undefined,\n }),\n );\n });\n },\n [axis, containerRef, isItemDisabled],\n );\n\n const handleMouseEnter = useCallback((e: React.MouseEvent) => {\n if (!isFromInside(e)) return;\n sessionRef.current += 1;\n }, []);\n\n const handleMouseLeave = useCallback((e: React.MouseEvent) => {\n if (!isFromInside(e)) return;\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n setActiveIndex(null);\n }, []);\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n // Outside the container in the DOM: a portaled child's click, or a row\n // that unmounted while its own click was still bubbling (a pick whose\n // primitive re-renders the list synchronously). Neither is a gap.\n const { target } = e;\n if (!(target instanceof Element) || !isFromInside(e)) return;\n // Inside an item: the item owns the click.\n for (const element of itemsRef.current.values()) {\n if (element.contains(target)) return;\n }\n // A control that sits between the rows (a search field at the top of\n // a menu, a footer button, a theme toggle) keeps its own click too.\n if (target.closest(CONTROL_BETWEEN_ROWS)) return;\n if (gapClick === false) return;\n const index = activeIndexRef.current;\n if (index === null) return;\n const element = itemsRef.current.get(index);\n if (!element || isItemDisabled?.(element)) return;\n if (gapClickMaxDistance !== Infinity) {\n const r = element.getBoundingClientRect();\n const dx = Math.max(r.left - e.clientX, 0, e.clientX - r.right);\n const dy = Math.max(r.top - e.clientY, 0, e.clientY - r.bottom);\n if (Math.hypot(dx, dy) > gapClickMaxDistance) return;\n }\n // A real DOM click on the item, so its own handlers (and the primitive\n // wrapping it, if any) run exactly as if the pointer had been inside.\n resolveActivator(element).click();\n },\n [isItemDisabled, gapClick, gapClickMaxDistance],\n );\n\n // Remeasure when the container resizes — a reflow moves items even though\n // the registered set is unchanged, which would otherwise leave itemRects\n // stale. Coalesced through the same rAF as register/unregister. Readiness is\n // deliberately not dropped: the item set is unchanged, so the published rects\n // stay usable, and hiding overlays on every reflow would flicker them.\n useEffect(() => {\n const container = containerRef.current;\n if (!container || typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(() => scheduleMeasurement(measurementAttempts));\n ro.observe(container);\n return () => ro.disconnect();\n }, [containerRef, scheduleMeasurement]);\n\n // Clean up rAF and the item observer on unmount\n useEffect(() => {\n return () => {\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n }\n if (remeasureRafIdRef.current !== null) {\n cancelAnimationFrame(remeasureRafIdRef.current);\n }\n itemRoRef.current?.disconnect();\n itemRoRef.current = null;\n };\n }, []);\n\n return {\n activeIndex,\n setActiveIndex,\n itemRects,\n isMeasured,\n sessionRef,\n handlers: {\n onMouseMove: handleMouseMove,\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n onClick: handleClick,\n },\n registerItem,\n remeasure,\n measureItems,\n };\n}\n\n/**\n * Registers an item's element with its list for as long as it is mounted.\n * The one way rows join a list: pass the hook's `registerItem` (or the copy\n * a context hands down), the row's index, and its ref. Either may be\n * missing for a row rendered outside a list (a standalone card, an accordion\n * item that is not grouped); then nothing is registered.\n */\nexport function useRegisterFluidHoverItem(\n registerItem: ((index: number, element: HTMLElement | null) => void) | undefined,\n index: number | undefined,\n ref: RefObject<HTMLElement | null>,\n) {\n useEffect(() => {\n if (!registerItem || index === undefined) return;\n registerItem(index, ref.current);\n return () => registerItem(index, null);\n }, [index, registerItem, ref]);\n}\n"],"names":["distance","element"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsx } from 'react/jsx-runtime';
2
2
  import { c as cva } from './index-Dubp6Qv4.js';
3
3
  import * as React from 'react';
4
4
  import { controlSizeClasses } from './primitives/control-size.es.js';
5
- import { resolveFieldVariant, unstyledFormElementStyle, sharedFormElementDisabledStyle, inputSurfaceAndFocusStyle } from './primitives/form-element.es.js';
5
+ import { fieldErrorRim, resolveFieldVariant, unstyledFormElementStyle, sharedFormElementDisabledStyle, inputSurfaceAndFocusStyle } from './primitives/form-element.es.js';
6
6
  import { controlStateColorTransition } from './primitives/transitions.es.js';
7
7
  import { c as cn } from './cn-65Adrsfj.js';
8
8
 
@@ -51,7 +51,7 @@ const Input = React.forwardRef(
51
51
  type,
52
52
  className: cn(
53
53
  inputVariants({ variant: resolveFieldVariant(variant), size }),
54
- error && "border-destructive focus-visible:border-destructive",
54
+ error && fieldErrorRim,
55
55
  className
56
56
  ),
57
57
  "data-testid": testId,
@@ -65,4 +65,4 @@ const Input = React.forwardRef(
65
65
  Input.displayName = "Input";
66
66
 
67
67
  export { Input as I };
68
- //# sourceMappingURL=input-B1RysHyq.js.map
68
+ //# sourceMappingURL=input-CHghVv3k.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-CHghVv3k.js","sources":["../src/ds/components/Input/input.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport type { VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { controlSizeClasses } from '@/ds/primitives/control-size';\nimport {\n fieldErrorRim,\n inputSurfaceAndFocusStyle,\n resolveFieldVariant,\n sharedFormElementDisabledStyle,\n unstyledFormElementStyle,\n} from '@/ds/primitives/form-element';\nimport type { DeprecatedFilledVariant } from '@/ds/primitives/form-element';\nimport { controlStateColorTransition } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nconst inputVariants = cva(\n cn(\n // A text field is a block control: it fills its field. Content-sized controls (a\n // Select or Combobox trigger, a Button) do the opposite and let the call site grow them.\n 'flex w-full text-ellipsis text-foreground',\n controlStateColorTransition,\n 'placeholder:text-muted-foreground placeholder:transition-opacity placeholder:duration-normal',\n 'focus:placeholder:opacity-70 motion-reduce:placeholder:transition-none',\n // type=\"number\": hide native browser spinner arrows (they clip the pill).\n // For incrementable numeric inputs, compose <InputGroup> with +/- buttons\n // instead — 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 the DS owns the search chrome.\n // Compose an <InputGroup> with an InputGroupButton to add a clear control.\n '[&::-webkit-search-cancel-button]:appearance-none',\n ),\n {\n variants: {\n variant: {\n default: cn(inputSurfaceAndFocusStyle, 'rounded-full', sharedFormElementDisabledStyle),\n unstyled: unstyledFormElementStyle,\n },\n size: {\n sm: cn(controlSizeClasses.sm, 'px-[.75em]'),\n md: cn(controlSizeClasses.md, 'px-[.75em]'),\n lg: cn(controlSizeClasses.lg, 'px-[.85em]'),\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n },\n },\n);\n\nexport type InputProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> &\n Omit<VariantProps<typeof inputVariants>, 'variant'> & {\n /** `filled` is a deprecated alias for `default`; both render the filled surface. */\n variant?: VariantProps<typeof inputVariants>['variant'] | DeprecatedFilledVariant;\n testId?: string;\n error?: boolean;\n };\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, size, testId, variant, type, error, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n inputVariants({ variant: resolveFieldVariant(variant), size }),\n error && fieldErrorRim,\n className,\n )}\n data-testid={testId}\n ref={ref}\n aria-invalid={error}\n {...props}\n />\n );\n },\n);\nInput.displayName = 'Input';\n\nexport { Input };\n"],"names":[],"mappings":";;;;;;;;AAgBA,MAAM,aAAA,GAAgB,GAAA;AAAA,EACpB,EAAA;AAAA;AAAA;AAAA,IAGE,2CAAA;AAAA,IACA,2BAAA;AAAA,IACA,8FAAA;AAAA,IACA,wEAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,mFAAA;AAAA,IACA,mFAAA;AAAA,IACA,yCAAA;AAAA;AAAA;AAAA,IAGA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,EAAA,CAAG,yBAAA,EAA2B,cAAA,EAAgB,8BAA8B,CAAA;AAAA,QACrF,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,EAAA,CAAG,kBAAA,CAAmB,EAAA,EAAI,YAAY,CAAA;AAAA,QAC1C,EAAA,EAAI,EAAA,CAAG,kBAAA,CAAmB,EAAA,EAAI,YAAY,CAAA;AAAA,QAC1C,EAAA,EAAI,EAAA,CAAG,kBAAA,CAAmB,EAAA,EAAI,YAAY;AAAA;AAC5C,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ,CAAA;AAUA,MAAM,QAAQ,KAAA,CAAM,UAAA;AAAA,EAClB,CAAC,EAAE,SAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACpE,IAAA,uBACE,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,cAAc,EAAE,OAAA,EAAS,oBAAoB,OAAO,CAAA,EAAG,MAAM,CAAA;AAAA,UAC7D,KAAA,IAAS,aAAA;AAAA,UACT;AAAA,SACF;AAAA,QACA,aAAA,EAAa,MAAA;AAAA,QACb,GAAA;AAAA,QACA,cAAA,EAAc,KAAA;AAAA,QACb,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,KAAA,CAAM,WAAA,GAAc,OAAA;;;;"}
@@ -72,7 +72,7 @@ const Input = React__namespace.forwardRef(
72
72
  type,
73
73
  className: utils_cn.cn(
74
74
  inputVariants({ variant: primitives_formElement.resolveFieldVariant(variant), size }),
75
- error && "border-destructive focus-visible:border-destructive",
75
+ error && primitives_formElement.fieldErrorRim,
76
76
  className
77
77
  ),
78
78
  "data-testid": testId,
@@ -86,4 +86,4 @@ const Input = React__namespace.forwardRef(
86
86
  Input.displayName = "Input";
87
87
 
88
88
  exports.Input = Input;
89
- //# sourceMappingURL=input-CDLMprJS.cjs.map
89
+ //# sourceMappingURL=input-bd223EJW.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-bd223EJW.cjs","sources":["../src/ds/components/Input/input.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport type { VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { controlSizeClasses } from '@/ds/primitives/control-size';\nimport {\n fieldErrorRim,\n inputSurfaceAndFocusStyle,\n resolveFieldVariant,\n sharedFormElementDisabledStyle,\n unstyledFormElementStyle,\n} from '@/ds/primitives/form-element';\nimport type { DeprecatedFilledVariant } from '@/ds/primitives/form-element';\nimport { controlStateColorTransition } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nconst inputVariants = cva(\n cn(\n // A text field is a block control: it fills its field. Content-sized controls (a\n // Select or Combobox trigger, a Button) do the opposite and let the call site grow them.\n 'flex w-full text-ellipsis text-foreground',\n controlStateColorTransition,\n 'placeholder:text-muted-foreground placeholder:transition-opacity placeholder:duration-normal',\n 'focus:placeholder:opacity-70 motion-reduce:placeholder:transition-none',\n // type=\"number\": hide native browser spinner arrows (they clip the pill).\n // For incrementable numeric inputs, compose <InputGroup> with +/- buttons\n // instead — 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 the DS owns the search chrome.\n // Compose an <InputGroup> with an InputGroupButton to add a clear control.\n '[&::-webkit-search-cancel-button]:appearance-none',\n ),\n {\n variants: {\n variant: {\n default: cn(inputSurfaceAndFocusStyle, 'rounded-full', sharedFormElementDisabledStyle),\n unstyled: unstyledFormElementStyle,\n },\n size: {\n sm: cn(controlSizeClasses.sm, 'px-[.75em]'),\n md: cn(controlSizeClasses.md, 'px-[.75em]'),\n lg: cn(controlSizeClasses.lg, 'px-[.85em]'),\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n },\n },\n);\n\nexport type InputProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> &\n Omit<VariantProps<typeof inputVariants>, 'variant'> & {\n /** `filled` is a deprecated alias for `default`; both render the filled surface. */\n variant?: VariantProps<typeof inputVariants>['variant'] | DeprecatedFilledVariant;\n testId?: string;\n error?: boolean;\n };\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, size, testId, variant, type, error, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n inputVariants({ variant: resolveFieldVariant(variant), size }),\n error && fieldErrorRim,\n className,\n )}\n data-testid={testId}\n ref={ref}\n aria-invalid={error}\n {...props}\n />\n );\n },\n);\nInput.displayName = 'Input';\n\nexport { Input };\n"],"names":["cva","cn","controlStateColorTransition","inputSurfaceAndFocusStyle","sharedFormElementDisabledStyle","unstyledFormElementStyle","controlSizeClasses","React","jsx","resolveFieldVariant","fieldErrorRim"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,MAAM,aAAA,GAAgBA,SAAA;AAAA,EACpBC,WAAA;AAAA;AAAA;AAAA,IAGE,2CAAA;AAAA,IACAC,kDAAA;AAAA,IACA,8FAAA;AAAA,IACA,wEAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,mFAAA;AAAA,IACA,mFAAA;AAAA,IACA,yCAAA;AAAA;AAAA;AAAA,IAGA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAASD,WAAA,CAAGE,gDAAA,EAA2B,cAAA,EAAgBC,qDAA8B,CAAA;AAAA,QACrF,QAAA,EAAUC;AAAA,OACZ;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,EAAA,EAAIJ,WAAA,CAAGK,yCAAA,CAAmB,EAAA,EAAI,YAAY,CAAA;AAAA,QAC1C,EAAA,EAAIL,WAAA,CAAGK,yCAAA,CAAmB,EAAA,EAAI,YAAY,CAAA;AAAA,QAC1C,EAAA,EAAIL,WAAA,CAAGK,yCAAA,CAAmB,EAAA,EAAI,YAAY;AAAA;AAC5C,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ,CAAA;AAUA,MAAM,QAAQC,gBAAA,CAAM,UAAA;AAAA,EAClB,CAAC,EAAE,SAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACpE,IAAA,uBACEC,cAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,SAAA,EAAWP,WAAA;AAAA,UACT,cAAc,EAAE,OAAA,EAASQ,2CAAoB,OAAO,CAAA,EAAG,MAAM,CAAA;AAAA,UAC7D,KAAA,IAASC,oCAAA;AAAA,UACT;AAAA,SACF;AAAA,QACA,aAAA,EAAa,MAAA;AAAA,QACb,GAAA;AAAA,QACA,cAAA,EAAc,KAAA;AAAA,QACb,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,KAAA,CAAM,WAAA,GAAc,OAAA;;;;"}
@@ -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-MMZPEb_q.cjs');
6
+ const Button = require('./Button-BAMnPqos.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');
@@ -60,7 +60,7 @@ const inputGroupClassName = utils_cn.cn(
60
60
  inputGroupBaseClassName,
61
61
  "rounded-full",
62
62
  primitives_formElement.inputSurfaceAndFocusWithinStyle,
63
- "has-[[aria-invalid=true]]:[--surface-rim:var(--destructive)]",
63
+ primitives_formElement.fieldErrorRimWithin,
64
64
  inputGroupRoundedTextareaClassName
65
65
  );
66
66
  const InputGroup = React__namespace.forwardRef(({ className, size, ...props }, ref) => {
@@ -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-DaIV9Orp.cjs.map
222
+ //# sourceMappingURL=input-group-BfnJ0RIj.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-group-BfnJ0RIj.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,9 +1,9 @@
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-KUj0U-5I.js';
4
+ import { B as Button } from './Button-B8nF87ai.js';
5
5
  import { ControlSizeContext, controlHeight } from './primitives/control-size.es.js';
6
- import { inputSurfaceAndFocusWithinStyle } from './primitives/form-element.es.js';
6
+ import { fieldErrorRimWithin, inputSurfaceAndFocusWithinStyle } from './primitives/form-element.es.js';
7
7
  import { c as cn } from './cn-65Adrsfj.js';
8
8
 
9
9
  const inputGroupBaseClassName = cn(
@@ -39,7 +39,7 @@ const inputGroupClassName = cn(
39
39
  inputGroupBaseClassName,
40
40
  "rounded-full",
41
41
  inputSurfaceAndFocusWithinStyle,
42
- "has-[[aria-invalid=true]]:[--surface-rim:var(--destructive)]",
42
+ fieldErrorRimWithin,
43
43
  inputGroupRoundedTextareaClassName
44
44
  );
45
45
  const InputGroup = React.forwardRef(({ className, size, ...props }, ref) => {
@@ -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-B-pskRGt.js.map
196
+ //# sourceMappingURL=input-group-Jt7lZsN9.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-group-Jt7lZsN9.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;;;;"}
@@ -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-Bn_uyUSB.cjs');
9
- const dataList = require('../data-list-DSbuTWLI.cjs');
10
- const listSearch = require('../list-search-DhReauU5.cjs');
11
- const tabsContent = require('../tabs-content-CuUlcS67.cjs');
12
- const tabsTab = require('../tabs-tab-ClmulJmM.cjs');
13
- const tabsRoot = require('../tabs-root-DrK1hxeV.cjs');
8
+ const combobox = require('../combobox-BoSB-muq.cjs');
9
+ const dataList = require('../data-list-CH3HAhK5.cjs');
10
+ const listSearch = require('../list-search-S1mco9Bl.cjs');
11
+ const tabsContent = require('../tabs-content-DlCJoQUW.cjs');
12
+ const tabsTab = require('../tabs-tab-DFmRMdi3.cjs');
13
+ const tabsRoot = require('../tabs-root-COCL6jcx.cjs');
14
14
  const tooltip = require('../tooltip-FvWL16Xn.cjs');
15
15
  const utils_cn = require('../cn-DG0X1KEP.cjs');
16
16