@sincpro/mobile-ui 0.7.2 → 1.1.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 (313) hide show
  1. package/README.md +575 -230
  2. package/dist/Actions/Actions.Button.d.ts +98 -93
  3. package/dist/Actions/Actions.Button.js +58 -52
  4. package/dist/Actions/Actions.FAB.d.ts +3 -1
  5. package/dist/Actions/Actions.FAB.js +12 -8
  6. package/dist/Actions/Actions.FilterButton.d.ts +10 -2
  7. package/dist/Actions/Actions.FilterButton.js +23 -8
  8. package/dist/Actions/Actions.IconButton.d.ts +36 -33
  9. package/dist/Actions/Actions.IconButton.js +10 -6
  10. package/dist/Actions/index.d.ts +12 -12
  11. package/dist/Actions/index.js +6 -6
  12. package/dist/Dialog/BottomSheet/BottomSheet.Root.js +1 -1
  13. package/dist/Dialog/BottomSheet/index.d.ts +1 -1
  14. package/dist/Dialog/BottomSheet/index.js +1 -1
  15. package/dist/Dialog/Confirmation.context.js +3 -3
  16. package/dist/Dialog/Dialog.ActionSheet.d.ts +2 -1
  17. package/dist/Dialog/Dialog.ActionSheet.js +19 -9
  18. package/dist/Dialog/Dialog.Confirmation.js +7 -7
  19. package/dist/Dialog/Dialog.EditValue.js +4 -4
  20. package/dist/Dialog/Dialog.NativeSheet.d.ts +10 -0
  21. package/dist/Dialog/Dialog.NativeSheet.js +21 -0
  22. package/dist/Dialog/Dialog.Sheet.d.ts +5 -1
  23. package/dist/Dialog/Dialog.Sheet.js +19 -11
  24. package/dist/Dialog/index.d.ts +5 -5
  25. package/dist/Dialog/index.js +5 -5
  26. package/dist/Display/Display.Accordion.js +5 -5
  27. package/dist/Display/Display.Avatar.d.ts +30 -30
  28. package/dist/Display/Display.Avatar.js +2 -2
  29. package/dist/Display/Display.AvatarGroup.js +3 -3
  30. package/dist/Display/Display.Badge.d.ts +3 -3
  31. package/dist/Display/Display.Badge.js +1 -1
  32. package/dist/Display/Display.Card.d.ts +15 -15
  33. package/dist/Display/Display.Card.js +4 -4
  34. package/dist/Display/Display.Carousel.js +2 -2
  35. package/dist/Display/Display.Chip.d.ts +3 -3
  36. package/dist/Display/Display.Chip.js +12 -12
  37. package/dist/Display/Display.CircleButton.d.ts +1 -1
  38. package/dist/Display/Display.CircleButton.js +3 -3
  39. package/dist/Display/Display.CopyableText.d.ts +9 -2
  40. package/dist/Display/Display.CopyableText.js +76 -8
  41. package/dist/Display/Display.CountRecords.js +2 -2
  42. package/dist/Display/Display.DataTable.js +2 -2
  43. package/dist/Display/Display.Date.d.ts +1 -1
  44. package/dist/Display/Display.Date.js +5 -5
  45. package/dist/Display/Display.Divider.d.ts +24 -24
  46. package/dist/Display/Display.Divider.js +1 -1
  47. package/dist/Display/Display.GradientSurface.d.ts +58 -39
  48. package/dist/Display/Display.GradientSurface.js +31 -15
  49. package/dist/Display/Display.Icon.d.ts +1 -1
  50. package/dist/Display/Display.Icon.js +2 -1
  51. package/dist/Display/Display.IconBadge.js +3 -3
  52. package/dist/Display/Display.Image.js +4 -4
  53. package/dist/Display/Display.KeyValue.d.ts +11 -4
  54. package/dist/Display/Display.KeyValue.js +8 -6
  55. package/dist/Display/Display.ListGroup.d.ts +23 -0
  56. package/dist/Display/Display.ListGroup.js +17 -0
  57. package/dist/Display/Display.ListItem.d.ts +16 -2
  58. package/dist/Display/Display.ListItem.js +29 -12
  59. package/dist/Display/Display.Logo.d.ts +3 -3
  60. package/dist/Display/Display.Logo.js +2 -2
  61. package/dist/Display/Display.MediaCard.js +4 -4
  62. package/dist/Display/Display.MediaEmbed.js +7 -7
  63. package/dist/Display/Display.MenuButton.d.ts +4 -4
  64. package/dist/Display/Display.MenuButton.js +6 -6
  65. package/dist/Display/Display.MenuCard.d.ts +1 -1
  66. package/dist/Display/Display.MenuCard.js +3 -3
  67. package/dist/Display/Display.MenuGrid.d.ts +1 -1
  68. package/dist/Display/Display.MenuGrid.js +1 -1
  69. package/dist/Display/Display.Monetary.d.ts +1 -1
  70. package/dist/Display/Display.Monetary.js +2 -2
  71. package/dist/Display/Display.Pattern.d.ts +33 -12
  72. package/dist/Display/Display.Pattern.js +60 -14
  73. package/dist/Display/Display.PriceTag.js +2 -2
  74. package/dist/Display/Display.ProductCard.js +7 -7
  75. package/dist/Display/Display.Rating.js +3 -3
  76. package/dist/Display/Display.SearchHistory.js +6 -6
  77. package/dist/Display/Display.SectionHeader.d.ts +11 -1
  78. package/dist/Display/Display.SectionHeader.js +14 -5
  79. package/dist/Display/Display.Stat.js +2 -2
  80. package/dist/Display/Display.StatCard.js +4 -4
  81. package/dist/Display/Display.StatusDot.js +3 -3
  82. package/dist/Display/Display.Story.js +3 -3
  83. package/dist/Display/Display.StoryTray.js +5 -5
  84. package/dist/Display/Display.StoryViewer.js +4 -4
  85. package/dist/Display/Display.SwipeableRow.d.ts +3 -1
  86. package/dist/Display/Display.SwipeableRow.js +7 -7
  87. package/dist/Display/Display.Tag.js +2 -2
  88. package/dist/Display/Display.Timeline.js +4 -4
  89. package/dist/Display/Display.Tooltip.js +3 -3
  90. package/dist/Display/index.d.ts +49 -45
  91. package/dist/Display/index.js +44 -42
  92. package/dist/Feedback/ErrorBoundary.d.ts +1 -1
  93. package/dist/Feedback/ErrorBoundary.js +1 -1
  94. package/dist/Feedback/Feedback.Banner.d.ts +3 -3
  95. package/dist/Feedback/Feedback.Banner.js +6 -6
  96. package/dist/Feedback/Feedback.DomainSplashScreen.js +5 -4
  97. package/dist/Feedback/Feedback.Empty.js +3 -3
  98. package/dist/Feedback/Feedback.EmptyState.d.ts +2 -1
  99. package/dist/Feedback/Feedback.EmptyState.js +7 -7
  100. package/dist/Feedback/Feedback.Error.d.ts +3 -1
  101. package/dist/Feedback/Feedback.Error.js +7 -6
  102. package/dist/Feedback/Feedback.Loading.d.ts +1 -1
  103. package/dist/Feedback/Feedback.Loading.js +2 -2
  104. package/dist/Feedback/Feedback.PermissionCard.js +5 -5
  105. package/dist/Feedback/Feedback.Progress.js +2 -2
  106. package/dist/Feedback/Feedback.ProgressCircle.js +1 -1
  107. package/dist/Feedback/Feedback.Skeleton.js +2 -2
  108. package/dist/Feedback/Feedback.Spinner.js +3 -3
  109. package/dist/Feedback/Feedback.Splash.d.ts +1 -1
  110. package/dist/Feedback/Feedback.Splash.js +7 -6
  111. package/dist/Feedback/Toast.context.js +7 -7
  112. package/dist/Feedback/index.d.ts +13 -13
  113. package/dist/Feedback/index.js +13 -13
  114. package/dist/Form/Form.Button.d.ts +2 -2
  115. package/dist/Form/Form.Button.js +1 -1
  116. package/dist/Form/Form.Checkbox.d.ts +4 -1
  117. package/dist/Form/Form.Checkbox.js +5 -5
  118. package/dist/Form/Form.ControlledCheckbox.js +1 -1
  119. package/dist/Form/Form.ControlledInput.js +1 -1
  120. package/dist/Form/Form.ControlledMonetaryInput.js +1 -1
  121. package/dist/Form/Form.ControlledRadioButton.js +1 -1
  122. package/dist/Form/Form.DatePicker.d.ts +2 -1
  123. package/dist/Form/Form.DatePicker.js +8 -7
  124. package/dist/Form/Form.Dropdown.js +7 -7
  125. package/dist/Form/Form.FAB.d.ts +2 -2
  126. package/dist/Form/Form.FAB.js +1 -1
  127. package/dist/Form/Form.FilterButton.d.ts +2 -2
  128. package/dist/Form/Form.FilterButton.js +1 -1
  129. package/dist/Form/Form.FractionalQuantityInput.js +4 -4
  130. package/dist/Form/Form.IconButton.d.ts +2 -2
  131. package/dist/Form/Form.IconButton.js +1 -1
  132. package/dist/Form/Form.Input.d.ts +5 -3
  133. package/dist/Form/Form.Input.js +5 -5
  134. package/dist/Form/Form.InputField.d.ts +1 -1
  135. package/dist/Form/Form.InputField.js +3 -3
  136. package/dist/Form/Form.KeyboardForm.d.ts +11 -0
  137. package/dist/Form/Form.KeyboardForm.js +9 -0
  138. package/dist/Form/Form.KeyboardToolbar.d.ts +21 -0
  139. package/dist/Form/Form.KeyboardToolbar.js +70 -0
  140. package/dist/Form/Form.MonetaryInput.js +5 -4
  141. package/dist/Form/Form.PasswordInput.d.ts +1 -1
  142. package/dist/Form/Form.PasswordInput.js +3 -3
  143. package/dist/Form/Form.PinInput.js +5 -5
  144. package/dist/Form/Form.QuantitySelector.js +3 -3
  145. package/dist/Form/Form.RadioButton.js +4 -4
  146. package/dist/Form/Form.SearchBar.js +4 -4
  147. package/dist/Form/Form.Select.d.ts +3 -1
  148. package/dist/Form/Form.Select.js +27 -14
  149. package/dist/Form/Form.Slider.js +3 -3
  150. package/dist/Form/Form.Switch.js +4 -4
  151. package/dist/Form/Form.TextInput.js +3 -3
  152. package/dist/Form/index.d.ts +33 -27
  153. package/dist/Form/index.js +29 -25
  154. package/dist/Navigation/Navigation.AppBar.d.ts +11 -6
  155. package/dist/Navigation/Navigation.AppBar.js +16 -16
  156. package/dist/Navigation/Navigation.BottomNav.d.ts +4 -2
  157. package/dist/Navigation/Navigation.BottomNav.js +34 -21
  158. package/dist/Navigation/Navigation.CollapsingHeader.d.ts +1 -1
  159. package/dist/Navigation/Navigation.CollapsingHeader.js +3 -3
  160. package/dist/Navigation/Navigation.FloatingBar.js +2 -2
  161. package/dist/Navigation/Navigation.Header.js +6 -6
  162. package/dist/Navigation/Navigation.HeaderToolbar.js +5 -5
  163. package/dist/Navigation/Navigation.Menu.js +6 -6
  164. package/dist/Navigation/Navigation.MenuSection.js +2 -2
  165. package/dist/Navigation/Navigation.RowItem.d.ts +2 -2
  166. package/dist/Navigation/Navigation.RowItem.js +4 -4
  167. package/dist/Navigation/Navigation.SearchBar.d.ts +6 -1
  168. package/dist/Navigation/Navigation.SearchBar.js +33 -12
  169. package/dist/Navigation/Navigation.SearchSuggestions.d.ts +14 -0
  170. package/dist/Navigation/Navigation.SearchSuggestions.js +7 -0
  171. package/dist/Navigation/Navigation.SegmentedControl.d.ts +3 -1
  172. package/dist/Navigation/Navigation.SegmentedControl.js +6 -5
  173. package/dist/Navigation/Navigation.Steps.js +5 -5
  174. package/dist/Navigation/Navigation.TabIcon.js +2 -2
  175. package/dist/Navigation/Navigation.TabItem.js +2 -2
  176. package/dist/Navigation/Navigation.Tabs.js +5 -5
  177. package/dist/Navigation/index.d.ts +23 -19
  178. package/dist/Navigation/index.js +17 -15
  179. package/dist/Typography/Typography.Heading.d.ts +1 -1
  180. package/dist/Typography/Typography.Heading.js +2 -2
  181. package/dist/Typography/Typography.SelectableText.d.ts +10 -0
  182. package/dist/Typography/Typography.SelectableText.js +16 -0
  183. package/dist/Typography/Typography.Text.d.ts +2 -2
  184. package/dist/Typography/Typography.Text.js +5 -19
  185. package/dist/Typography/index.d.ts +5 -2
  186. package/dist/Typography/index.js +5 -2
  187. package/dist/branding.d.ts +22 -0
  188. package/dist/branding.js +20 -3
  189. package/dist/icons/AddItemIcon.d.ts +1 -1
  190. package/dist/icons/ArrangeCircle.d.ts +1 -1
  191. package/dist/icons/ArrowDownIcon.d.ts +1 -1
  192. package/dist/icons/ArrowUpIcon.d.ts +1 -1
  193. package/dist/icons/BoxIcon.d.ts +1 -1
  194. package/dist/icons/BoxTimeIcon.d.ts +1 -1
  195. package/dist/icons/CalendarIcon.d.ts +1 -1
  196. package/dist/icons/CardIcon.d.ts +1 -1
  197. package/dist/icons/CashierIcon.d.ts +1 -1
  198. package/dist/icons/DuoIcon.d.ts +1 -1
  199. package/dist/icons/HomeIcon.d.ts +1 -1
  200. package/dist/icons/HomeIconOutlined.d.ts +1 -1
  201. package/dist/icons/LogoIcon.d.ts +1 -1
  202. package/dist/icons/MoneyReceiveIcon.d.ts +1 -1
  203. package/dist/icons/PinIcon.d.ts +1 -1
  204. package/dist/icons/PrinterIcon.d.ts +1 -1
  205. package/dist/icons/ProfileIcon.d.ts +1 -1
  206. package/dist/icons/SettingsIcon.d.ts +1 -1
  207. package/dist/icons/SinpeIcon.d.ts +1 -1
  208. package/dist/icons/ToggleOffIcon.d.ts +1 -1
  209. package/dist/icons/WalletMoneyIcon.d.ts +1 -1
  210. package/dist/index.d.ts +24 -23
  211. package/dist/index.js +26 -24
  212. package/dist/layouts/AuthContainer.d.ts +9 -3
  213. package/dist/layouts/AuthContainer.js +8 -8
  214. package/dist/layouts/Container.js +1 -1
  215. package/dist/layouts/GradientContainer.js +1 -1
  216. package/dist/layouts/ScrollContainer.js +1 -1
  217. package/dist/layouts/TabNavigatorLayout.js +4 -4
  218. package/dist/primitives/AspectRatio.js +1 -1
  219. package/dist/primitives/BaseButton.d.ts +92 -87
  220. package/dist/primitives/BaseButton.js +52 -54
  221. package/dist/primitives/Box.js +1 -1
  222. package/dist/primitives/Pressable.js +1 -1
  223. package/dist/primitives/Row.js +1 -1
  224. package/dist/primitives/Stack.js +1 -1
  225. package/dist/primitives/index.d.ts +6 -6
  226. package/dist/primitives/index.js +6 -6
  227. package/dist/theme/active.d.ts +1 -1
  228. package/dist/theme/active.js +14 -1
  229. package/dist/theme/build.d.ts +33 -0
  230. package/dist/theme/build.js +118 -0
  231. package/dist/theme/color.d.ts +26 -0
  232. package/dist/theme/color.js +109 -0
  233. package/dist/theme/components/index.d.ts +1 -1
  234. package/dist/theme/components/index.js +1 -1
  235. package/dist/theme/contrast.d.ts +29 -0
  236. package/dist/theme/contrast.js +57 -0
  237. package/dist/theme/css-vars.d.ts +3 -1
  238. package/dist/theme/css-vars.js +29 -3
  239. package/dist/theme/dark.d.ts +3 -4
  240. package/dist/theme/dark.js +91 -48
  241. package/dist/theme/default.d.ts +5 -1
  242. package/dist/theme/default.js +89 -41
  243. package/dist/theme/define.d.ts +4 -1
  244. package/dist/theme/define.js +4 -1
  245. package/dist/theme/globals.css +61 -46
  246. package/dist/theme/index.d.ts +14 -10
  247. package/dist/theme/index.js +13 -9
  248. package/dist/theme/theme.d.ts +1 -1
  249. package/dist/theme/theme.js +2 -2
  250. package/dist/theme/types.d.ts +77 -16
  251. package/dist/theme/types.js +13 -3
  252. package/dist/theme/typography.d.ts +19 -4
  253. package/dist/theme/typography.js +45 -28
  254. package/dist/theme/useTheme.d.ts +1 -1
  255. package/dist/theme/useTheme.js +1 -1
  256. package/dist/theme/validate.d.ts +16 -0
  257. package/dist/theme/validate.js +200 -0
  258. package/dist/tokens/index.d.ts +2 -2
  259. package/dist/tokens/index.js +2 -2
  260. package/dist/utils/criteria.d.ts +56 -0
  261. package/dist/utils/criteria.js +99 -0
  262. package/dist/utils/reorder.d.ts +4 -0
  263. package/dist/utils/reorder.js +32 -0
  264. package/dist/views/AppSplashView.d.ts +2 -2
  265. package/dist/views/AppSplashView.js +3 -3
  266. package/dist/views/AuthFormView.d.ts +5 -2
  267. package/dist/views/AuthFormView.js +5 -5
  268. package/dist/views/FormViewV2.d.ts +9 -4
  269. package/dist/views/FormViewV2.js +44 -25
  270. package/dist/views/ListViewV2.d.ts +12 -9
  271. package/dist/views/ListViewV2.js +49 -36
  272. package/dist/views/Wizard/Wizard.context.js +1 -1
  273. package/dist/views/Wizard/Wizard.d.ts +1 -1
  274. package/dist/views/Wizard/Wizard.js +1 -1
  275. package/dist/views/Wizard/index.d.ts +4 -4
  276. package/dist/views/Wizard/index.js +2 -2
  277. package/dist/views/types/IFormView.d.ts +1 -1
  278. package/dist/views/types/IListView.d.ts +1 -1
  279. package/dist/widgets/CircleButton.d.ts +2 -2
  280. package/dist/widgets/CircleButton.js +1 -1
  281. package/dist/widgets/CollectionOptions.d.ts +15 -0
  282. package/dist/widgets/CollectionOptions.js +127 -0
  283. package/dist/widgets/FilterBar.d.ts +21 -0
  284. package/dist/widgets/FilterBar.js +14 -0
  285. package/dist/widgets/FilterBuilder.d.ts +10 -0
  286. package/dist/widgets/FilterBuilder.js +115 -0
  287. package/dist/widgets/GeoPermissionCard.js +3 -3
  288. package/dist/widgets/HomeHeader.js +3 -3
  289. package/dist/widgets/JSONViewer.js +2 -2
  290. package/dist/widgets/MenuCard.d.ts +2 -2
  291. package/dist/widgets/MenuCard.js +1 -1
  292. package/dist/widgets/MenuGrid.d.ts +3 -3
  293. package/dist/widgets/MenuGrid.js +1 -1
  294. package/dist/widgets/MenuSection.d.ts +2 -2
  295. package/dist/widgets/MenuSection.js +1 -1
  296. package/dist/widgets/PromoBanner.js +3 -3
  297. package/dist/widgets/PromoModal.js +3 -3
  298. package/dist/widgets/QueryChoice.d.ts +10 -0
  299. package/dist/widgets/QueryChoice.js +13 -0
  300. package/dist/widgets/QuickActions.js +3 -3
  301. package/dist/widgets/ReorderableList.d.ts +51 -0
  302. package/dist/widgets/ReorderableList.js +138 -0
  303. package/dist/widgets/ScreenHeader.js +2 -2
  304. package/dist/widgets/TimeZoneSelector.d.ts +1 -1
  305. package/dist/widgets/TimeZoneSelector.js +4 -4
  306. package/dist/widgets/TimeZoneSelectorModal.d.ts +1 -1
  307. package/dist/widgets/TimeZoneSelectorModal.js +5 -5
  308. package/dist/widgets/index.d.ts +20 -16
  309. package/dist/widgets/index.js +13 -10
  310. package/package.json +70 -50
  311. package/tailwind.preset.js +19 -0
  312. package/dist/icons/icon_getters.d.ts +0 -6
  313. package/dist/icons/icon_getters.js +0 -23
