@cdx-ui/primitives 0.0.1-beta.159 → 0.0.1-beta.160

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 (233) hide show
  1. package/lib/commonjs/dialog/DialogContent.js +17 -3
  2. package/lib/commonjs/dialog/DialogContent.js.map +1 -1
  3. package/lib/commonjs/dialog/DialogPopup.js +5 -1
  4. package/lib/commonjs/dialog/DialogPopup.js.map +1 -1
  5. package/lib/commonjs/index.js +54 -0
  6. package/lib/commonjs/index.js.map +1 -1
  7. package/lib/commonjs/menu/MenuCheckboxItem.js +42 -0
  8. package/lib/commonjs/menu/MenuCheckboxItem.js.map +1 -0
  9. package/lib/commonjs/menu/MenuItem.js +142 -0
  10. package/lib/commonjs/menu/MenuItem.js.map +1 -0
  11. package/lib/commonjs/menu/MenuOverlayRoot.js +80 -0
  12. package/lib/commonjs/menu/MenuOverlayRoot.js.map +1 -0
  13. package/lib/commonjs/menu/MenuPopup.js +78 -0
  14. package/lib/commonjs/menu/MenuPopup.js.map +1 -0
  15. package/lib/commonjs/menu/MenuRadioGroup.js +48 -0
  16. package/lib/commonjs/menu/MenuRadioGroup.js.map +1 -0
  17. package/lib/commonjs/menu/MenuRadioItem.js +32 -0
  18. package/lib/commonjs/menu/MenuRadioItem.js.map +1 -0
  19. package/lib/commonjs/menu/MenuRoot.js +139 -0
  20. package/lib/commonjs/menu/MenuRoot.js.map +1 -0
  21. package/lib/commonjs/menu/MenuTrigger.js +59 -0
  22. package/lib/commonjs/menu/MenuTrigger.js.map +1 -0
  23. package/lib/commonjs/menu/context.js +36 -0
  24. package/lib/commonjs/menu/context.js.map +1 -0
  25. package/lib/commonjs/menu/index.js +118 -0
  26. package/lib/commonjs/menu/index.js.map +1 -0
  27. package/lib/commonjs/menu/overlayContext.js +30 -0
  28. package/lib/commonjs/menu/overlayContext.js.map +1 -0
  29. package/lib/commonjs/menu/types.js +6 -0
  30. package/lib/commonjs/menu/types.js.map +1 -0
  31. package/lib/commonjs/menu/useMenuNavigation.js +87 -0
  32. package/lib/commonjs/menu/useMenuNavigation.js.map +1 -0
  33. package/lib/commonjs/menu/useMenuOverlayLifecycle.js +68 -0
  34. package/lib/commonjs/menu/useMenuOverlayLifecycle.js.map +1 -0
  35. package/lib/commonjs/menu/useMenuTrigger.js +115 -0
  36. package/lib/commonjs/menu/useMenuTrigger.js.map +1 -0
  37. package/lib/commonjs/overlay/OverlayContainer.js +2 -3
  38. package/lib/commonjs/overlay/OverlayContainer.js.map +1 -1
  39. package/lib/commonjs/overlay/OverlayStack.js +125 -0
  40. package/lib/commonjs/overlay/OverlayStack.js.map +1 -0
  41. package/lib/commonjs/overlay/constants.js +7 -1
  42. package/lib/commonjs/overlay/constants.js.map +1 -1
  43. package/lib/commonjs/overlay/getAnchoredOverlayPosition.js +188 -0
  44. package/lib/commonjs/overlay/getAnchoredOverlayPosition.js.map +1 -0
  45. package/lib/commonjs/overlay/index.js +39 -0
  46. package/lib/commonjs/overlay/index.js.map +1 -1
  47. package/lib/commonjs/overlay/useAnchoredOverlay.js +127 -0
  48. package/lib/commonjs/overlay/useAnchoredOverlay.js.map +1 -0
  49. package/lib/commonjs/overlay/useDismissOverlay.js +8 -1
  50. package/lib/commonjs/overlay/useDismissOverlay.js.map +1 -1
  51. package/lib/commonjs/overlay/useDismissOverlay.web.js +11 -3
  52. package/lib/commonjs/overlay/useDismissOverlay.web.js.map +1 -1
  53. package/lib/commonjs/overlay/useEscapeKey.js +8 -1
  54. package/lib/commonjs/overlay/useEscapeKey.js.map +1 -1
  55. package/lib/commonjs/overlay/useEscapeKey.web.js +11 -3
  56. package/lib/commonjs/overlay/useEscapeKey.web.js.map +1 -1
  57. package/lib/commonjs/overlay/useOverlayPosition.js +16 -7
  58. package/lib/commonjs/overlay/useOverlayPosition.js.map +1 -1
  59. package/lib/commonjs/portal/portal.js +86 -63
  60. package/lib/commonjs/portal/portal.js.map +1 -1
  61. package/lib/commonjs/select/SelectContent.js +23 -11
  62. package/lib/commonjs/select/SelectContent.js.map +1 -1
  63. package/lib/commonjs/select/useListboxNavigation.js +10 -11
  64. package/lib/commonjs/select/useListboxNavigation.js.map +1 -1
  65. package/lib/commonjs/tooltip/TooltipContent.js +25 -24
  66. package/lib/commonjs/tooltip/TooltipContent.js.map +1 -1
  67. package/lib/commonjs/tooltip/getTooltipPosition.js +37 -84
  68. package/lib/commonjs/tooltip/getTooltipPosition.js.map +1 -1
  69. package/lib/module/dialog/DialogContent.js +18 -4
  70. package/lib/module/dialog/DialogContent.js.map +1 -1
  71. package/lib/module/dialog/DialogPopup.js +5 -1
  72. package/lib/module/dialog/DialogPopup.js.map +1 -1
  73. package/lib/module/index.js +2 -1
  74. package/lib/module/index.js.map +1 -1
  75. package/lib/module/menu/MenuCheckboxItem.js +38 -0
  76. package/lib/module/menu/MenuCheckboxItem.js.map +1 -0
  77. package/lib/module/menu/MenuItem.js +138 -0
  78. package/lib/module/menu/MenuItem.js.map +1 -0
  79. package/lib/module/menu/MenuOverlayRoot.js +76 -0
  80. package/lib/module/menu/MenuOverlayRoot.js.map +1 -0
  81. package/lib/module/menu/MenuPopup.js +74 -0
  82. package/lib/module/menu/MenuPopup.js.map +1 -0
  83. package/lib/module/menu/MenuRadioGroup.js +44 -0
  84. package/lib/module/menu/MenuRadioGroup.js.map +1 -0
  85. package/lib/module/menu/MenuRadioItem.js +28 -0
  86. package/lib/module/menu/MenuRadioItem.js.map +1 -0
  87. package/lib/module/menu/MenuRoot.js +135 -0
  88. package/lib/module/menu/MenuRoot.js.map +1 -0
  89. package/lib/module/menu/MenuTrigger.js +55 -0
  90. package/lib/module/menu/MenuTrigger.js.map +1 -0
  91. package/lib/module/menu/context.js +27 -0
  92. package/lib/module/menu/context.js.map +1 -0
  93. package/lib/module/menu/index.js +13 -0
  94. package/lib/module/menu/index.js.map +1 -0
  95. package/lib/module/menu/overlayContext.js +24 -0
  96. package/lib/module/menu/overlayContext.js.map +1 -0
  97. package/lib/module/menu/types.js +4 -0
  98. package/lib/module/menu/types.js.map +1 -0
  99. package/lib/module/menu/useMenuNavigation.js +84 -0
  100. package/lib/module/menu/useMenuNavigation.js.map +1 -0
  101. package/lib/module/menu/useMenuOverlayLifecycle.js +63 -0
  102. package/lib/module/menu/useMenuOverlayLifecycle.js.map +1 -0
  103. package/lib/module/menu/useMenuTrigger.js +111 -0
  104. package/lib/module/menu/useMenuTrigger.js.map +1 -0
  105. package/lib/module/overlay/OverlayContainer.js +2 -3
  106. package/lib/module/overlay/OverlayContainer.js.map +1 -1
  107. package/lib/module/overlay/OverlayStack.js +119 -0
  108. package/lib/module/overlay/OverlayStack.js.map +1 -0
  109. package/lib/module/overlay/constants.js +6 -0
  110. package/lib/module/overlay/constants.js.map +1 -1
  111. package/lib/module/overlay/getAnchoredOverlayPosition.js +183 -0
  112. package/lib/module/overlay/getAnchoredOverlayPosition.js.map +1 -0
  113. package/lib/module/overlay/index.js +4 -1
  114. package/lib/module/overlay/index.js.map +1 -1
  115. package/lib/module/overlay/useAnchoredOverlay.js +123 -0
  116. package/lib/module/overlay/useAnchoredOverlay.js.map +1 -0
  117. package/lib/module/overlay/useDismissOverlay.js +9 -1
  118. package/lib/module/overlay/useDismissOverlay.js.map +1 -1
  119. package/lib/module/overlay/useDismissOverlay.web.js +11 -3
  120. package/lib/module/overlay/useDismissOverlay.web.js.map +1 -1
  121. package/lib/module/overlay/useEscapeKey.js +9 -1
  122. package/lib/module/overlay/useEscapeKey.js.map +1 -1
  123. package/lib/module/overlay/useEscapeKey.web.js +11 -3
  124. package/lib/module/overlay/useEscapeKey.web.js.map +1 -1
  125. package/lib/module/overlay/useOverlayPosition.js +16 -7
  126. package/lib/module/overlay/useOverlayPosition.js.map +1 -1
  127. package/lib/module/portal/portal.js +86 -64
  128. package/lib/module/portal/portal.js.map +1 -1
  129. package/lib/module/select/SelectContent.js +25 -13
  130. package/lib/module/select/SelectContent.js.map +1 -1
  131. package/lib/module/select/useListboxNavigation.js +10 -11
  132. package/lib/module/select/useListboxNavigation.js.map +1 -1
  133. package/lib/module/tooltip/TooltipContent.js +30 -29
  134. package/lib/module/tooltip/TooltipContent.js.map +1 -1
  135. package/lib/module/tooltip/getTooltipPosition.js +37 -84
  136. package/lib/module/tooltip/getTooltipPosition.js.map +1 -1
  137. package/lib/typescript/dialog/DialogContent.d.ts.map +1 -1
  138. package/lib/typescript/dialog/DialogPopup.d.ts.map +1 -1
  139. package/lib/typescript/index.d.ts +2 -1
  140. package/lib/typescript/index.d.ts.map +1 -1
  141. package/lib/typescript/menu/MenuCheckboxItem.d.ts +6 -0
  142. package/lib/typescript/menu/MenuCheckboxItem.d.ts.map +1 -0
  143. package/lib/typescript/menu/MenuItem.d.ts +8 -0
  144. package/lib/typescript/menu/MenuItem.d.ts.map +1 -0
  145. package/lib/typescript/menu/MenuOverlayRoot.d.ts +8 -0
  146. package/lib/typescript/menu/MenuOverlayRoot.d.ts.map +1 -0
  147. package/lib/typescript/menu/MenuPopup.d.ts +8 -0
  148. package/lib/typescript/menu/MenuPopup.d.ts.map +1 -0
  149. package/lib/typescript/menu/MenuRadioGroup.d.ts +8 -0
  150. package/lib/typescript/menu/MenuRadioGroup.d.ts.map +1 -0
  151. package/lib/typescript/menu/MenuRadioItem.d.ts +6 -0
  152. package/lib/typescript/menu/MenuRadioItem.d.ts.map +1 -0
  153. package/lib/typescript/menu/MenuRoot.d.ts +8 -0
  154. package/lib/typescript/menu/MenuRoot.d.ts.map +1 -0
  155. package/lib/typescript/menu/MenuTrigger.d.ts +7 -0
  156. package/lib/typescript/menu/MenuTrigger.d.ts.map +1 -0
  157. package/lib/typescript/menu/context.d.ts +15 -0
  158. package/lib/typescript/menu/context.d.ts.map +1 -0
  159. package/lib/typescript/menu/index.d.ts +12 -0
  160. package/lib/typescript/menu/index.d.ts.map +1 -0
  161. package/lib/typescript/menu/overlayContext.d.ts +35 -0
  162. package/lib/typescript/menu/overlayContext.d.ts.map +1 -0
  163. package/lib/typescript/menu/types.d.ts +104 -0
  164. package/lib/typescript/menu/types.d.ts.map +1 -0
  165. package/lib/typescript/menu/useMenuNavigation.d.ts +16 -0
  166. package/lib/typescript/menu/useMenuNavigation.d.ts.map +1 -0
  167. package/lib/typescript/menu/useMenuOverlayLifecycle.d.ts +15 -0
  168. package/lib/typescript/menu/useMenuOverlayLifecycle.d.ts.map +1 -0
  169. package/lib/typescript/menu/useMenuTrigger.d.ts +35 -0
  170. package/lib/typescript/menu/useMenuTrigger.d.ts.map +1 -0
  171. package/lib/typescript/overlay/OverlayContainer.d.ts.map +1 -1
  172. package/lib/typescript/overlay/OverlayStack.d.ts +46 -0
  173. package/lib/typescript/overlay/OverlayStack.d.ts.map +1 -0
  174. package/lib/typescript/overlay/constants.d.ts +5 -0
  175. package/lib/typescript/overlay/constants.d.ts.map +1 -1
  176. package/lib/typescript/overlay/getAnchoredOverlayPosition.d.ts +45 -0
  177. package/lib/typescript/overlay/getAnchoredOverlayPosition.d.ts.map +1 -0
  178. package/lib/typescript/overlay/index.d.ts +5 -2
  179. package/lib/typescript/overlay/index.d.ts.map +1 -1
  180. package/lib/typescript/overlay/useAnchoredOverlay.d.ts +15 -0
  181. package/lib/typescript/overlay/useAnchoredOverlay.d.ts.map +1 -0
  182. package/lib/typescript/overlay/useDismissOverlay.d.ts +2 -1
  183. package/lib/typescript/overlay/useDismissOverlay.d.ts.map +1 -1
  184. package/lib/typescript/overlay/useDismissOverlay.web.d.ts +2 -1
  185. package/lib/typescript/overlay/useDismissOverlay.web.d.ts.map +1 -1
  186. package/lib/typescript/overlay/useEscapeKey.d.ts +2 -1
  187. package/lib/typescript/overlay/useEscapeKey.d.ts.map +1 -1
  188. package/lib/typescript/overlay/useEscapeKey.web.d.ts +2 -1
  189. package/lib/typescript/overlay/useEscapeKey.web.d.ts.map +1 -1
  190. package/lib/typescript/overlay/useOverlayPosition.d.ts +5 -1
  191. package/lib/typescript/overlay/useOverlayPosition.d.ts.map +1 -1
  192. package/lib/typescript/portal/portal.d.ts +3 -0
  193. package/lib/typescript/portal/portal.d.ts.map +1 -1
  194. package/lib/typescript/select/SelectContent.d.ts.map +1 -1
  195. package/lib/typescript/select/useListboxNavigation.d.ts.map +1 -1
  196. package/lib/typescript/tooltip/TooltipContent.d.ts.map +1 -1
  197. package/lib/typescript/tooltip/getTooltipPosition.d.ts +6 -8
  198. package/lib/typescript/tooltip/getTooltipPosition.d.ts.map +1 -1
  199. package/package.json +3 -3
  200. package/src/dialog/DialogContent.tsx +16 -4
  201. package/src/dialog/DialogPopup.tsx +5 -1
  202. package/src/index.ts +23 -0
  203. package/src/menu/MenuCheckboxItem.tsx +51 -0
  204. package/src/menu/MenuItem.tsx +197 -0
  205. package/src/menu/MenuOverlayRoot.tsx +100 -0
  206. package/src/menu/MenuPopup.tsx +81 -0
  207. package/src/menu/MenuRadioGroup.tsx +48 -0
  208. package/src/menu/MenuRadioItem.tsx +32 -0
  209. package/src/menu/MenuRoot.tsx +190 -0
  210. package/src/menu/MenuTrigger.tsx +57 -0
  211. package/src/menu/context.tsx +38 -0
  212. package/src/menu/index.ts +36 -0
  213. package/src/menu/overlayContext.tsx +61 -0
  214. package/src/menu/types.ts +119 -0
  215. package/src/menu/useMenuNavigation.ts +102 -0
  216. package/src/menu/useMenuOverlayLifecycle.ts +77 -0
  217. package/src/menu/useMenuTrigger.ts +161 -0
  218. package/src/overlay/OverlayContainer.tsx +3 -1
  219. package/src/overlay/OverlayStack.tsx +202 -0
  220. package/src/overlay/constants.ts +6 -0
  221. package/src/overlay/getAnchoredOverlayPosition.ts +326 -0
  222. package/src/overlay/index.ts +29 -1
  223. package/src/overlay/useAnchoredOverlay.ts +153 -0
  224. package/src/overlay/useDismissOverlay.ts +10 -2
  225. package/src/overlay/useDismissOverlay.web.ts +9 -2
  226. package/src/overlay/useEscapeKey.ts +13 -1
  227. package/src/overlay/useEscapeKey.web.ts +13 -3
  228. package/src/overlay/useOverlayPosition.ts +35 -8
  229. package/src/portal/portal.tsx +109 -69
  230. package/src/select/SelectContent.tsx +29 -17
  231. package/src/select/useListboxNavigation.ts +12 -9
  232. package/src/tooltip/TooltipContent.tsx +32 -34
  233. package/src/tooltip/getTooltipPosition.ts +58 -125
