convex-cms 0.0.1 → 0.0.3

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 (267) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +99 -0
  3. package/admin-dist/nitro.json +15 -0
  4. package/admin-dist/public/assets/CmsEmptyState-CRswfTzk.js +5 -0
  5. package/admin-dist/public/assets/CmsPageHeader-CirpXndm.js +1 -0
  6. package/admin-dist/public/assets/CmsStatusBadge-CbEUpQu-.js +1 -0
  7. package/admin-dist/public/assets/CmsToolbar-BI2nZOXp.js +1 -0
  8. package/admin-dist/public/assets/ContentEntryEditor-CBeCyK_m.js +4 -0
  9. package/admin-dist/public/assets/ErrorState-BIVaWmom.js +1 -0
  10. package/admin-dist/public/assets/TaxonomyFilter-ChaY6Y_x.js +1 -0
  11. package/admin-dist/public/assets/_contentTypeId-DQ8k_Rvw.js +1 -0
  12. package/admin-dist/public/assets/_entryId-CKU_glsK.js +1 -0
  13. package/admin-dist/public/assets/alert-BXjTqrwQ.js +1 -0
  14. package/admin-dist/public/assets/badge-hvUOzpVZ.js +1 -0
  15. package/admin-dist/public/assets/circle-check-big-CF_pR17r.js +1 -0
  16. package/admin-dist/public/assets/command-DU82cJlt.js +1 -0
  17. package/admin-dist/public/assets/content-_LXl3pp7.js +1 -0
  18. package/admin-dist/public/assets/content-types-KjxaXGxY.js +2 -0
  19. package/admin-dist/public/assets/globals-CS6BZ0zp.css +1 -0
  20. package/admin-dist/public/assets/index-DNGIZHL-.js +1 -0
  21. package/admin-dist/public/assets/label-KNtpL71g.js +1 -0
  22. package/admin-dist/public/assets/link-2-Bw2aI4V4.js +1 -0
  23. package/admin-dist/public/assets/list-sYepHjt_.js +1 -0
  24. package/admin-dist/public/assets/main-CKj5yfEi.js +97 -0
  25. package/admin-dist/public/assets/media-Bkrkffm7.js +1 -0
  26. package/admin-dist/public/assets/new._contentTypeId-C3LstjNs.js +1 -0
  27. package/admin-dist/public/assets/plus-DUn8v_Xf.js +1 -0
  28. package/admin-dist/public/assets/rotate-ccw-DJEoHcRI.js +1 -0
  29. package/admin-dist/public/assets/scroll-area-DfIlT0in.js +1 -0
  30. package/admin-dist/public/assets/search-MuAUDJKR.js +1 -0
  31. package/admin-dist/public/assets/select-BD29IXCI.js +1 -0
  32. package/admin-dist/public/assets/settings-DmMyn_6A.js +1 -0
  33. package/admin-dist/public/assets/switch-h3Rrnl5i.js +1 -0
  34. package/admin-dist/public/assets/tabs-imc8h-Dp.js +1 -0
  35. package/admin-dist/public/assets/taxonomies-dAsrT65H.js +1 -0
  36. package/admin-dist/public/assets/textarea-BTy7nwzR.js +1 -0
  37. package/admin-dist/public/assets/trash-SAWKZZHv.js +1 -0
  38. package/admin-dist/public/assets/triangle-alert-E52Vfeuh.js +1 -0
  39. package/admin-dist/public/assets/useBreadcrumbLabel-BECBMCzM.js +1 -0
  40. package/admin-dist/public/assets/usePermissions-Basjs9BT.js +1 -0
  41. package/admin-dist/public/favicon.ico +0 -0
  42. package/admin-dist/server/_chunks/_libs/@date-fns/tz.mjs +217 -0
  43. package/admin-dist/server/_chunks/_libs/@floating-ui/core.mjs +719 -0
  44. package/admin-dist/server/_chunks/_libs/@floating-ui/dom.mjs +622 -0
  45. package/admin-dist/server/_chunks/_libs/@floating-ui/react-dom.mjs +292 -0
  46. package/admin-dist/server/_chunks/_libs/@floating-ui/utils.mjs +320 -0
  47. package/admin-dist/server/_chunks/_libs/@radix-ui/number.mjs +6 -0
  48. package/admin-dist/server/_chunks/_libs/@radix-ui/primitive.mjs +11 -0
  49. package/admin-dist/server/_chunks/_libs/@radix-ui/react-arrow.mjs +23 -0
  50. package/admin-dist/server/_chunks/_libs/@radix-ui/react-avatar.mjs +119 -0
  51. package/admin-dist/server/_chunks/_libs/@radix-ui/react-checkbox.mjs +270 -0
  52. package/admin-dist/server/_chunks/_libs/@radix-ui/react-collection.mjs +69 -0
  53. package/admin-dist/server/_chunks/_libs/@radix-ui/react-compose-refs.mjs +39 -0
  54. package/admin-dist/server/_chunks/_libs/@radix-ui/react-context.mjs +137 -0
  55. package/admin-dist/server/_chunks/_libs/@radix-ui/react-dialog.mjs +325 -0
  56. package/admin-dist/server/_chunks/_libs/@radix-ui/react-direction.mjs +9 -0
  57. package/admin-dist/server/_chunks/_libs/@radix-ui/react-dismissable-layer.mjs +210 -0
  58. package/admin-dist/server/_chunks/_libs/@radix-ui/react-dropdown-menu.mjs +253 -0
  59. package/admin-dist/server/_chunks/_libs/@radix-ui/react-focus-guards.mjs +29 -0
  60. package/admin-dist/server/_chunks/_libs/@radix-ui/react-focus-scope.mjs +206 -0
  61. package/admin-dist/server/_chunks/_libs/@radix-ui/react-id.mjs +14 -0
  62. package/admin-dist/server/_chunks/_libs/@radix-ui/react-label.mjs +23 -0
  63. package/admin-dist/server/_chunks/_libs/@radix-ui/react-menu.mjs +812 -0
  64. package/admin-dist/server/_chunks/_libs/@radix-ui/react-popover.mjs +300 -0
  65. package/admin-dist/server/_chunks/_libs/@radix-ui/react-popper.mjs +286 -0
  66. package/admin-dist/server/_chunks/_libs/@radix-ui/react-portal.mjs +16 -0
  67. package/admin-dist/server/_chunks/_libs/@radix-ui/react-presence.mjs +128 -0
  68. package/admin-dist/server/_chunks/_libs/@radix-ui/react-primitive.mjs +141 -0
  69. package/admin-dist/server/_chunks/_libs/@radix-ui/react-roving-focus.mjs +224 -0
  70. package/admin-dist/server/_chunks/_libs/@radix-ui/react-scroll-area.mjs +721 -0
  71. package/admin-dist/server/_chunks/_libs/@radix-ui/react-select.mjs +1163 -0
  72. package/admin-dist/server/_chunks/_libs/@radix-ui/react-separator.mjs +28 -0
  73. package/admin-dist/server/_chunks/_libs/@radix-ui/react-slot.mjs +601 -0
  74. package/admin-dist/server/_chunks/_libs/@radix-ui/react-switch.mjs +152 -0
  75. package/admin-dist/server/_chunks/_libs/@radix-ui/react-tabs.mjs +189 -0
  76. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-callback-ref.mjs +11 -0
  77. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-controllable-state.mjs +69 -0
  78. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-effect-event.mjs +1 -0
  79. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-escape-keydown.mjs +17 -0
  80. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-is-hydrated.mjs +15 -0
  81. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-layout-effect.mjs +6 -0
  82. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-previous.mjs +14 -0
  83. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-size.mjs +39 -0
  84. package/admin-dist/server/_chunks/_libs/@radix-ui/react-visually-hidden.mjs +33 -0
  85. package/admin-dist/server/_chunks/_libs/@tanstack/history.mjs +409 -0
  86. package/admin-dist/server/_chunks/_libs/@tanstack/react-router.mjs +1711 -0
  87. package/admin-dist/server/_chunks/_libs/@tanstack/react-store.mjs +56 -0
  88. package/admin-dist/server/_chunks/_libs/@tanstack/router-core.mjs +4829 -0
  89. package/admin-dist/server/_chunks/_libs/@tanstack/store.mjs +134 -0
  90. package/admin-dist/server/_chunks/_libs/react-dom.mjs +10781 -0
  91. package/admin-dist/server/_chunks/_libs/react.mjs +513 -0
  92. package/admin-dist/server/_libs/aria-hidden.mjs +122 -0
  93. package/admin-dist/server/_libs/class-variance-authority.mjs +44 -0
  94. package/admin-dist/server/_libs/clsx.mjs +16 -0
  95. package/admin-dist/server/_libs/cmdk.mjs +315 -0
  96. package/admin-dist/server/_libs/convex.mjs +4841 -0
  97. package/admin-dist/server/_libs/cookie-es.mjs +58 -0
  98. package/admin-dist/server/_libs/croner.mjs +1 -0
  99. package/admin-dist/server/_libs/crossws.mjs +1 -0
  100. package/admin-dist/server/_libs/date-fns.mjs +1716 -0
  101. package/admin-dist/server/_libs/detect-node-es.mjs +1 -0
  102. package/admin-dist/server/_libs/get-nonce.mjs +9 -0
  103. package/admin-dist/server/_libs/h3-v2.mjs +277 -0
  104. package/admin-dist/server/_libs/h3.mjs +401 -0
  105. package/admin-dist/server/_libs/hookable.mjs +1 -0
  106. package/admin-dist/server/_libs/isbot.mjs +20 -0
  107. package/admin-dist/server/_libs/lucide-react.mjs +850 -0
  108. package/admin-dist/server/_libs/ohash.mjs +1 -0
  109. package/admin-dist/server/_libs/react-day-picker.mjs +2201 -0
  110. package/admin-dist/server/_libs/react-remove-scroll-bar.mjs +82 -0
  111. package/admin-dist/server/_libs/react-remove-scroll.mjs +328 -0
  112. package/admin-dist/server/_libs/react-style-singleton.mjs +69 -0
  113. package/admin-dist/server/_libs/rou3.mjs +8 -0
  114. package/admin-dist/server/_libs/seroval-plugins.mjs +58 -0
  115. package/admin-dist/server/_libs/seroval.mjs +1765 -0
  116. package/admin-dist/server/_libs/srvx.mjs +719 -0
  117. package/admin-dist/server/_libs/tailwind-merge.mjs +3010 -0
  118. package/admin-dist/server/_libs/tiny-invariant.mjs +12 -0
  119. package/admin-dist/server/_libs/tiny-warning.mjs +5 -0
  120. package/admin-dist/server/_libs/tslib.mjs +39 -0
  121. package/admin-dist/server/_libs/ufo.mjs +54 -0
  122. package/admin-dist/server/_libs/unctx.mjs +1 -0
  123. package/admin-dist/server/_libs/unstorage.mjs +1 -0
  124. package/admin-dist/server/_libs/use-callback-ref.mjs +66 -0
  125. package/admin-dist/server/_libs/use-sidecar.mjs +106 -0
  126. package/admin-dist/server/_libs/use-sync-external-store.mjs +139 -0
  127. package/admin-dist/server/_libs/zod.mjs +4223 -0
  128. package/admin-dist/server/_ssr/CmsEmptyState-DU7-7-mV.mjs +290 -0
  129. package/admin-dist/server/_ssr/CmsPageHeader-CseW0AHm.mjs +24 -0
  130. package/admin-dist/server/_ssr/CmsStatusBadge-B_pi4KCp.mjs +127 -0
  131. package/admin-dist/server/_ssr/CmsToolbar-X75ex6ek.mjs +49 -0
  132. package/admin-dist/server/_ssr/ContentEntryEditor-CepusRsA.mjs +3720 -0
  133. package/admin-dist/server/_ssr/ErrorState-cI-bKLez.mjs +89 -0
  134. package/admin-dist/server/_ssr/TaxonomyFilter-Bwrq0-cz.mjs +188 -0
  135. package/admin-dist/server/_ssr/_contentTypeId-BqYKEcLr.mjs +379 -0
  136. package/admin-dist/server/_ssr/_entryId-CRfnqeDf.mjs +161 -0
  137. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-BwDlABVk.mjs +4 -0
  138. package/admin-dist/server/_ssr/alert-CVt45UUP.mjs +92 -0
  139. package/admin-dist/server/_ssr/badge-6BsP37vG.mjs +125 -0
  140. package/admin-dist/server/_ssr/command-fy8epIKf.mjs +128 -0
  141. package/admin-dist/server/_ssr/config.server-D7JHDcDv.mjs +117 -0
  142. package/admin-dist/server/_ssr/content-B5RhL7uW.mjs +532 -0
  143. package/admin-dist/server/_ssr/content-types-BIOqCQYN.mjs +1166 -0
  144. package/admin-dist/server/_ssr/index-DHSHDPt1.mjs +193 -0
  145. package/admin-dist/server/_ssr/index.mjs +1275 -0
  146. package/admin-dist/server/_ssr/label-C8Dko1j7.mjs +22 -0
  147. package/admin-dist/server/_ssr/media-CSx3XttC.mjs +1832 -0
  148. package/admin-dist/server/_ssr/new._contentTypeId-DzanEZQM.mjs +144 -0
  149. package/admin-dist/server/_ssr/router-DDWcF-kt.mjs +1556 -0
  150. package/admin-dist/server/_ssr/scroll-area-bjPYwhXN.mjs +59 -0
  151. package/admin-dist/server/_ssr/select-BUhDDf4T.mjs +142 -0
  152. package/admin-dist/server/_ssr/settings-DAsxnw2q.mjs +348 -0
  153. package/admin-dist/server/_ssr/start-HYkvq4Ni.mjs +4 -0
  154. package/admin-dist/server/_ssr/switch-BgyRtQ1Z.mjs +31 -0
  155. package/admin-dist/server/_ssr/tabs-DzMdRB1A.mjs +628 -0
  156. package/admin-dist/server/_ssr/taxonomies-C8j8g5Q5.mjs +915 -0
  157. package/admin-dist/server/_ssr/textarea-9jNeYJSc.mjs +18 -0
  158. package/admin-dist/server/_ssr/trash-DYMxwhZB.mjs +291 -0
  159. package/admin-dist/server/_ssr/useBreadcrumbLabel-FNSAr2Ha.mjs +16 -0
  160. package/admin-dist/server/_ssr/usePermissions-BJGGahrJ.mjs +68 -0
  161. package/admin-dist/server/favicon.ico +0 -0
  162. package/admin-dist/server/index.mjs +627 -0
  163. package/dist/cli/index.js +0 -0
  164. package/dist/client/admin-config.d.ts +0 -1
  165. package/dist/client/admin-config.d.ts.map +1 -1
  166. package/dist/client/admin-config.js +0 -1
  167. package/dist/client/admin-config.js.map +1 -1
  168. package/dist/client/adminApi.d.ts.map +1 -1
  169. package/dist/client/agentTools.d.ts +1237 -135
  170. package/dist/client/agentTools.d.ts.map +1 -1
  171. package/dist/client/agentTools.js +33 -9
  172. package/dist/client/agentTools.js.map +1 -1
  173. package/dist/client/index.d.ts +1 -1
  174. package/dist/client/index.d.ts.map +1 -1
  175. package/dist/client/index.js.map +1 -1
  176. package/dist/component/_generated/component.d.ts +9 -0
  177. package/dist/component/_generated/component.d.ts.map +1 -1
  178. package/dist/component/mediaAssets.d.ts +35 -0
  179. package/dist/component/mediaAssets.d.ts.map +1 -1
  180. package/dist/component/mediaAssets.js +81 -0
  181. package/dist/component/mediaAssets.js.map +1 -1
  182. package/dist/test.d.ts.map +1 -1
  183. package/dist/test.js +2 -1
  184. package/dist/test.js.map +1 -1
  185. package/package.json +24 -9
  186. package/dist/component/auditLog.d.ts +0 -410
  187. package/dist/component/auditLog.d.ts.map +0 -1
  188. package/dist/component/auditLog.js +0 -607
  189. package/dist/component/auditLog.js.map +0 -1
  190. package/dist/component/types.d.ts +0 -4
  191. package/dist/component/types.d.ts.map +0 -1
  192. package/dist/component/types.js +0 -2
  193. package/dist/component/types.js.map +0 -1
  194. package/src/cli/commands/admin.ts +0 -104
  195. package/src/cli/index.ts +0 -21
  196. package/src/cli/utils/detectConvexUrl.ts +0 -54
  197. package/src/cli/utils/openBrowser.ts +0 -16
  198. package/src/client/admin-config.ts +0 -138
  199. package/src/client/adminApi.ts +0 -942
  200. package/src/client/agentTools.ts +0 -1311
  201. package/src/client/argTypes.ts +0 -316
  202. package/src/client/field-types.ts +0 -187
  203. package/src/client/index.ts +0 -1301
  204. package/src/client/queryBuilder.ts +0 -1100
  205. package/src/client/schema/codegen.ts +0 -500
  206. package/src/client/schema/defineContentType.ts +0 -501
  207. package/src/client/schema/index.ts +0 -169
  208. package/src/client/schema/schemaDrift.ts +0 -574
  209. package/src/client/schema/typedClient.ts +0 -688
  210. package/src/client/schema/types.ts +0 -666
  211. package/src/client/types.ts +0 -723
  212. package/src/client/workflows.ts +0 -141
  213. package/src/client/wrapper.ts +0 -4304
  214. package/src/component/_generated/api.ts +0 -140
  215. package/src/component/_generated/component.ts +0 -5029
  216. package/src/component/_generated/dataModel.ts +0 -60
  217. package/src/component/_generated/server.ts +0 -156
  218. package/src/component/authorization.ts +0 -647
  219. package/src/component/authorizationHooks.ts +0 -668
  220. package/src/component/bulkOperations.ts +0 -687
  221. package/src/component/contentEntries.ts +0 -1976
  222. package/src/component/contentEntryMutations.ts +0 -1223
  223. package/src/component/contentEntryValidation.ts +0 -707
  224. package/src/component/contentLock.ts +0 -550
  225. package/src/component/contentTypeMigration.ts +0 -1064
  226. package/src/component/contentTypeMutations.ts +0 -969
  227. package/src/component/contentTypes.ts +0 -346
  228. package/src/component/convex.config.ts +0 -44
  229. package/src/component/documentTypes.ts +0 -240
  230. package/src/component/eventEmitter.ts +0 -485
  231. package/src/component/exportImport.ts +0 -1169
  232. package/src/component/index.ts +0 -491
  233. package/src/component/lib/deepReferenceResolver.ts +0 -999
  234. package/src/component/lib/errors.ts +0 -816
  235. package/src/component/lib/index.ts +0 -145
  236. package/src/component/lib/mediaReferenceResolver.ts +0 -495
  237. package/src/component/lib/metadataExtractor.ts +0 -792
  238. package/src/component/lib/mutationAuth.ts +0 -199
  239. package/src/component/lib/queries.ts +0 -79
  240. package/src/component/lib/ragContentChunker.ts +0 -1371
  241. package/src/component/lib/referenceResolver.ts +0 -430
  242. package/src/component/lib/slugGenerator.ts +0 -262
  243. package/src/component/lib/slugUniqueness.ts +0 -333
  244. package/src/component/lib/softDelete.ts +0 -44
  245. package/src/component/localeFallbackChain.ts +0 -673
  246. package/src/component/localeFields.ts +0 -896
  247. package/src/component/mediaAssetMutations.ts +0 -725
  248. package/src/component/mediaAssets.ts +0 -932
  249. package/src/component/mediaFolderMutations.ts +0 -1046
  250. package/src/component/mediaUploadMutations.ts +0 -224
  251. package/src/component/mediaVariantMutations.ts +0 -900
  252. package/src/component/mediaVariants.ts +0 -793
  253. package/src/component/ragContentIndexer.ts +0 -1067
  254. package/src/component/rateLimitHooks.ts +0 -572
  255. package/src/component/roles.ts +0 -1360
  256. package/src/component/scheduledPublish.ts +0 -358
  257. package/src/component/schema.ts +0 -617
  258. package/src/component/taxonomies.ts +0 -949
  259. package/src/component/taxonomyMutations.ts +0 -1210
  260. package/src/component/trash.ts +0 -724
  261. package/src/component/userContext.ts +0 -898
  262. package/src/component/validation.ts +0 -1388
  263. package/src/component/validators.ts +0 -949
  264. package/src/component/versionMutations.ts +0 -392
  265. package/src/component/webhookTrigger.ts +0 -1922
  266. package/src/react/index.ts +0 -898
  267. package/src/test.ts +0 -1580
