@retray-dev/ui-kit 0.1.0 → 1.5.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.
Files changed (56) hide show
  1. package/COMPONENTS.md +710 -0
  2. package/LICENSE +21 -0
  3. package/README.md +150 -0
  4. package/dist/index.d.mts +345 -4
  5. package/dist/index.d.ts +345 -4
  6. package/dist/index.js +1644 -58
  7. package/dist/index.mjs +1590 -58
  8. package/package.json +44 -5
  9. package/src/components/Accordion/Accordion.tsx +173 -0
  10. package/src/components/Accordion/index.ts +2 -0
  11. package/src/components/Alert/Alert.tsx +59 -0
  12. package/src/components/Alert/index.ts +2 -0
  13. package/src/components/Avatar/Avatar.tsx +71 -0
  14. package/src/components/Avatar/index.ts +2 -0
  15. package/src/components/Badge/Badge.tsx +48 -0
  16. package/src/components/Badge/index.ts +2 -0
  17. package/src/components/Button/Button.tsx +94 -45
  18. package/src/components/Card/Card.tsx +103 -0
  19. package/src/components/Card/index.ts +9 -0
  20. package/src/components/Checkbox/Checkbox.tsx +98 -0
  21. package/src/components/Checkbox/index.ts +2 -0
  22. package/src/components/EmptyState/EmptyState.tsx +67 -0
  23. package/src/components/EmptyState/index.ts +2 -0
  24. package/src/components/Input/Input.tsx +28 -35
  25. package/src/components/Progress/Progress.tsx +52 -0
  26. package/src/components/Progress/index.ts +2 -0
  27. package/src/components/RadioGroup/RadioGroup.tsx +132 -0
  28. package/src/components/RadioGroup/index.ts +2 -0
  29. package/src/components/Select/Select.tsx +232 -0
  30. package/src/components/Select/index.ts +2 -0
  31. package/src/components/Separator/Separator.tsx +33 -0
  32. package/src/components/Separator/index.ts +2 -0
  33. package/src/components/Sheet/Sheet.tsx +115 -0
  34. package/src/components/Sheet/index.ts +2 -0
  35. package/src/components/Skeleton/Skeleton.tsx +63 -0
  36. package/src/components/Skeleton/index.ts +2 -0
  37. package/src/components/Slider/Slider.tsx +143 -0
  38. package/src/components/Slider/index.ts +2 -0
  39. package/src/components/Spinner/Spinner.tsx +21 -0
  40. package/src/components/Spinner/index.ts +2 -0
  41. package/src/components/Switch/Switch.tsx +86 -0
  42. package/src/components/Switch/index.ts +2 -0
  43. package/src/components/Tabs/Tabs.tsx +196 -0
  44. package/src/components/Tabs/index.ts +2 -0
  45. package/src/components/Text/Text.tsx +10 -4
  46. package/src/components/Textarea/Textarea.tsx +89 -0
  47. package/src/components/Textarea/index.ts +2 -0
  48. package/src/components/Toast/Toast.tsx +200 -0
  49. package/src/components/Toast/index.ts +2 -0
  50. package/src/components/Toggle/Toggle.tsx +92 -0
  51. package/src/components/Toggle/index.ts +2 -0
  52. package/src/index.ts +26 -0
  53. package/src/theme/ThemeProvider.tsx +47 -0
  54. package/src/theme/colors.ts +45 -0
  55. package/src/theme/index.ts +4 -0
  56. package/src/theme/types.ts +33 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Julian Camilo Cruz Sanchez
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,150 @@
1
+ # 📦 @retray-dev/ui-kit
2
+
3
+ A personal React Native / Expo UI component library with a built-in design system, dark mode support, haptic feedback, and smooth animations.
4
+
5
+ - 23 components across 5 categories
6
+ - Light/dark theme with 18 color tokens and full customization
7
+ - Apple HIG–compliant touch targets and haptic feedback
8
+ - Animated interactions: spring press, sliding tabs, accordion easing, animated progress
9
+ - Built with TypeScript — full type declarations included
10
+
11
+ ## Installation
12
+
13
+ ```bash
14
+ # npm
15
+ npm install @retray-dev/ui-kit
16
+
17
+ # pnpm
18
+ pnpm add @retray-dev/ui-kit
19
+ ```
20
+
21
+ ### Peer dependencies
22
+
23
+ Install these in your app if not already present:
24
+
25
+ ```bash
26
+ pnpm add expo-haptics react-native-safe-area-context @gorhom/bottom-sheet react-native-reanimated react-native-gesture-handler react-native-worklets
27
+ ```
28
+
29
+ For Expo projects, run `npx expo install` instead to get SDK-compatible versions.
30
+
31
+ Add the Worklets Babel plugin to `babel.config.js` (required by `@gorhom/bottom-sheet`):
32
+
33
+ ```js
34
+ module.exports = function (api) {
35
+ api.cache(true)
36
+ return {
37
+ presets: ['babel-preset-expo'],
38
+ plugins: ['react-native-worklets/plugin'],
39
+ }
40
+ }
41
+ ```
42
+
43
+ ## Setup
44
+
45
+ Wrap your app root with all required providers. Order matters.
46
+
47
+ ```tsx
48
+ import { SafeAreaProvider, initialWindowMetrics } from 'react-native-safe-area-context'
49
+ import { GestureHandlerRootView } from 'react-native-gesture-handler'
50
+ import { ThemeProvider, BottomSheetModalProvider, ToastProvider } from '@retray-dev/ui-kit'
51
+
52
+ export default function App() {
53
+ return (
54
+ <SafeAreaProvider initialMetrics={initialWindowMetrics}>
55
+ <GestureHandlerRootView style={{ flex: 1 }}>
56
+ <ThemeProvider colorScheme="system">
57
+ <BottomSheetModalProvider>
58
+ <ToastProvider>{/* your app */}</ToastProvider>
59
+ </BottomSheetModalProvider>
60
+ </ThemeProvider>
61
+ </GestureHandlerRootView>
62
+ </SafeAreaProvider>
63
+ )
64
+ }
65
+ ```
66
+
67
+ | Provider | Required by |
68
+ | -------------------------- | ------------------------------------------ |
69
+ | `SafeAreaProvider` | `ToastProvider` (uses `useSafeAreaInsets`) |
70
+ | `GestureHandlerRootView` | `Sheet` (uses `@gorhom/bottom-sheet`) |
71
+ | `ThemeProvider` | All components |
72
+ | `BottomSheetModalProvider` | `Sheet` |
73
+ | `ToastProvider` | `useToast` hook |
74
+
75
+ ## Theme
76
+
77
+ Customize any color token per scheme:
78
+
79
+ ```tsx
80
+ const myTheme = {
81
+ light: { primary: '#6366f1', primaryForeground: '#ffffff' },
82
+ dark: { primary: '#818cf8', primaryForeground: '#ffffff' },
83
+ }
84
+
85
+ <ThemeProvider theme={myTheme} colorScheme="system">
86
+ ```
87
+
88
+ Access theme colors anywhere inside the tree:
89
+
90
+ ```tsx
91
+ import { useTheme } from '@retray-dev/ui-kit'
92
+
93
+ const { colors, colorScheme } = useTheme()
94
+ ```
95
+
96
+ **Available tokens:** `background`, `foreground`, `card`, `cardForeground`, `primary`, `primaryForeground`, `secondary`, `secondaryForeground`, `muted`, `mutedForeground`, `accent`, `accentForeground`, `destructive`, `destructiveForeground`, `border`, `input`, `ring`
97
+
98
+ ## Components
99
+
100
+ | Category | Components |
101
+ | ----------- | ----------------------------------------------------------------------------------------------- |
102
+ | Display | `Text`, `Badge`, `Avatar`, `Separator`, `Spinner`, `Skeleton`, `Progress` |
103
+ | Surfaces | `Card`, `Alert`, `EmptyState` |
104
+ | Form | `Button`, `Input`, `Textarea`, `Checkbox`, `Switch`, `Toggle`, `RadioGroup`, `Select`, `Slider` |
105
+ | Composition | `Tabs`, `Accordion` |
106
+ | Overlays | `Sheet` |
107
+ | Feedback | `Toast` / `ToastProvider` / `useToast` |
108
+
109
+ ### Quick examples
110
+
111
+ ```tsx
112
+ import {
113
+ Button, Input, Badge, Card, CardHeader, CardTitle, CardContent,
114
+ Toast, useToast, Sheet, Select, Tabs, TabsContent,
115
+ } from '@retray-dev/ui-kit'
116
+
117
+ // Button
118
+ <Button variant="default" size="md" onPress={() => {}}>
119
+ Save
120
+ </Button>
121
+
122
+ // Toast
123
+ const { toast } = useToast()
124
+ toast({ title: 'Saved', variant: 'success' })
125
+
126
+ // Sheet (bottom sheet)
127
+ <Sheet open={open} onClose={() => setOpen(false)} title="Options" snapPoints={['40%']}>
128
+ <Text>Sheet content</Text>
129
+ </Sheet>
130
+
131
+ // Select
132
+ <Select
133
+ value={value}
134
+ onValueChange={setValue}
135
+ options={[{ label: 'Option A', value: 'a' }, { label: 'Option B', value: 'b' }]}
136
+ placeholder="Pick one"
137
+ />
138
+ ```
139
+
140
+ Full props reference and more examples are available in [COMPONENTS.md](./COMPONENTS.md), which is also shipped inside the npm package for use with AI tools:
141
+
142
+ ```markdown
143
+ ## UI Components
144
+
145
+ @./node_modules/@retray-dev/ui-kit/COMPONENTS.md
146
+ ```
147
+
148
+ ## License
149
+
150
+ MIT © Julian Camilo Cruz Sanchez
package/dist/index.d.mts CHANGED
@@ -1,16 +1,81 @@
1
1
  import React from 'react';
