ivt 0.3.3 → 0.3.5

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 (257) hide show
  1. package/dist/accordion/index.mjs +19 -1
  2. package/dist/accordion/index.mjs.map +1 -1
  3. package/dist/alert/index.mjs +43 -1
  4. package/dist/alert/index.mjs.map +1 -1
  5. package/dist/alert-dialog/index.mjs +260 -1
  6. package/dist/alert-dialog/index.mjs.map +1 -1
  7. package/dist/avatar/index.mjs +164 -1
  8. package/dist/avatar/index.mjs.map +1 -1
  9. package/dist/badge/index.mjs +6 -1
  10. package/dist/badge/index.mjs.map +1 -1
  11. package/dist/base/index.mjs +760 -1
  12. package/dist/base/index.mjs.map +1 -1
  13. package/dist/button/index.mjs +6 -1
  14. package/dist/button/index.mjs.map +1 -1
  15. package/dist/calendar/index.mjs +11 -1
  16. package/dist/calendar/index.mjs.map +1 -1
  17. package/dist/card/index.mjs +55 -1
  18. package/dist/card/index.mjs.map +1 -1
  19. package/dist/chart/index.mjs +16696 -1
  20. package/dist/chart/index.mjs.map +1 -1
  21. package/dist/checkbox/index.mjs +223 -1
  22. package/dist/checkbox/index.mjs.map +1 -1
  23. package/dist/chunks/_commonjsHelpers-DKISyIRi.mjs +6 -0
  24. package/dist/chunks/_commonjsHelpers-DKISyIRi.mjs.map +1 -0
  25. package/dist/chunks/accordion-CK9Ucbko.mjs +455 -0
  26. package/dist/chunks/{accordion-CdshDFZC.mjs.map → accordion-CK9Ucbko.mjs.map} +1 -1
  27. package/dist/chunks/badge-CT_hmjd2.mjs +57 -0
  28. package/dist/chunks/{badge-BYqshEmA.mjs.map → badge-CT_hmjd2.mjs.map} +1 -1
  29. package/dist/chunks/bundle-mjs-CS-QKnOm.mjs +4491 -0
  30. package/dist/chunks/{bundle-mjs-9BXytT_r.mjs.map → bundle-mjs-CS-QKnOm.mjs.map} +1 -1
  31. package/dist/chunks/button-BHeYV17S.mjs +47 -0
  32. package/dist/chunks/{button-DrFZXJ7z.mjs.map → button-BHeYV17S.mjs.map} +1 -1
  33. package/dist/chunks/calendar-CU6HdJET.mjs +7106 -0
  34. package/dist/chunks/calendar-CU6HdJET.mjs.map +1 -0
  35. package/dist/chunks/check-B3pXhibW.mjs +15 -0
  36. package/dist/chunks/{check-CimnOyD7.mjs.map → check-B3pXhibW.mjs.map} +1 -1
  37. package/dist/chunks/chevron-down-BV5gvmUW.mjs +15 -0
  38. package/dist/chunks/{chevron-down-D3fvbjxE.mjs.map → chevron-down-BV5gvmUW.mjs.map} +1 -1
  39. package/dist/chunks/chevron-left-BjGcH2KQ.mjs +15 -0
  40. package/dist/chunks/{chevron-left-CrN7DlXg.mjs.map → chevron-left-BjGcH2KQ.mjs.map} +1 -1
  41. package/dist/chunks/chevron-right-DmZu0xvo.mjs +15 -0
  42. package/dist/chunks/{chevron-right-BMSCuDGK.mjs.map → chevron-right-DmZu0xvo.mjs.map} +1 -1
  43. package/dist/chunks/chevrons-up-down-COuCmfU7.mjs +22 -0
  44. package/dist/chunks/{chevrons-up-down-DBgvRkZm.mjs.map → chevrons-up-down-COuCmfU7.mjs.map} +1 -1
  45. package/dist/chunks/circle-BKsPjIbw.mjs +17 -0
  46. package/dist/chunks/{circle-CGqt18Bd.mjs.map → circle-BKsPjIbw.mjs.map} +1 -1
  47. package/dist/chunks/command-CUWr3X1X.mjs +611 -0
  48. package/dist/chunks/command-CUWr3X1X.mjs.map +1 -0
  49. package/dist/chunks/createLucideIcon-BSP_Jxu-.mjs +60 -0
  50. package/dist/chunks/{createLucideIcon-L-tld2uc.mjs.map → createLucideIcon-BSP_Jxu-.mjs.map} +1 -1
  51. package/dist/chunks/dialog-zZCazow7.mjs +80 -0
  52. package/dist/chunks/{dialog-36eqHzT3.mjs.map → dialog-zZCazow7.mjs.map} +1 -1
  53. package/dist/chunks/hover-card-C6WPsacG.mjs +274 -0
  54. package/dist/chunks/{hover-card-Cnd58du6.mjs.map → hover-card-C6WPsacG.mjs.map} +1 -1
  55. package/dist/chunks/index-3XcV7C7l.mjs +324 -0
  56. package/dist/chunks/{index-DUNcuWJE.mjs.map → index-3XcV7C7l.mjs.map} +1 -1
  57. package/dist/chunks/index-B1VVz0MP.mjs +266 -0
  58. package/dist/chunks/index-B1VVz0MP.mjs.map +1 -0
  59. package/dist/chunks/index-BFDafXar.mjs +2370 -0
  60. package/dist/chunks/index-BFDafXar.mjs.map +1 -0
  61. package/dist/chunks/index-BF_TaONY.mjs +859 -0
  62. package/dist/chunks/{index-DZHMFdr0.mjs.map → index-BF_TaONY.mjs.map} +1 -1
  63. package/dist/chunks/index-BOOPeiVs.mjs +34 -0
  64. package/dist/chunks/{index-D2sZp5OP.mjs.map → index-BOOPeiVs.mjs.map} +1 -1
  65. package/dist/chunks/index-BYijxgZz.mjs +12 -0
  66. package/dist/chunks/index-BYijxgZz.mjs.map +1 -0
  67. package/dist/chunks/index-BZyzz9k8.mjs +40 -0
  68. package/dist/chunks/index-BZyzz9k8.mjs.map +1 -0
  69. package/dist/chunks/index-Bgiaprdv.mjs +7 -0
  70. package/dist/chunks/{index-CLtWFQL5.mjs.map → index-Bgiaprdv.mjs.map} +1 -1
  71. package/dist/chunks/index-Bl6nVRXe.mjs +110 -0
  72. package/dist/chunks/{index-CCcl327A.mjs.map → index-Bl6nVRXe.mjs.map} +1 -1
  73. package/dist/chunks/index-BwQDLVf8.mjs +151 -0
  74. package/dist/chunks/index-BwQDLVf8.mjs.map +1 -0
  75. package/dist/chunks/index-CHyZo-Tj.mjs +1210 -0
  76. package/dist/chunks/index-CHyZo-Tj.mjs.map +1 -0
  77. package/dist/chunks/index-CZ7Wntp7.mjs +21 -0
  78. package/dist/chunks/index-CZ7Wntp7.mjs.map +1 -0
  79. package/dist/chunks/index-D1yPZAOL.mjs +13 -0
  80. package/dist/chunks/{index-CXszXOf_.mjs.map → index-D1yPZAOL.mjs.map} +1 -1
  81. package/dist/chunks/index-DIBl7n6R.mjs +145 -0
  82. package/dist/chunks/index-DIBl7n6R.mjs.map +1 -0
  83. package/dist/chunks/index-DRk0bB4A.mjs +216 -0
  84. package/dist/chunks/{index-LvOFIVGz.mjs.map → index-DRk0bB4A.mjs.map} +1 -1
  85. package/dist/chunks/index-DUFr75Kc.mjs +77 -0
  86. package/dist/chunks/{index-CybgQKpz.mjs.map → index-DUFr75Kc.mjs.map} +1 -1
  87. package/dist/chunks/index-DrnQ43fz.mjs +18 -0
  88. package/dist/chunks/{index-CRxQlsb9.mjs.map → index-DrnQ43fz.mjs.map} +1 -1
  89. package/dist/chunks/index-Dulm0stf.mjs +12 -0
  90. package/dist/chunks/{index-CU_y1XAz.mjs.map → index-Dulm0stf.mjs.map} +1 -1
  91. package/dist/chunks/index-fWnSEyU5.mjs +50 -0
  92. package/dist/chunks/{index-w9bxia3O.mjs.map → index-fWnSEyU5.mjs.map} +1 -1
  93. package/dist/chunks/index-tNc5GmLL.mjs +51 -0
  94. package/dist/chunks/{index-vmPXTidH.mjs.map → index-tNc5GmLL.mjs.map} +1 -1
  95. package/dist/chunks/input-D9-FhnGc.mjs +14 -0
  96. package/dist/chunks/{input-85UFztMJ.mjs.map → input-D9-FhnGc.mjs.map} +1 -1
  97. package/dist/chunks/label-CiJcd2F9.mjs +32 -0
  98. package/dist/chunks/{label-CICFzZIt.mjs.map → label-CiJcd2F9.mjs.map} +1 -1
  99. package/dist/chunks/pagination-SOhqOW7I.mjs +106 -0
  100. package/dist/chunks/{pagination-CReDQes6.mjs.map → pagination-SOhqOW7I.mjs.map} +1 -1
  101. package/dist/chunks/popover-WlYXFyUl.mjs +308 -0
  102. package/dist/chunks/{popover-Cn2ZTvKd.mjs.map → popover-WlYXFyUl.mjs.map} +1 -1
  103. package/dist/chunks/progress-DdBZJTQG.mjs +99 -0
  104. package/dist/chunks/{progress-CSxQH6-f.mjs.map → progress-DdBZJTQG.mjs.map} +1 -1
  105. package/dist/chunks/scroll-area-B2wNbBRR.mjs +791 -0
  106. package/dist/chunks/scroll-area-B2wNbBRR.mjs.map +1 -0
  107. package/dist/chunks/select-COGYOg3A.mjs +104 -0
  108. package/dist/chunks/{select-BR6_N_Yo.mjs.map → select-COGYOg3A.mjs.map} +1 -1
  109. package/dist/chunks/separator-D6Y96f4g.mjs +48 -0
  110. package/dist/chunks/{separator-BB6-E9Z1.mjs.map → separator-D6Y96f4g.mjs.map} +1 -1
  111. package/dist/chunks/skeleton-CRfBAk8U.mjs +13 -0
  112. package/dist/chunks/{skeleton-XPWWiaac.mjs.map → skeleton-CRfBAk8U.mjs.map} +1 -1
  113. package/dist/chunks/sortable-tiuZWf3S.mjs +4221 -0
  114. package/dist/chunks/sortable-tiuZWf3S.mjs.map +1 -0
  115. package/dist/chunks/table-BlTF56Yn.mjs +62 -0
  116. package/dist/chunks/{table-LQIHzPHi.mjs.map → table-BlTF56Yn.mjs.map} +1 -1
  117. package/dist/chunks/toggle-D5tCYA7L.mjs +65 -0
  118. package/dist/chunks/{toggle-Co72WXGd.mjs.map → toggle-D5tCYA7L.mjs.map} +1 -1
  119. package/dist/chunks/tooltip-BpTMPR5Q.mjs +596 -0
  120. package/dist/chunks/{tooltip-qX2HjdJP.mjs.map → tooltip-BpTMPR5Q.mjs.map} +1 -1
  121. package/dist/chunks/tslib.es6-O3UsmxNe.mjs +61 -0
  122. package/dist/chunks/{tslib.es6-cMGqxriw.mjs.map → tslib.es6-O3UsmxNe.mjs.map} +1 -1
  123. package/dist/chunks/utils-tbIgc9YG.mjs +42 -0
  124. package/dist/chunks/utils-tbIgc9YG.mjs.map +1 -0
  125. package/dist/chunks/x-5oL4uC6I.mjs +22 -0
  126. package/dist/chunks/{x-BNLl0E-E.mjs.map → x-5oL4uC6I.mjs.map} +1 -1
  127. package/dist/combobox/index.mjs +65 -1
  128. package/dist/combobox/index.mjs.map +1 -1
  129. package/dist/command/index.mjs +23 -1
  130. package/dist/command/index.mjs.map +1 -1
  131. package/dist/data-table/index.mjs +673 -1
  132. package/dist/data-table/index.mjs.map +1 -1
  133. package/dist/dialog/index.mjs +22 -1
  134. package/dist/dialog/index.mjs.map +1 -1
  135. package/dist/dropdown-menu/index.mjs +438 -1
  136. package/dist/dropdown-menu/index.mjs.map +1 -1
  137. package/dist/dropzone/index.mjs +7839 -1
  138. package/dist/dropzone/index.mjs.map +1 -1
  139. package/dist/form/index.mjs +649 -1
  140. package/dist/form/index.mjs.map +1 -1
  141. package/dist/hover-card/index.mjs +18 -1
  142. package/dist/hover-card/index.mjs.map +1 -1
  143. package/dist/icon/index.mjs +317 -1
  144. package/dist/icon/index.mjs.map +1 -1
  145. package/dist/index.css +1 -1
  146. package/dist/input/index.mjs +4 -1
  147. package/dist/input/index.mjs.map +1 -1
  148. package/dist/ivt.css +1 -1
  149. package/dist/label/index.mjs +8 -1
  150. package/dist/label/index.mjs.map +1 -1
  151. package/dist/menubar/index.mjs +583 -1
  152. package/dist/menubar/index.mjs.map +1 -1
  153. package/dist/multi-select/index.mjs +297 -1
  154. package/dist/multi-select/index.mjs.map +1 -1
  155. package/dist/pagination/index.mjs +10 -1
  156. package/dist/pagination/index.mjs.map +1 -1
  157. package/dist/popover/index.mjs +21 -1
  158. package/dist/popover/index.mjs.map +1 -1
  159. package/dist/progress/index.mjs +9 -1
  160. package/dist/progress/index.mjs.map +1 -1
  161. package/dist/radio-group/index.mjs +267 -1
  162. package/dist/radio-group/index.mjs.map +1 -1
  163. package/dist/scroll-area/index.mjs +15 -1
  164. package/dist/scroll-area/index.mjs.map +1 -1
  165. package/dist/select/index.mjs +8 -1
  166. package/dist/select/index.mjs.map +1 -1
  167. package/dist/separator/index.mjs +8 -1
  168. package/dist/separator/index.mjs.map +1 -1
  169. package/dist/sheet/index.mjs +96 -1
  170. package/dist/sheet/index.mjs.map +1 -1
  171. package/dist/skeleton/index.mjs +4 -1
  172. package/dist/skeleton/index.mjs.map +1 -1
  173. package/dist/sonner/index.mjs +1140 -1
  174. package/dist/sonner/index.mjs.map +1 -1
  175. package/dist/sortable/index.mjs +8 -1
  176. package/dist/sortable/index.mjs.map +1 -1
  177. package/dist/table/index.mjs +4 -1
  178. package/dist/table/index.mjs.map +1 -1
  179. package/dist/tabs/index.mjs +193 -1
  180. package/dist/tabs/index.mjs.map +1 -1
  181. package/dist/textarea/index.mjs +13 -1
  182. package/dist/textarea/index.mjs.map +1 -1
  183. package/dist/toast/index.mjs +705 -1
  184. package/dist/toast/index.mjs.map +1 -1
  185. package/dist/toggle/index.mjs +12 -1
  186. package/dist/toggle/index.mjs.map +1 -1
  187. package/dist/toggle-group/index.mjs +219 -1
  188. package/dist/toggle-group/index.mjs.map +1 -1
  189. package/dist/tooltip/index.mjs +20 -1
  190. package/dist/tooltip/index.mjs.map +1 -1
  191. package/package.json +6 -5
  192. package/dist/chunks/_commonjsHelpers-6qLFzZa5.mjs +0 -2
  193. package/dist/chunks/_commonjsHelpers-6qLFzZa5.mjs.map +0 -1
  194. package/dist/chunks/accordion-CdshDFZC.mjs +0 -2
  195. package/dist/chunks/badge-BYqshEmA.mjs +0 -2
  196. package/dist/chunks/bundle-mjs-9BXytT_r.mjs +0 -2
  197. package/dist/chunks/button-DrFZXJ7z.mjs +0 -2
  198. package/dist/chunks/calendar-BY6t8wdJ.mjs +0 -2
  199. package/dist/chunks/calendar-BY6t8wdJ.mjs.map +0 -1
  200. package/dist/chunks/check-CimnOyD7.mjs +0 -2
  201. package/dist/chunks/chevron-down-D3fvbjxE.mjs +0 -2
  202. package/dist/chunks/chevron-left-CrN7DlXg.mjs +0 -2
  203. package/dist/chunks/chevron-right-BMSCuDGK.mjs +0 -2
  204. package/dist/chunks/chevrons-up-down-DBgvRkZm.mjs +0 -2
  205. package/dist/chunks/circle-CGqt18Bd.mjs +0 -2
  206. package/dist/chunks/command-C6ON-ciq.mjs +0 -2
  207. package/dist/chunks/command-C6ON-ciq.mjs.map +0 -1
  208. package/dist/chunks/createLucideIcon-L-tld2uc.mjs +0 -2
  209. package/dist/chunks/dialog-36eqHzT3.mjs +0 -2
  210. package/dist/chunks/hover-card-Cnd58du6.mjs +0 -2
  211. package/dist/chunks/index-B4QsDzeM.mjs +0 -2
  212. package/dist/chunks/index-B4QsDzeM.mjs.map +0 -1
  213. package/dist/chunks/index-BdpYc58_.mjs +0 -2
  214. package/dist/chunks/index-BdpYc58_.mjs.map +0 -1
  215. package/dist/chunks/index-CCcl327A.mjs +0 -2
  216. package/dist/chunks/index-CLtWFQL5.mjs +0 -2
  217. package/dist/chunks/index-COvW87ew.mjs +0 -2
  218. package/dist/chunks/index-COvW87ew.mjs.map +0 -1
  219. package/dist/chunks/index-CRxQlsb9.mjs +0 -2
  220. package/dist/chunks/index-CU_y1XAz.mjs +0 -2
  221. package/dist/chunks/index-CXszXOf_.mjs +0 -2
  222. package/dist/chunks/index-CdJCOoFA.mjs +0 -2
  223. package/dist/chunks/index-CdJCOoFA.mjs.map +0 -1
  224. package/dist/chunks/index-Cpq7N5Ej.mjs +0 -2
  225. package/dist/chunks/index-Cpq7N5Ej.mjs.map +0 -1
  226. package/dist/chunks/index-CybgQKpz.mjs +0 -2
  227. package/dist/chunks/index-D2sZp5OP.mjs +0 -2
  228. package/dist/chunks/index-DOyt-JEx.mjs +0 -2
  229. package/dist/chunks/index-DOyt-JEx.mjs.map +0 -1
  230. package/dist/chunks/index-DUNcuWJE.mjs +0 -2
  231. package/dist/chunks/index-DZHMFdr0.mjs +0 -2
  232. package/dist/chunks/index-LvOFIVGz.mjs +0 -2
  233. package/dist/chunks/index-lvPXnk5F.mjs +0 -2
  234. package/dist/chunks/index-lvPXnk5F.mjs.map +0 -1
  235. package/dist/chunks/index-vmPXTidH.mjs +0 -2
  236. package/dist/chunks/index-w9bxia3O.mjs +0 -2
  237. package/dist/chunks/index-xew3kygQ.mjs +0 -2
  238. package/dist/chunks/index-xew3kygQ.mjs.map +0 -1
  239. package/dist/chunks/input-85UFztMJ.mjs +0 -2
  240. package/dist/chunks/label-CICFzZIt.mjs +0 -2
  241. package/dist/chunks/pagination-CReDQes6.mjs +0 -2
  242. package/dist/chunks/popover-Cn2ZTvKd.mjs +0 -2
  243. package/dist/chunks/progress-CSxQH6-f.mjs +0 -2
  244. package/dist/chunks/scroll-area-CvCz7cL_.mjs +0 -2
  245. package/dist/chunks/scroll-area-CvCz7cL_.mjs.map +0 -1
  246. package/dist/chunks/select-BR6_N_Yo.mjs +0 -2
  247. package/dist/chunks/separator-BB6-E9Z1.mjs +0 -2
  248. package/dist/chunks/skeleton-XPWWiaac.mjs +0 -2
  249. package/dist/chunks/sortable-CqPFGn8Q.mjs +0 -2
  250. package/dist/chunks/sortable-CqPFGn8Q.mjs.map +0 -1
  251. package/dist/chunks/table-LQIHzPHi.mjs +0 -2
  252. package/dist/chunks/toggle-Co72WXGd.mjs +0 -2
  253. package/dist/chunks/tooltip-qX2HjdJP.mjs +0 -2
  254. package/dist/chunks/tslib.es6-cMGqxriw.mjs +0 -2
  255. package/dist/chunks/utils-BctauAA9.mjs +0 -2
  256. package/dist/chunks/utils-BctauAA9.mjs.map +0 -1
  257. package/dist/chunks/x-BNLl0E-E.mjs +0 -2
