orn-ui 0.1.0 → 0.2.0

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 (307) hide show
  1. package/README.md +9 -2
  2. package/lib/commonjs/atoms/Avatar.js +1 -1
  3. package/lib/commonjs/atoms/Avatar.js.map +1 -1
  4. package/lib/commonjs/atoms/Badge.js +10 -8
  5. package/lib/commonjs/atoms/Badge.js.map +1 -1
  6. package/lib/commonjs/atoms/Button.js +8 -6
  7. package/lib/commonjs/atoms/Button.js.map +1 -1
  8. package/lib/commonjs/atoms/Checkbox.js +4 -1
  9. package/lib/commonjs/atoms/Checkbox.js.map +1 -1
  10. package/lib/commonjs/atoms/Fab.js +1 -1
  11. package/lib/commonjs/atoms/Fab.js.map +1 -1
  12. package/lib/commonjs/atoms/Image.js +2 -2
  13. package/lib/commonjs/atoms/Image.js.map +1 -1
  14. package/lib/commonjs/atoms/Input.js +2 -2
  15. package/lib/commonjs/atoms/Input.js.map +1 -1
  16. package/lib/commonjs/atoms/PressableScale.js +9 -10
  17. package/lib/commonjs/atoms/PressableScale.js.map +1 -1
  18. package/lib/commonjs/atoms/Skeleton.js +96 -0
  19. package/lib/commonjs/atoms/Skeleton.js.map +1 -0
  20. package/lib/commonjs/atoms/Transition.js +171 -0
  21. package/lib/commonjs/atoms/Transition.js.map +1 -0
  22. package/lib/commonjs/atoms/index.js +20 -0
  23. package/lib/commonjs/atoms/index.js.map +1 -1
  24. package/lib/commonjs/molecules/AvatarHeader.js +2 -2
  25. package/lib/commonjs/molecules/AvatarHeader.js.map +1 -1
  26. package/lib/commonjs/molecules/OptionCard.js +57 -24
  27. package/lib/commonjs/molecules/OptionCard.js.map +1 -1
  28. package/lib/commonjs/molecules/{ThemeToggle.js → SegmentedControl.js} +37 -37
  29. package/lib/commonjs/molecules/SegmentedControl.js.map +1 -0
  30. package/lib/commonjs/molecules/Stepper.js +124 -47
  31. package/lib/commonjs/molecules/Stepper.js.map +1 -1
  32. package/lib/commonjs/molecules/Steps.js +2 -2
  33. package/lib/commonjs/molecules/Steps.js.map +1 -1
  34. package/lib/commonjs/molecules/index.js +9 -3
  35. package/lib/commonjs/molecules/index.js.map +1 -1
  36. package/lib/commonjs/organisms/Alert.js +6 -5
  37. package/lib/commonjs/organisms/Alert.js.map +1 -1
  38. package/lib/commonjs/organisms/AlertProvider.js +26 -0
  39. package/lib/commonjs/organisms/AlertProvider.js.map +1 -1
  40. package/lib/commonjs/organisms/BottomSheet.js +118 -39
  41. package/lib/commonjs/organisms/BottomSheet.js.map +1 -1
  42. package/lib/commonjs/organisms/DateField.js +2 -2
  43. package/lib/commonjs/organisms/DateField.js.map +1 -1
  44. package/lib/commonjs/organisms/DatePicker.js +3 -3
  45. package/lib/commonjs/organisms/DatePicker.js.map +1 -1
  46. package/lib/commonjs/organisms/List.js +66 -44
  47. package/lib/commonjs/organisms/List.js.map +1 -1
  48. package/lib/commonjs/organisms/Modal.js +42 -87
  49. package/lib/commonjs/organisms/Modal.js.map +1 -1
  50. package/lib/commonjs/organisms/NavigationBar.js +205 -0
  51. package/lib/commonjs/organisms/NavigationBar.js.map +1 -0
  52. package/lib/commonjs/organisms/Screen.js +9 -2
  53. package/lib/commonjs/organisms/Screen.js.map +1 -1
  54. package/lib/commonjs/organisms/SearchList.js +99 -30
  55. package/lib/commonjs/organisms/SearchList.js.map +1 -1
  56. package/lib/commonjs/organisms/Select.js +226 -54
  57. package/lib/commonjs/organisms/Select.js.map +1 -1
  58. package/lib/commonjs/organisms/ThemeToggle.js +52 -0
  59. package/lib/commonjs/organisms/ThemeToggle.js.map +1 -0
  60. package/lib/commonjs/organisms/Toast.js +20 -25
  61. package/lib/commonjs/organisms/Toast.js.map +1 -1
  62. package/lib/commonjs/organisms/ToastProvider.js +24 -0
  63. package/lib/commonjs/organisms/ToastProvider.js.map +1 -1
  64. package/lib/commonjs/organisms/Wizard.js +22 -2
  65. package/lib/commonjs/organisms/Wizard.js.map +1 -1
  66. package/lib/commonjs/organisms/imperativeBridge.js +28 -0
  67. package/lib/commonjs/organisms/imperativeBridge.js.map +1 -0
  68. package/lib/commonjs/organisms/index.js +50 -0
  69. package/lib/commonjs/organisms/index.js.map +1 -1
  70. package/lib/commonjs/safe-area/SafeAreaUIProvider.js +65 -0
  71. package/lib/commonjs/safe-area/SafeAreaUIProvider.js.map +1 -0
  72. package/lib/commonjs/safe-area/index.js +13 -0
  73. package/lib/commonjs/safe-area/index.js.map +1 -0
  74. package/lib/commonjs/theme/UIProvider.js +11 -0
  75. package/lib/commonjs/theme/UIProvider.js.map +1 -1
  76. package/lib/commonjs/theme/colors.js +207 -0
  77. package/lib/commonjs/theme/colors.js.map +1 -0
  78. package/lib/commonjs/theme/createTheme.js +25 -2
  79. package/lib/commonjs/theme/createTheme.js.map +1 -1
  80. package/lib/commonjs/theme/index.js +25 -0
  81. package/lib/commonjs/theme/index.js.map +1 -1
  82. package/lib/commonjs/theme/palettes.js +73 -11
  83. package/lib/commonjs/theme/palettes.js.map +1 -1
  84. package/lib/module/atoms/Avatar.js +1 -1
  85. package/lib/module/atoms/Avatar.js.map +1 -1
  86. package/lib/module/atoms/Badge.js +10 -8
  87. package/lib/module/atoms/Badge.js.map +1 -1
  88. package/lib/module/atoms/Button.js +8 -6
  89. package/lib/module/atoms/Button.js.map +1 -1
  90. package/lib/module/atoms/Checkbox.js +4 -1
  91. package/lib/module/atoms/Checkbox.js.map +1 -1
  92. package/lib/module/atoms/Fab.js +1 -1
  93. package/lib/module/atoms/Fab.js.map +1 -1
  94. package/lib/module/atoms/Image.js +2 -2
  95. package/lib/module/atoms/Image.js.map +1 -1
  96. package/lib/module/atoms/Input.js +2 -2
  97. package/lib/module/atoms/Input.js.map +1 -1
  98. package/lib/module/atoms/PressableScale.js +9 -10
  99. package/lib/module/atoms/PressableScale.js.map +1 -1
  100. package/lib/module/atoms/Skeleton.js +91 -0
  101. package/lib/module/atoms/Skeleton.js.map +1 -0
  102. package/lib/module/atoms/Transition.js +165 -0
  103. package/lib/module/atoms/Transition.js.map +1 -0
  104. package/lib/module/atoms/index.js +2 -0
  105. package/lib/module/atoms/index.js.map +1 -1
  106. package/lib/module/molecules/AvatarHeader.js +2 -2
  107. package/lib/module/molecules/AvatarHeader.js.map +1 -1
  108. package/lib/module/molecules/OptionCard.js +58 -25
  109. package/lib/module/molecules/OptionCard.js.map +1 -1
  110. package/lib/module/molecules/{ThemeToggle.js → SegmentedControl.js} +37 -37
  111. package/lib/module/molecules/SegmentedControl.js.map +1 -0
  112. package/lib/module/molecules/Stepper.js +125 -49
  113. package/lib/module/molecules/Stepper.js.map +1 -1
  114. package/lib/module/molecules/Steps.js +2 -2
  115. package/lib/module/molecules/Steps.js.map +1 -1
  116. package/lib/module/molecules/index.js +2 -2
  117. package/lib/module/molecules/index.js.map +1 -1
  118. package/lib/module/organisms/Alert.js +6 -5
  119. package/lib/module/organisms/Alert.js.map +1 -1
  120. package/lib/module/organisms/AlertProvider.js +24 -1
  121. package/lib/module/organisms/AlertProvider.js.map +1 -1
  122. package/lib/module/organisms/BottomSheet.js +120 -41
  123. package/lib/module/organisms/BottomSheet.js.map +1 -1
  124. package/lib/module/organisms/DateField.js +2 -2
  125. package/lib/module/organisms/DateField.js.map +1 -1
  126. package/lib/module/organisms/DatePicker.js +3 -3
  127. package/lib/module/organisms/DatePicker.js.map +1 -1
  128. package/lib/module/organisms/List.js +68 -46
  129. package/lib/module/organisms/List.js.map +1 -1
  130. package/lib/module/organisms/Modal.js +44 -89
  131. package/lib/module/organisms/Modal.js.map +1 -1
  132. package/lib/module/organisms/NavigationBar.js +200 -0
  133. package/lib/module/organisms/NavigationBar.js.map +1 -0
  134. package/lib/module/organisms/Screen.js +9 -2
  135. package/lib/module/organisms/Screen.js.map +1 -1
  136. package/lib/module/organisms/SearchList.js +100 -31
  137. package/lib/module/organisms/SearchList.js.map +1 -1
  138. package/lib/module/organisms/Select.js +228 -56
  139. package/lib/module/organisms/Select.js.map +1 -1
  140. package/lib/module/organisms/ThemeToggle.js +47 -0
  141. package/lib/module/organisms/ThemeToggle.js.map +1 -0
  142. package/lib/module/organisms/Toast.js +22 -27
  143. package/lib/module/organisms/Toast.js.map +1 -1
  144. package/lib/module/organisms/ToastProvider.js +21 -0
  145. package/lib/module/organisms/ToastProvider.js.map +1 -1
  146. package/lib/module/organisms/Wizard.js +23 -3
  147. package/lib/module/organisms/Wizard.js.map +1 -1
  148. package/lib/module/organisms/imperativeBridge.js +24 -0
  149. package/lib/module/organisms/imperativeBridge.js.map +1 -0
  150. package/lib/module/organisms/index.js +4 -2
  151. package/lib/module/organisms/index.js.map +1 -1
  152. package/lib/module/safe-area/SafeAreaUIProvider.js +60 -0
  153. package/lib/module/safe-area/SafeAreaUIProvider.js.map +1 -0
  154. package/lib/module/safe-area/index.js +4 -0
  155. package/lib/module/safe-area/index.js.map +1 -0
  156. package/lib/module/theme/UIProvider.js +11 -0
  157. package/lib/module/theme/UIProvider.js.map +1 -1
  158. package/lib/module/theme/colors.js +194 -0
  159. package/lib/module/theme/colors.js.map +1 -0
  160. package/lib/module/theme/createTheme.js +25 -2
  161. package/lib/module/theme/createTheme.js.map +1 -1
  162. package/lib/module/theme/index.js +1 -0
  163. package/lib/module/theme/index.js.map +1 -1
  164. package/lib/module/theme/palettes.js +73 -11
  165. package/lib/module/theme/palettes.js.map +1 -1
  166. package/lib/typescript/atoms/Badge.d.ts.map +1 -1
  167. package/lib/typescript/atoms/Button.d.ts.map +1 -1
  168. package/lib/typescript/atoms/Checkbox.d.ts.map +1 -1
  169. package/lib/typescript/atoms/PressableScale.d.ts +3 -2
  170. package/lib/typescript/atoms/PressableScale.d.ts.map +1 -1
  171. package/lib/typescript/atoms/Skeleton.d.ts +29 -0
  172. package/lib/typescript/atoms/Skeleton.d.ts.map +1 -0
  173. package/lib/typescript/atoms/Transition.d.ts +51 -0
  174. package/lib/typescript/atoms/Transition.d.ts.map +1 -0
  175. package/lib/typescript/atoms/index.d.ts +4 -0
  176. package/lib/typescript/atoms/index.d.ts.map +1 -1
  177. package/lib/typescript/molecules/OptionCard.d.ts +11 -6
  178. package/lib/typescript/molecules/OptionCard.d.ts.map +1 -1
  179. package/lib/typescript/molecules/SegmentedControl.d.ts +24 -0
  180. package/lib/typescript/molecules/SegmentedControl.d.ts.map +1 -0
  181. package/lib/typescript/molecules/Stepper.d.ts +35 -3
  182. package/lib/typescript/molecules/Stepper.d.ts.map +1 -1
  183. package/lib/typescript/molecules/index.d.ts +4 -4
  184. package/lib/typescript/molecules/index.d.ts.map +1 -1
  185. package/lib/typescript/organisms/Alert.d.ts.map +1 -1
  186. package/lib/typescript/organisms/AlertProvider.d.ts +9 -0
  187. package/lib/typescript/organisms/AlertProvider.d.ts.map +1 -1
  188. package/lib/typescript/organisms/BottomSheet.d.ts +26 -4
  189. package/lib/typescript/organisms/BottomSheet.d.ts.map +1 -1
  190. package/lib/typescript/organisms/List.d.ts +9 -2
  191. package/lib/typescript/organisms/List.d.ts.map +1 -1
  192. package/lib/typescript/organisms/Modal.d.ts +3 -5
  193. package/lib/typescript/organisms/Modal.d.ts.map +1 -1
  194. package/lib/typescript/organisms/NavigationBar.d.ts +32 -0
  195. package/lib/typescript/organisms/NavigationBar.d.ts.map +1 -0
  196. package/lib/typescript/organisms/Screen.d.ts +2 -1
  197. package/lib/typescript/organisms/Screen.d.ts.map +1 -1
  198. package/lib/typescript/organisms/SearchList.d.ts +21 -5
  199. package/lib/typescript/organisms/SearchList.d.ts.map +1 -1
  200. package/lib/typescript/organisms/Select.d.ts +19 -4
  201. package/lib/typescript/organisms/Select.d.ts.map +1 -1
  202. package/lib/typescript/{molecules → organisms}/ThemeToggle.d.ts +4 -4
  203. package/lib/typescript/organisms/ThemeToggle.d.ts.map +1 -0
  204. package/lib/typescript/organisms/Toast.d.ts.map +1 -1
  205. package/lib/typescript/organisms/ToastProvider.d.ts +8 -0
  206. package/lib/typescript/organisms/ToastProvider.d.ts.map +1 -1
  207. package/lib/typescript/organisms/Wizard.d.ts +7 -1
  208. package/lib/typescript/organisms/Wizard.d.ts.map +1 -1
  209. package/lib/typescript/organisms/imperativeBridge.d.ts +12 -0
  210. package/lib/typescript/organisms/imperativeBridge.d.ts.map +1 -0
  211. package/lib/typescript/organisms/index.d.ts +7 -3
  212. package/lib/typescript/organisms/index.d.ts.map +1 -1
  213. package/lib/typescript/safe-area/SafeAreaUIProvider.d.ts +46 -0
  214. package/lib/typescript/safe-area/SafeAreaUIProvider.d.ts.map +1 -0
  215. package/lib/typescript/safe-area/index.d.ts +3 -0
  216. package/lib/typescript/safe-area/index.d.ts.map +1 -0
  217. package/lib/typescript/theme/UIProvider.d.ts.map +1 -1
  218. package/lib/typescript/theme/colors.d.ts +44 -0
  219. package/lib/typescript/theme/colors.d.ts.map +1 -0
  220. package/lib/typescript/theme/createTheme.d.ts +3 -0
  221. package/lib/typescript/theme/createTheme.d.ts.map +1 -1
  222. package/lib/typescript/theme/index.d.ts +3 -1
  223. package/lib/typescript/theme/index.d.ts.map +1 -1
  224. package/lib/typescript/theme/palettes.d.ts +41 -3
  225. package/lib/typescript/theme/palettes.d.ts.map +1 -1
  226. package/lib/typescript/theme/types.d.ts +9 -0
  227. package/lib/typescript/theme/types.d.ts.map +1 -1
  228. package/package.json +101 -18
  229. package/registry/alert-provider.json +9 -2
  230. package/registry/alert.json +1 -1
  231. package/registry/avatar-header.json +1 -1
  232. package/registry/avatar.json +1 -1
  233. package/registry/badge.json +1 -1
  234. package/registry/bottom-sheet.json +6 -2
  235. package/registry/button.json +1 -1
  236. package/registry/checkbox.json +1 -1
  237. package/registry/core.json +9 -5
  238. package/registry/date-field.json +2 -1
  239. package/registry/date-picker.json +1 -1
  240. package/registry/fab.json +1 -1
  241. package/registry/image.json +1 -1
  242. package/registry/index.json +108 -39
  243. package/registry/input.json +1 -1
  244. package/registry/list.json +2 -1
  245. package/registry/manifest.json +44 -6
  246. package/registry/modal.json +3 -2
  247. package/registry/navigation-bar.json +18 -0
  248. package/registry/option-card.json +3 -2
  249. package/registry/pressable-scale.json +1 -1
  250. package/registry/screen.json +1 -1
  251. package/registry/search-list.json +2 -1
  252. package/registry/segmented-control.json +18 -0
  253. package/registry/select.json +1 -1
  254. package/registry/skeleton.json +18 -0
  255. package/registry/stepper.json +3 -2
  256. package/registry/steps.json +1 -1
  257. package/registry/theme-toggle.json +5 -4
  258. package/registry/toast-provider.json +11 -3
  259. package/registry/toast.json +3 -2
  260. package/registry/transition.json +19 -0
  261. package/registry/wizard.json +3 -2
  262. package/src/atoms/Avatar.tsx +1 -1
  263. package/src/atoms/Badge.tsx +6 -4
  264. package/src/atoms/Button.tsx +8 -6
  265. package/src/atoms/Checkbox.tsx +4 -1
  266. package/src/atoms/Fab.tsx +1 -1
  267. package/src/atoms/Image.tsx +2 -2
  268. package/src/atoms/Input.tsx +2 -2
  269. package/src/atoms/PressableScale.tsx +16 -6
  270. package/src/atoms/Skeleton.tsx +114 -0
  271. package/src/atoms/Transition.tsx +189 -0
  272. package/src/atoms/index.ts +4 -0
  273. package/src/molecules/AvatarHeader.tsx +2 -2
  274. package/src/molecules/OptionCard.tsx +64 -27
  275. package/src/molecules/SegmentedControl.tsx +84 -0
  276. package/src/molecules/Stepper.tsx +147 -32
  277. package/src/molecules/Steps.tsx +2 -2
  278. package/src/molecules/index.ts +4 -4
  279. package/src/organisms/Alert.tsx +6 -5
  280. package/src/organisms/AlertProvider.tsx +26 -1
  281. package/src/organisms/BottomSheet.tsx +214 -62
  282. package/src/organisms/DateField.tsx +2 -2
  283. package/src/organisms/DatePicker.tsx +3 -3
  284. package/src/organisms/List.tsx +73 -41
  285. package/src/organisms/Modal.tsx +49 -61
  286. package/src/organisms/NavigationBar.tsx +223 -0
  287. package/src/organisms/Screen.tsx +11 -3
  288. package/src/organisms/SearchList.tsx +134 -38
  289. package/src/organisms/Select.tsx +227 -49
  290. package/src/organisms/ThemeToggle.tsx +30 -0
  291. package/src/organisms/Toast.tsx +19 -24
  292. package/src/organisms/ToastProvider.tsx +24 -0
  293. package/src/organisms/Wizard.tsx +36 -3
  294. package/src/organisms/imperativeBridge.ts +28 -0
  295. package/src/organisms/index.ts +7 -3
  296. package/src/safe-area/SafeAreaUIProvider.tsx +67 -0
  297. package/src/safe-area/index.ts +2 -0
  298. package/src/theme/UIProvider.tsx +15 -0
  299. package/src/theme/colors.ts +175 -0
  300. package/src/theme/createTheme.ts +38 -4
  301. package/src/theme/index.ts +3 -1
  302. package/src/theme/palettes.ts +108 -11
  303. package/src/theme/types.ts +10 -0
  304. package/lib/commonjs/molecules/ThemeToggle.js.map +0 -1
  305. package/lib/module/molecules/ThemeToggle.js.map +0 -1
  306. package/lib/typescript/molecules/ThemeToggle.d.ts.map +0 -1
  307. package/src/molecules/ThemeToggle.tsx +0 -67