2
- import { TouchableOpacityProps, TextProps as TextProps$1, TextInputProps } from 'react-native';
2
+ import { TouchableOpacityProps, TextProps as TextProps$1, TextInputProps, ViewStyle, TextStyle, ActivityIndicatorProps } from 'react-native';
3
+ export { BottomSheetModalProvider } from '@gorhom/bottom-sheet';
4
+
5
+ type ThemeColors = {
6
+ background: string;
7
+ foreground: string;
8
+ card: string;
9
+ cardForeground: string;
10
+ primary: string;
11
+ primaryForeground: string;
12
+ secondary: string;
13
+ secondaryForeground: string;
14
+ muted: string;
15
+ mutedForeground: string;
16
+ accent: string;
17
+ accentForeground: string;
18
+ destructive: string;
19
+ destructiveForeground: string;
20
+ border: string;
21
+ input: string;
22
+ ring: string;
23
+ success: string;
24
+ successForeground: string;
25
+ };
26
+ type Theme = {
27
+ light?: Partial<ThemeColors>;
28
+ dark?: Partial<ThemeColors>;
29
+ };
30
+ type ColorScheme = 'light' | 'dark' | 'system';
31
+ type ThemeContextValue = {
32
+ colors: ThemeColors;
33
+ colorScheme: 'light' | 'dark';
34
+ };
35
+
36
+ interface ThemeProviderProps {
37
+ children: React.ReactNode;
38
+ /**
39
+ * Override individual color tokens per scheme. Only provide the tokens you want
40
+ * to change — the rest fall back to the defaults.
41
+ * @example
42
+ * { light: { primary: '#6366f1', primaryForeground: '#fff' },
43
+ * dark: { primary: '#818cf8', primaryForeground: '#fff' } }
44
+ */
45
+ theme?: Theme;
46
+ /**
47
+ * - `'system'` (default): auto-detects device setting and updates when it changes.
48
+ * - `'light'` / `'dark'`: forces a specific scheme regardless of device setting.
49
+ */
50
+ colorScheme?: ColorScheme;
51
+ }
52
+ declare function ThemeProvider({ children, theme, colorScheme }: ThemeProviderProps): React.JSX.Element;
53
+ declare function useTheme(): ThemeContextValue;
54
+
55
+ declare const defaultLight: ThemeColors;
56
+ declare const defaultDark: ThemeColors;
3
57
 