@@ -0,0 +1,859 @@
1
+ import * as React from 'react';
2
+ import { c as composeEventHandlers } from './index-BYijxgZz.mjs';
3
+ import { createCollection } from '@radix-ui/react-collection';
4
+ import { u as useComposedRefs, c as composeRefs } from './index-BZyzz9k8.mjs';
5
+ import { c as createContextScope } from './index-Bl6nVRXe.mjs';
6
+ import { u as useDirection } from './index-Dulm0stf.mjs';
7
+ import { P as Portal$1, D as DismissableLayer } from './index-B1VVz0MP.mjs';
8
+ import { h as hideOthers, u as useFocusGuards, R as ReactRemoveScroll, F as FocusScope } from './index-CHyZo-Tj.mjs';
9
+ import { u as useId } from './index-DrnQ43fz.mjs';
10
+ import { c as createPopperScope, R as Root2, A as Anchor, C as Content, a as Arrow } from './index-BFDafXar.mjs';
11
+ import { P as Presence } from './index-DIBl7n6R.mjs';
12
+ import { P as Primitive, d as dispatchDiscreteCustomEvent } from './index-fWnSEyU5.mjs';
13
+ import { c as createRovingFocusGroupScope, I as Item, R as Root } from './index-DRk0bB4A.mjs';
14
+ import { createSlot } from '@radix-ui/react-slot';
15
+ import { u as useCallbackRef } from './index-D1yPZAOL.mjs';
16
+ import { jsx } from 'react/jsx-runtime';
17
+
18
+ var SELECTION_KEYS = [
19
+ "Enter",
20
+ " "
21
+ ];
22
+ var FIRST_KEYS = [
23
+ "ArrowDown",
24
+ "PageUp",
25
+ "Home"
26
+ ];
27
+ var LAST_KEYS = [
28
+ "ArrowUp",
29
+ "PageDown",
30
+ "End"
31
+ ];
32
+ var FIRST_LAST_KEYS = [
33
+ ...FIRST_KEYS,
34
+ ...LAST_KEYS
35
+ ];
36
+ var SUB_OPEN_KEYS = {
37
+ ltr: [
38
+ ...SELECTION_KEYS,
39
+ "ArrowRight"
40
+ ],
41
+ rtl: [
42
+ ...SELECTION_KEYS,
43
+ "ArrowLeft"
44
+ ]
45
+ };
46
+ var SUB_CLOSE_KEYS = {
47
+ ltr: [
48
+ "ArrowLeft"
49
+ ],
50
+ rtl: [
51
+ "ArrowRight"
52
+ ]
53
+ };
54
+ var MENU_NAME = "Menu";
55
+ var [Collection, useCollection, createCollectionScope] = createCollection(MENU_NAME);
56
+ var [createMenuContext, createMenuScope] = createContextScope(MENU_NAME, [
57
+ createCollectionScope,
58
+ createPopperScope,
59
+ createRovingFocusGroupScope
60
+ ]);
61
+ var usePopperScope = createPopperScope();
62
+ var useRovingFocusGroupScope = createRovingFocusGroupScope();
63
+ var [MenuProvider, useMenuContext] = createMenuContext(MENU_NAME);
64
+ var [MenuRootProvider, useMenuRootContext] = createMenuContext(MENU_NAME);
65
+ var Menu = (props)=>{
66
+ const { __scopeMenu, open = false, children, dir, onOpenChange, modal = true } = props;
67
+ const popperScope = usePopperScope(__scopeMenu);
68
+ const [content, setContent] = React.useState(null);
69
+ const isUsingKeyboardRef = React.useRef(false);
70
+ const handleOpenChange = useCallbackRef(onOpenChange);
71
+ const direction = useDirection(dir);
72
+ React.useEffect(()=>{
73
+ const handleKeyDown = ()=>{
74
+ isUsingKeyboardRef.current = true;
75
+ document.addEventListener("pointerdown", handlePointer, {
76
+ capture: true,
77
+ once: true
78
+ });
79
+ document.addEventListener("pointermove", handlePointer, {
80
+ capture: true,
81
+ once: true
82
+ });
83
+ };
84
+ const handlePointer = ()=>isUsingKeyboardRef.current = false;
85
+ document.addEventListener("keydown", handleKeyDown, {
86
+ capture: true
87
+ });
88
+ return ()=>{
89
+ document.removeEventListener("keydown", handleKeyDown, {
90
+ capture: true
91
+ });
92
+ document.removeEventListener("pointerdown", handlePointer, {
93
+ capture: true
94
+ });
95
+ document.removeEventListener("pointermove", handlePointer, {
96
+ capture: true
97
+ });
98
+ };
99
+ }, []);
100
+ return /* @__PURE__ */ jsx(Root2, {
101
+ ...popperScope,
102
+ children: /* @__PURE__ */ jsx(MenuProvider, {
103
+ scope: __scopeMenu,
104
+ open,
105
+ onOpenChange: handleOpenChange,
106
+ content,
107
+ onContentChange: setContent,
108
+ children: /* @__PURE__ */ jsx(MenuRootProvider, {
109
+ scope: __scopeMenu,
110
+ onClose: React.useCallback(()=>handleOpenChange(false), [
111
+ handleOpenChange
112
+ ]),
113
+ isUsingKeyboardRef,
114
+ dir: direction,
115
+ modal,
116
+ children
117
+ })
118
+ })
119
+ });
120
+ };
121
+ Menu.displayName = MENU_NAME;
122
+ var ANCHOR_NAME = "MenuAnchor";
123
+ var MenuAnchor = React.forwardRef((props, forwardedRef)=>{
124
+ const { __scopeMenu, ...anchorProps } = props;
125
+ const popperScope = usePopperScope(__scopeMenu);
126
+ return /* @__PURE__ */ jsx(Anchor, {
127
+ ...popperScope,
128
+ ...anchorProps,
129
+ ref: forwardedRef
130
+ });
131
+ });
132
+ MenuAnchor.displayName = ANCHOR_NAME;
133
+ var PORTAL_NAME = "MenuPortal";
134
+ var [PortalProvider, usePortalContext] = createMenuContext(PORTAL_NAME, {
135
+ forceMount: void 0
136
+ });
137
+ var MenuPortal = (props)=>{
138
+ const { __scopeMenu, forceMount, children, container } = props;
139
+ const context = useMenuContext(PORTAL_NAME, __scopeMenu);
140
+ return /* @__PURE__ */ jsx(PortalProvider, {
141
+ scope: __scopeMenu,
142
+ forceMount,
143
+ children: /* @__PURE__ */ jsx(Presence, {
144
+ present: forceMount || context.open,
145
+ children: /* @__PURE__ */ jsx(Portal$1, {
146
+ asChild: true,
147
+ container,
148
+ children
149
+ })
150
+ })
151
+ });
152
+ };
153
+ MenuPortal.displayName = PORTAL_NAME;
154
+ var CONTENT_NAME = "MenuContent";
155
+ var [MenuContentProvider, useMenuContentContext] = createMenuContext(CONTENT_NAME);
156
+ var MenuContent = React.forwardRef((props, forwardedRef)=>{
157
+ const portalContext = usePortalContext(CONTENT_NAME, props.__scopeMenu);
158
+ const { forceMount = portalContext.forceMount, ...contentProps } = props;
159
+ const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);
160
+ const rootContext = useMenuRootContext(CONTENT_NAME, props.__scopeMenu);
161
+ return /* @__PURE__ */ jsx(Collection.Provider, {
162
+ scope: props.__scopeMenu,
163
+ children: /* @__PURE__ */ jsx(Presence, {
164
+ present: forceMount || context.open,
165
+ children: /* @__PURE__ */ jsx(Collection.Slot, {
166
+ scope: props.__scopeMenu,
167
+ children: rootContext.modal ? /* @__PURE__ */ jsx(MenuRootContentModal, {
168
+ ...contentProps,
169
+ ref: forwardedRef
170
+ }) : /* @__PURE__ */ jsx(MenuRootContentNonModal, {
171
+ ...contentProps,
172
+ ref: forwardedRef
173
+ })
174
+ })
175
+ })
176
+ });
177
+ });
178
+ var MenuRootContentModal = React.forwardRef((props, forwardedRef)=>{
179
+ const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);
180
+ const ref = React.useRef(null);
181
+ const composedRefs = useComposedRefs(forwardedRef, ref);
182
+ React.useEffect(()=>{
183
+ const content = ref.current;
184
+ if (content) return hideOthers(content);
185
+ }, []);
186
+ return /* @__PURE__ */ jsx(MenuContentImpl, {
187
+ ...props,
188
+ ref: composedRefs,
189
+ trapFocus: context.open,
190
+ disableOutsidePointerEvents: context.open,
191
+ disableOutsideScroll: true,
192
+ onFocusOutside: composeEventHandlers(props.onFocusOutside, (event)=>event.preventDefault(), {
193
+ checkForDefaultPrevented: false
194
+ }),
195
+ onDismiss: ()=>context.onOpenChange(false)
196
+ });
197
+ });
198
+ var MenuRootContentNonModal = React.forwardRef((props, forwardedRef)=>{
199
+ const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);
200
+ return /* @__PURE__ */ jsx(MenuContentImpl, {
201
+ ...props,
202
+ ref: forwardedRef,
203
+ trapFocus: false,
204
+ disableOutsidePointerEvents: false,
205
+ disableOutsideScroll: false,
206
+ onDismiss: ()=>context.onOpenChange(false)
207
+ });
208
+ });
209
+ var Slot = createSlot("MenuContent.ScrollLock");
210
+ var MenuContentImpl = React.forwardRef((props, forwardedRef)=>{
211
+ const { __scopeMenu, loop = false, trapFocus, onOpenAutoFocus, onCloseAutoFocus, disableOutsidePointerEvents, onEntryFocus, onEscapeKeyDown, onPointerDownOutside, onFocusOutside, onInteractOutside, onDismiss, disableOutsideScroll, ...contentProps } = props;
212
+ const context = useMenuContext(CONTENT_NAME, __scopeMenu);
213
+ const rootContext = useMenuRootContext(CONTENT_NAME, __scopeMenu);
214
+ const popperScope = usePopperScope(__scopeMenu);
215
+ const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeMenu);
216
+ const getItems = useCollection(__scopeMenu);
217
+ const [currentItemId, setCurrentItemId] = React.useState(null);
218
+ const contentRef = React.useRef(null);
219
+ const composedRefs = useComposedRefs(forwardedRef, contentRef, context.onContentChange);
220
+ const timerRef = React.useRef(0);
221
+ const searchRef = React.useRef("");
222
+ const pointerGraceTimerRef = React.useRef(0);
223
+ const pointerGraceIntentRef = React.useRef(null);
224
+ const pointerDirRef = React.useRef("right");
225
+ const lastPointerXRef = React.useRef(0);
226
+ const ScrollLockWrapper = disableOutsideScroll ? ReactRemoveScroll : React.Fragment;
227
+ const scrollLockWrapperProps = disableOutsideScroll ? {
228
+ as: Slot,
229
+ allowPinchZoom: true
230
+ } : void 0;
231
+ const handleTypeaheadSearch = (key)=>{
232
+ const search = searchRef.current + key;
233
+ const items = getItems().filter((item)=>!item.disabled);
234
+ const currentItem = document.activeElement;
235
+ const currentMatch = items.find((item)=>item.ref.current === currentItem)?.textValue;
236
+ const values = items.map((item)=>item.textValue);
237
+ const nextMatch = getNextMatch(values, search, currentMatch);
238
+ const newItem = items.find((item)=>item.textValue === nextMatch)?.ref.current;
239
+ (function updateSearch(value) {
240
+ searchRef.current = value;
241
+ window.clearTimeout(timerRef.current);
242
+ if (value !== "") timerRef.current = window.setTimeout(()=>updateSearch(""), 1e3);
243
+ })(search);
244
+ if (newItem) {
245
+ setTimeout(()=>newItem.focus());
246
+ }
247
+ };
248
+ React.useEffect(()=>{
249
+ return ()=>window.clearTimeout(timerRef.current);
250
+ }, []);
251
+ useFocusGuards();
252
+ const isPointerMovingToSubmenu = React.useCallback((event)=>{
253
+ const isMovingTowards = pointerDirRef.current === pointerGraceIntentRef.current?.side;
254
+ return isMovingTowards && isPointerInGraceArea(event, pointerGraceIntentRef.current?.area);
255
+ }, []);
256
+ return /* @__PURE__ */ jsx(MenuContentProvider, {
257
+ scope: __scopeMenu,
258
+ searchRef,
259
+ onItemEnter: React.useCallback((event)=>{
260
+ if (isPointerMovingToSubmenu(event)) event.preventDefault();
261
+ }, [
262
+ isPointerMovingToSubmenu
263
+ ]),
264
+ onItemLeave: React.useCallback((event)=>{
265
+ if (isPointerMovingToSubmenu(event)) return;
266
+ contentRef.current?.focus();
267
+ setCurrentItemId(null);
268
+ }, [
269
+ isPointerMovingToSubmenu
270
+ ]),
271
+ onTriggerLeave: React.useCallback((event)=>{
272
+ if (isPointerMovingToSubmenu(event)) event.preventDefault();
273
+ }, [
274
+ isPointerMovingToSubmenu
275
+ ]),
276
+ pointerGraceTimerRef,
277
+ onPointerGraceIntentChange: React.useCallback((intent)=>{
278
+ pointerGraceIntentRef.current = intent;
279
+ }, []),
280
+ children: /* @__PURE__ */ jsx(ScrollLockWrapper, {
281
+ ...scrollLockWrapperProps,
282
+ children: /* @__PURE__ */ jsx(FocusScope, {
283
+ asChild: true,
284
+ trapped: trapFocus,
285
+ onMountAutoFocus: composeEventHandlers(onOpenAutoFocus, (event)=>{
286
+ event.preventDefault();
287
+ contentRef.current?.focus({
288
+ preventScroll: true
289
+ });
290
+ }),
291
+ onUnmountAutoFocus: onCloseAutoFocus,
292
+ children: /* @__PURE__ */ jsx(DismissableLayer, {
293
+ asChild: true,
294
+ disableOutsidePointerEvents,
295
+ onEscapeKeyDown,
296
+ onPointerDownOutside,
297
+ onFocusOutside,
298
+ onInteractOutside,
299
+ onDismiss,
300
+ children: /* @__PURE__ */ jsx(Root, {
301
+ asChild: true,
302
+ ...rovingFocusGroupScope,
303
+ dir: rootContext.dir,
304
+ orientation: "vertical",
305
+ loop,
306
+ currentTabStopId: currentItemId,
307
+ onCurrentTabStopIdChange: setCurrentItemId,
308
+ onEntryFocus: composeEventHandlers(onEntryFocus, (event)=>{
309
+ if (!rootContext.isUsingKeyboardRef.current) event.preventDefault();
310
+ }),
311
+ preventScrollOnEntryFocus: true,
312
+ children: /* @__PURE__ */ jsx(Content, {
313
+ role: "menu",
314
+ "aria-orientation": "vertical",
315
+ "data-state": getOpenState(context.open),
316
+ "data-radix-menu-content": "",
317
+ dir: rootContext.dir,
318
+ ...popperScope,
319
+ ...contentProps,
320
+ ref: composedRefs,
321
+ style: {
322
+ outline: "none",
323
+ ...contentProps.style
324
+ },
325
+ onKeyDown: composeEventHandlers(contentProps.onKeyDown, (event)=>{
326
+ const target = event.target;
327
+ const isKeyDownInside = target.closest("[data-radix-menu-content]") === event.currentTarget;
328
+ const isModifierKey = event.ctrlKey || event.altKey || event.metaKey;
329
+ const isCharacterKey = event.key.length === 1;
330
+ if (isKeyDownInside) {
331
+ if (event.key === "Tab") event.preventDefault();
332
+ if (!isModifierKey && isCharacterKey) handleTypeaheadSearch(event.key);
333
+ }
334
+ const content = contentRef.current;
335
+ if (event.target !== content) return;
336
+ if (!FIRST_LAST_KEYS.includes(event.key)) return;
337
+ event.preventDefault();
338
+ const items = getItems().filter((item)=>!item.disabled);
339
+ const candidateNodes = items.map((item)=>item.ref.current);
340
+ if (LAST_KEYS.includes(event.key)) candidateNodes.reverse();
341
+ focusFirst(candidateNodes);
342
+ }),
343
+ onBlur: composeEventHandlers(props.onBlur, (event)=>{
344
+ if (!event.currentTarget.contains(event.target)) {
345
+ window.clearTimeout(timerRef.current);
346
+ searchRef.current = "";
347
+ }
348
+ }),
349
+ onPointerMove: composeEventHandlers(props.onPointerMove, whenMouse((event)=>{
350
+ const target = event.target;
351
+ const pointerXHasChanged = lastPointerXRef.current !== event.clientX;
352
+ if (event.currentTarget.contains(target) && pointerXHasChanged) {
353
+ const newDir = event.clientX > lastPointerXRef.current ? "right" : "left";
354
+ pointerDirRef.current = newDir;
355
+ lastPointerXRef.current = event.clientX;
356
+ }
357
+ }))
358
+ })
359
+ })
360
+ })
361
+ })
362
+ })
363
+ });
364
+ });
365
+ MenuContent.displayName = CONTENT_NAME;
366
+ var GROUP_NAME = "MenuGroup";
367
+ var MenuGroup = React.forwardRef((props, forwardedRef)=>{
368
+ const { __scopeMenu, ...groupProps } = props;
369
+ return /* @__PURE__ */ jsx(Primitive.div, {
370
+ role: "group",
371
+ ...groupProps,
372
+ ref: forwardedRef
373
+ });
374
+ });
375
+ MenuGroup.displayName = GROUP_NAME;
376
+ var LABEL_NAME = "MenuLabel";
377
+ var MenuLabel = React.forwardRef((props, forwardedRef)=>{
378
+ const { __scopeMenu, ...labelProps } = props;
379
+ return /* @__PURE__ */ jsx(Primitive.div, {
380
+ ...labelProps,
381
+ ref: forwardedRef
382
+ });
383
+ });
384
+ MenuLabel.displayName = LABEL_NAME;
385
+ var ITEM_NAME = "MenuItem";
386
+ var ITEM_SELECT = "menu.itemSelect";
387
+ var MenuItem = React.forwardRef((props, forwardedRef)=>{
388
+ const { disabled = false, onSelect, ...itemProps } = props;
389
+ const ref = React.useRef(null);
390
+ const rootContext = useMenuRootContext(ITEM_NAME, props.__scopeMenu);
391
+ const contentContext = useMenuContentContext(ITEM_NAME, props.__scopeMenu);
392
+ const composedRefs = useComposedRefs(forwardedRef, ref);
393
+ const isPointerDownRef = React.useRef(false);
394
+ const handleSelect = ()=>{
395
+ const menuItem = ref.current;
396
+ if (!disabled && menuItem) {
397
+ const itemSelectEvent = new CustomEvent(ITEM_SELECT, {
398
+ bubbles: true,
399
+ cancelable: true
400
+ });
401
+ menuItem.addEventListener(ITEM_SELECT, (event)=>onSelect?.(event), {
402
+ once: true
403
+ });
404
+ dispatchDiscreteCustomEvent(menuItem, itemSelectEvent);
405
+ if (itemSelectEvent.defaultPrevented) {
406
+ isPointerDownRef.current = false;
407
+ } else {
408
+ rootContext.onClose();
409
+ }
410
+ }
411
+ };
412
+ return /* @__PURE__ */ jsx(MenuItemImpl, {
413
+ ...itemProps,
414
+ ref: composedRefs,
415
+ disabled,
416
+ onClick: composeEventHandlers(props.onClick, handleSelect),
417
+ onPointerDown: (event)=>{
418
+ props.onPointerDown?.(event);
419
+ isPointerDownRef.current = true;
420
+ },
421
+ onPointerUp: composeEventHandlers(props.onPointerUp, (event)=>{
422
+ if (!isPointerDownRef.current) event.currentTarget?.click();
423
+ }),
424
+ onKeyDown: composeEventHandlers(props.onKeyDown, (event)=>{
425
+ const isTypingAhead = contentContext.searchRef.current !== "";
426
+ if (disabled || isTypingAhead && event.key === " ") return;
427
+ if (SELECTION_KEYS.includes(event.key)) {
428
+ event.currentTarget.click();
429
+ event.preventDefault();
430
+ }
431
+ })
432
+ });
433
+ });
434
+ MenuItem.displayName = ITEM_NAME;
435
+ var MenuItemImpl = React.forwardRef((props, forwardedRef)=>{
436
+ const { __scopeMenu, disabled = false, textValue, ...itemProps } = props;
437
+ const contentContext = useMenuContentContext(ITEM_NAME, __scopeMenu);
438
+ const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeMenu);
439
+ const ref = React.useRef(null);
440
+ const composedRefs = useComposedRefs(forwardedRef, ref);
441
+ const [isFocused, setIsFocused] = React.useState(false);
442
+ const [textContent, setTextContent] = React.useState("");
443
+ React.useEffect(()=>{
444
+ const menuItem = ref.current;
445
+ if (menuItem) {
446
+ setTextContent((menuItem.textContent ?? "").trim());
447
+ }
448
+ }, [
449
+ itemProps.children
450
+ ]);
451
+ return /* @__PURE__ */ jsx(Collection.ItemSlot, {
452
+ scope: __scopeMenu,
453
+ disabled,
454
+ textValue: textValue ?? textContent,
455
+ children: /* @__PURE__ */ jsx(Item, {
456
+ asChild: true,
457
+ ...rovingFocusGroupScope,
458
+ focusable: !disabled,
459
+ children: /* @__PURE__ */ jsx(Primitive.div, {
460
+ role: "menuitem",
461
+ "data-highlighted": isFocused ? "" : void 0,
462
+ "aria-disabled": disabled || void 0,
463
+ "data-disabled": disabled ? "" : void 0,
464
+ ...itemProps,
465
+ ref: composedRefs,
466
+ onPointerMove: composeEventHandlers(props.onPointerMove, whenMouse((event)=>{
467
+ if (disabled) {
468
+ contentContext.onItemLeave(event);
469
+ } else {
470
+ contentContext.onItemEnter(event);
471
+ if (!event.defaultPrevented) {
472
+ const item = event.currentTarget;
473
+ item.focus({
474
+ preventScroll: true
475
+ });
476
+ }
477
+ }
478
+ })),
479
+ onPointerLeave: composeEventHandlers(props.onPointerLeave, whenMouse((event)=>contentContext.onItemLeave(event))),
480
+ onFocus: composeEventHandlers(props.onFocus, ()=>setIsFocused(true)),
481
+ onBlur: composeEventHandlers(props.onBlur, ()=>setIsFocused(false))
482
+ })
483
+ })
484
+ });
485
+ });
486
+ var CHECKBOX_ITEM_NAME = "MenuCheckboxItem";
487
+ var MenuCheckboxItem = React.forwardRef((props, forwardedRef)=>{
488
+ const { checked = false, onCheckedChange, ...checkboxItemProps } = props;
489
+ return /* @__PURE__ */ jsx(ItemIndicatorProvider, {
490
+ scope: props.__scopeMenu,
491
+ checked,
492
+ children: /* @__PURE__ */ jsx(MenuItem, {
493
+ role: "menuitemcheckbox",
494
+ "aria-checked": isIndeterminate(checked) ? "mixed" : checked,
495
+ ...checkboxItemProps,
496
+ ref: forwardedRef,
497
+ "data-state": getCheckedState(checked),
498
+ onSelect: composeEventHandlers(checkboxItemProps.onSelect, ()=>onCheckedChange?.(isIndeterminate(checked) ? true : !checked), {
499
+ checkForDefaultPrevented: false
500
+ })
501
+ })
502
+ });
503
+ });
504
+ MenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME;
505
+ var RADIO_GROUP_NAME = "MenuRadioGroup";
506
+ var [RadioGroupProvider, useRadioGroupContext] = createMenuContext(RADIO_GROUP_NAME, {
507
+ value: void 0,
508
+ onValueChange: ()=>{}
509
+ });
510
+ var MenuRadioGroup = React.forwardRef((props, forwardedRef)=>{
511
+ const { value, onValueChange, ...groupProps } = props;
512
+ const handleValueChange = useCallbackRef(onValueChange);
513
+ return /* @__PURE__ */ jsx(RadioGroupProvider, {
514
+ scope: props.__scopeMenu,
515
+ value,
516
+ onValueChange: handleValueChange,
517
+ children: /* @__PURE__ */ jsx(MenuGroup, {
518
+ ...groupProps,
519
+ ref: forwardedRef
520
+ })
521
+ });
522
+ });
523
+ MenuRadioGroup.displayName = RADIO_GROUP_NAME;
524
+ var RADIO_ITEM_NAME = "MenuRadioItem";
525
+ var MenuRadioItem = React.forwardRef((props, forwardedRef)=>{
526
+ const { value, ...radioItemProps } = props;
527
+ const context = useRadioGroupContext(RADIO_ITEM_NAME, props.__scopeMenu);
528
+ const checked = value === context.value;
529
+ return /* @__PURE__ */ jsx(ItemIndicatorProvider, {
530
+ scope: props.__scopeMenu,
531
+ checked,
532
+ children: /* @__PURE__ */ jsx(MenuItem, {
533
+ role: "menuitemradio",
534
+ "aria-checked": checked,
535
+ ...radioItemProps,
536
+ ref: forwardedRef,
537
+ "data-state": getCheckedState(checked),
538
+ onSelect: composeEventHandlers(radioItemProps.onSelect, ()=>context.onValueChange?.(value), {
539
+ checkForDefaultPrevented: false
540
+ })
541
+ })
542
+ });
543
+ });
544
+ MenuRadioItem.displayName = RADIO_ITEM_NAME;
545
+ var ITEM_INDICATOR_NAME = "MenuItemIndicator";
546
+ var [ItemIndicatorProvider, useItemIndicatorContext] = createMenuContext(ITEM_INDICATOR_NAME, {
547
+ checked: false
548
+ });
549
+ var MenuItemIndicator = React.forwardRef((props, forwardedRef)=>{
550
+ const { __scopeMenu, forceMount, ...itemIndicatorProps } = props;
551
+ const indicatorContext = useItemIndicatorContext(ITEM_INDICATOR_NAME, __scopeMenu);
552
+ return /* @__PURE__ */ jsx(Presence, {
553
+ present: forceMount || isIndeterminate(indicatorContext.checked) || indicatorContext.checked === true,
554
+ children: /* @__PURE__ */ jsx(Primitive.span, {
555
+ ...itemIndicatorProps,
556
+ ref: forwardedRef,
557
+ "data-state": getCheckedState(indicatorContext.checked)
558
+ })
559
+ });
560
+ });
561
+ MenuItemIndicator.displayName = ITEM_INDICATOR_NAME;
562
+ var SEPARATOR_NAME = "MenuSeparator";
563
+ var MenuSeparator = React.forwardRef((props, forwardedRef)=>{
564
+ const { __scopeMenu, ...separatorProps } = props;
565
+ return /* @__PURE__ */ jsx(Primitive.div, {
566
+ role: "separator",
567
+ "aria-orientation": "horizontal",
568
+ ...separatorProps,
569
+ ref: forwardedRef
570
+ });
571
+ });
572
+ MenuSeparator.displayName = SEPARATOR_NAME;
573
+ var ARROW_NAME = "MenuArrow";
574
+ var MenuArrow = React.forwardRef((props, forwardedRef)=>{
575
+ const { __scopeMenu, ...arrowProps } = props;
576
+ const popperScope = usePopperScope(__scopeMenu);
577
+ return /* @__PURE__ */ jsx(Arrow, {
578
+ ...popperScope,
579
+ ...arrowProps,
580
+ ref: forwardedRef
581
+ });
582
+ });
583
+ MenuArrow.displayName = ARROW_NAME;
584
+ var SUB_NAME = "MenuSub";
585
+ var [MenuSubProvider, useMenuSubContext] = createMenuContext(SUB_NAME);
586
+ var MenuSub = (props)=>{
587
+ const { __scopeMenu, children, open = false, onOpenChange } = props;
588
+ const parentMenuContext = useMenuContext(SUB_NAME, __scopeMenu);
589
+ const popperScope = usePopperScope(__scopeMenu);
590
+ const [trigger, setTrigger] = React.useState(null);
591
+ const [content, setContent] = React.useState(null);
592
+ const handleOpenChange = useCallbackRef(onOpenChange);
593
+ React.useEffect(()=>{
594
+ if (parentMenuContext.open === false) handleOpenChange(false);
595
+ return ()=>handleOpenChange(false);
596
+ }, [
597
+ parentMenuContext.open,
598
+ handleOpenChange
599
+ ]);
600
+ return /* @__PURE__ */ jsx(Root2, {
601
+ ...popperScope,
602
+ children: /* @__PURE__ */ jsx(MenuProvider, {
603
+ scope: __scopeMenu,
604
+ open,
605
+ onOpenChange: handleOpenChange,
606
+ content,
607
+ onContentChange: setContent,
608
+ children: /* @__PURE__ */ jsx(MenuSubProvider, {
609
+ scope: __scopeMenu,
610
+ contentId: useId(),
611
+ triggerId: useId(),
612
+ trigger,
613
+ onTriggerChange: setTrigger,
614
+ children
615
+ })
616
+ })
617
+ });
618
+ };
619
+ MenuSub.displayName = SUB_NAME;
620
+ var SUB_TRIGGER_NAME = "MenuSubTrigger";
621
+ var MenuSubTrigger = React.forwardRef((props, forwardedRef)=>{
622
+ const context = useMenuContext(SUB_TRIGGER_NAME, props.__scopeMenu);
623
+ const rootContext = useMenuRootContext(SUB_TRIGGER_NAME, props.__scopeMenu);
624
+ const subContext = useMenuSubContext(SUB_TRIGGER_NAME, props.__scopeMenu);
625
+ const contentContext = useMenuContentContext(SUB_TRIGGER_NAME, props.__scopeMenu);
626
+ const openTimerRef = React.useRef(null);
627
+ const { pointerGraceTimerRef, onPointerGraceIntentChange } = contentContext;
628
+ const scope = {
629
+ __scopeMenu: props.__scopeMenu
630
+ };
631
+ const clearOpenTimer = React.useCallback(()=>{
632
+ if (openTimerRef.current) window.clearTimeout(openTimerRef.current);
633
+ openTimerRef.current = null;
634
+ }, []);
635
+ React.useEffect(()=>clearOpenTimer, [
636
+ clearOpenTimer
637
+ ]);
638
+ React.useEffect(()=>{
639
+ const pointerGraceTimer = pointerGraceTimerRef.current;
640
+ return ()=>{
641
+ window.clearTimeout(pointerGraceTimer);
642
+ onPointerGraceIntentChange(null);
643
+ };
644
+ }, [
645
+ pointerGraceTimerRef,
646
+ onPointerGraceIntentChange
647
+ ]);
648
+ return /* @__PURE__ */ jsx(MenuAnchor, {
649
+ asChild: true,
650
+ ...scope,
651
+ children: /* @__PURE__ */ jsx(MenuItemImpl, {
652
+ id: subContext.triggerId,
653
+ "aria-haspopup": "menu",
654
+ "aria-expanded": context.open,
655
+ "aria-controls": subContext.contentId,
656
+ "data-state": getOpenState(context.open),
657
+ ...props,
658
+ ref: composeRefs(forwardedRef, subContext.onTriggerChange),
659
+ onClick: (event)=>{
660
+ props.onClick?.(event);
661
+ if (props.disabled || event.defaultPrevented) return;
662
+ event.currentTarget.focus();
663
+ if (!context.open) context.onOpenChange(true);
664
+ },
665
+ onPointerMove: composeEventHandlers(props.onPointerMove, whenMouse((event)=>{
666
+ contentContext.onItemEnter(event);
667
+ if (event.defaultPrevented) return;
668
+ if (!props.disabled && !context.open && !openTimerRef.current) {
669
+ contentContext.onPointerGraceIntentChange(null);
670
+ openTimerRef.current = window.setTimeout(()=>{
671
+ context.onOpenChange(true);
672
+ clearOpenTimer();
673
+ }, 100);
674
+ }
675
+ })),
676
+ onPointerLeave: composeEventHandlers(props.onPointerLeave, whenMouse((event)=>{
677
+ clearOpenTimer();
678
+ const contentRect = context.content?.getBoundingClientRect();
679
+ if (contentRect) {
680
+ const side = context.content?.dataset.side;
681
+ const rightSide = side === "right";
682
+ const bleed = rightSide ? -5 : 5;
683
+ const contentNearEdge = contentRect[rightSide ? "left" : "right"];
684
+ const contentFarEdge = contentRect[rightSide ? "right" : "left"];
685
+ contentContext.onPointerGraceIntentChange({
686
+ area: [
687
+ // Apply a bleed on clientX to ensure that our exit point is
688
+ // consistently within polygon bounds
689
+ {
690
+ x: event.clientX + bleed,
691
+ y: event.clientY
692
+ },
693
+ {
694
+ x: contentNearEdge,
695
+ y: contentRect.top
696
+ },
697
+ {
698
+ x: contentFarEdge,
699
+ y: contentRect.top
700
+ },
701
+ {
702
+ x: contentFarEdge,
703
+ y: contentRect.bottom
704
+ },
705
+ {
706
+ x: contentNearEdge,
707
+ y: contentRect.bottom
708
+ }
709
+ ],
710
+ side
711
+ });
712
+ window.clearTimeout(pointerGraceTimerRef.current);
713
+ pointerGraceTimerRef.current = window.setTimeout(()=>contentContext.onPointerGraceIntentChange(null), 300);
714
+ } else {
715
+ contentContext.onTriggerLeave(event);
716
+ if (event.defaultPrevented) return;
717
+ contentContext.onPointerGraceIntentChange(null);
718
+ }
719
+ })),
720
+ onKeyDown: composeEventHandlers(props.onKeyDown, (event)=>{
721
+ const isTypingAhead = contentContext.searchRef.current !== "";
722
+ if (props.disabled || isTypingAhead && event.key === " ") return;
723
+ if (SUB_OPEN_KEYS[rootContext.dir].includes(event.key)) {
724
+ context.onOpenChange(true);
725
+ context.content?.focus();
726
+ event.preventDefault();
727
+ }
728
+ })
729
+ })
730
+ });
731
+ });
732
+ MenuSubTrigger.displayName = SUB_TRIGGER_NAME;
733
+ var SUB_CONTENT_NAME = "MenuSubContent";
734
+ var MenuSubContent = React.forwardRef((props, forwardedRef)=>{
735
+ const portalContext = usePortalContext(CONTENT_NAME, props.__scopeMenu);
736
+ const { forceMount = portalContext.forceMount, ...subContentProps } = props;
737
+ const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);
738
+ const rootContext = useMenuRootContext(CONTENT_NAME, props.__scopeMenu);
739
+ const subContext = useMenuSubContext(SUB_CONTENT_NAME, props.__scopeMenu);
740
+ const ref = React.useRef(null);
741
+ const composedRefs = useComposedRefs(forwardedRef, ref);
742
+ return /* @__PURE__ */ jsx(Collection.Provider, {
743
+ scope: props.__scopeMenu,
744
+ children: /* @__PURE__ */ jsx(Presence, {
745
+ present: forceMount || context.open,
746
+ children: /* @__PURE__ */ jsx(Collection.Slot, {
747
+ scope: props.__scopeMenu,
748
+ children: /* @__PURE__ */ jsx(MenuContentImpl, {
749
+ id: subContext.contentId,
750
+ "aria-labelledby": subContext.triggerId,
751
+ ...subContentProps,
752
+ ref: composedRefs,
753
+ align: "start",
754
+ side: rootContext.dir === "rtl" ? "left" : "right",
755
+ disableOutsidePointerEvents: false,
756
+ disableOutsideScroll: false,
757
+ trapFocus: false,
758
+ onOpenAutoFocus: (event)=>{
759
+ if (rootContext.isUsingKeyboardRef.current) ref.current?.focus();
760
+ event.preventDefault();
761
+ },
762
+ onCloseAutoFocus: (event)=>event.preventDefault(),
763
+ onFocusOutside: composeEventHandlers(props.onFocusOutside, (event)=>{
764
+ if (event.target !== subContext.trigger) context.onOpenChange(false);
765
+ }),
766
+ onEscapeKeyDown: composeEventHandlers(props.onEscapeKeyDown, (event)=>{
767
+ rootContext.onClose();
768
+ event.preventDefault();
769
+ }),
770
+ onKeyDown: composeEventHandlers(props.onKeyDown, (event)=>{
771
+ const isKeyDownInside = event.currentTarget.contains(event.target);
772
+ const isCloseKey = SUB_CLOSE_KEYS[rootContext.dir].includes(event.key);
773
+ if (isKeyDownInside && isCloseKey) {
774
+ context.onOpenChange(false);
775
+ subContext.trigger?.focus();
776
+ event.preventDefault();
777
+ }
778
+ })
779
+ })
780
+ })
781
+ })
782
+ });
783
+ });
784
+ MenuSubContent.displayName = SUB_CONTENT_NAME;
785
+ function getOpenState(open) {
786
+ return open ? "open" : "closed";
787
+ }
788
+ function isIndeterminate(checked) {
789
+ return checked === "indeterminate";
790
+ }
791
+ function getCheckedState(checked) {
792
+ return isIndeterminate(checked) ? "indeterminate" : checked ? "checked" : "unchecked";
793
+ }
794
+ function focusFirst(candidates) {
795
+ const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;
796
+ for (const candidate of candidates){
797
+ if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;
798
+ candidate.focus();
799
+ if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;
800
+ }
801
+ }
802
+ function wrapArray(array, startIndex) {
803
+ return array.map((_, index)=>array[(startIndex + index) % array.length]);
804
+ }
805
+ function getNextMatch(values, search, currentMatch) {
806
+ const isRepeated = search.length > 1 && Array.from(search).every((char)=>char === search[0]);
807
+ const normalizedSearch = isRepeated ? search[0] : search;
808
+ const currentMatchIndex = currentMatch ? values.indexOf(currentMatch) : -1;
809
+ let wrappedValues = wrapArray(values, Math.max(currentMatchIndex, 0));
810
+ const excludeCurrentMatch = normalizedSearch.length === 1;
811
+ if (excludeCurrentMatch) wrappedValues = wrappedValues.filter((v)=>v !== currentMatch);
812
+ const nextMatch = wrappedValues.find((value)=>value.toLowerCase().startsWith(normalizedSearch.toLowerCase()));
813
+ return nextMatch !== currentMatch ? nextMatch : void 0;
814
+ }
815
+ function isPointInPolygon(point, polygon) {
816
+ const { x, y } = point;
817
+ let inside = false;
818
+ for(let i = 0, j = polygon.length - 1; i < polygon.length; j = i++){
819
+ const ii = polygon[i];
820
+ const jj = polygon[j];
821
+ const xi = ii.x;
822
+ const yi = ii.y;
823
+ const xj = jj.x;
824
+ const yj = jj.y;
825
+ const intersect = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;
826
+ if (intersect) inside = !inside;
827
+ }
828
+ return inside;
829
+ }
830
+ function isPointerInGraceArea(event, area) {
831
+ if (!area) return false;
832
+ const cursorPos = {
833
+ x: event.clientX,
834
+ y: event.clientY
835
+ };
836
+ return isPointInPolygon(cursorPos, area);
837
+ }
838
+ function whenMouse(handler) {
839
+ return (event)=>event.pointerType === "mouse" ? handler(event) : void 0;
840
+ }
841
+ var Root3 = Menu;
842
+ var Anchor2 = MenuAnchor;
843
+ var Portal = MenuPortal;
844
+ var Content2 = MenuContent;
845
+ var Group = MenuGroup;
846
+ var Label = MenuLabel;
847
+ var Item2 = MenuItem;
848
+ var CheckboxItem = MenuCheckboxItem;
849
+ var RadioGroup = MenuRadioGroup;
850
+ var RadioItem = MenuRadioItem;
851
+ var ItemIndicator = MenuItemIndicator;
852
+ var Separator = MenuSeparator;
853
+ var Arrow2 = MenuArrow;
854
+ var Sub = MenuSub;
855
+ var SubTrigger = MenuSubTrigger;
856
+ var SubContent = MenuSubContent;
857
+
858
+ export { Anchor2 as A, Content2 as C, Group as G, Item2 as I, Label as L, Portal as P, Root3 as R, Separator as S, CheckboxItem as a, ItemIndicator as b, createMenuScope as c, RadioGroup as d, RadioItem as e, Sub as f, SubTrigger as g, SubContent as h, Arrow2 as i };
859
+ //# sourceMappingURL=index-BF_TaONY.mjs.map