@@ -4,19 +4,21 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.SearchList = SearchList;
7
- var _react = _interopRequireDefault(require("react"));
7
+ var _react = _interopRequireWildcard(require("react"));
8
8
  var _reactNative = require("react-native");
9
9
  var _createStyles = require("../theme/createStyles");
10
10
  var _UIProvider = require("../theme/UIProvider");
11
11
  var _Input = require("../atoms/Input");
12
12
  var _EmptyState = require("../atoms/EmptyState");
13
+ var _Skeleton = require("../atoms/Skeleton");
13
14
  var _Spinner = require("../atoms/Spinner");
14
15
  var _IconButton = require("../atoms/IconButton");
15
16
  var _jsxRuntime = require("react/jsx-runtime");
16
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
17
18
  const useStyles = (0, _createStyles.createStyles)(theme => ({
18
19
  container: {
19
- flex: 1
20
+ flex: 1,
21
+ backgroundColor: theme.colors.background
20
22
  },
21
23
  searchRow: {
22
24
  flexDirection: 'row',
@@ -47,7 +49,7 @@ const useStyles = (0, _createStyles.createStyles)(theme => ({
47
49
  left: 0,
48
50
  right: 0,
49
51
  bottom: 0,
50
- backgroundColor: theme.colors.surface + 'B3',
52
+ backgroundColor: theme.colors.scrim,
51
53
  zIndex: 10,
52
54
  justifyContent: 'center',
53
55
  alignItems: 'center'
@@ -60,6 +62,16 @@ const useStyles = (0, _createStyles.createStyles)(theme => ({
60
62
  footerText: {
61
63
  color: theme.colors.textLight,
62
64
  fontSize: theme.tokens.fontSize.md
65
+ },
66
+ skeletonRow: {
67
+ flexDirection: 'row',
68
+ alignItems: 'center',
69
+ gap: theme.tokens.spacing.md,
70
+ padding: theme.tokens.spacing.md
71
+ },
72
+ skeletonText: {
73
+ flex: 1,
74
+ gap: theme.tokens.spacing.sm
63
75
  }
64
76
  }));
65
77
 
@@ -83,16 +95,26 @@ function SearchList({
83
95
  renderItem,
84
96
  isLoading = false,
85
97
  loadingMode = 'replace',
86
- loadingText,
87
- onLoadMore,
98
+ isRefreshing = false,
88
99
  isLoadingMore = false,
100
+ isReady = true,
101
+ loadingText,
89
102
  loadingMoreText,
90
103
  hasMore = false,
91
104
  noMoreText,
105
+ skeletonCount = 6,
106
+ renderSkeletonItem,
107
+ onLoadMore,
108
+ onEndReached,
109
+ onEndReachedThreshold = 0.3,
110
+ onRefresh,
92
111
  emptyTitle,
93
112
  emptyDescription,
94
113
  emptyIconName,
114
+ ListHeaderComponent,
115
+ ListFooterComponent,
95
116
  contentContainerStyle,
117
+ containerStyle,
96
118
  ListComponent = _reactNative.FlatList,
97
119
  listProps
98
120
  }) {
@@ -102,32 +124,54 @@ function SearchList({
102
124
  const resolvedSearchPlaceholder = searchPlaceholder ?? labels.search;
103
125
  const resolvedLoadingText = loadingText ?? labels.loading;
104
126
  const resolvedLoadingMoreText = loadingMoreText ?? labels.loadingMore;
105
- const renderFooter = () => {
106
- if (isLoadingMore) {
107
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
127
+ const handleEndReached = onLoadMore ?? onEndReached;
128
+
129
+ // El footer propio y el loader de paginación conviven: antes el primero
130
+ // tapaba al segundo y la lista dejaba de avisar que estaba trayendo más.
131
+ const renderFooter = (0, _react.useCallback)(() => {
132
+ const custom = typeof ListFooterComponent === 'function' ? /*#__PURE__*/(0, _jsxRuntime.jsx)(ListFooterComponent, {}) : ListFooterComponent ?? null;
133
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
134
+ children: [custom, isLoadingMore && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
108
135
  style: styles.footer,
109
136
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Spinner.Spinner, {
110
137
  text: resolvedLoadingMoreText,
111
138
  fullscreen: false
112
139
  })
113
- });
114
- }
115
- if (noMoreText && !hasMore && data.length > 0) {
116
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
140
+ }), noMoreText && !hasMore && data.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
117
141
  style: styles.footer,
118
142
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
119
143
  style: styles.footerText,
120
144
  children: noMoreText
121
145
  })
122
- });
123
- }
124
- return null;
125
- };
126
- const showReplaceLoading = isLoading && loadingMode === 'replace' && data.length === 0;
146
+ })]
147
+ });
148
+ }, [ListFooterComponent, isLoadingMore, resolvedLoadingMoreText, noMoreText, hasMore, data.length, styles.footer, styles.footerText]);
149
+
150
+ // Vacío sólo cuando ya se sabe que no hay nada: durante la carga inicial se
151
+ // muestran placeholders, no "sin resultados".
152
+ const renderEmpty = (0, _react.useCallback)(() => {
153
+ if (isLoading || isRefreshing) return null;
154
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_EmptyState.EmptyState, {
155
+ title: emptyTitle,
156
+ description: emptyDescription,
157
+ iconName: emptyIconName,
158
+ style: {
159
+ marginTop: 50
160
+ }
161
+ });
162
+ }, [isLoading, isRefreshing, emptyTitle, emptyDescription, emptyIconName]);
163
+ if (!isReady) {
164
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
165
+ style: [styles.container, containerStyle],
166
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Spinner.Spinner, {
167
+ text: resolvedLoadingText
168
+ })
169
+ });
170
+ }
171
+ const isInitialLoading = isLoading && loadingMode === 'replace' && data.length === 0;
127
172
  const showOverlayLoading = isLoading && loadingMode === 'overlay' && data.length === 0;