4
58
  type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost';
5
59
  type ButtonSize = 'sm' | 'md' | 'lg';
6
60
  interface ButtonProps extends TouchableOpacityProps {
7
61
  label: string;
62
+ /**
63
+ * - `primary`: filled with `primary` token — main CTA
64
+ * - `secondary`: filled with `secondary` token — less prominent
65
+ * - `outline`: transparent with border — alternative actions
66
+ * - `ghost`: fully transparent — in-context or low-emphasis actions
67
+ */
8
68
  variant?: ButtonVariant;
9
69
  size?: ButtonSize;
70
+ /** Replaces the label with a spinner and forces `disabled`. */
10
71
  loading?: boolean;
11
72
  fullWidth?: boolean;
73
+ /** Icon rendered alongside the label. */
74
+ icon?: React.ReactNode;
75
+ /** Side the icon appears on. Defaults to `'left'`. */
76
+ iconPosition?: 'left' | 'right';
12
77
  }
13
- declare function Button({ label, variant, size, loading, fullWidth, disabled, style, ...props }: ButtonProps): React.JSX.Element;
78
+ declare function Button({ label, variant, size, loading, fullWidth, icon, iconPosition, disabled, style, onPress, ...props }: ButtonProps): React.JSX.Element;
14
79
 
15
80
  type TextVariant = 'h1' | 'h2' | 'h3' | 'body' | 'caption' | 'label';
