@sincpro/mobile-ui 3.0.1 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. package/dist/Actions/Actions.Button.d.ts +6 -6
  2. package/dist/Actions/Actions.Button.js +650 -180
  3. package/dist/Actions/Actions.Dock.d.ts +1 -1
  4. package/dist/Actions/Actions.Dock.js +297 -18
  5. package/dist/Actions/Actions.FAB.js +100 -12
  6. package/dist/Actions/Actions.FilterButton.d.ts +17 -0
  7. package/dist/Actions/Actions.FilterButton.js +263 -33
  8. package/dist/Actions/Actions.IconButton.d.ts +1 -0
  9. package/dist/Actions/Actions.IconButton.js +196 -33
  10. package/dist/Actions/index.js +13 -13
  11. package/dist/Dialog/Confirmation.context.js +82 -16
  12. package/dist/Dialog/Dialog.ActionSheet.js +200 -41
  13. package/dist/Dialog/Dialog.Confirmation.js +168 -31
  14. package/dist/Dialog/Dialog.EditValue.js +437 -62
  15. package/dist/Dialog/Dialog.Sheet.d.ts +7 -3
  16. package/dist/Dialog/Dialog.Sheet.js +267 -15
  17. package/dist/Dialog/OverlayHost.d.ts +24 -0
  18. package/dist/Dialog/OverlayHost.js +230 -0
  19. package/dist/Dialog/SheetSurface.d.ts +43 -0
  20. package/dist/Dialog/SheetSurface.js +495 -0
  21. package/dist/Dialog/dialog-actions.d.ts +17 -0
  22. package/dist/Dialog/dialog-actions.js +59 -0
  23. package/dist/Dialog/index.d.ts +4 -1
  24. package/dist/Dialog/index.js +8 -7
  25. package/dist/Dialog/overlay.store.d.ts +24 -0
  26. package/dist/Dialog/overlay.store.js +59 -0
  27. package/dist/Dialog/requestConfirmation.js +20 -10
  28. package/dist/Display/Display.Accordion.js +185 -13
  29. package/dist/Display/Display.AmountSummary.js +206 -15
  30. package/dist/Display/Display.Avatar.js +93 -31
  31. package/dist/Display/Display.AvatarGroup.js +132 -17
  32. package/dist/Display/Display.Badge.d.ts +18 -2
  33. package/dist/Display/Display.Badge.js +117 -49
  34. package/dist/Display/Display.Card.js +163 -26
  35. package/dist/Display/Display.Carousel.js +459 -105
  36. package/dist/Display/Display.Chip.d.ts +4 -1
  37. package/dist/Display/Display.Chip.js +165 -31
  38. package/dist/Display/Display.CircleButton.d.ts +1 -0
  39. package/dist/Display/Display.CircleButton.js +86 -27
  40. package/dist/Display/Display.CopyableText.js +289 -66
  41. package/dist/Display/Display.CountRecords.js +60 -3
  42. package/dist/Display/Display.DataTable.js +123 -13
  43. package/dist/Display/Display.Date.js +243 -33
  44. package/dist/Display/Display.Divider.d.ts +10 -10
  45. package/dist/Display/Display.Divider.js +67 -20
  46. package/dist/Display/Display.ExpoImage.js +97 -8
  47. package/dist/Display/Display.GradientSurface.d.ts +9 -4
  48. package/dist/Display/Display.GradientSurface.js +196 -46
  49. package/dist/Display/Display.Icon.js +129 -15
  50. package/dist/Display/Display.IconBadge.js +95 -25
  51. package/dist/Display/Display.Image.d.ts +7 -1
  52. package/dist/Display/Display.Image.js +344 -39
  53. package/dist/Display/Display.KeyValue.js +90 -5
  54. package/dist/Display/Display.ListGroup.js +181 -9
  55. package/dist/Display/Display.ListItem.js +324 -28
  56. package/dist/Display/Display.Logo.js +84 -29
  57. package/dist/Display/Display.MediaCard.js +125 -4
  58. package/dist/Display/Display.MediaEmbed.d.ts +0 -5
  59. package/dist/Display/Display.MediaEmbed.js +170 -26
  60. package/dist/Display/Display.MenuButton.d.ts +2 -2
  61. package/dist/Display/Display.MenuButton.js +380 -94
  62. package/dist/Display/Display.MenuCard.js +122 -18
  63. package/dist/Display/Display.MenuGrid.js +43 -3
  64. package/dist/Display/Display.Monetary.js +90 -5
  65. package/dist/Display/Display.Pattern.js +306 -47
  66. package/dist/Display/Display.PriceTag.js +117 -14
  67. package/dist/Display/Display.ProductCard.js +154 -4
  68. package/dist/Display/Display.Rating.js +92 -11
  69. package/dist/Display/Display.SearchHistory.js +132 -6
  70. package/dist/Display/Display.SectionHeader.d.ts +5 -1
  71. package/dist/Display/Display.SectionHeader.js +125 -12
  72. package/dist/Display/Display.Stat.js +62 -3
  73. package/dist/Display/Display.StatCard.js +131 -7
  74. package/dist/Display/Display.StatusBadge.d.ts +29 -0
  75. package/dist/Display/Display.StatusBadge.js +68 -0
  76. package/dist/Display/Display.StatusDot.js +93 -18
  77. package/dist/Display/Display.Story.js +285 -35
  78. package/dist/Display/Display.StoryTray.js +354 -34
  79. package/dist/Display/Display.StoryViewer.js +571 -72
  80. package/dist/Display/Display.SwipeableRow.js +148 -20
  81. package/dist/Display/Display.Tag.d.ts +4 -1
  82. package/dist/Display/Display.Tag.js +66 -4
  83. package/dist/Display/Display.Timeline.js +102 -13
  84. package/dist/Display/Display.Tooltip.js +122 -26
  85. package/dist/Display/chevron.d.ts +6 -0
  86. package/dist/Display/chevron.js +32 -0
  87. package/dist/Display/count-badge.d.ts +21 -0
  88. package/dist/Display/count-badge.js +124 -0
  89. package/dist/Display/group-title.d.ts +10 -0
  90. package/dist/Display/group-title.js +53 -0
  91. package/dist/Display/icon-font.d.ts +3 -0
  92. package/dist/Display/icon-font.ios.d.ts +3 -0
  93. package/dist/Display/icon-font.ios.js +4 -0
  94. package/dist/Display/icon-font.js +7 -0
  95. package/dist/Display/icon-glyphs.d.ts +2 -0
  96. package/dist/Display/icon-glyphs.js +87 -0
  97. package/dist/Display/icon-map.d.ts +15 -11
  98. package/dist/Display/icon-map.js +344 -84
  99. package/dist/Display/icon-registry.d.ts +21 -0
  100. package/dist/Display/icon-registry.js +21 -0
  101. package/dist/Display/index.d.ts +6 -1
  102. package/dist/Display/index.js +53 -48
  103. package/dist/Display/pill.d.ts +16 -0
  104. package/dist/Display/pill.js +47 -0
  105. package/dist/Feedback/ErrorBoundary.js +35 -23
  106. package/dist/Feedback/Feedback.Banner.js +202 -24
  107. package/dist/Feedback/Feedback.DomainSplashScreen.js +246 -70
  108. package/dist/Feedback/Feedback.Empty.js +54 -3
  109. package/dist/Feedback/Feedback.EmptyState.js +114 -5
  110. package/dist/Feedback/Feedback.Error.d.ts +1 -1
  111. package/dist/Feedback/Feedback.Error.js +130 -5
  112. package/dist/Feedback/Feedback.Loading.d.ts +1 -1
  113. package/dist/Feedback/Feedback.Loading.js +70 -3
  114. package/dist/Feedback/Feedback.PermissionCard.js +161 -5
  115. package/dist/Feedback/Feedback.Progress.js +199 -41
  116. package/dist/Feedback/Feedback.ProgressCircle.js +184 -12
  117. package/dist/Feedback/Feedback.Skeleton.js +149 -36
  118. package/dist/Feedback/Feedback.Spinner.js +407 -79
  119. package/dist/Feedback/Feedback.Splash.js +240 -33
  120. package/dist/Feedback/Feedback.State.d.ts +17 -0
  121. package/dist/Feedback/Feedback.State.js +104 -0
  122. package/dist/Feedback/Toast.context.js +883 -167
  123. package/dist/Feedback/index.d.ts +3 -0
  124. package/dist/Feedback/index.js +15 -13
  125. package/dist/Form/Form.Checkbox.js +212 -22
  126. package/dist/Form/Form.ControlledCheckbox.d.ts +1 -1
  127. package/dist/Form/Form.ControlledCheckbox.js +46 -4
  128. package/dist/Form/Form.ControlledDropdown.d.ts +1 -1
  129. package/dist/Form/Form.ControlledDropdown.js +62 -4
  130. package/dist/Form/Form.ControlledInput.d.ts +4 -3
  131. package/dist/Form/Form.ControlledInput.js +72 -4
  132. package/dist/Form/Form.ControlledMonetaryInput.d.ts +6 -3
  133. package/dist/Form/Form.ControlledMonetaryInput.js +50 -4
  134. package/dist/Form/Form.ControlledRadioButton.d.ts +2 -2
  135. package/dist/Form/Form.ControlledRadioButton.js +45 -4
  136. package/dist/Form/Form.DatePicker.js +507 -107
  137. package/dist/Form/Form.Dropdown.js +303 -52
  138. package/dist/Form/Form.ErrorSummary.js +236 -44
  139. package/dist/Form/Form.Field.d.ts +24 -0
  140. package/dist/Form/Form.Field.js +55 -0
  141. package/dist/Form/Form.FractionalQuantityInput.js +508 -96
  142. package/dist/Form/Form.Input.d.ts +17 -3
  143. package/dist/Form/Form.Input.js +497 -29
  144. package/dist/Form/Form.KeyboardForm.d.ts +22 -8
  145. package/dist/Form/Form.KeyboardForm.js +83 -8
  146. package/dist/Form/Form.KeyboardToolbarHost.d.ts +14 -0
  147. package/dist/Form/Form.KeyboardToolbarHost.js +223 -0
  148. package/dist/Form/Form.MonetaryInput.js +164 -17
  149. package/dist/Form/Form.PickerField.d.ts +31 -0
  150. package/dist/Form/Form.PickerField.js +539 -0
  151. package/dist/Form/Form.PinInput.js +150 -15
  152. package/dist/Form/Form.QuantitySelector.js +229 -25
  153. package/dist/Form/Form.RadioButton.d.ts +1 -0
  154. package/dist/Form/Form.RadioButton.js +26 -29
  155. package/dist/Form/Form.Select.d.ts +2 -1
  156. package/dist/Form/Form.Select.js +388 -60
  157. package/dist/Form/Form.Slider.js +133 -10
  158. package/dist/Form/Form.Switch.js +99 -4
  159. package/dist/Form/choice-row.d.ts +15 -0
  160. package/dist/Form/choice-row.js +236 -0
  161. package/dist/Form/index.d.ts +11 -6
  162. package/dist/Form/index.js +26 -27
  163. package/dist/Form/input-text.d.ts +7 -0
  164. package/dist/Form/input-text.js +18 -0
  165. package/dist/Navigation/Navigation.AppBar.d.ts +3 -4
  166. package/dist/Navigation/Navigation.AppBar.js +535 -99
  167. package/dist/Navigation/Navigation.BottomNav.js +363 -98
  168. package/dist/Navigation/Navigation.CollapsingHeader.d.ts +28 -13
  169. package/dist/Navigation/Navigation.CollapsingHeader.js +369 -36
  170. package/dist/Navigation/Navigation.FloatingBar.js +71 -11
  171. package/dist/Navigation/Navigation.Menu.js +309 -95
  172. package/dist/Navigation/Navigation.MenuSection.js +80 -11
  173. package/dist/Navigation/Navigation.RowItem.d.ts +4 -2
  174. package/dist/Navigation/Navigation.RowItem.js +93 -8
  175. package/dist/Navigation/Navigation.Search.js +241 -27
  176. package/dist/Navigation/Navigation.SearchBar.d.ts +7 -1
  177. package/dist/Navigation/Navigation.SearchBar.js +218 -29
  178. package/dist/Navigation/Navigation.SearchSuggestions.js +77 -3
  179. package/dist/Navigation/Navigation.SegmentedControl.js +152 -14
  180. package/dist/Navigation/Navigation.Steps.js +105 -11
  181. package/dist/Navigation/Navigation.Tabs.js +449 -41
  182. package/dist/Navigation/index.d.ts +9 -4
  183. package/dist/Navigation/index.js +13 -13
  184. package/dist/Typography/Typography.Heading.js +33 -3
  185. package/dist/Typography/Typography.SelectableText.js +95 -7
  186. package/dist/Typography/Typography.Text.d.ts +4 -2
  187. package/dist/Typography/Typography.Text.js +217 -7
  188. package/dist/Typography/index.js +3 -3
  189. package/dist/branding.js +29 -13
  190. package/dist/icons/AddItemIcon.js +76 -2
  191. package/dist/icons/ArrangeCircle.js +82 -2
  192. package/dist/icons/ArrowDownIcon.js +63 -3
  193. package/dist/icons/ArrowUpIcon.js +63 -3
  194. package/dist/icons/BoxIcon.js +64 -2
  195. package/dist/icons/BoxTimeIcon.js +63 -2
  196. package/dist/icons/CalendarIcon.js +145 -2
  197. package/dist/icons/CardIcon.js +80 -2
  198. package/dist/icons/CashierIcon.js +39 -2
  199. package/dist/icons/CreditIcon.js +76 -3
  200. package/dist/icons/DuoIcon.js +75 -2
  201. package/dist/icons/HomeIcon.js +39 -2
  202. package/dist/icons/HomeIconOutlined.js +53 -2
  203. package/dist/icons/LogoIcon.js +87 -2
  204. package/dist/icons/MoneyReceiveIcon.js +86 -2
  205. package/dist/icons/PinIcon.js +39 -2
  206. package/dist/icons/ProfileIcon.js +47 -2
  207. package/dist/icons/SettingsIcon.js +114 -2
  208. package/dist/icons/SinpeIcon.js +60 -2
  209. package/dist/icons/ToggleOffIcon.js +53 -2
  210. package/dist/icons/WalletMoneyIcon.js +81 -2
  211. package/dist/index.d.ts +1 -0
  212. package/dist/index.js +8 -2
  213. package/dist/layouts/AuthContainer.d.ts +4 -5
  214. package/dist/layouts/AuthContainer.js +231 -7
  215. package/dist/layouts/BottomInset.js +4 -1
  216. package/dist/layouts/Container.d.ts +2 -2
  217. package/dist/layouts/Container.js +45 -3
  218. package/dist/layouts/GradientContainer.js +37 -5
  219. package/dist/layouts/PlainLayout.js +19 -3
  220. package/dist/layouts/ScrollContainer.d.ts +14 -9
  221. package/dist/layouts/ScrollContainer.js +125 -4
  222. package/dist/layouts/edges.d.ts +2 -0
  223. package/dist/layouts/edges.js +1 -0
  224. package/dist/primitives/AspectRatio.js +75 -3
  225. package/dist/primitives/Box.js +45 -3
  226. package/dist/primitives/Pressable.js +95 -5
  227. package/dist/primitives/Row.js +84 -13
  228. package/dist/primitives/Spacer.js +42 -5
  229. package/dist/primitives/Stack.js +66 -7
  230. package/dist/primitives/index.js +1 -1
  231. package/dist/theme/active.d.ts +2 -0
  232. package/dist/theme/active.js +33 -18
  233. package/dist/theme/build.js +118 -87
  234. package/dist/theme/color.js +87 -87
  235. package/dist/theme/components/ThemedActivityIndicator.d.ts +2 -15
  236. package/dist/theme/components/ThemedActivityIndicator.js +35 -3
  237. package/dist/theme/components/index.js +1 -0
  238. package/dist/theme/contrast.js +32 -33
  239. package/dist/theme/css-vars.js +71 -75
  240. package/dist/theme/dark.js +116 -97
  241. package/dist/theme/default.js +116 -97
  242. package/dist/theme/define.js +16 -12
  243. package/dist/theme/index.d.ts +1 -0
  244. package/dist/theme/index.js +7 -6
  245. package/dist/theme/on-dark-surface.d.ts +12 -0
  246. package/dist/theme/on-dark-surface.js +13 -0
  247. package/dist/theme/theme.js +1 -0
  248. package/dist/theme/tw.js +3 -1
  249. package/dist/theme/types.js +0 -18
  250. package/dist/theme/typography.d.ts +1 -1
  251. package/dist/theme/typography.js +337 -303
  252. package/dist/theme/useTheme.d.ts +4 -0
  253. package/dist/theme/useTheme.js +7 -3
  254. package/dist/theme/useThemeVars.d.ts +9 -0
  255. package/dist/theme/useThemeVars.js +23 -0
  256. package/dist/theme/validate.js +175 -166
  257. package/dist/tokens/index.js +1 -1
  258. package/dist/tokens/motion.js +30 -13
  259. package/dist/utils/async.d.ts +14 -0
  260. package/dist/utils/async.js +22 -0
  261. package/dist/utils/criteria.js +66 -85
  262. package/dist/utils/date.d.ts +8 -2
  263. package/dist/utils/date.js +63 -50
  264. package/dist/utils/image.js +8 -8
  265. package/dist/utils/intl.d.ts +1 -0
  266. package/dist/utils/intl.js +13 -0
  267. package/dist/utils/keys.js +3 -5
  268. package/dist/utils/monetary.d.ts +1 -0
  269. package/dist/utils/monetary.js +28 -24
  270. package/dist/utils/progress.js +2 -3
  271. package/dist/utils/quantity.js +25 -26
  272. package/dist/utils/reorder.js +11 -20
  273. package/dist/utils/search.d.ts +4 -0
  274. package/dist/utils/search.js +12 -0
  275. package/dist/utils/serializer.js +38 -38
  276. package/dist/utils/useReducedMotion.js +32 -30
  277. package/dist/views/AppSplashView.js +117 -3
  278. package/dist/views/AuthFormView.d.ts +4 -5
  279. package/dist/views/AuthFormView.js +119 -11
  280. package/dist/views/FormViewV2.context.js +75 -23
  281. package/dist/views/FormViewV2.d.ts +4 -5
  282. package/dist/views/FormViewV2.js +658 -92
  283. package/dist/views/ListViewV2.context.js +91 -47
  284. package/dist/views/ListViewV2.d.ts +84 -43
  285. package/dist/views/ListViewV2.js +1350 -200
  286. package/dist/views/Wizard/Wizard.context.js +248 -84
  287. package/dist/views/Wizard/Wizard.js +260 -67
  288. package/dist/views/types/IListView.js +34 -31
  289. package/dist/widgets/CollectionOptions.js +557 -138
  290. package/dist/widgets/FilterBar.js +159 -7
  291. package/dist/widgets/FilterBuilder.js +375 -102
  292. package/dist/widgets/JSONViewer.js +275 -129
  293. package/dist/widgets/PromoBanner.js +336 -42
  294. package/dist/widgets/PromoModal.d.ts +2 -2
  295. package/dist/widgets/PromoModal.js +389 -62
  296. package/dist/widgets/QueryChoice.js +150 -8
  297. package/dist/widgets/QuickActions.js +120 -31
  298. package/dist/widgets/ReorderableList.js +399 -128
  299. package/dist/widgets/TimeZoneSelectorModal.js +458 -51
  300. package/dist/widgets/index.js +3 -3
  301. package/package.json +6 -1
  302. package/tailwind.preset.js +7 -5
  303. package/dist/Form/Form.InputField.d.ts +0 -10
  304. package/dist/Form/Form.InputField.js +0 -38
  305. package/dist/Form/Form.KeyboardToolbar.d.ts +0 -22
  306. package/dist/Form/Form.KeyboardToolbar.js +0 -66
  307. package/dist/Form/Form.PasswordInput.d.ts +0 -9
  308. package/dist/Form/Form.PasswordInput.js +0 -17
  309. package/dist/Form/Form.TextInput.d.ts +0 -8
  310. package/dist/Form/Form.TextInput.js +0 -8
  311. package/dist/primitives/BaseButton.d.ts +0 -150
  312. package/dist/primitives/BaseButton.js +0 -229
  313. package/dist/utils/useSheetTranslation.d.ts +0 -5
  314. package/dist/utils/useSheetTranslation.js +0 -23