@@ -1,8 +1,16 @@
1
1
  "use strict";
2
2
 
3
+ import { useOverlayStackRegistration } from './OverlayStack';
4
+
3
5
  /**
4
6
  * No-op on native — overlay dismissal is handled by backdrop press
5
7
  * or the system back gesture / hardware button via Modal.
6
8
  */
7
- export function useDismissOverlay(_open, _contentRef, _excludeRefs, _onDismiss) {}
9
+ export function useDismissOverlay(open, _contentRef, _excludeRefs, _onDismiss, options = {}) {
10
+ useOverlayStackRegistration({
11
+ active: open,
12
+ capabilities: ['outside'],
13
+ ...options
14
+ });
15
+ }
8
16
  //# sourceMappingURL=useDismissOverlay.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useDismissOverlay","_open","_contentRef","_excludeRefs","_onDismiss"],"sourceRoot":"../../../src","sources":["overlay/useDismissOverlay.ts"],"mappings":";;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASA,iBAAiBA,CAC/BC,KAAc,EACdC,WAA2B,EAC3BC,YAA8B,EAC9BC,UAAsB,EACtB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["useOverlayStackRegistration","useDismissOverlay","open","_contentRef","_excludeRefs","_onDismiss","options","active","capabilities"],"sourceRoot":"../../../src","sources":["overlay/useDismissOverlay.ts"],"mappings":";;AACA,SAASA,2BAA2B,QAAmC,gBAAgB;;AAEvF;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAC/BC,IAAa,EACbC,WAA2B,EAC3BC,YAA8B,EAC9BC,UAAsB,EACtBC,OAA6B,GAAG,CAAC,CAAC,EAClC;EACAN,2BAA2B,CAAC;IAC1BO,MAAM,EAAEL,IAAI;IACZM,YAAY,EAAE,CAAC,SAAS,CAAC;IACzB,GAAGF;EACL,CAAC,CAAC;AACJ","ignoreList":[]}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  import { useEffect, useRef } from 'react';
