@retray-dev/ui-kit 12.1.0 → 13.0.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/COMPONENTS.md +183 -147
- package/CONSUMER.md +2 -2
- package/DESIGN.md +2 -2
- package/README.md +13 -8
- package/dist/Accordion.d.mts +6 -0
- package/dist/Accordion.d.ts +6 -0
- package/dist/Accordion.js +62 -208
- package/dist/Accordion.mjs +6 -5
- package/dist/AlertBanner.js +29 -151
- package/dist/AlertBanner.mjs +3 -3
- package/dist/AppHeader.js +37 -233
- package/dist/AppHeader.mjs +6 -7
- package/dist/Avatar.d.mts +17 -1
- package/dist/Avatar.d.ts +17 -1
- package/dist/Avatar.js +80 -113
- package/dist/Avatar.mjs +2 -2
- package/dist/Badge.js +24 -147
- package/dist/Badge.mjs +3 -3
- package/dist/Button.js +86 -274
- package/dist/Button.mjs +6 -6
- package/dist/Card.js +15 -198
- package/dist/Card.mjs +4 -5
- package/dist/CategoryStrip.d.mts +0 -5
- package/dist/CategoryStrip.d.ts +0 -5
- package/dist/CategoryStrip.js +47 -263
- package/dist/CategoryStrip.mjs +6 -6
- package/dist/Checkbox.js +15 -198
- package/dist/Checkbox.mjs +5 -5
- package/dist/Chip.js +44 -234
- package/dist/Chip.mjs +7 -6
- package/dist/ConfirmDialog.js +100 -296
- package/dist/ConfirmDialog.mjs +7 -7
- package/dist/CurrencyDisplay.js +1 -112
- package/dist/CurrencyDisplay.mjs +2 -2
- package/dist/CurrencyInput.js +35 -160
- package/dist/CurrencyInput.mjs +5 -5
- package/dist/DetailRow.js +25 -148
- package/dist/DetailRow.mjs +3 -3
- package/dist/EmptyState.js +87 -275
- package/dist/EmptyState.mjs +7 -7
- package/dist/ErrorBoundary.js +32 -197
- package/dist/ErrorBoundary.mjs +4 -4
- package/dist/Form.js +1 -112
- package/dist/Form.mjs +2 -2
- package/dist/HolographicCard.d.mts +0 -28
- package/dist/HolographicCard.d.ts +0 -28
- package/dist/HolographicCard.js +20 -130
- package/dist/HolographicCard.mjs +9 -32
- package/dist/IconButton.js +36 -232
- package/dist/IconButton.mjs +5 -6
- package/dist/IconPicker.js +222 -927
- package/dist/IconPicker.mjs +5 -5
- package/dist/ImageUpload.d.mts +5 -1
- package/dist/ImageUpload.d.ts +5 -1
- package/dist/ImageUpload.js +32 -215
- package/dist/ImageUpload.mjs +5 -6
- package/dist/ImageViewer.js +75 -264
- package/dist/ImageViewer.mjs +8 -8
- package/dist/Input.d.mts +1 -1
- package/dist/Input.d.ts +1 -1
- package/dist/Input.js +35 -160
- package/dist/Input.mjs +4 -4
- package/dist/LabelValue.js +24 -147
- package/dist/LabelValue.mjs +3 -3
- package/dist/ListGroup.js +1 -112
- package/dist/ListGroup.mjs +2 -2
- package/dist/ListItem.js +38 -233
- package/dist/ListItem.mjs +5 -6
- package/dist/MediaCard.d.mts +0 -14
- package/dist/MediaCard.d.ts +0 -14
- package/dist/MediaCard.js +69 -313
- package/dist/MediaCard.mjs +5 -6
- package/dist/MenuGroup.js +1 -112
- package/dist/MenuGroup.mjs +2 -2
- package/dist/MenuItem.js +36 -232
- package/dist/MenuItem.mjs +5 -6
- package/dist/MonthPicker.js +8 -161
- package/dist/MonthPicker.mjs +3 -3
- package/dist/NumberStepper.js +40 -236
- package/dist/NumberStepper.mjs +5 -6
- package/dist/PagerDots.d.mts +1 -1
- package/dist/PagerDots.d.ts +1 -1
- package/dist/PagerDots.js +69 -222
- package/dist/PagerDots.mjs +6 -5
- package/dist/Pressable.js +14 -85
- package/dist/Pressable.mjs +4 -4
- package/dist/PricingCard.js +94 -279
- package/dist/PricingCard.mjs +8 -8
- package/dist/Progress.js +3 -121
- package/dist/Progress.mjs +3 -3
- package/dist/RadioGroup.js +52 -263
- package/dist/RadioGroup.mjs +5 -5
- package/dist/RetrayProvider.d.mts +1 -1
- package/dist/RetrayProvider.d.ts +1 -1
- package/dist/RetrayProvider.js +5 -6
- package/dist/RetrayProvider.mjs +3 -3
- package/dist/Select.d.mts +2 -1
- package/dist/Select.d.ts +2 -1
- package/dist/Select.js +24 -230
- package/dist/Select.mjs +4 -5
- package/dist/SelectableCard.d.mts +27 -0
- package/dist/SelectableCard.d.ts +27 -0
- package/dist/SelectableCard.js +335 -0
- package/dist/SelectableCard.mjs +8 -0
- package/dist/SelectableGrid.d.mts +0 -21
- package/dist/SelectableGrid.d.ts +0 -21
- package/dist/SelectableGrid.js +49 -269
- package/dist/SelectableGrid.mjs +5 -6
- package/dist/Separator.js +1 -112
- package/dist/Separator.mjs +2 -2
- package/dist/Sheet.js +16 -163
- package/dist/Sheet.mjs +3 -3
- package/dist/SheetSelect.js +39 -234
- package/dist/SheetSelect.mjs +6 -6
- package/dist/Skeleton.d.mts +3 -1
- package/dist/Skeleton.d.ts +3 -1
- package/dist/Skeleton.js +7 -124
- package/dist/Skeleton.mjs +3 -3
- package/dist/Slider.js +6 -159
- package/dist/Slider.mjs +3 -3
- package/dist/Spinner.js +3 -114
- package/dist/Spinner.mjs +2 -2
- package/dist/Stats.d.mts +4 -1
- package/dist/Stats.d.ts +4 -1
- package/dist/Stats.js +60 -234
- package/dist/Stats.mjs +5 -6
- package/dist/Switch.js +24 -173
- package/dist/Switch.mjs +5 -4
- package/dist/TabBar.js +43 -198
- package/dist/TabBar.mjs +5 -4
- package/dist/Tabs.js +15 -197
- package/dist/Tabs.mjs +5 -5
- package/dist/Text.js +9 -128
- package/dist/Text.mjs +2 -2
- package/dist/Textarea.d.mts +2 -1
- package/dist/Textarea.d.ts +2 -1
- package/dist/Textarea.js +71 -217
- package/dist/Textarea.mjs +4 -4
- package/dist/Toast.js +1 -112
- package/dist/Toast.mjs +2 -2
- package/dist/Toggle.js +39 -234
- package/dist/Toggle.mjs +6 -6
- package/dist/{chunk-FFTYLPSB.mjs → chunk-2QOHHBJC.mjs} +13 -7
- package/dist/{chunk-BCWEHE34.mjs → chunk-2VIDP72N.mjs} +3 -3
- package/dist/{chunk-PGERH3P7.mjs → chunk-4NQFTHN3.mjs} +13 -7
- package/dist/{chunk-3N2M3WZL.mjs → chunk-4ZO5PTKF.mjs} +4 -4
- package/dist/{chunk-MYZ2EDYU.mjs → chunk-5MYNAAFE.mjs} +13 -17
- package/dist/{chunk-E7NEHHXV.mjs → chunk-62BBSSUF.mjs} +3 -3
- package/dist/{chunk-ISY26JQJ.mjs → chunk-6CR4S6W2.mjs} +3 -3
- package/dist/{chunk-FUVYSVGR.mjs → chunk-6QLBHUEG.mjs} +8 -7
- package/dist/chunk-ARONDO7M.mjs +40 -0
- package/dist/{chunk-3UYAZ7I4.mjs → chunk-AZV7KNJI.mjs} +3 -3
- package/dist/{chunk-HLMPMUK2.mjs → chunk-BTUW5LSG.mjs} +11 -8
- package/dist/chunk-BULKGOIZ.mjs +235 -0
- package/dist/{chunk-265G6A46.mjs → chunk-CBIZLRYH.mjs} +29 -12
- package/dist/chunk-CM2DG4MR.mjs +142 -0
- package/dist/{chunk-2I2AYECM.mjs → chunk-DBHSUUKU.mjs} +2 -2
- package/dist/{chunk-P64WHW4A.mjs → chunk-DE25XTVQ.mjs} +3 -3
- package/dist/{chunk-DI7CBDL6.mjs → chunk-E4EQSCKR.mjs} +5 -5
- package/dist/{chunk-357YO24D.mjs → chunk-EHGBHFMH.mjs} +9 -17
- package/dist/{chunk-GK4VRMNE.mjs → chunk-EROPDCB5.mjs} +24 -27
- package/dist/{chunk-XBAGGKLW.mjs → chunk-ERWJPVX7.mjs} +2 -2
- package/dist/{chunk-LRM4AVYY.mjs → chunk-ESQDPO5E.mjs} +7 -7
- package/dist/{chunk-EFLFRAHD.mjs → chunk-EW2FIDSM.mjs} +1 -1
- package/dist/{chunk-7HSILTC4.mjs → chunk-FTTI6T5Q.mjs} +4 -4
- package/dist/{chunk-X26S5EVZ.mjs → chunk-HUSSF6TF.mjs} +1 -1
- package/dist/chunk-IFYMBOEN.mjs +14 -0
- package/dist/{chunk-S3KJCPEJ.mjs → chunk-IGU223UM.mjs} +80 -4
- package/dist/chunk-IJCMPVW5.mjs +121 -0
- package/dist/{chunk-I4V5XZPS.mjs → chunk-ITG4JQM3.mjs} +4 -4
- package/dist/{chunk-F4V6XLP4.mjs → chunk-K3QX2M26.mjs} +11 -8
- package/dist/{chunk-V6NFJXKO.mjs → chunk-K7TKID3V.mjs} +8 -7
- package/dist/{chunk-ZHMSAYLT.mjs → chunk-KAGADD2O.mjs} +4 -4
- package/dist/{chunk-3GEYJ7I5.mjs → chunk-KC5QDYGZ.mjs} +4 -4
- package/dist/{chunk-HJ46DTJE.mjs → chunk-KPTY7UYQ.mjs} +1 -1
- package/dist/{chunk-EMUWGDWC.mjs → chunk-KSSVIFYR.mjs} +11 -12
- package/dist/chunk-L3YKPTJQ.mjs +119 -0
- package/dist/chunk-M53LC4Q7.mjs +35 -0
- package/dist/{chunk-NXI4YDZ2.mjs → chunk-MP7GLMIR.mjs} +17 -25
- package/dist/chunk-MZ6WRTD2.mjs +40 -0
- package/dist/chunk-NGEN2EES.mjs +581 -0
- package/dist/{chunk-JULSIZDM.mjs → chunk-OBV72JD4.mjs} +1 -1
- package/dist/{chunk-2A2LEFZG.mjs → chunk-PGQ6FMXS.mjs} +6 -5
- package/dist/{chunk-BQZE3HAW.mjs → chunk-PI6RULJX.mjs} +1 -1
- package/dist/{chunk-FA2KMTH5.mjs → chunk-RA6SAAFE.mjs} +9 -8
- package/dist/{chunk-FVTVCJAH.mjs → chunk-RRKM4MKB.mjs} +7 -7
- package/dist/{chunk-AKM4EPOT.mjs → chunk-S2VGME7X.mjs} +1 -1
- package/dist/{chunk-OULVKTWL.mjs → chunk-S44XWTTC.mjs} +35 -25
- package/dist/{chunk-QSFV2P7O.mjs → chunk-SZEKQAOY.mjs} +1 -1
- package/dist/{chunk-N4ZPVCJH.mjs → chunk-TETMEKZE.mjs} +9 -9
- package/dist/{chunk-2CBQKU7H.mjs → chunk-TMH263OK.mjs} +5 -4
- package/dist/{chunk-D3Y2T42P.mjs → chunk-U6DEBYU5.mjs} +10 -9
- package/dist/{chunk-4WFMPFZB.mjs → chunk-UOKFSFNJ.mjs} +2 -2
- package/dist/{chunk-WOEWGSTU.mjs → chunk-URIH43IJ.mjs} +13 -21
- package/dist/{chunk-JCZQOY4O.mjs → chunk-V2ZB2XNS.mjs} +16 -10
- package/dist/{chunk-P73V2EKS.mjs → chunk-WIPEDNSD.mjs} +7 -7
- package/dist/{chunk-BOVUP27T.mjs → chunk-XCIG6HT2.mjs} +6 -5
- package/dist/chunk-Y6YS33GM.mjs +131 -0
- package/dist/{chunk-5OLNXP3S.mjs → chunk-ZKDKKQCE.mjs} +29 -7
- package/dist/{chunk-DF6DU42P.mjs → chunk-ZTPYUU5C.mjs} +5 -5
- package/dist/{index-wt-orHUi.d.ts → index-CY34hxPN.d.mts} +1 -0
- package/dist/{index-wt-orHUi.d.mts → index-CY34hxPN.d.ts} +1 -0
- package/dist/index.d.mts +15 -74
- package/dist/index.d.ts +15 -74
- package/dist/index.js +1055 -1562
- package/dist/index.mjs +81 -84
- package/package.json +8 -10
- package/src/components/Accordion/Accordion.tsx +32 -9
- package/src/components/AlertBanner/AlertBanner.tsx +7 -6
- package/src/components/AppHeader/AppHeader.tsx +1 -1
- package/src/components/Avatar/Avatar.tsx +92 -1
- package/src/components/Avatar/index.ts +2 -2
- package/src/components/Badge/Badge.tsx +2 -2
- package/src/components/Button/Button.tsx +64 -57
- package/src/components/Card/Card.tsx +1 -0
- package/src/components/CategoryStrip/CategoryStrip.tsx +36 -49
- package/src/components/Chip/Chip.tsx +5 -4
- package/src/components/ConfirmDialog/ConfirmDialog.tsx +13 -6
- package/src/components/DetailRow/DetailRow.tsx +3 -3
- package/src/components/EmptyState/EmptyState.tsx +2 -2
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +6 -6
- package/src/components/HolographicCard/HolographicCard.tsx +14 -95
- package/src/components/IconButton/IconButton.tsx +2 -2
- package/src/components/IconPicker/IconPicker.tsx +13 -12
- package/src/components/ImageUpload/ImageUpload.tsx +24 -28
- package/src/components/ImageViewer/ImageViewer.tsx +3 -3
- package/src/components/Input/Input.tsx +11 -5
- package/src/components/LabelValue/LabelValue.tsx +2 -2
- package/src/components/ListItem/ListItem.tsx +4 -4
- package/src/components/MediaCard/MediaCard.tsx +21 -59
- package/src/components/MenuItem/MenuItem.tsx +2 -2
- package/src/components/MonthPicker/MonthPicker.tsx +2 -2
- package/src/components/NumberStepper/NumberStepper.tsx +6 -6
- package/src/components/PagerDots/PagerDots.tsx +38 -28
- package/src/components/PricingCard/PricingCard.tsx +6 -6
- package/src/components/RadioGroup/RadioGroup.tsx +18 -31
- package/src/components/Select/Select.tsx +32 -39
- package/src/components/SelectableCard/SelectableCard.tsx +302 -0
- package/src/components/SelectableCard/index.ts +1 -0
- package/src/components/SelectableGrid/SelectableGrid.tsx +38 -72
- package/src/components/Sheet/Sheet.tsx +11 -4
- package/src/components/SheetSelect/SheetSelect.tsx +3 -3
- package/src/components/Skeleton/Skeleton.tsx +6 -3
- package/src/components/Spinner/Spinner.tsx +2 -2
- package/src/components/Stats/Stats.tsx +36 -8
- package/src/components/Switch/Switch.tsx +9 -6
- package/src/components/TabBar/TabBar.tsx +9 -8
- package/src/components/Text/Text.tsx +12 -1
- package/src/components/Textarea/Textarea.tsx +18 -32
- package/src/components/Toggle/Toggle.tsx +3 -3
- package/src/hooks/useConfirmDialog.ts +31 -42
- package/src/index.ts +4 -4
- package/src/theme/ThemeProvider.tsx +1 -4
- package/src/theme/colorUtils.ts +1 -72
- package/src/theme/colors.ts +47 -1
- package/src/theme/types.ts +6 -3
- package/src/utils/animations.ts +0 -47
- package/src/utils/curatedIcons.ts +93 -801
- package/src/utils/haptics.ts +13 -208
- package/src/utils/icons.ts +27 -91
- package/src/utils/pressable.ts +10 -61
- package/dist/VirtualList.d.mts +0 -19
- package/dist/VirtualList.d.ts +0 -19
- package/dist/VirtualList.js +0 -38
- package/dist/VirtualList.mjs +0 -2
- package/dist/chunk-3DKJ2GIC.mjs +0 -30
- package/dist/chunk-AQEVCEXV.mjs +0 -164
- package/dist/chunk-DOGIPOF5.mjs +0 -131
- package/dist/chunk-DVK4G2GT.mjs +0 -59
- package/dist/chunk-EJ7ZPXOH.mjs +0 -163
- package/dist/chunk-J6Q2YJEV.mjs +0 -134
- package/dist/chunk-JNVAIDLK.mjs +0 -136
- package/dist/chunk-KA7LTET3.mjs +0 -71
- package/dist/chunk-KHYX4IOM.mjs +0 -1114
- package/dist/chunk-NC5ZTR2Y.mjs +0 -32
- package/dist/chunk-YNROWHQJ.mjs +0 -46
- package/src/components/VirtualList/VirtualList.tsx +0 -60
- package/src/components/VirtualList/index.ts +0 -1
- package/src/utils/fontGuard.ts +0 -35
- package/src/utils/hover.ts +0 -25
- package/src/utils/useColorTransition.ts +0 -40
- package/src/utils/usePressScale.ts +0 -75
package/dist/Stats.js
CHANGED
|
@@ -10,7 +10,6 @@ var FontAwesome5 = require('@expo/vector-icons/FontAwesome5');
|
|
|
10
10
|
var MaterialIcons = require('@expo/vector-icons/MaterialIcons');
|
|
11
11
|
var Ionicons = require('@expo/vector-icons/Ionicons');
|
|
12
12
|
var pressto = require('pressto');
|
|
13
|
-
var reactNativeReanimated = require('react-native-reanimated');
|
|
14
13
|
|
|
15
14
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
15
|
|
|
@@ -22,18 +21,13 @@ var FontAwesome5__default = /*#__PURE__*/_interopDefault(FontAwesome5);
|
|
|
22
21
|
var MaterialIcons__default = /*#__PURE__*/_interopDefault(MaterialIcons);
|
|
23
22
|
var Ionicons__default = /*#__PURE__*/_interopDefault(Ionicons);
|
|
24
23
|
|
|
25
|
-
|
|
26
|
-
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
27
|
-
}) : x)(function(x) {
|
|
28
|
-
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
29
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
30
|
-
});
|
|
24
|
+
// src/components/Stats/Stats.tsx
|
|
31
25
|
var _haptics = null;
|
|
32
|
-
var
|
|
26
|
+
var _loaded = false;
|
|
33
27
|
async function getHaptics() {
|
|
34
28
|
if (reactNative.Platform.OS === "web") return null;
|
|
35
|
-
if (!
|
|
36
|
-
|
|
29
|
+
if (!_loaded) {
|
|
30
|
+
_loaded = true;
|
|
37
31
|
try {
|
|
38
32
|
_haptics = await import('expo-haptics');
|
|
39
33
|
} catch {
|
|
@@ -42,158 +36,10 @@ async function getHaptics() {
|
|
|
42
36
|
}
|
|
43
37
|
return _haptics;
|
|
44
38
|
}
|
|
45
|
-
var _pulsar = null;
|
|
46
|
-
var _pulsarChecked = false;
|
|
47
|
-
var _pulsarAvailable = false;
|
|
48
|
-
function isPulsarNativeRegistered() {
|
|
49
|
-
try {
|
|
50
|
-
const g = globalThis;
|
|
51
|
-
if (typeof g.__turboModuleProxy === "function") {
|
|
52
|
-
return g.__turboModuleProxy("RNPulsar") != null;
|
|
53
|
-
}
|
|
54
|
-
return reactNative.NativeModules?.RNPulsar != null;
|
|
55
|
-
} catch {
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
function getPulsar() {
|
|
60
|
-
if (reactNative.Platform.OS === "web") return null;
|
|
61
|
-
if (!_pulsarChecked) {
|
|
62
|
-
_pulsarChecked = true;
|
|
63
|
-
try {
|
|
64
|
-
if (isPulsarNativeRegistered()) {
|
|
65
|
-
_pulsar = __require("react-native-pulsar");
|
|
66
|
-
_pulsarAvailable = true;
|
|
67
|
-
}
|
|
68
|
-
} catch {
|
|
69
|
-
_pulsar = null;
|
|
70
|
-
_pulsarAvailable = false;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
return _pulsarAvailable ? _pulsar : null;
|
|
74
|
-
}
|
|
75
39
|
function impactLight() {
|
|
76
|
-
|
|
77
|
-
getHaptics().then((h) => {
|
|
78
|
-
if (h) {
|
|
79
|
-
h.impactAsync(h.ImpactFeedbackStyle.Light);
|
|
80
|
-
} else {
|
|
81
|
-
getPulsar()?.Presets.System.impactLight();
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// src/theme/colorUtils.ts
|
|
87
|
-
function hexToRgb(hex) {
|
|
88
|
-
const clean = hex.replace("#", "");
|
|
89
|
-
const full = clean.length === 3 ? clean.split("").map((c) => c + c).join("") : clean;
|
|
90
|
-
if (full.length !== 6) return null;
|
|
91
|
-
return {
|
|
92
|
-
r: parseInt(full.slice(0, 2), 16),
|
|
93
|
-
g: parseInt(full.slice(2, 4), 16),
|
|
94
|
-
b: parseInt(full.slice(4, 6), 16)
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
function componentToHex(c) {
|
|
98
|
-
return Math.round(Math.max(0, Math.min(255, c))).toString(16).padStart(2, "0");
|
|
99
|
-
}
|
|
100
|
-
function rgbToHex(r, g, b) {
|
|
101
|
-
return `#${componentToHex(r)}${componentToHex(g)}${componentToHex(b)}`;
|
|
102
|
-
}
|
|
103
|
-
function withAlphaOnWhite(hex, alpha) {
|
|
104
|
-
const rgb = hexToRgb(hex);
|
|
105
|
-
if (!rgb) return hex;
|
|
106
|
-
const r = rgb.r * alpha + 255 * (1 - alpha);
|
|
107
|
-
const g = rgb.g * alpha + 255 * (1 - alpha);
|
|
108
|
-
const b = rgb.b * alpha + 255 * (1 - alpha);
|
|
109
|
-
return rgbToHex(r, g, b);
|
|
110
|
-
}
|
|
111
|
-
function withAlphaOnDark(hex, alpha, bgHex = "#0f0f0f") {
|
|
112
|
-
const rgb = hexToRgb(hex);
|
|
113
|
-
const bg = hexToRgb(bgHex);
|
|
114
|
-
if (!rgb || !bg) return hex;
|
|
115
|
-
const r = rgb.r * alpha + bg.r * (1 - alpha);
|
|
116
|
-
const g = rgb.g * alpha + bg.g * (1 - alpha);
|
|
117
|
-
const b = rgb.b * alpha + bg.b * (1 - alpha);
|
|
118
|
-
return rgbToHex(r, g, b);
|
|
119
|
-
}
|
|
120
|
-
function mixWithBackground(fgHex, bgHex, opacity) {
|
|
121
|
-
const fg = hexToRgb(fgHex);
|
|
122
|
-
const bg = hexToRgb(bgHex);
|
|
123
|
-
if (!fg || !bg) return fgHex;
|
|
124
|
-
const r = fg.r * opacity + bg.r * (1 - opacity);
|
|
125
|
-
const g = fg.g * opacity + bg.g * (1 - opacity);
|
|
126
|
-
const b = fg.b * opacity + bg.b * (1 - opacity);
|
|
127
|
-
return rgbToHex(r, g, b);
|
|
128
|
-
}
|
|
129
|
-
function lighten(hex, amount) {
|
|
130
|
-
return withAlphaOnWhite(hex, 1 - amount);
|
|
131
|
-
}
|
|
132
|
-
function darken(hex, amount) {
|
|
133
|
-
const rgb = hexToRgb(hex);
|
|
134
|
-
if (!rgb) return hex;
|
|
135
|
-
return rgbToHex(rgb.r * (1 - amount), rgb.g * (1 - amount), rgb.b * (1 - amount));
|
|
40
|
+
getHaptics().then((h) => h?.impactAsync(h.ImpactFeedbackStyle.Light));
|
|
136
41
|
}
|
|
137
|
-
|
|
138
|
-
// src/theme/colors.ts
|
|
139
|
-
var defaultLight = {
|
|
140
|
-
background: "#ffffff",
|
|
141
|
-
foreground: "#1a1a1a",
|
|
142
|
-
card: "#ffffff",
|
|
143
|
-
primary: "#1a1a1a",
|
|
144
|
-
primaryForeground: "#ffffff",
|
|
145
|
-
// AUDIT FIX: brand accent — was undefined; falls back to primary when omitted
|
|
146
|
-
accent: "#d4561d",
|
|
147
|
-
accentForeground: "#ffffff",
|
|
148
|
-
border: "#dddddd",
|
|
149
|
-
// AUDIT FIX: was #e53935 (4.22:1 on white — fails AA); #c72828 = 5.59:1 ✓
|
|
150
|
-
destructive: "#c72828",
|
|
151
|
-
destructiveForeground: "#ffffff",
|
|
152
|
-
success: "#1a7a45",
|
|
153
|
-
successForeground: "#ffffff",
|
|
154
|
-
// AUDIT FIX: was #e67e00 (2.86:1 — severe fail); #9a5200 = 5.86:1 ✓ AAA-near
|
|
155
|
-
warning: "#9a5200",
|
|
156
|
-
warningForeground: "#ffffff"
|
|
157
|
-
};
|
|
158
|
-
function deriveColors(t, scheme) {
|
|
159
|
-
const dark = scheme === "dark";
|
|
160
|
-
const bg = t.background;
|
|
161
|
-
const foregroundSubtle = mixWithBackground(t.foreground, bg, 0.7);
|
|
162
|
-
const foregroundMuted = mixWithBackground(t.foreground, bg, 0.62);
|
|
163
|
-
const surface = dark ? lighten(bg, -0.06) : darken(bg, 0.04);
|
|
164
|
-
const surfaceStrong = dark ? lighten(bg, -0.12) : darken(bg, 0.08);
|
|
165
|
-
const destructiveTint = dark ? withAlphaOnDark(t.destructive, 0.15, bg) : withAlphaOnWhite(t.destructive, 0.08);
|
|
166
|
-
const destructiveBorder = dark ? withAlphaOnDark(t.destructive, 0.45, bg) : withAlphaOnWhite(t.destructive, 0.3);
|
|
167
|
-
const successTint = dark ? withAlphaOnDark(t.success, 0.15, bg) : withAlphaOnWhite(t.success, 0.08);
|
|
168
|
-
const successBorder = dark ? withAlphaOnDark(t.success, 0.45, bg) : withAlphaOnWhite(t.success, 0.3);
|
|
169
|
-
const warningTint = dark ? withAlphaOnDark(t.warning, 0.15, bg) : withAlphaOnWhite(t.warning, 0.08);
|
|
170
|
-
const warningBorder = dark ? withAlphaOnDark(t.warning, 0.45, bg) : withAlphaOnWhite(t.warning, 0.3);
|
|
171
|
-
return {
|
|
172
|
-
...t,
|
|
173
|
-
foregroundSubtle,
|
|
174
|
-
foregroundMuted,
|
|
175
|
-
surface,
|
|
176
|
-
surfaceStrong,
|
|
177
|
-
destructiveTint,
|
|
178
|
-
destructiveBorder,
|
|
179
|
-
successTint,
|
|
180
|
-
successBorder,
|
|
181
|
-
warningTint,
|
|
182
|
-
warningBorder,
|
|
183
|
-
overlay: t.overlay ?? "rgba(0,0,0,0.45)",
|
|
184
|
-
accentResolved: t.accent ?? t.primary,
|
|
185
|
-
accentForegroundResolved: t.accentForeground ?? t.primaryForeground,
|
|
186
|
-
ring: t.accent ?? t.primary,
|
|
187
|
-
input: t.border,
|
|
188
|
-
separator: dark ? lighten(t.border, 0.22) : darken(t.border, 0.16)
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// src/theme/ThemeProvider.tsx
|
|
193
|
-
var ThemeContext = React3.createContext({
|
|
194
|
-
colors: deriveColors(defaultLight, "light"),
|
|
195
|
-
colorScheme: "light"
|
|
196
|
-
});
|
|
42
|
+
var ThemeContext = React3.createContext(void 0);
|
|
197
43
|
function useTheme() {
|
|
198
44
|
const context = React3.useContext(ThemeContext);
|
|
199
45
|
if (!context) {
|
|
@@ -210,86 +56,44 @@ var mvs = isWeb ? (n, _factor) => n : reactNativeSizeMatters.moderateVerticalSca
|
|
|
210
56
|
// src/tokens.ts
|
|
211
57
|
var RADIUS = {
|
|
212
58
|
md: 14};
|
|
213
|
-
var glyphMapOf = (mod) => mod.glyphMap ?? {};
|
|
214
59
|
var ALL_FAMILIES = [
|
|
215
|
-
{ name: "
|
|
216
|
-
{ name: "
|
|
217
|
-
{ name: "
|
|
218
|
-
{ name: "
|
|
219
|
-
{ name: "
|
|
220
|
-
{ name: "
|
|
60
|
+
{ name: "Feather", component: Feather__default.default },
|
|
61
|
+
{ name: "AntDesign", component: AntDesign__default.default },
|
|
62
|
+
{ name: "Entypo", component: Entypo__default.default },
|
|
63
|
+
{ name: "FontAwesome5", component: FontAwesome5__default.default },
|
|
64
|
+
{ name: "MaterialIcons", component: MaterialIcons__default.default },
|
|
65
|
+
{ name: "Ionicons", component: Ionicons__default.default }
|
|
221
66
|
];
|
|
222
|
-
var
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
for (const
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
67
|
+
var glyphCacheInitialized = false;
|
|
68
|
+
function ensureGlyphCache() {
|
|
69
|
+
if (glyphCacheInitialized) return;
|
|
70
|
+
glyphCacheInitialized = true;
|
|
71
|
+
for (const entry of ALL_FAMILIES) {
|
|
72
|
+
try {
|
|
73
|
+
entry.glyphMap = entry.component.glyphMap;
|
|
74
|
+
} catch {
|
|
75
|
+
entry.glyphMap = {};
|
|
230
76
|
}
|
|
231
77
|
}
|
|
232
|
-
return cache;
|
|
233
|
-
}
|
|
234
|
-
function resolveFamily(name) {
|
|
235
|
-
if (!resolvedCache) {
|
|
236
|
-
resolvedCache = buildCache();
|
|
237
|
-
}
|
|
238
|
-
return resolvedCache.get(name) ?? null;
|
|
239
78
|
}
|
|
240
79
|
function Icon({ name, size, color, family }) {
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
const Component = resolved.component;
|
|
249
|
-
return React3__default.default.createElement(Component, { name, size, color });
|
|
250
|
-
}
|
|
251
|
-
function renderIcon(name, size, color) {
|
|
252
|
-
return React3__default.default.createElement(Icon, { name, size, color });
|
|
80
|
+
ensureGlyphCache();
|
|
81
|
+
const entry = family ? ALL_FAMILIES.find((f) => f.name === family) : ALL_FAMILIES.find((f) => {
|
|
82
|
+
const glyphMap = f.glyphMap;
|
|
83
|
+
return glyphMap ? name in glyphMap : false;
|
|
84
|
+
});
|
|
85
|
+
if (!entry) return null;
|
|
86
|
+
return React3__default.default.createElement(entry.component, { name, size, color });
|
|
253
87
|
}
|
|
254
|
-
({
|
|
255
|
-
/** Material-style ease-out — natural deceleration for state changes. */
|
|
256
|
-
standard: reactNativeReanimated.Easing.bezier(0.2, 0, 0, 1),
|
|
257
|
-
/** Strong ease-out for expanding surfaces (Accordion open). */
|
|
258
|
-
expand: reactNativeReanimated.Easing.bezier(0.23, 1, 0.32, 1),
|
|
259
|
-
/** Quick ease-in for collapsing. */
|
|
260
|
-
collapse: reactNativeReanimated.Easing.in(reactNativeReanimated.Easing.ease)
|
|
261
|
-
});
|
|
262
|
-
var PRESS_SCALE = {
|
|
263
|
-
button: 0.95,
|
|
264
|
-
card: 0.98,
|
|
265
|
-
row: 0.97,
|
|
266
|
-
chip: 0.94
|
|
267
|
-
};
|
|
268
|
-
pressto.createAnimatedPressable((progress) => {
|
|
269
|
-
"worklet";
|
|
270
|
-
const scale2 = 1 - (1 - PRESS_SCALE.button) * progress;
|
|
271
|
-
return { transform: [{ scale: scale2 }] };
|
|
272
|
-
});
|
|
273
|
-
var PressableCard = pressto.createAnimatedPressable((progress) => {
|
|
274
|
-
"worklet";
|
|
275
|
-
const scale2 = 1 - (1 - PRESS_SCALE.card) * progress;
|
|
276
|
-
return { transform: [{ scale: scale2 }] };
|
|
277
|
-
});
|
|
278
|
-
pressto.createAnimatedPressable((progress) => {
|
|
88
|
+
var makePressable = (scale2) => pressto.createAnimatedPressable((progress) => {
|
|
279
89
|
"worklet";
|
|
280
|
-
|
|
281
|
-
return { transform: [{ scale: scale2 }] };
|
|
282
|
-
});
|
|
283
|
-
pressto.createAnimatedPressable((progress) => {
|
|
284
|
-
"worklet";
|
|
285
|
-
const scale2 = 1 - (1 - PRESS_SCALE.chip) * progress;
|
|
286
|
-
return { transform: [{ scale: scale2 }] };
|
|
287
|
-
});
|
|
288
|
-
pressto.createAnimatedPressable((progress) => {
|
|
289
|
-
"worklet";
|
|
290
|
-
const scale2 = 1 - (1 - PRESS_SCALE.button) * progress;
|
|
291
|
-
return { transform: [{ scale: scale2 }] };
|
|
90
|
+
return { transform: [{ scale: 1 - (1 - scale2) * progress }] };
|
|
292
91
|
});
|
|
92
|
+
makePressable(0.95);
|
|
93
|
+
var PressableCard = makePressable(0.98);
|
|
94
|
+
makePressable(0.97);
|
|
95
|
+
makePressable(0.94);
|
|
96
|
+
makePressable(0.95);
|
|
293
97
|
|
|
294
98
|
// src/components/Stats/Stats.tsx
|
|
295
99
|
var COMPACT_THRESHOLD = s(150);
|
|
@@ -301,6 +105,7 @@ function StatsComponent({
|
|
|
301
105
|
iconName,
|
|
302
106
|
iconColor,
|
|
303
107
|
variant = "elevated",
|
|
108
|
+
size = "default",
|
|
304
109
|
onPress,
|
|
305
110
|
style,
|
|
306
111
|
accessibilityLabel
|
|
@@ -319,6 +124,27 @@ function StatsComponent({
|
|
|
319
124
|
onPress();
|
|
320
125
|
};
|
|
321
126
|
const isCompact = containerWidth > 0 && containerWidth < COMPACT_THRESHOLD && !!(icon ?? iconName);
|
|
127
|
+
const sizeStyles = size === "compact" ? {
|
|
128
|
+
valueFontFamily: "Sohne-SemiBold",
|
|
129
|
+
valueFontSize: ms(16),
|
|
130
|
+
valueLineHeight: mvs(20),
|
|
131
|
+
labelFontSize: ms(11),
|
|
132
|
+
labelLineHeight: mvs(14),
|
|
133
|
+
descriptionFontSize: ms(10),
|
|
134
|
+
descriptionLineHeight: mvs(14),
|
|
135
|
+
iconSize: ms(18),
|
|
136
|
+
padding: s(12)
|
|
137
|
+
} : {
|
|
138
|
+
valueFontFamily: "Sohne-Bold",
|
|
139
|
+
valueFontSize: ms(21),
|
|
140
|
+
valueLineHeight: mvs(25),
|
|
141
|
+
labelFontSize: ms(13),
|
|
142
|
+
labelLineHeight: mvs(18),
|
|
143
|
+
descriptionFontSize: ms(12),
|
|
144
|
+
descriptionLineHeight: mvs(16),
|
|
145
|
+
iconSize: ms(20),
|
|
146
|
+
padding: s(16)
|
|
147
|
+
};
|
|
322
148
|
const variantStyle = {
|
|
323
149
|
elevated: {
|
|
324
150
|
backgroundColor: colors.card,
|
|
@@ -343,10 +169,10 @@ function StatsComponent({
|
|
|
343
169
|
}
|
|
344
170
|
}[variant];
|
|
345
171
|
const iconColorResolved = iconColor ?? colors.primary;
|
|
346
|
-
const resolvedIcon = iconName ?
|
|
172
|
+
const resolvedIcon = iconName ? /* @__PURE__ */ React3__default.default.createElement(Icon, { name: iconName, size: sizeStyles.iconSize, color: iconColorResolved }) : icon;
|
|
347
173
|
const iconElement = resolvedIcon ? /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles.iconWrapper }, resolvedIcon) : null;
|
|
348
|
-
const valueElement = /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.value, { color: colors.foreground }], allowFontScaling: true }, value);
|
|
349
|
-
const cardContent = /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: [styles.card, variantStyle, style], onLayout: handleLayout }, isCompact ? /* @__PURE__ */ React3__default.default.createElement(React3__default.default.Fragment, null, iconElement, /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles.compactValue }, valueElement), /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.label, { color: colors.foregroundSubtle }], allowFontScaling: true }, label), description ? /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null) : /* @__PURE__ */ React3__default.default.createElement(React3__default.default.Fragment, null, /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles.valueRow }, iconElement, valueElement), /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.label, { color: colors.foregroundSubtle }], allowFontScaling: true }, label), description ? /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null));
|
|
174
|
+
const valueElement = /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.value, { color: colors.foreground, fontFamily: sizeStyles.valueFontFamily, fontSize: sizeStyles.valueFontSize, lineHeight: sizeStyles.valueLineHeight }], allowFontScaling: true }, value);
|
|
175
|
+
const cardContent = /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: [styles.card, variantStyle, { padding: sizeStyles.padding }, style], onLayout: handleLayout }, isCompact ? /* @__PURE__ */ React3__default.default.createElement(React3__default.default.Fragment, null, iconElement, /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles.compactValue }, valueElement), /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.label, { color: colors.foregroundSubtle, fontSize: sizeStyles.labelFontSize, lineHeight: sizeStyles.labelLineHeight }], allowFontScaling: true }, label), description ? /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.description, { color: colors.foregroundMuted, fontSize: sizeStyles.descriptionFontSize, lineHeight: sizeStyles.descriptionLineHeight }], allowFontScaling: true }, description) : null) : /* @__PURE__ */ React3__default.default.createElement(React3__default.default.Fragment, null, /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles.valueRow }, iconElement, valueElement), /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.label, { color: colors.foregroundSubtle, fontSize: sizeStyles.labelFontSize, lineHeight: sizeStyles.labelLineHeight }], allowFontScaling: true }, label), description ? /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.description, { color: colors.foregroundMuted, fontSize: sizeStyles.descriptionFontSize, lineHeight: sizeStyles.descriptionLineHeight }], allowFontScaling: true }, description) : null));
|
|
350
176
|
if (onPress) {
|
|
351
177
|
return /* @__PURE__ */ React3__default.default.createElement(
|
|
352
178
|
PressableCard,
|
package/dist/Stats.mjs
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
export { Stats } from './chunk-
|
|
2
|
-
import './chunk-
|
|
3
|
-
import './chunk-
|
|
4
|
-
import './chunk-DVK4G2GT.mjs';
|
|
1
|
+
export { Stats } from './chunk-ZKDKKQCE.mjs';
|
|
2
|
+
import './chunk-IFYMBOEN.mjs';
|
|
3
|
+
import './chunk-ARONDO7M.mjs';
|
|
5
4
|
import './chunk-QY3X2UYR.mjs';
|
|
6
|
-
import './chunk-
|
|
7
|
-
import './chunk-
|
|
5
|
+
import './chunk-MZ6WRTD2.mjs';
|
|
6
|
+
import './chunk-KSSVIFYR.mjs';
|
|
8
7
|
import './chunk-2CE3TQVY.mjs';
|
|
9
8
|
import './chunk-Y6FXYEAI.mjs';
|
package/dist/Switch.js
CHANGED
|
@@ -5,24 +5,19 @@ var reactNative = require('react-native');
|
|
|
5
5
|
var reactNativeEase = require('react-native-ease');
|
|
6
6
|
var vectorIcons = require('@expo/vector-icons');
|
|
7
7
|
var reactNativeSizeMatters = require('react-native-size-matters');
|
|
8
|
-
var
|
|
8
|
+
var pressto = require('pressto');
|
|
9
9
|
|
|
10
10
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
11
|
|
|
12
12
|
var React2__default = /*#__PURE__*/_interopDefault(React2);
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
16
|
-
}) : x)(function(x) {
|
|
17
|
-
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
18
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
19
|
-
});
|
|
14
|
+
// src/components/Switch/Switch.tsx
|
|
20
15
|
var _haptics = null;
|
|
21
|
-
var
|
|
16
|
+
var _loaded = false;
|
|
22
17
|
async function getHaptics() {
|
|
23
18
|
if (reactNative.Platform.OS === "web") return null;
|
|
24
|
-
if (!
|
|
25
|
-
|
|
19
|
+
if (!_loaded) {
|
|
20
|
+
_loaded = true;
|
|
26
21
|
try {
|
|
27
22
|
_haptics = await import('expo-haptics');
|
|
28
23
|
} catch {
|
|
@@ -31,158 +26,10 @@ async function getHaptics() {
|
|
|
31
26
|
}
|
|
32
27
|
return _haptics;
|
|
33
28
|
}
|
|
34
|
-
var _pulsar = null;
|
|
35
|
-
var _pulsarChecked = false;
|
|
36
|
-
var _pulsarAvailable = false;
|
|
37
|
-
function isPulsarNativeRegistered() {
|
|
38
|
-
try {
|
|
39
|
-
const g = globalThis;
|
|
40
|
-
if (typeof g.__turboModuleProxy === "function") {
|
|
41
|
-
return g.__turboModuleProxy("RNPulsar") != null;
|
|
42
|
-
}
|
|
43
|
-
return reactNative.NativeModules?.RNPulsar != null;
|
|
44
|
-
} catch {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
function getPulsar() {
|
|
49
|
-
if (reactNative.Platform.OS === "web") return null;
|
|
50
|
-
if (!_pulsarChecked) {
|
|
51
|
-
_pulsarChecked = true;
|
|
52
|
-
try {
|
|
53
|
-
if (isPulsarNativeRegistered()) {
|
|
54
|
-
_pulsar = __require("react-native-pulsar");
|
|
55
|
-
_pulsarAvailable = true;
|
|
56
|
-
}
|
|
57
|
-
} catch {
|
|
58
|
-
_pulsar = null;
|
|
59
|
-
_pulsarAvailable = false;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return _pulsarAvailable ? _pulsar : null;
|
|
63
|
-
}
|
|
64
29
|
function selectionAsync() {
|
|
65
|
-
|
|
66
|
-
getHaptics().then((h) => {
|
|
67
|
-
if (h) {
|
|
68
|
-
h.selectionAsync();
|
|
69
|
-
} else {
|
|
70
|
-
getPulsar()?.Presets.System.selection();
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// src/theme/colorUtils.ts
|
|
76
|
-
function hexToRgb(hex) {
|
|
77
|
-
const clean = hex.replace("#", "");
|
|
78
|
-
const full = clean.length === 3 ? clean.split("").map((c) => c + c).join("") : clean;
|
|
79
|
-
if (full.length !== 6) return null;
|
|
80
|
-
return {
|
|
81
|
-
r: parseInt(full.slice(0, 2), 16),
|
|
82
|
-
g: parseInt(full.slice(2, 4), 16),
|
|
83
|
-
b: parseInt(full.slice(4, 6), 16)
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
function componentToHex(c) {
|
|
87
|
-
return Math.round(Math.max(0, Math.min(255, c))).toString(16).padStart(2, "0");
|
|
30
|
+
getHaptics().then((h) => h?.selectionAsync());
|
|
88
31
|
}
|
|
89
|
-
|
|
90
|
-
return `#${componentToHex(r)}${componentToHex(g)}${componentToHex(b)}`;
|
|
91
|
-
}
|
|
92
|
-
function withAlphaOnWhite(hex, alpha) {
|
|
93
|
-
const rgb = hexToRgb(hex);
|
|
94
|
-
if (!rgb) return hex;
|
|
95
|
-
const r = rgb.r * alpha + 255 * (1 - alpha);
|
|
96
|
-
const g = rgb.g * alpha + 255 * (1 - alpha);
|
|
97
|
-
const b = rgb.b * alpha + 255 * (1 - alpha);
|
|
98
|
-
return rgbToHex(r, g, b);
|
|
99
|
-
}
|
|
100
|
-
function withAlphaOnDark(hex, alpha, bgHex = "#0f0f0f") {
|
|
101
|
-
const rgb = hexToRgb(hex);
|
|
102
|
-
const bg = hexToRgb(bgHex);
|
|
103
|
-
if (!rgb || !bg) return hex;
|
|
104
|
-
const r = rgb.r * alpha + bg.r * (1 - alpha);
|
|
105
|
-
const g = rgb.g * alpha + bg.g * (1 - alpha);
|
|
106
|
-
const b = rgb.b * alpha + bg.b * (1 - alpha);
|
|
107
|
-
return rgbToHex(r, g, b);
|
|
108
|
-
}
|
|
109
|
-
function mixWithBackground(fgHex, bgHex, opacity) {
|
|
110
|
-
const fg = hexToRgb(fgHex);
|
|
111
|
-
const bg = hexToRgb(bgHex);
|
|
112
|
-
if (!fg || !bg) return fgHex;
|
|
113
|
-
const r = fg.r * opacity + bg.r * (1 - opacity);
|
|
114
|
-
const g = fg.g * opacity + bg.g * (1 - opacity);
|
|
115
|
-
const b = fg.b * opacity + bg.b * (1 - opacity);
|
|
116
|
-
return rgbToHex(r, g, b);
|
|
117
|
-
}
|
|
118
|
-
function lighten(hex, amount) {
|
|
119
|
-
return withAlphaOnWhite(hex, 1 - amount);
|
|
120
|
-
}
|
|
121
|
-
function darken(hex, amount) {
|
|
122
|
-
const rgb = hexToRgb(hex);
|
|
123
|
-
if (!rgb) return hex;
|
|
124
|
-
return rgbToHex(rgb.r * (1 - amount), rgb.g * (1 - amount), rgb.b * (1 - amount));
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// src/theme/colors.ts
|
|
128
|
-
var defaultLight = {
|
|
129
|
-
background: "#ffffff",
|
|
130
|
-
foreground: "#1a1a1a",
|
|
131
|
-
card: "#ffffff",
|
|
132
|
-
primary: "#1a1a1a",
|
|
133
|
-
primaryForeground: "#ffffff",
|
|
134
|
-
// AUDIT FIX: brand accent — was undefined; falls back to primary when omitted
|
|
135
|
-
accent: "#d4561d",
|
|
136
|
-
accentForeground: "#ffffff",
|
|
137
|
-
border: "#dddddd",
|
|
138
|
-
// AUDIT FIX: was #e53935 (4.22:1 on white — fails AA); #c72828 = 5.59:1 ✓
|
|
139
|
-
destructive: "#c72828",
|
|
140
|
-
destructiveForeground: "#ffffff",
|
|
141
|
-
success: "#1a7a45",
|
|
142
|
-
successForeground: "#ffffff",
|
|
143
|
-
// AUDIT FIX: was #e67e00 (2.86:1 — severe fail); #9a5200 = 5.86:1 ✓ AAA-near
|
|
144
|
-
warning: "#9a5200",
|
|
145
|
-
warningForeground: "#ffffff"
|
|
146
|
-
};
|
|
147
|
-
function deriveColors(t, scheme) {
|
|
148
|
-
const dark = scheme === "dark";
|
|
149
|
-
const bg = t.background;
|
|
150
|
-
const foregroundSubtle = mixWithBackground(t.foreground, bg, 0.7);
|
|
151
|
-
const foregroundMuted = mixWithBackground(t.foreground, bg, 0.62);
|
|
152
|
-
const surface = dark ? lighten(bg, -0.06) : darken(bg, 0.04);
|
|
153
|
-
const surfaceStrong = dark ? lighten(bg, -0.12) : darken(bg, 0.08);
|
|
154
|
-
const destructiveTint = dark ? withAlphaOnDark(t.destructive, 0.15, bg) : withAlphaOnWhite(t.destructive, 0.08);
|
|
155
|
-
const destructiveBorder = dark ? withAlphaOnDark(t.destructive, 0.45, bg) : withAlphaOnWhite(t.destructive, 0.3);
|
|
156
|
-
const successTint = dark ? withAlphaOnDark(t.success, 0.15, bg) : withAlphaOnWhite(t.success, 0.08);
|
|
157
|
-
const successBorder = dark ? withAlphaOnDark(t.success, 0.45, bg) : withAlphaOnWhite(t.success, 0.3);
|
|
158
|
-
const warningTint = dark ? withAlphaOnDark(t.warning, 0.15, bg) : withAlphaOnWhite(t.warning, 0.08);
|
|
159
|
-
const warningBorder = dark ? withAlphaOnDark(t.warning, 0.45, bg) : withAlphaOnWhite(t.warning, 0.3);
|
|
160
|
-
return {
|
|
161
|
-
...t,
|
|
162
|
-
foregroundSubtle,
|
|
163
|
-
foregroundMuted,
|
|
164
|
-
surface,
|
|
165
|
-
surfaceStrong,
|
|
166
|
-
destructiveTint,
|
|
167
|
-
destructiveBorder,
|
|
168
|
-
successTint,
|
|
169
|
-
successBorder,
|
|
170
|
-
warningTint,
|
|
171
|
-
warningBorder,
|
|
172
|
-
overlay: t.overlay ?? "rgba(0,0,0,0.45)",
|
|
173
|
-
accentResolved: t.accent ?? t.primary,
|
|
174
|
-
accentForegroundResolved: t.accentForeground ?? t.primaryForeground,
|
|
175
|
-
ring: t.accent ?? t.primary,
|
|
176
|
-
input: t.border,
|
|
177
|
-
separator: dark ? lighten(t.border, 0.22) : darken(t.border, 0.16)
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// src/theme/ThemeProvider.tsx
|
|
182
|
-
var ThemeContext = React2.createContext({
|
|
183
|
-
colors: deriveColors(defaultLight, "light"),
|
|
184
|
-
colorScheme: "light"
|
|
185
|
-
});
|
|
32
|
+
var ThemeContext = React2.createContext(void 0);
|
|
186
33
|
function useTheme() {
|
|
187
34
|
const context = React2.useContext(ThemeContext);
|
|
188
35
|
if (!context) {
|
|
@@ -192,17 +39,10 @@ function useTheme() {
|
|
|
192
39
|
}
|
|
193
40
|
var isWeb = reactNative.Platform.OS === "web";
|
|
194
41
|
var s = isWeb ? (n) => n : reactNativeSizeMatters.scale;
|
|
42
|
+
|
|
43
|
+
// src/utils/animations.ts
|
|
195
44
|
var TIMINGS = {
|
|
196
|
-
/** Color/opacity transitions on toggles, checkboxes, switches. */
|
|
197
45
|
state: { duration: 160 }};
|
|
198
|
-
({
|
|
199
|
-
/** Material-style ease-out — natural deceleration for state changes. */
|
|
200
|
-
standard: reactNativeReanimated.Easing.bezier(0.2, 0, 0, 1),
|
|
201
|
-
/** Strong ease-out for expanding surfaces (Accordion open). */
|
|
202
|
-
expand: reactNativeReanimated.Easing.bezier(0.23, 1, 0.32, 1),
|
|
203
|
-
/** Quick ease-in for collapsing. */
|
|
204
|
-
collapse: reactNativeReanimated.Easing.in(reactNativeReanimated.Easing.ease)
|
|
205
|
-
});
|
|
206
46
|
var COLOR_TRANSITION = {
|
|
207
47
|
type: "timing",
|
|
208
48
|
duration: TIMINGS.state.duration,
|
|
@@ -219,6 +59,15 @@ var SPRING_ELASTIC = {
|
|
|
219
59
|
damping: 22,
|
|
220
60
|
mass: 0.7
|
|
221
61
|
};
|
|
62
|
+
var makePressable = (scale2) => pressto.createAnimatedPressable((progress) => {
|
|
63
|
+
"worklet";
|
|
64
|
+
return { transform: [{ scale: 1 - (1 - scale2) * progress }] };
|
|
65
|
+
});
|
|
66
|
+
var PressableButton = makePressable(0.95);
|
|
67
|
+
makePressable(0.98);
|
|
68
|
+
makePressable(0.97);
|
|
69
|
+
makePressable(0.94);
|
|
70
|
+
makePressable(0.95);
|
|
222
71
|
|
|
223
72
|
// src/components/Switch/Switch.tsx
|
|
224
73
|
var TRACK_WIDTH = s(52);
|
|
@@ -232,14 +81,14 @@ function Switch({ checked = false, onCheckedChange, disabled, style, accessibili
|
|
|
232
81
|
const { colors } = useTheme();
|
|
233
82
|
const isDisabled = !!disabled;
|
|
234
83
|
return /* @__PURE__ */ React2__default.default.createElement(reactNative.View, { style: [{ alignSelf: "flex-start" }, style] }, /* @__PURE__ */ React2__default.default.createElement(
|
|
235
|
-
|
|
84
|
+
PressableButton,
|
|
236
85
|
{
|
|
237
86
|
onPress: () => {
|
|
238
87
|
selectionAsync();
|
|
239
88
|
onCheckedChange?.(!checked);
|
|
240
89
|
},
|
|
241
|
-
disabled,
|
|
242
|
-
|
|
90
|
+
enabled: !disabled,
|
|
91
|
+
rippleColor: "transparent",
|
|
243
92
|
touchSoundDisabled: true,
|
|
244
93
|
accessibilityRole: "switch",
|
|
245
94
|
accessibilityLabel,
|
|
@@ -291,7 +140,9 @@ function Switch({ checked = false, onCheckedChange, disabled, style, accessibili
|
|
|
291
140
|
}
|
|
292
141
|
var styles = reactNative.StyleSheet.create({
|
|
293
142
|
touchable: {
|
|
294
|
-
alignSelf: "flex-start"
|
|
143
|
+
alignSelf: "flex-start",
|
|
144
|
+
minHeight: 44,
|
|
145
|
+
justifyContent: "center"
|
|
295
146
|
},
|
|
296
147
|
trackContainer: {
|
|
297
148
|
position: "relative",
|
package/dist/Switch.mjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
export { Switch } from './chunk-
|
|
2
|
-
import './chunk-
|
|
3
|
-
import './chunk-
|
|
4
|
-
import './chunk-
|
|
1
|
+
export { Switch } from './chunk-BTUW5LSG.mjs';
|
|
2
|
+
import './chunk-M53LC4Q7.mjs';
|
|
3
|
+
import './chunk-IFYMBOEN.mjs';
|
|
4
|
+
import './chunk-ARONDO7M.mjs';
|
|
5
|
+
import './chunk-KSSVIFYR.mjs';
|
|
5
6
|
import './chunk-2CE3TQVY.mjs';
|
|
6
7
|
import './chunk-Y6FXYEAI.mjs';
|