@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/AppHeader.js
CHANGED
|
@@ -11,7 +11,6 @@ var FontAwesome5 = require('@expo/vector-icons/FontAwesome5');
|
|
|
11
11
|
var MaterialIcons = require('@expo/vector-icons/MaterialIcons');
|
|
12
12
|
var Ionicons = require('@expo/vector-icons/Ionicons');
|
|
13
13
|
var pressto = require('pressto');
|
|
14
|
-
var reactNativeReanimated = require('react-native-reanimated');
|
|
15
14
|
|
|
16
15
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
17
16
|
|
|
@@ -23,124 +22,8 @@ var FontAwesome5__default = /*#__PURE__*/_interopDefault(FontAwesome5);
|
|
|
23
22
|
var MaterialIcons__default = /*#__PURE__*/_interopDefault(MaterialIcons);
|
|
24
23
|
var Ionicons__default = /*#__PURE__*/_interopDefault(Ionicons);
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}) : x)(function(x) {
|
|
29
|
-
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
30
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
// src/theme/colorUtils.ts
|
|
34
|
-
function hexToRgb(hex) {
|
|
35
|
-
const clean = hex.replace("#", "");
|
|
36
|
-
const full = clean.length === 3 ? clean.split("").map((c) => c + c).join("") : clean;
|
|
37
|
-
if (full.length !== 6) return null;
|
|
38
|
-
return {
|
|
39
|
-
r: parseInt(full.slice(0, 2), 16),
|
|
40
|
-
g: parseInt(full.slice(2, 4), 16),
|
|
41
|
-
b: parseInt(full.slice(4, 6), 16)
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
function componentToHex(c) {
|
|
45
|
-
return Math.round(Math.max(0, Math.min(255, c))).toString(16).padStart(2, "0");
|
|
46
|
-
}
|
|
47
|
-
function rgbToHex(r, g, b) {
|
|
48
|
-
return `#${componentToHex(r)}${componentToHex(g)}${componentToHex(b)}`;
|
|
49
|
-
}
|
|
50
|
-
function withAlphaOnWhite(hex, alpha) {
|
|
51
|
-
const rgb = hexToRgb(hex);
|
|
52
|
-
if (!rgb) return hex;
|
|
53
|
-
const r = rgb.r * alpha + 255 * (1 - alpha);
|
|
54
|
-
const g = rgb.g * alpha + 255 * (1 - alpha);
|
|
55
|
-
const b = rgb.b * alpha + 255 * (1 - alpha);
|
|
56
|
-
return rgbToHex(r, g, b);
|
|
57
|
-
}
|
|
58
|
-
function withAlphaOnDark(hex, alpha, bgHex = "#0f0f0f") {
|
|
59
|
-
const rgb = hexToRgb(hex);
|
|
60
|
-
const bg = hexToRgb(bgHex);
|
|
61
|
-
if (!rgb || !bg) return hex;
|
|
62
|
-
const r = rgb.r * alpha + bg.r * (1 - alpha);
|
|
63
|
-
const g = rgb.g * alpha + bg.g * (1 - alpha);
|
|
64
|
-
const b = rgb.b * alpha + bg.b * (1 - alpha);
|
|
65
|
-
return rgbToHex(r, g, b);
|
|
66
|
-
}
|
|
67
|
-
function mixWithBackground(fgHex, bgHex, opacity) {
|
|
68
|
-
const fg = hexToRgb(fgHex);
|
|
69
|
-
const bg = hexToRgb(bgHex);
|
|
70
|
-
if (!fg || !bg) return fgHex;
|
|
71
|
-
const r = fg.r * opacity + bg.r * (1 - opacity);
|
|
72
|
-
const g = fg.g * opacity + bg.g * (1 - opacity);
|
|
73
|
-
const b = fg.b * opacity + bg.b * (1 - opacity);
|
|
74
|
-
return rgbToHex(r, g, b);
|
|
75
|
-
}
|
|
76
|
-
function lighten(hex, amount) {
|
|
77
|
-
return withAlphaOnWhite(hex, 1 - amount);
|
|
78
|
-
}
|
|
79
|
-
function darken(hex, amount) {
|
|
80
|
-
const rgb = hexToRgb(hex);
|
|
81
|
-
if (!rgb) return hex;
|
|
82
|
-
return rgbToHex(rgb.r * (1 - amount), rgb.g * (1 - amount), rgb.b * (1 - amount));
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// src/theme/colors.ts
|
|
86
|
-
var defaultLight = {
|
|
87
|
-
background: "#ffffff",
|
|
88
|
-
foreground: "#1a1a1a",
|
|
89
|
-
card: "#ffffff",
|
|
90
|
-
primary: "#1a1a1a",
|
|
91
|
-
primaryForeground: "#ffffff",
|
|
92
|
-
// AUDIT FIX: brand accent — was undefined; falls back to primary when omitted
|
|
93
|
-
accent: "#d4561d",
|
|
94
|
-
accentForeground: "#ffffff",
|
|
95
|
-
border: "#dddddd",
|
|
96
|
-
// AUDIT FIX: was #e53935 (4.22:1 on white — fails AA); #c72828 = 5.59:1 ✓
|
|
97
|
-
destructive: "#c72828",
|
|
98
|
-
destructiveForeground: "#ffffff",
|
|
99
|
-
success: "#1a7a45",
|
|
100
|
-
successForeground: "#ffffff",
|
|
101
|
-
// AUDIT FIX: was #e67e00 (2.86:1 — severe fail); #9a5200 = 5.86:1 ✓ AAA-near
|
|
102
|
-
warning: "#9a5200",
|
|
103
|
-
warningForeground: "#ffffff"
|
|
104
|
-
};
|
|
105
|
-
function deriveColors(t, scheme) {
|
|
106
|
-
const dark = scheme === "dark";
|
|
107
|
-
const bg = t.background;
|
|
108
|
-
const foregroundSubtle = mixWithBackground(t.foreground, bg, 0.7);
|
|
109
|
-
const foregroundMuted = mixWithBackground(t.foreground, bg, 0.62);
|
|
110
|
-
const surface = dark ? lighten(bg, -0.06) : darken(bg, 0.04);
|
|
111
|
-
const surfaceStrong = dark ? lighten(bg, -0.12) : darken(bg, 0.08);
|
|
112
|
-
const destructiveTint = dark ? withAlphaOnDark(t.destructive, 0.15, bg) : withAlphaOnWhite(t.destructive, 0.08);
|
|
113
|
-
const destructiveBorder = dark ? withAlphaOnDark(t.destructive, 0.45, bg) : withAlphaOnWhite(t.destructive, 0.3);
|
|
114
|
-
const successTint = dark ? withAlphaOnDark(t.success, 0.15, bg) : withAlphaOnWhite(t.success, 0.08);
|
|
115
|
-
const successBorder = dark ? withAlphaOnDark(t.success, 0.45, bg) : withAlphaOnWhite(t.success, 0.3);
|
|
116
|
-
const warningTint = dark ? withAlphaOnDark(t.warning, 0.15, bg) : withAlphaOnWhite(t.warning, 0.08);
|
|
117
|
-
const warningBorder = dark ? withAlphaOnDark(t.warning, 0.45, bg) : withAlphaOnWhite(t.warning, 0.3);
|
|
118
|
-
return {
|
|
119
|
-
...t,
|
|
120
|
-
foregroundSubtle,
|
|
121
|
-
foregroundMuted,
|
|
122
|
-
surface,
|
|
123
|
-
surfaceStrong,
|
|
124
|
-
destructiveTint,
|
|
125
|
-
destructiveBorder,
|
|
126
|
-
successTint,
|
|
127
|
-
successBorder,
|
|
128
|
-
warningTint,
|
|
129
|
-
warningBorder,
|
|
130
|
-
overlay: t.overlay ?? "rgba(0,0,0,0.45)",
|
|
131
|
-
accentResolved: t.accent ?? t.primary,
|
|
132
|
-
accentForegroundResolved: t.accentForeground ?? t.primaryForeground,
|
|
133
|
-
ring: t.accent ?? t.primary,
|
|
134
|
-
input: t.border,
|
|
135
|
-
separator: dark ? lighten(t.border, 0.22) : darken(t.border, 0.16)
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// src/theme/ThemeProvider.tsx
|
|
140
|
-
var ThemeContext = React4.createContext({
|
|
141
|
-
colors: deriveColors(defaultLight, "light"),
|
|
142
|
-
colorScheme: "light"
|
|
143
|
-
});
|
|
25
|
+
// src/components/AppHeader/AppHeader.tsx
|
|
26
|
+
var ThemeContext = React4.createContext(void 0);
|
|
144
27
|
function useTheme() {
|
|
145
28
|
const context = React4.useContext(ThemeContext);
|
|
146
29
|
if (!context) {
|
|
@@ -149,11 +32,11 @@ function useTheme() {
|
|
|
149
32
|
return context;
|
|
150
33
|
}
|
|
151
34
|
var _haptics = null;
|
|
152
|
-
var
|
|
35
|
+
var _loaded = false;
|
|
153
36
|
async function getHaptics() {
|
|
154
37
|
if (reactNative.Platform.OS === "web") return null;
|
|
155
|
-
if (!
|
|
156
|
-
|
|
38
|
+
if (!_loaded) {
|
|
39
|
+
_loaded = true;
|
|
157
40
|
try {
|
|
158
41
|
_haptics = await import('expo-haptics');
|
|
159
42
|
} catch {
|
|
@@ -162,131 +45,52 @@ async function getHaptics() {
|
|
|
162
45
|
}
|
|
163
46
|
return _haptics;
|
|
164
47
|
}
|
|
165
|
-
var _pulsar = null;
|
|
166
|
-
var _pulsarChecked = false;
|
|
167
|
-
var _pulsarAvailable = false;
|
|
168
|
-
function isPulsarNativeRegistered() {
|
|
169
|
-
try {
|
|
170
|
-
const g = globalThis;
|
|
171
|
-
if (typeof g.__turboModuleProxy === "function") {
|
|
172
|
-
return g.__turboModuleProxy("RNPulsar") != null;
|
|
173
|
-
}
|
|
174
|
-
return reactNative.NativeModules?.RNPulsar != null;
|
|
175
|
-
} catch {
|
|
176
|
-
return false;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
function getPulsar() {
|
|
180
|
-
if (reactNative.Platform.OS === "web") return null;
|
|
181
|
-
if (!_pulsarChecked) {
|
|
182
|
-
_pulsarChecked = true;
|
|
183
|
-
try {
|
|
184
|
-
if (isPulsarNativeRegistered()) {
|
|
185
|
-
_pulsar = __require("react-native-pulsar");
|
|
186
|
-
_pulsarAvailable = true;
|
|
187
|
-
}
|
|
188
|
-
} catch {
|
|
189
|
-
_pulsar = null;
|
|
190
|
-
_pulsarAvailable = false;
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
return _pulsarAvailable ? _pulsar : null;
|
|
194
|
-
}
|
|
195
48
|
function impactLight() {
|
|
196
|
-
|
|
197
|
-
getHaptics().then((h) => {
|
|
198
|
-
if (h) {
|
|
199
|
-
h.impactAsync(h.ImpactFeedbackStyle.Light);
|
|
200
|
-
} else {
|
|
201
|
-
getPulsar()?.Presets.System.impactLight();
|
|
202
|
-
}
|
|
203
|
-
});
|
|
49
|
+
getHaptics().then((h) => h?.impactAsync(h.ImpactFeedbackStyle.Light));
|
|
204
50
|
}
|
|
205
51
|
var isWeb = reactNative.Platform.OS === "web";
|
|
206
52
|
var s = isWeb ? (n) => n : reactNativeSizeMatters.scale;
|
|
207
53
|
var vs = isWeb ? (n) => n : reactNativeSizeMatters.verticalScale;
|
|
208
54
|
var ms = isWeb ? (n, _factor) => n : reactNativeSizeMatters.moderateScale;
|
|
209
55
|
var mvs = isWeb ? (n, _factor) => n : reactNativeSizeMatters.moderateVerticalScale;
|
|
210
|
-
var glyphMapOf = (mod) => mod.glyphMap ?? {};
|
|
211
56
|
var ALL_FAMILIES = [
|
|
212
|
-
{ name: "
|
|
213
|
-
{ name: "
|
|
214
|
-
{ name: "
|
|
215
|
-
{ name: "
|
|
216
|
-
{ name: "
|
|
217
|
-
{ name: "
|
|
57
|
+
{ name: "Feather", component: Feather__default.default },
|
|
58
|
+
{ name: "AntDesign", component: AntDesign__default.default },
|
|
59
|
+
{ name: "Entypo", component: Entypo__default.default },
|
|
60
|
+
{ name: "FontAwesome5", component: FontAwesome5__default.default },
|
|
61
|
+
{ name: "MaterialIcons", component: MaterialIcons__default.default },
|
|
62
|
+
{ name: "Ionicons", component: Ionicons__default.default }
|
|
218
63
|
];
|
|
219
|
-
var
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
for (const
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
64
|
+
var glyphCacheInitialized = false;
|
|
65
|
+
function ensureGlyphCache() {
|
|
66
|
+
if (glyphCacheInitialized) return;
|
|
67
|
+
glyphCacheInitialized = true;
|
|
68
|
+
for (const entry of ALL_FAMILIES) {
|
|
69
|
+
try {
|
|
70
|
+
entry.glyphMap = entry.component.glyphMap;
|
|
71
|
+
} catch {
|
|
72
|
+
entry.glyphMap = {};
|
|
227
73
|
}
|
|
228
74
|
}
|
|
229
|
-
return cache;
|
|
230
|
-
}
|
|
231
|
-
function resolveFamily(name) {
|
|
232
|
-
if (!resolvedCache) {
|
|
233
|
-
resolvedCache = buildCache();
|
|
234
|
-
}
|
|
235
|
-
return resolvedCache.get(name) ?? null;
|
|
236
75
|
}
|
|
237
76
|
function Icon({ name, size, color, family }) {
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
const Component = resolved.component;
|
|
246
|
-
return React4__default.default.createElement(Component, { name, size, color });
|
|
247
|
-
}
|
|
248
|
-
function renderIcon(name, size, color) {
|
|
249
|
-
return React4__default.default.createElement(Icon, { name, size, color });
|
|
77
|
+
ensureGlyphCache();
|
|
78
|
+
const entry = family ? ALL_FAMILIES.find((f) => f.name === family) : ALL_FAMILIES.find((f) => {
|
|
79
|
+
const glyphMap = f.glyphMap;
|
|
80
|
+
return glyphMap ? name in glyphMap : false;
|
|
81
|
+
});
|
|
82
|
+
if (!entry) return null;
|
|
83
|
+
return React4__default.default.createElement(entry.component, { name, size, color });
|
|
250
84
|
}
|
|
251
|
-
({
|
|
252
|
-
/** Material-style ease-out — natural deceleration for state changes. */
|
|
253
|
-
standard: reactNativeReanimated.Easing.bezier(0.2, 0, 0, 1),
|
|
254
|
-
/** Strong ease-out for expanding surfaces (Accordion open). */
|
|
255
|
-
expand: reactNativeReanimated.Easing.bezier(0.23, 1, 0.32, 1),
|
|
256
|
-
/** Quick ease-in for collapsing. */
|
|
257
|
-
collapse: reactNativeReanimated.Easing.in(reactNativeReanimated.Easing.ease)
|
|
258
|
-
});
|
|
259
|
-
var PRESS_SCALE = {
|
|
260
|
-
button: 0.95,
|
|
261
|
-
card: 0.98,
|
|
262
|
-
row: 0.97,
|
|
263
|
-
chip: 0.94
|
|
264
|
-
};
|
|
265
|
-
var PressableButton = pressto.createAnimatedPressable((progress) => {
|
|
266
|
-
"worklet";
|
|
267
|
-
const scale2 = 1 - (1 - PRESS_SCALE.button) * progress;
|
|
268
|
-
return { transform: [{ scale: scale2 }] };
|
|
269
|
-
});
|
|
270
|
-
pressto.createAnimatedPressable((progress) => {
|
|
271
|
-
"worklet";
|
|
272
|
-
const scale2 = 1 - (1 - PRESS_SCALE.card) * progress;
|
|
273
|
-
return { transform: [{ scale: scale2 }] };
|
|
274
|
-
});
|
|
275
|
-
pressto.createAnimatedPressable((progress) => {
|
|
276
|
-
"worklet";
|
|
277
|
-
const scale2 = 1 - (1 - PRESS_SCALE.row) * progress;
|
|
278
|
-
return { transform: [{ scale: scale2 }] };
|
|
279
|
-
});
|
|
280
|
-
pressto.createAnimatedPressable((progress) => {
|
|
281
|
-
"worklet";
|
|
282
|
-
const scale2 = 1 - (1 - PRESS_SCALE.chip) * progress;
|
|
283
|
-
return { transform: [{ scale: scale2 }] };
|
|
284
|
-
});
|
|
285
|
-
pressto.createAnimatedPressable((progress) => {
|
|
85
|
+
var makePressable = (scale2) => pressto.createAnimatedPressable((progress) => {
|
|
286
86
|
"worklet";
|
|
287
|
-
|
|
288
|
-
return { transform: [{ scale: scale2 }] };
|
|
87
|
+
return { transform: [{ scale: 1 - (1 - scale2) * progress }] };
|
|
289
88
|
});
|
|
89
|
+
var PressableButton = makePressable(0.95);
|
|
90
|
+
makePressable(0.98);
|
|
91
|
+
makePressable(0.97);
|
|
92
|
+
makePressable(0.94);
|
|
93
|
+
makePressable(0.95);
|
|
290
94
|
|
|
291
95
|
// src/components/IconButton/IconButton.tsx
|
|
292
96
|
var sizeMap = {
|
|
@@ -331,7 +135,7 @@ function IconButtonBase({
|
|
|
331
135
|
}[variant];
|
|
332
136
|
const spinnerColor = variant === "destructive" ? colors.destructiveForeground : variant === "primary" ? colors.primaryForeground : colors.foreground;
|
|
333
137
|
const { container: containerSize, icon: iconSize } = sizeMap[size];
|
|
334
|
-
const resolvedIcon = iconName ?
|
|
138
|
+
const resolvedIcon = iconName ? /* @__PURE__ */ React4__default.default.createElement(Icon, { name: iconName, size: iconSize, color: iconColor ?? defaultIconColor }) : icon;
|
|
335
139
|
const showBadge = badge !== void 0 && badge !== false && badge !== 0;
|
|
336
140
|
const badgeCount = typeof badge === "number" ? Math.min(badge, 99) : null;
|
|
337
141
|
const showCount = typeof badge === "number" && badge > 0;
|
|
@@ -431,7 +235,7 @@ function AppHeader({
|
|
|
431
235
|
variant: "text",
|
|
432
236
|
size: "md",
|
|
433
237
|
onPress: onBack,
|
|
434
|
-
accessibilityLabel: "
|
|
238
|
+
accessibilityLabel: "Atr\xE1s"
|
|
435
239
|
}
|
|
436
240
|
) : null);
|
|
437
241
|
const titleBlock = /* @__PURE__ */ React4__default.default.createElement(reactNative.View, { style: [styles2.titleBlock, centered && styles2.titleBlockCentered], pointerEvents: "none" }, title ? /* @__PURE__ */ React4__default.default.createElement(
|
package/dist/AppHeader.mjs
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
export { AppHeader } from './chunk-
|
|
2
|
-
import './chunk-
|
|
3
|
-
import './chunk-
|
|
4
|
-
import './chunk-
|
|
5
|
-
import './chunk-DVK4G2GT.mjs';
|
|
1
|
+
export { AppHeader } from './chunk-6CR4S6W2.mjs';
|
|
2
|
+
import './chunk-ZTPYUU5C.mjs';
|
|
3
|
+
import './chunk-IFYMBOEN.mjs';
|
|
4
|
+
import './chunk-ARONDO7M.mjs';
|
|
6
5
|
import './chunk-QY3X2UYR.mjs';
|
|
7
|
-
import './chunk-
|
|
8
|
-
import './chunk-
|
|
6
|
+
import './chunk-MZ6WRTD2.mjs';
|
|
7
|
+
import './chunk-KSSVIFYR.mjs';
|
|
9
8
|
import './chunk-2CE3TQVY.mjs';
|
|
10
9
|
import './chunk-Y6FXYEAI.mjs';
|
package/dist/Avatar.d.mts
CHANGED
|
@@ -16,5 +16,21 @@ interface AvatarProps {
|
|
|
16
16
|
}
|
|
17
17
|
declare function AvatarBase({ src, fallback, fallbackText, size, status, style }: AvatarProps): React.JSX.Element;
|
|
18
18
|
declare const Avatar: React.MemoExoticComponent<typeof AvatarBase>;
|
|
19
|
+
interface AvatarGroupProps {
|
|
20
|
+
users: {
|
|
21
|
+
name: string;
|
|
22
|
+
src?: string;
|
|
23
|
+
}[];
|
|
24
|
+
/** Max avatars visible before +N overflow badge. Default 3. */
|
|
25
|
+
max?: number;
|
|
26
|
+
/** Avatar size preset. Default 'sm'. */
|
|
27
|
+
size?: AvatarSize;
|
|
28
|
+
/** Overlap between avatars in points. Default 8 (spacing.sm). */
|
|
29
|
+
overlap?: number;
|
|
30
|
+
/** Called when +N overflow badge is tapped. */
|
|
31
|
+
onOverflowPress?: () => void;
|
|
32
|
+
style?: ViewStyle;
|
|
33
|
+
}
|
|
34
|
+
declare function AvatarGroup({ users, max, size, overlap, onOverflowPress, style, }: AvatarGroupProps): React.JSX.Element;
|
|
19
35
|
|
|
20
|
-
export { Avatar, type AvatarProps, type AvatarSize };
|
|
36
|
+
export { Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, type AvatarSize };
|
package/dist/Avatar.d.ts
CHANGED
|
@@ -16,5 +16,21 @@ interface AvatarProps {
|
|
|
16
16
|
}
|
|
17
17
|
declare function AvatarBase({ src, fallback, fallbackText, size, status, style }: AvatarProps): React.JSX.Element;
|
|
18
18
|
declare const Avatar: React.MemoExoticComponent<typeof AvatarBase>;
|
|
19
|
+
interface AvatarGroupProps {
|
|
20
|
+
users: {
|
|
21
|
+
name: string;
|
|
22
|
+
src?: string;
|
|
23
|
+
}[];
|
|
24
|
+
/** Max avatars visible before +N overflow badge. Default 3. */
|
|
25
|
+
max?: number;
|
|
26
|
+
/** Avatar size preset. Default 'sm'. */
|
|
27
|
+
size?: AvatarSize;
|
|
28
|
+
/** Overlap between avatars in points. Default 8 (spacing.sm). */
|
|
29
|
+
overlap?: number;
|
|
30
|
+
/** Called when +N overflow badge is tapped. */
|
|
31
|
+
onOverflowPress?: () => void;
|
|
32
|
+
style?: ViewStyle;
|
|
33
|
+
}
|
|
34
|
+
declare function AvatarGroup({ users, max, size, overlap, onOverflowPress, style, }: AvatarGroupProps): React.JSX.Element;
|
|
19
35
|
|
|
20
|
-
export { Avatar, type AvatarProps, type AvatarSize };
|
|
36
|
+
export { Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, type AvatarSize };
|
package/dist/Avatar.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var React2 = require('react');
|
|
4
|
+
var expoImage = require('expo-image');
|
|
4
5
|
var reactNative = require('react-native');
|
|
5
6
|
var reactNativeSizeMatters = require('react-native-size-matters');
|
|
6
7
|
|
|
@@ -9,118 +10,7 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
|
9
10
|
var React2__default = /*#__PURE__*/_interopDefault(React2);
|
|
10
11
|
|
|
11
12
|
// src/components/Avatar/Avatar.tsx
|
|
12
|
-
|
|
13
|
-
// src/theme/colorUtils.ts
|
|
14
|
-
function hexToRgb(hex) {
|
|
15
|
-
const clean = hex.replace("#", "");
|
|
16
|
-
const full = clean.length === 3 ? clean.split("").map((c) => c + c).join("") : clean;
|
|
17
|
-
if (full.length !== 6) return null;
|
|
18
|
-
return {
|
|
19
|
-
r: parseInt(full.slice(0, 2), 16),
|
|
20
|
-
g: parseInt(full.slice(2, 4), 16),
|
|
21
|
-
b: parseInt(full.slice(4, 6), 16)
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
function componentToHex(c) {
|
|
25
|
-
return Math.round(Math.max(0, Math.min(255, c))).toString(16).padStart(2, "0");
|
|
26
|
-
}
|
|
27
|
-
function rgbToHex(r, g, b) {
|
|
28
|
-
return `#${componentToHex(r)}${componentToHex(g)}${componentToHex(b)}`;
|
|
29
|
-
}
|
|
30
|
-
function withAlphaOnWhite(hex, alpha) {
|
|
31
|
-
const rgb = hexToRgb(hex);
|
|
32
|
-
if (!rgb) return hex;
|
|
33
|
-
const r = rgb.r * alpha + 255 * (1 - alpha);
|
|
34
|
-
const g = rgb.g * alpha + 255 * (1 - alpha);
|
|
35
|
-
const b = rgb.b * alpha + 255 * (1 - alpha);
|
|
36
|
-
return rgbToHex(r, g, b);
|
|
37
|
-
}
|
|
38
|
-
function withAlphaOnDark(hex, alpha, bgHex = "#0f0f0f") {
|
|
39
|
-
const rgb = hexToRgb(hex);
|
|
40
|
-
const bg = hexToRgb(bgHex);
|
|
41
|
-
if (!rgb || !bg) return hex;
|
|
42
|
-
const r = rgb.r * alpha + bg.r * (1 - alpha);
|
|
43
|
-
const g = rgb.g * alpha + bg.g * (1 - alpha);
|
|
44
|
-
const b = rgb.b * alpha + bg.b * (1 - alpha);
|
|
45
|
-
return rgbToHex(r, g, b);
|
|
46
|
-
}
|
|
47
|
-
function mixWithBackground(fgHex, bgHex, opacity) {
|
|
48
|
-
const fg = hexToRgb(fgHex);
|
|
49
|
-
const bg = hexToRgb(bgHex);
|
|
50
|
-
if (!fg || !bg) return fgHex;
|
|
51
|
-
const r = fg.r * opacity + bg.r * (1 - opacity);
|
|
52
|
-
const g = fg.g * opacity + bg.g * (1 - opacity);
|
|
53
|
-
const b = fg.b * opacity + bg.b * (1 - opacity);
|
|
54
|
-
return rgbToHex(r, g, b);
|
|
55
|
-
}
|
|
56
|
-
function lighten(hex, amount) {
|
|
57
|
-
return withAlphaOnWhite(hex, 1 - amount);
|
|
58
|
-
}
|
|
59
|
-
function darken(hex, amount) {
|
|
60
|
-
const rgb = hexToRgb(hex);
|
|
61
|
-
if (!rgb) return hex;
|
|
62
|
-
return rgbToHex(rgb.r * (1 - amount), rgb.g * (1 - amount), rgb.b * (1 - amount));
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// src/theme/colors.ts
|
|
66
|
-
var defaultLight = {
|
|
67
|
-
background: "#ffffff",
|
|
68
|
-
foreground: "#1a1a1a",
|
|
69
|
-
card: "#ffffff",
|
|
70
|
-
primary: "#1a1a1a",
|
|
71
|
-
primaryForeground: "#ffffff",
|
|
72
|
-
// AUDIT FIX: brand accent — was undefined; falls back to primary when omitted
|
|
73
|
-
accent: "#d4561d",
|
|
74
|
-
accentForeground: "#ffffff",
|
|
75
|
-
border: "#dddddd",
|
|
76
|
-
// AUDIT FIX: was #e53935 (4.22:1 on white — fails AA); #c72828 = 5.59:1 ✓
|
|
77
|
-
destructive: "#c72828",
|
|
78
|
-
destructiveForeground: "#ffffff",
|
|
79
|
-
success: "#1a7a45",
|
|
80
|
-
successForeground: "#ffffff",
|
|
81
|
-
// AUDIT FIX: was #e67e00 (2.86:1 — severe fail); #9a5200 = 5.86:1 ✓ AAA-near
|
|
82
|
-
warning: "#9a5200",
|
|
83
|
-
warningForeground: "#ffffff"
|
|
84
|
-
};
|
|
85
|
-
function deriveColors(t, scheme) {
|
|
86
|
-
const dark = scheme === "dark";
|
|
87
|
-
const bg = t.background;
|
|
88
|
-
const foregroundSubtle = mixWithBackground(t.foreground, bg, 0.7);
|
|
89
|
-
const foregroundMuted = mixWithBackground(t.foreground, bg, 0.62);
|
|
90
|
-
const surface = dark ? lighten(bg, -0.06) : darken(bg, 0.04);
|
|
91
|
-
const surfaceStrong = dark ? lighten(bg, -0.12) : darken(bg, 0.08);
|
|
92
|
-
const destructiveTint = dark ? withAlphaOnDark(t.destructive, 0.15, bg) : withAlphaOnWhite(t.destructive, 0.08);
|
|
93
|
-
const destructiveBorder = dark ? withAlphaOnDark(t.destructive, 0.45, bg) : withAlphaOnWhite(t.destructive, 0.3);
|
|
94
|
-
const successTint = dark ? withAlphaOnDark(t.success, 0.15, bg) : withAlphaOnWhite(t.success, 0.08);
|
|
95
|
-
const successBorder = dark ? withAlphaOnDark(t.success, 0.45, bg) : withAlphaOnWhite(t.success, 0.3);
|
|
96
|
-
const warningTint = dark ? withAlphaOnDark(t.warning, 0.15, bg) : withAlphaOnWhite(t.warning, 0.08);
|
|
97
|
-
const warningBorder = dark ? withAlphaOnDark(t.warning, 0.45, bg) : withAlphaOnWhite(t.warning, 0.3);
|
|
98
|
-
return {
|
|
99
|
-
...t,
|
|
100
|
-
foregroundSubtle,
|
|
101
|
-
foregroundMuted,
|
|
102
|
-
surface,
|
|
103
|
-
surfaceStrong,
|
|
104
|
-
destructiveTint,
|
|
105
|
-
destructiveBorder,
|
|
106
|
-
successTint,
|
|
107
|
-
successBorder,
|
|
108
|
-
warningTint,
|
|
109
|
-
warningBorder,
|
|
110
|
-
overlay: t.overlay ?? "rgba(0,0,0,0.45)",
|
|
111
|
-
accentResolved: t.accent ?? t.primary,
|
|
112
|
-
accentForegroundResolved: t.accentForeground ?? t.primaryForeground,
|
|
113
|
-
ring: t.accent ?? t.primary,
|
|
114
|
-
input: t.border,
|
|
115
|
-
separator: dark ? lighten(t.border, 0.22) : darken(t.border, 0.16)
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// src/theme/ThemeProvider.tsx
|
|
120
|
-
var ThemeContext = React2.createContext({
|
|
121
|
-
colors: deriveColors(defaultLight, "light"),
|
|
122
|
-
colorScheme: "light"
|
|
123
|
-
});
|
|
13
|
+
var ThemeContext = React2.createContext(void 0);
|
|
124
14
|
function useTheme() {
|
|
125
15
|
const context = React2.useContext(ThemeContext);
|
|
126
16
|
if (!context) {
|
|
@@ -130,6 +20,7 @@ function useTheme() {
|
|
|
130
20
|
}
|
|
131
21
|
var isWeb = reactNative.Platform.OS === "web";
|
|
132
22
|
var s = isWeb ? (n) => n : reactNativeSizeMatters.scale;
|
|
23
|
+
var vs = isWeb ? (n) => n : reactNativeSizeMatters.verticalScale;
|
|
133
24
|
var ms = isWeb ? (n, _factor) => n : reactNativeSizeMatters.moderateScale;
|
|
134
25
|
|
|
135
26
|
// src/components/Avatar/Avatar.tsx
|
|
@@ -189,7 +80,7 @@ function AvatarBase({ src, fallback, fallbackText, size = "md", status, style })
|
|
|
189
80
|
accessibilityLabel: a11yLabel
|
|
190
81
|
},
|
|
191
82
|
/* @__PURE__ */ React2__default.default.createElement(reactNative.View, { style: [styles.base, containerStyle] }, !showFallback ? /* @__PURE__ */ React2__default.default.createElement(
|
|
192
|
-
|
|
83
|
+
expoImage.Image,
|
|
193
84
|
{
|
|
194
85
|
source: { uri: src },
|
|
195
86
|
style: { width: dimension, height: dimension },
|
|
@@ -222,6 +113,66 @@ function AvatarBase({ src, fallback, fallbackText, size = "md", status, style })
|
|
|
222
113
|
);
|
|
223
114
|
}
|
|
224
115
|
var Avatar = React2__default.default.memo(AvatarBase);
|
|
116
|
+
function AvatarGroup({
|
|
117
|
+
users,
|
|
118
|
+
max = 3,
|
|
119
|
+
size = "sm",
|
|
120
|
+
overlap = vs(8),
|
|
121
|
+
onOverflowPress,
|
|
122
|
+
style
|
|
123
|
+
}) {
|
|
124
|
+
const { colors } = useTheme();
|
|
125
|
+
const visible = users.slice(0, max);
|
|
126
|
+
const overflowCount = users.length - max;
|
|
127
|
+
const dimension = sizeMap[size];
|
|
128
|
+
return /* @__PURE__ */ React2__default.default.createElement(reactNative.View, { style: [styles.group, style], accessibilityLabel: `${users.length} avatares` }, visible.map((user, i) => /* @__PURE__ */ React2__default.default.createElement(
|
|
129
|
+
reactNative.View,
|
|
130
|
+
{
|
|
131
|
+
key: `${user.name}-${i}`,
|
|
132
|
+
style: [
|
|
133
|
+
styles.groupItem,
|
|
134
|
+
i > 0 && { marginLeft: -overlap },
|
|
135
|
+
{ zIndex: visible.length - i }
|
|
136
|
+
]
|
|
137
|
+
},
|
|
138
|
+
/* @__PURE__ */ React2__default.default.createElement(
|
|
139
|
+
Avatar,
|
|
140
|
+
{
|
|
141
|
+
src: user.src,
|
|
142
|
+
fallbackText: user.name,
|
|
143
|
+
size
|
|
144
|
+
}
|
|
145
|
+
)
|
|
146
|
+
)), overflowCount > 0 ? /* @__PURE__ */ React2__default.default.createElement(
|
|
147
|
+
reactNative.TouchableOpacity,
|
|
148
|
+
{
|
|
149
|
+
style: [
|
|
150
|
+
styles.overflowBadge,
|
|
151
|
+
{
|
|
152
|
+
width: dimension,
|
|
153
|
+
height: dimension,
|
|
154
|
+
borderRadius: dimension / 2,
|
|
155
|
+
backgroundColor: colors.surfaceStrong,
|
|
156
|
+
marginLeft: -overlap
|
|
157
|
+
}
|
|
158
|
+
],
|
|
159
|
+
onPress: onOverflowPress,
|
|
160
|
+
disabled: !onOverflowPress,
|
|
161
|
+
activeOpacity: 0.7,
|
|
162
|
+
accessibilityRole: "button",
|
|
163
|
+
accessibilityLabel: `${overflowCount} avatares m\xE1s`
|
|
164
|
+
},
|
|
165
|
+
/* @__PURE__ */ React2__default.default.createElement(
|
|
166
|
+
reactNative.Text,
|
|
167
|
+
{
|
|
168
|
+
style: [styles.overflowText, { color: colors.foregroundMuted }],
|
|
169
|
+
allowFontScaling: true
|
|
170
|
+
},
|
|
171
|
+
"+",
|
|
172
|
+
overflowCount
|
|
173
|
+
)
|
|
174
|
+
) : null);
|
|
175
|
+
}
|
|
225
176
|
var styles = reactNative.StyleSheet.create({
|
|
226
177
|
wrapper: {
|
|
227
178
|
alignSelf: "flex-start",
|
|
@@ -238,7 +189,23 @@ var styles = reactNative.StyleSheet.create({
|
|
|
238
189
|
position: "absolute",
|
|
239
190
|
bottom: 0,
|
|
240
191
|
right: 0
|
|
192
|
+
},
|
|
193
|
+
group: {
|
|
194
|
+
flexDirection: "row",
|
|
195
|
+
alignItems: "center"
|
|
196
|
+
},
|
|
197
|
+
groupItem: {
|
|
198
|
+
borderRadius: 999
|
|
199
|
+
},
|
|
200
|
+
overflowBadge: {
|
|
201
|
+
alignItems: "center",
|
|
202
|
+
justifyContent: "center"
|
|
203
|
+
},
|
|
204
|
+
overflowText: {
|
|
205
|
+
fontFamily: "Sohne-SemiBold",
|
|
206
|
+
fontSize: ms(11)
|
|
241
207
|
}
|
|
242
208
|
});
|
|
243
209
|
|
|
244
210
|
exports.Avatar = Avatar;
|
|
211
|
+
exports.AvatarGroup = AvatarGroup;
|
package/dist/Avatar.mjs
CHANGED