4
+ import { useOverlayStackRegistration } from './OverlayStack';
4
5
  function refContainsNode(ref, target) {
5
6
  const current = ref.current;
6
7
  if (!current || typeof current.contains !== 'function') {
@@ -14,11 +15,18 @@ function refContainsNode(ref, target) {
14
15
  * focus moves to an element outside the overlay via keyboard.
15
16
  * Events targeting `contentRef` or any of `excludeRefs` are ignored.
16
17
  */
17
- export function useDismissOverlay(open, contentRef, excludeRefs, onDismiss) {
18
+ export function useDismissOverlay(open, contentRef, excludeRefs, onDismiss, options = {}) {
18
19
  const onDismissRef = useRef(onDismiss);
19
20
  onDismissRef.current = onDismiss;
20
21
  const excludeRefsRef = useRef(excludeRefs);
21
22
  excludeRefsRef.current = excludeRefs;
23
+ const {
24
+ isTopmost
25
+ } = useOverlayStackRegistration({
26
+ active: open,
27
+ capabilities: ['outside'],
28
+ ...options
29
+ });
22
30
  useEffect(() => {
23
31
  if (!open) {
24
32
  return;
@@ -35,7 +43,7 @@ export function useDismissOverlay(open, contentRef, excludeRefs, onDismiss) {
35
43
  return false;
36
44
  };
37
45
  const dismissIfOutside = e => {
38
- if (!isInsideOverlay(e.target)) {
46
+ if (isTopmost('outside') && !isInsideOverlay(e.target)) {
39
47
  onDismissRef.current();
40
48
  }
41
49
  };
@@ -45,6 +53,6 @@ export function useDismissOverlay(open, contentRef, excludeRefs, onDismiss) {
45
53
  document.removeEventListener('pointerdown', dismissIfOutside);
46
54
  document.removeEventListener('focusin', dismissIfOutside);
47
55
  };
48
- }, [open, contentRef]);
56
+ }, [open, contentRef, isTopmost]);
49
57
  }
50
58
  //# sourceMappingURL=useDismissOverlay.web.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useRef","refContainsNode","ref","target","current","contains","useDismissOverlay","open","contentRef","excludeRefs","onDismiss","onDismissRef","excludeRefsRef","isInsideOverlay","dismissIfOutside","e","document","addEventListener","removeEventListener"],"sourceRoot":"../../../src","sources":["overlay/useDismissOverlay.web.ts"],"mappings":";;AACA,SAASA,SAAS,EAAEC,MAAM,QAAQ,OAAO;AAEzC,SAASC,eAAeA,CAACC,GAAuB,EAAEC,MAAY,EAAW;EACvE,MAAMC,OAAO,GAAGF,GAAG,CAACE,OAAwD;EAC5E,IAAI,CAACA,OAAO,IAAI,OAAOA,OAAO,CAACC,QAAQ,KAAK,UAAU,EAAE;IACtD,OAAO,KAAK;EACd;EACA,OAAOD,OAAO,CAACC,QAAQ,CAACF,MAAM,CAAC;AACjC;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASG,iBAAiBA,CAC/BC,IAAa,EACbC,UAA0B,EAC1BC,WAA6B,EAC7BC,SAAqB,EACrB;EACA,MAAMC,YAAY,GAAGX,MAAM,CAACU,SAAS,CAAC;EACtCC,YAAY,CAACP,OAAO,GAAGM,SAAS;EAEhC,MAAME,cAAc,GAAGZ,MAAM,CAACS,WAAW,CAAC;EAC1CG,cAAc,CAACR,OAAO,GAAGK,WAAW;EAEpCV,SAAS,CAAC,MAAM;IACd,IAAI,CAACQ,IAAI,EAAE;MACT;IACF;IAEA,MAAMM,eAAe,GAAIV,MAAY,IAAK;MACxC,IAAIF,eAAe,CAACO,UAAU,EAAEL,MAAM,CAAC,EAAE;QACvC,OAAO,IAAI;MACb;MACA,KAAK,MAAMD,GAAG,IAAIU,cAAc,CAACR,OAAO,EAAE;QACxC,IAAIH,eAAe,CAACC,GAAG,EAAEC,MAAM,CAAC,EAAE;UAChC,OAAO,IAAI;QACb;MACF;MACA,OAAO,KAAK;IACd,CAAC;IAED,MAAMW,gBAAgB,GAAIC,CAAQ,IAAK;MACrC,IAAI,CAACF,eAAe,CAACE,CAAC,CAACZ,MAAc,CAAC,EAAE;QACtCQ,YAAY,CAACP,OAAO,CAAC,CAAC;MACxB;IACF,CAAC;IAEDY,QAAQ,CAACC,gBAAgB,CAAC,aAAa,EAAEH,gBAAgB,CAAC;IAC1DE,QAAQ,CAACC,gBAAgB,CAAC,SAAS,EAAEH,gBAAgB,CAAC;IACtD,OAAO,MAAM;MACXE,QAAQ,CAACE,mBAAmB,CAAC,aAAa,EAAEJ,gBAAgB,CAAC;MAC7DE,QAAQ,CAACE,mBAAmB,CAAC,SAAS,EAAEJ,gBAAgB,CAAC;IAC3D,CAAC;EACH,CAAC,EAAE,CAACP,IAAI,EAAEC,UAAU,CAAC,CAAC;AACxB","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","useRef","useOverlayStackRegistration","refContainsNode","ref","target","current","contains","useDismissOverlay","open","contentRef","excludeRefs","onDismiss","options","onDismissRef","excludeRefsRef","isTopmost","active","capabilities","isInsideOverlay","dismissIfOutside","e","document","addEventListener","removeEventListener"],"sourceRoot":"../../../src","sources":["overlay/useDismissOverlay.web.ts"],"mappings":";;AACA,SAASA,SAAS,EAAEC,MAAM,QAAQ,OAAO;AACzC,SAASC,2BAA2B,QAAmC,gBAAgB;AAEvF,SAASC,eAAeA,CAACC,GAAuB,EAAEC,MAAY,EAAW;EACvE,MAAMC,OAAO,GAAGF,GAAG,CAACE,OAAwD;EAC5E,IAAI,CAACA,OAAO,IAAI,OAAOA,OAAO,CAACC,QAAQ,KAAK,UAAU,EAAE;IACtD,OAAO,KAAK;EACd;EACA,OAAOD,OAAO,CAACC,QAAQ,CAACF,MAAM,CAAC;AACjC;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASG,iBAAiBA,CAC/BC,IAAa,EACbC,UAA0B,EAC1BC,WAA6B,EAC7BC,SAAqB,EACrBC,OAA6B,GAAG,CAAC,CAAC,EAClC;EACA,MAAMC,YAAY,GAAGb,MAAM,CAACW,SAAS,CAAC;EACtCE,YAAY,CAACR,OAAO,GAAGM,SAAS;EAEhC,MAAMG,cAAc,GAAGd,MAAM,CAACU,WAAW,CAAC;EAC1CI,cAAc,CAACT,OAAO,GAAGK,WAAW;EACpC,MAAM;IAAEK;EAAU,CAAC,GAAGd,2BAA2B,CAAC;IAChDe,MAAM,EAAER,IAAI;IACZS,YAAY,EAAE,CAAC,SAAS,CAAC;IACzB,GAAGL;EACL,CAAC,CAAC;EAEFb,SAAS,CAAC,MAAM;IACd,IAAI,CAACS,IAAI,EAAE;MACT;IACF;IAEA,MAAMU,eAAe,GAAId,MAAY,IAAK;MACxC,IAAIF,eAAe,CAACO,UAAU,EAAEL,MAAM,CAAC,EAAE;QACvC,OAAO,IAAI;MACb;MACA,KAAK,MAAMD,GAAG,IAAIW,cAAc,CAACT,OAAO,EAAE;QACxC,IAAIH,eAAe,CAACC,GAAG,EAAEC,MAAM,CAAC,EAAE;UAChC,OAAO,IAAI;QACb;MACF;MACA,OAAO,KAAK;IACd,CAAC;IAED,MAAMe,gBAAgB,GAAIC,CAAQ,IAAK;MACrC,IAAIL,SAAS,CAAC,SAAS,CAAC,IAAI,CAACG,eAAe,CAACE,CAAC,CAAChB,MAAc,CAAC,EAAE;QAC9DS,YAAY,CAACR,OAAO,CAAC,CAAC;MACxB;IACF,CAAC;IAEDgB,QAAQ,CAACC,gBAAgB,CAAC,aAAa,EAAEH,gBAAgB,CAAC;IAC1DE,QAAQ,CAACC,gBAAgB,CAAC,SAAS,EAAEH,gBAAgB,CAAC;IACtD,OAAO,MAAM;MACXE,QAAQ,CAACE,mBAAmB,CAAC,aAAa,EAAEJ,gBAAgB,CAAC;MAC7DE,QAAQ,CAACE,mBAAmB,CAAC,SAAS,EAAEJ,gBAAgB,CAAC;IAC3D,CAAC;EACH,CAAC,EAAE,CAACX,IAAI,EAAEC,UAAU,EAAEM,SAAS,CAAC,CAAC;AACnC","ignoreList":[]}
@@ -1,8 +1,16 @@
1
1
  "use strict";
2
2
 
3
+ import { useOverlayStackRegistration } from './OverlayStack';
4
+
3
5
  /**
4
6
  * No-op on native — Escape key dismissal is not applicable.
5
7
  * Native uses the system back gesture / hardware button via Modal.
6
8
  */
7
- export function useEscapeKey(_open, _onEscape) {}
9
+ export function useEscapeKey(open, _onEscape, options = {}) {
10
+ useOverlayStackRegistration({
11
+ active: open,
12
+ capabilities: ['escape'],
13
+ ...options
14
+ });
15
+ }
8
16
  //# sourceMappingURL=useEscapeKey.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useEscapeKey","_open","_onEscape"],"sourceRoot":"../../../src","sources":["overlay/useEscapeKey.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA,OAAO,SAASA,YAAYA,CAACC,KAAc,EAAEC,SAAqB,EAAE,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["useOverlayStackRegistration","useEscapeKey","open","_onEscape","options","active","capabilities"],"sourceRoot":"../../../src","sources":["overlay/useEscapeKey.ts"],"mappings":";;AAAA,SAASA,2BAA2B,QAAmC,gBAAgB;;AAEvF;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAC1BC,IAAa,EACbC,SAAqB,EACrBC,OAA6B,GAAG,CAAC,CAAC,EAClC;EACAJ,2BAA2B,CAAC;IAC1BK,MAAM,EAAEH,IAAI;IACZI,YAAY,EAAE,CAAC,QAAQ,CAAC;IACxB,GAAGF;EACL,CAAC,CAAC;AACJ","ignoreList":[]}
@@ -1,20 +1,28 @@
1
1
  "use strict";
2
2
 
3
3
  import { useEffect, useRef } from 'react';
4
+ import { useOverlayStackRegistration } from './OverlayStack';
4
5
 
5
6
  /**
6
7
  * Closes an overlay when the user presses the Escape key.
7
8
  * Web-only — native platforms use Modal's `onRequestClose` for back/dismiss.
8
9
  */
9
- export function useEscapeKey(open, onEscape) {
10
+ export function useEscapeKey(open, onEscape, options = {}) {
10
11
  const onEscapeRef = useRef(onEscape);
11
12
  onEscapeRef.current = onEscape;
13
+ const {
14
+ isTopmost
15
+ } = useOverlayStackRegistration({
16
+ active: open,
17
+ capabilities: ['escape'],
18
+ ...options
19
+ });
12
20
  useEffect(() => {
13
21
  if (!open) {
14
22
  return;
15
23
  }
16
24
  const handleKeyDown = e => {
17
- if (e.key === 'Escape') {
25
+ if (e.key === 'Escape' && isTopmost('escape')) {
18
26
  onEscapeRef.current();
19
27
  }
20
28
  };
@@ -22,6 +30,6 @@ export function useEscapeKey(open, onEscape) {
22
30
  return () => {
23
31
  document.removeEventListener('keydown', handleKeyDown);
24
32
  };
25
- }, [open]);
33
+ }, [isTopmost, open]);
26
34
  }
27
35
  //# sourceMappingURL=useEscapeKey.web.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useRef","useEscapeKey","open","onEscape","onEscapeRef","current","handleKeyDown","e","key","document","addEventListener","removeEventListener"],"sourceRoot":"../../../src","sources":["overlay/useEscapeKey.web.ts"],"mappings":";;AAAA,SAASA,SAAS,EAAEC,MAAM,QAAQ,OAAO;;AAEzC;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAACC,IAAa,EAAEC,QAAoB,EAAE;EAChE,MAAMC,WAAW,GAAGJ,MAAM,CAACG,QAAQ,CAAC;EACpCC,WAAW,CAACC,OAAO,GAAGF,QAAQ;EAE9BJ,SAAS,CAAC,MAAM;IACd,IAAI,CAACG,IAAI,EAAE;MACT;IACF;IAEA,MAAMI,aAAa,GAAIC,CAAgB,IAAK;MAC1C,IAAIA,CAAC,CAACC,GAAG,KAAK,QAAQ,EAAE;QACtBJ,WAAW,CAACC,OAAO,CAAC,CAAC;MACvB;IACF,CAAC;IAEDI,QAAQ,CAACC,gBAAgB,CAAC,SAAS,EAAEJ,aAAa,CAAC;IACnD,OAAO,MAAM;MACXG,QAAQ,CAACE,mBAAmB,CAAC,SAAS,EAAEL,aAAa,CAAC;IACxD,CAAC;EACH,CAAC,EAAE,CAACJ,IAAI,CAAC,CAAC;AACZ","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","useRef","useOverlayStackRegistration","useEscapeKey","open","onEscape","options","onEscapeRef","current","isTopmost","active","capabilities","handleKeyDown","e","key","document","addEventListener","removeEventListener"],"sourceRoot":"../../../src","sources":["overlay/useEscapeKey.web.ts"],"mappings":";;AAAA,SAASA,SAAS,EAAEC,MAAM,QAAQ,OAAO;AACzC,SAASC,2BAA2B,QAAmC,gBAAgB;;AAEvF;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAC1BC,IAAa,EACbC,QAAoB,EACpBC,OAA6B,GAAG,CAAC,CAAC,EAClC;EACA,MAAMC,WAAW,GAAGN,MAAM,CAACI,QAAQ,CAAC;EACpCE,WAAW,CAACC,OAAO,GAAGH,QAAQ;EAC9B,MAAM;IAAEI;EAAU,CAAC,GAAGP,2BAA2B,CAAC;IAChDQ,MAAM,EAAEN,IAAI;IACZO,YAAY,EAAE,CAAC,QAAQ,CAAC;IACxB,GAAGL;EACL,CAAC,CAAC;EAEFN,SAAS,CAAC,MAAM;IACd,IAAI,CAACI,IAAI,EAAE;MACT;IACF;IAEA,MAAMQ,aAAa,GAAIC,CAAgB,IAAK;MAC1C,IAAIA,CAAC,CAACC,GAAG,KAAK,QAAQ,IAAIL,SAAS,CAAC,QAAQ,CAAC,EAAE;QAC7CF,WAAW,CAACC,OAAO,CAAC,CAAC;MACvB;IACF,CAAC;IAEDO,QAAQ,CAACC,gBAAgB,CAAC,SAAS,EAAEJ,aAAa,CAAC;IACnD,OAAO,MAAM;MACXG,QAAQ,CAACE,mBAAmB,CAAC,SAAS,EAAEL,aAAa,CAAC;IACxD,CAAC;EACH,CAAC,EAAE,CAACH,SAAS,EAAEL,IAAI,CAAC,CAAC;AACvB","ignoreList":[]}
@@ -48,27 +48,37 @@ const MIN_CONTENT_HEIGHT = 200;
48
48
  *
49
49
  * Respects safe-area insets provided via `OverlayInsetsProvider`.
50
50
  */
51
- export function useOverlayPosition(anchorLayout) {
51
+ export function useOverlayPosition(anchorLayout, options) {
52
52
  const {
53
+ width: viewportWidth,
53
54
  height: viewportHeight
54
55
  } = useWindowDimensions();
55
56
  const {
56
57
  top: insetTop,
57
- bottom: insetBottom
58
+ bottom: insetBottom,
59
+ right: insetRight
58
60
  } = useContext(OverlayInsetsContext);
61
+ const matchAnchorWidth = options?.matchAnchorWidth ?? true;
59
62
  return useMemo(() => {
60
63
  if (!anchorLayout) return null;
61
64
  const anchorBottom = anchorLayout.y + anchorLayout.height;
62
65
  const spaceBelow = viewportHeight - anchorBottom - insetBottom - SCREEN_EDGE_PADDING;
63
66
  const spaceAbove = anchorLayout.y - insetTop - SCREEN_EDGE_PADDING;
64
67
  const preferBelow = spaceBelow >= MIN_CONTENT_HEIGHT || spaceBelow >= spaceAbove;
68
+ const horizontalStyle = matchAnchorWidth ? {
69
+ left: anchorLayout.x,
70
+ width: anchorLayout.width
71
+ } : {
72
+ left: anchorLayout.x,
73
+ alignItems: 'flex-start',
74
+ maxWidth: Math.max(0, viewportWidth - anchorLayout.x - insetRight - SCREEN_EDGE_PADDING)
75
+ };
65
76
  if (preferBelow) {
66
77
  const maxHeight = Math.max(0, spaceBelow);
67
78
  return {
68
79
  style: {
80
+ ...horizontalStyle,
69
81
  top: anchorBottom + POPOVER_GAP,
70
- left: anchorLayout.x,
71
- width: anchorLayout.width,
72
82
  maxHeight
73
83
  },
74
84
  maxHeight,
@@ -78,14 +88,13 @@ export function useOverlayPosition(anchorLayout) {
78
88
  const maxHeight = Math.max(0, spaceAbove);
79
89
  return {
80
90
  style: {
91
+ ...horizontalStyle,
81
92
  bottom: viewportHeight - anchorLayout.y + POPOVER_GAP,
82
- left: anchorLayout.x,
83
- width: anchorLayout.width,
84
93
  maxHeight
85
94
  },
86
95
  maxHeight,
87
96
  placement: 'top'
88
97
  };
89
- }, [anchorLayout, viewportHeight, insetTop, insetBottom]);
98
+ }, [anchorLayout, viewportWidth, viewportHeight, insetTop, insetBottom, insetRight, matchAnchorWidth]);
90
99
  }
91
100
  //# sourceMappingURL=useOverlayPosition.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createContext","useContext","useMemo","useWindowDimensions","DEFAULT_INSETS","top","right","bottom","left","OverlayInsetsContext","OverlayInsetsProvider","Provider","SCREEN_EDGE_PADDING","POPOVER_GAP","MIN_CONTENT_HEIGHT","useOverlayPosition","anchorLayout","height","viewportHeight","insetTop","insetBottom","anchorBottom","y","spaceBelow","spaceAbove","preferBelow","maxHeight","Math","max","style","x","width","placement"],"sourceRoot":"../../../src","sources":["overlay/useOverlayPosition.ts"],"mappings":";;AAAA,SAASA,aAAa,EAAEC,UAAU,EAAEC,OAAO,QAAQ,OAAO;AAC1D,SAASC,mBAAmB,QAAwB,cAAc;AAUlE,MAAMC,cAA0B,GAAG;EAAEC,GAAG,EAAE,CAAC;EAAEC,KAAK,EAAE,CAAC;EAAEC,MAAM,EAAE,CAAC;EAAEC,IAAI,EAAE;AAAE,CAAC;;AAE3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,oBAAoB,gBAAGT,aAAa,CAAaI,cAAc,CAAC;AAC7E,OAAO,MAAMM,qBAAqB,GAAGD,oBAAoB,CAACE,QAAQ;;AAElE;AACA,MAAMC,mBAAmB,GAAG,CAAC;;AAE7B;AACA,MAAMC,WAAW,GAAG,CAAC;;AAErB;AACA,MAAMC,kBAAkB,GAAG,GAAG;AAQ9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAACC,YAAiC,EAA0B;EAC5F,MAAM;IAAEC,MAAM,EAAEC;EAAe,CAAC,GAAGf,mBAAmB,CAAC,CAAC;EACxD,MAAM;IAAEE,GAAG,EAAEc,QAAQ;IAAEZ,MAAM,EAAEa;EAAY,CAAC,GAAGnB,UAAU,CAACQ,oBAAoB,CAAC;EAE/E,OAAOP,OAAO,CAAC,MAAM;IACnB,IAAI,CAACc,YAAY,EAAE,OAAO,IAAI;IAE9B,MAAMK,YAAY,GAAGL,YAAY,CAACM,CAAC,GAAGN,YAAY,CAACC,MAAM;IACzD,MAAMM,UAAU,GAAGL,cAAc,GAAGG,YAAY,GAAGD,WAAW,GAAGR,mBAAmB;IACpF,MAAMY,UAAU,GAAGR,YAAY,CAACM,CAAC,GAAGH,QAAQ,GAAGP,mBAAmB;IAElE,MAAMa,WAAW,GAAGF,UAAU,IAAIT,kBAAkB,IAAIS,UAAU,IAAIC,UAAU;IAEhF,IAAIC,WAAW,EAAE;MACf,MAAMC,SAAS,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEL,UAAU,CAAC;MACzC,OAAO;QACLM,KAAK,EAAE;UACLxB,GAAG,EAAEgB,YAAY,GAAGR,WAAW;UAC/BL,IAAI,EAAEQ,YAAY,CAACc,CAAC;UACpBC,KAAK,EAAEf,YAAY,CAACe,KAAK;UACzBL;QACF,CAAC;QACDA,SAAS;QACTM,SAAS,EAAE;MACb,CAAC;IACH;IAEA,MAAMN,SAAS,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEJ,UAAU,CAAC;IACzC,OAAO;MACLK,KAAK,EAAE;QACLtB,MAAM,EAAEW,cAAc,GAAGF,YAAY,CAACM,CAAC,GAAGT,WAAW;QACrDL,IAAI,EAAEQ,YAAY,CAACc,CAAC;QACpBC,KAAK,EAAEf,YAAY,CAACe,KAAK;QACzBL;MACF,CAAC;MACDA,SAAS;MACTM,SAAS,EAAE;IACb,CAAC;EACH,CAAC,EAAE,CAAChB,YAAY,EAAEE,cAAc,EAAEC,QAAQ,EAAEC,WAAW,CAAC,CAAC;AAC3D","ignoreList":[]}
1
+ {"version":3,"names":["createContext","useContext","useMemo","useWindowDimensions","DEFAULT_INSETS","top","right","bottom","left","OverlayInsetsContext","OverlayInsetsProvider","Provider","SCREEN_EDGE_PADDING","POPOVER_GAP","MIN_CONTENT_HEIGHT","useOverlayPosition","anchorLayout","options","width","viewportWidth","height","viewportHeight","insetTop","insetBottom","insetRight","matchAnchorWidth","anchorBottom","y","spaceBelow","spaceAbove","preferBelow","horizontalStyle","x","alignItems","maxWidth","Math","max","maxHeight","style","placement"],"sourceRoot":"../../../src","sources":["overlay/useOverlayPosition.ts"],"mappings":"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","ignoreList":[]}
@@ -4,84 +4,100 @@ import * as React from 'react';
4
4
  import { useEffect, useSyncExternalStore } from 'react';
5
5
  import { Platform } from 'react-native';
6
6
  import { createPortalFn } from '../utils/createPortal';
7
- import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
7
+ import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
8
8
  const DEFAULT_PORTAL_HOST = 'FORGE_UI_DEFAULT_HOST_NAME';
9
- const store = {
10
- map: new Map().set(DEFAULT_PORTAL_HOST, new Map()),
11
- listeners: new Set()
12
- };
13
-
14
- /** Tracks mounted PortalHost instances per host name — only the first mount renders portals. */
15
- const hostStackStore = {
16
- stacks: new Map(),
17
- listeners: new Set()
18
- };
19
- let hasWarnedMultiplePortalHosts = false;
20
-
21
- // --------------------------------------------------
22
-
23
- function emit() {
24
- for (const cb of store.listeners) cb();
9
+ function createPortalRegistry() {
10
+ return {
11
+ map: new Map().set(DEFAULT_PORTAL_HOST, new Map()),
12
+ hostStacks: new Map(),
13
+ portalListeners: new Set(),
14
+ hostListeners: new Set(),
15
+ hasWarnedMultipleHosts: false
16
+ };
25
17
  }
26
- function emitHostStack() {
27
- for (const cb of hostStackStore.listeners) cb();
18
+
19
+ /**
20
+ * Standalone Portal and PortalHost instances continue to share this fallback.
21
+ * PortalProvider creates an isolated registry for each provider subtree.
22
+ */
23
+ const fallbackPortalRegistry = createPortalRegistry();
24
+ const PortalRegistryContext = /*#__PURE__*/React.createContext(null);
25
+ function emitPortals(registry) {
26
+ for (const cb of registry.portalListeners) cb();
28
27
  }
29
- function getHostStackSnapshot() {
30
- return hostStackStore.stacks;
28
+ function emitHosts(registry) {
29
+ for (const cb of registry.hostListeners) cb();
31
30
  }
32
- function subscribeHostStack(cb) {
33
- hostStackStore.listeners.add(cb);
31
+ function subscribeHosts(registry, cb) {
32
+ registry.hostListeners.add(cb);
34
33
  return () => {
35
- hostStackStore.listeners.delete(cb);
34
+ registry.hostListeners.delete(cb);
36
35
  };
37
36
  }
38
- function pushPortalHost(name, id) {
39
- const stacks = new Map(hostStackStore.stacks);
37
+ function pushPortalHost(registry, name, id) {
38
+ const stacks = new Map(registry.hostStacks);
40
39
  const stack = [...(stacks.get(name) ?? [])];
41
40
  stack.push(id);
42
41
  stacks.set(name, stack);
43
- hostStackStore.stacks = stacks;
44
- if (__DEV__ && !hasWarnedMultiplePortalHosts && stack.length > 1) {
45
- hasWarnedMultiplePortalHosts = true;
42
+ registry.hostStacks = stacks;
43
+ if (__DEV__ && !registry.hasWarnedMultipleHosts && stack.length > 1) {
44
+ registry.hasWarnedMultipleHosts = true;
46
45
  console.warn('[Forge UI] Multiple PortalHost instances detected for the same host name. ' + 'Only the first mounted PortalHost renders portal content. ' + 'Mount a single PortalHost near your app root (ForgeDesignProvider does this automatically).');
47
46
  }
48
- emitHostStack();
47
+ emitHosts(registry);
49
48
  }
50
- function popPortalHost(name, id) {
51
- const stacks = new Map(hostStackStore.stacks);
49
+ function popPortalHost(registry, name, id) {
50
+ const stacks = new Map(registry.hostStacks);
52
51
  const stack = (stacks.get(name) ?? []).filter(entry => entry !== id);
53
- stacks.set(name, stack);
54
- hostStackStore.stacks = stacks;
55
- emitHostStack();
52
+ if (stack.length === 0) {
53
+ stacks.delete(name);
54
+ } else {
55
+ stacks.set(name, stack);
56
+ }
57
+ registry.hostStacks = stacks;
58
+ emitHosts(registry);
56
59
  }
57
- function isActivePortalHost(name, id) {
58
- const stack = hostStackStore.stacks.get(name) ?? [];
60
+ function isActivePortalHost(registry, name, id) {
61
+ const stack = registry.hostStacks.get(name) ?? [];
59
62
  return stack.length > 0 && stack[0] === id;
60
63
  }
61
- function getSnapshot() {
62
- return store.map;
63
- }
64
- function subscribe(cb) {
65
- store.listeners.add(cb);
64
+ function subscribePortals(registry, cb) {
65
+ registry.portalListeners.add(cb);
66
66
  return () => {
67
- store.listeners.delete(cb);
67
+ registry.portalListeners.delete(cb);
68
68
  };
69
69
  }
70
- function updatePortal(hostName, name, children) {
71
- const next = new Map(store.map);
72
- const portal = next.get(hostName) ?? new Map();
70
+ function updatePortal(registry, hostName, name, children) {
71
+ const next = new Map(registry.map);
72
+ const portal = new Map(next.get(hostName) ?? []);
73
73
  portal.set(name, children);
74
74
  next.set(hostName, portal);
75
- store.map = next;
76
- emit();
75
+ registry.map = next;
76
+ emitPortals(registry);
77
77
  }
78
- function removePortal(hostName, name) {
79
- const next = new Map(store.map);
80
- const portal = next.get(hostName) ?? new Map();
78
+ function removePortal(registry, hostName, name) {
79
+ const next = new Map(registry.map);
80
+ const portal = new Map(next.get(hostName) ?? []);
81
81
  portal.delete(name);
82
- next.set(hostName, portal);
83
- store.map = next;
84
- emit();
82
+ if (portal.size === 0 && hostName !== DEFAULT_PORTAL_HOST) {
83
+ next.delete(hostName);
84
+ } else {
85
+ next.set(hostName, portal);
86
+ }
87
+ registry.map = next;
88
+ emitPortals(registry);
89
+ }
90
+
91
+ // --------------------------------------------------
92
+
93
+ export function PortalProvider({
94
+ children
95
+ }) {
96
+ const [registry] = React.useState(createPortalRegistry);
97
+ return /*#__PURE__*/_jsx(PortalRegistryContext.Provider, {
98
+ value: registry,
99
+ children: children
100
+ });
85
101
  }
86
102
 
87
103
  // --------------------------------------------------
@@ -89,21 +105,24 @@ function removePortal(hostName, name) {
89
105
  export function PortalHost({
90
106
  name = DEFAULT_PORTAL_HOST
91
107
  }) {
108
+ const registry = React.useContext(PortalRegistryContext) ?? fallbackPortalRegistry;
92
109
  const hostId = React.useRef(Symbol()).current;
93
110
  useEffect(() => {
94
- pushPortalHost(name, hostId);
111
+ pushPortalHost(registry, name, hostId);
95
112
  return () => {
96
- popPortalHost(name, hostId);
113
+ popPortalHost(registry, name, hostId);
97
114
  };
98
- }, [name, hostId]);
99
- useSyncExternalStore(subscribeHostStack, getHostStackSnapshot, getHostStackSnapshot);
100
- const map = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
115
+ }, [registry, name, hostId]);
116
+ useSyncExternalStore(cb => subscribeHosts(registry, cb), () => registry.hostStacks, () => registry.hostStacks);
117
+ const map = useSyncExternalStore(cb => subscribePortals(registry, cb), () => registry.map, () => registry.map);
101
118
  const portalMap = map.get(name) ?? new Map();
102
- if (!isActivePortalHost(name, hostId) || portalMap.size === 0) {
119
+ if (!isActivePortalHost(registry, name, hostId) || portalMap.size === 0) {
103
120
  return null;
104
121
  }
105
122
  const content = /*#__PURE__*/_jsx(_Fragment, {
106
- children: Array.from(portalMap.values())
123
+ children: Array.from(portalMap.entries()).map(([portalName, children]) => /*#__PURE__*/_jsx(React.Fragment, {
124
+ children: children
125
+ }, portalName))
107
126
  });
108
127
  if (Platform.OS === 'web' && createPortalFn && typeof document !== 'undefined') {
109
128
  return createPortalFn(content, document.body);
@@ -118,12 +137,15 @@ export function Portal({
118
137
  hostName = DEFAULT_PORTAL_HOST,
119
138
  children
120
139
  }) {
140
+ const registry = React.useContext(PortalRegistryContext) ?? fallbackPortalRegistry;
141
+ useEffect(() => {
142
+ updatePortal(registry, hostName, name, children);
143
+ }, [registry, hostName, name, children]);
121
144
  useEffect(() => {
122
- updatePortal(hostName, name, children);
123
145
  return () => {
124
- removePortal(hostName, name);
146
+ removePortal(registry, hostName, name);
125
147
  };
126
- }, [hostName, name, children]);
148
+ }, [registry, hostName, name]);
127
149
  return null;
128
150
  }
129
151
 
@@ -1 +1 @@
1
- {"version":3,"names":["React","useEffect","useSyncExternalStore","Platform","createPortalFn","Fragment","_Fragment","jsx","_jsx","DEFAULT_PORTAL_HOST","store","map","Map","set","listeners","Set","hostStackStore","stacks","hasWarnedMultiplePortalHosts","emit","cb","emitHostStack","getHostStackSnapshot","subscribeHostStack","add","delete","pushPortalHost","name","id","stack","get","push","__DEV__","length","console","warn","popPortalHost","filter","entry","isActivePortalHost","getSnapshot","subscribe","updatePortal","hostName","children","next","portal","removePortal","PortalHost","hostId","useRef","Symbol","current","portalMap","size","content","Array","from","values","OS","document","body","Portal","ROOT","flex","useModalPortalRoot","ref","offset","setSideOffSet","useState","onLayout","useCallback","measure","_x","_y","_width","_height","_pageX","pageY","style"],"sourceRoot":"../../../src","sources":["portal/portal.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useEffect","useSyncExternalStore","Platform","createPortalFn","jsx","_jsx","Fragment","_Fragment","DEFAULT_PORTAL_HOST","createPortalRegistry","map","Map","set","hostStacks","portalListeners","Set","hostListeners","hasWarnedMultipleHosts","fallbackPortalRegistry","PortalRegistryContext","createContext","emitPortals","registry","cb","emitHosts","subscribeHosts","add","delete","pushPortalHost","name","id","stacks","stack","get","push","__DEV__","length","console","warn","popPortalHost","filter","entry","isActivePortalHost","subscribePortals","updatePortal","hostName","children","next","portal","removePortal","size","PortalProvider","useState","Provider","value","PortalHost","useContext","hostId","useRef","Symbol","current","portalMap","content","Array","from","entries","portalName","OS","document","body","Portal","ROOT","flex","useModalPortalRoot","ref","offset","setSideOffSet","onLayout","useCallback","measure","_x","_y","_width","_height","_pageX","pageY","style"],"sourceRoot":"../../../src","sources":["portal/portal.tsx"],"mappings":"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","ignoreList":[]}
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
 
3
3
  import React, { forwardRef, useCallback, useRef } from 'react';
4
- import { Platform, ScrollView, View } from 'react-native';
4
+ import { Platform, View } from 'react-native';
5
5
  import { FadeIn, FadeOut } from 'react-native-reanimated';
6
6
  import { composeEventHandlers, mergeRefs } from '@cdx-ui/utils';
7
- import { OverlayContainer, useAnchorPosition, useDismissOverlay, useOverlayPosition } from '../overlay';
7
+ import { OverlayContainer, useAnchoredOverlay, useDismissOverlay } from '../overlay';
8
8
  import { Slot } from '../slot';
9
9
  import { dataAttributes, mergeDataAttributes } from '../utils/dataAttributes';
10
10
  import { useSelectContext } from './context';
@@ -16,6 +16,8 @@ export const SelectContent = /*#__PURE__*/forwardRef(({
16
16
  children,
17
17
  enteringAnimation,
18
18
  exitingAnimation,
19
+ onLayout,
20
+ style,
19
21
  ...props
20
22
  }, ref) => {
21
23
  const {
@@ -42,11 +44,21 @@ export const SelectContent = /*#__PURE__*/forwardRef(({
42
44
  });
43
45
  }
44
46
  }, []);
45
- const mergedRef = mergeRefs(ref, focusOnMount);
46
47
  const dismiss = useCallback(() => setOpen(false), [setOpen]);
47
- const anchorLayout = useAnchorPosition(triggerRef, open);
48
- const position = useOverlayPosition(anchorLayout);
49
- useDismissOverlay(open, contentRef, [triggerRef], dismiss);
48
+ const overlayOpen = open && !native;
49
+ const {
50
+ floatingRef,
51
+ onFloatingLayout,
52
+ style: overlayStyle,
53
+ position
54
+ } = useAnchoredOverlay(triggerRef, overlayOpen, {
55
+ placement: 'bottom-start',
56
+ offset: 4,
57
+ collisionBehavior: 'flip-shift',
58
+ width: 'anchor'
59
+ });
60
+ const mergedRef = mergeRefs(ref, focusOnMount, floatingRef);
61
+ useDismissOverlay(overlayOpen, contentRef, [triggerRef], dismiss);
50
62
  const {
51
63
  handleKeyDown
52
64
  } = useListboxNavigation({
@@ -66,7 +78,7 @@ export const SelectContent = /*#__PURE__*/forwardRef(({
66
78
  value,
67
79
  setActiveValue
68
80
  });
69
- if (native || !open || !position) {
81
+ if (!overlayOpen) {
70
82
  return null;
71
83
  }
72
84
  const webProps = Platform.OS === 'web' ? {
@@ -78,21 +90,21 @@ export const SelectContent = /*#__PURE__*/forwardRef(({
78
90
  onDismiss: dismiss,
79
91
  entering: enteringAnimation ?? FadeIn.duration(150),
80
92
  exiting: exitingAnimation ?? FadeOut.duration(100),
81
- style: position.style,
82
93
  children: /*#__PURE__*/_jsx(Comp, {
83
94
  ref: mergedRef,
95
+ onLayout: composeEventHandlers(onLayout, onFloatingLayout),
96
+ style: [style, overlayStyle],
84
97
  role: "listbox",
85
98
  id: contentId,
86
99
  "aria-labelledby": triggerId,
87
100
  ...props,
88
101
  ...mergeDataAttributes(props, dataAttributes({
89
- state: 'open'
102
+ state: 'open',
103
+ side: position?.resolvedPlacement.side,
104
+ align: position?.resolvedPlacement.align
90
105
  })),
91
106
  ...webProps,
92
- children: /*#__PURE__*/_jsx(ScrollView, {
93
- scrollEventThrottle: 16,
94
- children: children
95
- })
107
+ children: children
96
108
  })
97
109
  });
98
110
  });
@@ -1 +1 @@
1
- {"version":3,"names":["React","forwardRef","useCallback","useRef","Platform","ScrollView","View","FadeIn","FadeOut","composeEventHandlers","mergeRefs","OverlayContainer","useAnchorPosition","useDismissOverlay","useOverlayPosition","Slot","dataAttributes","mergeDataAttributes","useSelectContext","useContentFocus","useListboxNavigation","jsx","_jsx","SelectContent","asChild","children","enteringAnimation","exitingAnimation","props","ref","open","setOpen","contentId","triggerId","activeValue","setActiveValue","value","onValueChange","native","triggerRef","items","contentRef","focusOnMount","node","current","OS","requestAnimationFrame","setTimeout","focus","mergedRef","dismiss","anchorLayout","position","handleKeyDown","onSelect","val","onDismiss","webProps","onKeyDown","tabIndex","Comp","entering","duration","exiting","style","role","id","state","scrollEventThrottle","displayName"],"sourceRoot":"../../../src","sources":["select/SelectContent.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","forwardRef","useCallback","useRef","Platform","View","FadeIn","FadeOut","composeEventHandlers","mergeRefs","OverlayContainer","useAnchoredOverlay","useDismissOverlay","Slot","dataAttributes","mergeDataAttributes","useSelectContext","useContentFocus","useListboxNavigation","jsx","_jsx","SelectContent","asChild","children","enteringAnimation","exitingAnimation","onLayout","style","props","ref","open","setOpen","contentId","triggerId","activeValue","setActiveValue","value","onValueChange","native","triggerRef","items","contentRef","focusOnMount","node","current","OS","requestAnimationFrame","setTimeout","focus","dismiss","overlayOpen","floatingRef","onFloatingLayout","overlayStyle","position","placement","offset","collisionBehavior","width","mergedRef","handleKeyDown","onSelect","val","onDismiss","webProps","onKeyDown","tabIndex","Comp","entering","duration","exiting","role","id","state","side","resolvedPlacement","align","displayName"],"sourceRoot":"../../../src","sources":["select/SelectContent.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,UAAU,EAAEC,WAAW,EAAEC,MAAM,QAA2B,OAAO;AACjF,SAASC,QAAQ,EAAEC,IAAI,QAAQ,cAAc;AAC7C,SAASC,MAAM,EAAEC,OAAO,QAAQ,yBAAyB;AACzD,SAASC,oBAAoB,EAAEC,SAAS,QAAQ,eAAe;AAC/D,SAASC,gBAAgB,EAAEC,kBAAkB,EAAEC,iBAAiB,QAAQ,YAAY;AACpF,SAASC,IAAI,QAAQ,SAAS;AAC9B,SAASC,cAAc,EAAEC,mBAAmB,QAAQ,yBAAyB;AAC7E,SAASC,gBAAgB,QAAQ,WAAW;AAE5C,SAASC,eAAe,QAAQ,mBAAmB;AACnD,SAASC,oBAAoB,QAAQ,wBAAwB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAO9D,OAAO,MAAMC,aAAa,gBAAGpB,UAAU,CACrC,CAAC;EAAEqB,OAAO;EAAEC,QAAQ;EAAEC,iBAAiB;EAAEC,gBAAgB;EAAEC,QAAQ;EAAEC,KAAK;EAAE,GAAGC;AAAM,CAAC,EAAEC,GAAG,KAAK;EAC9F,MAAM;IACJC,IAAI;IACJC,OAAO;IACPC,SAAS;IACTC,SAAS;IACTC,WAAW;IACXC,cAAc;IACdC,KAAK;IACLC,aAAa;IACbC,MAAM;IACNC,UAAU;IACVC;EACF,CAAC,GAAGxB,gBAAgB,CAAC,CAAC;EAEtB,MAAMyB,UAAU,GAAGtC,MAAM,CAAqB,IAAI,CAAC;EAEnD,MAAMuC,YAAY,GAAGxC,WAAW,CAAEyC,IAAa,IAAK;IAClDF,UAAU,CAACG,OAAO,GAAGD,IAA0B;IAC/C,IAAIA,IAAI,IAAIvC,QAAQ,CAACyC,EAAE,KAAK,KAAK,EAAE;MACjCC,qBAAqB,CAAC,MAAM;QAC1BC,UAAU,CAAC,MAAM;UACdJ,IAAI,CAAiBK,KAAK,GAAG,CAAC;QACjC,CAAC,EAAE,GAAG,CAAC;MACT,CAAC,CAAC;IACJ;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMC,OAAO,GAAG/C,WAAW,CAAC,MAAM6B,OAAO,CAAC,KAAK,CAAC,EAAE,CAACA,OAAO,CAAC,CAAC;EAE5D,MAAMmB,WAAW,GAAGpB,IAAI,IAAI,CAACQ,MAAM;EACnC,MAAM;IACJa,WAAW;IACXC,gBAAgB;IAChBzB,KAAK,EAAE0B,YAAY;IACnBC;EACF,CAAC,GAAG3C,kBAAkB,CAAC4B,UAAU,EAAEW,WAAW,EAAE;IAC9CK,SAAS,EAAE,cAAc;IACzBC,MAAM,EAAE,CAAC;IACTC,iBAAiB,EAAE,YAAY;IAC/BC,KAAK,EAAE;EACT,CAAC,CAAC;EACF,MAAMC,SAAS,GAAGlD,SAAS,CAACoB,GAAG,EAAEa,YAAY,EAAgCS,WAAW,CAAC;EAEzFvC,iBAAiB,CAACsC,WAAW,EAAET,UAAU,EAAE,CAACF,UAAU,CAAC,EAAEU,OAAO,CAAC;EAEjE,MAAM;IAAEW;EAAc,CAAC,GAAG1C,oBAAoB,CAAC;IAC7CsB,KAAK;IACLN,WAAW;IACXC,cAAc;IACd0B,QAAQ,EAAGC,GAAG,IAAK;MACjBzB,aAAa,CAACyB,GAAG,CAAC;MAClB/B,OAAO,CAAC,KAAK,CAAC;IAChB,CAAC;IACDgC,SAAS,EAAEd;EACb,CAAC,CAAC;EAEFhC,eAAe,CAAC;IACda,IAAI;IACJS,UAAU;IACVC,KAAK;IACLJ,KAAK;IACLD;EACF,CAAC,CAAC;EAEF,IAAI,CAACe,WAAW,EAAE;IAChB,OAAO,IAAI;EACb;EAEA,MAAMc,QAAQ,GACZ5D,QAAQ,CAACyC,EAAE,KAAK,KAAK,GACjB;IACEoB,SAAS,EAAEzD,oBAAoB,CAC5BoB,KAAK,CAAgDqC,SAAS,EAC/DL,aACF,CAAC;IACDM,QAAQ,EAAE,CAAC;EACb,CAAC,GACD,CAAC,CAAC;EAER,MAAMC,IAAI,GAAG7C,OAAO,GAAGT,IAAI,GAAGR,IAAI;EAElC,oBACEe,IAAA,CAACV,gBAAgB;IACfqD,SAAS,EAAEd,OAAQ;IACnBmB,QAAQ,EAAE5C,iBAAiB,IAAIlB,MAAM,CAAC+D,QAAQ,CAAC,GAAG,CAAE;IACpDC,OAAO,EAAE7C,gBAAgB,IAAIlB,OAAO,CAAC8D,QAAQ,CAAC,GAAG,CAAE;IAAA9C,QAAA,eAEnDH,IAAA,CAAC+C,IAAI;MACHtC,GAAG,EAAE8B,SAAU;MACfjC,QAAQ,EAAElB,oBAAoB,CAACkB,QAAQ,EAAE0B,gBAAgB,CAAE;MAC3DzB,KAAK,EAAE,CAACA,KAAK,EAAE0B,YAAY,CAAE;MAC7BkB,IAAI,EAAC,SAAS;MACdC,EAAE,EAAExC,SAAU;MACd,mBAAiBC,SAAU;MAAA,GACvBL,KAAK;MAAA,GACLb,mBAAmB,CACrBa,KAAK,EACLd,cAAc,CAAC;QACb2D,KAAK,EAAE,MAAM;QACbC,IAAI,EAAEpB,QAAQ,EAAEqB,iBAAiB,CAACD,IAAI;QACtCE,KAAK,EAAEtB,QAAQ,EAAEqB,iBAAiB,CAACC;MACrC,CAAC,CACH,CAAC;MAAA,GACGZ,QAAQ;MAAAzC,QAAA,EAEXA;IAAQ,CACL;EAAC,CACS,CAAC;AAEvB,CACF,CAAC;AAEDF,aAAa,CAACwD,WAAW,GAAG,eAAe","ignoreList":[]}
@@ -17,6 +17,16 @@ export function useListboxNavigation({
17
17
  onDismissRef.current = onDismiss;
18
18
  const getEnabledItems = useCallback(() => items.filter(item => !item.disabled), [items]);
19
19
  const handleKeyDown = useCallback(e => {
20
+ if (e.key === 'Escape') {
21
+ e.preventDefault();
22
+ e.stopPropagation?.();
23
+ onDismissRef.current();
24
+ return;
25
+ }
26
+ if (e.key === 'Tab') {
27
+ onDismissRef.current();
28
+ return;
29
+ }
20
30
  const enabledItems = getEnabledItems();
21
31
  if (enabledItems.length === 0) {
22
32
  return;
@@ -59,17 +69,6 @@ export function useListboxNavigation({
59
69
  }
60
70
  break;
61
71
  }
62
- case 'Escape':
63
- {
64
- e.preventDefault();
65
- onDismissRef.current();
66
- break;
67
- }
68
- case 'Tab':
69
- {
70
- onDismissRef.current();
71
- break;
72
- }
73
72
  }
74
73
  }, [activeValue, getEnabledItems, setActiveValue]);
75
74
  return {