128
- const showEmpty = !isLoading && data.length === 0;
129
173
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
130
- style: styles.container,
174
+ style: [styles.container, containerStyle],
131
175
  children: [header, /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
132
176
  style: styles.searchRow,
133
177
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Input.Input, {
@@ -142,7 +186,7 @@ function SearchList({
142
186
  }), onScanPress && /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.IconButton, {
143
187
  iconName: "search",
144
188
  onPress: onScanPress,
145
- color: colors.white,
189
+ color: colors.onPrimary,
146
190
  style: styles.scanButton,
147
191
  accessibilityLabel: scanAccessibilityLabel
148
192
  }), extraActions]
@@ -157,21 +201,46 @@ function SearchList({
157
201
  style: styles.footerText,
158
202
  children: resolvedLoadingText
159
203
  })]
160
- }), showReplaceLoading ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Spinner.Spinner, {
161
- text: resolvedLoadingText
162
- }) : showEmpty ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_EmptyState.EmptyState, {
163
- title: emptyTitle,
164
- description: emptyDescription,
165
- iconName: emptyIconName
204
+ }), isInitialLoading ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
205
+ testID: "list-skeleton",
206
+ style: [styles.listContent, contentContainerStyle],
207
+ children: Array.from({
208
+ length: skeletonCount
209
+ }, (_, i) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_react.default.Fragment, {
210
+ children: renderSkeletonItem?.() ?? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
211
+ style: styles.skeletonRow,
212
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Skeleton.Skeleton, {
213
+ variant: "circle",
214
+ width: 40
215
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
216
+ style: styles.skeletonText,
217
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Skeleton.Skeleton, {
218
+ width: "60%",
219
+ height: 14
220
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Skeleton.Skeleton, {
221
+ width: "35%",
222
+ height: 12
223
+ })]
224
+ })]
225
+ })
226
+ }, i))
166
227
  }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(ListComponent, {
167
228
  data: data,
168
229
  keyExtractor: keyExtractor,
169
230
  keyboardDismissMode: "on-drag",
170
- contentContainerStyle: contentContainerStyle ?? styles.listContent,
171
- onEndReached: onLoadMore,
172
- onEndReachedThreshold: 0.2,
231
+ contentContainerStyle: [styles.listContent, contentContainerStyle],
232
+ onEndReached: handleEndReached,
233
+ onEndReachedThreshold: onEndReachedThreshold,
234
+ ListHeaderComponent: ListHeaderComponent,
173
235
  ListFooterComponent: renderFooter,
236
+ ListEmptyComponent: renderEmpty,
174
237
  renderItem: renderItem,
238
+ refreshControl: onRefresh ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.RefreshControl, {
239
+ refreshing: isRefreshing,
240
+ onRefresh: onRefresh,
241
+ colors: [colors.primary],
242
+ tintColor: colors.primary
243
+ }) : undefined,
175
244
  ...listProps
176
245
  })]