@@ -1,3 +1,3 @@
1
1
  /** @deprecated Use `Actions.IconButton` from `@sincpro/mobile-ui/Actions` instead. */
2
- export type { IconButtonProps } from "../Actions/Actions.IconButton";
3
- export { default } from "../Actions/Actions.IconButton";
2
+ export type { IconButtonProps } from "../Actions/Actions.IconButton.js";
3
+ export { default } from "../Actions/Actions.IconButton.js";
@@ -1 +1 @@
1
- export { default } from "../Actions/Actions.IconButton";
1
+ export { default } from "../Actions/Actions.IconButton.js";
@@ -1,10 +1,12 @@
1
- import type React from "react";
2
- import { type TextInputProps } from "react-native";
1
+ import type { ComponentRef, Ref } from "react";
2
+ import { TextInput, type TextInputProps } from "react-native";
3
3
  interface FormInputProps extends TextInputProps {
4
+ ref?: Ref<ComponentRef<typeof TextInput>>;
4
5
  label: string;
5
6
  error?: string;
6
7
  tooltip?: string;
7
8
  className?: string;
9
+ accessibleSizing?: boolean;
8
10
  }
9
- declare function FormInput({ label, error, tooltip, style, multiline, numberOfLines, onFocus, onBlur, className, ...props }: FormInputProps): React.JSX.Element;
11
+ declare function FormInput({ label, error, tooltip, style, multiline, numberOfLines, onFocus, onBlur, className, accessibleSizing, ref, ...props }: FormInputProps): import("react").JSX.Element;
10
12
  export default FormInput;
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
- import { theme } from "../theme";
3
- import { cn, tv } from "../theme/tw";
4
- import { Typography } from "../Typography";
2
+ import { theme } from "../theme/index.js";
3
+ import { cn, tv } from "../theme/tw.js";
4
+ import { Typography } from "../Typography/index.js";
5
5
  import { useState } from "react";
