bootstrap-rn 0.4.6 → 0.4.7

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 (287) hide show
  1. package/lib/module/Context.js.map +1 -1
  2. package/lib/module/Provider.js +3 -7
  3. package/lib/module/Provider.js.map +1 -1
  4. package/lib/module/components/Body.js +8 -1
  5. package/lib/module/components/Body.js.map +1 -1
  6. package/lib/module/components/buttons/Button.js +10 -8
  7. package/lib/module/components/buttons/Button.js.map +1 -1
  8. package/lib/module/components/close/CloseButton.js +7 -3
  9. package/lib/module/components/close/CloseButton.js.map +1 -1
  10. package/lib/module/components/collapse/useCollapse.js +2 -3
  11. package/lib/module/components/collapse/useCollapse.js.map +1 -1
  12. package/lib/module/components/dropdown/Dropdown.js +1 -2
  13. package/lib/module/components/dropdown/Dropdown.js.map +1 -1
  14. package/lib/module/components/dropdown/DropdownContext.js.map +1 -1
  15. package/lib/module/components/dropdown/DropdownMenu.js +33 -59
  16. package/lib/module/components/dropdown/DropdownMenu.js.map +1 -1
  17. package/lib/module/components/dropdown/useDismissDropdown.js +5 -4
  18. package/lib/module/components/dropdown/useDismissDropdown.js.map +1 -1
  19. package/lib/module/components/dropdown/useDropdown.js +35 -11
  20. package/lib/module/components/dropdown/useDropdown.js.map +1 -1
  21. package/lib/module/components/dropdown/useToggleDropdown.js +4 -6
  22. package/lib/module/components/dropdown/useToggleDropdown.js.map +1 -1
  23. package/lib/module/components/forms/FormCheckInput.js +1 -1
  24. package/lib/module/components/forms/Input.js +1 -1
  25. package/lib/module/components/forms/internals/PickerNative.js +1 -1
  26. package/lib/module/components/forms/internals/PickerNative.js.map +1 -1
  27. package/lib/module/components/helpers/BackdropHandler.js +6 -92
  28. package/lib/module/components/helpers/BackdropHandler.js.map +1 -1
  29. package/lib/module/components/helpers/BackdropHandler.web.js +8 -0
  30. package/lib/module/components/helpers/BackdropHandler.web.js.map +1 -0
  31. package/lib/module/components/helpers/Dialog.js +29 -0
  32. package/lib/module/components/helpers/Dialog.js.map +1 -0
  33. package/lib/module/components/helpers/Dialog.web.js +117 -0
  34. package/lib/module/components/helpers/Dialog.web.js.map +1 -0
  35. package/lib/module/components/helpers/Portal.js +5 -0
  36. package/lib/module/components/helpers/Portal.js.map +1 -0
  37. package/lib/module/components/helpers/Portal.web.js +16 -0
  38. package/lib/module/components/helpers/Portal.web.js.map +1 -0
  39. package/lib/module/components/helpers/PortalHost.js +5 -0
  40. package/lib/module/components/helpers/PortalHost.js.map +1 -0
  41. package/lib/module/components/helpers/PortalHost.web.js +15 -0
  42. package/lib/module/components/helpers/PortalHost.web.js.map +1 -0
  43. package/lib/module/components/modal/Modal.js +58 -48
  44. package/lib/module/components/modal/Modal.js.map +1 -1
  45. package/lib/module/components/modal/ModalContext.js.map +1 -1
  46. package/lib/module/components/modal/ModalTitle.js +6 -0
  47. package/lib/module/components/modal/ModalTitle.js.map +1 -1
  48. package/lib/module/components/modal/useModal.js +4 -13
  49. package/lib/module/components/modal/useModal.js.map +1 -1
  50. package/lib/module/components/nav/useTabbable.js +2 -3
  51. package/lib/module/components/nav/useTabbable.js.map +1 -1
  52. package/lib/module/components/navbar/NavbarToggler.js +1 -1
  53. package/lib/module/components/navbar/useNavbar.js +2 -3
  54. package/lib/module/components/navbar/useNavbar.js.map +1 -1
  55. package/lib/module/components/offcanvas/Offcanvas.js +84 -82
  56. package/lib/module/components/offcanvas/Offcanvas.js.map +1 -1
  57. package/lib/module/components/offcanvas/OffcanvasContext.js.map +1 -1
  58. package/lib/module/components/offcanvas/OffcanvasTitle.js +6 -0
  59. package/lib/module/components/offcanvas/OffcanvasTitle.js.map +1 -1
  60. package/lib/module/components/offcanvas/useOffcanvas.js +6 -14
  61. package/lib/module/components/offcanvas/useOffcanvas.js.map +1 -1
  62. package/lib/module/components/pagination/PaginationItem.js +39 -39
  63. package/lib/module/components/popover/Popover.js +6 -8
  64. package/lib/module/components/popover/Popover.js.map +1 -1
  65. package/lib/module/components/popover/PopoverArrow.js +18 -9
  66. package/lib/module/components/popover/PopoverArrow.js.map +1 -1
  67. package/lib/module/components/popover/PopoverContext.js.map +1 -1
  68. package/lib/module/components/popover/injectPopover.js +48 -45
  69. package/lib/module/components/popover/injectPopover.js.map +1 -1
  70. package/lib/module/components/tooltip/Tooltip.js +7 -23
  71. package/lib/module/components/tooltip/Tooltip.js.map +1 -1
  72. package/lib/module/components/tooltip/TooltipArrow.js +22 -12
  73. package/lib/module/components/tooltip/TooltipArrow.js.map +1 -1
  74. package/lib/module/components/tooltip/TooltipContext.js.map +1 -1
  75. package/lib/module/components/tooltip/injectTooltip.js +46 -42
  76. package/lib/module/components/tooltip/injectTooltip.js.map +1 -1
  77. package/lib/module/hooks/useBackgroundNative.js.map +1 -1
  78. package/lib/module/hooks/useFocusRing.js +13 -0
  79. package/lib/module/hooks/useFocusRing.js.map +1 -0
  80. package/lib/module/hooks/useFocusRing.web.js +5 -0
  81. package/lib/module/hooks/useFocusRing.web.js.map +1 -0
  82. package/lib/module/hooks/useInteractionState.js +11 -11
  83. package/lib/module/hooks/useInteractionState.js.map +1 -1
  84. package/lib/module/hooks/useOverlay.js +121 -0
  85. package/lib/module/hooks/useOverlay.js.map +1 -0
  86. package/lib/module/hooks/useOverlay.web.js +113 -0
  87. package/lib/module/hooks/useOverlay.web.js.map +1 -0
  88. package/lib/module/hooks/useScrollbarEffects.js +7 -60
  89. package/lib/module/hooks/useScrollbarEffects.js.map +1 -1
  90. package/lib/module/hooks/useScrollbarEffects.web.js +59 -0
  91. package/lib/module/hooks/useScrollbarEffects.web.js.map +1 -0
  92. package/lib/module/index.js +3 -3
  93. package/lib/module/index.js.map +1 -1
  94. package/lib/module/style/StyleSheet.js +1 -3
  95. package/lib/module/style/StyleSheet.js.map +1 -1
  96. package/lib/module/theme/variables.js +9 -9
  97. package/lib/module/utils.js +0 -11
  98. package/lib/module/utils.js.map +1 -1
  99. package/lib/typescript/Context.d.ts +0 -1
  100. package/lib/typescript/Context.d.ts.map +1 -1
  101. package/lib/typescript/Provider.d.ts.map +1 -1
  102. package/lib/typescript/components/Body.d.ts.map +1 -1
  103. package/lib/typescript/components/Link.d.ts +1 -1
  104. package/lib/typescript/components/Link.d.ts.map +1 -1
  105. package/lib/typescript/components/Pressable.d.ts +1 -1
  106. package/lib/typescript/components/Pressable.d.ts.map +1 -1
  107. package/lib/typescript/components/TextInput.d.ts +3 -3
  108. package/lib/typescript/components/TextInput.d.ts.map +1 -1
  109. package/lib/typescript/components/buttons/Button.d.ts +1 -1
  110. package/lib/typescript/components/buttons/Button.d.ts.map +1 -1
  111. package/lib/typescript/components/close/CloseButton.d.ts +1 -1
  112. package/lib/typescript/components/close/CloseButton.d.ts.map +1 -1
  113. package/lib/typescript/components/collapse/useCollapse.d.ts.map +1 -1
  114. package/lib/typescript/components/dropdown/Dropdown.d.ts +0 -1
  115. package/lib/typescript/components/dropdown/Dropdown.d.ts.map +1 -1
  116. package/lib/typescript/components/dropdown/DropdownContext.d.ts +14 -3
  117. package/lib/typescript/components/dropdown/DropdownContext.d.ts.map +1 -1
  118. package/lib/typescript/components/dropdown/DropdownMenu.d.ts +0 -1
  119. package/lib/typescript/components/dropdown/DropdownMenu.d.ts.map +1 -1
  120. package/lib/typescript/components/dropdown/useDismissDropdown.d.ts +1 -1
  121. package/lib/typescript/components/dropdown/useDismissDropdown.d.ts.map +1 -1
  122. package/lib/typescript/components/dropdown/useDropdown.d.ts +38 -4
  123. package/lib/typescript/components/dropdown/useDropdown.d.ts.map +1 -1
  124. package/lib/typescript/components/dropdown/useToggleDropdown.d.ts +4 -3
  125. package/lib/typescript/components/dropdown/useToggleDropdown.d.ts.map +1 -1
  126. package/lib/typescript/components/forms/Picker.d.ts +1 -1
  127. package/lib/typescript/components/forms/internals/PickerNative.d.ts +1 -1
  128. package/lib/typescript/components/forms/internals/PickerNative.d.ts.map +1 -1
  129. package/lib/typescript/components/forms/internals/PickerWeb.d.ts +1 -1
  130. package/lib/typescript/components/forms/internals/PickerWeb.d.ts.map +1 -1
  131. package/lib/typescript/components/helpers/BackdropHandler.d.ts +2 -11
  132. package/lib/typescript/components/helpers/BackdropHandler.d.ts.map +1 -1
  133. package/lib/typescript/components/helpers/BackdropHandler.web.d.ts +3 -0
  134. package/lib/typescript/components/helpers/BackdropHandler.web.d.ts.map +1 -0
  135. package/lib/typescript/components/helpers/Dialog.d.ts +15 -0
  136. package/lib/typescript/components/helpers/Dialog.d.ts.map +1 -0
  137. package/lib/typescript/components/helpers/Dialog.web.d.ts +15 -0
  138. package/lib/typescript/components/helpers/Dialog.web.d.ts.map +1 -0
  139. package/lib/typescript/components/helpers/Portal.d.ts +8 -0
  140. package/lib/typescript/components/helpers/Portal.d.ts.map +1 -0
  141. package/lib/typescript/components/helpers/Portal.web.d.ts +8 -0
  142. package/lib/typescript/components/helpers/Portal.web.d.ts.map +1 -0
  143. package/lib/typescript/components/helpers/PortalHost.d.ts +6 -0
  144. package/lib/typescript/components/helpers/PortalHost.d.ts.map +1 -0
  145. package/lib/typescript/components/helpers/PortalHost.web.d.ts +7 -0
  146. package/lib/typescript/components/helpers/PortalHost.web.d.ts.map +1 -0
  147. package/lib/typescript/components/list-group/ListGroup.d.ts +1 -1
  148. package/lib/typescript/components/list-group/ListGroupItemAction.d.ts +1 -1
  149. package/lib/typescript/components/list-group/ListGroupItemAction.d.ts.map +1 -1
  150. package/lib/typescript/components/modal/Modal.d.ts +1 -1
  151. package/lib/typescript/components/modal/Modal.d.ts.map +1 -1
  152. package/lib/typescript/components/modal/ModalContext.d.ts +1 -0
  153. package/lib/typescript/components/modal/ModalContext.d.ts.map +1 -1
  154. package/lib/typescript/components/modal/ModalTitle.d.ts.map +1 -1
  155. package/lib/typescript/components/modal/useModal.d.ts +2 -1
  156. package/lib/typescript/components/modal/useModal.d.ts.map +1 -1
  157. package/lib/typescript/components/nav/Nav.d.ts +1 -1
  158. package/lib/typescript/components/nav/NavLink.d.ts +1 -1
  159. package/lib/typescript/components/nav/NavLink.d.ts.map +1 -1
  160. package/lib/typescript/components/nav/useTabbable.d.ts.map +1 -1
  161. package/lib/typescript/components/navbar/Navbar.d.ts +2 -2
  162. package/lib/typescript/components/navbar/NavbarBrand.d.ts +1 -1
  163. package/lib/typescript/components/navbar/NavbarBrand.d.ts.map +1 -1
  164. package/lib/typescript/components/navbar/NavbarToggler.d.ts +1 -1
  165. package/lib/typescript/components/navbar/NavbarToggler.d.ts.map +1 -1
  166. package/lib/typescript/components/navbar/useNavbar.d.ts.map +1 -1
  167. package/lib/typescript/components/offcanvas/Offcanvas.d.ts +1 -4
  168. package/lib/typescript/components/offcanvas/Offcanvas.d.ts.map +1 -1
  169. package/lib/typescript/components/offcanvas/OffcanvasContext.d.ts +3 -1
  170. package/lib/typescript/components/offcanvas/OffcanvasContext.d.ts.map +1 -1
  171. package/lib/typescript/components/offcanvas/OffcanvasTitle.d.ts.map +1 -1
  172. package/lib/typescript/components/offcanvas/useOffcanvas.d.ts +3 -1
  173. package/lib/typescript/components/offcanvas/useOffcanvas.d.ts.map +1 -1
  174. package/lib/typescript/components/popover/Popover.d.ts +3 -4
  175. package/lib/typescript/components/popover/Popover.d.ts.map +1 -1
  176. package/lib/typescript/components/popover/PopoverArrow.d.ts.map +1 -1
  177. package/lib/typescript/components/popover/PopoverContext.d.ts +3 -4
  178. package/lib/typescript/components/popover/PopoverContext.d.ts.map +1 -1
  179. package/lib/typescript/components/popover/injectPopover.d.ts +5 -7
  180. package/lib/typescript/components/popover/injectPopover.d.ts.map +1 -1
  181. package/lib/typescript/components/tooltip/Tooltip.d.ts +3 -4
  182. package/lib/typescript/components/tooltip/Tooltip.d.ts.map +1 -1
  183. package/lib/typescript/components/tooltip/TooltipArrow.d.ts.map +1 -1
  184. package/lib/typescript/components/tooltip/TooltipContext.d.ts +3 -4
  185. package/lib/typescript/components/tooltip/TooltipContext.d.ts.map +1 -1
  186. package/lib/typescript/components/tooltip/injectTooltip.d.ts +5 -7
  187. package/lib/typescript/components/tooltip/injectTooltip.d.ts.map +1 -1
  188. package/lib/typescript/hooks/useBackgroundNative.d.ts.map +1 -1
  189. package/lib/typescript/hooks/useFocusRing.d.ts +3 -0
  190. package/lib/typescript/hooks/useFocusRing.d.ts.map +1 -0
  191. package/lib/typescript/hooks/useFocusRing.web.d.ts +3 -0
  192. package/lib/typescript/hooks/useFocusRing.web.d.ts.map +1 -0
  193. package/lib/typescript/hooks/useInteractionState.d.ts +7 -7
  194. package/lib/typescript/hooks/useInteractionState.d.ts.map +1 -1
  195. package/lib/typescript/hooks/useOverlay.d.ts +64 -0
  196. package/lib/typescript/hooks/useOverlay.d.ts.map +1 -0
  197. package/lib/typescript/hooks/useOverlay.web.d.ts +37 -0
  198. package/lib/typescript/hooks/useOverlay.web.d.ts.map +1 -0
  199. package/lib/typescript/hooks/useScrollbarEffects.d.ts.map +1 -1
  200. package/lib/typescript/hooks/useScrollbarEffects.web.d.ts +7 -0
  201. package/lib/typescript/hooks/useScrollbarEffects.web.d.ts.map +1 -0
  202. package/lib/typescript/index.d.ts +5 -4
  203. package/lib/typescript/index.d.ts.map +1 -1
  204. package/lib/typescript/style/StyleSheet.d.ts.map +1 -1
  205. package/lib/typescript/types.d.ts +12 -6
  206. package/lib/typescript/types.d.ts.map +1 -1
  207. package/lib/typescript/utils.d.ts +2 -3
  208. package/lib/typescript/utils.d.ts.map +1 -1
  209. package/package.json +92 -85
  210. package/src/Context.ts +37 -38
  211. package/src/Provider.tsx +61 -66
  212. package/src/components/Body.tsx +16 -1
  213. package/src/components/TextInput.tsx +66 -66
  214. package/src/components/buttons/Button.tsx +381 -379
  215. package/src/components/close/CloseButton.tsx +142 -138
  216. package/src/components/collapse/useCollapse.ts +25 -26
  217. package/src/components/dropdown/Dropdown.tsx +77 -80
  218. package/src/components/dropdown/DropdownContext.ts +14 -3
  219. package/src/components/dropdown/DropdownMenu.tsx +243 -284
  220. package/src/components/dropdown/useDismissDropdown.ts +30 -29
  221. package/src/components/dropdown/useDropdown.ts +55 -38
  222. package/src/components/dropdown/useToggleDropdown.ts +31 -32
  223. package/src/components/forms/FormCheckInput.tsx +268 -268
  224. package/src/components/forms/Input.tsx +220 -220
  225. package/src/components/forms/internals/PickerNative.tsx +9 -10
  226. package/src/components/helpers/BackdropHandler.tsx +5 -119
  227. package/src/components/helpers/BackdropHandler.web.tsx +6 -0
  228. package/src/components/helpers/Dialog.tsx +49 -0
  229. package/src/components/helpers/Dialog.web.tsx +145 -0
  230. package/src/components/helpers/Portal.tsx +10 -0
  231. package/src/components/helpers/Portal.web.tsx +22 -0
  232. package/src/components/helpers/PortalHost.tsx +7 -0
  233. package/src/components/helpers/PortalHost.web.tsx +14 -0
  234. package/src/components/modal/Modal.tsx +60 -48
  235. package/src/components/modal/ModalContext.ts +12 -11
  236. package/src/components/modal/ModalTitle.tsx +41 -31
  237. package/src/components/modal/useModal.ts +13 -25
  238. package/src/components/nav/useTabbable.ts +31 -32
  239. package/src/components/navbar/NavbarToggler.tsx +130 -130
  240. package/src/components/navbar/useNavbar.ts +30 -31
  241. package/src/components/offcanvas/Offcanvas.tsx +91 -92
  242. package/src/components/offcanvas/OffcanvasContext.ts +13 -11
  243. package/src/components/offcanvas/OffcanvasTitle.tsx +43 -33
  244. package/src/components/offcanvas/useOffcanvas.ts +12 -20
  245. package/src/components/pagination/PaginationItem.tsx +139 -139
  246. package/src/components/popover/Popover.tsx +87 -90
  247. package/src/components/popover/PopoverArrow.tsx +22 -6
  248. package/src/components/popover/PopoverContext.ts +13 -18
  249. package/src/components/popover/injectPopover.tsx +63 -55
  250. package/src/components/tooltip/Tooltip.tsx +79 -98
  251. package/src/components/tooltip/TooltipArrow.tsx +26 -8
  252. package/src/components/tooltip/TooltipContext.ts +13 -18
  253. package/src/components/tooltip/injectTooltip.tsx +62 -53
  254. package/src/hooks/useAction.ts +78 -78
  255. package/src/hooks/useBackgroundNative.tsx +6 -4
  256. package/src/hooks/useFocusRing.ts +13 -0
  257. package/src/hooks/useFocusRing.web.ts +3 -0
  258. package/src/hooks/useInteractionState.ts +75 -81
  259. package/src/hooks/useOverlay.ts +197 -0
  260. package/src/hooks/useOverlay.web.ts +190 -0
  261. package/src/hooks/useScrollbarEffects.ts +5 -83
  262. package/src/hooks/useScrollbarEffects.web.ts +83 -0
  263. package/src/index.ts +5 -5
  264. package/src/style/StyleSheet.ts +2 -5
  265. package/src/theme/variables.ts +1420 -1420
  266. package/src/types.ts +14 -14
  267. package/src/utils.ts +4 -22
  268. package/lib/module/components/SafeAreaView.js +0 -42
  269. package/lib/module/components/SafeAreaView.js.map +0 -1
  270. package/lib/module/components/helpers/Overlay.js +0 -50
  271. package/lib/module/components/helpers/Overlay.js.map +0 -1
  272. package/lib/module/hooks/useIdentifier.js +0 -14
  273. package/lib/module/hooks/useIdentifier.js.map +0 -1
  274. package/lib/module/hooks/useTrigger.js +0 -97
  275. package/lib/module/hooks/useTrigger.js.map +0 -1
  276. package/lib/typescript/components/SafeAreaView.d.ts +0 -12
  277. package/lib/typescript/components/SafeAreaView.d.ts.map +0 -1
  278. package/lib/typescript/components/helpers/Overlay.d.ts +0 -28
  279. package/lib/typescript/components/helpers/Overlay.d.ts.map +0 -1
  280. package/lib/typescript/hooks/useIdentifier.d.ts +0 -2
  281. package/lib/typescript/hooks/useIdentifier.d.ts.map +0 -1
  282. package/lib/typescript/hooks/useTrigger.d.ts +0 -33
  283. package/lib/typescript/hooks/useTrigger.d.ts.map +0 -1
  284. package/src/components/SafeAreaView.tsx +0 -64
  285. package/src/components/helpers/Overlay.tsx +0 -81
  286. package/src/hooks/useIdentifier.ts +0 -15
  287. package/src/hooks/useTrigger.ts +0 -141
