@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,5 +1,5 @@
1
- import { type GradientPreset } from "../Display/Display.GradientSurface";
2
- import { type PatternKind } from "../Display/Display.Pattern";
1
+ import { type GradientPreset } from "../Display/Display.GradientSurface.js";
2
+ import { type PatternKind } from "../Display/Display.Pattern.js";
3
3
  import type { LinearGradientPoint } from "expo-linear-gradient";
4
4
  import type { ReactNode } from "react";
5
5
  export interface AppBarActionProps {
@@ -16,6 +16,8 @@ export interface AppBarActionProps {
16
16
  onDark?: boolean;
17
17
  /** Drop the contained surface → bare icon/text (iOS-style plain back/action). */
18
18
  bare?: boolean;
19
+ /** Increase the action target to 48 points. */
20
+ accessibleSizing?: boolean;
19
21
  testID?: string;
20
22
  }
21
23
  /**
@@ -23,7 +25,7 @@ export interface AppBarActionProps {
23
25
  * (merge of Material 3 state-layer + iOS 26 contained button). Optional badge.
24
26
  * With `label`, renders a text pill CTA instead (for "Editar"/"Nuevo"/"Guardar").
25
27
  */
26
- declare function AppBarAction({ icon, label, onPress, badge, accessibilityLabel, tone, onDark, bare, testID, }: AppBarActionProps): import("react").JSX.Element;
28
+ declare function AppBarAction({ icon, label, onPress, badge, accessibilityLabel, tone, onDark, bare, accessibleSizing, testID, }: AppBarActionProps): import("react").JSX.Element;
27
29
  export interface AppBarProps {
28
30
  title?: string;
29
31
  subtitle?: string;
@@ -47,6 +49,8 @@ export interface AppBarProps {
47
49
  border?: boolean;
48
50
  /** Reserves the status-bar space (insets.top). `false` to embed/demo. */
49
51
  safeArea?: boolean;
52
+ /** Increase the back-action target to 48 points. */
53
+ accessibleSizing?: boolean;
50
54
  /**
51
55
  * [large variant] Extra top padding (px) above the large title row.
52
56
  * Default is 8. Use ~16–24 on root/home screens without a back button.
@@ -57,7 +61,7 @@ export interface AppBarProps {
57
61
  * (no need to also set `tone="dark"`). Overrides the solid `tone` background.
58
62
  *
59
63
  * Preset: `background={{ surface: "mesh" }}`
60
- * Custom: `background={{ colors: ["#0B1410", "#10B981", "#1E1B8A"] }}`
64
+ * Custom: `background={{ colors: ["#4A3100", "#C9A84C", "#8B6914", "#F0D060"] }}`
61
65
  * With texture: `background={{ surface: "night-green", pattern: "dots" }}`
62
66
  */
63
67
  background?: AppBarBackground;
@@ -78,7 +82,8 @@ export interface AppBarProps {
78
82
  * Pass as the `background` prop — white text/icons are activated automatically.
79
83
  */
80
84
  export interface AppBarBackground {
81
- /** Named gradient preset: `"mesh"` (dark aurora), `"night-green"`, `"neon-teal"`, `"emerald"`. */
85
+ /** Named gradient preset: `"warm"` (default), or `"brand"` (themeable). Legacy
86
+ * `"mesh" | "neon-teal" | "night-green" | "emerald"` presets still work but are deprecated. */
82
87
  surface?: GradientPreset;
83
88
  /** Custom color stops — overrides `surface`. Minimum 2 colors. */
84
89
  colors?: readonly [string, string, ...string[]];
@@ -108,7 +113,7 @@ export interface AppBarBackground {
108
113
  * a `subheader` slot (for SearchBar/Segmented below the title), and a `large` variant.
109
114
  * Replaces the gradient look of `Navigation.Header`/`ScreenHeader`.
110
115
  */
111
- declare function AppBar({ title, subtitle, onBack, leading, actions, subheader, variant, tone, accentBar, backVariant, border, safeArea, topSpacing, background, bottomDivider, className, testID, }: AppBarProps): import("react").JSX.Element;
116
+ declare function AppBar({ title, subtitle, onBack, leading, actions, subheader, variant, tone, accentBar, backVariant, border, safeArea, accessibleSizing, topSpacing, background, bottomDivider, className, testID, }: AppBarProps): import("react").JSX.Element;
112
117
  declare const AppBarWithAction: typeof AppBar & {
113
118
  Action: typeof AppBarAction;
114
119
  };
@@ -1,11 +1,11 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
- import GradientSurface from "../Display/Display.GradientSurface";
3
- import Icon from "../Display/Display.Icon";
4
- import { Pattern } from "../Display/Display.Pattern";
5
- import Pressable from "../primitives/Pressable";
6
- import { useTheme } from "../theme";
7
- import { cn } from "../theme/tw";
8
- import { Typography } from "../Typography";
2
+ import GradientSurface from "../Display/Display.GradientSurface.js";
3
+ import Icon from "../Display/Display.Icon.js";
4
+ import { Pattern } from "../Display/Display.Pattern.js";
5
+ import Pressable from "../primitives/Pressable.js";
6
+ import { useTheme } from "../theme/index.js";
7
+ import { cn } from "../theme/tw.js";
8
+ import { Typography } from "../Typography/index.js";
9
9
  import { StyleSheet, View } from "react-native";
10
10
  import { useSafeAreaInsets } from "react-native-safe-area-context";
11
11
  /** Fallback for the `tone="dark"` hero surface when the theme has no `bg.inverse` token. */
@@ -15,14 +15,14 @@ const HERO_DARK_FALLBACK = "#0E1714";
15
15
  * (merge of Material 3 state-layer + iOS 26 contained button). Optional badge.
16
16
  * With `label`, renders a text pill CTA instead (for "Editar"/"Nuevo"/"Guardar").
17
17
  */
18
- function AppBarAction({ icon, label, onPress, badge, accessibilityLabel, tone = "plain", onDark = false, bare = false, testID, }) {
18
+ function AppBarAction({ icon, label, onPress, badge, accessibilityLabel, tone = "plain", onDark = false, bare = false, accessibleSizing = false, testID, }) {
19
19
  const theme = useTheme();
20
20
  const bg = bare
21
21
  ? "transparent"
22
22
  : onDark
23
23
  ? "rgba(255,255,255,0.14)"
24
24
  : tone === "tinted"
25
- ? theme.accent // solid brand-green squircle (FAB-style)
25
+ ? theme.accent // solid brand-gold squircle (FAB-style)
26
26
  : theme.bg.card;
27
27
  const iconColor = tone === "tinted"
28
28
  ? theme.text.onAccent // dark token on green surface
@@ -35,7 +35,7 @@ function AppBarAction({ icon, label, onPress, badge, accessibilityLabel, tone =
35
35
  // primary/secondary header actions like "Editar", "Nuevo", "Guardar".
36
36
  if (label) {
37
37
  return (_jsxs(Pressable, { accessibilityLabel: accessibilityLabel ?? label, accessibilityRole: "button", className: "flex-row items-center justify-center gap-1.5", hitSlop: 6, onPress: onPress, style: {
38
- height: 36,
38
+ height: accessibleSizing ? 48 : 36,
39
39
  paddingHorizontal: 14,
40
40
  borderRadius: 999,
41
41
  backgroundColor: bg,
@@ -43,8 +43,8 @@ function AppBarAction({ icon, label, onPress, badge, accessibilityLabel, tone =
43
43
  }, testID: testID, children: [icon ? _jsx(Icon, { color: iconColor, name: icon, size: 16 }) : null, _jsx(Typography.Text, { semibold: true, style: { color: iconColor }, variant: "bodySmall", children: label })] }));
44
44
  }
45
45
  return (_jsxs(Pressable, { accessibilityLabel: accessibilityLabel, accessibilityRole: "button", className: "items-center justify-center", hitSlop: 6, onPress: onPress, style: {
46
- width: 40,
47
- height: 40,
46
+ width: accessibleSizing ? 48 : 40,
47
+ height: accessibleSizing ? 48 : 40,
48
48
  borderRadius: 12,
49
49
  backgroundColor: bg,
50
50
  ...(showBorder ? { borderWidth: 1, borderColor: theme.border.light } : null),
@@ -56,7 +56,7 @@ function AppBarAction({ icon, label, onPress, badge, accessibilityLabel, tone =
56
56
  * a `subheader` slot (for SearchBar/Segmented below the title), and a `large` variant.
57
57
  * Replaces the gradient look of `Navigation.Header`/`ScreenHeader`.
58
58
  */
59
- function AppBar({ title, subtitle, onBack, leading, actions, subheader, variant = "default", tone = "default", accentBar = false, backVariant = "contained", border = true, safeArea = true, topSpacing, background, bottomDivider, className, testID, }) {
59
+ function AppBar({ title, subtitle, onBack, leading, actions, subheader, variant = "default", tone = "default", accentBar = false, backVariant = "contained", border = true, safeArea = true, accessibleSizing = false, topSpacing, background, bottomDivider, className, testID, }) {
60
60
  const theme = useTheme();
61
61
  const insets = useSafeAreaInsets();
62
62
  const centered = variant === "center";
@@ -71,7 +71,7 @@ function AppBar({ title, subtitle, onBack, leading, actions, subheader, variant
71
71
  const showTopBar = !large;
72
72
  // Colored = any rich surface. `background` alone activates colored mode (white text/icons).
73
73
  const colored = dark || gradient || hasBackground;
74
- // gradient (neon green) → dark text via onAccent. background → textColor prop (default white, since
74
+ // gradient (brand gold) → dark text via onAccent. background → textColor prop (default white, since
75
75
  // gradient surfaces are dark). dark tone → white always. text.inverse is NOT used here: it flips to
76
76
  // near-black in dark-mode themes (semantic: "text on light surfaces"), wrong for dark gradient AppBars.
77
77
  const onColoredText = gradient && !hasBackground
@@ -106,13 +106,13 @@ function AppBar({ title, subtitle, onBack, leading, actions, subheader, variant
106
106
  ? { borderBottomLeftRadius: 24, borderBottomRightRadius: 24, overflow: "hidden" }
107
107
  : null),
108
108
  ...(showShadow ? theme.shadow.md : null),
109
- }, testID: testID, children: [hasBackground ? (_jsx(GradientSurface, { colors: background.colors, end: background.end, padding: "none", preset: background.surface ?? "neon-teal", radius: "none", start: background.start, style: StyleSheet.absoluteFill })) : gradient ? (_jsx(GradientSurface, { colors: theme.gradient.accent, padding: "none", radius: "none", style: StyleSheet.absoluteFill })) : null, background?.pattern ? (_jsx(Pattern, { color: background.patternColor ?? "#FFFFFF", kind: background.pattern, opacity: background.patternOpacity ?? 0.18 })) : null, showTopBar ? (_jsxs(View, { className: "flex-row items-center px-3 gap-2 min-h-[56px]", children: [_jsxs(View, { className: "flex-row items-center gap-2", style: { minWidth: 38 }, children: [onBack ? (_jsx(AppBarAction, { accessibilityLabel: "Volver", bare: backVariant === "plain", icon: "chevron-back", onDark: dark || gradient || hasBackground, onPress: onBack })) : null, leading] }), _jsxs(View, { className: cn("flex-1", centered && "items-center"), children: [title ? (_jsx(Typography.Text, { className: colored ? "" : "text-text-primary", numberOfLines: 1, semibold: true, style: titleStyle, variant: "subtitle", children: title })) : null, subtitle ? (_jsx(Typography.Text, { className: colored ? "" : "text-text-secondary", numberOfLines: 1, style: subtitleStyle, variant: "caption", children: subtitle })) : null] }), _jsx(View, { className: "flex-row items-center justify-end gap-2", style: { minWidth: 38 }, children: actions })] })) : null, large && title ? (_jsxs(View, { className: cn("flex-row px-4 pb-3", largeHasNav ? "items-center gap-2" : ""), style: { paddingTop: topSpacing != null ? topSpacing : 8 }, children: [onBack ? (_jsx(AppBarAction, { accessibilityLabel: "Volver", bare: backVariant === "plain", icon: "chevron-back", onDark: dark || gradient || hasBackground, onPress: onBack })) : null, leading, accentBar && !largeHasNav ? (_jsx(View, { style: {
109
+ }, testID: testID, children: [hasBackground ? (_jsx(GradientSurface, { colors: background.colors, end: background.end, padding: "none", preset: background.surface ?? "warm", radius: "none", start: background.start, style: StyleSheet.absoluteFill })) : gradient ? (_jsx(GradientSurface, { colors: theme.gradient.accent, padding: "none", radius: "none", style: StyleSheet.absoluteFill })) : null, background?.pattern ? (_jsx(Pattern, { color: background.patternColor ?? "#FFFFFF", kind: background.pattern, opacity: background.patternOpacity ?? 0.18 })) : null, showTopBar ? (_jsxs(View, { className: "flex-row items-center px-3 gap-2 min-h-[56px]", children: [_jsxs(View, { className: "flex-row items-center gap-2", style: { minWidth: 38 }, children: [onBack ? (_jsx(AppBarAction, { accessibilityLabel: "Volver", accessibleSizing: accessibleSizing, bare: backVariant === "plain", icon: "chevron-back", onDark: dark || gradient || hasBackground, onPress: onBack })) : null, leading] }), _jsxs(View, { className: cn("flex-1", centered && "items-center"), children: [title ? (_jsx(Typography.Text, { accessibilityRole: "header", className: colored ? "" : "text-text-primary", numberOfLines: 1, semibold: true, style: titleStyle, variant: "subtitle", children: title })) : null, subtitle ? (_jsx(Typography.Text, { className: colored ? "" : "text-text-secondary", numberOfLines: 1, style: subtitleStyle, variant: "caption", children: subtitle })) : null] }), _jsx(View, { className: "flex-row items-center justify-end gap-2", style: { minWidth: 38 }, children: actions })] })) : null, large && title ? (_jsxs(View, { className: cn("flex-row px-4 pb-3", largeHasNav ? "items-center gap-2" : ""), style: { paddingTop: topSpacing != null ? topSpacing : 8 }, children: [onBack ? (_jsx(AppBarAction, { accessibilityLabel: "Volver", accessibleSizing: accessibleSizing, bare: backVariant === "plain", icon: "chevron-back", onDark: dark || gradient || hasBackground, onPress: onBack })) : null, leading, accentBar && !largeHasNav ? (_jsx(View, { style: {
110
110
  width: 4,
111
111
  marginRight: 10,
112
112
  marginVertical: 2,
113
113
  borderRadius: 999,
114
114
  backgroundColor: theme.accent,
115
- } })) : null, _jsxs(View, { className: "flex-1", children: [_jsx(Typography.Text, { className: colored ? "" : "text-text-primary", style: titleStyle, variant: "h2", children: title }), subtitle ? (_jsx(Typography.Text, { className: colored ? "" : "text-text-secondary", style: subtitleStyle, variant: "bodySmall", children: subtitle })) : null] }), actions ? (_jsx(View, { className: cn("flex-row items-center justify-end gap-2 pl-2", largeHasNav ? "" : "self-center"), children: actions })) : null] })) : null, subheader ? _jsx(View, { className: "px-3 pb-3 pt-0.5", children: subheader }) : null, showWave ? (_jsx(View, { style: {
115
+ } })) : null, _jsxs(View, { className: "flex-1", children: [_jsx(Typography.Text, { accessibilityRole: "header", className: colored ? "" : "text-text-primary", style: titleStyle, variant: "h2", children: title }), subtitle ? (_jsx(Typography.Text, { className: colored ? "" : "text-text-secondary", style: subtitleStyle, variant: "bodySmall", children: subtitle })) : null] }), actions ? (_jsx(View, { className: cn("flex-row items-center justify-end gap-2 pl-2", largeHasNav ? "" : "self-center"), children: actions })) : null] })) : null, subheader ? _jsx(View, { className: "px-3 pb-3 pt-0.5", children: subheader }) : null, showWave ? (_jsx(View, { style: {
116
116
  height: 24,
117
117
  backgroundColor: theme.bg.page,
118
118
  borderTopLeftRadius: 24,
@@ -1,4 +1,4 @@
1
- import type { CustomIconProps } from "../icons/props";
1
+ import type { CustomIconProps } from "../icons/props.js";
2
2
  import type { ComponentType } from "react";
3
3
  export interface BottomNavItem {
4
4
  key: string;
@@ -44,6 +44,8 @@ export interface BottomNavProps {
44
44
  bordered?: boolean;
45
45
  /** Token for the active color. `primary` (default) or `accent` (e.g. green CTA brand). */
46
46
  activeColor?: "primary" | "accent";
47
+ /** Increase each tab's target to at least 48 points. */
48
+ accessibleSizing?: boolean;
47
49
  className?: string;
48
50
  testID?: string;
49
51
  }
@@ -52,6 +54,6 @@ export interface BottomNavProps {
52
54
  * `shape` (bar/floating), `tone` (light/dark), `indicator` (none/pill/pill-text/bar/glow),
53
55
  * `showLabels`, `centerAction` (FAB), `activeColor`. Replaces the legacy `TabNavigatorLayout`.
54
56
  */
55
- declare function BottomNav({ items, value, onChange, showLabels, centerAction, safeArea, shape, tone, indicator, bordered, activeColor, className, testID, }: BottomNavProps): import("react").JSX.Element;
57
+ declare function BottomNav({ items, value, onChange, showLabels, centerAction, safeArea, shape, tone, indicator, bordered, activeColor, accessibleSizing, className, testID, }: BottomNavProps): import("react").JSX.Element;
56
58
  export default BottomNav;
57
59
  export { BottomNav };
@@ -1,27 +1,32 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "nativewind/jsx-runtime";
2
- import Icon from "../Display/Display.Icon";
3
- import Pressable from "../primitives/Pressable";
4
- import { useTheme } 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 { relativeLuminance, useTheme } from "../theme/index.js";
5
+ import { cn } from "../theme/tw.js";
6
+ import { Typography } from "../Typography/index.js";
7
7
  import { View } from "react-native";
8
8
  import { useSafeAreaInsets } from "react-native-safe-area-context";
9
- const DARK_SURFACE = "#15181B";
9
+ /** Forced-dark chrome: prefer `bg.inverse` when it is actually dark, else `bg.card`. */
10
+ function resolveDarkSurface(theme) {
11
+ const candidate = theme.bg.inverse ?? theme.bg.card;
12
+ return relativeLuminance(candidate) < 0.25 ? candidate : theme.bg.card;
13
+ }
10
14
  /**
11
15
  * The single bottom-navigation component. Extensible by props, not by forking:
12
16
  * `shape` (bar/floating), `tone` (light/dark), `indicator` (none/pill/pill-text/bar/glow),
13
17
  * `showLabels`, `centerAction` (FAB), `activeColor`. Replaces the legacy `TabNavigatorLayout`.
14
18
  */
15
- function BottomNav({ items, value, onChange, showLabels = true, centerAction, safeArea = true, shape = "bar", tone = "light", indicator = "none", bordered = true, activeColor = "primary", className, testID, }) {
19
+ function BottomNav({ items, value, onChange, showLabels = true, centerAction, safeArea = true, shape = "bar", tone = "light", indicator = "none", bordered = true, activeColor = "primary", accessibleSizing = false, className, testID, }) {
16
20
  const insets = useSafeAreaInsets();
17
21
  const theme = useTheme();
18
22
  const dark = tone === "dark";
19
23
  const rounded = shape === "floating" || dark;
20
24
  const bottomPad = rounded ? 6 : safeArea ? insets.bottom : 0;
21
25
  const activeTint = activeColor === "accent" ? theme.accent : theme.primary;
22
- const onActive = activeColor === "accent" ? theme.text.onAccent : theme.icon.inverse;
26
+ const onActive = activeColor === "accent" ? theme.text.onAccent : theme.text.onPrimary;
27
+ const brandText = theme.text.accent;
23
28
  const inactiveColor = dark ? "rgba(255,255,255,0.55)" : theme.icon.secondary;
24
- const surfaceColor = dark ? DARK_SURFACE : theme.bg.card;
29
+ const surfaceColor = dark ? resolveDarkSurface(theme) : theme.bg.card;
25
30
  const containerStyle = rounded
26
31
  ? {
27
32
  borderRadius: 32,
@@ -47,21 +52,29 @@ function BottomNav({ items, value, onChange, showLabels = true, centerAction, sa
47
52
  // Variant A — extended pill with text (active = horizontal pill, inactive = icon only).
48
53
  if (indicator === "pill-text") {
49
54
  if (active) {
50
- return (_jsxs(Pressable, { accessibilityLabel: item.label ?? item.key, accessibilityRole: "tab", accessibilityState: { selected: true }, className: "flex-row items-center px-4 py-2", onPress: () => onChange(item.key), style: { borderRadius: 999, backgroundColor: activeTint }, children: [renderIconNode(item, true, onActive), item.label ? (_jsx(Typography.Text, { semibold: true, style: { color: onActive, fontSize: 13, marginLeft: 8 }, children: item.label })) : null] }, item.key));
55
+ return (_jsxs(Pressable, { accessibilityLabel: item.label ?? item.key, accessibilityRole: "tab", accessibilityState: { selected: true }, className: "flex-row items-center px-4 py-2", onPress: () => onChange(item.key), style: {
56
+ borderRadius: 999,
57
+ backgroundColor: activeTint,
58
+ ...(accessibleSizing ? { minHeight: 48, minWidth: 48 } : null),
59
+ }, children: [renderIconNode(item, true, onActive), item.label ? (_jsx(Typography.Text, { semibold: true, style: { color: onActive, fontSize: 13, marginLeft: 8 }, children: item.label })) : null] }, item.key));
51
60
  }
52
- return (_jsx(Pressable, { accessibilityLabel: item.label ?? item.key, accessibilityRole: "tab", className: "items-center justify-center px-3 py-2", onPress: () => onChange(item.key), children: renderIconNode(item, false, inactiveColor) }, item.key));
61
+ return (_jsx(Pressable, { accessibilityLabel: item.label ?? item.key, accessibilityRole: "tab", className: "items-center justify-center px-3 py-2", onPress: () => onChange(item.key), style: accessibleSizing ? { minHeight: 48, minWidth: 48 } : undefined, children: renderIconNode(item, false, inactiveColor) }, item.key));
53
62
  }
54
63
  // Variants none / pill / bar / glow — vertical icon + optional indicator + optional label.
55
64
  const inPill = indicator === "pill" && active;
56
- const iconColor = inPill
57
- ? onActive
58
- : active
59
- ? indicator === "glow"
60
- ? activeTint
61
- : activeTint
62
- : inactiveColor;
63
- const labelColor = active ? (dark ? "#FFFFFF" : activeTint) : inactiveColor;
64
- return (_jsxs(Pressable, { accessibilityLabel: item.label ?? item.key, accessibilityRole: "tab", accessibilityState: { selected: active }, className: "flex-1 items-center justify-center py-1.5", onPress: () => onChange(item.key), children: [indicator === "bar" && active ? (_jsx(View, { style: {
65
+ let iconColor = inactiveColor;
66
+ if (inPill)
67
+ iconColor = onActive;
68
+ else if (active)
69
+ iconColor = brandText;
70
+ let labelColor = inactiveColor;
71
+ if (active && inPill)
72
+ labelColor = onActive;
73
+ else if (active && dark)
74
+ labelColor = theme.text.inverse;
75
+ else if (active)
76
+ labelColor = brandText;
77
+ return (_jsxs(Pressable, { accessibilityLabel: item.label ?? item.key, accessibilityRole: "tab", accessibilityState: { selected: active }, className: "flex-1 items-center justify-center py-1.5", onPress: () => onChange(item.key), style: accessibleSizing ? { minHeight: 48, minWidth: 48 } : undefined, children: [indicator === "bar" && active ? (_jsx(View, { style: {
65
78
  position: "absolute",
66
79
  top: 0,
67
80
  width: 26,
@@ -103,7 +116,7 @@ function BottomNav({ items, value, onChange, showLabels = true, centerAction, sa
103
116
  content = items.map(renderItem);
104
117
  }
105
118
  const justify = indicator === "pill-text" ? "justify-around" : "";
106
- return (_jsx(View, { className: cn("flex-row items-center", justify, className), style: containerStyle, testID: testID, children: content }));
119
+ return (_jsx(View, { accessibilityRole: "tablist", className: cn("flex-row items-center", justify, className), style: containerStyle, testID: testID, children: content }));
107
120
  }
108
121
  export default BottomNav;
109
122
  export { BottomNav };
@@ -1,4 +1,4 @@
1
- import { type AppBarActionProps } from "../Navigation/Navigation.AppBar";
1
+ import { type AppBarActionProps } from "./Navigation.AppBar.js";
2
2
  import type { ReactNode } from "react";
3
3
  import { Animated } from "react-native";
4
4
  export interface CollapsingHeaderProps {
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
- import AppBar from "../Navigation/Navigation.AppBar";
3
- import { theme } from "../theme";
4
- import { Typography } from "../Typography";
2
+ import AppBar from "./Navigation.AppBar.js";
3
+ import { theme } from "../theme/index.js";
4
+ import { Typography } from "../Typography/index.js";
5
5
  import { Animated, View } from "react-native";
6
6
  import { useSafeAreaInsets } from "react-native-safe-area-context";
7
7
  /**
@@ -1,6 +1,6 @@
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 { View } from "react-native";
5
5
  import { useSafeAreaInsets } from "react-native-safe-area-context";
6
6
  /**
@@ -1,10 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
- import Icon from "../Display/Display.Icon";
3
- import Logo from "../Display/Display.Logo";
4
- import GradientContainer from "../layouts/GradientContainer";
5
- import { theme } from "../theme";
6
- import { cn } from "../theme/tw";
7
- import { Typography } from "../Typography";
2
+ import Icon from "../Display/Display.Icon.js";
3
+ import Logo from "../Display/Display.Logo.js";
4
+ import GradientContainer from "../layouts/GradientContainer.js";
5
+ import { theme } from "../theme/index.js";
6
+ import { cn } from "../theme/tw.js";
7
+ import { Typography } from "../Typography/index.js";
8
8
  import { TouchableOpacity, View } from "react-native";
9
9
  /**
10
10
  * @deprecated Legacy style (forced gradient via `GradientContainer`). Use
@@ -1,9 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "nativewind/jsx-runtime";
2
- import { Display } from "../Display";
3
- import GradientContainer from "../layouts/GradientContainer";
4
- import { theme } from "../theme";
5
- import { cn } from "../theme/tw";
6
- import { Typography } from "../Typography";
2
+ import { Display } from "../Display/index.js";
3
+ import GradientContainer from "../layouts/GradientContainer.js";
4
+ import { theme } from "../theme/index.js";
5
+ import { cn } from "../theme/tw.js";
6
+ import { Typography } from "../Typography/index.js";
7
7
  import { TouchableOpacity, View } from "react-native";
8
8
  const Icon = Display.Icon;
9
9
  const Text = Typography.Text;
@@ -1,11 +1,11 @@
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 { useTheme } 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 { useTheme } from "../theme/index.js";
5
+ import { cn } from "../theme/tw.js";
6
+ import { Typography } from "../Typography/index.js";
7
7
  import { cloneElement, useRef, useState } from "react";
8
- import { Dimensions, Modal, Pressable as RNPressable, View } from "react-native";
8
+ import { Dimensions, Modal, Pressable as RNPressable, View, } from "react-native";
9
9
  function Menu({ items, trigger, menuWidth = 220, testID }) {
10
10
  const theme = useTheme();
11
11
  const triggerRef = useRef(null);
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
- import { useTheme } from "../theme";
3
- import { Typography } from "../Typography";
2
+ import { useTheme } from "../theme/index.js";
3
+ import { Typography } from "../Typography/index.js";
4
4
  import { View } from "react-native";
5
5
  /**
6
6
  * Titled card that groups `Display.MenuButton` rows into a visual section.
@@ -1,5 +1,5 @@
1
- import { IRowItemProps } from "../views/types/IListView";
2
- declare function RowItem({ item, className }: IRowItemProps<any> & {
1
+ import { IRowItemProps } from "../views/types/IListView.js";
2
+ declare function RowItem({ item, className, onPress, readonly, }: IRowItemProps<any> & {
3
3
  className?: string;
4
4
  }): import("react").JSX.Element;
5
5
  export default RowItem;
@@ -1,11 +1,11 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
- import { cn } from "../theme/tw";
3
- import { Typography } from "../Typography";
2
+ import { cn } from "../theme/tw.js";
3
+ import { Typography } from "../Typography/index.js";
4
4
  import { TouchableOpacity, View } from "react-native";
5
- function RowItem({ item, className }) {
5
+ function RowItem({ item, className, onPress = item.onPress, readonly = item.readonly, }) {
6
6
  function rowContent() {
7
7
  return (_jsxs(View, { className: "flex-1", children: [_jsx(Typography.Text, { className: "flex-1", variant: "title", children: item.rowTitle }), _jsx(Typography.Text, { className: "mt-0.5 text-text-secondary", variant: "bodySmall", children: item.rowSubtitle })] }));
8
8
  }
9
- return item.readonly ? (_jsx(View, { className: cn("flex-row items-center py-2.5", className), children: rowContent() })) : (_jsx(TouchableOpacity, { className: cn("flex-row items-center py-2.5", className), onPress: item.onPress, children: rowContent() }));
9
+ return readonly ? (_jsx(View, { className: cn("flex-row items-center py-2.5", className), children: rowContent() })) : (_jsx(TouchableOpacity, { className: cn("flex-row items-center py-2.5", className), onPress: onPress, children: rowContent() }));
10
10
  }
11
11
  export default RowItem;
@@ -1,3 +1,4 @@
1
+ import { type SearchSuggestionsProps } from "./Navigation.SearchSuggestions.js";
1
2
  export interface SearchBarProps {
2
3
  value: string;
3
4
  onChangeText: (value: string) => void;
@@ -9,10 +10,14 @@ export interface SearchBarProps {
9
10
  onPress?: () => void;
10
11
  className?: string;
11
12
  testID?: string;
13
+ accessibleSizing?: boolean;
14
+ accessibilityLabel?: string;
15
+ clearAccessibilityLabel?: string;
16
+ suggestions?: SearchSuggestionsProps;
12
17
  }
13
18
  /**
14
19
  * **Pill** search bar (rounded-full), 2026 style (merge of Material 3 + iOS 26).
15
20
  * Use `editable={false}` + `onPress` for a trigger that navigates to the search screen.
16
21
  */
17
- declare function SearchBar({ value, onChangeText, placeholder, onSubmit, onClear, autoFocus, editable, onPress, className, testID, }: SearchBarProps): import("react").JSX.Element;
22
+ declare function SearchBar({ value, onChangeText, placeholder, onSubmit, onClear, autoFocus, editable, onPress, className, testID, accessibleSizing, accessibilityLabel, clearAccessibilityLabel, suggestions, }: SearchBarProps): import("react").JSX.Element;
18
23
  export default SearchBar;
@@ -1,28 +1,49 @@
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 SearchSuggestions from "./Navigation.SearchSuggestions.js";
4
+ import Pressable from "../primitives/Pressable.js";
5
+ import { useTheme } from "../theme/index.js";
6
+ import { cn } from "../theme/tw.js";
7
+ import { resolveTextFontFamily, typographyVariants, } from "../theme/typography.js";
8
+ import { Typography } from "../Typography/index.js";
7
9
  import { useState } from "react";
8
- import { TextInput, View } from "react-native";
10
+ import { Keyboard, TextInput, View } from "react-native";
9
11
  /**
10
12
  * **Pill** search bar (rounded-full), 2026 style (merge of Material 3 + iOS 26).
11
13
  * Use `editable={false}` + `onPress` for a trigger that navigates to the search screen.
12
14
  */
13
- function SearchBar({ value, onChangeText, placeholder = "Buscar", onSubmit, onClear, autoFocus, editable = true, onPress, className, testID, }) {
15
+ function SearchBar({ value, onChangeText, placeholder = "Buscar", onSubmit, onClear, autoFocus, editable = true, onPress, className, testID, accessibleSizing = false, accessibilityLabel, clearAccessibilityLabel = "Limpiar", suggestions, }) {
16
+ const theme = useTheme();
14
17
  const [focused, setFocused] = useState(false);
15
18
  const body = (_jsxs(View, { className: cn("flex-row items-center gap-2 rounded-full px-4", focused ? "bg-bg-card" : "bg-bg-muted", className), style: {
16
- height: 44,
19
+ ...(accessibleSizing ? { minHeight: 48 } : { height: 44 }),
17
20
  borderWidth: 1,
18
21
  borderColor: focused ? theme.border.focus : "transparent",
19
- }, children: [_jsx(Icon, { color: focused ? theme.border.focus : theme.icon.tertiary, name: "search", size: 18 }), editable ? (_jsx(TextInput, { autoFocus: autoFocus, className: "flex-1 text-sm text-text-primary", onBlur: () => setFocused(false), onChangeText: onChangeText, onFocus: () => setFocused(true), onSubmitEditing: (e) => onSubmit?.(e.nativeEvent.text), placeholder: placeholder, placeholderTextColor: theme.text.tertiary, returnKeyType: "search", value: value })) : (_jsx(Typography.Text, { className: "flex-1 text-text-tertiary text-sm", numberOfLines: 1, children: value || placeholder })), editable && value.length > 0 ? (_jsx(Pressable, { accessibilityLabel: "Limpiar", hitSlop: 8, onPress: () => {
22
+ }, children: [_jsx(View, { accessibilityElementsHidden: true, importantForAccessibility: "no-hide-descendants", children: _jsx(Icon, { color: focused ? theme.border.focus : theme.icon.tertiary, name: "search", size: 18 }) }), editable ? (_jsx(TextInput, { accessibilityLabel: accessibilityLabel ?? placeholder, autoFocus: autoFocus, className: cn("flex-1 text-text-primary", !accessibleSizing && "text-sm"), onBlur: () => setFocused(false), onChangeText: onChangeText, onFocus: () => setFocused(true), onSubmitEditing: (e) => onSubmit?.(e.nativeEvent.text), placeholder: placeholder, placeholderTextColor: theme.text.tertiary, returnKeyType: "search", selectionColor: theme.primary, style: accessibleSizing
23
+ ? {
24
+ ...typographyVariants.bodyReadable,
25
+ fontFamily: resolveTextFontFamily("bodyReadable"),
26
+ minHeight: 48,
27
+ paddingVertical: 8,
28
+ }
29
+ : undefined, testID: testID ? `${testID}-input` : undefined, underlineColorAndroid: "transparent", value: value })) : (_jsx(Typography.Text, { className: cn("flex-1 text-text-tertiary", !accessibleSizing && "text-sm"), numberOfLines: accessibleSizing ? undefined : 1, variant: accessibleSizing ? "bodyReadable" : "body", children: value || placeholder })), editable && value.length > 0 ? (_jsx(Pressable, { accessibilityLabel: clearAccessibilityLabel, hitSlop: 8, onPress: () => {
20
30
  onChangeText("");
21
31
  onClear?.();
22
- }, children: _jsx(Icon, { color: theme.icon.tertiary, name: "close-circle", size: 18 }) })) : null] }));
32
+ }, style: accessibleSizing
33
+ ? {
34
+ minHeight: 48,
35
+ minWidth: 48,
36
+ alignItems: "center",
37
+ justifyContent: "center",
38
+ }
39
+ : undefined, children: _jsx(Icon, { color: theme.icon.tertiary, name: "close-circle", size: 18 }) })) : null] }));
23
40
  if (!editable && onPress) {
24
- return (_jsx(Pressable, { accessibilityLabel: placeholder, accessibilityRole: "search", onPress: onPress, testID: testID, children: body }));
41
+ return (_jsx(Pressable, { accessibilityLabel: accessibilityLabel ?? placeholder, accessibilityRole: "search", onPress: onPress, testID: testID, children: body }));
25
42
  }
26
- return _jsx(View, { testID: testID, children: body });
43
+ return (_jsxs(View, { testID: testID, children: [body, focused && suggestions ? (_jsx(SearchSuggestions, { ...suggestions, onSelect: (suggestion) => {
44
+ suggestions.onSelect(suggestion);
45
+ setFocused(false);
46
+ Keyboard.dismiss();
47
+ } })) : null] }));
27
48
  }
28
49
  export default SearchBar;
@@ -0,0 +1,14 @@
1
+ export interface SearchSuggestion {
2
+ id: string;
3
+ label: string;
4
+ description?: string;
5
+ }
6
+ export interface SearchSuggestionsProps {
7
+ items: readonly SearchSuggestion[];
8
+ onSelect: (suggestion: SearchSuggestion) => void;
9
+ loading?: boolean;
10
+ error?: string;
11
+ onRetry?: () => void;
12
+ emptyLabel?: string;
13
+ }
14
+ export default function SearchSuggestions({ items, onSelect, loading, error, onRetry, emptyLabel, }: SearchSuggestionsProps): import("react").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
+ import Pressable from "../primitives/Pressable.js";
3
+ import { Typography } from "../Typography/index.js";
4
+ import { View } from "react-native";
5
+ export default function SearchSuggestions({ items, onSelect, loading, error, onRetry, emptyLabel = "Sin sugerencias", }) {
6
+ return (_jsx(View, { className: "gap-1 border-b border-border-light py-2", children: loading ? (_jsx(Typography.Text, { accessibilityLiveRegion: "polite", children: "Buscando sugerencias\u2026" })) : error ? (_jsxs(_Fragment, { children: [_jsx(Typography.Text, { accessibilityLiveRegion: "polite", className: "text-danger", children: error }), onRetry ? (_jsx(Pressable, { onPress: onRetry, style: { minHeight: 48, justifyContent: "center" }, children: _jsx(Typography.Text, { className: "text-text-accent", children: "Reintentar sugerencias" }) })) : null] })) : !items.length ? (_jsx(Typography.Text, { accessibilityLiveRegion: "polite", className: "text-text-secondary", children: emptyLabel })) : (items.map((item) => (_jsxs(Pressable, { accessibilityLabel: item.description ? `${item.label}. ${item.description}` : item.label, className: "px-3 py-2", onPress: () => onSelect(item), style: { minHeight: 48, justifyContent: "center" }, children: [_jsx(Typography.Text, { variant: "bodyReadable", children: item.label }), item.description ? (_jsx(Typography.Text, { className: "text-text-secondary", variant: "bodyLarge", children: item.description })) : null] }, item.id)))) }));
7
+ }
@@ -20,9 +20,11 @@ export interface SegmentedControlProps<T extends string> {
20
20
  * - `"left"` — icon inline left of the label (compact, single-line).
21
21
  */
22
22
  iconLayout?: "top" | "left";
23
+ /** Increase each option's target to at least 48 points. */
24
+ accessibleSizing?: boolean;
23
25
  className?: string;
24
26
  testID?: string;
25
27
  }
26
- declare function SegmentedControl<T extends string>({ options, value, onChange, iconLayout, className, testID, }: SegmentedControlProps<T>): import("react").JSX.Element;
28
+ declare function SegmentedControl<T extends string>({ options, value, onChange, iconLayout, accessibleSizing, className, testID, }: SegmentedControlProps<T>): import("react").JSX.Element;
27
29
  export default SegmentedControl;
28
30
  export { SegmentedControl };
@@ -1,10 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
- import Icon from "../Display/Display.Icon";
3
- import { useTheme } from "../theme";
4
- import { cn } from "../theme/tw";
5
- import { Typography } from "../Typography";
2
+ import Icon from "../Display/Display.Icon.js";
3
+ import { useTheme } from "../theme/index.js";
4
+ import { cn } from "../theme/tw.js";
5
+ import { Typography } from "../Typography/index.js";
6
6
  import { TouchableOpacity, View } from "react-native";
7
- function SegmentedControl({ options, value, onChange, iconLayout = "top", className, testID, }) {
7
+ function SegmentedControl({ options, value, onChange, iconLayout = "top", accessibleSizing = false, className, testID, }) {
8
8
  const theme = useTheme();
9
9
  const hasIcons = options.some((o) => o.icon || o.customIcon);
10
10
  return (_jsx(View, { accessibilityRole: "tablist", className: cn("flex-row bg-bg-muted rounded-lg p-1 gap-1", className), testID: testID, children: options.map((option) => {
@@ -14,6 +14,7 @@ function SegmentedControl({ options, value, onChange, iconLayout = "top", classN
14
14
  const inline = hasIcons && iconLayout === "left";
15
15
  return (_jsxs(TouchableOpacity, { accessibilityLabel: option.label, accessibilityRole: "tab", accessibilityState: { selected }, activeOpacity: 0.7, onPress: () => onChange(option.value), style: {
16
16
  flex: 1,
17
+ minHeight: accessibleSizing ? 48 : undefined,
17
18
  flexDirection: inline ? "row" : "column",
18
19
  alignItems: "center",
19
20
  justifyContent: "center",
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
- import Icon from "../Display/Display.Icon";
3
- import { theme } from "../theme";
4
- import { cn } from "../theme/tw";
5
- import { Typography } from "../Typography";
2
+ import Icon from "../Display/Display.Icon.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 { View } from "react-native";
7
7
  function Steps({ steps, current, className, testID }) {
8
8
  return (_jsx(View, { accessibilityLabel: `Paso ${current + 1} de ${steps.length}`, className: cn("flex-row items-start", className), testID: testID, children: steps.map((label, index) => {
@@ -11,7 +11,7 @@ function Steps({ steps, current, className, testID }) {
11
11
  const circleColor = done || active ? theme.primary : theme.bg.muted;
12
12
  const textColor = done || active ? theme.text.inverse : theme.text.tertiary;
13
13
  const isLast = index === steps.length - 1;
14
- return (_jsxs(View, { className: "flex-1 items-center", children: [_jsxs(View, { className: "flex-row items-center w-full", children: [_jsx(View, { className: "flex-1 h-0.5", style: { backgroundColor: "transparent" } }), _jsx(View, { className: "w-7 h-7 rounded-full items-center justify-center", style: { backgroundColor: circleColor }, children: done ? (_jsx(Icon, { color: theme.text.inverse, name: "checkmark", size: 16 })) : (_jsx(Typography.Text, { style: { color: textColor }, variant: "bodySmall", children: index + 1 })) }), _jsx(View, { className: "flex-1 h-0.5", style: { backgroundColor: isLast ? "transparent" : theme.border.default } })] }), _jsx(Typography.Text, { className: "mt-1 text-center", numberOfLines: 1, style: { color: active ? theme.primary : theme.text.tertiary }, variant: "caption", children: label })] }, label));
14
+ return (_jsxs(View, { className: "flex-1 items-center", children: [_jsxs(View, { className: "flex-row items-center w-full", children: [_jsx(View, { className: "flex-1 h-0.5", style: { backgroundColor: "transparent" } }), _jsx(View, { className: "w-7 h-7 rounded-full items-center justify-center", style: { backgroundColor: circleColor }, children: done ? (_jsx(Icon, { color: theme.text.inverse, name: "checkmark", size: 16 })) : (_jsx(Typography.Text, { style: { color: textColor }, variant: "bodySmall", children: index + 1 })) }), _jsx(View, { className: "flex-1 h-0.5", style: { backgroundColor: isLast ? "transparent" : theme.border.default } })] }), _jsx(Typography.Text, { className: "mt-1 text-center", numberOfLines: 1, style: { color: active ? theme.text.accent : theme.text.tertiary }, variant: "caption", children: label })] }, label));
15
15
  }) }));
16
16
  }
17
17
  export default Steps;
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "nativewind/jsx-runtime";
2
- import Icon from "../Display/Display.Icon";
3
- import { cn } from "../theme/tw";
2
+ import Icon from "../Display/Display.Icon.js";
3
+ import { cn } from "../theme/tw.js";
4
4
  import { View } from "react-native";
5
5
  /**
6
6
  * @deprecated Orphan tab-bar icon piece (unused). Use `Navigation.BottomNav` (single source
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "nativewind/jsx-runtime";
2
- import Icon from "../Display/Display.Icon";
3
- import { cn } from "../theme/tw";
2
+ import Icon from "../Display/Display.Icon.js";
3
+ import { cn } from "../theme/tw.js";
4
4
  import { View } from "react-native";
5
5
  /**
6
6
  * @deprecated Orphan tab-bar icon piece (unused). The bottom tab bar is now the single