@@ -0,0 +1,812 @@
1
+ import { r as reactExports, j as jsxRuntimeExports } from "../react.mjs";
2
+ import { c as composeEventHandlers } from "./primitive.mjs";
3
+ import { c as createCollection } from "./react-collection.mjs";
4
+ import { u as useComposedRefs, c as composeRefs } from "./react-compose-refs.mjs";
5
+ import { c as createContextScope } from "./react-context.mjs";
6
+ import { u as useDirection } from "./react-direction.mjs";
7
+ import { D as DismissableLayer } from "./react-dismissable-layer.mjs";
8
+ import { u as useFocusGuards } from "./react-focus-guards.mjs";
9
+ import { F as FocusScope } from "./react-focus-scope.mjs";
10
+ import { R as Root2, A as Anchor, c as createPopperScope, C as Content, a as Arrow } from "./react-popper.mjs";
11
+ import { P as Portal$1 } from "./react-portal.mjs";
12
+ import { P as Presence } from "./react-presence.mjs";
13
+ import { P as Primitive, d as dispatchDiscreteCustomEvent } from "./react-primitive.mjs";
14
+ import { I as Item, c as createRovingFocusGroupScope, R as Root } from "./react-roving-focus.mjs";
15
+ import { d as createSlot } from "./react-slot.mjs";
16
+ import { u as useCallbackRef } from "./react-use-callback-ref.mjs";
17
+ import { h as hideOthers } from "../../../_libs/aria-hidden.mjs";
18
+ import { R as ReactRemoveScroll } from "../../../_libs/react-remove-scroll.mjs";
19
+ var SELECTION_KEYS = ["Enter", " "];
20
+ var FIRST_KEYS = ["ArrowDown", "PageUp", "Home"];
21
+ var LAST_KEYS = ["ArrowUp", "PageDown", "End"];
22
+ var FIRST_LAST_KEYS = [...FIRST_KEYS, ...LAST_KEYS];
23
+ var SUB_OPEN_KEYS = {
24
+ ltr: [...SELECTION_KEYS, "ArrowRight"],
25
+ rtl: [...SELECTION_KEYS, "ArrowLeft"]
26
+ };
27
+ var SUB_CLOSE_KEYS = {
28
+ ltr: ["ArrowLeft"],
29
+ rtl: ["ArrowRight"]
30
+ };
31
+ var MENU_NAME = "Menu";
32
+ var [Collection, useCollection, createCollectionScope] = createCollection(MENU_NAME);
33
+ var [createMenuContext, createMenuScope] = createContextScope(MENU_NAME, [
34
+ createCollectionScope,
35
+ createPopperScope,
36
+ createRovingFocusGroupScope
37
+ ]);
38
+ var usePopperScope = createPopperScope();
39
+ var useRovingFocusGroupScope = createRovingFocusGroupScope();
40
+ var [MenuProvider, useMenuContext] = createMenuContext(MENU_NAME);
41
+ var [MenuRootProvider, useMenuRootContext] = createMenuContext(MENU_NAME);
42
+ var Menu = (props) => {
43
+ const { __scopeMenu, open = false, children, dir, onOpenChange, modal = true } = props;
44
+ const popperScope = usePopperScope(__scopeMenu);
45
+ const [content, setContent] = reactExports.useState(null);
46
+ const isUsingKeyboardRef = reactExports.useRef(false);
47
+ const handleOpenChange = useCallbackRef(onOpenChange);
48
+ const direction = useDirection(dir);
49
+ reactExports.useEffect(() => {
50
+ const handleKeyDown = () => {
51
+ isUsingKeyboardRef.current = true;
52
+ document.addEventListener("pointerdown", handlePointer, { capture: true, once: true });
53
+ document.addEventListener("pointermove", handlePointer, { capture: true, once: true });
54
+ };
55
+ const handlePointer = () => isUsingKeyboardRef.current = false;
56
+ document.addEventListener("keydown", handleKeyDown, { capture: true });
57
+ return () => {
58
+ document.removeEventListener("keydown", handleKeyDown, { capture: true });
59
+ document.removeEventListener("pointerdown", handlePointer, { capture: true });
60
+ document.removeEventListener("pointermove", handlePointer, { capture: true });
61
+ };
62
+ }, []);
63
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Root2, { ...popperScope, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
64
+ MenuProvider,
65
+ {
66
+ scope: __scopeMenu,
67
+ open,
68
+ onOpenChange: handleOpenChange,
69
+ content,
70
+ onContentChange: setContent,
71
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
72
+ MenuRootProvider,
73
+ {
74
+ scope: __scopeMenu,
75
+ onClose: reactExports.useCallback(() => handleOpenChange(false), [handleOpenChange]),
76
+ isUsingKeyboardRef,
77
+ dir: direction,
78
+ modal,
79
+ children
80
+ }
81
+ )
82
+ }
83
+ ) });
84
+ };
85
+ Menu.displayName = MENU_NAME;
86
+ var ANCHOR_NAME = "MenuAnchor";
87
+ var MenuAnchor = reactExports.forwardRef(
88
+ (props, forwardedRef) => {
89
+ const { __scopeMenu, ...anchorProps } = props;
90
+ const popperScope = usePopperScope(__scopeMenu);
91
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Anchor, { ...popperScope, ...anchorProps, ref: forwardedRef });
92
+ }
93
+ );
94
+ MenuAnchor.displayName = ANCHOR_NAME;
95
+ var PORTAL_NAME = "MenuPortal";
96
+ var [PortalProvider, usePortalContext] = createMenuContext(PORTAL_NAME, {
97
+ forceMount: void 0
98
+ });
99
+ var MenuPortal = (props) => {
100
+ const { __scopeMenu, forceMount, children, container } = props;
101
+ const context = useMenuContext(PORTAL_NAME, __scopeMenu);
102
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(PortalProvider, { scope: __scopeMenu, forceMount, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Portal$1, { asChild: true, container, children }) }) });
103
+ };
104
+ MenuPortal.displayName = PORTAL_NAME;
105
+ var CONTENT_NAME = "MenuContent";
106
+ var [MenuContentProvider, useMenuContentContext] = createMenuContext(CONTENT_NAME);
107
+ var MenuContent = reactExports.forwardRef(
108
+ (props, forwardedRef) => {
109
+ const portalContext = usePortalContext(CONTENT_NAME, props.__scopeMenu);
110
+ const { forceMount = portalContext.forceMount, ...contentProps } = props;
111
+ const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);
112
+ const rootContext = useMenuRootContext(CONTENT_NAME, props.__scopeMenu);
113
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Collection.Provider, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Collection.Slot, { scope: props.__scopeMenu, children: rootContext.modal ? /* @__PURE__ */ jsxRuntimeExports.jsx(MenuRootContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsxRuntimeExports.jsx(MenuRootContentNonModal, { ...contentProps, ref: forwardedRef }) }) }) });
114
+ }
115
+ );
116
+ var MenuRootContentModal = reactExports.forwardRef(
117
+ (props, forwardedRef) => {
118
+ const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);
119
+ const ref = reactExports.useRef(null);
120
+ const composedRefs = useComposedRefs(forwardedRef, ref);
121
+ reactExports.useEffect(() => {
122
+ const content = ref.current;
123
+ if (content) return hideOthers(content);
124
+ }, []);
125
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
126
+ MenuContentImpl,
127
+ {
128
+ ...props,
129
+ ref: composedRefs,
130
+ trapFocus: context.open,
131
+ disableOutsidePointerEvents: context.open,
132
+ disableOutsideScroll: true,
133
+ onFocusOutside: composeEventHandlers(
134
+ props.onFocusOutside,
135
+ (event) => event.preventDefault(),
136
+ { checkForDefaultPrevented: false }
137
+ ),
138
+ onDismiss: () => context.onOpenChange(false)
139
+ }
140
+ );
141
+ }
142
+ );
143
+ var MenuRootContentNonModal = reactExports.forwardRef((props, forwardedRef) => {
144
+ const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);
145
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
146
+ MenuContentImpl,
147
+ {
148
+ ...props,
149
+ ref: forwardedRef,
150
+ trapFocus: false,
151
+ disableOutsidePointerEvents: false,
152
+ disableOutsideScroll: false,
153
+ onDismiss: () => context.onOpenChange(false)
154
+ }
155
+ );
156
+ });
157
+ var Slot = createSlot("MenuContent.ScrollLock");
158
+ var MenuContentImpl = reactExports.forwardRef(
159
+ (props, forwardedRef) => {
160
+ const {
161
+ __scopeMenu,
162
+ loop = false,
163
+ trapFocus,
164
+ onOpenAutoFocus,
165
+ onCloseAutoFocus,
166
+ disableOutsidePointerEvents,
167
+ onEntryFocus,
168
+ onEscapeKeyDown,
169
+ onPointerDownOutside,
170
+ onFocusOutside,
171
+ onInteractOutside,
172
+ onDismiss,
173
+ disableOutsideScroll,
174
+ ...contentProps
175
+ } = props;
176
+ const context = useMenuContext(CONTENT_NAME, __scopeMenu);
177
+ const rootContext = useMenuRootContext(CONTENT_NAME, __scopeMenu);
178
+ const popperScope = usePopperScope(__scopeMenu);
179
+ const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeMenu);
180
+ const getItems = useCollection(__scopeMenu);
181
+ const [currentItemId, setCurrentItemId] = reactExports.useState(null);
182
+ const contentRef = reactExports.useRef(null);
183
+ const composedRefs = useComposedRefs(forwardedRef, contentRef, context.onContentChange);
184
+ const timerRef = reactExports.useRef(0);
185
+ const searchRef = reactExports.useRef("");
186
+ const pointerGraceTimerRef = reactExports.useRef(0);
187
+ const pointerGraceIntentRef = reactExports.useRef(null);
188
+ const pointerDirRef = reactExports.useRef("right");
189
+ const lastPointerXRef = reactExports.useRef(0);
190
+ const ScrollLockWrapper = disableOutsideScroll ? ReactRemoveScroll : reactExports.Fragment;
191
+ const scrollLockWrapperProps = disableOutsideScroll ? { as: Slot, allowPinchZoom: true } : void 0;
192
+ const handleTypeaheadSearch = (key) => {
193
+ const search = searchRef.current + key;
194
+ const items = getItems().filter((item) => !item.disabled);
195
+ const currentItem = document.activeElement;
196
+ const currentMatch = items.find((item) => item.ref.current === currentItem)?.textValue;
197
+ const values = items.map((item) => item.textValue);
198
+ const nextMatch = getNextMatch(values, search, currentMatch);
199
+ const newItem = items.find((item) => item.textValue === nextMatch)?.ref.current;
200
+ (function updateSearch(value) {
201
+ searchRef.current = value;
202
+ window.clearTimeout(timerRef.current);
203
+ if (value !== "") timerRef.current = window.setTimeout(() => updateSearch(""), 1e3);
204
+ })(search);
205
+ if (newItem) {
206
+ setTimeout(() => newItem.focus());
207
+ }
208
+ };
209
+ reactExports.useEffect(() => {
210
+ return () => window.clearTimeout(timerRef.current);
211
+ }, []);
212
+ useFocusGuards();
213
+ const isPointerMovingToSubmenu = reactExports.useCallback((event) => {
214
+ const isMovingTowards = pointerDirRef.current === pointerGraceIntentRef.current?.side;
215
+ return isMovingTowards && isPointerInGraceArea(event, pointerGraceIntentRef.current?.area);
216
+ }, []);
217
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
218
+ MenuContentProvider,
219
+ {
220
+ scope: __scopeMenu,
221
+ searchRef,
222
+ onItemEnter: reactExports.useCallback(
223
+ (event) => {
224
+ if (isPointerMovingToSubmenu(event)) event.preventDefault();
225
+ },
226
+ [isPointerMovingToSubmenu]
227
+ ),
228
+ onItemLeave: reactExports.useCallback(
229
+ (event) => {
230
+ if (isPointerMovingToSubmenu(event)) return;
231
+ contentRef.current?.focus();
232
+ setCurrentItemId(null);
233
+ },
234
+ [isPointerMovingToSubmenu]
235
+ ),
236
+ onTriggerLeave: reactExports.useCallback(
237
+ (event) => {
238
+ if (isPointerMovingToSubmenu(event)) event.preventDefault();
239
+ },
240
+ [isPointerMovingToSubmenu]
241
+ ),
242
+ pointerGraceTimerRef,
243
+ onPointerGraceIntentChange: reactExports.useCallback((intent) => {
244
+ pointerGraceIntentRef.current = intent;
245
+ }, []),
246
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollLockWrapper, { ...scrollLockWrapperProps, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
247
+ FocusScope,
248
+ {
249
+ asChild: true,
250
+ trapped: trapFocus,
251
+ onMountAutoFocus: composeEventHandlers(onOpenAutoFocus, (event) => {
252
+ event.preventDefault();
253
+ contentRef.current?.focus({ preventScroll: true });
254
+ }),
255
+ onUnmountAutoFocus: onCloseAutoFocus,
256
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
257
+ DismissableLayer,
258
+ {
259
+ asChild: true,
260
+ disableOutsidePointerEvents,
261
+ onEscapeKeyDown,
262
+ onPointerDownOutside,
263
+ onFocusOutside,
264
+ onInteractOutside,
265
+ onDismiss,
266
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
267
+ Root,
268
+ {
269
+ asChild: true,
270
+ ...rovingFocusGroupScope,
271
+ dir: rootContext.dir,
272
+ orientation: "vertical",
273
+ loop,
274
+ currentTabStopId: currentItemId,
275
+ onCurrentTabStopIdChange: setCurrentItemId,
276
+ onEntryFocus: composeEventHandlers(onEntryFocus, (event) => {
277
+ if (!rootContext.isUsingKeyboardRef.current) event.preventDefault();
278
+ }),
279
+ preventScrollOnEntryFocus: true,
280
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
281
+ Content,
282
+ {
283
+ role: "menu",
284
+ "aria-orientation": "vertical",
285
+ "data-state": getOpenState(context.open),
286
+ "data-radix-menu-content": "",
287
+ dir: rootContext.dir,
288
+ ...popperScope,
289
+ ...contentProps,
290
+ ref: composedRefs,
291
+ style: { outline: "none", ...contentProps.style },
292
+ onKeyDown: composeEventHandlers(contentProps.onKeyDown, (event) => {
293
+ const target = event.target;
294
+ const isKeyDownInside = target.closest("[data-radix-menu-content]") === event.currentTarget;
295
+ const isModifierKey = event.ctrlKey || event.altKey || event.metaKey;
296
+ const isCharacterKey = event.key.length === 1;
297
+ if (isKeyDownInside) {
298
+ if (event.key === "Tab") event.preventDefault();
299
+ if (!isModifierKey && isCharacterKey) handleTypeaheadSearch(event.key);
300
+ }
301
+ const content = contentRef.current;
302
+ if (event.target !== content) return;
303
+ if (!FIRST_LAST_KEYS.includes(event.key)) return;
304
+ event.preventDefault();
305
+ const items = getItems().filter((item) => !item.disabled);
306
+ const candidateNodes = items.map((item) => item.ref.current);
307
+ if (LAST_KEYS.includes(event.key)) candidateNodes.reverse();
308
+ focusFirst(candidateNodes);
309
+ }),
310
+ onBlur: composeEventHandlers(props.onBlur, (event) => {
311
+ if (!event.currentTarget.contains(event.target)) {
312
+ window.clearTimeout(timerRef.current);
313
+ searchRef.current = "";
314
+ }
315
+ }),
316
+ onPointerMove: composeEventHandlers(
317
+ props.onPointerMove,
318
+ whenMouse((event) => {
319
+ const target = event.target;
320
+ const pointerXHasChanged = lastPointerXRef.current !== event.clientX;
321
+ if (event.currentTarget.contains(target) && pointerXHasChanged) {
322
+ const newDir = event.clientX > lastPointerXRef.current ? "right" : "left";
323
+ pointerDirRef.current = newDir;
324
+ lastPointerXRef.current = event.clientX;
325
+ }
326
+ })
327
+ )
328
+ }
329
+ )
330
+ }
331
+ )
332
+ }
333
+ )
334
+ }
335
+ ) })
336
+ }
337
+ );
338
+ }
339
+ );
340
+ MenuContent.displayName = CONTENT_NAME;
341
+ var GROUP_NAME = "MenuGroup";
342
+ var MenuGroup = reactExports.forwardRef(
343
+ (props, forwardedRef) => {
344
+ const { __scopeMenu, ...groupProps } = props;
345
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Primitive.div, { role: "group", ...groupProps, ref: forwardedRef });
346
+ }
347
+ );
348
+ MenuGroup.displayName = GROUP_NAME;
349
+ var LABEL_NAME = "MenuLabel";
350
+ var MenuLabel = reactExports.forwardRef(
351
+ (props, forwardedRef) => {
352
+ const { __scopeMenu, ...labelProps } = props;
353
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Primitive.div, { ...labelProps, ref: forwardedRef });
354
+ }
355
+ );
356
+ MenuLabel.displayName = LABEL_NAME;
357
+ var ITEM_NAME = "MenuItem";
358
+ var ITEM_SELECT = "menu.itemSelect";
359
+ var MenuItem = reactExports.forwardRef(
360
+ (props, forwardedRef) => {
361
+ const { disabled = false, onSelect, ...itemProps } = props;
362
+ const ref = reactExports.useRef(null);
363
+ const rootContext = useMenuRootContext(ITEM_NAME, props.__scopeMenu);
364
+ const contentContext = useMenuContentContext(ITEM_NAME, props.__scopeMenu);
365
+ const composedRefs = useComposedRefs(forwardedRef, ref);
366
+ const isPointerDownRef = reactExports.useRef(false);
367
+ const handleSelect = () => {
368
+ const menuItem = ref.current;
369
+ if (!disabled && menuItem) {
370
+ const itemSelectEvent = new CustomEvent(ITEM_SELECT, { bubbles: true, cancelable: true });
371
+ menuItem.addEventListener(ITEM_SELECT, (event) => onSelect?.(event), { once: true });
372
+ dispatchDiscreteCustomEvent(menuItem, itemSelectEvent);
373
+ if (itemSelectEvent.defaultPrevented) {
374
+ isPointerDownRef.current = false;
375
+ } else {
376
+ rootContext.onClose();
377
+ }
378
+ }
379
+ };
380
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
381
+ MenuItemImpl,
382
+ {
383
+ ...itemProps,
384
+ ref: composedRefs,
385
+ disabled,
386
+ onClick: composeEventHandlers(props.onClick, handleSelect),
387
+ onPointerDown: (event) => {
388
+ props.onPointerDown?.(event);
389
+ isPointerDownRef.current = true;
390
+ },
391
+ onPointerUp: composeEventHandlers(props.onPointerUp, (event) => {
392
+ if (!isPointerDownRef.current) event.currentTarget?.click();
393
+ }),
394
+ onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {
395
+ const isTypingAhead = contentContext.searchRef.current !== "";
396
+ if (disabled || isTypingAhead && event.key === " ") return;
397
+ if (SELECTION_KEYS.includes(event.key)) {
398
+ event.currentTarget.click();
399
+ event.preventDefault();
400
+ }
401
+ })
402
+ }
403
+ );
404
+ }
405
+ );
406
+ MenuItem.displayName = ITEM_NAME;
407
+ var MenuItemImpl = reactExports.forwardRef(
408
+ (props, forwardedRef) => {
409
+ const { __scopeMenu, disabled = false, textValue, ...itemProps } = props;
410
+ const contentContext = useMenuContentContext(ITEM_NAME, __scopeMenu);
411
+ const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeMenu);
412
+ const ref = reactExports.useRef(null);
413
+ const composedRefs = useComposedRefs(forwardedRef, ref);
414
+ const [isFocused, setIsFocused] = reactExports.useState(false);
415
+ const [textContent, setTextContent] = reactExports.useState("");
416
+ reactExports.useEffect(() => {
417
+ const menuItem = ref.current;
418
+ if (menuItem) {
419
+ setTextContent((menuItem.textContent ?? "").trim());
420
+ }
421
+ }, [itemProps.children]);
422
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
423
+ Collection.ItemSlot,
424
+ {
425
+ scope: __scopeMenu,
426
+ disabled,
427
+ textValue: textValue ?? textContent,
428
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(Item, { asChild: true, ...rovingFocusGroupScope, focusable: !disabled, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
429
+ Primitive.div,
430
+ {
431
+ role: "menuitem",
432
+ "data-highlighted": isFocused ? "" : void 0,
433
+ "aria-disabled": disabled || void 0,
434
+ "data-disabled": disabled ? "" : void 0,
435
+ ...itemProps,
436
+ ref: composedRefs,
437
+ onPointerMove: composeEventHandlers(
438
+ props.onPointerMove,
439
+ whenMouse((event) => {
440
+ if (disabled) {
441
+ contentContext.onItemLeave(event);
442
+ } else {
443
+ contentContext.onItemEnter(event);
444
+ if (!event.defaultPrevented) {
445
+ const item = event.currentTarget;
446
+ item.focus({ preventScroll: true });
447
+ }
448
+ }
449
+ })
450
+ ),
451
+ onPointerLeave: composeEventHandlers(
452
+ props.onPointerLeave,
453
+ whenMouse((event) => contentContext.onItemLeave(event))
454
+ ),
455
+ onFocus: composeEventHandlers(props.onFocus, () => setIsFocused(true)),
456
+ onBlur: composeEventHandlers(props.onBlur, () => setIsFocused(false))
457
+ }
458
+ ) })
459
+ }
460
+ );
461
+ }
462
+ );
463
+ var CHECKBOX_ITEM_NAME = "MenuCheckboxItem";
464
+ var MenuCheckboxItem = reactExports.forwardRef(
465
+ (props, forwardedRef) => {
466
+ const { checked = false, onCheckedChange, ...checkboxItemProps } = props;
467
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(ItemIndicatorProvider, { scope: props.__scopeMenu, checked, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
468
+ MenuItem,
469
+ {
470
+ role: "menuitemcheckbox",
471
+ "aria-checked": isIndeterminate(checked) ? "mixed" : checked,
472
+ ...checkboxItemProps,
473
+ ref: forwardedRef,
474
+ "data-state": getCheckedState(checked),
475
+ onSelect: composeEventHandlers(
476
+ checkboxItemProps.onSelect,
477
+ () => onCheckedChange?.(isIndeterminate(checked) ? true : !checked),
478
+ { checkForDefaultPrevented: false }
479
+ )
480
+ }
481
+ ) });
482
+ }
483
+ );
484
+ MenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME;
485
+ var RADIO_GROUP_NAME = "MenuRadioGroup";
486
+ var [RadioGroupProvider, useRadioGroupContext] = createMenuContext(
487
+ RADIO_GROUP_NAME,
488
+ { value: void 0, onValueChange: () => {
489
+ } }
490
+ );
491
+ var MenuRadioGroup = reactExports.forwardRef(
492
+ (props, forwardedRef) => {
493
+ const { value, onValueChange, ...groupProps } = props;
494
+ const handleValueChange = useCallbackRef(onValueChange);
495
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(RadioGroupProvider, { scope: props.__scopeMenu, value, onValueChange: handleValueChange, children: /* @__PURE__ */ jsxRuntimeExports.jsx(MenuGroup, { ...groupProps, ref: forwardedRef }) });
496
+ }
497
+ );
498
+ MenuRadioGroup.displayName = RADIO_GROUP_NAME;
499
+ var RADIO_ITEM_NAME = "MenuRadioItem";
500
+ var MenuRadioItem = reactExports.forwardRef(
501
+ (props, forwardedRef) => {
502
+ const { value, ...radioItemProps } = props;
503
+ const context = useRadioGroupContext(RADIO_ITEM_NAME, props.__scopeMenu);
504
+ const checked = value === context.value;
505
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(ItemIndicatorProvider, { scope: props.__scopeMenu, checked, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
506
+ MenuItem,
507
+ {
508
+ role: "menuitemradio",
509
+ "aria-checked": checked,
510
+ ...radioItemProps,
511
+ ref: forwardedRef,
512
+ "data-state": getCheckedState(checked),
513
+ onSelect: composeEventHandlers(
514
+ radioItemProps.onSelect,
515
+ () => context.onValueChange?.(value),
516
+ { checkForDefaultPrevented: false }
517
+ )
518
+ }
519
+ ) });
520
+ }
521
+ );
522
+ MenuRadioItem.displayName = RADIO_ITEM_NAME;
523
+ var ITEM_INDICATOR_NAME = "MenuItemIndicator";
524
+ var [ItemIndicatorProvider, useItemIndicatorContext] = createMenuContext(
525
+ ITEM_INDICATOR_NAME,
526
+ { checked: false }
527
+ );
528
+ var MenuItemIndicator = reactExports.forwardRef(
529
+ (props, forwardedRef) => {
530
+ const { __scopeMenu, forceMount, ...itemIndicatorProps } = props;
531
+ const indicatorContext = useItemIndicatorContext(ITEM_INDICATOR_NAME, __scopeMenu);
532
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
533
+ Presence,
534
+ {
535
+ present: forceMount || isIndeterminate(indicatorContext.checked) || indicatorContext.checked === true,
536
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
537
+ Primitive.span,
538
+ {
539
+ ...itemIndicatorProps,
540
+ ref: forwardedRef,
541
+ "data-state": getCheckedState(indicatorContext.checked)
542
+ }
543
+ )
544
+ }
545
+ );
546
+ }
547
+ );
548
+ MenuItemIndicator.displayName = ITEM_INDICATOR_NAME;
549
+ var SEPARATOR_NAME = "MenuSeparator";
550
+ var MenuSeparator = reactExports.forwardRef(
551
+ (props, forwardedRef) => {
552
+ const { __scopeMenu, ...separatorProps } = props;
553
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
554
+ Primitive.div,
555
+ {
556
+ role: "separator",
557
+ "aria-orientation": "horizontal",
558
+ ...separatorProps,
559
+ ref: forwardedRef
560
+ }
561
+ );
562
+ }
563
+ );
564
+ MenuSeparator.displayName = SEPARATOR_NAME;
565
+ var ARROW_NAME = "MenuArrow";
566
+ var MenuArrow = reactExports.forwardRef(
567
+ (props, forwardedRef) => {
568
+ const { __scopeMenu, ...arrowProps } = props;
569
+ const popperScope = usePopperScope(__scopeMenu);
570
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Arrow, { ...popperScope, ...arrowProps, ref: forwardedRef });
571
+ }
572
+ );
573
+ MenuArrow.displayName = ARROW_NAME;
574
+ var SUB_NAME = "MenuSub";
575
+ var [MenuSubProvider, useMenuSubContext] = createMenuContext(SUB_NAME);
576
+ var SUB_TRIGGER_NAME = "MenuSubTrigger";
577
+ var MenuSubTrigger = reactExports.forwardRef(
578
+ (props, forwardedRef) => {
579
+ const context = useMenuContext(SUB_TRIGGER_NAME, props.__scopeMenu);
580
+ const rootContext = useMenuRootContext(SUB_TRIGGER_NAME, props.__scopeMenu);
581
+ const subContext = useMenuSubContext(SUB_TRIGGER_NAME, props.__scopeMenu);
582
+ const contentContext = useMenuContentContext(SUB_TRIGGER_NAME, props.__scopeMenu);
583
+ const openTimerRef = reactExports.useRef(null);
584
+ const { pointerGraceTimerRef, onPointerGraceIntentChange } = contentContext;
585
+ const scope = { __scopeMenu: props.__scopeMenu };
586
+ const clearOpenTimer = reactExports.useCallback(() => {
587
+ if (openTimerRef.current) window.clearTimeout(openTimerRef.current);
588
+ openTimerRef.current = null;
589
+ }, []);
590
+ reactExports.useEffect(() => clearOpenTimer, [clearOpenTimer]);
591
+ reactExports.useEffect(() => {
592
+ const pointerGraceTimer = pointerGraceTimerRef.current;
593
+ return () => {
594
+ window.clearTimeout(pointerGraceTimer);
595
+ onPointerGraceIntentChange(null);
596
+ };
597
+ }, [pointerGraceTimerRef, onPointerGraceIntentChange]);
598
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(MenuAnchor, { asChild: true, ...scope, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
599
+ MenuItemImpl,
600
+ {
601
+ id: subContext.triggerId,
602
+ "aria-haspopup": "menu",
603
+ "aria-expanded": context.open,
604
+ "aria-controls": subContext.contentId,
605
+ "data-state": getOpenState(context.open),
606
+ ...props,
607
+ ref: composeRefs(forwardedRef, subContext.onTriggerChange),
608
+ onClick: (event) => {
609
+ props.onClick?.(event);
610
+ if (props.disabled || event.defaultPrevented) return;
611
+ event.currentTarget.focus();
612
+ if (!context.open) context.onOpenChange(true);
613
+ },
614
+ onPointerMove: composeEventHandlers(
615
+ props.onPointerMove,
616
+ whenMouse((event) => {
617
+ contentContext.onItemEnter(event);
618
+ if (event.defaultPrevented) return;
619
+ if (!props.disabled && !context.open && !openTimerRef.current) {
620
+ contentContext.onPointerGraceIntentChange(null);
621
+ openTimerRef.current = window.setTimeout(() => {
622
+ context.onOpenChange(true);
623
+ clearOpenTimer();
624
+ }, 100);
625
+ }
626
+ })
627
+ ),
628
+ onPointerLeave: composeEventHandlers(
629
+ props.onPointerLeave,
630
+ whenMouse((event) => {
631
+ clearOpenTimer();
632
+ const contentRect = context.content?.getBoundingClientRect();
633
+ if (contentRect) {
634
+ const side = context.content?.dataset.side;
635
+ const rightSide = side === "right";
636
+ const bleed = rightSide ? -5 : 5;
637
+ const contentNearEdge = contentRect[rightSide ? "left" : "right"];
638
+ const contentFarEdge = contentRect[rightSide ? "right" : "left"];
639
+ contentContext.onPointerGraceIntentChange({
640
+ area: [
641
+ // Apply a bleed on clientX to ensure that our exit point is
642
+ // consistently within polygon bounds
643
+ { x: event.clientX + bleed, y: event.clientY },
644
+ { x: contentNearEdge, y: contentRect.top },
645
+ { x: contentFarEdge, y: contentRect.top },
646
+ { x: contentFarEdge, y: contentRect.bottom },
647
+ { x: contentNearEdge, y: contentRect.bottom }
648
+ ],
649
+ side
650
+ });
651
+ window.clearTimeout(pointerGraceTimerRef.current);
652
+ pointerGraceTimerRef.current = window.setTimeout(
653
+ () => contentContext.onPointerGraceIntentChange(null),
654
+ 300
655
+ );
656
+ } else {
657
+ contentContext.onTriggerLeave(event);
658
+ if (event.defaultPrevented) return;
659
+ contentContext.onPointerGraceIntentChange(null);
660
+ }
661
+ })
662
+ ),
663
+ onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {
664
+ const isTypingAhead = contentContext.searchRef.current !== "";
665
+ if (props.disabled || isTypingAhead && event.key === " ") return;
666
+ if (SUB_OPEN_KEYS[rootContext.dir].includes(event.key)) {
667
+ context.onOpenChange(true);
668
+ context.content?.focus();
669
+ event.preventDefault();
670
+ }
671
+ })
672
+ }
673
+ ) });
674
+ }
675
+ );
676
+ MenuSubTrigger.displayName = SUB_TRIGGER_NAME;
677
+ var SUB_CONTENT_NAME = "MenuSubContent";
678
+ var MenuSubContent = reactExports.forwardRef(
679
+ (props, forwardedRef) => {
680
+ const portalContext = usePortalContext(CONTENT_NAME, props.__scopeMenu);
681
+ const { forceMount = portalContext.forceMount, ...subContentProps } = props;
682
+ const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);
683
+ const rootContext = useMenuRootContext(CONTENT_NAME, props.__scopeMenu);
684
+ const subContext = useMenuSubContext(SUB_CONTENT_NAME, props.__scopeMenu);
685
+ const ref = reactExports.useRef(null);
686
+ const composedRefs = useComposedRefs(forwardedRef, ref);
687
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Collection.Provider, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Collection.Slot, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
688
+ MenuContentImpl,
689
+ {
690
+ id: subContext.contentId,
691
+ "aria-labelledby": subContext.triggerId,
692
+ ...subContentProps,
693
+ ref: composedRefs,
694
+ align: "start",
695
+ side: rootContext.dir === "rtl" ? "left" : "right",
696
+ disableOutsidePointerEvents: false,
697
+ disableOutsideScroll: false,
698
+ trapFocus: false,
699
+ onOpenAutoFocus: (event) => {
700
+ if (rootContext.isUsingKeyboardRef.current) ref.current?.focus();
701
+ event.preventDefault();
702
+ },
703
+ onCloseAutoFocus: (event) => event.preventDefault(),
704
+ onFocusOutside: composeEventHandlers(props.onFocusOutside, (event) => {
705
+ if (event.target !== subContext.trigger) context.onOpenChange(false);
706
+ }),
707
+ onEscapeKeyDown: composeEventHandlers(props.onEscapeKeyDown, (event) => {
708
+ rootContext.onClose();
709
+ event.preventDefault();
710
+ }),
711
+ onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {
712
+ const isKeyDownInside = event.currentTarget.contains(event.target);
713
+ const isCloseKey = SUB_CLOSE_KEYS[rootContext.dir].includes(event.key);
714
+ if (isKeyDownInside && isCloseKey) {
715
+ context.onOpenChange(false);
716
+ subContext.trigger?.focus();
717
+ event.preventDefault();
718
+ }
719
+ })
720
+ }
721
+ ) }) }) });
722
+ }
723
+ );
724
+ MenuSubContent.displayName = SUB_CONTENT_NAME;
725
+ function getOpenState(open) {
726
+ return open ? "open" : "closed";
727
+ }
728
+ function isIndeterminate(checked) {
729
+ return checked === "indeterminate";
730
+ }
731
+ function getCheckedState(checked) {
732
+ return isIndeterminate(checked) ? "indeterminate" : checked ? "checked" : "unchecked";
733
+ }
734
+ function focusFirst(candidates) {
735
+ const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;
736
+ for (const candidate of candidates) {
737
+ if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;
738
+ candidate.focus();
739
+ if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;
740
+ }
741
+ }
742
+ function wrapArray(array, startIndex) {
743
+ return array.map((_, index) => array[(startIndex + index) % array.length]);
744
+ }
745
+ function getNextMatch(values, search, currentMatch) {
746
+ const isRepeated = search.length > 1 && Array.from(search).every((char) => char === search[0]);
747
+ const normalizedSearch = isRepeated ? search[0] : search;
748
+ const currentMatchIndex = currentMatch ? values.indexOf(currentMatch) : -1;
749
+ let wrappedValues = wrapArray(values, Math.max(currentMatchIndex, 0));
750
+ const excludeCurrentMatch = normalizedSearch.length === 1;
751
+ if (excludeCurrentMatch) wrappedValues = wrappedValues.filter((v) => v !== currentMatch);
752
+ const nextMatch = wrappedValues.find(
753
+ (value) => value.toLowerCase().startsWith(normalizedSearch.toLowerCase())
754
+ );
755
+ return nextMatch !== currentMatch ? nextMatch : void 0;
756
+ }
757
+ function isPointInPolygon(point, polygon) {
758
+ const { x, y } = point;
759
+ let inside = false;
760
+ for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
761
+ const ii = polygon[i];
762
+ const jj = polygon[j];
763
+ const xi = ii.x;
764
+ const yi = ii.y;
765
+ const xj = jj.x;
766
+ const yj = jj.y;
767
+ const intersect = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;
768
+ if (intersect) inside = !inside;
769
+ }
770
+ return inside;
771
+ }
772
+ function isPointerInGraceArea(event, area) {
773
+ if (!area) return false;
774
+ const cursorPos = { x: event.clientX, y: event.clientY };
775
+ return isPointInPolygon(cursorPos, area);
776
+ }
777
+ function whenMouse(handler) {
778
+ return (event) => event.pointerType === "mouse" ? handler(event) : void 0;
779
+ }
780
+ var Root3 = Menu;
781
+ var Anchor2 = MenuAnchor;
782
+ var Portal = MenuPortal;
783
+ var Content2 = MenuContent;
784
+ var Group = MenuGroup;
785
+ var Label = MenuLabel;
786
+ var Item2 = MenuItem;
787
+ var CheckboxItem = MenuCheckboxItem;
788
+ var RadioGroup = MenuRadioGroup;
789
+ var RadioItem = MenuRadioItem;
790
+ var ItemIndicator = MenuItemIndicator;
791
+ var Separator = MenuSeparator;
792
+ var Arrow2 = MenuArrow;
793
+ var SubTrigger = MenuSubTrigger;
794
+ var SubContent = MenuSubContent;
795
+ export {
796
+ Anchor2 as A,
797
+ Content2 as C,
798
+ Group as G,
799
+ Item2 as I,
800
+ Label as L,
801
+ Portal as P,
802
+ Root3 as R,
803
+ Separator as S,
804
+ CheckboxItem as a,
805
+ RadioGroup as b,
806
+ createMenuScope as c,
807
+ RadioItem as d,
808
+ ItemIndicator as e,
809
+ Arrow2 as f,
810
+ SubTrigger as g,
811
+ SubContent as h
812
+ };