@sincpro/mobile-ui 0.7.2 → 1.0.1
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 +7 -5
- package/dist/Actions/Actions.Button.d.ts +91 -91
- package/dist/Actions/Actions.Button.js +36 -43
- package/dist/Actions/Actions.FAB.js +5 -5
- package/dist/Actions/Actions.FilterButton.js +3 -3
- package/dist/Actions/Actions.IconButton.d.ts +31 -31
- package/dist/Actions/Actions.IconButton.js +4 -4
- package/dist/Actions/index.d.ts +11 -11
- package/dist/Actions/index.js +5 -5
- 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.js +6 -6
- package/dist/Dialog/Dialog.Confirmation.js +4 -4
- package/dist/Dialog/Dialog.EditValue.js +4 -4
- package/dist/Dialog/Dialog.Sheet.js +6 -4
- 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.js +2 -2
- 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 +1 -1
- package/dist/Display/Display.IconBadge.js +3 -3
- package/dist/Display/Display.Image.js +4 -4
- package/dist/Display/Display.KeyValue.js +2 -2
- package/dist/Display/Display.ListItem.js +5 -5
- 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.js +4 -4
- 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.js +4 -4
- 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 +45 -45
- package/dist/Display/index.js +42 -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 +5 -5
- package/dist/Feedback/Feedback.DomainSplashScreen.js +5 -4
- package/dist/Feedback/Feedback.Empty.js +3 -3
- package/dist/Feedback/Feedback.EmptyState.js +5 -5
- package/dist/Feedback/Feedback.Error.js +4 -4
- 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.js +4 -4
- 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.js +5 -5
- 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.js +4 -4
- package/dist/Form/Form.InputField.d.ts +1 -1
- package/dist/Form/Form.InputField.js +3 -3
- 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.js +6 -6
- 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 +27 -27
- package/dist/Form/index.js +25 -25
- package/dist/Navigation/Navigation.AppBar.d.ts +5 -4
- package/dist/Navigation/Navigation.AppBar.js +10 -10
- package/dist/Navigation/Navigation.BottomNav.d.ts +1 -1
- package/dist/Navigation/Navigation.BottomNav.js +25 -16
- 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 +1 -1
- package/dist/Navigation/Navigation.RowItem.js +2 -2
- package/dist/Navigation/Navigation.SearchBar.js +6 -6
- package/dist/Navigation/Navigation.SegmentedControl.js +4 -4
- 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 +19 -19
- package/dist/Navigation/index.js +15 -15
- package/dist/Typography/Typography.Heading.d.ts +1 -1
- package/dist/Typography/Typography.Heading.js +1 -1
- package/dist/Typography/Typography.Text.d.ts +2 -2
- package/dist/Typography/Typography.Text.js +8 -6
- package/dist/Typography/index.d.ts +2 -2
- package/dist/Typography/index.js +2 -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 +5 -2
- package/dist/layouts/AuthContainer.js +6 -6
- 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 +85 -85
- package/dist/primitives/BaseButton.js +34 -50
- 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 +4 -4
- package/dist/theme/typography.js +26 -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/views/AppSplashView.d.ts +2 -2
- package/dist/views/AppSplashView.js +3 -3
- package/dist/views/AuthFormView.d.ts +1 -1
- package/dist/views/AuthFormView.js +3 -3
- package/dist/views/FormViewV2.d.ts +2 -2
- package/dist/views/FormViewV2.js +9 -9
- package/dist/views/ListViewV2.d.ts +3 -3
- package/dist/views/ListViewV2.js +16 -16
- 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/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/QuickActions.js +3 -3
- 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 +16 -16
- package/dist/widgets/index.js +10 -10
- package/package.json +56 -50
- package/tailwind.preset.js +19 -0
- package/dist/icons/icon_getters.d.ts +0 -6
- package/dist/icons/icon_getters.js +0 -23
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { contrastRatio, resolveOnColor } from "./contrast.js";
|
|
2
|
+
/**
|
|
3
|
+
* Lightweight sanity checks on a theme. Returns a list of issues; empty array means OK.
|
|
4
|
+
* Not a hard validator — we don't want to over-constrain creative themes — just guards
|
|
5
|
+
* against the common silent failures (typos in hex, negative sizes, missing primary,
|
|
6
|
+
* WCAG P0 contrast violations on the key on-color pairs, semantic token collisions).
|
|
7
|
+
*
|
|
8
|
+
* Triggered automatically by `setActiveTheme` in dev mode (skipped under Node, since
|
|
9
|
+
* tests intentionally pass partial themes). Can also be called directly.
|
|
10
|
+
*/
|
|
11
|
+
export function validateTheme(theme) {
|
|
12
|
+
const issues = [];
|
|
13
|
+
if (typeof theme.name !== "string" || theme.name.trim() === "") {
|
|
14
|
+
issues.push({ path: "name", message: "Theme must have a non-empty `name`." });
|
|
15
|
+
}
|
|
16
|
+
if (!isHex(theme.primary)) {
|
|
17
|
+
issues.push({ path: "primary", message: `Invalid hex color: ${String(theme.primary)}` });
|
|
18
|
+
}
|
|
19
|
+
if (!isHex(theme.accent)) {
|
|
20
|
+
issues.push({ path: "accent", message: `Invalid hex color: ${String(theme.accent)}` });
|
|
21
|
+
}
|
|
22
|
+
if (!isHex(theme.bg?.page)) {
|
|
23
|
+
issues.push({ path: "bg.page", message: `Invalid hex color: ${String(theme.bg?.page)}` });
|
|
24
|
+
}
|
|
25
|
+
if (!isHex(theme.text?.primary)) {
|
|
26
|
+
issues.push({
|
|
27
|
+
path: "text.primary",
|
|
28
|
+
message: `Invalid hex color: ${String(theme.text?.primary)}`,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
if (theme.pattern) {
|
|
32
|
+
if (!isFiniteSize(theme.pattern.size)) {
|
|
33
|
+
issues.push({
|
|
34
|
+
path: "pattern.size",
|
|
35
|
+
message: `Tile size must be > 0 (got ${String(theme.pattern.size)}).`,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (theme.shadow) {
|
|
40
|
+
issues.push(...validateShadow("shadow.sm", theme.shadow.sm));
|
|
41
|
+
issues.push(...validateShadow("shadow.md", theme.shadow.md));
|
|
42
|
+
issues.push(...validateShadow("shadow.lg", theme.shadow.lg));
|
|
43
|
+
}
|
|
44
|
+
issues.push(...validateContrast(theme));
|
|
45
|
+
issues.push(...validateSemanticDistinct(theme));
|
|
46
|
+
return issues;
|
|
47
|
+
}
|
|
48
|
+
function isHex(value) {
|
|
49
|
+
return typeof value === "string" && /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(value.trim());
|
|
50
|
+
}
|
|
51
|
+
function isFiniteSize(n) {
|
|
52
|
+
return typeof n === "number" && Number.isFinite(n) && n > 0;
|
|
53
|
+
}
|
|
54
|
+
function validateShadow(path, s) {
|
|
55
|
+
const out = [];
|
|
56
|
+
if (typeof s.shadowColor !== "string" || s.shadowColor.trim() === "") {
|
|
57
|
+
out.push({ path: `${path}.shadowColor`, message: "shadowColor must be a string." });
|
|
58
|
+
}
|
|
59
|
+
if (typeof s.shadowOpacity !== "number" || s.shadowOpacity < 0 || s.shadowOpacity > 1) {
|
|
60
|
+
out.push({
|
|
61
|
+
path: `${path}.shadowOpacity`,
|
|
62
|
+
message: `shadowOpacity must be in [0, 1] (got ${s.shadowOpacity}).`,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* WCAG 2.1 contrast validation. Checks the P0 on-color pairs that every consumer
|
|
69
|
+
* relies on (CTA text/bg, focus ring, body text on surfaces). Flags any pair below the
|
|
70
|
+
* AA minimum (3:1 for UI/non-text, 4.5:1 for body text). Returns warnings as Issue[]
|
|
71
|
+
* entries — never throws — so the dev-mode warning stays non-fatal.
|
|
72
|
+
*/
|
|
73
|
+
function validateContrast(theme) {
|
|
74
|
+
const issues = [];
|
|
75
|
+
const checks = [
|
|
76
|
+
{
|
|
77
|
+
fg: theme.text?.onPrimary,
|
|
78
|
+
bg: theme.primary,
|
|
79
|
+
min: 4.5,
|
|
80
|
+
label: "text.onPrimary on primary (CTA)",
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
fg: theme.text?.onSecondary,
|
|
84
|
+
bg: theme.secondary,
|
|
85
|
+
min: 4.5,
|
|
86
|
+
label: "text.onSecondary on secondary",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
fg: theme.text?.onAccent,
|
|
90
|
+
bg: theme.accent,
|
|
91
|
+
min: 4.5,
|
|
92
|
+
label: "text.onAccent on accent",
|
|
93
|
+
},
|
|
94
|
+
{ fg: theme.border?.focus, bg: theme.bg?.page, min: 3, label: "border.focus on bg.page" },
|
|
95
|
+
{ fg: theme.border?.focus, bg: theme.bg?.card, min: 3, label: "border.focus on bg.card" },
|
|
96
|
+
{
|
|
97
|
+
fg: theme.text?.onDanger,
|
|
98
|
+
bg: theme.danger,
|
|
99
|
+
min: 4.5,
|
|
100
|
+
label: "text.onDanger on danger",
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
fg: theme.text?.onSuccess,
|
|
104
|
+
bg: theme.success,
|
|
105
|
+
min: 4.5,
|
|
106
|
+
label: "text.onSuccess on success",
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
fg: theme.text?.accent,
|
|
110
|
+
bg: theme.bg?.card,
|
|
111
|
+
min: 4.5,
|
|
112
|
+
label: "text.accent on bg.card (brand text)",
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
fg: theme.text?.accent,
|
|
116
|
+
bg: theme.bg?.page,
|
|
117
|
+
min: 4.5,
|
|
118
|
+
label: "text.accent on bg.page (brand text)",
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
fg: theme.container?.onPrimary,
|
|
122
|
+
bg: theme.container?.primary,
|
|
123
|
+
min: 4.5,
|
|
124
|
+
label: "container.onPrimary on container.primary",
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
fg: theme.container?.onSuccess,
|
|
128
|
+
bg: theme.container?.success,
|
|
129
|
+
min: 4.5,
|
|
130
|
+
label: "container.onSuccess on container.success",
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
fg: theme.container?.onDanger,
|
|
134
|
+
bg: theme.container?.danger,
|
|
135
|
+
min: 4.5,
|
|
136
|
+
label: "container.onDanger on container.danger",
|
|
137
|
+
},
|
|
138
|
+
];
|
|
139
|
+
for (const c of checks) {
|
|
140
|
+
if (!isHex(c.fg) || !isHex(c.bg))
|
|
141
|
+
continue;
|
|
142
|
+
const ratio = contrastRatio(c.fg, c.bg);
|
|
143
|
+
if (ratio < c.min) {
|
|
144
|
+
let message = `Contrast ratio ${ratio.toFixed(2)}:1 is below WCAG AA minimum ${c.min}:1 for body/UI text.`;
|
|
145
|
+
if (c.label.includes("onPrimary") && isHex(theme.primary)) {
|
|
146
|
+
const suggested = resolveOnColor(theme.primary);
|
|
147
|
+
message += ` Use resolveOnColor(primary) → ${suggested}.`;
|
|
148
|
+
}
|
|
149
|
+
issues.push({ path: c.label, message });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return issues;
|
|
153
|
+
}
|
|
154
|
+
/** Roles that must stay visually distinct for maintainable state semantics. */
|
|
155
|
+
function validateSemanticDistinct(theme) {
|
|
156
|
+
const issues = [];
|
|
157
|
+
const pairs = [
|
|
158
|
+
["bg.disabled vs bg.muted", theme.bg?.disabled, theme.bg?.muted],
|
|
159
|
+
["text.disabled vs text.muted", theme.text?.disabled, theme.text?.muted],
|
|
160
|
+
["icon.disabled vs icon.secondary", theme.icon?.disabled, theme.icon?.secondary],
|
|
161
|
+
];
|
|
162
|
+
for (const [label, a, b] of pairs) {
|
|
163
|
+
if (!isHex(a) || !isHex(b))
|
|
164
|
+
continue;
|
|
165
|
+
if (a.trim().toLowerCase() === b.trim().toLowerCase()) {
|
|
166
|
+
issues.push({
|
|
167
|
+
path: label,
|
|
168
|
+
message: `Tokens share the same hex (${a}). Keep roles distinct so disabled/muted states stay maintainable.`,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (theme.state) {
|
|
173
|
+
for (const key of ["hover", "press", "focus", "drag"]) {
|
|
174
|
+
const v = theme.state[key];
|
|
175
|
+
if (typeof v !== "number" || v < 0 || v > 1) {
|
|
176
|
+
issues.push({
|
|
177
|
+
path: `state.${key}`,
|
|
178
|
+
message: `State layer opacity must be in [0, 1] (got ${String(v)}).`,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (theme.material) {
|
|
184
|
+
if (typeof theme.material.opacity === "number" &&
|
|
185
|
+
(theme.material.opacity < 0 || theme.material.opacity > 1)) {
|
|
186
|
+
issues.push({
|
|
187
|
+
path: "material.opacity",
|
|
188
|
+
message: `material.opacity must be in [0, 1] (got ${theme.material.opacity}).`,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
if (typeof theme.material.blur === "number" &&
|
|
192
|
+
(!Number.isFinite(theme.material.blur) || theme.material.blur < 0)) {
|
|
193
|
+
issues.push({
|
|
194
|
+
path: "material.blur",
|
|
195
|
+
message: `material.blur must be ≥ 0 (got ${theme.material.blur}).`,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return issues;
|
|
200
|
+
}
|
package/dist/tokens/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { motion } from "
|
|
2
|
-
export { duration, type DurationToken, easing, type EasingToken, spring, type SpringToken, } from "
|
|
1
|
+
export { motion } from "./motion.js";
|
|
2
|
+
export { duration, type DurationToken, easing, type EasingToken, spring, type SpringToken, } from "./motion.js";
|
package/dist/tokens/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { motion } from "
|
|
2
|
-
export { duration, easing, spring, } from "
|
|
1
|
+
export { motion } from "./motion.js";
|
|
2
|
+
export { duration, easing, spring, } from "./motion.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type SpinnerVariant } from "../Feedback/Feedback.Spinner";
|
|
2
|
-
import type { AppBarBackground } from "../Navigation/Navigation.AppBar";
|
|
1
|
+
import { type SpinnerVariant } from "../Feedback/Feedback.Spinner.js";
|
|
2
|
+
import type { AppBarBackground } from "../Navigation/Navigation.AppBar.js";
|
|
3
3
|
import type { ReactNode } from "react";
|
|
4
4
|
import { type ImageSourcePropType, type ViewStyle } from "react-native";
|
|
5
5
|
export interface AppSplashViewProps {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
|
|
2
|
-
import GradientSurface from "../Display/Display.GradientSurface";
|
|
3
|
-
import { Pattern } from "../Display/Display.Pattern";
|
|
4
|
-
import Spinner from "../Feedback/Feedback.Spinner";
|
|
2
|
+
import GradientSurface from "../Display/Display.GradientSurface.js";
|
|
3
|
+
import { Pattern } from "../Display/Display.Pattern.js";
|
|
4
|
+
import Spinner from "../Feedback/Feedback.Spinner.js";
|
|
5
5
|
import { Image, View } from "react-native";
|
|
6
6
|
export function AppSplashView({ background, logo, loadingVariant = "dots", loader, style, }) {
|
|
7
7
|
return (_jsxs(GradientSurface, { className: "flex-1", colors: background?.colors, end: background?.end, padding: "none", preset: background?.surface ?? "night-green", radius: "none", start: background?.start, style: { flex: 1, ...style }, children: [background?.pattern ? (_jsx(Pattern, { color: background.patternColor ?? "#FFFFFF", kind: background.pattern, opacity: background.patternOpacity ?? 0.18 })) : null, _jsxs(View, { style: { flex: 1, alignItems: "center", justifyContent: "center" }, children: [logo ? (_jsx(Image, { source: logo, style: { width: 140, height: 140, resizeMode: "contain", marginBottom: 40 } })) : null, loader ?? (_jsx(Spinner, { color: "rgba(255,255,255,0.9)", size: "large", variant: loadingVariant }))] })] }));
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AppBarBackground } from "../Navigation/Navigation.AppBar";
|
|
1
|
+
import type { AppBarBackground } from "../Navigation/Navigation.AppBar.js";
|
|
2
2
|
import { ReactNode } from "react";
|
|
3
3
|
import { type ImageSourcePropType } from "react-native";
|
|
4
4
|
interface AuthFormProps {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
|
|
2
|
-
import { Display } from "../Display";
|
|
3
|
-
import AuthContainer from "../layouts/AuthContainer";
|
|
4
|
-
import { Typography } from "../Typography";
|
|
2
|
+
import { Display } from "../Display/index.js";
|
|
3
|
+
import AuthContainer from "../layouts/AuthContainer.js";
|
|
4
|
+
import { Typography } from "../Typography/index.js";
|
|
5
5
|
import { View } from "react-native";
|
|
6
6
|
const Logo = Display.Logo;
|
|
7
7
|
const Text = Typography.Text;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { AppBarBackground } from "../Navigation/Navigation.AppBar";
|
|
2
|
-
import { type SegmentedControlProps } from "../Navigation/Navigation.SegmentedControl";
|
|
1
|
+
import type { AppBarBackground } from "../Navigation/Navigation.AppBar.js";
|
|
2
|
+
import { type SegmentedControlProps } from "../Navigation/Navigation.SegmentedControl.js";
|
|
3
3
|
import React, { ReactNode } from "react";
|
|
4
4
|
import { type ImageSourcePropType } from "react-native";
|
|
5
5
|
interface FormViewProps<T> {
|
package/dist/views/FormViewV2.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "nativewind/jsx-runtime";
|
|
2
|
-
import { Display } from "../Display";
|
|
3
|
-
import { ErrorBoundary, Feedback } from "../Feedback";
|
|
4
|
-
import { useBottomInset } from "../layouts/BottomInset";
|
|
5
|
-
import Container from "../layouts/Container";
|
|
6
|
-
import { AppBar } from "../Navigation/Navigation.AppBar";
|
|
7
|
-
import { MenuSection } from "../Navigation/Navigation.MenuSection";
|
|
8
|
-
import { SegmentedControl, } from "../Navigation/Navigation.SegmentedControl";
|
|
9
|
-
import { useTheme } from "../theme";
|
|
10
|
-
import { FormViewProvider, useFormView } from "
|
|
2
|
+
import { Display } from "../Display/index.js";
|
|
3
|
+
import { ErrorBoundary, Feedback } from "../Feedback/index.js";
|
|
4
|
+
import { useBottomInset } from "../layouts/BottomInset.js";
|
|
5
|
+
import Container from "../layouts/Container.js";
|
|
6
|
+
import { AppBar } from "../Navigation/Navigation.AppBar.js";
|
|
7
|
+
import { MenuSection } from "../Navigation/Navigation.MenuSection.js";
|
|
8
|
+
import { SegmentedControl, } from "../Navigation/Navigation.SegmentedControl.js";
|
|
9
|
+
import { useTheme } from "../theme/index.js";
|
|
10
|
+
import { FormViewProvider, useFormView } from "./FormViewV2.context.js";
|
|
11
11
|
import React from "react";
|
|
12
12
|
import { RefreshControl, View } from "react-native";
|
|
13
13
|
import { KeyboardAwareScrollView } from "react-native-keyboard-controller";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { type SearchHistoryProps } from "../Display/Display.SearchHistory";
|
|
2
|
-
import type { AppBarBackground } from "../Navigation/Navigation.AppBar";
|
|
3
|
-
import { type SegmentedControlProps } from "../Navigation/Navigation.SegmentedControl";
|
|
1
|
+
import { type SearchHistoryProps } from "../Display/Display.SearchHistory.js";
|
|
2
|
+
import type { AppBarBackground } from "../Navigation/Navigation.AppBar.js";
|
|
3
|
+
import { type SegmentedControlProps } from "../Navigation/Navigation.SegmentedControl.js";
|
|
4
4
|
import React, { ReactNode } from "react";
|
|
5
5
|
import { StyleProp, ViewStyle } from "react-native";
|
|
6
6
|
interface ListViewProps<T> {
|
package/dist/views/ListViewV2.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "nativewind/jsx-runtime";
|
|
2
|
-
import { Display } from "../Display";
|
|
3
|
-
import SearchHistory from "../Display/Display.SearchHistory";
|
|
4
|
-
import { ErrorBoundary, Feedback } from "../Feedback";
|
|
5
|
-
import { useBottomInset } from "../layouts/BottomInset";
|
|
6
|
-
import Container from "../layouts/Container";
|
|
7
|
-
import { Navigation } from "../Navigation";
|
|
8
|
-
import { SegmentedControl, } from "../Navigation/Navigation.SegmentedControl";
|
|
9
|
-
import { useTheme } from "../theme";
|
|
10
|
-
import { cn, tv } from "../theme/tw";
|
|
11
|
-
import { Typography } from "../Typography";
|
|
12
|
-
import { ListViewProvider, useListView } from "
|
|
13
|
-
import { toRowItems } from "
|
|
2
|
+
import { Display } from "../Display/index.js";
|
|
3
|
+
import SearchHistory from "../Display/Display.SearchHistory.js";
|
|
4
|
+
import { ErrorBoundary, Feedback } from "../Feedback/index.js";
|
|
5
|
+
import { useBottomInset } from "../layouts/BottomInset.js";
|
|
6
|
+
import Container from "../layouts/Container.js";
|
|
7
|
+
import { Navigation } from "../Navigation/index.js";
|
|
8
|
+
import { SegmentedControl, } from "../Navigation/Navigation.SegmentedControl.js";
|
|
9
|
+
import { useTheme } from "../theme/index.js";
|
|
10
|
+
import { cn, tv } from "../theme/tw.js";
|
|
11
|
+
import { Typography } from "../Typography/index.js";
|
|
12
|
+
import { ListViewProvider, useListView } from "./ListViewV2.context.js";
|
|
13
|
+
import { toRowItems } from "./types/IListView.js";
|
|
14
14
|
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
15
15
|
import { FlatList, RefreshControl, ScrollView, TouchableOpacity, View, } from "react-native";
|
|
16
16
|
function ListViewRoot({ name, description, items, isLoading = false, hasError = false, errorMessage, readonly = false, onRefresh, onRetry, onPressItem, onDeleteItem, onSearch, onBack, onLoadMore, loadingMore = false, backgroundColor, withContainer = true, children, }) {
|
|
@@ -69,12 +69,12 @@ function HeaderSearchHistory(props) {
|
|
|
69
69
|
function HeaderFilters({ children }) {
|
|
70
70
|
return _jsx(View, { className: "px-4 py-2 items-center", children: children });
|
|
71
71
|
}
|
|
72
|
-
//
|
|
72
|
+
// Active filter uses the action color. The capsule is a pill; the rest of the chrome is not.
|
|
73
73
|
const filterChip = tv({
|
|
74
74
|
base: "py-1.5 px-3.5 items-center justify-center rounded-full",
|
|
75
75
|
variants: {
|
|
76
76
|
active: {
|
|
77
|
-
true: "bg-
|
|
77
|
+
true: "bg-primary",
|
|
78
78
|
false: "bg-bg-muted",
|
|
79
79
|
},
|
|
80
80
|
},
|
|
@@ -83,7 +83,7 @@ const filterChip = tv({
|
|
|
83
83
|
const filterChipText = tv({
|
|
84
84
|
variants: {
|
|
85
85
|
active: {
|
|
86
|
-
true: "text-text-
|
|
86
|
+
true: "text-text-on-primary font-semibold",
|
|
87
87
|
false: "text-text-secondary",
|
|
88
88
|
},
|
|
89
89
|
},
|
|
@@ -153,7 +153,7 @@ function ContentList({ children, contentWithMargin, }) {
|
|
|
153
153
|
marginTop: 2,
|
|
154
154
|
paddingHorizontal: contentWithMargin ? 4 : 0,
|
|
155
155
|
backgroundColor: theme.bg.page,
|
|
156
|
-
}, children: _jsx(FlatList, { contentContainerStyle: bottomInset ? { paddingBottom: bottomInset } : undefined, data: rowItems, keyExtractor: (item) => String(item.index), ListFooterComponent: loadingMore ? (_jsx(View, { className: "py-4", children: _jsx(Feedback.Spinner, { size: "small" }) })) :
|
|
156
|
+
}, children: _jsx(FlatList, { contentContainerStyle: bottomInset ? { paddingBottom: bottomInset } : undefined, data: rowItems, keyExtractor: (item) => String(item.index), ListFooterComponent: loadingMore ? (_jsx(View, { className: "py-4", children: _jsx(Feedback.Spinner, { size: "small" }) })) : undefined, onEndReached: onLoadMore ? () => onLoadMore() : undefined, onEndReachedThreshold: 0.5, refreshControl: _jsx(RefreshControl, { colors: [theme.primary], onRefresh: handleRefresh, refreshing: showRefreshing }), renderItem: renderItem, scrollEnabled: true, showsVerticalScrollIndicator: false }) }));
|
|
157
157
|
}
|
|
158
158
|
function Footer({ children }) {
|
|
159
159
|
const { items } = useListView();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
|
|
2
|
-
import { ErrorBoundary } from "../../Feedback";
|
|
2
|
+
import { ErrorBoundary } from "../../Feedback/index.js";
|
|
3
3
|
import { createContext, useCallback, useContext, useMemo, useState } from "react";
|
|
4
4
|
import { ActivityIndicator, Text, View } from "react-native";
|
|
5
5
|
const WizardContext = createContext(null);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { WizardContextValue, WizardProviderProps, WizardStepId } from "
|
|
1
|
+
import type { WizardContextValue, WizardProviderProps, WizardStepId } from "./Wizard.context.js";
|
|
2
2
|
import type { FC, ReactNode } from "react";
|
|
3
3
|
export interface WizardStepGuard {
|
|
4
4
|
canEnter?: () => boolean | Promise<boolean>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment } from "nativewind/jsx-runtime";
|
|
2
|
-
import { useWizard, WizardProvider } from "
|
|
2
|
+
import { useWizard, WizardProvider } from "./Wizard.context.js";
|
|
3
3
|
import { useEffect } from "react";
|
|
4
4
|
import { TouchableOpacity } from "react-native";
|
|
5
5
|
const WizardRoot = (props) => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { WizardBackProps, WizardGoProps, WizardGuardProps, WizardStepGuard, WizardStepLifecycle, WizardStepProps, } from "
|
|
2
|
-
export { Wizard } from "
|
|
3
|
-
export type { WizardContextValue, WizardProviderProps, WizardStepId, } from "
|
|
4
|
-
export { useWizard } from "
|
|
1
|
+
export type { WizardBackProps, WizardGoProps, WizardGuardProps, WizardStepGuard, WizardStepLifecycle, WizardStepProps, } from "./Wizard.js";
|
|
2
|
+
export { Wizard } from "./Wizard.js";
|
|
3
|
+
export type { WizardContextValue, WizardProviderProps, WizardStepId, } from "./Wizard.context.js";
|
|
4
|
+
export { useWizard } from "./Wizard.context.js";
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Wizard } from "
|
|
2
|
-
export { useWizard } from "
|
|
1
|
+
export { Wizard } from "./Wizard.js";
|
|
2
|
+
export { useWizard } from "./Wizard.context.js";
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/** @deprecated Import from `@sincpro/mobile-ui/Display` → `Display.CircleButton` instead. */
|
|
2
|
-
export type { CircleButtonProps } from "../Display/Display.CircleButton";
|
|
3
|
-
export { CircleButton } from "../Display/Display.CircleButton";
|
|
2
|
+
export type { CircleButtonProps } from "../Display/Display.CircleButton.js";
|
|
3
|
+
export { CircleButton } from "../Display/Display.CircleButton.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { CircleButton } from "../Display/Display.CircleButton";
|
|
1
|
+
export { CircleButton } from "../Display/Display.CircleButton.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
|
|
2
|
-
import { Display, Form } from "../index";
|
|
3
|
-
import { theme } from "../theme";
|
|
4
|
-
import { Typography } from "../Typography";
|
|
2
|
+
import { Display, Form } from "../index.js";
|
|
3
|
+
import { theme } from "../theme/index.js";
|
|
4
|
+
import { Typography } from "../Typography/index.js";
|
|
5
5
|
import { View } from "react-native";
|
|
6
6
|
import { tv } from "tailwind-variants";
|
|
7
7
|
const statusTextVariants = tv({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
|
|
2
|
-
import { Display, Typography } from "../index";
|
|
3
|
-
import GradientContainer from "../layouts/GradientContainer";
|
|
4
|
-
import { theme } from "../theme";
|
|
2
|
+
import { Display, Typography } from "../index.js";
|
|
3
|
+
import GradientContainer from "../layouts/GradientContainer.js";
|
|
4
|
+
import { theme } from "../theme/index.js";
|
|
5
5
|
import { TouchableOpacity, View } from "react-native";
|
|
6
6
|
/**
|
|
7
7
|
* @deprecated Legacy style (gradient). For new top bars use `Navigation.AppBar`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
|
|
2
|
-
import { ThemedActivityIndicator } from "../theme";
|
|
3
|
-
import { fontFamilies } from "../theme/typography";
|
|
2
|
+
import { ThemedActivityIndicator } from "../theme/index.js";
|
|
3
|
+
import { fontFamilies } from "../theme/typography.js";
|
|
4
4
|
import { useEffect, useMemo, useState } from "react";
|
|
5
5
|
import { Text, View } from "react-native";
|
|
6
6
|
const parseDeepJson = (value) => {
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/** @deprecated Import from `@sincpro/mobile-ui/Display` → `Display.MenuCard` instead. */
|
|
2
|
-
export type { MenuCardProps } from "../Display/Display.MenuCard";
|
|
3
|
-
export { MenuCard } from "../Display/Display.MenuCard";
|
|
2
|
+
export type { MenuCardProps } from "../Display/Display.MenuCard.js";
|
|
3
|
+
export { MenuCard } from "../Display/Display.MenuCard.js";
|
package/dist/widgets/MenuCard.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { MenuCard } from "../Display/Display.MenuCard";
|
|
1
|
+
export { MenuCard } from "../Display/Display.MenuCard.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** @deprecated Import from `@sincpro/mobile-ui/Display` → `Display.MenuGrid` instead. */
|
|
2
|
-
export type { MenuGridItem, MenuGridProps, } from "../Display/Display.MenuGrid";
|
|
3
|
-
export { MenuGrid } from "../Display/Display.MenuGrid";
|
|
2
|
+
export type { MenuGridItem, MenuGridProps, } from "../Display/Display.MenuGrid.js";
|
|
3
|
+
export { MenuGrid } from "../Display/Display.MenuGrid.js";
|
|
4
4
|
/** @deprecated Renamed to `MenuGridItem`. */
|
|
5
|
-
export type { MenuGridItem as MenuItem } from "../Display/Display.MenuGrid";
|
|
5
|
+
export type { MenuGridItem as MenuItem } from "../Display/Display.MenuGrid.js";
|
package/dist/widgets/MenuGrid.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { MenuGrid } from "../Display/Display.MenuGrid";
|
|
1
|
+
export { MenuGrid } from "../Display/Display.MenuGrid.js";
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/** @deprecated Import from `@sincpro/mobile-ui/Navigation` → `Navigation.MenuSection` instead. */
|
|
2
|
-
export type { MenuSectionProps } from "../Navigation/Navigation.MenuSection";
|
|
3
|
-
export { MenuSection } from "../Navigation/Navigation.MenuSection";
|
|
2
|
+
export type { MenuSectionProps } from "../Navigation/Navigation.MenuSection.js";
|
|
3
|
+
export { MenuSection } from "../Navigation/Navigation.MenuSection.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { MenuSection } from "../Navigation/Navigation.MenuSection";
|
|
1
|
+
export { MenuSection } from "../Navigation/Navigation.MenuSection.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
|
|
2
|
-
import GradientSurface from "../Display/Display.GradientSurface";
|
|
3
|
-
import { useTheme } from "../theme";
|
|
4
|
-
import { Typography } from "../Typography";
|
|
2
|
+
import GradientSurface from "../Display/Display.GradientSurface.js";
|
|
3
|
+
import { useTheme } from "../theme/index.js";
|
|
4
|
+
import { Typography } from "../Typography/index.js";
|
|
5
5
|
import { ScrollView, TouchableOpacity, View } from "react-native";
|
|
6
6
|
function BannerCard({ item }) {
|
|
7
7
|
const theme = useTheme();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
|
|
2
|
-
import GradientSurface from "../Display/Display.GradientSurface";
|
|
3
|
-
import { useTheme } from "../theme";
|
|
4
|
-
import { Typography } from "../Typography";
|
|
2
|
+
import GradientSurface from "../Display/Display.GradientSurface.js";
|
|
3
|
+
import { useTheme } from "../theme/index.js";
|
|
4
|
+
import { Typography } from "../Typography/index.js";
|
|
5
5
|
import { Modal, TouchableOpacity, TouchableWithoutFeedback, View } from "react-native";
|
|
6
6
|
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
7
7
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
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 { Typography } from "../Typography";
|
|
2
|
+
import Icon from "../Display/Display.Icon.js";
|
|
3
|
+
import { useTheme } from "../theme/index.js";
|
|
4
|
+
import { Typography } from "../Typography/index.js";
|
|
5
5
|
import { ScrollView, TouchableOpacity, View } from "react-native";
|
|
6
6
|
/**
|
|
7
7
|
* Horizontal scrollable row of small icon+label shortcuts ("Acciones Rápidas").
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "nativewind/jsx-runtime";
|
|
2
|
-
import GradientContainer from "../layouts/GradientContainer";
|
|
3
|
-
import { Navigation } from "../Navigation";
|
|
2
|
+
import GradientContainer from "../layouts/GradientContainer.js";
|
|
3
|
+
import { Navigation } from "../Navigation/index.js";
|
|
4
4
|
import { View } from "react-native";
|
|
5
5
|
const Header = Navigation.Header;
|
|
6
6
|
const HeaderToolbar = Navigation.HeaderToolbar;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "nativewind/jsx-runtime";
|
|
2
|
-
import { Display, Form } from "../index";
|
|
3
|
-
import { theme } from "../theme/useTheme";
|
|
4
|
-
import { Typography } from "../Typography";
|
|
5
|
-
import { TimeZoneSelectorModal } from "
|
|
2
|
+
import { Display, Form } from "../index.js";
|
|
3
|
+
import { theme } from "../theme/useTheme.js";
|
|
4
|
+
import { Typography } from "../Typography/index.js";
|
|
5
|
+
import { TimeZoneSelectorModal } from "./TimeZoneSelectorModal.js";
|
|
6
6
|
import { useState } from "react";
|
|
7
7
|
import { View } from "react-native";
|
|
8
8
|
/**
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
|
|
2
|
-
import { BottomSheet } from "../Dialog/BottomSheet";
|
|
3
|
-
import { Display, Form } from "../index";
|
|
4
|
-
import { theme } from "../theme";
|
|
5
|
-
import { Typography } from "../Typography";
|
|
2
|
+
import { BottomSheet } from "../Dialog/BottomSheet/index.js";
|
|
3
|
+
import { Display, Form } from "../index.js";
|
|
4
|
+
import { theme } from "../theme/index.js";
|
|
5
|
+
import { Typography } from "../Typography/index.js";
|
|
6
6
|
import { useMemo, useState } from "react";
|
|
7
7
|
import { FlatList, TextInput, TouchableOpacity, View } from "react-native";
|
|
8
8
|
const TIMEZONES_LOCALES = {
|
|
@@ -57,6 +57,6 @@ function TimeZoneSelectorModal({ visible, onClose, onSelect, currentTimezone, })
|
|
|
57
57
|
onClose();
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
|
-
return (_jsxs(BottomSheet.Root, { onClose: onClose, size: "large", visible: visible, children: [_jsxs(BottomSheet.Header, { children: [_jsxs(View, { className: "px-5 pb-3", children: [_jsx(Typography.Text, { bold: true, variant: "subtitle", children: "Zona Horaria" }), _jsx(Typography.Text, { className: "text-text-secondary text-xs", children: "Selecciona tu zona horaria" })] }), _jsx(View, { className: "px-5 pb-3", children: _jsx(TextInput, { className: "bg-bg-muted px-4 py-3 rounded-xl", onChangeText: setQuery, placeholder: "Buscar zona horaria...", placeholderTextColor: theme.text.tertiary, value: query }) })] }), _jsx(BottomSheet.Content, { scrollable: true, children: filteredTimezones.length === 0 ? (_jsx(EmptyState, {})) : (_jsx(FlatList, { data: filteredTimezones, keyExtractor: (item) => item.timezone, renderItem: ({ item }) => (_jsx(TimezoneRow, { isSelected: selectedTimezone === item.timezone, item: item, onSelect: () => setSelectedTimezone(item.timezone) })), scrollEnabled: false })) }), _jsxs(BottomSheet.Actions, { layout: "horizontal", children: [_jsx(View, { className: "flex-1", children: _jsx(Form.Button, { onPress: onClose, title: "Cancelar", variant: "outline" }) }), selectedTimezone && (_jsx(View, { className: "flex-1", children: _jsx(Form.Button, { onPress: handleConfirm, title: "Confirmar", variant: "primary" }) }))] })] }));
|
|
60
|
+
return (_jsxs(BottomSheet.Root, { onClose: onClose, size: "large", visible: visible, children: [_jsxs(BottomSheet.Header, { children: [_jsxs(View, { className: "px-5 pb-3", children: [_jsx(Typography.Text, { bold: true, variant: "subtitle", children: "Zona Horaria" }), _jsx(Typography.Text, { className: "text-text-secondary text-xs", children: "Selecciona tu zona horaria" })] }), _jsx(View, { className: "px-5 pb-3", children: _jsx(TextInput, { className: "bg-bg-muted px-4 py-3 rounded-xl", onChangeText: setQuery, placeholder: "Buscar zona horaria...", placeholderTextColor: theme.text.tertiary, selectionColor: theme.primary, underlineColorAndroid: "transparent", value: query }) })] }), _jsx(BottomSheet.Content, { scrollable: true, children: filteredTimezones.length === 0 ? (_jsx(EmptyState, {})) : (_jsx(FlatList, { data: filteredTimezones, keyExtractor: (item) => item.timezone, renderItem: ({ item }) => (_jsx(TimezoneRow, { isSelected: selectedTimezone === item.timezone, item: item, onSelect: () => setSelectedTimezone(item.timezone) })), scrollEnabled: false })) }), _jsxs(BottomSheet.Actions, { layout: "horizontal", children: [_jsx(View, { className: "flex-1", children: _jsx(Form.Button, { onPress: onClose, title: "Cancelar", variant: "outline" }) }), selectedTimezone && (_jsx(View, { className: "flex-1", children: _jsx(Form.Button, { onPress: handleConfirm, title: "Confirmar", variant: "primary" }) }))] })] }));
|
|
61
61
|
}
|
|
62
62
|
export { TimeZoneSelectorModal };
|