@retray-dev/ui-kit 7.0.1 → 9.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 +554 -11
- package/EXAMPLES.md +2 -2
- package/README.md +14 -8
- package/dist/Accordion.js +57 -5
- package/dist/Accordion.mjs +4 -3
- package/dist/AlertBanner.js +4 -1
- package/dist/AlertBanner.mjs +3 -2
- package/dist/AppHeader.d.mts +40 -0
- package/dist/AppHeader.d.ts +40 -0
- package/dist/AppHeader.js +515 -0
- package/dist/AppHeader.mjs +10 -0
- package/dist/Avatar.js +39 -29
- package/dist/Avatar.mjs +2 -1
- package/dist/Badge.js +11 -1
- package/dist/Badge.mjs +2 -1
- package/dist/Button.d.mts +8 -3
- package/dist/Button.d.ts +8 -3
- package/dist/Button.js +126 -108
- package/dist/Button.mjs +6 -5
- package/dist/ButtonGroup.mjs +1 -0
- package/dist/Card.js +90 -70
- package/dist/Card.mjs +5 -4
- package/dist/CategoryStrip.js +79 -22
- package/dist/CategoryStrip.mjs +6 -6
- package/dist/Checkbox.js +118 -86
- package/dist/Checkbox.mjs +5 -5
- package/dist/Chip.js +113 -80
- package/dist/Chip.mjs +5 -5
- package/dist/ConfirmDialog.js +140 -110
- package/dist/ConfirmDialog.mjs +7 -6
- package/dist/CurrencyDisplay.mjs +1 -0
- package/dist/CurrencyInput.d.mts +1 -1
- package/dist/CurrencyInput.d.ts +1 -1
- package/dist/CurrencyInput.js +9 -5
- package/dist/CurrencyInput.mjs +5 -4
- package/dist/DetailRow.mjs +1 -0
- package/dist/EmptyState.js +131 -111
- package/dist/EmptyState.mjs +7 -6
- package/dist/ErrorBoundary.d.mts +42 -0
- package/dist/ErrorBoundary.d.ts +42 -0
- package/dist/ErrorBoundary.js +351 -0
- package/dist/ErrorBoundary.mjs +7 -0
- package/dist/Form.mjs +1 -0
- package/dist/HolographicCard.d.mts +55 -0
- package/dist/HolographicCard.d.ts +55 -0
- package/dist/HolographicCard.js +316 -0
- package/dist/HolographicCard.mjs +191 -0
- package/dist/IconButton.d.mts +8 -3
- package/dist/IconButton.d.ts +8 -3
- package/dist/IconButton.js +115 -98
- package/dist/IconButton.mjs +5 -4
- package/dist/ImageViewer.d.mts +23 -0
- package/dist/ImageViewer.d.ts +23 -0
- package/dist/ImageViewer.js +582 -0
- package/dist/ImageViewer.mjs +8 -0
- package/dist/Input.mjs +4 -3
- package/dist/LabelValue.mjs +1 -0
- package/dist/ListGroup.mjs +1 -0
- package/dist/ListItem.js +131 -117
- package/dist/ListItem.mjs +6 -5
- package/dist/MediaCard.js +54 -6
- package/dist/MediaCard.mjs +6 -5
- package/dist/MenuGroup.mjs +1 -0
- package/dist/MenuItem.js +91 -79
- package/dist/MenuItem.mjs +6 -5
- package/dist/MonthPicker.d.mts +10 -2
- package/dist/MonthPicker.d.ts +10 -2
- package/dist/MonthPicker.js +80 -17
- package/dist/MonthPicker.mjs +3 -2
- package/dist/PagerDots.d.mts +35 -0
- package/dist/PagerDots.d.ts +35 -0
- package/dist/PagerDots.js +392 -0
- package/dist/PagerDots.mjs +7 -0
- package/dist/Pressable.d.mts +5 -5
- package/dist/Pressable.d.ts +5 -5
- package/dist/Pressable.js +97 -86
- package/dist/Pressable.mjs +5 -4
- package/dist/PricingCard.d.mts +50 -0
- package/dist/PricingCard.d.ts +50 -0
- package/dist/PricingCard.js +636 -0
- package/dist/PricingCard.mjs +11 -0
- package/dist/Progress.mjs +3 -2
- package/dist/RadioGroup.js +81 -30
- package/dist/RadioGroup.mjs +5 -5
- package/dist/RetrayProvider.d.mts +2 -0
- package/dist/RetrayProvider.d.ts +2 -0
- package/dist/RetrayProvider.js +214 -0
- package/dist/RetrayProvider.mjs +5 -0
- package/dist/Select.js +51 -4
- package/dist/Select.mjs +5 -4
- package/dist/SelectableGrid.d.mts +44 -0
- package/dist/SelectableGrid.d.ts +44 -0
- package/dist/SelectableGrid.js +448 -0
- package/dist/SelectableGrid.mjs +9 -0
- package/dist/Separator.mjs +1 -0
- package/dist/Sheet.d.mts +13 -1
- package/dist/Sheet.d.ts +13 -1
- package/dist/Sheet.js +115 -5
- package/dist/Sheet.mjs +4 -2
- package/dist/Skeleton.d.mts +50 -0
- package/dist/Skeleton.d.ts +50 -0
- package/dist/Skeleton.js +61 -0
- package/dist/Skeleton.mjs +4 -2
- package/dist/Slider.js +51 -4
- package/dist/Slider.mjs +3 -2
- package/dist/Spinner.js +28 -7
- package/dist/Spinner.mjs +2 -1
- package/dist/Switch.js +98 -48
- package/dist/Switch.mjs +4 -3
- package/dist/TabBar.d.mts +42 -0
- package/dist/TabBar.d.ts +42 -0
- package/dist/TabBar.js +361 -0
- package/dist/TabBar.mjs +6 -0
- package/dist/Tabs.js +92 -62
- package/dist/Tabs.mjs +5 -4
- package/dist/Text.js +16 -0
- package/dist/Text.mjs +2 -1
- package/dist/Textarea.mjs +4 -3
- package/dist/Toast.d.mts +7 -7
- package/dist/Toast.d.ts +7 -7
- package/dist/Toast.mjs +1 -0
- package/dist/Toggle.d.mts +6 -3
- package/dist/Toggle.d.ts +6 -3
- package/dist/Toggle.js +135 -120
- package/dist/Toggle.mjs +5 -5
- package/dist/VirtualList.mjs +1 -0
- package/dist/{chunk-7H2OR44A.mjs → chunk-26BCI223.mjs} +1 -1
- package/dist/{chunk-CRYBX2CM.mjs → chunk-2TFTAWVJ.mjs} +44 -59
- package/dist/chunk-3DKJ2GIC.mjs +30 -0
- package/dist/{chunk-KWCPOM6W.mjs → chunk-3U4SSNWP.mjs} +32 -48
- package/dist/chunk-4I7D47FH.mjs +139 -0
- package/dist/chunk-4K625MVM.mjs +142 -0
- package/dist/{chunk-MN7OG7IY.mjs → chunk-6OAZJ577.mjs} +6 -4
- package/dist/{chunk-L7E7TVEZ.mjs → chunk-756RAKE4.mjs} +2 -2
- package/dist/{chunk-HSPSMN6U.mjs → chunk-7QHVVCB3.mjs} +2 -2
- package/dist/{chunk-URLL5JBR.mjs → chunk-A3A6KNQN.mjs} +3 -3
- package/dist/chunk-AJ7ZDNBT.mjs +120 -0
- package/dist/{chunk-FTLJOUOQ.mjs → chunk-AV4EMIRH.mjs} +25 -28
- package/dist/chunk-AZJF2BLK.mjs +115 -0
- package/dist/chunk-BNP626TY.mjs +159 -0
- package/dist/{chunk-5IKW3VNC.mjs → chunk-DVK4G2GT.mjs} +17 -1
- package/dist/{chunk-6LQYY7HC.mjs → chunk-EH745HE5.mjs} +2 -2
- package/dist/chunk-EJ7ZPXOH.mjs +163 -0
- package/dist/{chunk-RKLHUDZS.mjs → chunk-GD6KXMG5.mjs} +29 -15
- package/dist/{chunk-RR2VQLKE.mjs → chunk-GQYFLP3D.mjs} +14 -17
- package/dist/{chunk-Y6MXOREN.mjs → chunk-ID72TK46.mjs} +8 -17
- package/dist/{chunk-NQGVLMWG.mjs → chunk-JMOZEC77.mjs} +1 -1
- package/dist/{chunk-GCWOGZYL.mjs → chunk-JT7HKXRB.mjs} +39 -29
- package/dist/{chunk-LWG526VX.mjs → chunk-KIHCWCWL.mjs} +47 -62
- package/dist/chunk-LXJIIOYQ.mjs +104 -0
- package/dist/{chunk-SBZYEV4S.mjs → chunk-M6ZXVBTK.mjs} +5 -2
- package/dist/{chunk-XDMN67KV.mjs → chunk-MAC465BB.mjs} +10 -8
- package/dist/chunk-MBMXYJJV.mjs +36 -0
- package/dist/chunk-MLF3EZFW.mjs +119 -0
- package/dist/chunk-NA7PARID.mjs +147 -0
- package/dist/{chunk-QXGYKWI7.mjs → chunk-O3HA6TYM.mjs} +9 -4
- package/dist/{chunk-63357L2X.mjs → chunk-OB4JUQ3O.mjs} +1 -1
- package/dist/{chunk-AU2VDY4P.mjs → chunk-PFZTM6D5.mjs} +52 -4
- package/dist/chunk-QKH5ZOD5.mjs +97 -0
- package/dist/{chunk-KZJRQOIU.mjs → chunk-TERDKCLE.mjs} +11 -1
- package/dist/{chunk-U4N7WF4Z.mjs → chunk-UREA2GYY.mjs} +28 -23
- package/dist/{chunk-TAJ2PQ2O.mjs → chunk-VGTDN7SW.mjs} +7 -6
- package/dist/{chunk-URDE3EUU.mjs → chunk-VQ57HWPL.mjs} +27 -15
- package/dist/chunk-WBOOUHSS.mjs +62 -0
- package/dist/{chunk-GNGLDL6Z.mjs → chunk-WJLKJMKR.mjs} +18 -0
- package/dist/{chunk-YZJAFS4P.mjs → chunk-X4G6APW6.mjs} +22 -19
- package/dist/chunk-Y6FXYEAI.mjs +8 -0
- package/dist/chunk-YFZ3ELX5.mjs +16 -0
- package/dist/{chunk-QCNARS3X.mjs → chunk-YNROWHQJ.mjs} +1 -1
- package/dist/chunk-Z4BVUWW6.mjs +196 -0
- package/dist/{chunk-GPOUINK5.mjs → chunk-ZJKGQMYH.mjs} +10 -27
- package/dist/index-wt-orHUi.d.mts +85 -0
- package/dist/index-wt-orHUi.d.ts +85 -0
- package/dist/index.d.mts +59 -51
- package/dist/index.d.ts +59 -51
- package/dist/index.js +1940 -744
- package/dist/index.mjs +49 -39
- package/package.json +35 -5
- package/src/components/Accordion/Accordion.tsx +12 -1
- package/src/components/AlertBanner/AlertBanner.tsx +5 -0
- package/src/components/AppHeader/AppHeader.tsx +172 -0
- package/src/components/AppHeader/index.ts +1 -0
- package/src/components/Avatar/Avatar.tsx +10 -2
- package/src/components/Badge/Badge.tsx +8 -1
- package/src/components/Button/Button.tsx +20 -27
- package/src/components/Card/Card.tsx +12 -23
- package/src/components/CategoryStrip/CategoryStrip.tsx +17 -21
- package/src/components/Checkbox/Checkbox.tsx +26 -40
- package/src/components/Chip/Chip.tsx +24 -33
- package/src/components/CurrencyInput/CurrencyInput.tsx +10 -8
- package/src/components/EmptyState/EmptyState.tsx +2 -1
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +153 -0
- package/src/components/ErrorBoundary/index.ts +1 -0
- package/src/components/HolographicCard/HolographicCard.tsx +315 -0
- package/src/components/HolographicCard/index.ts +1 -0
- package/src/components/IconButton/IconButton.tsx +19 -27
- package/src/components/ImageViewer/ImageViewer.tsx +290 -0
- package/src/components/ImageViewer/index.ts +1 -0
- package/src/components/ListItem/ListItem.tsx +70 -67
- package/src/components/MediaCard/MediaCard.tsx +8 -2
- package/src/components/MenuItem/MenuItem.tsx +10 -25
- package/src/components/MonthPicker/MonthPicker.tsx +39 -13
- package/src/components/MonthPicker/index.ts +1 -1
- package/src/components/PagerDots/PagerDots.tsx +200 -0
- package/src/components/PagerDots/index.ts +1 -0
- package/src/components/Pressable/Pressable.tsx +19 -35
- package/src/components/PricingCard/PricingCard.tsx +220 -0
- package/src/components/PricingCard/index.ts +1 -0
- package/src/components/RadioGroup/RadioGroup.tsx +14 -27
- package/src/components/RetrayProvider/RetrayProvider.tsx +59 -0
- package/src/components/RetrayProvider/index.ts +1 -0
- package/src/components/SelectableGrid/SelectableGrid.tsx +205 -0
- package/src/components/SelectableGrid/index.ts +1 -0
- package/src/components/Sheet/Sheet.tsx +65 -1
- package/src/components/Skeleton/Skeleton.tsx +142 -1
- package/src/components/Spinner/Spinner.tsx +17 -2
- package/src/components/Switch/Switch.tsx +30 -58
- package/src/components/TabBar/TabBar.tsx +169 -0
- package/src/components/TabBar/index.ts +1 -0
- package/src/components/Tabs/Tabs.tsx +23 -26
- package/src/components/Text/Text.tsx +2 -0
- package/src/components/Toggle/Toggle.tsx +35 -51
- package/src/fonts.ts +4 -1
- package/src/index.ts +23 -2
- package/src/utils/animations.ts +29 -1
- package/src/utils/fontGuard.ts +34 -0
- package/src/utils/haptics.ts +211 -9
- package/src/utils/pressable.ts +66 -0
- package/dist/chunk-76PFOSM2.mjs +0 -41
- package/dist/chunk-DITNP6PL.mjs +0 -106
- package/dist/chunk-JBLL7U3U.mjs +0 -64
- package/dist/chunk-LG4DO3DK.mjs +0 -174
- package/dist/chunk-RMMK64W5.mjs +0 -54
- package/dist/chunk-RTC3CFXF.mjs +0 -29
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { PRESS_SCALE, SPRINGS } from './chunk-5IKW3VNC.mjs';
|
|
1
|
+
import { usePressScale } from './chunk-YNROWHQJ.mjs';
|
|
2
|
+
import { selectionAsync } from './chunk-EJ7ZPXOH.mjs';
|
|
3
|
+
import { PRESS_SCALE, COLOR_TRANSITION, SPRING_ELASTIC } from './chunk-DVK4G2GT.mjs';
|
|
5
4
|
import { useTheme } from './chunk-SOYNZDVY.mjs';
|
|
6
5
|
import { mvs, ms, s, vs } from './chunk-2CE3TQVY.mjs';
|
|
7
|
-
import React
|
|
6
|
+
import React from 'react';
|
|
8
7
|
import { StyleSheet, View, TouchableOpacity, Text } from 'react-native';
|
|
9
|
-
import Animated
|
|
8
|
+
import Animated from 'react-native-reanimated';
|
|
9
|
+
import { EaseView } from 'react-native-ease';
|
|
10
10
|
|
|
11
11
|
function RadioItem({
|
|
12
12
|
option,
|
|
@@ -18,18 +18,6 @@ function RadioItem({
|
|
|
18
18
|
pressScale: PRESS_SCALE.button,
|
|
19
19
|
disabled: option.disabled
|
|
20
20
|
});
|
|
21
|
-
const colorProgress = useColorTransition(selected);
|
|
22
|
-
const dotScale = useSharedValue(selected ? 1 : 0);
|
|
23
|
-
useEffect(() => {
|
|
24
|
-
dotScale.value = withSpring(selected ? 1 : 0, SPRINGS.elastic);
|
|
25
|
-
}, [selected, dotScale]);
|
|
26
|
-
const radioStyle = useAnimatedStyle(() => ({
|
|
27
|
-
borderColor: interpolateColor(colorProgress.value, [0, 1], [colors.border, colors.primary])
|
|
28
|
-
}));
|
|
29
|
-
const dotStyle = useAnimatedStyle(() => ({
|
|
30
|
-
transform: [{ scale: dotScale.value }],
|
|
31
|
-
opacity: dotScale.value
|
|
32
|
-
}));
|
|
33
21
|
return (
|
|
34
22
|
// AUDIT FIX: opacity was applied only to the radio circle, leaving the label
|
|
35
23
|
// at full opacity when disabled. The whole row now dims uniformly so users
|
|
@@ -53,7 +41,22 @@ function RadioItem({
|
|
|
53
41
|
accessibilityLabel: option.label,
|
|
54
42
|
accessibilityState: { checked: selected, disabled: !!option.disabled }
|
|
55
43
|
},
|
|
56
|
-
/* @__PURE__ */ React.createElement(Animated.View, { style: scaleStyle }, /* @__PURE__ */ React.createElement(
|
|
44
|
+
/* @__PURE__ */ React.createElement(Animated.View, { style: scaleStyle }, /* @__PURE__ */ React.createElement(
|
|
45
|
+
EaseView,
|
|
46
|
+
{
|
|
47
|
+
style: styles.radio,
|
|
48
|
+
animate: { borderColor: selected ? colors.primary : colors.border },
|
|
49
|
+
transition: COLOR_TRANSITION
|
|
50
|
+
},
|
|
51
|
+
/* @__PURE__ */ React.createElement(
|
|
52
|
+
EaseView,
|
|
53
|
+
{
|
|
54
|
+
style: [styles.dot, { backgroundColor: colors.primary }],
|
|
55
|
+
animate: { scale: selected ? 1 : 0, opacity: selected ? 1 : 0 },
|
|
56
|
+
transition: SPRING_ELASTIC
|
|
57
|
+
}
|
|
58
|
+
)
|
|
59
|
+
)),
|
|
57
60
|
/* @__PURE__ */ React.createElement(
|
|
58
61
|
Text,
|
|
59
62
|
{
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
+
}) : x)(function(x) {
|
|
4
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
5
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
export { __require };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ToastProvider } from './chunk-2UYENBLV.mjs';
|
|
2
|
+
import { ThemeProvider } from './chunk-SOYNZDVY.mjs';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { StyleSheet } from 'react-native';
|
|
5
|
+
import { SafeAreaProvider, initialWindowMetrics } from 'react-native-safe-area-context';
|
|
6
|
+
import { GestureHandlerRootView } from 'react-native-gesture-handler';
|
|
7
|
+
import { BottomSheetModalProvider } from '@gorhom/bottom-sheet';
|
|
8
|
+
|
|
9
|
+
function RetrayProvider({ children, theme, colorScheme = "system" }) {
|
|
10
|
+
return /* @__PURE__ */ React.createElement(SafeAreaProvider, { initialMetrics: initialWindowMetrics }, /* @__PURE__ */ React.createElement(GestureHandlerRootView, { style: styles.root }, /* @__PURE__ */ React.createElement(ThemeProvider, { theme, colorScheme }, /* @__PURE__ */ React.createElement(BottomSheetModalProvider, null, /* @__PURE__ */ React.createElement(ToastProvider, null, children)))));
|
|
11
|
+
}
|
|
12
|
+
var styles = StyleSheet.create({
|
|
13
|
+
root: { flex: 1 }
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
export { RetrayProvider };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PRESS_SCALE, SPRINGS } from './chunk-
|
|
1
|
+
import { PRESS_SCALE, SPRINGS } from './chunk-DVK4G2GT.mjs';
|
|
2
2
|
import { useState, useCallback } from 'react';
|
|
3
3
|
import { Platform } from 'react-native';
|
|
4
4
|
import { useSharedValue, withSpring, useAnimatedStyle } from 'react-native-reanimated';
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { PagerDots } from './chunk-4K625MVM.mjs';
|
|
2
|
+
import { renderIcon } from './chunk-T7XZ7H7Y.mjs';
|
|
3
|
+
import { s, vs } from './chunk-2CE3TQVY.mjs';
|
|
4
|
+
import React, { useState, useCallback } from 'react';
|
|
5
|
+
import { StyleSheet, useWindowDimensions, Modal, ScrollView, TouchableOpacity, View } from 'react-native';
|
|
6
|
+
import { Gesture, GestureHandlerRootView, GestureDetector } from 'react-native-gesture-handler';
|
|
7
|
+
import Animated, { useSharedValue, runOnJS, withTiming, useAnimatedStyle } from 'react-native-reanimated';
|
|
8
|
+
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
9
|
+
|
|
10
|
+
var MAX_SCALE = 3;
|
|
11
|
+
var DOUBLE_TAP_SCALE = 2.5;
|
|
12
|
+
function ZoomableImage({ source, width, height, onZoomChange }) {
|
|
13
|
+
const scale = useSharedValue(1);
|
|
14
|
+
const savedScale = useSharedValue(1);
|
|
15
|
+
const translateX = useSharedValue(0);
|
|
16
|
+
const translateY = useSharedValue(0);
|
|
17
|
+
const savedX = useSharedValue(0);
|
|
18
|
+
const savedY = useSharedValue(0);
|
|
19
|
+
const reportZoom = useCallback((zoomed) => onZoomChange(zoomed), [onZoomChange]);
|
|
20
|
+
const reset = () => {
|
|
21
|
+
"worklet";
|
|
22
|
+
scale.value = withTiming(1);
|
|
23
|
+
savedScale.value = 1;
|
|
24
|
+
translateX.value = withTiming(0);
|
|
25
|
+
translateY.value = withTiming(0);
|
|
26
|
+
savedX.value = 0;
|
|
27
|
+
savedY.value = 0;
|
|
28
|
+
runOnJS(reportZoom)(false);
|
|
29
|
+
};
|
|
30
|
+
const pinch = Gesture.Pinch().onUpdate((e) => {
|
|
31
|
+
scale.value = Math.max(1, Math.min(savedScale.value * e.scale, MAX_SCALE));
|
|
32
|
+
}).onEnd(() => {
|
|
33
|
+
savedScale.value = scale.value;
|
|
34
|
+
if (scale.value <= 1) {
|
|
35
|
+
reset();
|
|
36
|
+
} else {
|
|
37
|
+
runOnJS(reportZoom)(true);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
const pan = Gesture.Pan().onUpdate((e) => {
|
|
41
|
+
if (scale.value <= 1) return;
|
|
42
|
+
translateX.value = savedX.value + e.translationX;
|
|
43
|
+
translateY.value = savedY.value + e.translationY;
|
|
44
|
+
}).onEnd(() => {
|
|
45
|
+
savedX.value = translateX.value;
|
|
46
|
+
savedY.value = translateY.value;
|
|
47
|
+
});
|
|
48
|
+
const doubleTap = Gesture.Tap().numberOfTaps(2).onEnd(() => {
|
|
49
|
+
if (scale.value > 1) {
|
|
50
|
+
reset();
|
|
51
|
+
} else {
|
|
52
|
+
scale.value = withTiming(DOUBLE_TAP_SCALE);
|
|
53
|
+
savedScale.value = DOUBLE_TAP_SCALE;
|
|
54
|
+
runOnJS(reportZoom)(true);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
const composed = Gesture.Exclusive(doubleTap, Gesture.Simultaneous(pinch, pan));
|
|
58
|
+
const animatedStyle = useAnimatedStyle(() => ({
|
|
59
|
+
transform: [
|
|
60
|
+
{ translateX: translateX.value },
|
|
61
|
+
{ translateY: translateY.value },
|
|
62
|
+
{ scale: scale.value }
|
|
63
|
+
]
|
|
64
|
+
}));
|
|
65
|
+
return /* @__PURE__ */ React.createElement(GestureDetector, { gesture: composed }, /* @__PURE__ */ React.createElement(Animated.View, { style: [{ width, height }, styles.imageWrap] }, /* @__PURE__ */ React.createElement(
|
|
66
|
+
Animated.Image,
|
|
67
|
+
{
|
|
68
|
+
source,
|
|
69
|
+
style: [{ width, height }, animatedStyle],
|
|
70
|
+
resizeMode: "contain"
|
|
71
|
+
}
|
|
72
|
+
)));
|
|
73
|
+
}
|
|
74
|
+
function ImageViewer({ images, visible, onClose, initialIndex = 0 }) {
|
|
75
|
+
const { width, height } = useWindowDimensions();
|
|
76
|
+
const insets = useSafeAreaInsets();
|
|
77
|
+
const [index, setIndex] = useState(initialIndex);
|
|
78
|
+
const [pagingEnabled, setPagingEnabled] = useState(true);
|
|
79
|
+
const scrollRef = React.useRef(null);
|
|
80
|
+
React.useEffect(() => {
|
|
81
|
+
if (!visible) return;
|
|
82
|
+
const handle = requestAnimationFrame(() => {
|
|
83
|
+
setIndex(initialIndex);
|
|
84
|
+
setPagingEnabled(true);
|
|
85
|
+
scrollRef.current?.scrollTo({ x: initialIndex * width, animated: false });
|
|
86
|
+
});
|
|
87
|
+
return () => cancelAnimationFrame(handle);
|
|
88
|
+
}, [visible, initialIndex, width]);
|
|
89
|
+
const dragY = useSharedValue(0);
|
|
90
|
+
const DISMISS_THRESHOLD = height * 0.18;
|
|
91
|
+
const closeViewer = useCallback(() => onClose(), [onClose]);
|
|
92
|
+
const swipeDown = Gesture.Pan().enabled(pagingEnabled).activeOffsetY(12).failOffsetX([-16, 16]).onUpdate((e) => {
|
|
93
|
+
dragY.value = Math.max(0, e.translationY);
|
|
94
|
+
}).onEnd((e) => {
|
|
95
|
+
if (e.translationY > DISMISS_THRESHOLD || e.velocityY > 800) {
|
|
96
|
+
runOnJS(closeViewer)();
|
|
97
|
+
} else {
|
|
98
|
+
dragY.value = withTiming(0);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
React.useEffect(() => {
|
|
102
|
+
if (visible) dragY.value = 0;
|
|
103
|
+
}, [visible, dragY]);
|
|
104
|
+
const dismissStyle = useAnimatedStyle(() => ({
|
|
105
|
+
transform: [{ translateY: dragY.value }]
|
|
106
|
+
}));
|
|
107
|
+
const backdropStyle = useAnimatedStyle(() => ({
|
|
108
|
+
opacity: 1 - Math.min(dragY.value / (height * 0.5), 0.85)
|
|
109
|
+
}));
|
|
110
|
+
const onMomentumEnd = (e) => {
|
|
111
|
+
const page = Math.round(e.nativeEvent.contentOffset.x / width);
|
|
112
|
+
setIndex(page);
|
|
113
|
+
};
|
|
114
|
+
const goTo = (page) => {
|
|
115
|
+
scrollRef.current?.scrollTo({ x: page * width, animated: true });
|
|
116
|
+
setIndex(page);
|
|
117
|
+
};
|
|
118
|
+
return /* @__PURE__ */ React.createElement(Modal, { visible, transparent: false, animationType: "fade", onRequestClose: onClose, statusBarTranslucent: true }, /* @__PURE__ */ React.createElement(GestureHandlerRootView, { style: styles.root }, /* @__PURE__ */ React.createElement(Animated.View, { style: [styles.backdrop, backdropStyle], pointerEvents: "none" }), /* @__PURE__ */ React.createElement(Animated.View, { style: [styles.container, dismissStyle] }, /* @__PURE__ */ React.createElement(GestureDetector, { gesture: swipeDown }, /* @__PURE__ */ React.createElement(Animated.View, { style: styles.root }, /* @__PURE__ */ React.createElement(
|
|
119
|
+
ScrollView,
|
|
120
|
+
{
|
|
121
|
+
ref: scrollRef,
|
|
122
|
+
horizontal: true,
|
|
123
|
+
pagingEnabled: true,
|
|
124
|
+
scrollEnabled: pagingEnabled,
|
|
125
|
+
showsHorizontalScrollIndicator: false,
|
|
126
|
+
onMomentumScrollEnd: onMomentumEnd,
|
|
127
|
+
bounces: false
|
|
128
|
+
},
|
|
129
|
+
images.map((source, i) => /* @__PURE__ */ React.createElement(
|
|
130
|
+
ZoomableImage,
|
|
131
|
+
{
|
|
132
|
+
key: i,
|
|
133
|
+
source,
|
|
134
|
+
width,
|
|
135
|
+
height,
|
|
136
|
+
onZoomChange: (zoomed) => setPagingEnabled(!zoomed)
|
|
137
|
+
}
|
|
138
|
+
))
|
|
139
|
+
))), /* @__PURE__ */ React.createElement(
|
|
140
|
+
TouchableOpacity,
|
|
141
|
+
{
|
|
142
|
+
style: [styles.closeButton, { top: insets.top + vs(8) }],
|
|
143
|
+
onPress: onClose,
|
|
144
|
+
activeOpacity: 0.7,
|
|
145
|
+
touchSoundDisabled: true,
|
|
146
|
+
accessibilityRole: "button",
|
|
147
|
+
accessibilityLabel: "Close",
|
|
148
|
+
hitSlop: { top: 12, bottom: 12, left: 12, right: 12 }
|
|
149
|
+
},
|
|
150
|
+
renderIcon("x", 26, "#fff")
|
|
151
|
+
), images.length > 1 ? /* @__PURE__ */ React.createElement(View, { style: [styles.dots, { bottom: insets.bottom + vs(16) }], pointerEvents: "box-none" }, /* @__PURE__ */ React.createElement(
|
|
152
|
+
PagerDots,
|
|
153
|
+
{
|
|
154
|
+
count: images.length,
|
|
155
|
+
activeIndex: index,
|
|
156
|
+
onDotPress: goTo,
|
|
157
|
+
activeColor: "#fff",
|
|
158
|
+
inactiveColor: "rgba(255,255,255,0.4)"
|
|
159
|
+
}
|
|
160
|
+
)) : null)));
|
|
161
|
+
}
|
|
162
|
+
var styles = StyleSheet.create({
|
|
163
|
+
root: {
|
|
164
|
+
flex: 1
|
|
165
|
+
},
|
|
166
|
+
container: {
|
|
167
|
+
flex: 1
|
|
168
|
+
},
|
|
169
|
+
backdrop: {
|
|
170
|
+
...StyleSheet.absoluteFillObject,
|
|
171
|
+
backgroundColor: "#000"
|
|
172
|
+
},
|
|
173
|
+
imageWrap: {
|
|
174
|
+
alignItems: "center",
|
|
175
|
+
justifyContent: "center",
|
|
176
|
+
overflow: "hidden"
|
|
177
|
+
},
|
|
178
|
+
closeButton: {
|
|
179
|
+
position: "absolute",
|
|
180
|
+
right: s(12),
|
|
181
|
+
width: s(40),
|
|
182
|
+
height: s(40),
|
|
183
|
+
borderRadius: s(20),
|
|
184
|
+
backgroundColor: "rgba(0,0,0,0.4)",
|
|
185
|
+
alignItems: "center",
|
|
186
|
+
justifyContent: "center"
|
|
187
|
+
},
|
|
188
|
+
dots: {
|
|
189
|
+
position: "absolute",
|
|
190
|
+
left: 0,
|
|
191
|
+
right: 0,
|
|
192
|
+
alignItems: "center"
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
export { ImageViewer };
|
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { selectionAsync } from './chunk-RTC3CFXF.mjs';
|
|
4
|
-
import { SPRINGS, PRESS_SCALE } from './chunk-5IKW3VNC.mjs';
|
|
1
|
+
import { PressableRow } from './chunk-3DKJ2GIC.mjs';
|
|
2
|
+
import { selectionAsync } from './chunk-EJ7ZPXOH.mjs';
|
|
5
3
|
import { RADIUS } from './chunk-QY3X2UYR.mjs';
|
|
4
|
+
import { renderIcon } from './chunk-T7XZ7H7Y.mjs';
|
|
6
5
|
import { useTheme } from './chunk-SOYNZDVY.mjs';
|
|
7
6
|
import { vs, ms, s } from './chunk-2CE3TQVY.mjs';
|
|
8
7
|
import React from 'react';
|
|
9
|
-
import { StyleSheet,
|
|
10
|
-
import Animated from 'react-native-reanimated';
|
|
8
|
+
import { StyleSheet, View, Text } from 'react-native';
|
|
11
9
|
import { Entypo } from '@expo/vector-icons';
|
|
12
10
|
|
|
13
11
|
function MenuItemBase({
|
|
@@ -27,12 +25,6 @@ function MenuItemBase({
|
|
|
27
25
|
accessibilityLabel
|
|
28
26
|
}) {
|
|
29
27
|
const { colors } = useTheme();
|
|
30
|
-
const { animatedStyle, onPressIn, onPressOut, hoverHandlers } = usePressScale({
|
|
31
|
-
pressScale: PRESS_SCALE.row,
|
|
32
|
-
pressInSpring: SPRINGS.surfacePressIn,
|
|
33
|
-
pressOutSpring: SPRINGS.surfacePressOut,
|
|
34
|
-
disabled
|
|
35
|
-
});
|
|
36
28
|
const handlePress = () => {
|
|
37
29
|
selectionAsync();
|
|
38
30
|
onPress();
|
|
@@ -50,16 +42,15 @@ function MenuItemBase({
|
|
|
50
42
|
elevation: 2
|
|
51
43
|
} : {};
|
|
52
44
|
const a11yLabel = accessibilityLabel ?? (subtitle ? `${label}. ${subtitle}` : label);
|
|
53
|
-
return /* @__PURE__ */ React.createElement(
|
|
54
|
-
|
|
45
|
+
return /* @__PURE__ */ React.createElement(View, { style: disabled && styles.disabled }, /* @__PURE__ */ React.createElement(
|
|
46
|
+
PressableRow,
|
|
55
47
|
{
|
|
56
48
|
style: [styles.container, cardStyle, style],
|
|
57
49
|
onPress: handlePress,
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
disabled,
|
|
61
|
-
activeOpacity: 1,
|
|
50
|
+
enabled: !disabled,
|
|
51
|
+
rippleColor: "transparent",
|
|
62
52
|
touchSoundDisabled: true,
|
|
53
|
+
activateOnHover: true,
|
|
63
54
|
accessibilityRole: "button",
|
|
64
55
|
accessibilityLabel: a11yLabel,
|
|
65
56
|
accessibilityState: { disabled }
|
|
@@ -92,15 +83,7 @@ function MenuItemBase({
|
|
|
92
83
|
},
|
|
93
84
|
rightRender
|
|
94
85
|
) : showChevron ? /* @__PURE__ */ React.createElement(Entypo, { name: "chevron-right", size: 18, color: colors.foregroundMuted }) : null
|
|
95
|
-
), showSeparator ? /* @__PURE__ */ React.createElement(
|
|
96
|
-
View,
|
|
97
|
-
{
|
|
98
|
-
style: [
|
|
99
|
-
styles.separator,
|
|
100
|
-
{ backgroundColor: colors.separator }
|
|
101
|
-
]
|
|
102
|
-
}
|
|
103
|
-
) : null);
|
|
86
|
+
), showSeparator ? /* @__PURE__ */ React.createElement(View, { style: [styles.separator, { backgroundColor: colors.separator }] }) : null);
|
|
104
87
|
}
|
|
105
88
|
var MenuItem = React.memo(MenuItemBase);
|
|
106
89
|
var styles = StyleSheet.create({
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
type ThemeColors = {
|
|
4
|
+
background: string;
|
|
5
|
+
foreground: string;
|
|
6
|
+
card: string;
|
|
7
|
+
primary: string;
|
|
8
|
+
primaryForeground: string;
|
|
9
|
+
border: string;
|
|
10
|
+
destructive: string;
|
|
11
|
+
destructiveForeground: string;
|
|
12
|
+
success: string;
|
|
13
|
+
successForeground: string;
|
|
14
|
+
warning: string;
|
|
15
|
+
warningForeground: string;
|
|
16
|
+
/** Backdrop/overlay color. Default: 'rgba(0,0,0,0.45)' */
|
|
17
|
+
overlay?: string;
|
|
18
|
+
/** Color accent (e.g. Airbnb coral). Default: same as primary */
|
|
19
|
+
accent?: string;
|
|
20
|
+
/** Text color on accent background. Default: same as primaryForeground */
|
|
21
|
+
accentForeground?: string;
|
|
22
|
+
};
|
|
23
|
+
type ResolvedColors = ThemeColors & {
|
|
24
|
+
foregroundSubtle: string;
|
|
25
|
+
foregroundMuted: string;
|
|
26
|
+
surface: string;
|
|
27
|
+
surfaceStrong: string;
|
|
28
|
+
destructiveTint: string;
|
|
29
|
+
destructiveBorder: string;
|
|
30
|
+
successTint: string;
|
|
31
|
+
successBorder: string;
|
|
32
|
+
warningTint: string;
|
|
33
|
+
warningBorder: string;
|
|
34
|
+
overlay: string;
|
|
35
|
+
accentResolved: string;
|
|
36
|
+
accentForegroundResolved: string;
|
|
37
|
+
ring: string;
|
|
38
|
+
input: string;
|
|
39
|
+
separator: string;
|
|
40
|
+
};
|
|
41
|
+
type Theme = {
|
|
42
|
+
light?: Partial<ThemeColors>;
|
|
43
|
+
dark?: Partial<ThemeColors>;
|
|
44
|
+
};
|
|
45
|
+
type ColorScheme = 'light' | 'dark' | 'system';
|
|
46
|
+
type ThemeContextValue = {
|
|
47
|
+
colors: ResolvedColors;
|
|
48
|
+
colorScheme: 'light' | 'dark';
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
interface RetrayProviderProps {
|
|
52
|
+
children: React.ReactNode;
|
|
53
|
+
/** Optional per-scheme token overrides — forwarded to `ThemeProvider`. */
|
|
54
|
+
theme?: Theme;
|
|
55
|
+
/**
|
|
56
|
+
* - `'system'` (default): auto-detects device setting.
|
|
57
|
+
* - `'light'` / `'dark'`: forces a specific scheme.
|
|
58
|
+
*/
|
|
59
|
+
colorScheme?: ColorScheme;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* All-in-one provider that wires every provider the UI kit needs, in the one
|
|
63
|
+
* correct order:
|
|
64
|
+
*
|
|
65
|
+
* `SafeAreaProvider` → `GestureHandlerRootView` → `ThemeProvider` →
|
|
66
|
+
* `BottomSheetModalProvider` → `ToastProvider`
|
|
67
|
+
*
|
|
68
|
+
* Use this at your app root instead of nesting the five providers by hand — it
|
|
69
|
+
* removes an entire class of provider-order bugs. The individual providers stay
|
|
70
|
+
* exported for consumers who need a custom tree.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* import { RetrayProvider } from '@retray-dev/ui-kit'
|
|
74
|
+
*
|
|
75
|
+
* export default function App() {
|
|
76
|
+
* return (
|
|
77
|
+
* <RetrayProvider colorScheme="system">
|
|
78
|
+
* <RootNavigator />
|
|
79
|
+
* </RetrayProvider>
|
|
80
|
+
* )
|
|
81
|
+
* }
|
|
82
|
+
*/
|
|
83
|
+
declare function RetrayProvider({ children, theme, colorScheme }: RetrayProviderProps): React.JSX.Element;
|
|
84
|
+
|
|
85
|
+
export { type ColorScheme as C, type ResolvedColors as R, type Theme as T, type ThemeContextValue as a, type ThemeColors as b, RetrayProvider as c, type RetrayProviderProps as d };
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
type ThemeColors = {
|
|
4
|
+
background: string;
|
|
5
|
+
foreground: string;
|
|
6
|
+
card: string;
|
|
7
|
+
primary: string;
|
|
8
|
+
primaryForeground: string;
|
|
9
|
+
border: string;
|
|
10
|
+
destructive: string;
|
|
11
|
+
destructiveForeground: string;
|
|
12
|
+
success: string;
|
|
13
|
+
successForeground: string;
|
|
14
|
+
warning: string;
|
|
15
|
+
warningForeground: string;
|
|
16
|
+
/** Backdrop/overlay color. Default: 'rgba(0,0,0,0.45)' */
|
|
17
|
+
overlay?: string;
|
|
18
|
+
/** Color accent (e.g. Airbnb coral). Default: same as primary */
|
|
19
|
+
accent?: string;
|
|
20
|
+
/** Text color on accent background. Default: same as primaryForeground */
|
|
21
|
+
accentForeground?: string;
|
|
22
|
+
};
|
|
23
|
+
type ResolvedColors = ThemeColors & {
|
|
24
|
+
foregroundSubtle: string;
|
|
25
|
+
foregroundMuted: string;
|
|
26
|
+
surface: string;
|
|
27
|
+
surfaceStrong: string;
|
|
28
|
+
destructiveTint: string;
|
|
29
|
+
destructiveBorder: string;
|
|
30
|
+
successTint: string;
|
|
31
|
+
successBorder: string;
|
|
32
|
+
warningTint: string;
|
|
33
|
+
warningBorder: string;
|
|
34
|
+
overlay: string;
|
|
35
|
+
accentResolved: string;
|
|
36
|
+
accentForegroundResolved: string;
|
|
37
|
+
ring: string;
|
|
38
|
+
input: string;
|
|
39
|
+
separator: string;
|
|
40
|
+
};
|
|
41
|
+
type Theme = {
|
|
42
|
+
light?: Partial<ThemeColors>;
|
|
43
|
+
dark?: Partial<ThemeColors>;
|
|
44
|
+
};
|
|
45
|
+
type ColorScheme = 'light' | 'dark' | 'system';
|
|
46
|
+
type ThemeContextValue = {
|
|
47
|
+
colors: ResolvedColors;
|
|
48
|
+
colorScheme: 'light' | 'dark';
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
interface RetrayProviderProps {
|
|
52
|
+
children: React.ReactNode;
|
|
53
|
+
/** Optional per-scheme token overrides — forwarded to `ThemeProvider`. */
|
|
54
|
+
theme?: Theme;
|
|
55
|
+
/**
|
|
56
|
+
* - `'system'` (default): auto-detects device setting.
|
|
57
|
+
* - `'light'` / `'dark'`: forces a specific scheme.
|
|
58
|
+
*/
|
|
59
|
+
colorScheme?: ColorScheme;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* All-in-one provider that wires every provider the UI kit needs, in the one
|
|
63
|
+
* correct order:
|
|
64
|
+
*
|
|
65
|
+
* `SafeAreaProvider` → `GestureHandlerRootView` → `ThemeProvider` →
|
|
66
|
+
* `BottomSheetModalProvider` → `ToastProvider`
|
|
67
|
+
*
|
|
68
|
+
* Use this at your app root instead of nesting the five providers by hand — it
|
|
69
|
+
* removes an entire class of provider-order bugs. The individual providers stay
|
|
70
|
+
* exported for consumers who need a custom tree.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* import { RetrayProvider } from '@retray-dev/ui-kit'
|
|
74
|
+
*
|
|
75
|
+
* export default function App() {
|
|
76
|
+
* return (
|
|
77
|
+
* <RetrayProvider colorScheme="system">
|
|
78
|
+
* <RootNavigator />
|
|
79
|
+
* </RetrayProvider>
|
|
80
|
+
* )
|
|
81
|
+
* }
|
|
82
|
+
*/
|
|
83
|
+
declare function RetrayProvider({ children, theme, colorScheme }: RetrayProviderProps): React.JSX.Element;
|
|
84
|
+
|
|
85
|
+
export { type ColorScheme as C, type ResolvedColors as R, type Theme as T, type ThemeContextValue as a, type ThemeColors as b, RetrayProvider as c, type RetrayProviderProps as d };
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import { T as Theme, C as ColorScheme, a as ThemeContextValue, b as ThemeColors, R as ResolvedColors } from './index-wt-orHUi.mjs';
|
|
3
|
+
export { c as RetrayProvider, d as RetrayProviderProps } from './index-wt-orHUi.mjs';
|
|
2
4
|
export { Button, ButtonProps, ButtonSize, ButtonVariant } from './Button.mjs';
|
|
3
5
|
export { ButtonGroup, ButtonGroupProps } from './ButtonGroup.mjs';
|
|
4
6
|
export { IconButton, IconButtonProps, IconButtonSize, IconButtonVariant } from './IconButton.mjs';
|
|
@@ -24,7 +26,7 @@ export { Slider, SliderProps } from './Slider.mjs';
|
|
|
24
26
|
export { Sheet, SheetProps } from './Sheet.mjs';
|
|
25
27
|
export { Select, SelectOption, SelectProps } from './Select.mjs';
|
|
26
28
|
export { ToastProvider, useToast } from './Toast.mjs';
|
|
27
|
-
export { CurrencyInput,
|
|
29
|
+
export { CurrencyInput, CurrencyInputProps } from './CurrencyInput.mjs';
|
|
28
30
|
export { CurrencyDisplay, CurrencyDisplayProps, CurrencyDisplayVariant } from './CurrencyDisplay.mjs';
|
|
29
31
|
export { ListItem, ListItemProps } from './ListItem.mjs';
|
|
30
32
|
export { ListGroup, ListGroupFooter, ListGroupFooterProps, ListGroupHeader, ListGroupHeaderProps, ListGroupProps, ListGroupVariant } from './ListGroup.mjs';
|
|
@@ -33,65 +35,24 @@ export { MenuGroup, MenuGroupFooter, MenuGroupFooterProps, MenuGroupHeader, Menu
|
|
|
33
35
|
export { Chip, ChipGroup, ChipGroupProps, ChipOption, ChipProps } from './Chip.mjs';
|
|
34
36
|
export { ConfirmDialog, ConfirmDialogProps } from './ConfirmDialog.mjs';
|
|
35
37
|
export { LabelValue, LabelValueProps } from './LabelValue.mjs';
|
|
36
|
-
export { MonthPicker, MonthPickerProps, MonthPickerValue } from './MonthPicker.mjs';
|
|
38
|
+
export { MonthPicker, MonthPickerProps, MonthPickerValue, dateToMonthPickerValue, monthPickerValueToDate } from './MonthPicker.mjs';
|
|
37
39
|
export { MediaCard, MediaCardAspectRatio, MediaCardProps } from './MediaCard.mjs';
|
|
38
40
|
export { CategoryItem, CategoryStrip, CategoryStripProps } from './CategoryStrip.mjs';
|
|
39
41
|
export { Pressable, PressableProps } from './Pressable.mjs';
|
|
40
42
|
export { DetailRow, DetailRowLabelWeight, DetailRowProps, DetailRowSeparator } from './DetailRow.mjs';
|
|
41
43
|
export { Form, FormField, FormFieldProps, FormFooter, FormFooterProps, FormProps, FormSection, FormSectionProps } from './Form.mjs';
|
|
42
44
|
export { VirtualList, VirtualListItem, VirtualListProps } from './VirtualList.mjs';
|
|
45
|
+
export { ErrorBoundary, ErrorBoundaryProps, ErrorFallbackProps } from './ErrorBoundary.mjs';
|
|
46
|
+
export { PagerDots, PagerDotsProps } from './PagerDots.mjs';
|
|
47
|
+
export { AppHeader, AppHeaderProps } from './AppHeader.mjs';
|
|
48
|
+
export { SelectableGrid, SelectableGridItem, SelectableGridProps } from './SelectableGrid.mjs';
|
|
49
|
+
export { PricingCard, PricingCardProps, PricingFeature } from './PricingCard.mjs';
|
|
50
|
+
export { TabBar, TabBarItem, TabBarProps } from './TabBar.mjs';
|
|
51
|
+
export { ImageViewer, ImageViewerProps } from './ImageViewer.mjs';
|
|
43
52
|
export { BottomSheetModalProvider, BottomSheetTextInput as SheetTextInput } from '@gorhom/bottom-sheet';
|
|
44
53
|
export { toast } from 'sonner-native';
|
|
45
54
|
import 'react-native';
|
|
46
55
|
|
|
47
|
-
type ThemeColors = {
|
|
48
|
-
background: string;
|
|
49
|
-
foreground: string;
|
|
50
|
-
card: string;
|
|
51
|
-
primary: string;
|
|
52
|
-
primaryForeground: string;
|
|
53
|
-
border: string;
|
|
54
|
-
destructive: string;
|
|
55
|
-
destructiveForeground: string;
|
|
56
|
-
success: string;
|
|
57
|
-
successForeground: string;
|
|
58
|
-
warning: string;
|
|
59
|
-
warningForeground: string;
|
|
60
|
-
/** Backdrop/overlay color. Default: 'rgba(0,0,0,0.45)' */
|
|
61
|
-
overlay?: string;
|
|
62
|
-
/** Color accent (e.g. Airbnb coral). Default: same as primary */
|
|
63
|
-
accent?: string;
|
|
64
|
-
/** Text color on accent background. Default: same as primaryForeground */
|
|
65
|
-
accentForeground?: string;
|
|
66
|
-
};
|
|
67
|
-
type ResolvedColors = ThemeColors & {
|
|
68
|
-
foregroundSubtle: string;
|
|
69
|
-
foregroundMuted: string;
|
|
70
|
-
surface: string;
|
|
71
|
-
surfaceStrong: string;
|
|
72
|
-
destructiveTint: string;
|
|
73
|
-
destructiveBorder: string;
|
|
74
|
-
successTint: string;
|
|
75
|
-
successBorder: string;
|
|
76
|
-
warningTint: string;
|
|
77
|
-
warningBorder: string;
|
|
78
|
-
overlay: string;
|
|
79
|
-
accentResolved: string;
|
|
80
|
-
accentForegroundResolved: string;
|
|
81
|
-
ring: string;
|
|
82
|
-
input: string;
|
|
83
|
-
separator: string;
|
|
84
|
-
};
|
|
85
|
-
type Theme = {
|
|
86
|
-
light?: Partial<ThemeColors>;
|
|
87
|
-
dark?: Partial<ThemeColors>;
|
|
88
|
-
};
|
|
89
|
-
type ColorScheme = 'light' | 'dark' | 'system';
|
|
90
|
-
type ThemeContextValue = {
|
|
91
|
-
colors: ResolvedColors;
|
|
92
|
-
colorScheme: 'light' | 'dark';
|
|
93
|
-
};
|
|
94
|
-
|
|
95
56
|
interface ThemeProviderProps {
|
|
96
57
|
children: React.ReactNode;
|
|
97
58
|
/**
|
|
@@ -150,6 +111,53 @@ declare function getResponsiveFontSize(text: string, maxSize: number, steps?: {
|
|
|
150
111
|
subtract: number;
|
|
151
112
|
}[]): number;
|
|
152
113
|
|
|
114
|
+
/**
|
|
115
|
+
* Light selection feedback — checkboxes, switches, toggles, pickers.
|
|
116
|
+
*/
|
|
117
|
+
declare function selectionAsync(): void;
|
|
118
|
+
/**
|
|
119
|
+
* Light impact — cards, surfaces, light interactions.
|
|
120
|
+
*/
|
|
121
|
+
declare function impactLight(): void;
|
|
122
|
+
/**
|
|
123
|
+
* Medium impact — buttons, primary actions.
|
|
124
|
+
*/
|
|
125
|
+
declare function impactMedium(): void;
|
|
126
|
+
/**
|
|
127
|
+
* Heavy impact — confirmations, important actions.
|
|
128
|
+
*/
|
|
129
|
+
declare function impactHeavy(): void;
|
|
130
|
+
/**
|
|
131
|
+
* Success notification — confirmations, completed actions.
|
|
132
|
+
*/
|
|
133
|
+
declare function notificationSuccess(): void;
|
|
134
|
+
/**
|
|
135
|
+
* Error notification — failed actions, errors.
|
|
136
|
+
*/
|
|
137
|
+
declare function notificationError(): void;
|
|
138
|
+
/**
|
|
139
|
+
* Warning notification — caution states.
|
|
140
|
+
*/
|
|
141
|
+
declare function notificationWarning(): void;
|
|
142
|
+
/**
|
|
143
|
+
* Rich haptic presets from Pulsar — enhanced feedback for special interactions.
|
|
144
|
+
* Falls back to basic expo-haptics on Expo Go or unsupported devices.
|
|
145
|
+
*/
|
|
146
|
+
declare const richHaptics: {
|
|
147
|
+
/** Hammer strike — strong confirmation feedback. */
|
|
148
|
+
hammer: () => void;
|
|
149
|
+
/** Pulse — rhythmic feedback for toggles or state changes. */
|
|
150
|
+
pulse: () => void;
|
|
151
|
+
/** Buzz — continuous vibration for attention. */
|
|
152
|
+
buzz: () => void;
|
|
153
|
+
/** Flick — crisp click feedback. */
|
|
154
|
+
flick: () => void;
|
|
155
|
+
/** Soft — gentle, subtle feedback. */
|
|
156
|
+
soft: () => void;
|
|
157
|
+
/** Rigid — firm, solid feedback. */
|
|
158
|
+
rigid: () => void;
|
|
159
|
+
};
|
|
160
|
+
|
|
153
161
|
declare const SPACING: {
|
|
154
162
|
readonly xxs: 2;
|
|
155
163
|
readonly xs: 4;
|
|
@@ -353,4 +361,4 @@ type RadiusKey = keyof Radius;
|
|
|
353
361
|
type Typography = typeof TYPOGRAPHY;
|
|
354
362
|
type TypographyKey = keyof Typography;
|
|
355
363
|
|
|
356
|
-
export { BREAKPOINTS,
|
|
364
|
+
export { BREAKPOINTS, ColorScheme, ICON_SIZES, Icon, type IconFamily, type IconProps, type IconSize, type IconSizeKey, RADIUS, type Radius, type RadiusKey, ResolvedColors, SHADOWS, SPACING, type Spacing, type SpacingKey, TYPOGRAPHY, Theme, ThemeColors, ThemeProvider, type ThemeProviderProps, type Typography, type TypographyKey, configureIconFamilies, defaultDark, defaultLight, deriveColors, getResponsiveFontSize, impactHeavy, impactLight, impactMedium, notificationError, notificationSuccess, notificationWarning, renderIcon, richHaptics, selectionAsync, useTheme };
|