@@ -1,4 +1,5 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "nativewind/jsx-runtime";
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { CountBadge } from "../Display/count-badge.js";
2
3
  import Icon from "../Display/Display.Icon.js";
3
4
  import Pressable from "../primitives/Pressable.js";
4
5
  import { relativeLuminance, useTheme } from "../theme/index.js";
@@ -6,118 +7,382 @@ import { cn } from "../theme/tw.js";
6
7
  import { Typography } from "../Typography/index.js";
7
8
  import { View } from "react-native";
8
9
  import { useSafeAreaInsets } from "react-native-safe-area-context";
10
+
9
11
  /** Forced-dark chrome: prefer `bg.inverse` when it is actually dark, else `bg.card`. */
12
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "nativewind/jsx-runtime";
10
13
  function resolveDarkSurface(theme) {
11
- const candidate = theme.bg.inverse ?? theme.bg.card;
12
- return relativeLuminance(candidate) < 0.25 ? candidate : theme.bg.card;
14
+ const candidate = theme.bg.inverse ?? theme.bg.card;
15
+ return relativeLuminance(candidate) < 0.25 ? candidate : theme.bg.card;
13
16
  }
17
+
18
+ /**
19
+ * Active-tab indicator style:
20
+ * - `none`: color only.
21
+ * - `pill`: filled round pill behind the icon.
22
+ * - `pill-text`: extended pill with icon + label inside (inactive = icon only).
23
+ * - `bar`: top accent bar over the active item (label below).
24
+ * - `glow`: glowing dot under the active icon (pairs with `tone="dark"`).
25
+ */
26
+
14
27
  /**
15
28
  * The single bottom-navigation component. Extensible by props, not by forking:
16
29
  * `shape` (bar/floating), `tone` (light/dark), `indicator` (none/pill/pill-text/bar/glow),
17
30
  * `showLabels`, `centerAction` (FAB), `activeColor`. Replaces the legacy `TabNavigatorLayout`.
18
31
  */