16
81
  interface TextProps extends TextProps$1 {
@@ -21,9 +86,285 @@ declare function Text({ variant, color, style, children, ...props }: TextProps):
21
86
 
22
87
  interface InputProps extends TextInputProps {
23
88
  label?: string;
89
+ /** Red helper text below the input; also changes border to `destructive` color. Takes priority over `hint`. */
90
+ error?: string;
91
+ /** Helper text shown below the input when there is no error. */
92
+ hint?: string;
93
+ /** Style for the outer container `View`. Use `style` (from `TextInputProps`) to style the `TextInput` itself. */
94
+ containerStyle?: ViewStyle;
95
+ }
96
+ declare function Input({ label, error, hint, containerStyle, style, onFocus, onBlur, ...props }: InputProps): React.JSX.Element;
97
+
98
+ type BadgeVariant = 'default' | 'secondary' | 'destructive' | 'outline';
99
+ interface BadgeProps {
100
+ label: string;
101
+ variant?: BadgeVariant;
102
+ style?: ViewStyle;
103
+ }
104
+ declare function Badge({ label, variant, style }: BadgeProps): React.JSX.Element;
105
+
106
+ interface CardProps {
107
+ children: React.ReactNode;
108
+ style?: ViewStyle;
109
+ }
110
+ interface CardHeaderProps {
111
+ children: React.ReactNode;
112
+ style?: ViewStyle;
113
+ }
114
+ interface CardTitleProps {
115
+ children: React.ReactNode;
116
+ style?: TextStyle;
117
+ }
118
+ interface CardDescriptionProps {
119
+ children: React.ReactNode;
120
+ style?: TextStyle;
121
+ }
122
+ interface CardContentProps {
123
+ children: React.ReactNode;
124
+ style?: ViewStyle;
125
+ }
126
+ interface CardFooterProps {
127
+ children: React.ReactNode;
128
+ style?: ViewStyle;
129
+ }
130
+ declare function Card({ children, style }: CardProps): React.JSX.Element;
131
+ declare function CardHeader({ children, style }: CardHeaderProps): React.JSX.Element;
132
+ declare function CardTitle({ children, style }: CardTitleProps): React.JSX.Element;
133
+ declare function CardDescription({ children, style }: CardDescriptionProps): React.JSX.Element;
134
+ declare function CardContent({ children, style }: CardContentProps): React.JSX.Element;
135
+ declare function CardFooter({ children, style }: CardFooterProps): React.JSX.Element;
136
+
137
+ interface SeparatorProps {
138
+ orientation?: 'horizontal' | 'vertical';
139
+ style?: ViewStyle;
140
+ }
141
+ declare function Separator({ orientation, style }: SeparatorProps): React.JSX.Element;
142
+
143
+ type SpinnerSize = 'sm' | 'md' | 'lg';
144
+ interface SpinnerProps extends Omit<ActivityIndicatorProps, 'size'> {
145
+ size?: SpinnerSize;
146
+ color?: string;
147
+ }
148
+ declare function Spinner({ size, color, ...props }: SpinnerProps): React.JSX.Element;
149
+
150
+ interface SkeletonProps {
151
+ width?: number | string;
152
+ height?: number;
153
+ borderRadius?: number;
154
+ style?: ViewStyle;
155
+ }
156
+ declare function Skeleton({ width, height, borderRadius, style }: SkeletonProps): React.JSX.Element;
157
+
158
+ type AvatarSize = 'sm' | 'md' | 'lg' | 'xl';
159
+ interface AvatarProps {
160
+ /** Remote image URI. Falls back to `fallback` initials on error or when omitted. */
161
+ src?: string;
162
+ /** Up to 2 characters shown when the image is unavailable. Auto-uppercased. Defaults to `'?'`. */
163
+ fallback?: string;
164
+ size?: AvatarSize;
165
+ style?: ViewStyle;
166
+ }
167
+ declare function Avatar({ src, fallback, size, style }: AvatarProps): React.JSX.Element;
168
+
169
+ type AlertVariant = 'default' | 'destructive';
170
+ interface AlertProps {
171
+ title?: string;
172
+ description?: string;
173
+ variant?: AlertVariant;
174
+ icon?: React.ReactNode;
175
+ style?: ViewStyle;
176
+ }
177
+ declare function Alert({ title, description, variant, icon, style }: AlertProps): React.JSX.Element;
178
+
179
+ interface ProgressProps {
180
+ /** Current progress value. Clamped to `[0, max]`. Defaults to `0`. */
181
+ value?: number;
182
+ /** Maximum value. Defaults to `100`. */
183
+ max?: number;
184
+ style?: ViewStyle;
185
+ }
186
+ declare function Progress({ value, max, style }: ProgressProps): React.JSX.Element;
187
+
188
+ interface EmptyStateProps {
189
+ icon?: React.ReactNode;
190
+ title: string;
191
+ description?: string;
192
+ action?: React.ReactNode;
193
+ style?: ViewStyle;
194
+ }
195
+ declare function EmptyState({ icon, title, description, action, style }: EmptyStateProps): React.JSX.Element;
196
+
197
+ interface TextareaProps extends TextInputProps {
198
+ label?: string;
199
+ /** Red helper text below the textarea; also changes border to `destructive` color. Takes priority over `hint`. */
24
200
  error?: string;
201
+ /** Helper text shown below the textarea when there is no error. */
25
202
  hint?: string;
203
+ /** Number of visible text rows. Defaults to `4`. Controls `numberOfLines` and `minHeight`. */
204
+ rows?: number;
205
+ /** Style for the outer container `View`. Use `style` (from `TextInputProps`) to style the `TextInput` itself. */
206
+ containerStyle?: ViewStyle;
207
+ }
208
+ declare function Textarea({ label, error, hint, rows, containerStyle, style, onFocus, onBlur, ...props }: TextareaProps): React.JSX.Element;
209
+
210
+ interface CheckboxProps {
211
+ checked?: boolean;
212
+ onCheckedChange?: (checked: boolean) => void;
213
+ label?: string;
214
+ disabled?: boolean;
215
+ style?: ViewStyle;
216
+ }
217
+ declare function Checkbox({ checked, onCheckedChange, label, disabled, style, }: CheckboxProps): React.JSX.Element;
218
+
219
+ interface SwitchProps {
220
+ checked?: boolean;
221
+ onCheckedChange?: (checked: boolean) => void;
222
+ disabled?: boolean;
223
+ style?: ViewStyle;
224
+ }
225
+ declare function Switch({ checked, onCheckedChange, disabled, style }: SwitchProps): React.JSX.Element;
226
+
227
+ type ToggleVariant = 'default' | 'outline';
228
+ type ToggleSize = 'sm' | 'md' | 'lg';
229
+ interface ToggleProps extends TouchableOpacityProps {
230
+ pressed?: boolean;
231
+ onPressedChange?: (pressed: boolean) => void;
232
+ variant?: ToggleVariant;
233
+ size?: ToggleSize;
234
+ label?: string;
235
+ icon?: React.ReactNode;
236
+ }
237
+ declare function Toggle({ pressed, onPressedChange, variant, size, label, icon, disabled, style, ...props }: ToggleProps): React.JSX.Element;
238
+
239
+ interface RadioOption {
240
+ label: string;
241
+ value: string;
242
+ disabled?: boolean;
243
+ }
244
+ interface RadioGroupProps {
245
+ options: RadioOption[];
246
+ value?: string;
247
+ onValueChange?: (value: string) => void;
248
+ orientation?: 'vertical' | 'horizontal';
249
+ style?: ViewStyle;
250
+ }
251
+ declare function RadioGroup({ options, value, onValueChange, orientation, style, }: RadioGroupProps): React.JSX.Element;
252
+
253
+ interface TabItem {
254
+ label: string;
255
+ value: string;
256
+ }
257
+ interface TabsProps {
258
+ tabs: TabItem[];
259
+ /**
260
+ * Controlled active tab value. When omitted the component manages state internally
261
+ * (uncontrolled), defaulting to the first tab.
262
+ */
263
+ value?: string;
264
+ onValueChange?: (value: string) => void;
265
+ children?: React.ReactNode;
266
+ style?: ViewStyle;
267
+ }
268
+ interface TabsContentProps {
269
+ value: string;
270
+ activeValue: string;
271
+ children: React.ReactNode;
272
+ style?: ViewStyle;
273
+ }
274
+ declare function Tabs({ tabs, value, onValueChange, children, style }: TabsProps): React.JSX.Element;
275
+ declare function TabsContent({ value, activeValue, children, style }: TabsContentProps): React.JSX.Element | null;
276
+
277
+ interface AccordionItem {
278
+ value: string;
279
+ trigger: string;
280
+ content: React.ReactNode;
281
+ }
282
+ interface AccordionProps {
283
+ items: AccordionItem[];
284
+ /**
285
+ * - `'single'` (default): only one item can be open at a time. Opening another closes the current one.
286
+ * - `'multiple'`: any number of items can be open simultaneously.
287
+ */
288
+ type?: 'single' | 'multiple';
289
+ /** Item value(s) that should be open on first render. */
290
+ defaultValue?: string | string[];
291
+ style?: ViewStyle;
292
+ }
293
+ declare function Accordion({ items, type, defaultValue, style }: AccordionProps): React.JSX.Element;
294
+
295
+ interface SliderProps {
296
+ /** Current value. Controlled when provided; falls back to internal state otherwise. */
297
+ value?: number;
298
+ minimumValue?: number;
299
+ maximumValue?: number;
300
+ /** Snap interval. `0` (default) means continuous (no snapping). */
301
+ step?: number;
302
+ /** Called on every move while dragging. */
303
+ onValueChange?: (value: number) => void;
304
+ /** Called once when the user releases the thumb. */
305
+ onSlidingComplete?: (value: number) => void;
306
+ disabled?: boolean;
307
+ style?: ViewStyle;
308
+ }
309
+ declare function Slider({ value, minimumValue, maximumValue, step, onValueChange, onSlidingComplete, disabled, style, }: SliderProps): React.JSX.Element;
310
+
311
+ interface SheetProps {
312
+ open: boolean;
313
+ onClose: () => void;
314
+ title?: string;
315
+ description?: string;
316
+ children?: React.ReactNode;
317
+ /**
318
+ * Heights the sheet can snap to. Accepts percentage strings (`'50%'`) or
319
+ * absolute point values (`300`). Defaults to `['50%']`.
320
+ */
321
+ snapPoints?: (string | number)[];
322
+ /** Style for the inner `BottomSheetView` content container. */
323
+ style?: ViewStyle;
324
+ }
325
+ declare function Sheet({ open, onClose, title, description, children, snapPoints, style, }: SheetProps): React.JSX.Element;
326
+
327
+ interface SelectOption {
328
+ label: string;
329
+ value: string;
330
+ disabled?: boolean;
331
+ }
332
+ interface SelectProps {
333
+ options: SelectOption[];
334
+ value?: string;
335
+ onValueChange?: (value: string) => void;
336
+ /** Text shown when no option is selected. Defaults to `'Select an option'`. */
337
+ placeholder?: string;
338
+ label?: string;
339
+ /** Red helper text; also changes trigger border to `destructive` color. */
340
+ error?: string;
341
+ disabled?: boolean;
342
+ style?: ViewStyle;
343
+ }
344
+ declare function Select({ options, value, onValueChange, placeholder, label, error, disabled, style, }: SelectProps): React.JSX.Element;
345
+
346
+ type ToastVariant = 'default' | 'destructive' | 'success';
347
+ interface ToastItem {
348
+ id: string;
349
+ title?: string;
350
+ description?: string;
351
+ variant?: ToastVariant;
352
+ /** Auto-dismiss delay in milliseconds. Defaults to `3000`. */
353
+ duration?: number;
354
+ }
355
+ interface ToastContextValue {
356
+ toast: (item: Omit<ToastItem, 'id'>) => void;
357
+ dismiss: (id: string) => void;
358
+ }
359
+ declare function useToast(): ToastContextValue;
360
+ /**
361
+ * Must wrap the app root alongside ThemeProvider.
362
+ * Renders toasts in an absolute overlay at the top of the screen.
363
+ * Use `useToast()` anywhere inside to trigger toasts.
364
+ */
365
+ interface ToastProviderProps {
366
+ children: React.ReactNode;
26
367
  }
27
- declare function Input({ label, error, hint, style, onFocus, onBlur, ...props }: InputProps): React.JSX.Element;
368
+ declare function ToastProvider({ children }: ToastProviderProps): React.JSX.Element;
28
369
 
29
- export { Button, type ButtonProps, type ButtonSize, type ButtonVariant, Input, type InputProps, Text, type TextProps, type TextVariant };
370
+ export { Accordion, type AccordionItem, type AccordionProps, Alert, type AlertProps, type AlertVariant, Avatar, type AvatarProps, type AvatarSize, Badge, type BadgeProps, type BadgeVariant, Button, type ButtonProps, type ButtonSize, type ButtonVariant, Card, CardContent, type CardContentProps, CardDescription, type CardDescriptionProps, CardFooter, type CardFooterProps, CardHeader, type CardHeaderProps, type CardProps, CardTitle, type CardTitleProps, Checkbox, type CheckboxProps, type ColorScheme, EmptyState, type EmptyStateProps, Input, type InputProps, Progress, type ProgressProps, RadioGroup, type RadioGroupProps, type RadioOption, Select, type SelectOption, type SelectProps, Separator, type SeparatorProps, Sheet, type SheetProps, Skeleton, type SkeletonProps, Slider, type SliderProps, Spinner, type SpinnerProps, type SpinnerSize, Switch, type SwitchProps, type TabItem, Tabs, TabsContent, type TabsContentProps, type TabsProps, Text, type TextProps, type TextVariant, Textarea, type TextareaProps, type Theme, type ThemeColors, ThemeProvider, type ThemeProviderProps, type ToastItem, ToastProvider, type ToastProviderProps, type ToastVariant, Toggle, type ToggleProps, type ToggleSize, type ToggleVariant, defaultDark, defaultLight, useTheme, useToast };