@sincpro/mobile-ui 3.0.1 → 3.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/dist/Actions/Actions.Button.d.ts +6 -6
- package/dist/Actions/Actions.Button.js +650 -180
- package/dist/Actions/Actions.Dock.d.ts +1 -1
- package/dist/Actions/Actions.Dock.js +297 -18
- package/dist/Actions/Actions.FAB.js +100 -12
- package/dist/Actions/Actions.FilterButton.d.ts +17 -0
- package/dist/Actions/Actions.FilterButton.js +263 -33
- package/dist/Actions/Actions.IconButton.d.ts +1 -0
- package/dist/Actions/Actions.IconButton.js +196 -33
- package/dist/Actions/index.js +13 -13
- package/dist/Dialog/Confirmation.context.js +82 -16
- package/dist/Dialog/Dialog.ActionSheet.js +200 -41
- package/dist/Dialog/Dialog.Confirmation.js +168 -31
- package/dist/Dialog/Dialog.EditValue.js +449 -61
- package/dist/Dialog/Dialog.Sheet.d.ts +7 -3
- package/dist/Dialog/Dialog.Sheet.js +231 -15
- package/dist/Dialog/OverlayHost.d.ts +23 -0
- package/dist/Dialog/OverlayHost.js +196 -0
- package/dist/Dialog/SheetSurface.d.ts +24 -0
- package/dist/Dialog/SheetSurface.js +441 -0
- package/dist/Dialog/dialog-actions.d.ts +17 -0
- package/dist/Dialog/dialog-actions.js +59 -0
- package/dist/Dialog/index.d.ts +4 -1
- package/dist/Dialog/index.js +8 -7
- package/dist/Dialog/overlay.store.d.ts +24 -0
- package/dist/Dialog/overlay.store.js +59 -0
- package/dist/Dialog/requestConfirmation.js +20 -10
- package/dist/Display/Display.Accordion.js +185 -13
- package/dist/Display/Display.AmountSummary.js +206 -15
- package/dist/Display/Display.Avatar.js +93 -31
- package/dist/Display/Display.AvatarGroup.js +132 -17
- package/dist/Display/Display.Badge.d.ts +18 -2
- package/dist/Display/Display.Badge.js +117 -49
- package/dist/Display/Display.Card.js +163 -26
- package/dist/Display/Display.Carousel.js +459 -105
- package/dist/Display/Display.Chip.d.ts +4 -1
- package/dist/Display/Display.Chip.js +165 -31
- package/dist/Display/Display.CircleButton.d.ts +1 -0
- package/dist/Display/Display.CircleButton.js +86 -27
- package/dist/Display/Display.CopyableText.js +289 -66
- package/dist/Display/Display.CountRecords.js +60 -3
- package/dist/Display/Display.DataTable.js +123 -13
- package/dist/Display/Display.Date.js +243 -33
- package/dist/Display/Display.Divider.d.ts +10 -10
- package/dist/Display/Display.Divider.js +67 -20
- package/dist/Display/Display.ExpoImage.js +97 -8
- package/dist/Display/Display.GradientSurface.d.ts +9 -4
- package/dist/Display/Display.GradientSurface.js +196 -46
- package/dist/Display/Display.Icon.js +129 -15
- package/dist/Display/Display.IconBadge.js +95 -25
- package/dist/Display/Display.Image.d.ts +7 -1
- package/dist/Display/Display.Image.js +344 -39
- package/dist/Display/Display.KeyValue.js +90 -5
- package/dist/Display/Display.ListGroup.js +181 -9
- package/dist/Display/Display.ListItem.js +324 -28
- package/dist/Display/Display.Logo.js +84 -29
- package/dist/Display/Display.MediaCard.js +125 -4
- package/dist/Display/Display.MediaEmbed.d.ts +0 -5
- package/dist/Display/Display.MediaEmbed.js +170 -26
- package/dist/Display/Display.MenuButton.d.ts +2 -2
- package/dist/Display/Display.MenuButton.js +380 -94
- package/dist/Display/Display.MenuCard.js +122 -18
- package/dist/Display/Display.MenuGrid.js +43 -3
- package/dist/Display/Display.Monetary.js +90 -5
- package/dist/Display/Display.Pattern.js +306 -47
- package/dist/Display/Display.PriceTag.js +117 -14
- package/dist/Display/Display.ProductCard.js +154 -4
- package/dist/Display/Display.Rating.js +92 -11
- package/dist/Display/Display.SearchHistory.js +132 -6
- package/dist/Display/Display.SectionHeader.d.ts +5 -1
- package/dist/Display/Display.SectionHeader.js +125 -12
- package/dist/Display/Display.Stat.js +62 -3
- package/dist/Display/Display.StatCard.js +131 -7
- package/dist/Display/Display.StatusBadge.d.ts +29 -0
- package/dist/Display/Display.StatusBadge.js +68 -0
- package/dist/Display/Display.StatusDot.js +93 -18
- package/dist/Display/Display.Story.js +285 -35
- package/dist/Display/Display.StoryTray.js +354 -34
- package/dist/Display/Display.StoryViewer.js +571 -72
- package/dist/Display/Display.SwipeableRow.js +141 -20
- package/dist/Display/Display.Tag.d.ts +4 -1
- package/dist/Display/Display.Tag.js +66 -4
- package/dist/Display/Display.Timeline.js +102 -13
- package/dist/Display/Display.Tooltip.js +122 -26
- package/dist/Display/chevron.d.ts +6 -0
- package/dist/Display/chevron.js +32 -0
- package/dist/Display/count-badge.d.ts +21 -0
- package/dist/Display/count-badge.js +124 -0
- package/dist/Display/group-title.d.ts +10 -0
- package/dist/Display/group-title.js +53 -0
- package/dist/Display/icon-font.d.ts +3 -0
- package/dist/Display/icon-font.ios.d.ts +3 -0
- package/dist/Display/icon-font.ios.js +4 -0
- package/dist/Display/icon-font.js +7 -0
- package/dist/Display/icon-glyphs.d.ts +2 -0
- package/dist/Display/icon-glyphs.js +87 -0
- package/dist/Display/icon-map.d.ts +5 -1
- package/dist/Display/icon-map.js +340 -84
- package/dist/Display/icon-registry.d.ts +21 -0
- package/dist/Display/icon-registry.js +21 -0
- package/dist/Display/index.d.ts +6 -1
- package/dist/Display/index.js +53 -48
- package/dist/Display/pill.d.ts +16 -0
- package/dist/Display/pill.js +47 -0
- package/dist/Feedback/ErrorBoundary.js +35 -23
- package/dist/Feedback/Feedback.Banner.js +202 -24
- package/dist/Feedback/Feedback.DomainSplashScreen.js +246 -70
- package/dist/Feedback/Feedback.Empty.js +54 -3
- package/dist/Feedback/Feedback.EmptyState.js +114 -5
- package/dist/Feedback/Feedback.Error.d.ts +1 -1
- package/dist/Feedback/Feedback.Error.js +130 -5
- package/dist/Feedback/Feedback.Loading.d.ts +1 -1
- package/dist/Feedback/Feedback.Loading.js +70 -3
- package/dist/Feedback/Feedback.PermissionCard.js +161 -5
- package/dist/Feedback/Feedback.Progress.js +199 -41
- package/dist/Feedback/Feedback.ProgressCircle.js +184 -12
- package/dist/Feedback/Feedback.Skeleton.js +149 -36
- package/dist/Feedback/Feedback.Spinner.js +407 -79
- package/dist/Feedback/Feedback.Splash.js +240 -33
- package/dist/Feedback/Feedback.State.d.ts +17 -0
- package/dist/Feedback/Feedback.State.js +104 -0
- package/dist/Feedback/Toast.context.js +883 -167
- package/dist/Feedback/index.d.ts +3 -0
- package/dist/Feedback/index.js +15 -13
- package/dist/Form/Form.Checkbox.js +212 -22
- package/dist/Form/Form.ControlledCheckbox.d.ts +1 -1
- package/dist/Form/Form.ControlledCheckbox.js +46 -4
- package/dist/Form/Form.ControlledDropdown.d.ts +1 -1
- package/dist/Form/Form.ControlledDropdown.js +62 -4
- package/dist/Form/Form.ControlledInput.d.ts +4 -3
- package/dist/Form/Form.ControlledInput.js +72 -4
- package/dist/Form/Form.ControlledMonetaryInput.d.ts +6 -3
- package/dist/Form/Form.ControlledMonetaryInput.js +50 -4
- package/dist/Form/Form.ControlledRadioButton.d.ts +2 -2
- package/dist/Form/Form.ControlledRadioButton.js +45 -4
- package/dist/Form/Form.DatePicker.js +505 -107
- package/dist/Form/Form.Dropdown.js +303 -52
- package/dist/Form/Form.ErrorSummary.js +236 -44
- package/dist/Form/Form.Field.d.ts +24 -0
- package/dist/Form/Form.Field.js +55 -0
- package/dist/Form/Form.FractionalQuantityInput.js +508 -96
- package/dist/Form/Form.Input.d.ts +17 -3
- package/dist/Form/Form.Input.js +478 -29
- package/dist/Form/Form.KeyboardForm.d.ts +22 -8
- package/dist/Form/Form.KeyboardForm.js +83 -8
- package/dist/Form/Form.KeyboardToolbarHost.d.ts +14 -0
- package/dist/Form/Form.KeyboardToolbarHost.js +182 -0
- package/dist/Form/Form.MonetaryInput.js +164 -17
- package/dist/Form/Form.PickerField.d.ts +31 -0
- package/dist/Form/Form.PickerField.js +562 -0
- package/dist/Form/Form.PinInput.js +150 -15
- package/dist/Form/Form.QuantitySelector.js +229 -25
- package/dist/Form/Form.RadioButton.js +132 -24
- package/dist/Form/Form.Select.js +487 -56
- package/dist/Form/Form.Slider.js +133 -10
- package/dist/Form/Form.Switch.js +99 -4
- package/dist/Form/index.d.ts +11 -6
- package/dist/Form/index.js +26 -27
- package/dist/Form/input-text.d.ts +7 -0
- package/dist/Form/input-text.js +18 -0
- package/dist/Navigation/Navigation.AppBar.d.ts +3 -4
- package/dist/Navigation/Navigation.AppBar.js +535 -99
- package/dist/Navigation/Navigation.BottomNav.js +363 -98
- package/dist/Navigation/Navigation.CollapsingHeader.d.ts +28 -13
- package/dist/Navigation/Navigation.CollapsingHeader.js +369 -36
- package/dist/Navigation/Navigation.FloatingBar.js +71 -11
- package/dist/Navigation/Navigation.Menu.js +309 -95
- package/dist/Navigation/Navigation.MenuSection.js +80 -11
- package/dist/Navigation/Navigation.RowItem.d.ts +4 -2
- package/dist/Navigation/Navigation.RowItem.js +93 -8
- package/dist/Navigation/Navigation.Search.js +241 -27
- package/dist/Navigation/Navigation.SearchBar.d.ts +7 -1
- package/dist/Navigation/Navigation.SearchBar.js +218 -29
- package/dist/Navigation/Navigation.SearchSuggestions.js +77 -3
- package/dist/Navigation/Navigation.SegmentedControl.js +152 -14
- package/dist/Navigation/Navigation.Steps.js +105 -11
- package/dist/Navigation/Navigation.Tabs.js +449 -41
- package/dist/Navigation/index.d.ts +9 -4
- package/dist/Navigation/index.js +13 -13
- package/dist/Typography/Typography.Heading.js +33 -3
- package/dist/Typography/Typography.SelectableText.js +95 -7
- package/dist/Typography/Typography.Text.d.ts +4 -2
- package/dist/Typography/Typography.Text.js +217 -7
- package/dist/Typography/index.js +3 -3
- package/dist/branding.js +29 -13
- package/dist/icons/AddItemIcon.js +76 -2
- package/dist/icons/ArrangeCircle.js +82 -2
- package/dist/icons/ArrowDownIcon.js +63 -3
- package/dist/icons/ArrowUpIcon.js +63 -3
- package/dist/icons/BoxIcon.js +64 -2
- package/dist/icons/BoxTimeIcon.js +63 -2
- package/dist/icons/CalendarIcon.js +145 -2
- package/dist/icons/CardIcon.js +80 -2
- package/dist/icons/CashierIcon.js +39 -2
- package/dist/icons/CreditIcon.js +76 -3
- package/dist/icons/DuoIcon.js +75 -2
- package/dist/icons/HomeIcon.js +39 -2
- package/dist/icons/HomeIconOutlined.js +53 -2
- package/dist/icons/LogoIcon.js +87 -2
- package/dist/icons/MoneyReceiveIcon.js +86 -2
- package/dist/icons/PinIcon.js +39 -2
- package/dist/icons/ProfileIcon.js +47 -2
- package/dist/icons/SettingsIcon.js +114 -2
- package/dist/icons/SinpeIcon.js +60 -2
- package/dist/icons/ToggleOffIcon.js +53 -2
- package/dist/icons/WalletMoneyIcon.js +81 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +8 -2
- package/dist/layouts/AuthContainer.d.ts +4 -5
- package/dist/layouts/AuthContainer.js +231 -7
- package/dist/layouts/BottomInset.js +4 -1
- package/dist/layouts/Container.d.ts +2 -2
- package/dist/layouts/Container.js +45 -3
- package/dist/layouts/GradientContainer.js +37 -5
- package/dist/layouts/PlainLayout.js +19 -3
- package/dist/layouts/ScrollContainer.d.ts +14 -9
- package/dist/layouts/ScrollContainer.js +125 -4
- package/dist/layouts/edges.d.ts +2 -0
- package/dist/layouts/edges.js +1 -0
- package/dist/primitives/AspectRatio.js +75 -3
- package/dist/primitives/Box.js +45 -3
- package/dist/primitives/Pressable.js +95 -5
- package/dist/primitives/Row.js +84 -13
- package/dist/primitives/Spacer.js +42 -5
- package/dist/primitives/Stack.js +66 -7
- package/dist/primitives/index.js +1 -1
- package/dist/theme/active.js +20 -18
- package/dist/theme/build.js +118 -87
- package/dist/theme/color.js +87 -87
- package/dist/theme/components/ThemedActivityIndicator.d.ts +2 -15
- package/dist/theme/components/ThemedActivityIndicator.js +35 -3
- package/dist/theme/components/index.js +1 -0
- package/dist/theme/contrast.js +32 -33
- package/dist/theme/css-vars.js +71 -75
- package/dist/theme/dark.js +116 -97
- package/dist/theme/default.js +116 -97
- package/dist/theme/define.js +16 -12
- package/dist/theme/index.d.ts +1 -0
- package/dist/theme/index.js +7 -6
- package/dist/theme/on-dark-surface.d.ts +12 -0
- package/dist/theme/on-dark-surface.js +13 -0
- package/dist/theme/theme.js +1 -0
- package/dist/theme/tw.js +3 -1
- package/dist/theme/types.js +0 -18
- package/dist/theme/typography.d.ts +1 -1
- package/dist/theme/typography.js +337 -303
- package/dist/theme/useTheme.js +12 -3
- package/dist/theme/useThemeVars.d.ts +9 -0
- package/dist/theme/useThemeVars.js +23 -0
- package/dist/theme/validate.js +175 -166
- package/dist/tokens/index.js +1 -1
- package/dist/tokens/motion.js +30 -13
- package/dist/utils/async.d.ts +14 -0
- package/dist/utils/async.js +22 -0
- package/dist/utils/criteria.js +66 -85
- package/dist/utils/date.d.ts +8 -2
- package/dist/utils/date.js +63 -50
- package/dist/utils/image.js +8 -8
- package/dist/utils/intl.d.ts +1 -0
- package/dist/utils/intl.js +13 -0
- package/dist/utils/keys.js +3 -5
- package/dist/utils/monetary.d.ts +1 -0
- package/dist/utils/monetary.js +28 -24
- package/dist/utils/progress.js +2 -3
- package/dist/utils/quantity.js +25 -26
- package/dist/utils/reorder.js +11 -20
- package/dist/utils/search.d.ts +4 -0
- package/dist/utils/search.js +12 -0
- package/dist/utils/serializer.js +38 -38
- package/dist/utils/useReducedMotion.js +32 -30
- package/dist/views/AppSplashView.js +117 -3
- package/dist/views/AuthFormView.d.ts +4 -5
- package/dist/views/AuthFormView.js +119 -11
- package/dist/views/FormViewV2.context.js +75 -23
- package/dist/views/FormViewV2.d.ts +4 -5
- package/dist/views/FormViewV2.js +658 -92
- package/dist/views/ListViewV2.context.js +91 -47
- package/dist/views/ListViewV2.d.ts +84 -43
- package/dist/views/ListViewV2.js +1350 -200
- package/dist/views/Wizard/Wizard.context.js +248 -84
- package/dist/views/Wizard/Wizard.js +260 -67
- package/dist/views/types/IListView.js +34 -31
- package/dist/widgets/CollectionOptions.js +557 -138
- package/dist/widgets/FilterBar.js +159 -7
- package/dist/widgets/FilterBuilder.js +375 -102
- package/dist/widgets/JSONViewer.js +275 -129
- package/dist/widgets/PromoBanner.js +336 -42
- package/dist/widgets/PromoModal.d.ts +2 -2
- package/dist/widgets/PromoModal.js +389 -62
- package/dist/widgets/QueryChoice.js +150 -8
- package/dist/widgets/QuickActions.js +120 -31
- package/dist/widgets/ReorderableList.js +399 -128
- package/dist/widgets/TimeZoneSelectorModal.js +458 -51
- package/dist/widgets/index.js +3 -3
- package/package.json +6 -1
- package/tailwind.preset.js +7 -5
- package/dist/Form/Form.InputField.d.ts +0 -10
- package/dist/Form/Form.InputField.js +0 -38
- package/dist/Form/Form.KeyboardToolbar.d.ts +0 -22
- package/dist/Form/Form.KeyboardToolbar.js +0 -66
- package/dist/Form/Form.PasswordInput.d.ts +0 -9
- package/dist/Form/Form.PasswordInput.js +0 -17
- package/dist/Form/Form.TextInput.d.ts +0 -8
- package/dist/Form/Form.TextInput.js +0 -8
- package/dist/primitives/BaseButton.d.ts +0 -150
- package/dist/primitives/BaseButton.js +0 -229
- package/dist/utils/useSheetTranslation.d.ts +0 -5
- package/dist/utils/useSheetTranslation.js +0 -23
package/dist/theme/build.js
CHANGED
|
@@ -3,21 +3,40 @@ import { resolveOnColor } from "./contrast.js";
|
|
|
3
3
|
import { DEFAULT_DARK_THEME } from "./dark.js";
|
|
4
4
|
import { DEFAULT_THEME } from "./default.js";
|
|
5
5
|
import { mergeTheme } from "./define.js";
|
|
6
|
-
const STATE_LIGHT = {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
const STATE_LIGHT = {
|
|
7
|
+
hover: 0.08,
|
|
8
|
+
press: 0.12,
|
|
9
|
+
focus: 0.12,
|
|
10
|
+
drag: 0.16
|
|
11
|
+
};
|
|
12
|
+
const STATE_DARK = {
|
|
13
|
+
hover: 0.1,
|
|
14
|
+
press: 0.16,
|
|
15
|
+
focus: 0.14,
|
|
16
|
+
drag: 0.2
|
|
17
|
+
};
|
|
18
|
+
const MATERIAL_LIGHT = {
|
|
19
|
+
blur: 24,
|
|
20
|
+
opacity: 0.78,
|
|
21
|
+
borderOpacity: 0.18
|
|
22
|
+
};
|
|
23
|
+
const MATERIAL_DARK = {
|
|
24
|
+
blur: 28,
|
|
25
|
+
opacity: 0.62,
|
|
26
|
+
borderOpacity: 0.22
|
|
27
|
+
};
|
|
10
28
|
const SUCCESS = "#2F6B3C";
|
|
11
29
|
const WARNING = "#7E5E12";
|
|
12
30
|
const DANGER = "#9B3B30";
|
|
13
31
|
const INFO = "#0F5C6E";
|
|
14
32
|
function deriveBrandText(brand, mode) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
33
|
+
if (mode === "light") {
|
|
34
|
+
return shiftLightness(brand, -0.28);
|
|
35
|
+
}
|
|
36
|
+
// Dark surfaces need a light brand text — mix toward white until AA-friendly.
|
|
37
|
+
return mixHex(brand, "#FFFFFF", 0.62);
|
|
20
38
|
}
|
|
39
|
+
|
|
21
40
|
/**
|
|
22
41
|
* Builds a complete `ThemeTokens` from a brand seed — Material-style derivation
|
|
23
42
|
* for mobile apps that rebrand without hand-authoring every token.
|
|
@@ -33,82 +52,94 @@ function deriveBrandText(brand, mode) {
|
|
|
33
52
|
* }));
|
|
34
53
|
*/
|
|
35
54
|
export function buildThemeFromBrand(opts) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}
|
|
55
|
+
const {
|
|
56
|
+
name,
|
|
57
|
+
brand,
|
|
58
|
+
mode
|
|
59
|
+
} = opts;
|
|
60
|
+
const base = mode === "light" ? DEFAULT_THEME : DEFAULT_DARK_THEME;
|
|
61
|
+
const secondary = opts.secondary ?? shiftLightness(brand, mode === "light" ? -0.18 : -0.08);
|
|
62
|
+
const accent = opts.accent ?? brand;
|
|
63
|
+
const brandText = opts.brandText ?? deriveBrandText(brand, mode);
|
|
64
|
+
const primaryC = containerPair(brand, mode);
|
|
65
|
+
const secondaryC = containerPair(secondary, mode);
|
|
66
|
+
const accentC = containerPair(accent, mode);
|
|
67
|
+
const successC = containerPair(SUCCESS, mode);
|
|
68
|
+
const warningC = containerPair(WARNING, mode);
|
|
69
|
+
const dangerC = containerPair(DANGER, mode);
|
|
70
|
+
const infoC = containerPair(INFO, mode);
|
|
71
|
+
const page = mode === "light" ? mixHex(brand, "#FFFFFF", 0.96) : "#0C0C0C";
|
|
72
|
+
const card = mode === "light" ? "#FFFFFF" : "#161616";
|
|
73
|
+
const muted = mode === "light" ? mixHex(brand, "#FFFFFF", 0.92) : mixHex(brand, "#000000", 0.88);
|
|
74
|
+
const bgAccent = primaryC.container;
|
|
75
|
+
const hover = mode === "light" ? mixHex(brand, "#FFFFFF", 0.9) : mixHex(brand, "#000000", 0.82);
|
|
76
|
+
const disabled = mode === "light" ? mixHex(brand, "#FFFFFF", 0.86) : mixHex("#FFFFFF", "#000000", 0.85);
|
|
77
|
+
return mergeTheme(base, {
|
|
78
|
+
name,
|
|
79
|
+
primary: brand,
|
|
80
|
+
secondary,
|
|
81
|
+
accent,
|
|
82
|
+
bg: {
|
|
83
|
+
page,
|
|
84
|
+
card,
|
|
85
|
+
popover: card,
|
|
86
|
+
muted,
|
|
87
|
+
accent: bgAccent,
|
|
88
|
+
hover,
|
|
89
|
+
disabled,
|
|
90
|
+
inverse: mode === "light" ? "#0C0C0C" : mixHex(brand, "#FFFFFF", 0.94),
|
|
91
|
+
containerLowest: mode === "light" ? page : "#0A0A0A",
|
|
92
|
+
container: muted,
|
|
93
|
+
containerHigh: mode === "light" ? mixHex(brand, "#FFFFFF", 0.84) : "#1E1E1E"
|
|
94
|
+
},
|
|
95
|
+
text: {
|
|
96
|
+
accent: brandText,
|
|
97
|
+
onPrimary: resolveOnColor(brand),
|
|
98
|
+
onSecondary: resolveOnColor(secondary),
|
|
99
|
+
onAccent: resolveOnColor(accent),
|
|
100
|
+
onDanger: resolveOnColor(DANGER),
|
|
101
|
+
onSuccess: resolveOnColor(SUCCESS)
|
|
102
|
+
},
|
|
103
|
+
border: {
|
|
104
|
+
focus: brandText,
|
|
105
|
+
default: mode === "light" ? mixHex(brand, "#FFFFFF", 0.82) : "#262626",
|
|
106
|
+
light: muted,
|
|
107
|
+
strong: mode === "light" ? mixHex(brand, "#000000", 0.25) : "#3A3A3A"
|
|
108
|
+
},
|
|
109
|
+
ring: brandText,
|
|
110
|
+
success: SUCCESS,
|
|
111
|
+
warning: WARNING,
|
|
112
|
+
danger: DANGER,
|
|
113
|
+
info: INFO,
|
|
114
|
+
container: {
|
|
115
|
+
primary: primaryC.container,
|
|
116
|
+
onPrimary: primaryC.onContainer,
|
|
117
|
+
secondary: secondaryC.container,
|
|
118
|
+
onSecondary: secondaryC.onContainer,
|
|
119
|
+
accent: accentC.container,
|
|
120
|
+
onAccent: accentC.onContainer,
|
|
121
|
+
success: successC.container,
|
|
122
|
+
onSuccess: successC.onContainer,
|
|
123
|
+
warning: warningC.container,
|
|
124
|
+
onWarning: warningC.onContainer,
|
|
125
|
+
danger: dangerC.container,
|
|
126
|
+
onDanger: dangerC.onContainer,
|
|
127
|
+
info: infoC.container,
|
|
128
|
+
onInfo: infoC.onContainer
|
|
129
|
+
},
|
|
130
|
+
state: mode === "light" ? {
|
|
131
|
+
...STATE_LIGHT
|
|
132
|
+
} : {
|
|
133
|
+
...STATE_DARK
|
|
134
|
+
},
|
|
135
|
+
material: mode === "light" ? {
|
|
136
|
+
...MATERIAL_LIGHT
|
|
137
|
+
} : {
|
|
138
|
+
...MATERIAL_DARK
|
|
139
|
+
},
|
|
140
|
+
gradient: {
|
|
141
|
+
primary: [shiftLightness(brand, 0.12), brand],
|
|
142
|
+
accent: [brand, secondary]
|
|
143
|
+
}
|
|
144
|
+
});
|
|
114
145
|
}
|
package/dist/theme/color.js
CHANGED
|
@@ -2,108 +2,108 @@
|
|
|
2
2
|
* Color primitives for theme derivation (HSL). Used by buildThemeFromBrand
|
|
3
3
|
* and container/tonal helpers — keeps brand math in one place.
|
|
4
4
|
*/
|
|
5
|
+
|
|
5
6
|
export function hexToRgb(hex) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
return {
|
|
14
|
-
r: Number.parseInt(full.slice(0, 2), 16),
|
|
15
|
-
g: Number.parseInt(full.slice(2, 4), 16),
|
|
16
|
-
b: Number.parseInt(full.slice(4, 6), 16),
|
|
17
|
-
};
|
|
7
|
+
const h = hex.trim().replace(/^#/, "");
|
|
8
|
+
const full = h.length === 3 ? h.split("").map(c => c + c).join("") : h;
|
|
9
|
+
return {
|
|
10
|
+
r: Number.parseInt(full.slice(0, 2), 16),
|
|
11
|
+
g: Number.parseInt(full.slice(2, 4), 16),
|
|
12
|
+
b: Number.parseInt(full.slice(4, 6), 16)
|
|
13
|
+
};
|
|
18
14
|
}
|
|
19
15
|
export function rgbToHex(r, g, b) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
[clamp(r), clamp(g), clamp(b)]
|
|
23
|
-
.map((n) => n.toString(16).padStart(2, "0"))
|
|
24
|
-
.join("")
|
|
25
|
-
.toUpperCase());
|
|
16
|
+
const clamp = n => Math.max(0, Math.min(255, Math.round(n)));
|
|
17
|
+
return "#" + [clamp(r), clamp(g), clamp(b)].map(n => n.toString(16).padStart(2, "0")).join("").toUpperCase();
|
|
26
18
|
}
|
|
27
19
|
export function hexToHsl(hex) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
20
|
+
const {
|
|
21
|
+
r,
|
|
22
|
+
g,
|
|
23
|
+
b
|
|
24
|
+
} = hexToRgb(hex);
|
|
25
|
+
const rn = r / 255;
|
|
26
|
+
const gn = g / 255;
|
|
27
|
+
const bn = b / 255;
|
|
28
|
+
const max = Math.max(rn, gn, bn);
|
|
29
|
+
const min = Math.min(rn, gn, bn);
|
|
30
|
+
const l = (max + min) / 2;
|
|
31
|
+
if (max === min) return {
|
|
32
|
+
h: 0,
|
|
33
|
+
s: 0,
|
|
34
|
+
l
|
|
35
|
+
};
|
|
36
|
+
const d = max - min;
|
|
37
|
+
const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
|
38
|
+
let h = 0;
|
|
39
|
+
if (max === rn) h = ((gn - bn) / d + (gn < bn ? 6 : 0)) / 6;else if (max === gn) h = ((bn - rn) / d + 2) / 6;else h = ((rn - gn) / d + 4) / 6;
|
|
40
|
+
return {
|
|
41
|
+
h: h * 360,
|
|
42
|
+
s,
|
|
43
|
+
l
|
|
44
|
+
};
|
|
47
45
|
}
|
|
48
|
-
export function hslToHex({
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
return rgbToHex((rn + m) * 255, (gn + m) * 255, (bn + m) * 255);
|
|
46
|
+
export function hslToHex({
|
|
47
|
+
h,
|
|
48
|
+
s,
|
|
49
|
+
l
|
|
50
|
+
}) {
|
|
51
|
+
const hh = (h % 360 + 360) % 360;
|
|
52
|
+
const c = (1 - Math.abs(2 * l - 1)) * s;
|
|
53
|
+
const x = c * (1 - Math.abs(hh / 60 % 2 - 1));
|
|
54
|
+
const m = l - c / 2;
|
|
55
|
+
let rn = 0;
|
|
56
|
+
let gn = 0;
|
|
57
|
+
let bn = 0;
|
|
58
|
+
if (hh < 60) {
|
|
59
|
+
rn = c;
|
|
60
|
+
gn = x;
|
|
61
|
+
} else if (hh < 120) {
|
|
62
|
+
rn = x;
|
|
63
|
+
gn = c;
|
|
64
|
+
} else if (hh < 180) {
|
|
65
|
+
gn = c;
|
|
66
|
+
bn = x;
|
|
67
|
+
} else if (hh < 240) {
|
|
68
|
+
gn = x;
|
|
69
|
+
bn = c;
|
|
70
|
+
} else if (hh < 300) {
|
|
71
|
+
rn = x;
|
|
72
|
+
bn = c;
|
|
73
|
+
} else {
|
|
74
|
+
rn = c;
|
|
75
|
+
bn = x;
|
|
76
|
+
}
|
|
77
|
+
return rgbToHex((rn + m) * 255, (gn + m) * 255, (bn + m) * 255);
|
|
81
78
|
}
|
|
79
|
+
|
|
82
80
|
/** Mix two hex colors. `t=0` → a, `t=1` → b. */
|
|
83
81
|
export function mixHex(a, b, t) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
82
|
+
const A = hexToRgb(a);
|
|
83
|
+
const B = hexToRgb(b);
|
|
84
|
+
const u = Math.max(0, Math.min(1, t));
|
|
85
|
+
return rgbToHex(A.r + (B.r - A.r) * u, A.g + (B.g - A.g) * u, A.b + (B.b - A.b) * u);
|
|
88
86
|
}
|
|
87
|
+
|
|
89
88
|
/** Shift lightness in HSL. delta in [-1, 1] absolute L change. */
|
|
90
89
|
export function shiftLightness(hex, delta) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
90
|
+
const hsl = hexToHsl(hex);
|
|
91
|
+
return hslToHex({
|
|
92
|
+
...hsl,
|
|
93
|
+
l: Math.max(0, Math.min(1, hsl.l + delta))
|
|
94
|
+
});
|
|
96
95
|
}
|
|
96
|
+
|
|
97
97
|
/** Soft container fill + on-container ink (M3-style tonal pair). */
|
|
98
98
|
export function containerPair(seed, mode) {
|
|
99
|
-
|
|
100
|
-
return {
|
|
101
|
-
container: mixHex(seed, "#FFFFFF", 0.88),
|
|
102
|
-
onContainer: shiftLightness(seed, -0.22),
|
|
103
|
-
};
|
|
104
|
-
}
|
|
99
|
+
if (mode === "light") {
|
|
105
100
|
return {
|
|
106
|
-
|
|
107
|
-
|
|
101
|
+
container: mixHex(seed, "#FFFFFF", 0.88),
|
|
102
|
+
onContainer: shiftLightness(seed, -0.22)
|
|
108
103
|
};
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
container: mixHex(seed, "#000000", 0.72),
|
|
107
|
+
onContainer: mixHex(seed, "#FFFFFF", 0.45)
|
|
108
|
+
};
|
|
109
109
|
}
|
|
@@ -1,21 +1,8 @@
|
|
|
1
1
|
import type { ActivityIndicatorProps } from "react-native";
|
|
2
|
-
/**
|
|
3
|
-
* ============================================================================
|
|
4
|
-
* THEMED ACTIVITY INDICATOR
|
|
5
|
-
* ============================================================================
|
|
6
|
-
*
|
|
7
|
-
* Wrapper de ActivityIndicator que usa color primary.
|
|
8
|
-
* NOTA: Como no podemos usar hooks, usa el color hardcoded de Distribution.
|
|
9
|
-
* Para cambiar color, pasar prop color directamente.
|
|
10
|
-
*
|
|
11
|
-
* USO:
|
|
12
|
-
* ```tsx
|
|
13
|
-
* <ThemedActivityIndicator />
|
|
14
|
-
* <ThemedActivityIndicator size="large" color="#8B5CF6" />
|
|
15
|
-
* ```
|
|
16
|
-
*/
|
|
17
2
|
interface ThemedActivityIndicatorProps extends Omit<ActivityIndicatorProps, "color"> {
|
|
3
|
+
/** Defaults to the theme `primary`. */
|
|
18
4
|
color?: string;
|
|
19
5
|
}
|
|
6
|
+
/** ActivityIndicator in the theme `primary` unless a color is given. */
|
|
20
7
|
export declare function ThemedActivityIndicator({ color, ...props }: ThemedActivityIndicatorProps): import("react").JSX.Element;
|
|
21
8
|
export {};
|
|
@@ -1,5 +1,37 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { c as _c } from "react/compiler-runtime";
|
|
2
|
+
import { useTheme } from "../useTheme.js";
|
|
2
3
|
import { ActivityIndicator as RNActivityIndicator } from "react-native";
|
|
3
|
-
|
|
4
|
-
|
|
4
|
+
import { jsx as _jsx } from "nativewind/jsx-runtime";
|
|
5
|
+
/** ActivityIndicator in the theme `primary` unless a color is given. */
|
|
6
|
+
export function ThemedActivityIndicator(t0) {
|
|
7
|
+
const $ = _c(6);
|
|
8
|
+
let color;
|
|
9
|
+
let props;
|
|
10
|
+
if ($[0] !== t0) {
|
|
11
|
+
({
|
|
12
|
+
color,
|
|
13
|
+
...props
|
|
14
|
+
} = t0);
|
|
15
|
+
$[0] = t0;
|
|
16
|
+
$[1] = color;
|
|
17
|
+
$[2] = props;
|
|
18
|
+
} else {
|
|
19
|
+
color = $[1];
|
|
20
|
+
props = $[2];
|
|
21
|
+
}
|
|
22
|
+
const theme = useTheme();
|
|
23
|
+
const t1 = color ?? theme.primary;
|
|
24
|
+
let t2;
|
|
25
|
+
if ($[3] !== props || $[4] !== t1) {
|
|
26
|
+
t2 = _jsx(RNActivityIndicator, {
|
|
27
|
+
color: t1,
|
|
28
|
+
...props
|
|
29
|
+
});
|
|
30
|
+
$[3] = props;
|
|
31
|
+
$[4] = t1;
|
|
32
|
+
$[5] = t2;
|
|
33
|
+
} else {
|
|
34
|
+
t2 = $[5];
|
|
35
|
+
}
|
|
36
|
+
return t2;
|
|
5
37
|
}
|
package/dist/theme/contrast.js
CHANGED
|
@@ -2,33 +2,34 @@
|
|
|
2
2
|
* WCAG 2.1 contrast helpers for theme authors.
|
|
3
3
|
* Used by `validateTheme` and by consumers building brand palettes.
|
|
4
4
|
*/
|
|
5
|
+
|
|
5
6
|
export function parseHex(hex) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
return {
|
|
14
|
-
r: Number.parseInt(full.slice(0, 2), 16),
|
|
15
|
-
g: Number.parseInt(full.slice(2, 4), 16),
|
|
16
|
-
b: Number.parseInt(full.slice(4, 6), 16),
|
|
17
|
-
};
|
|
7
|
+
const h = hex.trim().replace(/^#/, "");
|
|
8
|
+
const full = h.length === 3 ? h.split("").map(c => c + c).join("") : h;
|
|
9
|
+
return {
|
|
10
|
+
r: Number.parseInt(full.slice(0, 2), 16),
|
|
11
|
+
g: Number.parseInt(full.slice(2, 4), 16),
|
|
12
|
+
b: Number.parseInt(full.slice(4, 6), 16)
|
|
13
|
+
};
|
|
18
14
|
}
|
|
19
15
|
export function relativeLuminance(hex) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
16
|
+
const {
|
|
17
|
+
r,
|
|
18
|
+
g,
|
|
19
|
+
b
|
|
20
|
+
} = parseHex(hex);
|
|
21
|
+
const norm = c => {
|
|
22
|
+
const s = c / 255;
|
|
23
|
+
return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);
|
|
24
|
+
};
|
|
25
|
+
return 0.2126 * norm(r) + 0.7152 * norm(g) + 0.0722 * norm(b);
|
|
26
26
|
}
|
|
27
|
+
|
|
27
28
|
/** Contrast ratio between two sRGB hex colors (WCAG 2.1). */
|
|
28
29
|
export function contrastRatio(fg, bg) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
const L1 = relativeLuminance(fg);
|
|
31
|
+
const L2 = relativeLuminance(bg);
|
|
32
|
+
return (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05);
|
|
32
33
|
}
|
|
33
34
|
const DEFAULT_ON_LIGHT = "#FFFFFF";
|
|
34
35
|
const DEFAULT_ON_DARK = "#0A0A0A";
|
|
@@ -41,17 +42,15 @@ const DEFAULT_ON_DARK = "#0A0A0A";
|
|
|
41
42
|
* text: { onPrimary: resolveOnColor("#0B1F4A") } // → #FFFFFF
|
|
42
43
|
*/
|
|
43
44
|
export function resolveOnColor(fill, options = {}) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
return withLight >= withDark ? light : dark;
|
|
51
|
-
}
|
|
52
|
-
if (withLight >= min)
|
|
53
|
-
return light;
|
|
54
|
-
if (withDark >= min)
|
|
55
|
-
return dark;
|
|
45
|
+
const light = options.light ?? DEFAULT_ON_LIGHT;
|
|
46
|
+
const dark = options.dark ?? DEFAULT_ON_DARK;
|
|
47
|
+
const min = options.minRatio ?? 4.5;
|
|
48
|
+
const withLight = contrastRatio(light, fill);
|
|
49
|
+
const withDark = contrastRatio(dark, fill);
|
|
50
|
+
if (withLight >= min && withDark >= min) {
|
|
56
51
|
return withLight >= withDark ? light : dark;
|
|
52
|
+
}
|
|
53
|
+
if (withLight >= min) return light;
|
|
54
|
+
if (withDark >= min) return dark;
|
|
55
|
+
return withLight >= withDark ? light : dark;
|
|
57
56
|
}
|