6
6
  import { TextInput, View } from "react-native";
7
7
  const inputContainer = tv({
@@ -15,7 +15,7 @@ const inputContainer = tv({
15
15
  },
16
16
  defaultVariants: { state: "default" },
17
17
  });
18
- function FormInput({ label, error, tooltip, style, multiline = false, numberOfLines = 1, onFocus, onBlur, className, ...props }) {
18
+ function FormInput({ label, error, tooltip, style, multiline = false, numberOfLines = 1, onFocus, onBlur, className, accessibleSizing = false, ref, ...props }) {
19
19
  const [isFocused, setIsFocused] = useState(false);
20
20
  const hasError = Boolean(error);
21
21
  const handleFocus = (e) => {
@@ -33,6 +33,6 @@ function FormInput({ label, error, tooltip, style, multiline = false, numberOfLi
33
33
  return "focused";
34
34
  return "default";
35
35
  };
36
- return (_jsxs(View, { className: cn("mb-2", className), children: [_jsx(Typography.Text, { className: "mb-1 font-medium text-text-primary", variant: "bodySmall", children: label }), _jsx(View, { className: inputContainer({ state: getState() }), children: _jsx(TextInput, { className: cn("px-3 py-2.5 text-sm min-h-[44px] text-text-primary", multiline && "min-h-[64px] pt-2.5"), multiline: multiline, numberOfLines: numberOfLines, onBlur: handleBlur, onFocus: handleFocus, placeholderTextColor: theme.text.tertiary, textAlignVertical: multiline ? "top" : "center", ...props }) }), hasError && (_jsx(Typography.Text, { className: "mt-0.5 text-danger", variant: "bodySmall", children: error }))] }));
36
+ return (_jsxs(View, { className: cn("mb-2", className), children: [_jsx(Typography.Text, { className: "mb-1 font-medium text-text-primary", variant: "bodySmall", children: label }), _jsx(View, { className: inputContainer({ state: getState() }), children: _jsx(TextInput, { accessibilityHint: error || tooltip, accessibilityLabel: label, className: cn("px-3 py-2.5 text-sm min-h-[44px] text-text-primary", multiline && "min-h-[64px] pt-2.5"), multiline: multiline, numberOfLines: numberOfLines, onBlur: handleBlur, onFocus: handleFocus, placeholderTextColor: theme.text.tertiary, ref: ref, selectionColor: theme.primary, style: [accessibleSizing ? { minHeight: 48 } : undefined, style], textAlignVertical: multiline ? "top" : "center", underlineColorAndroid: "transparent", ...props }) }), hasError && (_jsx(Typography.Text, { accessibilityLiveRegion: "polite", className: "mt-0.5 text-danger", variant: "bodySmall", children: error }))] }));
37
37
  }
38
38
  export default FormInput;
@@ -1,4 +1,4 @@
1
- import TextInputF from "../Form/Form.TextInput";
1
+ import TextInputF from "./Form.TextInput.js";
2
2
  import React, { FC } from "react";
3
3
  import { TextInputProps } from "react-native";
4
4
  export interface InputFieldProps extends TextInputProps {
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
- import TextInputF from "../Form/Form.TextInput";
3
- import { tv } from "../theme/tw";
4
- import { Typography } from "../Typography";
2
+ import TextInputF from "./Form.TextInput.js";
3
+ import { tv } from "../theme/tw.js";
4
+ import { Typography } from "../Typography/index.js";
5
5
  import { useState } from "react";
6
6
  import { View } from "react-native";
7
7
  const inputFieldBorder = tv({
@@ -0,0 +1,11 @@
1
+ import { type KeyboardToolbarProps } from "./Form.KeyboardToolbar.js";
2
+ import { type ReactNode, type Ref } from "react";
3
+ import type { KeyboardAwareScrollViewProps, KeyboardAwareScrollViewRef } from "react-native-keyboard-controller";
4
+ export interface KeyboardFormProps extends KeyboardAwareScrollViewProps {
5
+ children: ReactNode;
6
+ ref?: Ref<KeyboardAwareScrollViewRef>;
7
+ toolbar?: boolean;
8
+ toolbarProps?: Omit<KeyboardToolbarProps, "onHeightChange">;
9
+ toolbarLabels?: Pick<KeyboardToolbarProps, "previousLabel" | "nextLabel" | "doneLabel" | "showDoneLabel">;
10
+ }
11
+ export default function KeyboardForm({ children, toolbar, toolbarLabels, toolbarProps, bottomOffset, style, ...props }: KeyboardFormProps): import("react").JSX.Element;
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
+ import KeyboardToolbar from "./Form.KeyboardToolbar.js";
3
+ import { useState } from "react";
4
+ import { View } from "react-native";
5
+ import { KeyboardAwareScrollView, KeyboardToolbar as NativeToolbar, } from "react-native-keyboard-controller";
6
+ export default function KeyboardForm({ children, toolbar = true, toolbarLabels, toolbarProps, bottomOffset, style, ...props }) {
7
+ const [toolbarHeight, setToolbarHeight] = useState(48);
8
+ return (_jsxs(View, { style: { flex: 1 }, children: [_jsx(NativeToolbar.Group, { style: { flex: 1 }, children: _jsx(KeyboardAwareScrollView, { bottomOffset: bottomOffset ?? (toolbar ? toolbarHeight + 24 : 20), keyboardShouldPersistTaps: "handled", style: [{ flex: 1 }, style], ...props, children: children }) }), toolbar ? (_jsx(KeyboardToolbar, { ...toolbarLabels, ...toolbarProps, onHeightChange: setToolbarHeight })) : null] }));
9
+ }
@@ -0,0 +1,21 @@
1
+ import { type ReactNode } from "react";
2
+ import { type StyleProp, type TextStyle, type ViewStyle } from "react-native";
3
+ export type KeyboardToolbarAction = "previous" | "next" | "done";
4
+ export interface KeyboardToolbarProps {
5
+ previousLabel?: string;
6
+ nextLabel?: string;
7
+ doneLabel?: string;
8
+ showDoneLabel?: boolean;
9
+ onHeightChange?: (height: number) => void;
10
+ className?: string;
11
+ style?: StyleProp<ViewStyle>;
12
+ actionStyle?: StyleProp<ViewStyle>;
13
+ labelStyle?: StyleProp<TextStyle>;
14
+ iconSize?: number;
15
+ testID?: string;
16
+ renderActionContent?: (action: KeyboardToolbarAction, state: {
17
+ label: string;
18
+ disabled: boolean;
19
+ }) => ReactNode;
20
+ }
21
+ export default function KeyboardToolbar({ previousLabel, nextLabel, doneLabel, showDoneLabel, onHeightChange, className, style, actionStyle, labelStyle, iconSize, testID, renderActionContent, }: KeyboardToolbarProps): import("react").JSX.Element;
@@ -0,0 +1,70 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
+ import Icon from "../Display/Display.Icon.js";
3
+ import Pressable from "../primitives/Pressable.js";
4
+ import { useTheme } from "../theme/index.js";
5
+ import { Typography } from "../Typography/index.js";
6
+ import { useEffect, useRef, useState } from "react";
7
+ import { StyleSheet, useWindowDimensions, View, } from "react-native";
8
+ import { FocusedInputEvents, KeyboardController, KeyboardStickyView, useKeyboardState, } from "react-native-keyboard-controller";
9
+ export default function KeyboardToolbar({ previousLabel = "Campo anterior", nextLabel = "Campo siguiente", doneLabel = "Ocultar teclado", showDoneLabel = false, onHeightChange, className, style, actionStyle, labelStyle, iconSize = 20, testID = "keyboard-toolbar", renderActionContent, }) {
10
+ const theme = useTheme();
11
+ const frame = useRef(null);
12
+ const { height: windowHeight } = useWindowDimensions();
13
+ const [bottomGap, setBottomGap] = useState(0);
14
+ const [height, setHeight] = useState(48);
15
+ const [inputs, setInputs] = useState({ current: 0, count: 0 });
16
+ const isVisible = useKeyboardState((state) => state.isVisible);
17
+ useEffect(() => {
18
+ const subscription = FocusedInputEvents.addListener("focusDidSet", setInputs);
19
+ return () => subscription.remove();
20
+ }, []);
21
+ const previousDisabled = inputs.current === 0;
22
+ const nextDisabled = inputs.current >= inputs.count - 1;
23
+ const content = (action, label, disabled) => {
24
+ if (renderActionContent)
25
+ return renderActionContent(action, { label, disabled });
26
+ if (action === "done" && showDoneLabel)
27
+ return (_jsx(Typography.Text, { className: "text-text-accent", style: labelStyle, variant: "bodySmall", children: label }));
28
+ return (_jsx(Icon, { color: disabled ? theme.text.tertiary : theme.text.accent, name: action === "previous"
29
+ ? "chevron-up"
30
+ : action === "next"
31
+ ? "chevron-down"
32
+ : "checkmark", size: iconSize }));
33
+ };
34
+ return (_jsx(View, { accessibilityElementsHidden: !isVisible, importantForAccessibility: isVisible ? "auto" : "no-hide-descendants", onLayout: () => {
35
+ frame.current?.measureInWindow((_x, y, _width, frameHeight) => setBottomGap(Math.max(0, windowHeight - y - frameHeight)));
36
+ }, pointerEvents: "box-none", ref: frame, style: StyleSheet.absoluteFill, children: _jsx(KeyboardStickyView, { offset: { closed: height, opened: bottomGap - 8 }, style: { position: "absolute", bottom: 0, left: 0, right: 0 }, children: _jsxs(View, { className: className, onLayout: (event) => {
37
+ const nextHeight = event.nativeEvent.layout.height;
38
+ setHeight(nextHeight);
39
+ onHeightChange?.(nextHeight);
40
+ }, style: [
41
+ {
42
+ minHeight: 48,
43
+ flexDirection: "row",
44
+ alignItems: "center",
45
+ justifyContent: "space-between",
46
+ paddingHorizontal: 8,
47
+ backgroundColor: theme.bg.card,
48
+ borderTopWidth: StyleSheet.hairlineWidth,
49
+ borderTopColor: theme.border.light,
50
+ },
51
+ style,
52
+ ], testID: testID, children: [_jsxs(View, { style: { flexDirection: "row" }, children: [_jsx(Pressable, { accessibilityLabel: previousLabel, disabled: previousDisabled, hitSlop: 0, onPress: () => KeyboardController.setFocusTo("prev"), style: [styles.arrow, actionStyle], children: content("previous", previousLabel, previousDisabled) }), _jsx(Pressable, { accessibilityLabel: nextLabel, disabled: nextDisabled, hitSlop: 0, onPress: () => KeyboardController.setFocusTo("next"), style: [styles.arrow, actionStyle], children: content("next", nextLabel, nextDisabled) })] }), _jsx(Pressable, { accessibilityLabel: doneLabel, hitSlop: 0, onPress: () => KeyboardController.dismiss(), style: [
53
+ {
54
+ minWidth: 48,
55
+ minHeight: 48,
56
+ flexShrink: 1,
57
+ justifyContent: "center",
58
+ padding: 8,
59
+ },
60
+ actionStyle,
61
+ ], children: content("done", doneLabel, false) })] }) }) }));
62
+ }
63
+ const styles = StyleSheet.create({
64
+ arrow: {
65
+ minWidth: 48,
66
+ minHeight: 48,
67
+ alignItems: "center",
68
+ justifyContent: "center",
69
+ },
70
+ });
@@ -1,7 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
- import { tv } from "../theme/tw";
3
- import { Typography } from "../Typography";
4
- import { parseToMonetaryNumber } from "../utils/monetary";
2
+ import { theme } from "../theme/index.js";
3
+ import { tv } from "../theme/tw.js";
4
+ import { Typography } from "../Typography/index.js";
5
+ import { parseToMonetaryNumber } from "../utils/monetary.js";
5
6
  import { useState } from "react";
6
7
  import { View } from "react-native";
7
8
  import CurrencyInput from "react-native-currency-input";
@@ -22,6 +23,6 @@ function MonetaryInput({ amount, onChange, currencySymbol = "₡", placeholder =
22
23
  setRaw(amount);
23
24
  onChange?.(parseToMonetaryNumber(amount));
24
25
  };
25
- return (_jsxs(View, { className: "flex-row", children: [_jsx(View, { className: monetaryBox({ focused: isFocused, className: "w-10 h-10" }), children: _jsx(Typography.Text, { className: "text-xl", variant: "body", children: currencySymbol }) }), _jsx(View, { className: monetaryBox({ focused: isFocused, className: "flex-1 h-10 ml-2 px-4" }), children: _jsx(CurrencyInput, { delimiter: ".", keyboardType: "numeric", onBlur: () => setIsFocused(false), onChangeValue: handleChange, onFocus: () => setIsFocused(true), placeholder: placeholder, separator: ",", value: raw }) })] }));
26
+ return (_jsxs(View, { className: "flex-row", children: [_jsx(View, { className: monetaryBox({ focused: isFocused, className: "w-10 h-10" }), children: _jsx(Typography.Text, { className: "text-xl", variant: "body", children: currencySymbol }) }), _jsx(View, { className: monetaryBox({ focused: isFocused, className: "flex-1 h-10 ml-2 px-4" }), children: _jsx(CurrencyInput, { delimiter: ".", keyboardType: "numeric", onBlur: () => setIsFocused(false), onChangeValue: handleChange, onFocus: () => setIsFocused(true), placeholder: placeholder, placeholderTextColor: theme.text.tertiary, selectionColor: theme.primary, separator: ",", underlineColorAndroid: "transparent", value: raw }) })] }));
26
27
  }
27
28
  export default MonetaryInput;
@@ -1,4 +1,4 @@
1
- import InputField from "../Form/Form.InputField";
1
+ import InputField from "./Form.InputField.js";
2
2
  import React from "react";
3
3
  export interface PasswordFieldProps {
4
4
  label: string;
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
- import { Display } from "../Display";
3
- import InputField from "../Form/Form.InputField";
4
- import { useTheme } from "../theme";
2
+ import { Display } from "../Display/index.js";
3
+ import InputField from "./Form.InputField.js";
4
+ import { useTheme } from "../theme/index.js";
5
5
  import { useState } from "react";
6
6
  import { TouchableOpacity, View } from "react-native";
7
7
  const PasswordField = ({ label, error, inputProps }) => {
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
- import Pressable from "../primitives/Pressable";
3
- import { theme } from "../theme";
4
- import { cn } from "../theme/tw";
5
- import { Typography } from "../Typography";
2
+ import Pressable from "../primitives/Pressable.js";
3
+ import { theme } from "../theme/index.js";
4
+ import { cn } from "../theme/tw.js";
5
+ import { Typography } from "../Typography/index.js";
6
6
  import { useRef } from "react";
7
7
  import { TextInput, View } from "react-native";
8
8
  function PinInput({ value, onChange, length = 6, secure = false, autoFocus = false, onComplete, className, testID, }) {
@@ -18,6 +18,6 @@ function PinInput({ value, onChange, length = 6, secure = false, autoFocus = fal
18
18
  const filled = index < value.length;
19
19
  const active = index === value.length;
20
20
  return (_jsx(View, { className: "flex-1 aspect-square max-w-[52px] rounded-lg border bg-bg-card items-center justify-center", style: { borderColor: active ? theme.border.focus : theme.border.default }, children: _jsx(Typography.Text, { className: "text-text-primary", variant: "h4", children: filled ? (secure ? "•" : chars[index]) : "" }) }, index));
21
- }), _jsx(TextInput, { autoFocus: autoFocus, caretHidden: true, keyboardType: "number-pad", maxLength: length, onChangeText: handleChange, ref: inputRef, style: { position: "absolute", opacity: 0, width: 1, height: 1 }, textContentType: "oneTimeCode", value: value })] }));
21
+ }), _jsx(TextInput, { autoFocus: autoFocus, caretHidden: true, keyboardType: "number-pad", maxLength: length, onChangeText: handleChange, ref: inputRef, selectionColor: theme.primary, style: { position: "absolute", opacity: 0, width: 1, height: 1 }, textContentType: "oneTimeCode", underlineColorAndroid: "transparent", value: value })] }));
22
22
  }
