@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.
- package/README.md +575 -230
- package/dist/Actions/Actions.Button.d.ts +98 -93
- package/dist/Actions/Actions.Button.js +58 -52
- package/dist/Actions/Actions.FAB.d.ts +3 -1
- package/dist/Actions/Actions.FAB.js +12 -8
- package/dist/Actions/Actions.FilterButton.d.ts +10 -2
- package/dist/Actions/Actions.FilterButton.js +23 -8
- package/dist/Actions/Actions.IconButton.d.ts +36 -33
- package/dist/Actions/Actions.IconButton.js +10 -6
- package/dist/Actions/index.d.ts +12 -12
- package/dist/Actions/index.js +6 -6
- package/dist/Dialog/BottomSheet/BottomSheet.Root.js +1 -1
- package/dist/Dialog/BottomSheet/index.d.ts +1 -1
- package/dist/Dialog/BottomSheet/index.js +1 -1
- package/dist/Dialog/Confirmation.context.js +3 -3
- package/dist/Dialog/Dialog.ActionSheet.d.ts +2 -1
- package/dist/Dialog/Dialog.ActionSheet.js +19 -9
- package/dist/Dialog/Dialog.Confirmation.js +7 -7
- package/dist/Dialog/Dialog.EditValue.js +4 -4
- package/dist/Dialog/Dialog.NativeSheet.d.ts +10 -0
- package/dist/Dialog/Dialog.NativeSheet.js +21 -0
- package/dist/Dialog/Dialog.Sheet.d.ts +5 -1
- package/dist/Dialog/Dialog.Sheet.js +19 -11
- package/dist/Dialog/index.d.ts +5 -5
- package/dist/Dialog/index.js +5 -5
- package/dist/Display/Display.Accordion.js +5 -5
- package/dist/Display/Display.Avatar.d.ts +30 -30
- package/dist/Display/Display.Avatar.js +2 -2
- package/dist/Display/Display.AvatarGroup.js +3 -3
- package/dist/Display/Display.Badge.d.ts +3 -3
- package/dist/Display/Display.Badge.js +1 -1
- package/dist/Display/Display.Card.d.ts +15 -15
- package/dist/Display/Display.Card.js +4 -4
- package/dist/Display/Display.Carousel.js +2 -2
- package/dist/Display/Display.Chip.d.ts +3 -3
- package/dist/Display/Display.Chip.js +12 -12
- package/dist/Display/Display.CircleButton.d.ts +1 -1
- package/dist/Display/Display.CircleButton.js +3 -3
- package/dist/Display/Display.CopyableText.d.ts +9 -2
- package/dist/Display/Display.CopyableText.js +76 -8
- package/dist/Display/Display.CountRecords.js +2 -2
- package/dist/Display/Display.DataTable.js +2 -2
- package/dist/Display/Display.Date.d.ts +1 -1
- package/dist/Display/Display.Date.js +5 -5
- package/dist/Display/Display.Divider.d.ts +24 -24
- package/dist/Display/Display.Divider.js +1 -1
- package/dist/Display/Display.GradientSurface.d.ts +58 -39
- package/dist/Display/Display.GradientSurface.js +31 -15
- package/dist/Display/Display.Icon.d.ts +1 -1
- package/dist/Display/Display.Icon.js +2 -1
- package/dist/Display/Display.IconBadge.js +3 -3
- package/dist/Display/Display.Image.js +4 -4
- package/dist/Display/Display.KeyValue.d.ts +11 -4
- package/dist/Display/Display.KeyValue.js +8 -6
- package/dist/Display/Display.ListGroup.d.ts +23 -0
- package/dist/Display/Display.ListGroup.js +17 -0
- package/dist/Display/Display.ListItem.d.ts +16 -2
- package/dist/Display/Display.ListItem.js +29 -12
- package/dist/Display/Display.Logo.d.ts +3 -3
- package/dist/Display/Display.Logo.js +2 -2
- package/dist/Display/Display.MediaCard.js +4 -4
- package/dist/Display/Display.MediaEmbed.js +7 -7
- package/dist/Display/Display.MenuButton.d.ts +4 -4
- package/dist/Display/Display.MenuButton.js +6 -6
- package/dist/Display/Display.MenuCard.d.ts +1 -1
- package/dist/Display/Display.MenuCard.js +3 -3
- package/dist/Display/Display.MenuGrid.d.ts +1 -1
- package/dist/Display/Display.MenuGrid.js +1 -1
- package/dist/Display/Display.Monetary.d.ts +1 -1
- package/dist/Display/Display.Monetary.js +2 -2
- package/dist/Display/Display.Pattern.d.ts +33 -12
- package/dist/Display/Display.Pattern.js +60 -14
- package/dist/Display/Display.PriceTag.js +2 -2
- package/dist/Display/Display.ProductCard.js +7 -7
- package/dist/Display/Display.Rating.js +3 -3
- package/dist/Display/Display.SearchHistory.js +6 -6
- package/dist/Display/Display.SectionHeader.d.ts +11 -1
- package/dist/Display/Display.SectionHeader.js +14 -5
- package/dist/Display/Display.Stat.js +2 -2
- package/dist/Display/Display.StatCard.js +4 -4
- package/dist/Display/Display.StatusDot.js +3 -3
- package/dist/Display/Display.Story.js +3 -3
- package/dist/Display/Display.StoryTray.js +5 -5
- package/dist/Display/Display.StoryViewer.js +4 -4
- package/dist/Display/Display.SwipeableRow.d.ts +3 -1
- package/dist/Display/Display.SwipeableRow.js +7 -7
- package/dist/Display/Display.Tag.js +2 -2
- package/dist/Display/Display.Timeline.js +4 -4
- package/dist/Display/Display.Tooltip.js +3 -3
- package/dist/Display/index.d.ts +49 -45
- package/dist/Display/index.js +44 -42
- package/dist/Feedback/ErrorBoundary.d.ts +1 -1
- package/dist/Feedback/ErrorBoundary.js +1 -1
- package/dist/Feedback/Feedback.Banner.d.ts +3 -3
- package/dist/Feedback/Feedback.Banner.js +6 -6
- package/dist/Feedback/Feedback.DomainSplashScreen.js +5 -4
- package/dist/Feedback/Feedback.Empty.js +3 -3
- package/dist/Feedback/Feedback.EmptyState.d.ts +2 -1
- package/dist/Feedback/Feedback.EmptyState.js +7 -7
- package/dist/Feedback/Feedback.Error.d.ts +3 -1
- package/dist/Feedback/Feedback.Error.js +7 -6
- package/dist/Feedback/Feedback.Loading.d.ts +1 -1
- package/dist/Feedback/Feedback.Loading.js +2 -2
- package/dist/Feedback/Feedback.PermissionCard.js +5 -5
- package/dist/Feedback/Feedback.Progress.js +2 -2
- package/dist/Feedback/Feedback.ProgressCircle.js +1 -1
- package/dist/Feedback/Feedback.Skeleton.js +2 -2
- package/dist/Feedback/Feedback.Spinner.js +3 -3
- package/dist/Feedback/Feedback.Splash.d.ts +1 -1
- package/dist/Feedback/Feedback.Splash.js +7 -6
- package/dist/Feedback/Toast.context.js +7 -7
- package/dist/Feedback/index.d.ts +13 -13
- package/dist/Feedback/index.js +13 -13
- package/dist/Form/Form.Button.d.ts +2 -2
- package/dist/Form/Form.Button.js +1 -1
- package/dist/Form/Form.Checkbox.d.ts +4 -1
- package/dist/Form/Form.Checkbox.js +5 -5
- package/dist/Form/Form.ControlledCheckbox.js +1 -1
- package/dist/Form/Form.ControlledInput.js +1 -1
- package/dist/Form/Form.ControlledMonetaryInput.js +1 -1
- package/dist/Form/Form.ControlledRadioButton.js +1 -1
- package/dist/Form/Form.DatePicker.d.ts +2 -1
- package/dist/Form/Form.DatePicker.js +8 -7
- package/dist/Form/Form.Dropdown.js +7 -7
- package/dist/Form/Form.FAB.d.ts +2 -2
- package/dist/Form/Form.FAB.js +1 -1
- package/dist/Form/Form.FilterButton.d.ts +2 -2
- package/dist/Form/Form.FilterButton.js +1 -1
- package/dist/Form/Form.FractionalQuantityInput.js +4 -4
- package/dist/Form/Form.IconButton.d.ts +2 -2
- package/dist/Form/Form.IconButton.js +1 -1
- package/dist/Form/Form.Input.d.ts +5 -3
- package/dist/Form/Form.Input.js +5 -5
- package/dist/Form/Form.InputField.d.ts +1 -1
- package/dist/Form/Form.InputField.js +3 -3
- package/dist/Form/Form.KeyboardForm.d.ts +11 -0
- package/dist/Form/Form.KeyboardForm.js +9 -0
- package/dist/Form/Form.KeyboardToolbar.d.ts +21 -0
- package/dist/Form/Form.KeyboardToolbar.js +70 -0
- package/dist/Form/Form.MonetaryInput.js +5 -4
- package/dist/Form/Form.PasswordInput.d.ts +1 -1
- package/dist/Form/Form.PasswordInput.js +3 -3
- package/dist/Form/Form.PinInput.js +5 -5
- package/dist/Form/Form.QuantitySelector.js +3 -3
- package/dist/Form/Form.RadioButton.js +4 -4
- package/dist/Form/Form.SearchBar.js +4 -4
- package/dist/Form/Form.Select.d.ts +3 -1
- package/dist/Form/Form.Select.js +27 -14
- package/dist/Form/Form.Slider.js +3 -3
- package/dist/Form/Form.Switch.js +4 -4
- package/dist/Form/Form.TextInput.js +3 -3
- package/dist/Form/index.d.ts +33 -27
- package/dist/Form/index.js +29 -25
- package/dist/Navigation/Navigation.AppBar.d.ts +11 -6
- package/dist/Navigation/Navigation.AppBar.js +16 -16
- package/dist/Navigation/Navigation.BottomNav.d.ts +4 -2
- package/dist/Navigation/Navigation.BottomNav.js +34 -21
- package/dist/Navigation/Navigation.CollapsingHeader.d.ts +1 -1
- package/dist/Navigation/Navigation.CollapsingHeader.js +3 -3
- package/dist/Navigation/Navigation.FloatingBar.js +2 -2
- package/dist/Navigation/Navigation.Header.js +6 -6
- package/dist/Navigation/Navigation.HeaderToolbar.js +5 -5
- package/dist/Navigation/Navigation.Menu.js +6 -6
- package/dist/Navigation/Navigation.MenuSection.js +2 -2
- package/dist/Navigation/Navigation.RowItem.d.ts +2 -2
- package/dist/Navigation/Navigation.RowItem.js +4 -4
- package/dist/Navigation/Navigation.SearchBar.d.ts +6 -1
- package/dist/Navigation/Navigation.SearchBar.js +33 -12
- package/dist/Navigation/Navigation.SearchSuggestions.d.ts +14 -0
- package/dist/Navigation/Navigation.SearchSuggestions.js +7 -0
- package/dist/Navigation/Navigation.SegmentedControl.d.ts +3 -1
- package/dist/Navigation/Navigation.SegmentedControl.js +6 -5
- package/dist/Navigation/Navigation.Steps.js +5 -5
- package/dist/Navigation/Navigation.TabIcon.js +2 -2
- package/dist/Navigation/Navigation.TabItem.js +2 -2
- package/dist/Navigation/Navigation.Tabs.js +5 -5
- package/dist/Navigation/index.d.ts +23 -19
- package/dist/Navigation/index.js +17 -15
- package/dist/Typography/Typography.Heading.d.ts +1 -1
- package/dist/Typography/Typography.Heading.js +2 -2
- package/dist/Typography/Typography.SelectableText.d.ts +10 -0
- package/dist/Typography/Typography.SelectableText.js +16 -0
- package/dist/Typography/Typography.Text.d.ts +2 -2
- package/dist/Typography/Typography.Text.js +5 -19
- package/dist/Typography/index.d.ts +5 -2
- package/dist/Typography/index.js +5 -2
- package/dist/branding.d.ts +22 -0
- package/dist/branding.js +20 -3
- package/dist/icons/AddItemIcon.d.ts +1 -1
- package/dist/icons/ArrangeCircle.d.ts +1 -1
- package/dist/icons/ArrowDownIcon.d.ts +1 -1
- package/dist/icons/ArrowUpIcon.d.ts +1 -1
- package/dist/icons/BoxIcon.d.ts +1 -1
- package/dist/icons/BoxTimeIcon.d.ts +1 -1
- package/dist/icons/CalendarIcon.d.ts +1 -1
- package/dist/icons/CardIcon.d.ts +1 -1
- package/dist/icons/CashierIcon.d.ts +1 -1
- package/dist/icons/DuoIcon.d.ts +1 -1
- package/dist/icons/HomeIcon.d.ts +1 -1
- package/dist/icons/HomeIconOutlined.d.ts +1 -1
- package/dist/icons/LogoIcon.d.ts +1 -1
- package/dist/icons/MoneyReceiveIcon.d.ts +1 -1
- package/dist/icons/PinIcon.d.ts +1 -1
- package/dist/icons/PrinterIcon.d.ts +1 -1
- package/dist/icons/ProfileIcon.d.ts +1 -1
- package/dist/icons/SettingsIcon.d.ts +1 -1
- package/dist/icons/SinpeIcon.d.ts +1 -1
- package/dist/icons/ToggleOffIcon.d.ts +1 -1
- package/dist/icons/WalletMoneyIcon.d.ts +1 -1
- package/dist/index.d.ts +24 -23
- package/dist/index.js +26 -24
- package/dist/layouts/AuthContainer.d.ts +9 -3
- package/dist/layouts/AuthContainer.js +8 -8
- package/dist/layouts/Container.js +1 -1
- package/dist/layouts/GradientContainer.js +1 -1
- package/dist/layouts/ScrollContainer.js +1 -1
- package/dist/layouts/TabNavigatorLayout.js +4 -4
- package/dist/primitives/AspectRatio.js +1 -1
- package/dist/primitives/BaseButton.d.ts +92 -87
- package/dist/primitives/BaseButton.js +52 -54
- package/dist/primitives/Box.js +1 -1
- package/dist/primitives/Pressable.js +1 -1
- package/dist/primitives/Row.js +1 -1
- package/dist/primitives/Stack.js +1 -1
- package/dist/primitives/index.d.ts +6 -6
- package/dist/primitives/index.js +6 -6
- package/dist/theme/active.d.ts +1 -1
- package/dist/theme/active.js +14 -1
- package/dist/theme/build.d.ts +33 -0
- package/dist/theme/build.js +118 -0
- package/dist/theme/color.d.ts +26 -0
- package/dist/theme/color.js +109 -0
- package/dist/theme/components/index.d.ts +1 -1
- package/dist/theme/components/index.js +1 -1
- package/dist/theme/contrast.d.ts +29 -0
- package/dist/theme/contrast.js +57 -0
- package/dist/theme/css-vars.d.ts +3 -1
- package/dist/theme/css-vars.js +29 -3
- package/dist/theme/dark.d.ts +3 -4
- package/dist/theme/dark.js +91 -48
- package/dist/theme/default.d.ts +5 -1
- package/dist/theme/default.js +89 -41
- package/dist/theme/define.d.ts +4 -1
- package/dist/theme/define.js +4 -1
- package/dist/theme/globals.css +61 -46
- package/dist/theme/index.d.ts +14 -10
- package/dist/theme/index.js +13 -9
- package/dist/theme/theme.d.ts +1 -1
- package/dist/theme/theme.js +2 -2
- package/dist/theme/types.d.ts +77 -16
- package/dist/theme/types.js +13 -3
- package/dist/theme/typography.d.ts +19 -4
- package/dist/theme/typography.js +45 -28
- package/dist/theme/useTheme.d.ts +1 -1
- package/dist/theme/useTheme.js +1 -1
- package/dist/theme/validate.d.ts +16 -0
- package/dist/theme/validate.js +200 -0
- package/dist/tokens/index.d.ts +2 -2
- package/dist/tokens/index.js +2 -2
- package/dist/utils/criteria.d.ts +56 -0
- package/dist/utils/criteria.js +99 -0
- package/dist/utils/reorder.d.ts +4 -0
- package/dist/utils/reorder.js +32 -0
- package/dist/views/AppSplashView.d.ts +2 -2
- package/dist/views/AppSplashView.js +3 -3
- package/dist/views/AuthFormView.d.ts +5 -2
- package/dist/views/AuthFormView.js +5 -5
- package/dist/views/FormViewV2.d.ts +9 -4
- package/dist/views/FormViewV2.js +44 -25
- package/dist/views/ListViewV2.d.ts +12 -9
- package/dist/views/ListViewV2.js +49 -36
- package/dist/views/Wizard/Wizard.context.js +1 -1
- package/dist/views/Wizard/Wizard.d.ts +1 -1
- package/dist/views/Wizard/Wizard.js +1 -1
- package/dist/views/Wizard/index.d.ts +4 -4
- package/dist/views/Wizard/index.js +2 -2
- package/dist/views/types/IFormView.d.ts +1 -1
- package/dist/views/types/IListView.d.ts +1 -1
- package/dist/widgets/CircleButton.d.ts +2 -2
- package/dist/widgets/CircleButton.js +1 -1
- package/dist/widgets/CollectionOptions.d.ts +15 -0
- package/dist/widgets/CollectionOptions.js +127 -0
- package/dist/widgets/FilterBar.d.ts +21 -0
- package/dist/widgets/FilterBar.js +14 -0
- package/dist/widgets/FilterBuilder.d.ts +10 -0
- package/dist/widgets/FilterBuilder.js +115 -0
- package/dist/widgets/GeoPermissionCard.js +3 -3
- package/dist/widgets/HomeHeader.js +3 -3
- package/dist/widgets/JSONViewer.js +2 -2
- package/dist/widgets/MenuCard.d.ts +2 -2
- package/dist/widgets/MenuCard.js +1 -1
- package/dist/widgets/MenuGrid.d.ts +3 -3
- package/dist/widgets/MenuGrid.js +1 -1
- package/dist/widgets/MenuSection.d.ts +2 -2
- package/dist/widgets/MenuSection.js +1 -1
- package/dist/widgets/PromoBanner.js +3 -3
- package/dist/widgets/PromoModal.js +3 -3
- package/dist/widgets/QueryChoice.d.ts +10 -0
- package/dist/widgets/QueryChoice.js +13 -0
- package/dist/widgets/QuickActions.js +3 -3
- package/dist/widgets/ReorderableList.d.ts +51 -0
- package/dist/widgets/ReorderableList.js +138 -0
- package/dist/widgets/ScreenHeader.js +2 -2
- package/dist/widgets/TimeZoneSelector.d.ts +1 -1
- package/dist/widgets/TimeZoneSelector.js +4 -4
- package/dist/widgets/TimeZoneSelectorModal.d.ts +1 -1
- package/dist/widgets/TimeZoneSelectorModal.js +5 -5
- package/dist/widgets/index.d.ts +20 -16
- package/dist/widgets/index.js +13 -10
- package/package.json +70 -50
- package/tailwind.preset.js +19 -0
- package/dist/icons/icon_getters.d.ts +0 -6
- 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: ["#
|
|
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: `"
|
|
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-
|
|
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 (
|
|
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 ?? "
|
|
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
|
-
|
|
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.
|
|
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 ?
|
|
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: {
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
|
|
2
|
-
import AppBar from "
|
|
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
|
|
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
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
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-
|
|
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
|
-
},
|
|
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
|
|
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.
|
|
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
|