19
- function BottomNav({ items, value, onChange, showLabels = true, centerAction, safeArea = true, shape = "bar", tone = "light", indicator = "none", bordered = true, activeColor = "primary", className, testID, }) {
20
- const insets = useSafeAreaInsets();
21
- const theme = useTheme();
22
- const dark = tone === "dark";
23
- const rounded = shape === "floating" || dark;
24
- const bottomPad = rounded ? 6 : safeArea ? insets.bottom : 0;
25
- const activeTint = activeColor === "accent" ? theme.accent : theme.primary;
26
- const onActive = activeColor === "accent" ? theme.text.onAccent : theme.text.onPrimary;
27
- const brandText = theme.text.accent;
28
- const inactiveColor = dark ? "rgba(255,255,255,0.55)" : theme.icon.secondary;
29
- const surfaceColor = dark ? resolveDarkSurface(theme) : theme.bg.card;
30
- const containerStyle = rounded
31
- ? {
32
- borderRadius: 32,
33
- paddingBottom: bottomPad,
34
- paddingTop: 6,
35
- paddingHorizontal: 6,
36
- minHeight: 64,
37
- backgroundColor: surfaceColor,
38
- ...theme.shadow.lg,
39
- }
40
- : {
41
- paddingBottom: bottomPad,
42
- minHeight: 56,
43
- backgroundColor: surfaceColor,
44
- ...(bordered ? { borderTopWidth: 1, borderTopColor: theme.border.light } : null),
45
- };
46
- const renderIconNode = (item, active, color) => {
47
- const name = active ? (item.activeIcon ?? item.icon) : item.icon;
48
- return (_jsxs(View, { children: [name ? _jsx(Icon, { color: color, name: name, size: 24 }) : null, item.badge != null ? (_jsx(View, { className: "absolute bg-danger rounded-full min-w-[16px] h-4 px-1 items-center justify-center", style: { top: -4, right: -10, borderWidth: 2, borderColor: surfaceColor }, children: _jsx(Typography.Text, { style: { color: theme.text.inverse, fontSize: 9, lineHeight: 11 }, children: item.badge }) })) : null] }));
32
+ function BottomNav(t0) {
33
+ const $ = _c(55);
34
+ const {
35
+ items,
36
+ value,
37
+ onChange,
38
+ showLabels: t1,
39
+ centerAction,
40
+ safeArea: t2,
41
+ shape: t3,
42
+ tone: t4,
43
+ indicator: t5,
44
+ bordered: t6,
45
+ activeColor: t7,
46
+ className,
47
+ testID
48
+ } = t0;
49
+ const showLabels = t1 === undefined ? true : t1;
50
+ const safeArea = t2 === undefined ? true : t2;
51
+ const shape = t3 === undefined ? "bar" : t3;
52
+ const tone = t4 === undefined ? "light" : t4;
53
+ const indicator = t5 === undefined ? "none" : t5;
54
+ const bordered = t6 === undefined ? true : t6;
55
+ const activeColor = t7 === undefined ? "primary" : t7;
56
+ const insets = useSafeAreaInsets();
57
+ const theme = useTheme();
58
+ const dark = tone === "dark";
59
+ const rounded = shape === "floating" || dark;
60
+ const bottomPad = rounded ? 6 : safeArea ? insets.bottom : 0;
61
+ const activeTint = activeColor === "accent" ? theme.accent : theme.primary;
62
+ const onActive = activeColor === "accent" ? theme.text.onAccent : theme.text.onPrimary;
63
+ const brandText = theme.text.accent;
64
+ const inactiveColor = dark ? "rgba(255,255,255,0.55)" : theme.icon.secondary;
65
+ let t8;
66
+ if ($[0] !== dark || $[1] !== theme) {
67
+ t8 = dark ? resolveDarkSurface(theme) : theme.bg.card;
68
+ $[0] = dark;
69
+ $[1] = theme;
70
+ $[2] = t8;
71
+ } else {
72
+ t8 = $[2];
73
+ }
74
+ const surfaceColor = t8;
75
+ let t9;
76
+ if ($[3] !== bordered || $[4] !== bottomPad || $[5] !== rounded || $[6] !== surfaceColor || $[7] !== theme.border || $[8] !== theme.shadow) {
77
+ t9 = rounded ? {
78
+ borderRadius: 32,
79
+ paddingBottom: bottomPad,
80
+ paddingTop: 6,
81
+ paddingHorizontal: 6,
82
+ minHeight: 64,
83
+ backgroundColor: surfaceColor,
84
+ ...theme.shadow.lg
85
+ } : {
86
+ paddingBottom: bottomPad,
87
+ minHeight: 56,
88
+ backgroundColor: surfaceColor,
89
+ ...(bordered ? {
90
+ borderTopWidth: 1,
91
+ borderTopColor: theme.border.light
92
+ } : null)
93
+ };
94
+ $[3] = bordered;
95
+ $[4] = bottomPad;
96
+ $[5] = rounded;
97
+ $[6] = surfaceColor;
98
+ $[7] = theme.border;
99
+ $[8] = theme.shadow;
100
+ $[9] = t9;
101
+ } else {
102
+ t9 = $[9];
103
+ }
104
+ const containerStyle = t9;
105
+ let t10;
106
+ if ($[10] !== surfaceColor) {
107
+ t10 = (item, active, color) => {
108
+ const name = active ? item.activeIcon ?? item.icon : item.icon;
109
+ return _jsxs(View, {
110
+ children: [name ? _jsx(Icon, {
111
+ color: color,
112
+ name: name,
113
+ size: 24
114
+ }) : null, item.badge != null ? _jsx(CountBadge, {
115
+ anchor: {
116
+ top: -4,
117
+ right: -10
118
+ },
119
+ count: item.badge,
120
+ ringColor: surfaceColor
121
+ }) : null]
122
+ });
49
123
  };
50
- const renderItem = (item) => {
51
- const active = item.key === value;
52
- // Variant A — extended pill with text (active = horizontal pill, inactive = icon only).
53
- if (indicator === "pill-text") {
54
- if (active) {
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
- minHeight: 48,
59
- minWidth: 48,
60
- }, children: [renderIconNode(item, true, onActive), item.label ? (_jsx(Typography.Text, { semibold: true, style: { color: onActive, fontSize: 13, marginLeft: 8, flexShrink: 1 }, children: item.label })) : null] }, item.key));
61
- }
62
- return (_jsx(Pressable, { accessibilityLabel: item.label ?? item.key, accessibilityRole: "tab", className: "items-center justify-center px-3 py-2", onPress: () => onChange(item.key), style: { minHeight: 48, minWidth: 48 }, children: renderIconNode(item, false, inactiveColor) }, item.key));
124
+ $[10] = surfaceColor;
125
+ $[11] = t10;
126
+ } else {
127
+ t10 = $[11];
128
+ }
129
+ const renderIconNode = t10;
130
+ let t11;
131
+ if ($[12] !== activeTint || $[13] !== brandText || $[14] !== dark || $[15] !== inactiveColor || $[16] !== indicator || $[17] !== onActive || $[18] !== onChange || $[19] !== renderIconNode || $[20] !== showLabels || $[21] !== theme.text.inverse || $[22] !== value) {
132
+ t11 = item_0 => {
133
+ const active_0 = item_0.key === value;
134
+ if (indicator === "pill-text") {
135
+ if (active_0) {
136
+ return _jsxs(Pressable, {
137
+ accessibilityLabel: item_0.label ?? item_0.key,
138
+ accessibilityRole: "tab",
139
+ accessibilityState: {
140
+ selected: true
141
+ },
142
+ className: "flex-row items-center px-4 py-2",
143
+ onPress: () => onChange(item_0.key),
144
+ style: {
145
+ borderRadius: 999,
146
+ backgroundColor: activeTint,
147
+ minHeight: 48,
148
+ minWidth: 48
149
+ },
150
+ children: [renderIconNode(item_0, true, onActive), item_0.label ? _jsx(Typography.Text, {
151
+ semibold: true,
152
+ style: {
153
+ color: onActive,
154
+ fontSize: 13,
155
+ marginLeft: 8,
156
+ flexShrink: 1
157
+ },
158
+ children: item_0.label
159
+ }) : null]
160
+ }, item_0.key);
161
+ }
162
+ return _jsx(Pressable, {
163
+ accessibilityLabel: item_0.label ?? item_0.key,
164
+ accessibilityRole: "tab",
165
+ className: "items-center justify-center px-3 py-2",
166
+ onPress: () => onChange(item_0.key),
167
+ style: {
168
+ minHeight: 48,
169
+ minWidth: 48
170
+ },
171
+ children: renderIconNode(item_0, false, inactiveColor)
172
+ }, item_0.key);
173
+ }
174
+ const inPill = indicator === "pill" && active_0;
175
+ let iconColor = inactiveColor;
176
+ if (inPill) {
177
+ iconColor = onActive;
178
+ } else {
179
+ if (active_0) {
180
+ iconColor = brandText;
63
181
  }
64
- // Variants none / pill / bar / glow — vertical icon + optional indicator + optional label.
65
- const inPill = indicator === "pill" && active;
66
- let iconColor = inactiveColor;
67
- if (inPill)
68
- iconColor = onActive;
69
- else if (active)
70
- iconColor = brandText;
71
- let labelColor = inactiveColor;
72
- if (active && inPill)
73
- labelColor = onActive;
74
- else if (active && dark)
75
- labelColor = theme.text.inverse;
76
- else if (active)
182
+ }
183
+ let labelColor = inactiveColor;
184
+ if (active_0 && inPill) {
185
+ labelColor = onActive;
186
+ } else {
187
+ if (active_0 && dark) {
188
+ labelColor = theme.text.inverse;
189
+ } else {
190
+ if (active_0) {
77
191
  labelColor = brandText;
78
- 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: { minHeight: 48, minWidth: 48 }, children: [indicator === "bar" && active ? (_jsx(View, { style: {
79
- position: "absolute",
80
- top: 0,
81
- width: 26,
82
- height: 3,
83
- borderRadius: 999,
84
- backgroundColor: activeTint,
85
- } })) : null, _jsx(View, { className: inPill ? "px-5 py-1.5" : undefined, style: inPill ? { borderRadius: 999, backgroundColor: activeTint } : undefined, children: renderIconNode(item, active, iconColor) }), indicator === "glow" && active ? (_jsx(View, { style: {
86
- width: 5,
87
- height: 5,
88
- borderRadius: 999,
89
- marginTop: 4,
90
- backgroundColor: activeTint,
91
- shadowColor: activeTint,
92
- shadowOpacity: 0.9,
93
- shadowRadius: 5,
94
- elevation: 4,
95
- } })) : null, showLabels && item.label && indicator !== "glow" ? (_jsx(Typography.Text, { semibold: active, style: { color: labelColor, fontSize: 11, marginTop: 3, textAlign: "center" }, children: item.label })) : null] }, item.key));
96
- };
97
- const renderCenterFab = () => (_jsx(Pressable, { accessibilityLabel: centerAction?.accessibilityLabel ?? "Acción", accessibilityRole: "button", className: "items-center justify-center", onPress: centerAction?.onPress, style: {
98
- width: 52,
99
- height: 52,
100
- borderRadius: 18,
101
- marginTop: -20,
102
- marginHorizontal: 6,
192
+ }
193
+ }
194
+ }
195
+ return _jsxs(Pressable, {
196
+ accessibilityLabel: item_0.label ?? item_0.key,
197
+ accessibilityRole: "tab",
198
+ accessibilityState: {
199
+ selected: active_0
200
+ },
201
+ className: "flex-1 items-center justify-center py-1.5",
202
+ onPress: () => onChange(item_0.key),
203
+ style: {
204
+ minHeight: 48,
205
+ minWidth: 48
206
+ },
207
+ children: [indicator === "bar" && active_0 ? _jsx(View, {
208
+ style: {
209
+ position: "absolute",
210
+ top: 0,
211
+ width: 26,
212
+ height: 3,
213
+ borderRadius: 999,
214
+ backgroundColor: activeTint
215
+ }
216
+ }) : null, _jsx(View, {
217
+ className: inPill ? "px-5 py-1.5" : undefined,
218
+ style: inPill ? {
219
+ borderRadius: 999,
220
+ backgroundColor: activeTint
221
+ } : undefined,
222
+ children: renderIconNode(item_0, active_0, iconColor)
223
+ }), indicator === "glow" && active_0 ? _jsx(View, {
224
+ style: {
225
+ width: 5,
226
+ height: 5,
227
+ borderRadius: 999,
228
+ marginTop: 4,
103
229
  backgroundColor: activeTint,
104
- // Glow halo en el color de acento (iOS shadow + Android elevation).
105
230
  shadowColor: activeTint,
106
- shadowOffset: { width: 0, height: 4 },
107
- shadowOpacity: 0.55,
108
- shadowRadius: 14,
109
- elevation: 10,
110
- }, children: _jsx(Icon, { color: onActive, name: centerAction?.icon ?? "add", size: 26 }) }));
111
- let content;
112
- if (centerAction) {
113
- const mid = Math.ceil(items.length / 2);
114
- content = (_jsxs(_Fragment, { children: [items.slice(0, mid).map(renderItem), renderCenterFab(), items.slice(mid).map(renderItem)] }));
231
+ shadowOpacity: 0.9,
232
+ shadowRadius: 5,
233
+ elevation: 4
234
+ }
235
+ }) : null, showLabels && item_0.label && indicator !== "glow" ? _jsx(Typography.Text, {
236
+ semibold: active_0,
237
+ style: {
238
+ color: labelColor,
239
+ fontSize: 11,
240
+ marginTop: 3,
241
+ textAlign: "center"
242
+ },
243
+ children: item_0.label
244
+ }) : null]
245
+ }, item_0.key);
246
+ };
247
+ $[12] = activeTint;
248
+ $[13] = brandText;
249
+ $[14] = dark;
250
+ $[15] = inactiveColor;
251
+ $[16] = indicator;
252
+ $[17] = onActive;
253
+ $[18] = onChange;
254
+ $[19] = renderIconNode;
255
+ $[20] = showLabels;
256
+ $[21] = theme.text.inverse;
257
+ $[22] = value;
258
+ $[23] = t11;
259
+ } else {
260
+ t11 = $[23];
261
+ }
262
+ const renderItem = t11;
263
+ let t12;
264
+ if ($[24] !== activeTint || $[25] !== centerAction?.accessibilityLabel || $[26] !== centerAction?.icon || $[27] !== centerAction?.onPress || $[28] !== onActive) {
265
+ t12 = () => _jsx(Pressable, {
266
+ accessibilityLabel: centerAction?.accessibilityLabel ?? "Acci\xF3n",
267
+ accessibilityRole: "button",
268
+ className: "items-center justify-center",
269
+ onPress: centerAction?.onPress,
270
+ style: {
271
+ width: 52,
272
+ height: 52,
273
+ borderRadius: 18,
274
+ marginTop: -20,
275
+ marginHorizontal: 6,
276
+ backgroundColor: activeTint,
277
+ shadowColor: activeTint,
278
+ shadowOffset: {
279
+ width: 0,
280
+ height: 4
281
+ },
282
+ shadowOpacity: 0.55,
283
+ shadowRadius: 14,
284
+ elevation: 10
285
+ },
286
+ children: _jsx(Icon, {
287
+ color: onActive,
288
+ name: centerAction?.icon ?? "add",
289
+ size: 26
290
+ })
291
+ });
292
+ $[24] = activeTint;
293
+ $[25] = centerAction?.accessibilityLabel;
294
+ $[26] = centerAction?.icon;
295
+ $[27] = centerAction?.onPress;
296
+ $[28] = onActive;
297
+ $[29] = t12;
298
+ } else {
299
+ t12 = $[29];
300
+ }
301
+ const renderCenterFab = t12;
302
+ let content;
303
+ if (centerAction) {
304
+ const mid = Math.ceil(items.length / 2);
305
+ let t13;
306
+ if ($[30] !== items || $[31] !== mid || $[32] !== renderItem) {
307
+ t13 = items.slice(0, mid).map(renderItem);
308
+ $[30] = items;
309
+ $[31] = mid;
310
+ $[32] = renderItem;
311
+ $[33] = t13;
312
+ } else {
313
+ t13 = $[33];
314
+ }
315
+ let t14;
316
+ if ($[34] !== renderCenterFab) {
317
+ t14 = renderCenterFab();
318
+ $[34] = renderCenterFab;
319
+ $[35] = t14;
320
+ } else {
321
+ t14 = $[35];
322
+ }
323
+ let t15;
324
+ if ($[36] !== items || $[37] !== mid || $[38] !== renderItem) {
325
+ t15 = items.slice(mid).map(renderItem);
326
+ $[36] = items;
327
+ $[37] = mid;
328
+ $[38] = renderItem;
329
+ $[39] = t15;
330
+ } else {
331
+ t15 = $[39];
332
+ }
333
+ let t16;
334
+ if ($[40] !== t13 || $[41] !== t14 || $[42] !== t15) {
335
+ t16 = _jsxs(_Fragment, {
336
+ children: [t13, t14, t15]
337
+ });
338
+ $[40] = t13;
339
+ $[41] = t14;
340
+ $[42] = t15;
341
+ $[43] = t16;
342
+ } else {
343
+ t16 = $[43];
115
344
  }
116
- else {
117
- content = items.map(renderItem);
345
+ content = t16;
346
+ } else {
347
+ let t13;
348
+ if ($[44] !== items || $[45] !== renderItem) {
349
+ t13 = items.map(renderItem);
350
+ $[44] = items;
351
+ $[45] = renderItem;
352
+ $[46] = t13;
353
+ } else {
354
+ t13 = $[46];
118
355
  }
119
- const justify = indicator === "pill-text" ? "justify-around" : "";
120
- return (_jsx(View, { accessibilityRole: "tablist", className: cn("flex-row items-center", justify, className), style: containerStyle, testID: testID, children: content }));
356
+ content = t13;
357
+ }
358
+ const justify = indicator === "pill-text" ? "justify-around" : "";
359
+ let t13;
360
+ if ($[47] !== className || $[48] !== justify) {
361
+ t13 = cn("flex-row items-center", justify, className);
362
+ $[47] = className;
363
+ $[48] = justify;
364
+ $[49] = t13;
365
+ } else {
366
+ t13 = $[49];
367
+ }
368
+ let t14;
369
+ if ($[50] !== containerStyle || $[51] !== content || $[52] !== t13 || $[53] !== testID) {
370
+ t14 = _jsx(View, {
371
+ accessibilityRole: "tablist",
372
+ className: t13,
373
+ style: containerStyle,
374
+ testID: testID,
375
+ children: content
376
+ });
377
+ $[50] = containerStyle;
378
+ $[51] = content;
379
+ $[52] = t13;
380
+ $[53] = testID;
381
+ $[54] = t14;
382
+ } else {
383
+ t14 = $[54];
384
+ }
385
+ return t14;
121
386
  }