23
23
  export default PinInput;
@@ -1,11 +1,11 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
- import { Display } from "../Display";
3
- import { Typography } from "../Typography";
2
+ import { Display } from "../Display/index.js";
3
+ import { Typography } from "../Typography/index.js";
4
4
  import { TouchableOpacity, View } from "react-native";
5
5
  import { tv } from "tailwind-variants";
6
6
  const quantitySelector = tv({
7
7
  slots: {
8
- container: "flex-row items-center self-start border border-accent rounded-full px-1",
8
+ container: "flex-row items-center self-start border border-primary rounded-full px-1",
9
9
  button: "w-9 h-9 rounded-full justify-center items-center",
10
10
  valueContainer: "min-w-[40px] items-center px-3",
11
11
  },
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
- import { Typography } from "../Typography";
2
+ import { Typography } from "../Typography/index.js";
3
3
  import { TouchableOpacity, View } from "react-native";
4
4
  import { tv } from "tailwind-variants";
5
5
  const radioButton = tv({
@@ -12,9 +12,9 @@ const radioButton = tv({
12
12
  variants: {
13
13
  selected: {
14
14
  true: {
15
- container: "border-accent bg-accent/10",
16
- radioCircle: "border-accent",
17
- radioInner: "bg-accent",
15
+ container: "border-primary bg-primary/10",
16
+ radioCircle: "border-primary",
17
+ radioInner: "bg-primary",
18
18
  label: "text-text-primary font-semibold",
19
19
  },
20
20
  false: {
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
- import { Display } from "../Display";
3
- import { theme } from "../theme";
4
- import { cn, tv } from "../theme/tw";
2
+ import { Display } from "../Display/index.js";
3
+ import { theme } from "../theme/index.js";
4
+ import { cn, tv } from "../theme/tw.js";
5
5
  import { useState } from "react";
6
6
  import { TextInput, TouchableOpacity, View } from "react-native";
7
7
  const Icon = Display.Icon;
@@ -21,6 +21,6 @@ const searchBarContainer = tv({
21
21
  */
22
22
  function SearchBar({ value, onChangeText, placeholder = "Search", className, }) {
23
23
  const [isFocused, setIsFocused] = useState(false);
24
- return (_jsxs(View, { className: cn(searchBarContainer({ focused: isFocused }), className), children: [_jsx(View, { className: "mr-1 ml-0.5 items-center justify-center h-full", children: _jsx(Icon, { className: "text-text-tertiary", name: "search", size: 18, type: "ionicons" }) }), _jsx(TextInput, { className: "flex-1 h-full text-sm py-0 px-1.5 text-text-primary", onBlur: () => setIsFocused(false), onChangeText: onChangeText, onFocus: () => setIsFocused(true), placeholder: placeholder, placeholderTextColor: theme.text.tertiary, value: value }), value.length > 0 && (_jsx(TouchableOpacity, { activeOpacity: 0.7, className: "mr-0.5 ml-1 items-center justify-center h-full px-1", onPress: () => onChangeText(""), children: _jsx(Icon, { className: "text-text-tertiary", name: "x", size: 18, type: "feather" }) }))] }));
24
+ return (_jsxs(View, { className: cn(searchBarContainer({ focused: isFocused }), className), children: [_jsx(View, { className: "mr-1 ml-0.5 items-center justify-center h-full", children: _jsx(Icon, { className: "text-text-tertiary", name: "search", size: 18, type: "ionicons" }) }), _jsx(TextInput, { className: "flex-1 h-full text-sm py-0 px-1.5 text-text-primary", onBlur: () => setIsFocused(false), onChangeText: onChangeText, onFocus: () => setIsFocused(true), placeholder: placeholder, placeholderTextColor: theme.text.tertiary, selectionColor: theme.primary, underlineColorAndroid: "transparent", value: value }), value.length > 0 && (_jsx(TouchableOpacity, { activeOpacity: 0.7, className: "mr-0.5 ml-1 items-center justify-center h-full px-1", onPress: () => onChangeText(""), children: _jsx(Icon, { className: "text-text-tertiary", name: "x", size: 18, type: "feather" }) }))] }));
25
25
  }
26
26
  export default SearchBar;
@@ -10,8 +10,10 @@ export interface SelectProps<T extends string | number> {
10
10
  placeholder?: string;
11
11
  title?: string;
12
12
  disabled?: boolean;
13
+ accessibleSizing?: boolean;
13
14
  className?: string;
14
15
  testID?: string;
16
+ showCloseButton?: boolean;
15
17
  }
16
- declare function Select<T extends string | number>({ options, value, onChange, label, placeholder, title, disabled, className, testID, }: SelectProps<T>): import("react").JSX.Element;
18
+ declare function Select<T extends string | number>({ options, value, onChange, label, placeholder, title, disabled, accessibleSizing, className, testID, showCloseButton, }: SelectProps<T>): import("react").JSX.Element;
17
19
  export default Select;
@@ -1,13 +1,15 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
- import Icon from "../Display/Display.Icon";
3
- import Pressable from "../primitives/Pressable";
4
- import { theme } from "../theme";
5
- import { cn } from "../theme/tw";
6
- import { Typography } from "../Typography";
2
+ import Icon from "../Display/Display.Icon.js";
3
+ import Pressable from "../primitives/Pressable.js";
4
+ import { themeToVars, useTheme } from "../theme/index.js";
5
+ import { cn } from "../theme/tw.js";
6
+ import { Typography } from "../Typography/index.js";
7
+ import { vars } from "nativewind";
7
8
  import { useEffect, useRef, useState } from "react";
8
- import { Animated, Modal, Pressable as RNPressable, ScrollView, View } from "react-native";
9
+ import { Animated, Modal, ScrollView, View } from "react-native";
9
10
  import { useSafeAreaInsets } from "react-native-safe-area-context";
10
- function Select({ options, value, onChange, label, placeholder = "Seleccionar…", title, disabled = false, className, testID, }) {
11
+ function Select({ options, value, onChange, label, placeholder = "Seleccionar…", title, disabled = false, accessibleSizing = false, className, testID, showCloseButton = accessibleSizing, }) {
12
+ const theme = useTheme();
11
13
  const insets = useSafeAreaInsets();
12
14
  const [open, setOpen] = useState(false);
13
15
  const selected = options.find((o) => o.value === value) ?? null;
@@ -26,16 +28,27 @@ function Select({ options, value, onChange, label, placeholder = "Seleccionar…
26
28
  translateY.setValue(800);
27
29
  }
28
30
  }, [open, translateY]);
29
- return (_jsxs(View, { className: cn("gap-1", className), testID: testID, children: [label ? (_jsx(Typography.Text, { className: "font-medium text-text-primary", variant: "bodySmall", children: label })) : null, _jsxs(Pressable, { accessibilityHint: "Abre la lista de opciones", accessibilityLabel: label ?? placeholder, accessibilityRole: "button", accessibilityState: { disabled }, className: "flex-row items-center justify-between rounded-lg border border-input bg-bg-card px-3 min-h-[44px]", disabled: disabled, onPress: () => setOpen(true), children: [_jsx(Typography.Text, { className: cn("flex-1 text-sm", selected ? "text-text-primary" : "text-text-tertiary"), numberOfLines: 1, children: selected ? selected.label : placeholder }), _jsx(Icon, { color: theme.icon.secondary, name: "chevron-down", size: 18 })] }), _jsx(Modal, { animationType: "none", onRequestClose: () => setOpen(false), presentationStyle: "overFullScreen", transparent: true, visible: open, children: _jsx(RNPressable, { className: "flex-1 justify-end bg-black/50", onPress: () => setOpen(false), children: _jsx(Animated.View, { style: { transform: [{ translateY }] }, children: _jsxs(RNPressable, { className: "rounded-t-3xl", style: {
30
- backgroundColor: theme.bg.card,
31
- paddingBottom: insets.bottom + 8,
32
- maxHeight: "70%",
33
- }, children: [_jsx(View, { className: "items-center pt-3 pb-1", children: _jsx(View, { className: "w-10 h-1 rounded-full bg-border-strong" }) }), title ? (_jsx(Typography.Text, { className: "text-text-primary px-4 py-2", semibold: true, variant: "body", children: title })) : null, _jsx(ScrollView, { children: options.map((option) => {
31
+ return (_jsxs(View, { className: cn("gap-1", className), testID: testID, children: [label ? (_jsx(Typography.Text, { className: "font-medium text-text-primary", variant: "bodySmall", children: label })) : null, _jsxs(Pressable, { accessibilityHint: "Abre la lista de opciones", accessibilityLabel: label
32
+ ? `${label}: ${selected?.label ?? placeholder}`
33
+ : (selected?.label ?? placeholder), accessibilityRole: "button", accessibilityState: { disabled, expanded: open }, className: cn("flex-row items-center justify-between rounded-lg border border-input bg-bg-card px-3", accessibleSizing ? "min-h-[48px]" : "min-h-[44px]"), disabled: disabled, onPress: () => setOpen(true), children: [_jsx(Typography.Text, { className: cn("flex-1 text-sm", selected ? "text-text-primary" : "text-text-tertiary"), numberOfLines: accessibleSizing ? undefined : 1, style: accessibleSizing ? { paddingVertical: 12 } : undefined, children: selected ? selected.label : placeholder }), _jsx(Icon, { color: theme.icon.secondary, name: "chevron-down", size: 18 })] }), _jsx(Modal, { animationType: "none", onRequestClose: () => setOpen(false), presentationStyle: "overFullScreen", transparent: true, visible: open, children: _jsxs(View, { className: "flex-1 justify-end", children: [_jsx(View, { accessibilityElementsHidden: true, className: "absolute inset-0 bg-black/50", importantForAccessibility: "no-hide-descendants", onResponderRelease: () => setOpen(false), onStartShouldSetResponder: () => true }), _jsxs(Animated.View, { accessibilityViewIsModal: true, className: "rounded-t-3xl", importantForAccessibility: "yes", onAccessibilityEscape: () => setOpen(false), style: [
34
+ vars(themeToVars(theme)),
35
+ {
36
+ transform: [{ translateY }],
37
+ maxHeight: "70%",
38
+ backgroundColor: theme.bg.card,
39
+ paddingBottom: insets.bottom + 8,
40
+ },
41
+ ], children: [_jsx(View, { className: "items-center pt-3 pb-1", children: _jsx(View, { className: "w-10 h-1 rounded-full bg-border-strong" }) }), title || showCloseButton ? (_jsxs(View, { className: "flex-row items-center justify-between px-4", children: [_jsx(Typography.Text, { accessibilityRole: "header", className: "flex-1 text-text-primary py-2", semibold: true, variant: "body", children: title ?? label ?? "Seleccionar" }), showCloseButton ? (_jsx(Pressable, { accessibilityLabel: "Cerrar opciones", onPress: () => setOpen(false), style: {
42
+ minWidth: 48,
43
+ minHeight: 48,
44
+ justifyContent: "center",
45
+ alignItems: "center",
46
+ }, children: _jsx(Typography.Text, { className: "text-text-accent", variant: "bodySmall", children: "Cerrar" }) })) : null] })) : null, _jsx(ScrollView, { children: options.map((option) => {
34
47
  const isSelected = option.value === value;
35
48
  return (_jsxs(Pressable, { accessibilityRole: "menuitem", accessibilityState: { selected: isSelected }, className: "flex-row items-center justify-between px-4 py-3 border-b border-border-light", onPress: () => {
36
49
  onChange(option.value);
37
50
  setOpen(false);
38
- }, children: [_jsx(Typography.Text, { className: cn("flex-1 text-sm", isSelected ? "text-primary font-semibold" : "text-text-primary"), children: option.label }), isSelected ? (_jsx(Icon, { color: theme.primary, name: "checkmark", size: 18 })) : null] }, String(option.value)));
39
- }) })] }) }) }) })] }));
51
+ }, style: accessibleSizing ? { minHeight: 48 } : undefined, children: [_jsx(Typography.Text, { className: cn("flex-1 text-sm", isSelected ? "text-text-accent font-semibold" : "text-text-primary"), children: option.label }), isSelected ? (_jsx(Icon, { color: theme.text.accent, name: "checkmark", size: 18 })) : null] }, String(option.value)));
52
+ }) })] })] }) })] }));
40
53
  }
41
54
  export default Select;
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
2
  import RNSlider from "@react-native-community/slider";
3
- import { theme } from "../theme";
4
- import { cn } from "../theme/tw";
5
- import { Typography } from "../Typography";
3
+ import { theme } from "../theme/index.js";
4
+ import { cn } from "../theme/tw.js";
5
+ import { Typography } from "../Typography/index.js";
6
6
  import { View } from "react-native";
7
7
  /**
8
8
  * **Tokenized** slider (track in `primary`) on `@react-native-community/slider` — clean,
@@ -1,9 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
- import { theme } from "../theme";
3
- import { cn } from "../theme/tw";
4
- import { Typography } from "../Typography";
2
+ import { theme } from "../theme/index.js";
3
+ import { cn } from "../theme/tw.js";
4
+ import { Typography } from "../Typography/index.js";
5
5
  import { Switch as RNSwitch, View } from "react-native";
6
6
  function Switch({ value, onValueChange, label, disabled = false, className, testID, }) {
7
- return (_jsxs(View, { className: cn("flex-row items-center justify-between gap-3", className), children: [label ? (_jsx(Typography.Text, { className: cn("flex-1 text-text-primary", disabled && "text-text-disabled"), children: label })) : null, _jsx(RNSwitch, { accessibilityLabel: label, accessibilityRole: "switch", accessibilityState: { checked: value, disabled }, disabled: disabled, ios_backgroundColor: theme.bg.muted, onValueChange: onValueChange, testID: testID, thumbColor: theme.bg.card, trackColor: { false: theme.bg.muted, true: theme.accent }, value: value })] }));
7
+ return (_jsxs(View, { className: cn("flex-row items-center justify-between gap-3", className), children: [label ? (_jsx(Typography.Text, { className: cn("flex-1 text-text-primary", disabled && "text-text-disabled"), children: label })) : null, _jsx(RNSwitch, { accessibilityLabel: label, accessibilityRole: "switch", accessibilityState: { checked: value, disabled }, disabled: disabled, ios_backgroundColor: theme.bg.muted, onValueChange: onValueChange, testID: testID, thumbColor: theme.bg.card, trackColor: { false: theme.bg.muted, true: theme.primary }, value: value })] }));
8
8
  }
9
9
  export default Switch;
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx } from "nativewind/jsx-runtime";
2
- import { theme } from "../theme";
3
- import { cn } from "../theme/tw";
2
+ import { theme } from "../theme/index.js";
3
+ import { cn } from "../theme/tw.js";
4
4
  import { TextInput } from "react-native";
5
5
  const TextInputF = ({ className, ...props }) => {
6
- return (_jsx(TextInput, { ...props, className: cn("border border-input rounded-md h-11 px-3 py-2 text-text-primary", className), placeholderTextColor: theme.text.tertiary, style: props.style }));
6
+ return (_jsx(TextInput, { ...props, className: cn("border border-input rounded-md h-11 px-3 py-2 text-text-primary", className), placeholderTextColor: theme.text.tertiary, selectionColor: theme.primary, style: props.style, underlineColorAndroid: "transparent" }));
7
7
  };
8
8
  export default TextInputF;
@@ -1,33 +1,37 @@
1
- import Checkbox from "../Form/Form.Checkbox";
2
- import ControlledCheckbox from "../Form/Form.ControlledCheckbox";
3
- import ControlledDropdown, { type DropdownOption } from "../Form/Form.ControlledDropdown";
4
- import ControlledInput from "../Form/Form.ControlledInput";
5
- import ControlledMonetaryInput from "../Form/Form.ControlledMonetaryInput";
6
- import ControlledRadioButton from "../Form/Form.ControlledRadioButton";
7
- import DatePicker from "../Form/Form.DatePicker";
8
- import Dropdown from "../Form/Form.Dropdown";
9
- import FAB from "../Form/Form.FAB";
10
- import { FilterButtonGroup } from "../Form/Form.FilterButton";
11
- import FractionalQuantityInput from "../Form/Form.FractionalQuantityInput";
12
- import IconButton from "../Form/Form.IconButton";
13
- import Input from "../Form/Form.Input";
14
- import MonetaryInput from "../Form/Form.MonetaryInput";
15
- import PinInput from "../Form/Form.PinInput";
16
- import QuantitySelector from "../Form/Form.QuantitySelector";
17
- import RadioButton from "../Form/Form.RadioButton";
18
- import SearchBar from "../Form/Form.SearchBar";
19
- import Select from "../Form/Form.Select";
20
- import Slider from "../Form/Form.Slider";
21
- import Switch from "../Form/Form.Switch";
1
+ import Checkbox from "./Form.Checkbox.js";
2
+ import ControlledCheckbox from "./Form.ControlledCheckbox.js";
3
+ import ControlledDropdown, { type DropdownOption } from "./Form.ControlledDropdown.js";
4
+ import ControlledInput from "./Form.ControlledInput.js";
5
+ import ControlledMonetaryInput from "./Form.ControlledMonetaryInput.js";
6
+ import ControlledRadioButton from "./Form.ControlledRadioButton.js";
7
+ import DatePicker from "./Form.DatePicker.js";
8
+ import Dropdown from "./Form.Dropdown.js";
9
+ import FAB from "./Form.FAB.js";
10
+ import { FilterButtonGroup } from "./Form.FilterButton.js";
11
+ import FractionalQuantityInput from "./Form.FractionalQuantityInput.js";
12
+ import IconButton from "./Form.IconButton.js";
13
+ import Input from "./Form.Input.js";
14
+ import KeyboardForm from "./Form.KeyboardForm.js";
15
+ import KeyboardToolbar from "./Form.KeyboardToolbar.js";
16
+ import MonetaryInput from "./Form.MonetaryInput.js";
17
+ import PinInput from "./Form.PinInput.js";
18
+ import QuantitySelector from "./Form.QuantitySelector.js";
19
+ import RadioButton from "./Form.RadioButton.js";
20
+ import SearchBar from "./Form.SearchBar.js";
21
+ import Select from "./Form.Select.js";
22
+ import Slider from "./Form.Slider.js";
23
+ import Switch from "./Form.Switch.js";
22
24
  export declare const Form: {
23
- TextInput: import("react").FC<import("../Form/Form.TextInput").TextInputFProps>;
25
+ TextInput: import("react").FC<import("./Form.TextInput.js").TextInputFProps>;
24
26
  Input: typeof Input;
25
- InputField: import("react").FC<import("../Form/Form.InputField").InputFieldProps>;
26
- Button: import("react").FC<import("../Form/Form.Button").ButtonProps> & {
27
- Icon: import("react").FC<import("../Form/Form.Button").ButtonIconProps>;
27
+ InputField: import("react").FC<import("./Form.InputField.js").InputFieldProps>;
28
+ KeyboardForm: typeof KeyboardForm;
29
+ KeyboardToolbar: typeof KeyboardToolbar;
30
+ Button: import("react").FC<import("./Form.Button.js").ButtonProps> & {
31
+ Icon: import("react").FC<import("./Form.Button.js").ButtonIconProps>;
28
32
  };
29
33
  IconButton: typeof IconButton;
30
- PasswordInput: import("react").FC<import("../Form/Form.PasswordInput").PasswordFieldProps>;
34
+ PasswordInput: import("react").FC<import("./Form.PasswordInput.js").PasswordFieldProps>;
31
35
  QuantitySelector: typeof QuantitySelector;
32
36
  FractionalQuantityInput: typeof FractionalQuantityInput;
33
37
  RadioButton: typeof RadioButton;
@@ -46,8 +50,10 @@ export declare const Form: {
46
50
  ControlledCheckbox: typeof ControlledCheckbox;
47
51
  ControlledDropdown: typeof ControlledDropdown;
48
52
  ControlledMonetaryInput: typeof ControlledMonetaryInput;
49
- FilterButton: import("react").FC<import("../Form/Form.FilterButton").FilterButtonProps>;
53
+ FilterButton: import("react").FC<import("./Form.FilterButton.js").FilterButtonProps>;
50
54
  FilterButtonGroup: typeof FilterButtonGroup;
51
55
  };
52
56
  export { type DropdownOption };
57
+ export type { KeyboardFormProps } from "./Form.KeyboardForm.js";
58
+ export type { KeyboardToolbarAction, KeyboardToolbarProps, } from "./Form.KeyboardToolbar.js";
53
59
  export default Form;
@@ -1,32 +1,36 @@
1
- import ButtonWithIcon from "../Form/Form.Button";
2
- import Checkbox from "../Form/Form.Checkbox";
3
- import ControlledCheckbox from "../Form/Form.ControlledCheckbox";
4
- import ControlledDropdown from "../Form/Form.ControlledDropdown";
5
- import ControlledInput from "../Form/Form.ControlledInput";
6
- import ControlledMonetaryInput from "../Form/Form.ControlledMonetaryInput";
7
- import ControlledRadioButton from "../Form/Form.ControlledRadioButton";
8
- import DatePicker from "../Form/Form.DatePicker";
9
- import Dropdown from "../Form/Form.Dropdown";
10
- import FAB from "../Form/Form.FAB";
11
- import { FilterButton, FilterButtonGroup } from "../Form/Form.FilterButton";
12
- import FractionalQuantityInput from "../Form/Form.FractionalQuantityInput";
13
- import IconButton from "../Form/Form.IconButton";
14
- import Input from "../Form/Form.Input";
15
- import InputField from "../Form/Form.InputField";
16
- import MonetaryInput from "../Form/Form.MonetaryInput";
17
- import PasswordInput from "../Form/Form.PasswordInput";
18
- import PinInput from "../Form/Form.PinInput";
19
- import QuantitySelector from "../Form/Form.QuantitySelector";
20
- import RadioButton from "../Form/Form.RadioButton";
21
- import SearchBar from "../Form/Form.SearchBar";
22
- import Select from "../Form/Form.Select";
23
- import Slider from "../Form/Form.Slider";
24
- import Switch from "../Form/Form.Switch";
25
- import TextInput from "../Form/Form.TextInput";
1
+ import ButtonWithIcon from "./Form.Button.js";
2
+ import Checkbox from "./Form.Checkbox.js";
3
+ import ControlledCheckbox from "./Form.ControlledCheckbox.js";
4
+ import ControlledDropdown from "./Form.ControlledDropdown.js";
5
+ import ControlledInput from "./Form.ControlledInput.js";
6
+ import ControlledMonetaryInput from "./Form.ControlledMonetaryInput.js";
7
+ import ControlledRadioButton from "./Form.ControlledRadioButton.js";
8
+ import DatePicker from "./Form.DatePicker.js";
9
+ import Dropdown from "./Form.Dropdown.js";
10
+ import FAB from "./Form.FAB.js";
11
+ import { FilterButton, FilterButtonGroup } from "./Form.FilterButton.js";
12
+ import FractionalQuantityInput from "./Form.FractionalQuantityInput.js";
13
+ import IconButton from "./Form.IconButton.js";
14
+ import Input from "./Form.Input.js";
15
+ import InputField from "./Form.InputField.js";
16
+ import KeyboardForm from "./Form.KeyboardForm.js";
17
+ import KeyboardToolbar from "./Form.KeyboardToolbar.js";
18
+ import MonetaryInput from "./Form.MonetaryInput.js";
19
+ import PasswordInput from "./Form.PasswordInput.js";
20
+ import PinInput from "./Form.PinInput.js";
21
+ import QuantitySelector from "./Form.QuantitySelector.js";
22
+ import RadioButton from "./Form.RadioButton.js";
23
+ import SearchBar from "./Form.SearchBar.js";
24
+ import Select from "./Form.Select.js";
25
+ import Slider from "./Form.Slider.js";
26
+ import Switch from "./Form.Switch.js";
27
+ import TextInput from "./Form.TextInput.js";
26
28
  export const Form = {
27
29
  TextInput,
28
30
  Input,
29
31
  InputField,
32
+ KeyboardForm,
33
+ KeyboardToolbar,
30
34
  Button: ButtonWithIcon,
31
35
  IconButton,
32
36
  PasswordInput,