177
246
  })]
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_createStyles","_UIProvider","_Input","_EmptyState","_Spinner","_IconButton","_jsxRuntime","e","__esModule","default","useStyles","createStyles","theme","container","flex","searchRow","flexDirection","alignItems","marginBottom","tokens","spacing","lg","gap","sm","searchInput","scanButton","backgroundColor","colors","primary","width","height","borderRadius","radius","shadow","listArea","listContent","paddingBottom","xl","loadingOverlay","position","top","left","right","bottom","surface","zIndex","justifyContent","footer","paddingVertical","md","footerText","color","textLight","fontSize","SearchList","header","searchValue","onSearchChange","searchPlaceholder","searchIsLoading","onScanPress","scanAccessibilityLabel","extraActions","data","keyExtractor","renderItem","isLoading","loadingMode","loadingText","onLoadMore","isLoadingMore","loadingMoreText","hasMore","noMoreText","emptyTitle","emptyDescription","emptyIconName","contentContainerStyle","ListComponent","FlatList","listProps","useColors","styles","labels","useLabels","resolvedSearchPlaceholder","search","resolvedLoadingText","loading","resolvedLoadingMoreText","loadingMore","renderFooter","jsx","View","style","children","Spinner","text","fullscreen","length","Text","showReplaceLoading","showOverlayLoading","showEmpty","jsxs","Input","placeholder","leftIconName","value","onChangeText","rightIconName","undefined","onRightIconPress","containerStyle","IconButton","iconName","onPress","white","accessibilityLabel","ActivityIndicator","size","EmptyState","title","description","keyboardDismissMode","onEndReached","onEndReachedThreshold","ListFooterComponent"],"sourceRoot":"../../../src","sources":["organisms/SearchList.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_createStyles","_UIProvider","_Input","_EmptyState","_Skeleton","_Spinner","_IconButton","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","useStyles","createStyles","theme","container","flex","backgroundColor","colors","background","searchRow","flexDirection","alignItems","marginBottom","tokens","spacing","lg","gap","sm","searchInput","scanButton","primary","width","height","borderRadius","radius","shadow","listArea","listContent","paddingBottom","xl","loadingOverlay","position","top","left","right","bottom","scrim","zIndex","justifyContent","footer","paddingVertical","md","footerText","color","textLight","fontSize","skeletonRow","padding","skeletonText","SearchList","header","searchValue","onSearchChange","searchPlaceholder","searchIsLoading","onScanPress","scanAccessibilityLabel","extraActions","data","keyExtractor","renderItem","isLoading","loadingMode","isRefreshing","isLoadingMore","isReady","loadingText","loadingMoreText","hasMore","noMoreText","skeletonCount","renderSkeletonItem","onLoadMore","onEndReached","onEndReachedThreshold","onRefresh","emptyTitle","emptyDescription","emptyIconName","ListHeaderComponent","ListFooterComponent","contentContainerStyle","containerStyle","ListComponent","FlatList","listProps","useColors","styles","labels","useLabels","resolvedSearchPlaceholder","search","resolvedLoadingText","loading","resolvedLoadingMoreText","loadingMore","handleEndReached","renderFooter","useCallback","custom","jsx","jsxs","Fragment","children","View","style","Spinner","text","fullscreen","length","Text","renderEmpty","EmptyState","title","description","iconName","marginTop","isInitialLoading","showOverlayLoading","Input","placeholder","leftIconName","value","onChangeText","rightIconName","undefined","onRightIconPress","IconButton","onPress","onPrimary","accessibilityLabel","ActivityIndicator","size","testID","Array","from","_","Skeleton","variant","keyboardDismissMode","ListEmptyComponent","refreshControl","RefreshControl","refreshing","tintColor"],"sourceRoot":"../../../src","sources":["organisms/SearchList.tsx"],"mappings":"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","ignoreList":[]}
@@ -11,21 +11,21 @@ var _UIProvider = require("../theme/UIProvider");
11
11
  var _Icon = require("../icons/Icon");