@@ -1,284 +1,243 @@
1
- import React, { useContext, useRef } from 'react';
2
- import { Platform } from 'react-native';
3
- import { OverlayContainer } from '@react-native-aria/overlays';
4
- import StyleSheet from '../../style/StyleSheet';
5
- import css from '../../style/css';
6
- import Overlay from '../helpers/Overlay';
7
- import BackdropHandler from '../helpers/BackdropHandler';
8
- import View, { ViewProps, ViewRef } from '../View';
9
- import useMedia from '../../hooks/useMedia';
10
- import { GRID_BREAKPOINTS } from '../../theme/proxies';
11
- import { infix, next } from '../../theme/breakpoints';
12
- import { getStyles, each, concatRefs } from '../../utils';
13
- import { normalizeNumber } from '../../style/math';
14
- import useForcedContext from '../../hooks/useForcedContext';
15
- import NavbarContext from '../navbar/NavbarContext';
16
- import DropdownContext, { DropdownDirection } from './DropdownContext';
17
- import type { MediaHandler, Placement } from '../../types';
18
-
19
- type AlignmentBreakpoints = boolean | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
20
-
21
- export interface DropdownMenuProps extends ViewProps {
22
- start?: AlignmentBreakpoints;
23
- right?: AlignmentBreakpoints;
24
- end?: AlignmentBreakpoints;
25
- }
26
-
27
- const ALIGNMENT_BREAKPOINTS = [true, 'sm', 'md', 'lg', 'xl', 'xxl'];
28
-
29
- const styles = StyleSheet.create({
30
- '.dropdown-menu': css`
31
- position: absolute;
32
- z-index: $zindex-dropdown;
33
- // display: none; // none by default, but block on "open" of the menu
34
- min-width: $dropdown-min-width;
35
- padding: $dropdown-padding-y $dropdown-padding-x;
36
- margin: 0; // Override default margin of ul
37
- // list-style: none;
38
- background-color: $dropdown-bg;
39
- // background-clip: padding-box;
40
- border: $dropdown-border-width solid $dropdown-border-color;
41
- border-radius: $dropdown-border-radius;
42
- // @include box-shadow($dropdown-box-shadow);
43
- `,
44
- '.dropdown-menu[data-bs-popper]': css`
45
- top: 100%;
46
- left: 0;
47
- margin-top: $dropdown-spacer;
48
- `,
49
- ...each(GRID_BREAKPOINTS, (breakpoint) => ({
50
- [`.dropdown-menu${infix(breakpoint)}-start[data-bs-popper]`]: css`
51
- @include media-breakpoint-up(${breakpoint}) {
52
- right: auto;
53
- left: 0;
54
- }
55
- `,
56
- [`.dropdown-menu${infix(breakpoint)}-end[data-bs-popper]`]: css`
57
- @include media-breakpoint-up(${breakpoint}) {
58
- right: 0;
59
- left: auto;
60
- }
61
- `,
62
- })),
63
- '.dropup .dropdown-menu[data-bs-popper]': css`
64
- top: auto;
65
- bottom: 100%;
66
- margin-top: 0;
67
- margin-bottom: $dropdown-spacer;
68
- `,
69
- '.dropend .dropdown-menu[data-bs-popper]': css`
70
- top: 0;
71
- right: auto;
72
- left: 100%;
73
- margin-top: 0;
74
- margin-left: $dropdown-spacer;
75
- `,
76
- '.dropstart .dropdown-menu[data-bs-popper]': css`
77
- top: 0;
78
- right: 100%;
79
- left: auto;
80
- margin-top: 0;
81
- margin-right: $dropdown-spacer;
82
- `,
83
- '.navbar-nav .dropdown-menu': css`
84
- position: relative; // static;
85
- `,
86
- ...each(GRID_BREAKPOINTS, (breakpoint) => ({
87
- [`.navbar-expand${infix(next(breakpoint))} .navbar-nav .dropdown-menu`]: css`
88
- @include media-breakpoint-up(${next(breakpoint)}) {
89
- position: absolute;
90
- }
91
- `,
92
- })),
93
- '.dropdown-menu --text': css`
94
- font-size: $dropdown-font-size;
95
- color: $dropdown-color;
96
- text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
97
- `,
98
- });
99
-
100
- const getAlignment = (
101
- media: MediaHandler,
102
- start: AlignmentBreakpoints,
103
- end: AlignmentBreakpoints,
104
- ) => {
105
- const alignEnd = typeof end === 'boolean' ? end : media.up(end);
106
-
107
- if (!alignEnd) {
108
- return 'start';
109
- }
110
-
111
- const alignStart = typeof start === 'boolean' ? start : media.up(start);
112
-
113
- if (!alignStart) {
114
- return 'end';
115
- }
116
-
117
- const startIndex = ALIGNMENT_BREAKPOINTS.indexOf(start);
118
- const endIndex = ALIGNMENT_BREAKPOINTS.indexOf(end);
119
-
120
- return startIndex > endIndex ? 'start' : 'end';
121
- };
122
-
123
- const transformPlacement = (
124
- media: MediaHandler,
125
- direction: DropdownDirection,
126
- start: AlignmentBreakpoints,
127
- end: AlignmentBreakpoints,
128
- ): Placement => {
129
- if (direction === 'up') {
130
- return `top ${getAlignment(media, start, end)}`;
131
- }
132
-
133
- if (direction === 'down') {
134
- return `bottom ${getAlignment(media, start, end)}`;
135
- }
136
-
137
- return `${direction} top`;
138
- };
139
-
140
- const DropdownMenu = React.forwardRef<ViewRef, DropdownMenuProps>(
141
- (props, ref) => {
142
- const {
143
- children,
144
- start = true,
145
- right,
146
- end = false,
147
- style,
148
- textStyle,
149
- ...elementProps
150
- } = props;
151
-
152
- if (right !== undefined) {
153
- // eslint-disable-next-line no-console
154
- console.warn('Prop "right" is deprecated, please use "end" instead.');
155
- }
156
-
157
- const navbar = useContext(NavbarContext);
158
- const media = useMedia();
159
- const dialogRef = useRef(null);
160
-
161
- const dropdown = useForcedContext(DropdownContext);
162
-
163
- const {
164
- identifier,
165
- toggleRef,
166
- visible,
167
- setVisible,
168
- direction,
169
- display,
170
- autoClose,
171
- } = dropdown;
172
-
173
- if (!visible) {
174
- return null;
175
- }
176
-
177
- const isStatic = Platform.OS === 'web' && display === 'static';
178
- const isCollapsedNavbar =
179
- navbar &&
180
- !(navbar.expand && (navbar.expand === true || media.up(navbar.expand)));
181
- const hasStaticStyle = isStatic && !isCollapsedNavbar;
182
-
183
- const classes = getStyles(styles, [
184
- '.dropdown-menu',
185
- // Non-Popper styles
186
- hasStaticStyle && '.dropdown-menu[data-bs-popper]',
187
- hasStaticStyle &&
188
- start &&
189
- `.dropdown-menu${
190
- start === true ? '' : `-${start}`
191
- }-start[data-bs-popper]`,
192
- hasStaticStyle &&
193
- end &&
194
- `.dropdown-menu${end === true ? '' : `-${end}`}-end[data-bs-popper]`,
195
- hasStaticStyle &&
196
- direction === 'up' &&
197
- '.dropup .dropdown-menu[data-bs-popper]',
198
- hasStaticStyle &&
199
- direction === 'end' &&
200
- '.dropend .dropdown-menu[data-bs-popper]',
201
- hasStaticStyle &&
202
- direction === 'start' &&
203
- '.dropstart .dropdown-menu[data-bs-popper]',
204
- // Navbar styles
205
- navbar && '.navbar-nav .dropdown-menu',
206
- navbar &&
207
- navbar.expand &&
208
- `.navbar-expand${
209
- navbar.expand === true ? '' : `-${navbar.expand}`
210
- } .navbar-nav .dropdown-menu`,
211
- ]);
212
- const textClasses = getStyles(styles, ['.dropdown-menu --text']);
213
-
214
- if (isStatic || isCollapsedNavbar) {
215
- return (
216
- <>
217
- {!isCollapsedNavbar && (
218
- <BackdropHandler
219
- toggleRef={toggleRef}
220
- dialogRef={dialogRef}
221
- onClose={() => {
222
- setVisible(false);
223
- }}
224
- autoClose={autoClose}
225
- />
226
- )}
227
- <View
228
- {...elementProps}
229
- ref={concatRefs(dialogRef, ref)}
230
- aria-labelledby={identifier}
231
- style={[classes, style]}
232
- textStyle={[textClasses, textStyle]}
233
- >
234
- {children}
235
- </View>
236
- </>
237
- );
238
- }
239
-
240
- return (
241
- <OverlayContainer>
242
- <Overlay
243
- placement={transformPlacement(media, direction, start, end)}
244
- targetRef={toggleRef}
245
- offset={normalizeNumber(StyleSheet.value('dropdown-spacer'))}
246
- visible={visible}
247
- >
248
- {(overlay, overlayRef) => (
249
- <>
250
- <BackdropHandler
251
- toggleRef={toggleRef}
252
- dialogRef={overlayRef}
253
- onClose={() => {
254
- setVisible(false);
255
- }}
256
- autoClose={autoClose}
257
- />
258
- <View
259
- {...elementProps}
260
- ref={concatRefs(overlayRef, ref)}
261
- aria-labelledby={identifier}
262
- style={[
263
- classes,
264
- overlay.overlayProps.style,
265
- { maxHeight: 'auto', opacity: overlay.rendered ? 1 : 0 },
266
- style,
267
- ]}
268
- textStyle={[textClasses, textStyle]}
269
- >
270
- <DropdownContext.Provider value={dropdown}>
271
- {children}
272
- </DropdownContext.Provider>
273
- </View>
274
- </>
275
- )}
276
- </Overlay>
277
- </OverlayContainer>
278
- );
279
- },
280
- );
281
-
282
- DropdownMenu.displayName = 'DropdownMenu';
283
-
284
- export default DropdownMenu;
1
+ import React, { useContext, useLayoutEffect } from 'react';
2
+ import { Platform } from 'react-native';
3
+ import StyleSheet from '../../style/StyleSheet';
4
+ import css from '../../style/css';
5
+ import Portal from '../helpers/Portal';
6
+ import BackdropHandler from '../helpers/BackdropHandler';
7
+ import View, { ViewProps, ViewRef } from '../View';
8
+ import useMedia from '../../hooks/useMedia';
9
+ import { GRID_BREAKPOINTS } from '../../theme/proxies';
10
+ import { infix, next } from '../../theme/breakpoints';
11
+ import { getStyles, each, concatRefs } from '../../utils';
12
+ import useForcedContext from '../../hooks/useForcedContext';
13
+ import NavbarContext from '../navbar/NavbarContext';
14
+ import DropdownContext from './DropdownContext';
15
+ import type { MediaHandler } from '../../types';
16
+
17
+ type AlignmentBreakpoints = boolean | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
18
+
19
+ export interface DropdownMenuProps extends ViewProps {
20
+ start?: AlignmentBreakpoints;
21
+ end?: AlignmentBreakpoints;
22
+ }
23
+
24
+ const ALIGNMENT_BREAKPOINTS = [true, 'sm', 'md', 'lg', 'xl', 'xxl'];
25
+
26
+ const styles = StyleSheet.create({
27
+ '.dropdown-menu': css`
28
+ position: absolute;
29
+ // z-index: $zindex-dropdown;
30
+ // display: none; // none by default, but block on "open" of the menu
31
+ min-width: $dropdown-min-width;
32
+ padding: $dropdown-padding-y $dropdown-padding-x;
33
+ margin: 0; // Override default margin of ul
34
+ // list-style: none;
35
+ background-color: $dropdown-bg;
36
+ // background-clip: padding-box;
37
+ border: $dropdown-border-width solid $dropdown-border-color;
38
+ border-radius: $dropdown-border-radius;
39
+ // @include box-shadow($dropdown-box-shadow);
40
+ `,
41
+ '.dropdown-menu[data-bs-popper]': css`
42
+ top: 100%;
43
+ left: 0;
44
+ margin-top: $dropdown-spacer;
45
+ `,
46
+ ...each(GRID_BREAKPOINTS, (breakpoint) => ({
47
+ [`.dropdown-menu${infix(breakpoint)}-start[data-bs-popper]`]: css`
48
+ @include media-breakpoint-up(${breakpoint}) {
49
+ right: auto;
50
+ left: 0;
51
+ }
52
+ `,
53
+ [`.dropdown-menu${infix(breakpoint)}-end[data-bs-popper]`]: css`
54
+ @include media-breakpoint-up(${breakpoint}) {
55
+ right: 0;
56
+ left: auto;
57
+ }
58
+ `,
59
+ })),
60
+ '.dropup .dropdown-menu[data-bs-popper]': css`
61
+ top: auto;
62
+ bottom: 100%;
63
+ margin-top: 0;
64
+ margin-bottom: $dropdown-spacer;
65
+ `,
66
+ '.dropend .dropdown-menu[data-bs-popper]': css`
67
+ top: 0;
68
+ right: auto;
69
+ left: 100%;
70
+ margin-top: 0;
71
+ margin-left: $dropdown-spacer;
72
+ `,
73
+ '.dropstart .dropdown-menu[data-bs-popper]': css`
74
+ top: 0;
75
+ right: 100%;
76
+ left: auto;
77
+ margin-top: 0;
78
+ margin-right: $dropdown-spacer;
79
+ `,
80
+ '.navbar-nav .dropdown-menu': css`
81
+ position: relative; // static;
82
+ `,
83
+ ...each(GRID_BREAKPOINTS, (breakpoint) => ({
84
+ [`.navbar-expand${infix(next(breakpoint))} .navbar-nav .dropdown-menu`]: css`
85
+ @include media-breakpoint-up(${next(breakpoint)}) {
86
+ position: absolute;
87
+ }
88
+ `,
89
+ })),
90
+ '.dropdown-menu --text': css`
91
+ font-size: $dropdown-font-size;
92
+ color: $dropdown-color;
93
+ text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
94
+ `,
95
+ });
96
+
97
+ const getAlign = (
98
+ media: MediaHandler,
99
+ start: AlignmentBreakpoints,
100
+ end: AlignmentBreakpoints,
101
+ ) => {
102
+ const alignEnd = typeof end === 'boolean' ? end : media.up(end);
103
+
104
+ if (!alignEnd) {
105
+ return 'start';
106
+ }
107
+
108
+ const alignStart = typeof start === 'boolean' ? start : media.up(start);
109
+
110
+ if (!alignStart) {
111
+ return 'end';
112
+ }
113
+
114
+ const startIndex = ALIGNMENT_BREAKPOINTS.indexOf(start);
115
+ const endIndex = ALIGNMENT_BREAKPOINTS.indexOf(end);
116
+
117
+ return startIndex > endIndex ? 'start' : 'end';
118
+ };
119
+
120
+ const DropdownMenu = React.forwardRef<ViewRef, DropdownMenuProps>(
121
+ (props, ref) => {
122
+ const {
123
+ children,
124
+ start = true,
125
+ end = false,
126
+ style,
127
+ textStyle,
128
+ ...elementProps
129
+ } = props;
130
+
131
+ const navbar = useContext(NavbarContext);
132
+ const media = useMedia();
133
+
134
+ const dropdown = useForcedContext(DropdownContext);
135
+
136
+ const {
137
+ identifier,
138
+ visible,
139
+ setVisible,
140
+ setAlign,
141
+ direction,
142
+ display,
143
+ content,
144
+ } = dropdown;
145
+
146
+ // Workaround for setting start / end on DropdownMenu and not on Dropdown.
147
+ const align = getAlign(media, start, end);
148
+
149
+ useLayoutEffect(() => {
150
+ setAlign(align);
151
+ }, [align]);
152
+
153
+ if (!visible || !align) {
154
+ return null;
155
+ }
156
+
157
+ const isStatic = Platform.OS === 'web' && display === 'static';
158
+ const isCollapsedNavbar =
159
+ navbar &&
160
+ !(navbar.expand && (navbar.expand === true || media.up(navbar.expand)));
161
+ const hasStaticStyle = isStatic && !isCollapsedNavbar;
162
+
163
+ const classes = getStyles(styles, [
164
+ '.dropdown-menu',
165
+ // Non-Popper styles
166
+ hasStaticStyle && '.dropdown-menu[data-bs-popper]',
167
+ hasStaticStyle &&
168
+ start &&
169
+ `.dropdown-menu${
170
+ start === true ? '' : `-${start}`
171
+ }-start[data-bs-popper]`,
172
+ hasStaticStyle &&
173
+ end &&
174
+ `.dropdown-menu${end === true ? '' : `-${end}`}-end[data-bs-popper]`,
175
+ hasStaticStyle &&
176
+ direction === 'up' &&
177
+ '.dropup .dropdown-menu[data-bs-popper]',
178
+ hasStaticStyle &&
179
+ direction === 'end' &&
180
+ '.dropend .dropdown-menu[data-bs-popper]',
181
+ hasStaticStyle &&
182
+ direction === 'start' &&
183
+ '.dropstart .dropdown-menu[data-bs-popper]',
184
+ // Navbar styles
185
+ navbar && '.navbar-nav .dropdown-menu',
186
+ navbar &&
187
+ navbar.expand &&
188
+ `.navbar-expand${
189
+ navbar.expand === true ? '' : `-${navbar.expand}`
190
+ } .navbar-nav .dropdown-menu`,
191
+ ]);
192
+ const textClasses = getStyles(styles, ['.dropdown-menu --text']);
193
+
194
+ if (isStatic || isCollapsedNavbar) {
195
+ return (
196
+ <>
197
+ {!isCollapsedNavbar && (
198
+ <BackdropHandler
199
+ onClose={() => {
200
+ setVisible(false);
201
+ }}
202
+ />
203
+ )}
204
+ <View
205
+ {...elementProps}
206
+ ref={concatRefs(content.ref, ref)}
207
+ aria-labelledby={identifier}
208
+ style={[classes, style]}
209
+ textStyle={[textClasses, textStyle]}
210
+ >
211
+ {children}
212
+ </View>
213
+ </>
214
+ );
215
+ }
216
+
217
+ return (
218
+ <Portal name={identifier}>
219
+ <BackdropHandler
220
+ onClose={() => {
221
+ setVisible(false);
222
+ }}
223
+ />
224
+ <View
225
+ {...elementProps}
226
+ {...content.getProps(elementProps)}
227
+ ref={concatRefs(ref, content.ref)}
228
+ aria-labelledby={identifier}
229
+ style={[classes, content.style, style]}
230
+ textStyle={[textClasses, textStyle]}
231
+ >
232
+ <DropdownContext.Provider value={dropdown}>
233
+ {children}
234
+ </DropdownContext.Provider>
235
+ </View>
236
+ </Portal>
237
+ );
238
+ },
239
+ );
240
+
241
+ DropdownMenu.displayName = 'DropdownMenu';
242
+
243
+ export default DropdownMenu;
@@ -1,29 +1,30 @@
1
- import { useCallback } from 'react';
2
- import type { GestureResponderEvent } from 'react-native';
3
- import useForcedContext from '../../hooks/useForcedContext';
4
- import DropdownContext from './DropdownContext';
5
-
6
- export interface UseDismissDropdownProps {
7
- onPress?: null | ((event: GestureResponderEvent) => void);
8
- }
9
-
10
- export default function useDismissDropdown<T>(
11
- props: UseDismissDropdownProps & T,
12
- ) {
13
- const context = useForcedContext(DropdownContext);
14
-
15
- const handlePress = useCallback(
16
- (event: GestureResponderEvent) => {
17
- if (props.onPress) props.onPress(event);
18
- context.setVisible(false);
19
- },
20
- [context, props.onPress],
21
- );
22
-
23
- const { ...restProps } = props;
24
-
25
- return {
26
- ...restProps,
27
- onPress: handlePress,
28
- };
29
- }
1
+ import { useCallback } from 'react';
2
+ import type { GestureResponderEvent } from 'react-native';
3
+ import useForcedContext from '../../hooks/useForcedContext';
4
+ import DropdownContext from './DropdownContext';
5
+
6
+ export interface UseDismissDropdownProps {
7
+ onPress?: null | ((event: GestureResponderEvent) => void);
8
+ }
9
+
10
+ export default function useDismissDropdown<T>(
11
+ props: UseDismissDropdownProps & T,
12
+ ) {
13
+ const context = useForcedContext(DropdownContext);
14
+
15
+ const { onPress, ...restProps } = props;
16
+
17
+ const handlePress = useCallback(
18
+ (event: GestureResponderEvent) => {
19
+ context.setVisible(false);
20
+
21
+ onPress?.(event);
22
+ },
23
+ [context, onPress],
24
+ );
25
+
26
+ return {
27
+ ...restProps,
28
+ onPress: handlePress,
29
+ };
30
+ }