122
387
  export default BottomNav;
123
388
  export { BottomNav };
@@ -1,10 +1,24 @@
1
1
  import { type AppBarActionProps } from "./Navigation.AppBar.js";
2
- import type { ReactNode } from "react";
3
- import { Animated } from "react-native";
2
+ import { type ReactNode } from "react";
3
+ import { type ScrollViewProps } from "react-native";
4
+ /** A scroll position read on the UI thread. Any Reanimated shared value fits. */
5
+ export interface ScrollOffset {
6
+ get(): number;
7
+ }
8
+ /** Connects a `CollapsingHeader` with the `CollapsingHeader.ScrollView` below it. */
9
+ declare function Root({ children }: {
10
+ children: ReactNode;
11
+ }): import("react").JSX.Element;
12
+ /** The scroll that drives the header. Its offset is written on the UI thread, never in JS. */
13
+ declare function CollapsingScrollView(props: Omit<ScrollViewProps, "onScroll">): import("react").JSX.Element;
4
14
  export interface CollapsingHeaderProps {
5
15
  title: string;
6
16
  subtitle?: string;
7
- scrollY: Animated.Value;
17
+ /**
18
+ * Scroll position from your own Reanimated scroll (FlashList, a custom list).
19
+ * Inside `CollapsingHeader.Root` it comes from `CollapsingHeader.ScrollView`.
20
+ */
21
+ scrollY?: ScrollOffset;
8
22
  onBack?: () => void;
9
23
  actions?: ReactNode;
10
24
  /** Extra height of the collapsing large-title (px). Default 56, or 72 with subtitle. */
@@ -16,19 +30,20 @@ export interface CollapsingHeaderProps {
16
30
  /**
17
31
  * Header with a large-title that **collapses on scroll** (merge of iOS 26 large title +
18
32
  * Material 3 large top app bar). The compact bar stays fixed and its title fades in while
19
- * scrolling; the large-title fades out and slides up. Controlled by an `Animated.Value`.
33
+ * scrolling; the large-title fades out and slides up.
20
34
  *
21
- * Usage: pass `scrollY` from your `Animated.ScrollView`. Since the large-title collapses its
22
- * `height` (not supported by the native driver), use `useNativeDriver: false`:
35
+ * Every frame runs on the UI thread (Reanimated): scrolling never waits for JS.
23
36
  * ```tsx
24
- * const scrollY = useRef(new Animated.Value(0)).current;
25
- * <CollapsingHeader title="Inicio" scrollY={scrollY} />
26
- * <Animated.ScrollView
27
- * onScroll={Animated.event([{ nativeEvent: { contentOffset: { y: scrollY } } }], { useNativeDriver: false })}
28
- * scrollEventThrottle={16}
29
- * />
37
+ * <CollapsingHeader.Root>
38
+ * <CollapsingHeader title="Inicio" />
39
+ * <CollapsingHeader.ScrollView>{content}</CollapsingHeader.ScrollView>
40
+ * </CollapsingHeader.Root>
30
41
  * ```
31
42
  */
32
43
  declare function CollapsingHeader({ title, subtitle, scrollY, onBack, actions, largeHeight, safeArea, testID, }: CollapsingHeaderProps): import("react").JSX.Element;
44
+ declare const CollapsingHeaderWithParts: typeof CollapsingHeader & {
45
+ Root: typeof Root;
46
+ ScrollView: typeof CollapsingScrollView;
47
+ };
33
48
  export type { AppBarActionProps };
34
- export default CollapsingHeader;
49
+ export default CollapsingHeaderWithParts;