12
12
  var _jsxRuntime = require("react/jsx-runtime");
13
13
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
14
+ /** Aire entre el campo y el desplegable. */
15
+ const GAP = 8;
16
+ /** Por debajo de esto el desplegable no muestra ni dos filas. */
17
+ const MIN_HEIGHT = 120;
14
18
  const useStyles = (0, _createStyles.createStyles)(theme => ({
15
19
  container: {
16
20
  gap: theme.tokens.spacing.sm
17
21
  },
18
- containerOpen: {
19
- zIndex: 20,
20
- elevation: 20
21
- },
22
22
  label: {
23
23
  fontWeight: theme.tokens.fontWeight.bold,
24
24
  fontSize: theme.tokens.fontSize.md,
25
25
  color: theme.colors.text
26
26
  },
27
27
  required: {
28
- color: theme.colors.error
28
+ color: theme.colors.errorText
29
29
  },
30
30
  field: {
31
31
  flexDirection: 'row',
@@ -38,28 +38,46 @@ const useStyles = (0, _createStyles.createStyles)(theme => ({
38
38
  minHeight: 50,
39
39
  paddingHorizontal: theme.tokens.spacing.lg
40
40
  },
41
+ fieldOpen: {
42
+ borderColor: theme.colors.primary
43
+ },
44
+ fieldDisabled: {
45
+ opacity: 0.5
46
+ },
47
+ fieldValue: {
48
+ flexDirection: 'row',
49
+ alignItems: 'center',
50
+ gap: theme.tokens.spacing.sm,
51
+ flexShrink: 1
52
+ },
41
53
  fieldText: {
42
54
  fontSize: theme.tokens.fontSize.lg,
43
- color: theme.colors.text
55
+ color: theme.colors.text,
56
+ flexShrink: 1
44
57
  },
45
58
  fieldPlaceholder: {
46
59
  color: theme.colors.textLight
47
60
  },
48
- optionsList: {
61
+ backdrop: {
62
+ flex: 1
63
+ },
64
+ sheet: {
49
65
  position: 'absolute',
50
- top: '100%',
51
- left: 0,
52
- right: 0,
53
- marginTop: theme.tokens.spacing.sm,
54
66
  borderWidth: 2,
55
67
  borderColor: theme.colors.border,
56
68
  borderRadius: theme.tokens.radius.lg,
57
69
  backgroundColor: theme.colors.surface,
58
70
  overflow: 'hidden',
59
- zIndex: 20,
60
- elevation: 20,
61
71
  ...theme.tokens.shadow.md
62
72
  },
73
+ search: {
74
+ fontSize: theme.tokens.fontSize.md,
75
+ color: theme.colors.text,
76
+ paddingHorizontal: theme.tokens.spacing.lg,
77
+ paddingVertical: theme.tokens.spacing.md,
78
+ borderBottomWidth: 1,
79
+ borderBottomColor: theme.colors.border
80
+ },
63
81
  optionRow: {
64
82
  flexDirection: 'row',
65
83
  alignItems: 'center',
@@ -73,7 +91,16 @@ const useStyles = (0, _createStyles.createStyles)(theme => ({
73
91
  borderBottomWidth: 0
74
92
  },
75
93
  optionRowSelected: {
76
- backgroundColor: theme.colors.primary + '15'
94
+ backgroundColor: theme.colors.primarySoft
95
+ },
96
+ optionRowDisabled: {
97
+ opacity: 0.4
98
+ },
99
+ optionLabel: {
100
+ flexDirection: 'row',
101
+ alignItems: 'center',
102
+ gap: theme.tokens.spacing.sm,
103
+ flexShrink: 1
77
104
  },
78
105
  optionText: {
79
106
  fontSize: theme.tokens.fontSize.lg - 1,
@@ -81,19 +108,28 @@ const useStyles = (0, _createStyles.createStyles)(theme => ({
81
108
  },
82
109
  optionTextSelected: {
83
110
  fontWeight: theme.tokens.fontWeight.semibold,
84
- color: theme.colors.primary
111
+ color: theme.colors.primaryText
112
+ },
113
+ emoji: {
114
+ fontSize: theme.tokens.fontSize.lg
115
+ },
116
+ empty: {
117
+ padding: theme.tokens.spacing.lg,
118
+ textAlign: 'center',
119
+ color: theme.colors.textLight,
120
+ fontSize: theme.tokens.fontSize.md
85
121
  },
86
122
  errorText: {
87
123
  fontSize: theme.tokens.fontSize.sm,
88
- color: theme.colors.error
124
+ color: theme.colors.errorText
89
125
  }
90
126
  }));
91
-
92
127
  /**
93
128
  * Select
94
- * Dropdown que expande la lista de opciones flotando sobre el resto del
95
- * contenido (position: absolute), en vez de empujarlo hacia abajo o abrir
96
- * un picker nativo del sistema.
129
+ * Dropdown de una sola opción. La lista se mide contra la ventana y se dibuja
130
+ * dentro de un Modal, no en el árbol del campo: así ningún `overflow: hidden`
131
+ * la recorta, no depende del zIndex (poco confiable en Android) y el fondo del
132
+ * Modal resuelve cerrar tocando afuera y con el botón atrás.
97
133
  */
98
134
  function Select({
99
135
  label,
@@ -104,16 +140,105 @@ function Select({
104
140
  placeholder,
105
141
  error,
106
142
  isLoading = false,
107
- containerStyle
143
+ disabled = false,
144
+ searchable = false,
145
+ searchPlaceholder,
146
+ maxHeight = 280,
147
+ onOpenChange,
148
+ containerStyle,
149
+ testID
108
150
  }) {
109
151
  const colors = (0, _UIProvider.useColors)();
110
152
  const styles = useStyles();
111
153
  const labels = (0, _UIProvider.useLabels)();
112
154
  const allowFontScaling = (0, _UIProvider.useAllowFontScaling)();
155
+ const {
156
+ height: windowHeight
157
+ } = (0, _reactNative.useWindowDimensions)();
158
+ const fieldRef = (0, _react.useRef)(null);
113
159
  const [open, setOpen] = (0, _react.useState)(false);
160
+ const [anchor, setAnchor] = (0, _react.useState)(null);
161
+ const [query, setQuery] = (0, _react.useState)('');
162
+ const [keyboardHeight, setKeyboardHeight] = (0, _react.useState)(0);
163
+ const isDisabled = disabled || isLoading;
114
164
  const selectedOption = options.find(o => o.value === selectedValue);
165
+ const close = (0, _react.useCallback)(() => {
166
+ setOpen(false);
167
+ setAnchor(null);
168
+ setQuery('');
169
+ onOpenChange?.(false);
170
+ }, [onOpenChange]);
171
+
172
+ // Abrir no espera a la medición: si `measureInWindow` no responde, la lista
173
+ // igual aparece (centrada) en vez de que el campo deje de funcionar.
174
+ const openList = () => {
175
+ fieldRef.current?.measureInWindow((x, y, width, height) => setAnchor({
176
+ x,
177
+ y,
178
+ width,
179
+ height
180
+ }));
181
+ setOpen(true);
182
+ onOpenChange?.(true);
183
+ };
184
+
185
+ // El buscador abre el teclado encima del desplegable: sin descontarlo, la
186
+ // lista se dibuja donde ya no se ve.
187
+ (0, _react.useEffect)(() => {
188
+ if (!open) return;
189
+ setKeyboardHeight(_reactNative.Keyboard.metrics()?.height ?? 0);
190
+ const [show, hide] = _reactNative.Platform.OS === 'ios' ? ['keyboardWillShow', 'keyboardWillHide'] : ['keyboardDidShow', 'keyboardDidHide'];
191
+ const subs = [_reactNative.Keyboard.addListener(show, e => setKeyboardHeight(e.endCoordinates.height)), _reactNative.Keyboard.addListener(hide, () => setKeyboardHeight(0))];
192
+ return () => subs.forEach(sub => sub.remove());
193
+ }, [open]);
194
+ const visibleOptions = (0, _react.useMemo)(() => {
195
+ if (!searchable || query.trim() === '') return options;
196
+ const needle = query.trim().toLowerCase();
197
+ return options.filter(option => option.label.toLowerCase().includes(needle));
198
+ }, [options, query, searchable]);
199
+
200
+ // Se abre hacia donde haya más aire: contra el borde inferior de la pantalla,
201
+ // hacia arriba es la única forma de que entre.
202
+ const placement = (0, _react.useMemo)(() => {
203
+ if (!anchor) return {
204
+ left: GAP * 2,
205
+ right: GAP * 2,
206
+ top: windowHeight * 0.25,
207
+ maxHeight
208
+ };
209
+ const usableHeight = windowHeight - keyboardHeight;
210
+ const below = usableHeight - (anchor.y + anchor.height) - GAP * 2;
211
+ const above = anchor.y - GAP * 2;
212
+ const downwards = below >= Math.min(maxHeight, above);
213
+ return {
214
+ left: anchor.x,
215
+ width: anchor.width,
216
+ maxHeight: Math.max(Math.min(maxHeight, downwards ? below : above), MIN_HEIGHT),
217
+ ...(downwards ? {
218
+ top: anchor.y + anchor.height + GAP
219
+ } : {
220
+ bottom: windowHeight - anchor.y + GAP
221
+ })
222
+ };
223
+ }, [anchor, keyboardHeight, maxHeight, windowHeight]);
224
+ const renderLeading = (option, color) => {
225
+ if (!option) return null;
226
+ if (option.emoji) {
227
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
228
+ allowFontScaling: allowFontScaling,
229
+ style: styles.emoji,
230
+ children: option.emoji
231
+ });
232
+ }
233
+ return option.iconName ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.Icon, {
234
+ name: option.iconName,
235
+ size: 20,
236
+ color: color
237
+ }) : null;
238
+ };
115
239
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
116
- style: [styles.container, open && styles.containerOpen, containerStyle],
240
+ style: [styles.container, containerStyle],
241
+ testID: testID,
117
242
  children: [label && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
118
243
  allowFontScaling: allowFontScaling,
119
244
  style: styles.label,
@@ -122,19 +247,27 @@ function Select({
122
247
  children: " *"
123
248
  })]
124
249
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Pressable, {
125
- style: styles.field,
126
- onPress: () => !isLoading && setOpen(o => !o),
127
- disabled: isLoading,
128
- accessibilityRole: "button",
250
+ ref: fieldRef,
251
+ style: [styles.field, open && styles.fieldOpen, isDisabled && styles.fieldDisabled],
252
+ onPress: openList,
253
+ disabled: isDisabled,
254
+ accessibilityRole: "combobox",
129
255
  accessibilityLabel: label ?? placeholder ?? labels.selectPlaceholder,
256
+ accessibilityValue: {
257
+ text: selectedOption?.label ?? ''
258
+ },
130
259
  accessibilityState: {
131
260
  expanded: open,
132
- disabled: isLoading
261
+ disabled: isDisabled
133
262
  },
134
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
135
- allowFontScaling: allowFontScaling,
136
- style: [styles.fieldText, !selectedOption && styles.fieldPlaceholder],
137
- children: selectedOption?.label || placeholder || labels.selectPlaceholder
263
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
264
+ style: styles.fieldValue,
265
+ children: [renderLeading(selectedOption, colors.textLight), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
266
+ allowFontScaling: allowFontScaling,
267
+ numberOfLines: 1,
268
+ style: [styles.fieldText, !selectedOption && styles.fieldPlaceholder],
269
+ children: selectedOption?.label || placeholder || labels.selectPlaceholder
270
+ })]
138
271
  }), isLoading ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, {
139
272
  size: "small",
140
273
  color: colors.primary
@@ -143,31 +276,70 @@ function Select({
143
276
  size: 20,
144
277
  color: colors.textLight
145
278
  })]
146
- }), open && !isLoading && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
147
- style: styles.optionsList,
148
- children: options.map((option, index) => {
149
- const isSelected = option.value === selectedValue;
150
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Pressable, {
151
- style: [styles.optionRow, index === options.length - 1 && styles.optionRowLast, isSelected && styles.optionRowSelected],
152
- onPress: () => {
153
- onSelect(option.value);
154
- setOpen(false);
155
- },
156
- accessibilityRole: "menuitem",
157
- accessibilityState: {
158
- selected: isSelected
159
- },
160
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
279
+ }), open && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Modal, {
280
+ visible: true,
281
+ transparent: true,
282
+ animationType: "fade",
283
+ statusBarTranslucent: true,
284
+ onRequestClose: close,
285
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
286
+ style: styles.backdrop,
287
+ onPress: close,
288
+ testID: "select-backdrop"
289
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
290
+ style: [styles.sheet, placement],
291
+ accessibilityRole: "radiogroup",
292
+ testID: "select-list",
293
+ children: [searchable && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TextInput, {
294
+ allowFontScaling: allowFontScaling,
295
+ style: styles.search,
296
+ value: query,
297
+ onChangeText: setQuery,
298
+ placeholder: searchPlaceholder ?? labels.search,
299
+ placeholderTextColor: colors.textLight,
300
+ autoFocus: true,
301
+ accessibilityLabel: searchPlaceholder ?? labels.search
302
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.ScrollView, {
303
+ keyboardShouldPersistTaps: "handled",
304
+ showsVerticalScrollIndicator: false,
305
+ bounces: false,
306
+ children: [visibleOptions.map((option, index) => {
307
+ const isSelected = option.value === selectedValue;
308
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Pressable, {
309
+ style: [styles.optionRow, index === visibleOptions.length - 1 && styles.optionRowLast, isSelected && styles.optionRowSelected, option.disabled && styles.optionRowDisabled],
310
+ onPress: () => {
311
+ onSelect(option.value);
312
+ close();
313
+ },
314
+ disabled: option.disabled,
315
+ accessibilityRole: "radio",
316
+ accessibilityLabel: option.label,
317
+ accessibilityState: {
318
+ selected: isSelected,
319
+ checked: isSelected,
320
+ disabled: !!option.disabled
321
+ },
322
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
323
+ style: styles.optionLabel,
324
+ children: [renderLeading(option, isSelected ? colors.primary : colors.textLight), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
325
+ allowFontScaling: allowFontScaling,
326
+ numberOfLines: 1,
327
+ style: [styles.optionText, isSelected && styles.optionTextSelected],
328
+ children: option.label
329
+ })]
330
+ }), isSelected && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.Icon, {
331
+ name: "check",
332
+ size: 18,
333
+ color: colors.primary
334
+ })]
335
+ }, String(option.value));
336
+ }), visibleOptions.length === 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
161
337
  allowFontScaling: allowFontScaling,
162
- style: [styles.optionText, isSelected && styles.optionTextSelected],
163
- children: option.label
164
- }), isSelected && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.Icon, {
165
- name: "check",
166
- size: 18,
167
- color: colors.primary
338
+ style: styles.empty,
339
+ children: labels.noResultsTitle
168
340
  })]
169
- }, String(option.value));
170
- })
341
+ })]
342
+ })]
171
343
  }), !!error && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
172
344
  allowFontScaling: allowFontScaling,
173
345
  style: styles.errorText,