@retray-dev/ui-kit 9.0.0 → 9.2.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 +178 -7
- package/CONSUMER.md +247 -0
- package/DESIGN.md +668 -0
- package/EXAMPLES.md +19 -12
- package/FONTS.md +107 -0
- package/README.md +3 -3
- package/dist/AlertBanner.d.mts +3 -1
- package/dist/AlertBanner.d.ts +3 -1
- package/dist/AlertBanner.js +18 -2
- package/dist/AlertBanner.mjs +1 -1
- package/dist/ConfirmDialog.d.mts +3 -1
- package/dist/ConfirmDialog.d.ts +3 -1
- package/dist/ConfirmDialog.js +3 -0
- package/dist/ConfirmDialog.mjs +1 -1
- package/dist/CurrencyInput.d.mts +3 -1
- package/dist/CurrencyInput.d.ts +3 -1
- package/dist/CurrencyInput.js +31 -4
- package/dist/CurrencyInput.mjs +2 -2
- package/dist/ImageUpload.d.mts +27 -0
- package/dist/ImageUpload.d.ts +27 -0
- package/dist/ImageUpload.js +399 -0
- package/dist/ImageUpload.mjs +9 -0
- package/dist/Input.d.mts +3 -1
- package/dist/Input.d.ts +3 -1
- package/dist/Input.js +27 -2
- package/dist/Input.mjs +1 -1
- package/dist/ListItem.d.mts +3 -1
- package/dist/ListItem.d.ts +3 -1
- package/dist/ListItem.js +2 -1
- package/dist/ListItem.mjs +1 -1
- package/dist/SheetSelect.d.mts +25 -0
- package/dist/SheetSelect.d.ts +25 -0
- package/dist/SheetSelect.js +440 -0
- package/dist/SheetSelect.mjs +9 -0
- package/dist/{chunk-M6ZXVBTK.mjs → chunk-6MKGPAR2.mjs} +21 -5
- package/dist/{chunk-7QHVVCB3.mjs → chunk-FZZLPJ6B.mjs} +3 -0
- package/dist/{chunk-MAC465BB.mjs → chunk-KNSENOV4.mjs} +5 -3
- package/dist/{chunk-756RAKE4.mjs → chunk-LVYEU5ZK.mjs} +27 -2
- package/dist/{chunk-BNP626TY.mjs → chunk-T4I5WVHA.mjs} +2 -1
- package/dist/chunk-URI2WBIV.mjs +147 -0
- package/dist/chunk-Y4GL2MHX.mjs +112 -0
- package/dist/index.d.mts +26 -1
- package/dist/index.d.ts +26 -1
- package/dist/index.js +327 -8
- package/dist/index.mjs +51 -12
- package/package.json +18 -5
- package/src/components/AlertBanner/AlertBanner.tsx +21 -3
- package/src/components/ConfirmDialog/ConfirmDialog.tsx +5 -0
- package/src/components/CurrencyInput/CurrencyInput.tsx +4 -0
- package/src/components/ImageUpload/ImageUpload.tsx +158 -0
- package/src/components/ImageUpload/index.ts +1 -0
- package/src/components/Input/Input.tsx +51 -23
- package/src/components/ListItem/ListItem.tsx +4 -1
- package/src/components/SheetSelect/SheetSelect.tsx +192 -0
- package/src/components/SheetSelect/index.ts +1 -0
- package/src/hooks/useConfirmDialog.ts +67 -0
- package/src/index.ts +6 -0
package/EXAMPLES.md
CHANGED
|
@@ -605,7 +605,7 @@ function SettingsScreen() {
|
|
|
605
605
|
title={name}
|
|
606
606
|
subtitle={email}
|
|
607
607
|
rightRender={<Badge label="Pro" variant="success" size="sm" />}
|
|
608
|
-
onPress={() => toast
|
|
608
|
+
onPress={() => toast({ title: 'Profile tapped' })}
|
|
609
609
|
/>
|
|
610
610
|
<ListItem
|
|
611
611
|
leftIcon="calendar"
|
|
@@ -634,18 +634,18 @@ function SettingsScreen() {
|
|
|
634
634
|
label="Personal Information"
|
|
635
635
|
subtitle="Name, email, phone"
|
|
636
636
|
iconName="user"
|
|
637
|
-
onPress={() => toast('Personal Info')}
|
|
637
|
+
onPress={() => toast({ title: 'Personal Info' })}
|
|
638
638
|
/>
|
|
639
639
|
<MenuItem
|
|
640
640
|
label="Security & Privacy"
|
|
641
641
|
iconName="shield"
|
|
642
|
-
onPress={() => toast('Security')}
|
|
642
|
+
onPress={() => toast({ title: 'Security' })}
|
|
643
643
|
/>
|
|
644
644
|
<MenuItem
|
|
645
645
|
label="Payments & Payouts"
|
|
646
646
|
iconName="credit-card"
|
|
647
647
|
rightRender={<Badge label="2" variant="warning" size="sm" />}
|
|
648
|
-
onPress={() => toast('Payments')}
|
|
648
|
+
onPress={() => toast({ title: 'Payments' })}
|
|
649
649
|
/>
|
|
650
650
|
</MenuGroup>
|
|
651
651
|
|
|
@@ -673,7 +673,7 @@ function SettingsScreen() {
|
|
|
673
673
|
label="Language"
|
|
674
674
|
iconName="globe"
|
|
675
675
|
rightRender={<Text color={colors.foregroundMuted}>English</Text>}
|
|
676
|
-
onPress={() => toast('Language')}
|
|
676
|
+
onPress={() => toast({ title: 'Language' })}
|
|
677
677
|
/>
|
|
678
678
|
</MenuGroup>
|
|
679
679
|
|
|
@@ -731,11 +731,11 @@ function SettingsScreen() {
|
|
|
731
731
|
<Button
|
|
732
732
|
label="Cancel"
|
|
733
733
|
variant="secondary"
|
|
734
|
-
onPress={() => toast('Cancelled')}
|
|
734
|
+
onPress={() => toast({ title: 'Cancelled' })}
|
|
735
735
|
/>
|
|
736
736
|
<Button
|
|
737
737
|
label="Save Changes"
|
|
738
|
-
onPress={() => toast
|
|
738
|
+
onPress={() => toast({ title: 'Profile updated', variant: 'success' })}
|
|
739
739
|
/>
|
|
740
740
|
</Form.Footer>
|
|
741
741
|
</Form>
|
|
@@ -751,17 +751,17 @@ function SettingsScreen() {
|
|
|
751
751
|
<MenuItem
|
|
752
752
|
label="Help Center"
|
|
753
753
|
iconName="help-circle"
|
|
754
|
-
onPress={() => toast('Help')}
|
|
754
|
+
onPress={() => toast({ title: 'Help' })}
|
|
755
755
|
/>
|
|
756
756
|
<MenuItem
|
|
757
757
|
label="Report an Issue"
|
|
758
758
|
iconName="alert-triangle"
|
|
759
|
-
onPress={() => toast('Report')}
|
|
759
|
+
onPress={() => toast({ title: 'Report' })}
|
|
760
760
|
/>
|
|
761
761
|
<MenuItem
|
|
762
762
|
label="Terms of Service"
|
|
763
763
|
iconName="file-text"
|
|
764
|
-
onPress={() => toast('Terms')}
|
|
764
|
+
onPress={() => toast({ title: 'Terms' })}
|
|
765
765
|
/>
|
|
766
766
|
</MenuGroup>
|
|
767
767
|
|
|
@@ -845,13 +845,20 @@ Standard 12px gap between fields:
|
|
|
845
845
|
|
|
846
846
|
### Toast Feedback
|
|
847
847
|
|
|
848
|
-
|
|
848
|
+
Two equivalent APIs — use whichever fits your context:
|
|
849
849
|
|
|
850
850
|
```tsx
|
|
851
|
+
// Option A: hook (good when you need toast inside a component)
|
|
851
852
|
const { toast } = useToast()
|
|
852
|
-
|
|
853
853
|
toast({ title: 'Action completed', variant: 'success' })
|
|
854
854
|
toast({ title: 'Error occurred', variant: 'destructive' })
|
|
855
|
+
|
|
856
|
+
// Option B: direct import (good for callbacks, utilities, outside components)
|
|
857
|
+
import { toast } from '@retray-dev/ui-kit'
|
|
858
|
+
toast.success('Action completed')
|
|
859
|
+
toast.error('Error occurred')
|
|
860
|
+
toast.warning('Slow connection')
|
|
861
|
+
toast('Neutral message')
|
|
855
862
|
```
|
|
856
863
|
|
|
857
864
|
### Button Pairs & Groups
|
package/FONTS.md
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Font Setup Guide
|
|
2
|
+
|
|
3
|
+
## Using Sohne Fonts in Your App
|
|
4
|
+
|
|
5
|
+
All components in `@retray-dev/ui-kit` use the **Sohne** font family. Consumer apps must load these fonts at the app root using `expo-font`.
|
|
6
|
+
|
|
7
|
+
### Installation
|
|
8
|
+
|
|
9
|
+
The library includes Sohne font files as raw `.otf` assets. Import and load them:
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
import { useFonts } from 'expo-font'
|
|
13
|
+
import { SohneFonts } from '@retray-dev/ui-kit/fonts'
|
|
14
|
+
|
|
15
|
+
export default function App() {
|
|
16
|
+
const [fontsLoaded] = useFonts(SohneFonts)
|
|
17
|
+
|
|
18
|
+
if (!fontsLoaded) {
|
|
19
|
+
return null // or <SplashScreen />
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
<ThemeProvider>
|
|
24
|
+
{/* your app */}
|
|
25
|
+
</ThemeProvider>
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### With Splash Screen
|
|
31
|
+
|
|
32
|
+
```tsx
|
|
33
|
+
import * as SplashScreen from 'expo-splash-screen'
|
|
34
|
+
import { useFonts } from 'expo-font'
|
|
35
|
+
import { SohneFonts } from '@retray-dev/ui-kit/fonts'
|
|
36
|
+
|
|
37
|
+
SplashScreen.preventAutoHideAsync()
|
|
38
|
+
|
|
39
|
+
export default function App() {
|
|
40
|
+
const [fontsLoaded] = useFonts(SohneFonts)
|
|
41
|
+
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
if (fontsLoaded) {
|
|
44
|
+
SplashScreen.hideAsync()
|
|
45
|
+
}
|
|
46
|
+
}, [fontsLoaded])
|
|
47
|
+
|
|
48
|
+
if (!fontsLoaded) {
|
|
49
|
+
return null
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return (
|
|
53
|
+
<ThemeProvider>
|
|
54
|
+
{/* your app */}
|
|
55
|
+
</ThemeProvider>
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Font Weights Included
|
|
61
|
+
|
|
62
|
+
`SohneFonts` exports 28 `.otf` files total.
|
|
63
|
+
|
|
64
|
+
**Sohne (14 files):**
|
|
65
|
+
- `Sohne-ExtraLight`
|
|
66
|
+
- `Sohne-ExtraLightItalic`
|
|
67
|
+
- `Sohne-Light`
|
|
68
|
+
- `Sohne-LightItalic`
|
|
69
|
+
- `Sohne-Regular`
|
|
70
|
+
- `Sohne-Italic`
|
|
71
|
+
- `Sohne-Medium`
|
|
72
|
+
- `Sohne-MediumItalic`
|
|
73
|
+
- `Sohne-SemiBold`
|
|
74
|
+
- `Sohne-SemiBoldItalic`
|
|
75
|
+
- `Sohne-Bold`
|
|
76
|
+
- `Sohne-BoldItalic`
|
|
77
|
+
- `Sohne-ExtraBold`
|
|
78
|
+
- `Sohne-ExtraBoldItalic`
|
|
79
|
+
|
|
80
|
+
**SohneMono (14 files):**
|
|
81
|
+
- `SohneMono-ExtraLight`
|
|
82
|
+
- `SohneMono-ExtraLightItalic`
|
|
83
|
+
- `SohneMono-Light`
|
|
84
|
+
- `SohneMono-LightItalic`
|
|
85
|
+
- `SohneMono-Regular`
|
|
86
|
+
- `SohneMono-Italic`
|
|
87
|
+
- `SohneMono-Medium`
|
|
88
|
+
- `SohneMono-MediumItalic`
|
|
89
|
+
- `SohneMono-SemiBold`
|
|
90
|
+
- `SohneMono-SemiBoldItalic`
|
|
91
|
+
- `SohneMono-Bold`
|
|
92
|
+
- `SohneMono-BoldItalic`
|
|
93
|
+
- `SohneMono-ExtraBold`
|
|
94
|
+
- `SohneMono-ExtraBoldItalic`
|
|
95
|
+
|
|
96
|
+
### How It Works
|
|
97
|
+
|
|
98
|
+
1. **Library components** reference fonts by family name (e.g., `fontFamily: 'Sohne-SemiBold'`)
|
|
99
|
+
2. **Consumer app** loads font files at startup via `useFonts(SohneFonts)`
|
|
100
|
+
3. **Metro bundler** resolves `require()` calls to `.otf` files in `node_modules/@retray-dev/ui-kit/src/assets/fonts/`
|
|
101
|
+
4. **React Native** maps family names to loaded font files
|
|
102
|
+
|
|
103
|
+
Font files ship as raw assets — **not bundled into `dist/`**. Metro handles asset resolution natively.
|
|
104
|
+
|
|
105
|
+
### Peer Dependency
|
|
106
|
+
|
|
107
|
+
`expo-font` ≥14.0.0 must be installed in the consuming app.
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
A personal React Native / Expo UI component library with a built-in design system, dark mode support, haptic feedback, and smooth animations.
|
|
4
4
|
|
|
5
|
-
-
|
|
5
|
+
- 51 components across 9 categories (plus the deep-import `HolographicCard`)
|
|
6
6
|
- Light/dark theme with 12 public tokens (25 resolved) and full customization
|
|
7
7
|
- Apple HIG–compliant touch targets and haptic feedback
|
|
8
8
|
- Animated interactions: spring press, sliding tabs, accordion easing, animated progress
|
|
@@ -23,7 +23,7 @@ pnpm add @retray-dev/ui-kit
|
|
|
23
23
|
Install these in your app if not already present:
|
|
24
24
|
|
|
25
25
|
```bash
|
|
26
|
-
pnpm add expo-font expo-haptics expo-linear-gradient react-native-safe-area-context @gorhom/bottom-sheet react-native-reanimated react-native-gesture-handler react-native-worklets @react-native-picker/picker @react-native-community/slider @expo/vector-icons react-native-size-matters react-native-svg react-native-screens sonner-native pressto
|
|
26
|
+
pnpm add expo-font expo-haptics expo-linear-gradient react-native-safe-area-context @gorhom/bottom-sheet react-native-reanimated react-native-gesture-handler react-native-worklets @react-native-picker/picker @react-native-community/slider @expo/vector-icons react-native-size-matters react-native-svg react-native-screens sonner-native pressto react-native-ease
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
For Expo projects, run `npx expo install` instead to get SDK-compatible versions.
|
|
@@ -146,7 +146,7 @@ import { SPACING, ICON_SIZES, RADIUS, SHADOWS, BREAKPOINTS, TYPOGRAPHY } from '@
|
|
|
146
146
|
| ----------- | ----------------------------------------------------------------------------------------------- |
|
|
147
147
|
| Display | `Text`, `Badge`, `Avatar`, `Separator`, `Spinner`, `Skeleton`, `Progress`, `CurrencyDisplay` |
|
|
148
148
|
| Surfaces | `Card`, `AlertBanner`, `EmptyState`, `MediaCard`, `PricingCard` |
|
|
149
|
-
| Form | `Form` (+ `Form.Field` / `Form.Section` / `Form.Footer`), `Button`, `ButtonGroup`, `IconButton`, `Input`, `CurrencyInput`, `Textarea`, `Checkbox`, `Switch`, `Toggle`, `RadioGroup`, `Select`, `Slider`, `SelectableGrid` |
|
|
149
|
+
| Form | `Form` (+ `Form.Field` / `Form.Section` / `Form.Footer`), `Button`, `ButtonGroup`, `IconButton`, `Input`, `CurrencyInput`, `Textarea`, `Checkbox`, `Switch`, `Toggle`, `RadioGroup`, `Select`, `Slider`, `SelectableGrid`, `SheetSelect`, `ImageUpload` |
|
|
150
150
|
| Composition | `Tabs`, `Accordion` |
|
|
151
151
|
| Navigation | `AppHeader`, `TabBar`, `PagerDots` |
|
|
152
152
|
| Overlays | `Sheet`, `ConfirmDialog`, `ImageViewer` |
|
package/dist/AlertBanner.d.mts
CHANGED
|
@@ -9,8 +9,10 @@ interface AlertBannerProps {
|
|
|
9
9
|
icon?: React.ReactNode;
|
|
10
10
|
iconName?: string;
|
|
11
11
|
iconColor?: string;
|
|
12
|
+
/** Called when the user taps the dismiss (×) button. If omitted, no button is shown. */
|
|
13
|
+
onDismiss?: () => void;
|
|
12
14
|
style?: ViewStyle;
|
|
13
15
|
}
|
|
14
|
-
declare function AlertBanner({ title, description, variant, icon, iconName, iconColor, style }: AlertBannerProps): React.JSX.Element;
|
|
16
|
+
declare function AlertBanner({ title, description, variant, icon, iconName, iconColor, onDismiss, style }: AlertBannerProps): React.JSX.Element;
|
|
15
17
|
|
|
16
18
|
export { AlertBanner, type AlertBannerProps, type AlertBannerVariant };
|
package/dist/AlertBanner.d.ts
CHANGED
|
@@ -9,8 +9,10 @@ interface AlertBannerProps {
|
|
|
9
9
|
icon?: React.ReactNode;
|
|
10
10
|
iconName?: string;
|
|
11
11
|
iconColor?: string;
|
|
12
|
+
/** Called when the user taps the dismiss (×) button. If omitted, no button is shown. */
|
|
13
|
+
onDismiss?: () => void;
|
|
12
14
|
style?: ViewStyle;
|
|
13
15
|
}
|
|
14
|
-
declare function AlertBanner({ title, description, variant, icon, iconName, iconColor, style }: AlertBannerProps): React.JSX.Element;
|
|
16
|
+
declare function AlertBanner({ title, description, variant, icon, iconName, iconColor, onDismiss, style }: AlertBannerProps): React.JSX.Element;
|
|
15
17
|
|
|
16
18
|
export { AlertBanner, type AlertBannerProps, type AlertBannerVariant };
|
package/dist/AlertBanner.js
CHANGED
|
@@ -192,7 +192,7 @@ var RADIUS = {
|
|
|
192
192
|
lg: 20};
|
|
193
193
|
|
|
194
194
|
// src/components/AlertBanner/AlertBanner.tsx
|
|
195
|
-
function AlertBanner({ title, description, variant = "default", icon, iconName, iconColor, style }) {
|
|
195
|
+
function AlertBanner({ title, description, variant = "default", icon, iconName, iconColor, onDismiss, style }) {
|
|
196
196
|
const { colors, colorScheme } = useTheme();
|
|
197
197
|
const isDark = colorScheme === "dark";
|
|
198
198
|
const accentColor = variant === "destructive" ? colors.destructive : variant === "success" ? colors.success : variant === "warning" ? colors.warning : colors.foreground;
|
|
@@ -218,7 +218,18 @@ function AlertBanner({ title, description, variant = "default", icon, iconName,
|
|
|
218
218
|
accessibilityLabel: a11yLabel
|
|
219
219
|
},
|
|
220
220
|
/* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles.iconSlot }, effectiveIcon),
|
|
221
|
-
/* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles.content }, /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.title, { color: colors.foreground }], allowFontScaling: true }, title), description ? /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.description, { color: colors.foreground, opacity: 0.85 }], allowFontScaling: true }, description) : null)
|
|
221
|
+
/* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles.content }, /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.title, { color: colors.foreground }], allowFontScaling: true }, title), description ? /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.description, { color: colors.foreground, opacity: 0.85 }], allowFontScaling: true }, description) : null),
|
|
222
|
+
onDismiss ? /* @__PURE__ */ React3__default.default.createElement(
|
|
223
|
+
reactNative.TouchableOpacity,
|
|
224
|
+
{
|
|
225
|
+
onPress: onDismiss,
|
|
226
|
+
style: styles.dismissButton,
|
|
227
|
+
activeOpacity: 0.6,
|
|
228
|
+
accessibilityRole: "button",
|
|
229
|
+
accessibilityLabel: "Dismiss"
|
|
230
|
+
},
|
|
231
|
+
/* @__PURE__ */ React3__default.default.createElement(vectorIcons.Feather, { name: "x", size: ms(16), color: colors.foregroundMuted })
|
|
232
|
+
) : null
|
|
222
233
|
);
|
|
223
234
|
}
|
|
224
235
|
var styles = reactNative.StyleSheet.create({
|
|
@@ -244,6 +255,11 @@ var styles = reactNative.StyleSheet.create({
|
|
|
244
255
|
description: {
|
|
245
256
|
fontFamily: "Sohne-Regular",
|
|
246
257
|
fontSize: ms(12)
|
|
258
|
+
},
|
|
259
|
+
dismissButton: {
|
|
260
|
+
padding: s(4),
|
|
261
|
+
marginTop: vs(-2),
|
|
262
|
+
marginRight: -s(4)
|
|
247
263
|
}
|
|
248
264
|
});
|
|
249
265
|
|
package/dist/AlertBanner.mjs
CHANGED
package/dist/ConfirmDialog.d.mts
CHANGED
|
@@ -7,9 +7,11 @@ interface ConfirmDialogProps {
|
|
|
7
7
|
confirmLabel?: string;
|
|
8
8
|
cancelLabel?: string;
|
|
9
9
|
confirmVariant?: 'primary' | 'destructive';
|
|
10
|
+
/** Show a loading spinner in the confirm button (e.g. while async action completes). */
|
|
11
|
+
loading?: boolean;
|
|
10
12
|
onConfirm: () => void;
|
|
11
13
|
onCancel: () => void;
|
|
12
14
|
}
|
|
13
|
-
declare function ConfirmDialog({ visible, title, description, confirmLabel, cancelLabel, confirmVariant, onConfirm, onCancel, }: ConfirmDialogProps): React.JSX.Element;
|
|
15
|
+
declare function ConfirmDialog({ visible, title, description, confirmLabel, cancelLabel, confirmVariant, loading, onConfirm, onCancel, }: ConfirmDialogProps): React.JSX.Element;
|
|
14
16
|
|
|
15
17
|
export { ConfirmDialog, type ConfirmDialogProps };
|
package/dist/ConfirmDialog.d.ts
CHANGED
|
@@ -7,9 +7,11 @@ interface ConfirmDialogProps {
|
|
|
7
7
|
confirmLabel?: string;
|
|
8
8
|
cancelLabel?: string;
|
|
9
9
|
confirmVariant?: 'primary' | 'destructive';
|
|
10
|
+
/** Show a loading spinner in the confirm button (e.g. while async action completes). */
|
|
11
|
+
loading?: boolean;
|
|
10
12
|
onConfirm: () => void;
|
|
11
13
|
onCancel: () => void;
|
|
12
14
|
}
|
|
13
|
-
declare function ConfirmDialog({ visible, title, description, confirmLabel, cancelLabel, confirmVariant, onConfirm, onCancel, }: ConfirmDialogProps): React.JSX.Element;
|
|
15
|
+
declare function ConfirmDialog({ visible, title, description, confirmLabel, cancelLabel, confirmVariant, loading, onConfirm, onCancel, }: ConfirmDialogProps): React.JSX.Element;
|
|
14
16
|
|
|
15
17
|
export { ConfirmDialog, type ConfirmDialogProps };
|
package/dist/ConfirmDialog.js
CHANGED
|
@@ -459,6 +459,7 @@ function ConfirmDialog({
|
|
|
459
459
|
confirmLabel = "Confirm",
|
|
460
460
|
cancelLabel = "Cancel",
|
|
461
461
|
confirmVariant = "primary",
|
|
462
|
+
loading = false,
|
|
462
463
|
onConfirm,
|
|
463
464
|
onCancel
|
|
464
465
|
}) {
|
|
@@ -498,6 +499,8 @@ function ConfirmDialog({
|
|
|
498
499
|
label: confirmLabel,
|
|
499
500
|
variant: confirmVariant,
|
|
500
501
|
fullWidth: true,
|
|
502
|
+
loading,
|
|
503
|
+
disabled: loading,
|
|
501
504
|
onPress: () => {
|
|
502
505
|
notificationSuccess();
|
|
503
506
|
onConfirm();
|
package/dist/ConfirmDialog.mjs
CHANGED
package/dist/CurrencyInput.d.mts
CHANGED
|
@@ -20,7 +20,9 @@ interface CurrencyInputProps {
|
|
|
20
20
|
editable?: boolean;
|
|
21
21
|
containerStyle?: ViewStyle;
|
|
22
22
|
style?: TextStyle;
|
|
23
|
+
/** Use inside a Sheet/BottomSheet — passes sheetMode to the underlying Input. */
|
|
24
|
+
sheetMode?: boolean;
|
|
23
25
|
}
|
|
24
|
-
declare function CurrencyInput({ value, onChangeText, onChangeValue, prefix, thousandsSeparator, size, label, error, hint, placeholder, editable, containerStyle, style, }: CurrencyInputProps): React.JSX.Element;
|
|
26
|
+
declare function CurrencyInput({ value, onChangeText, onChangeValue, prefix, thousandsSeparator, size, label, error, hint, placeholder, editable, containerStyle, style, sheetMode, }: CurrencyInputProps): React.JSX.Element;
|
|
25
27
|
|
|
26
28
|
export { CurrencyInput, type CurrencyInputProps };
|
package/dist/CurrencyInput.d.ts
CHANGED
|
@@ -20,7 +20,9 @@ interface CurrencyInputProps {
|
|
|
20
20
|
editable?: boolean;
|
|
21
21
|
containerStyle?: ViewStyle;
|
|
22
22
|
style?: TextStyle;
|
|
23
|
+
/** Use inside a Sheet/BottomSheet — passes sheetMode to the underlying Input. */
|
|
24
|
+
sheetMode?: boolean;
|
|
23
25
|
}
|
|
24
|
-
declare function CurrencyInput({ value, onChangeText, onChangeValue, prefix, thousandsSeparator, size, label, error, hint, placeholder, editable, containerStyle, style, }: CurrencyInputProps): React.JSX.Element;
|
|
26
|
+
declare function CurrencyInput({ value, onChangeText, onChangeValue, prefix, thousandsSeparator, size, label, error, hint, placeholder, editable, containerStyle, style, sheetMode, }: CurrencyInputProps): React.JSX.Element;
|
|
25
27
|
|
|
26
28
|
export { CurrencyInput, type CurrencyInputProps };
|
package/dist/CurrencyInput.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var React3 = require('react');
|
|
4
4
|
var reactNative = require('react-native');
|
|
5
|
+
var bottomSheet = require('@gorhom/bottom-sheet');
|
|
5
6
|
var Animated = require('react-native-reanimated');
|
|
6
7
|
var vectorIcons = require('@expo/vector-icons');
|
|
7
8
|
var reactNativeSizeMatters = require('react-native-size-matters');
|
|
@@ -215,7 +216,7 @@ function useColorTransition(active, options = {}) {
|
|
|
215
216
|
|
|
216
217
|
// src/components/Input/Input.tsx
|
|
217
218
|
var webInputResetStyle = reactNative.Platform.OS === "web" ? { outlineStyle: "none", outlineWidth: 0, outlineColor: "transparent", boxShadow: "none" } : {};
|
|
218
|
-
function Input({ label, error, hint, disabled, prefix, suffix, prefixStyle, suffixStyle, prefixIcon, suffixIcon, prefixIconColor, suffixIconColor, type = "text", containerStyle, inputWrapperStyle, style, onFocus, onBlur, secureTextEntry, editable, accessibilityLabel, ...props }) {
|
|
219
|
+
function Input({ label, error, hint, disabled, prefix, suffix, prefixStyle, suffixStyle, prefixIcon, suffixIcon, prefixIconColor, suffixIconColor, type = "text", containerStyle, inputWrapperStyle, sheetMode = false, style, onFocus, onBlur, secureTextEntry, editable, accessibilityLabel, ...props }) {
|
|
219
220
|
const { colors } = useTheme();
|
|
220
221
|
const [focused, setFocused] = React3.useState(false);
|
|
221
222
|
const [showPassword, setShowPassword] = React3.useState(false);
|
|
@@ -252,7 +253,31 @@ function Input({ label, error, hint, disabled, prefix, suffix, prefixStyle, suff
|
|
|
252
253
|
},
|
|
253
254
|
/* @__PURE__ */ React3__default.default.createElement(Animated__default.default.View, { style: [styles.borderOverlay, borderAnimStyle], pointerEvents: "none" }),
|
|
254
255
|
effectivePrefix ? typeof effectivePrefix === "string" ? /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.prefixText, { color: colors.foregroundMuted }, prefixStyle], allowFontScaling: true }, effectivePrefix) : /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles.prefixContainer }, effectivePrefix) : null,
|
|
255
|
-
/* @__PURE__ */ React3__default.default.createElement(
|
|
256
|
+
sheetMode ? /* @__PURE__ */ React3__default.default.createElement(
|
|
257
|
+
bottomSheet.BottomSheetTextInput,
|
|
258
|
+
{
|
|
259
|
+
style: [
|
|
260
|
+
styles.input,
|
|
261
|
+
{ color: colors.foreground },
|
|
262
|
+
webInputResetStyle,
|
|
263
|
+
style
|
|
264
|
+
],
|
|
265
|
+
onFocus: (e) => {
|
|
266
|
+
setFocused(true);
|
|
267
|
+
onFocus?.(e);
|
|
268
|
+
},
|
|
269
|
+
onBlur: (e) => {
|
|
270
|
+
setFocused(false);
|
|
271
|
+
onBlur?.(e);
|
|
272
|
+
},
|
|
273
|
+
placeholderTextColor: colors.foregroundMuted,
|
|
274
|
+
allowFontScaling: true,
|
|
275
|
+
secureTextEntry: effectiveSecure,
|
|
276
|
+
editable: isDisabled ? false : editable,
|
|
277
|
+
accessibilityLabel: accessibilityLabel ?? label,
|
|
278
|
+
...props
|
|
279
|
+
}
|
|
280
|
+
) : /* @__PURE__ */ React3__default.default.createElement(
|
|
256
281
|
reactNative.TextInput,
|
|
257
282
|
{
|
|
258
283
|
style: [
|
|
@@ -367,7 +392,8 @@ function CurrencyInput({
|
|
|
367
392
|
placeholder,
|
|
368
393
|
editable,
|
|
369
394
|
containerStyle,
|
|
370
|
-
style
|
|
395
|
+
style,
|
|
396
|
+
sheetMode
|
|
371
397
|
}) {
|
|
372
398
|
const handleChange = (text) => {
|
|
373
399
|
const withoutPrefix = prefix && text.startsWith(prefix) ? text.slice(prefix.length) : text;
|
|
@@ -400,7 +426,8 @@ function CurrencyInput({
|
|
|
400
426
|
prefixStyle,
|
|
401
427
|
containerStyle,
|
|
402
428
|
inputWrapperStyle: isLarge ? { paddingVertical: vs(16), minHeight: 72 } : void 0,
|
|
403
|
-
style: [inputStyle, style]
|
|
429
|
+
style: [inputStyle, style],
|
|
430
|
+
sheetMode
|
|
404
431
|
}
|
|
405
432
|
);
|
|
406
433
|
}
|
package/dist/CurrencyInput.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { CurrencyInput } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { CurrencyInput } from './chunk-KNSENOV4.mjs';
|
|
2
|
+
import './chunk-LVYEU5ZK.mjs';
|
|
3
3
|
import './chunk-26BCI223.mjs';
|
|
4
4
|
import './chunk-DVK4G2GT.mjs';
|
|
5
5
|
import './chunk-T7XZ7H7Y.mjs';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ViewStyle } from 'react-native';
|
|
3
|
+
|
|
4
|
+
interface ImageUploadProps {
|
|
5
|
+
/** Current image URI. Pass null/undefined to show placeholder. */
|
|
6
|
+
value?: string | null;
|
|
7
|
+
/** Called with the selected image URI. Receives null when image is cleared. */
|
|
8
|
+
onChange?: (uri: string | null) => void;
|
|
9
|
+
/** Show a loading spinner over the image (e.g. while uploading). */
|
|
10
|
+
loading?: boolean;
|
|
11
|
+
/** Text shown when no image is selected. */
|
|
12
|
+
placeholder?: string;
|
|
13
|
+
/** Width of the upload area. Defaults to full width (undefined). */
|
|
14
|
+
width?: number;
|
|
15
|
+
/** Height of the upload area. Defaults to 200. */
|
|
16
|
+
height?: number;
|
|
17
|
+
/** Border radius of the upload area. Defaults to RADIUS.lg. */
|
|
18
|
+
borderRadius?: number;
|
|
19
|
+
/** Aspect ratio for the selected image. Defaults to 'cover'. */
|
|
20
|
+
resizeMode?: 'cover' | 'contain' | 'stretch';
|
|
21
|
+
disabled?: boolean;
|
|
22
|
+
style?: ViewStyle;
|
|
23
|
+
accessibilityLabel?: string;
|
|
24
|
+
}
|
|
25
|
+
declare function ImageUpload({ value, onChange, loading, placeholder, width, height, borderRadius, resizeMode, disabled, style, accessibilityLabel, }: ImageUploadProps): React.JSX.Element;
|
|
26
|
+
|
|
27
|
+
export { ImageUpload, type ImageUploadProps };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ViewStyle } from 'react-native';
|
|
3
|
+
|
|
4
|
+
interface ImageUploadProps {
|
|
5
|
+
/** Current image URI. Pass null/undefined to show placeholder. */
|
|
6
|
+
value?: string | null;
|
|
7
|
+
/** Called with the selected image URI. Receives null when image is cleared. */
|
|
8
|
+
onChange?: (uri: string | null) => void;
|
|
9
|
+
/** Show a loading spinner over the image (e.g. while uploading). */
|
|
10
|
+
loading?: boolean;
|
|
11
|
+
/** Text shown when no image is selected. */
|
|
12
|
+
placeholder?: string;
|
|
13
|
+
/** Width of the upload area. Defaults to full width (undefined). */
|
|
14
|
+
width?: number;
|
|
15
|
+
/** Height of the upload area. Defaults to 200. */
|
|
16
|
+
height?: number;
|
|
17
|
+
/** Border radius of the upload area. Defaults to RADIUS.lg. */
|
|
18
|
+
borderRadius?: number;
|
|
19
|
+
/** Aspect ratio for the selected image. Defaults to 'cover'. */
|
|
20
|
+
resizeMode?: 'cover' | 'contain' | 'stretch';
|
|
21
|
+
disabled?: boolean;
|
|
22
|
+
style?: ViewStyle;
|
|
23
|
+
accessibilityLabel?: string;
|
|
24
|
+
}
|
|
25
|
+
declare function ImageUpload({ value, onChange, loading, placeholder, width, height, borderRadius, resizeMode, disabled, style, accessibilityLabel, }: ImageUploadProps): React.JSX.Element;
|
|
26
|
+
|
|
27
|
+
export { ImageUpload, type ImageUploadProps };
|