@retray-dev/ui-kit 5.4.0 → 6.1.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/dist/index.d.mts CHANGED
@@ -1,6 +1,8 @@
1
1
  import React from 'react';
2
2
  import { TouchableOpacityProps, ViewStyle, TextProps as TextProps$1, TextInputProps, TextStyle, ActivityIndicatorProps, ImageSourcePropType } from 'react-native';
3
- export { BottomSheetModalProvider } from '@gorhom/bottom-sheet';
3
+ import * as sonner_native from 'sonner-native';
4
+ export { toast } from 'sonner-native';
5
+ export { BottomSheetModalProvider, BottomSheetTextInput as SheetTextInput } from '@gorhom/bottom-sheet';
4
6
 
5
7
  type ThemeColors = {
6
8
  background: string;
@@ -15,6 +17,12 @@ type ThemeColors = {
15
17
  successForeground: string;
16
18
  warning: string;
17
19
  warningForeground: string;
20
+ /** Backdrop/overlay color. Default: 'rgba(0,0,0,0.45)' */
21
+ overlay?: string;
22
+ /** Color accent (e.g. Airbnb coral). Default: same as primary */
23
+ accent?: string;
24
+ /** Text color on accent background. Default: same as primaryForeground */
25
+ accentForeground?: string;
18
26
  };
19
27
  type ResolvedColors = ThemeColors & {
20
28
  foregroundSubtle: string;
@@ -27,6 +35,9 @@ type ResolvedColors = ThemeColors & {
27
35
  successBorder: string;
28
36
  warningTint: string;
29
37
  warningBorder: string;
38
+ overlay: string;
39
+ accentResolved: string;
40
+ accentForegroundResolved: string;
30
41
  ring: string;
31
42
  input: string;
32
43
  };
@@ -134,6 +145,8 @@ interface InputProps extends TextInputProps {
134
145
  error?: string;
135
146
  /** Helper text shown below the input when there is no error. */
136
147
  hint?: string;
148
+ /** Disabled visual state — dimmed appearance, not editable. Also sets `editable={false}`. */
149
+ disabled?: boolean;
137
150
  /** Text or component rendered before the input text. */
138
151
  prefix?: React.ReactNode;
139
152
  /** Text or component rendered after the input text. */
@@ -163,7 +176,7 @@ interface InputProps extends TextInputProps {
163
176
  /** Style for the inner border wrapper (overrides padding, etc). */
164
177
  inputWrapperStyle?: ViewStyle;
165
178
  }
166
- declare function Input({ label, error, hint, prefix, suffix, prefixStyle, suffixStyle, prefixIcon, suffixIcon, prefixIconColor, suffixIconColor, type, containerStyle, inputWrapperStyle, style, onFocus, onBlur, secureTextEntry, ...props }: InputProps): React.JSX.Element;
179
+ declare function Input({ label, error, hint, disabled, prefix, suffix, prefixStyle, suffixStyle, prefixIcon, suffixIcon, prefixIconColor, suffixIconColor, type, containerStyle, inputWrapperStyle, style, onFocus, onBlur, secureTextEntry, editable, ...props }: InputProps): React.JSX.Element;
167
180
 
168
181
  type BadgeVariant = 'default' | 'secondary' | 'destructive' | 'outline' | 'success' | 'warning' | 'successOutline' | 'destructiveOutline' | 'warningOutline';
169
182
  type BadgeSize = 'sm' | 'md' | 'lg';
@@ -296,12 +309,17 @@ interface EmptyStateProps {
296
309
  iconColor?: string;
297
310
  title: string;
298
311
  description?: string;
312
+ /** Custom action node. Use `actionLabel` + `onAction` for a pre-built primary Button. */
299
313
  action?: React.ReactNode;
314
+ /** Label for a convenience primary Button rendered below description. Ignored in compact size. */
315
+ actionLabel?: string;
316
+ /** Called when the convenience action Button is pressed. Required when `actionLabel` is set. */
317
+ onAction?: () => void;
300
318
  /** `compact` hides description/action and uses tighter spacing and a smaller icon. */
301
319
  size?: 'default' | 'compact';
302
320
  style?: ViewStyle;
303
321
  }
304
- declare function EmptyState({ icon, iconName, iconColor, title, description, action, size, style }: EmptyStateProps): React.JSX.Element;
322
+ declare function EmptyState({ icon, iconName, iconColor, title, description, action, actionLabel, onAction, size, style }: EmptyStateProps): React.JSX.Element;
305
323
 
306
324
  interface TextareaProps extends TextInputProps {
307
325
  label?: string;
@@ -449,20 +467,57 @@ interface SheetProps {
449
467
  open: boolean;
450
468
  onClose: () => void;
451
469
  title?: string;
470
+ /** Secondary text below title. */
471
+ subtitle?: string;
472
+ /** @deprecated Use `subtitle` instead. */
452
473
  description?: string;
474
+ /** Show an X close button in the header. */
475
+ showCloseButton?: boolean;
453
476
  children?: React.ReactNode;
454
477
  /** Style for the inner content container. */
455
478
  style?: ViewStyle;
456
- /** Render children inside BottomSheetScrollView so gestures are handled correctly on both platforms. */
479
+ /** Style for the content wrapper (outside the scroll container). */
480
+ contentStyle?: ViewStyle;
481
+ /** Render children inside BottomSheetScrollView. */
457
482
  scrollable?: boolean;
458
483
  /** Cap sheet height (dp). Children scroll when content exceeds this value. */
459
484
  maxHeight?: number;
460
- /** Wrap content in KeyboardAvoidingView. Defaults to platform-appropriate behavior when set. */
461
- keyboardBehavior?: 'padding' | 'height' | 'position' | 'none';
462
- /** Extra vertical offset for the keyboard avoiding view. */
463
- keyboardOffset?: number;
485
+ /**
486
+ * Keyboard behavior how the sheet responds to keyboard appearance.
487
+ * - 'interactive': offset sheet by keyboard size (default, works on both platforms)
488
+ * - 'fillParent': extend sheet to fill parent view (can cause restore issues with dynamic sizing)
489
+ * - 'extend': extend sheet to maximum snap point
490
+ *
491
+ * Default: 'interactive' on both platforms.
492
+ */
493
+ keyboardBehavior?: 'extend' | 'fillParent' | 'interactive';
494
+ /**
495
+ * Keyboard blur behavior — what happens when keyboard dismisses.
496
+ * - 'none': do nothing
497
+ * - 'restore': restore sheet to previous position (default)
498
+ */
499
+ keyboardBlurBehavior?: 'none' | 'restore';
500
+ /**
501
+ * Blur keyboard when user starts dragging the sheet down.
502
+ * Default: true (recommended for better UX)
503
+ */
504
+ enableBlurKeyboardOnGesture?: boolean;
505
+ /**
506
+ * Android-only: defines keyboard input mode.
507
+ * - 'adjustPan': pan the sheet content (default, fixes restore issues with dynamic sizing)
508
+ * - 'adjustResize': resize the sheet container (can cause transparent gap on dismiss)
509
+ */
510
+ android_keyboardInputMode?: 'adjustPan' | 'adjustResize';
511
+ /** Sticky footer rendered below the scroll area. */
512
+ footer?: React.ReactNode;
513
+ /**
514
+ * Array of snap points for the sheet (e.g., ['50%', '85%'] or [200, 500]).
515
+ * When provided, disables enableDynamicSizing.
516
+ * When omitted, sheet uses dynamic sizing (auto-fits content).
517
+ */
518
+ snapPoints?: (string | number)[];
464
519
  }
465
- declare function Sheet({ open, onClose, title, description, children, style, scrollable, maxHeight, keyboardBehavior, keyboardOffset, }: SheetProps): React.JSX.Element;
520
+ declare function Sheet({ open, onClose, title, subtitle, description, showCloseButton, children, style, contentStyle, scrollable, maxHeight, keyboardBehavior, keyboardBlurBehavior, enableBlurKeyboardOnGesture, android_keyboardInputMode, footer, snapPoints, }: SheetProps): React.JSX.Element;
466
521
 
467
522
  interface SelectOption {
468
523
  label: string;
@@ -481,38 +536,47 @@ interface SelectProps {
481
536
  }
482
537
  declare function Select({ options, value, onValueChange, placeholder, label, error, disabled, style, }: SelectProps): React.JSX.Element;
483
538
 
484
- type ToastVariant = 'default' | 'destructive' | 'success' | 'warning';
485
- interface ToastAction {
486
- label: string;
487
- onPress: () => void;
488
- }
489
- interface ToastItem {
490
- id: string;
491
- title?: string;
492
- description?: string;
493
- variant?: ToastVariant;
494
- icon?: React.ReactNode;
495
- iconName?: string;
496
- iconColor?: string;
497
- /** Auto-dismiss delay in milliseconds. Defaults to `3000`. */
498
- duration?: number;
499
- /** Optional inline action button rendered at the end of the toast. */
500
- action?: ToastAction;
501
- }
502
- interface ToastContextValue {
503
- toast: (item: Omit<ToastItem, 'id'>) => void;
504
- dismiss: (id: string) => void;
505
- }
506
- declare function useToast(): ToastContextValue;
507
- /**
508
- * Must wrap the app root alongside ThemeProvider.
509
- * Renders toasts in an absolute overlay at the top of the screen.
510
- * Use `useToast()` anywhere inside to trigger toasts.
511
- */
512
- interface ToastProviderProps {
539
+ declare function useToast(): {
540
+ toast: ((message: string, data?: Omit<sonner_native.ToastProps, "title" | "type" | "variant" | "id" | "jsx" | "promise"> & {
541
+ id?: string | number;
542
+ }) => string | number) & {
543
+ success: (message: string, data?: Omit<sonner_native.ToastProps, "title" | "type" | "variant" | "id" | "jsx" | "promise"> & {
544
+ id?: string | number;
545
+ }) => string | number;
546
+ info: (message: string, data?: Omit<sonner_native.ToastProps, "title" | "type" | "variant" | "id" | "jsx" | "promise"> & {
547
+ id?: string | number;
548
+ }) => string | number;
549
+ error: (message: string, data?: Omit<sonner_native.ToastProps, "title" | "type" | "variant" | "id" | "jsx" | "promise"> & {
550
+ id?: string | number;
551
+ }) => string | number;
552
+ warning: (message: string, data?: Omit<sonner_native.ToastProps, "title" | "type" | "variant" | "id" | "jsx" | "promise"> & {
553
+ id?: string | number;
554
+ }) => string | number;
555
+ custom: (jsx: React.ReactElement, data?: Omit<sonner_native.ToastProps, "title" | "type" | "variant" | "id" | "jsx" | "promise"> & {
556
+ id?: string | number;
557
+ }) => string | number;
558
+ promise: <T>(promise: Promise<T>, options: Omit<{
559
+ promise: Promise<unknown>;
560
+ success: (result: any) => string;
561
+ error: ((error: unknown) => string) | string;
562
+ loading: string;
563
+ styles?: {
564
+ loading?: sonner_native.ToastStyles;
565
+ success?: sonner_native.ToastStyles;
566
+ error?: sonner_native.ToastStyles;
567
+ };
568
+ }, "promise">) => string | number;
569
+ loading: (message: string, data?: Omit<sonner_native.ToastProps, "title" | "type" | "variant" | "id" | "jsx" | "promise"> & {
570
+ id?: string | number;
571
+ }) => string | number;
572
+ dismiss: (id?: string | number) => string | number | undefined;
573
+ wiggle: (id: string | number) => void;
574
+ };
575
+ dismiss: (id?: string | number) => string | number | undefined;
576
+ };
577
+ declare function ToastProvider({ children }: {
513
578
  children: React.ReactNode;
514
- }
515
- declare function ToastProvider({ children }: ToastProviderProps): React.JSX.Element;
579
+ }): React.JSX.Element;
516
580
 
517
581
  interface CurrencyInputProps {
518
582
  value?: string;
@@ -612,6 +676,47 @@ interface ListItemProps {
612
676
  }
613
677
  declare function ListItem({ leftRender, rightRender, trailing, icon, leftIcon, rightIcon, leftIconColor, rightIconColor, title, subtitle, caption, variant, showChevron, showSeparator, onPress, disabled, style, titleStyle, subtitleStyle, captionStyle, }: ListItemProps): React.JSX.Element;
614
678
 
679
+ type MenuItemVariant = 'plain' | 'card';
680
+ interface MenuItemProps {
681
+ label: string;
682
+ /** Secondary text rendered below the label. */
683
+ subtitle?: string;
684
+ /**
685
+ * Icon name from `@expo/vector-icons` rendered on the left.
686
+ * See https://icons.expo.fyi.
687
+ */
688
+ iconName?: string;
689
+ /** Custom icon node rendered on the left. */
690
+ icon?: React.ReactNode;
691
+ /** Override icon color. Defaults to `foreground`. */
692
+ iconColor?: string;
693
+ /**
694
+ * Custom content rendered on the right.
695
+ * When provided, replaces the default chevron.
696
+ * Use for checkboxes, switches, badges, or other controls.
697
+ */
698
+ rightRender?: React.ReactNode;
699
+ /**
700
+ * Show chevron on the right. Defaults to `true`.
701
+ * Ignored when `rightRender` is provided.
702
+ */
703
+ showChevron?: boolean;
704
+ onPress: () => void;
705
+ disabled?: boolean;
706
+ /**
707
+ * - `plain` (default): no background — sits inside a parent surface.
708
+ * - `card`: standalone surface with background + border.
709
+ */
710
+ variant?: MenuItemVariant;
711
+ /** Visual separator line at the bottom. */
712
+ showSeparator?: boolean;
713
+ /** Style applied to the outer container. */
714
+ style?: ViewStyle;
715
+ /** Style applied to the label Text. */
716
+ labelStyle?: TextStyle;
717
+ }
718
+ declare function MenuItem({ label, subtitle, iconName, icon, iconColor, rightRender, showChevron, onPress, disabled, variant, showSeparator, style, labelStyle, }: MenuItemProps): React.JSX.Element;
719
+
615
720
  interface ChipProps {
616
721
  label: string;
617
722
  selected?: boolean;
@@ -762,11 +867,11 @@ type DetailRowSeparator = 'dotted' | 'solid' | 'dashed' | 'none';
762
867
  type DetailRowLabelWeight = 'normal' | 'medium' | 'semibold' | 'bold';
763
868
  interface DetailRowProps {
764
869
  label: React.ReactNode;
765
- value: string;
870
+ value: string | React.ReactNode;
766
871
  /** Dotted/dashed/solid line between label and value. Defaults to 'dotted'. */
767
872
  separator?: DetailRowSeparator;
768
873
  labelWeight?: DetailRowLabelWeight;
769
- /** Semantic color key or hex string for value text. */
874
+ /** Semantic color key or hex string for value text. Only applies when value is a string. */
770
875
  valueColor?: string;
771
876
  /** Node rendered left of the label (e.g. Avatar, Icon). */
772
877
  leftIcon?: React.ReactNode;
@@ -780,6 +885,7 @@ interface DetailRowProps {
780
885
  rightIconColor?: string;
781
886
  style?: ViewStyle;
782
887
  labelStyle?: TextStyle;
888
+ /** Only applies when value is a string. */
783
889
  valueStyle?: TextStyle;
784
890
  }
785
891
  declare function DetailRow({ label, value, separator, labelWeight, valueColor, leftIcon, leftIconName, leftIconColor, rightIconName, rightIconColor, style, labelStyle, valueStyle, }: DetailRowProps): React.JSX.Element;
@@ -975,10 +1081,10 @@ declare const TYPOGRAPHY: {
975
1081
  };
976
1082
  readonly 'uppercase-tag': {
977
1083
  readonly fontFamily: "Poppins-Bold";
978
- readonly fontSize: 8;
1084
+ readonly fontSize: 10;
979
1085
  readonly fontWeight: "700";
980
- readonly lineHeight: 10;
981
- readonly letterSpacing: 0.32;
1086
+ readonly lineHeight: 13;
1087
+ readonly letterSpacing: 0.8;
982
1088
  readonly textTransform: "uppercase";
983
1089
  };
984
1090
  readonly 'button-lg': {
@@ -1005,4 +1111,4 @@ type RadiusKey = keyof Radius;
1005
1111
  type Typography = typeof TYPOGRAPHY;
1006
1112
  type TypographyKey = keyof Typography;
1007
1113
 
1008
- export { Accordion, type AccordionItem, type AccordionProps, AlertBanner, type AlertBannerProps, type AlertBannerVariant, Avatar, type AvatarProps, type AvatarSize, BREAKPOINTS, Badge, type BadgeProps, type BadgeVariant, Button, ButtonGroup, type ButtonGroupProps, type ButtonProps, type ButtonSize, type ButtonVariant, Card, CardContent, type CardContentProps, CardDescription, type CardDescriptionProps, CardFooter, type CardFooterProps, CardHeader, type CardHeaderProps, type CardProps, CardTitle, type CardTitleProps, type CategoryItem, CategoryStrip, type CategoryStripProps, Checkbox, type CheckboxProps, Chip, ChipGroup, type ChipGroupProps, type ChipOption, type ChipProps, type ColorScheme, ConfirmDialog, type ConfirmDialogProps, CurrencyDisplay, type CurrencyDisplayProps, type CurrencyDisplayVariant, CurrencyInput, CurrencyInput as CurrencyInputLarge, type CurrencyInputProps, DetailRow, type DetailRowLabelWeight, type DetailRowProps, type DetailRowSeparator, EmptyState, type EmptyStateProps, ICON_SIZES, Icon, IconButton, type IconButtonProps, type IconButtonSize, type IconButtonVariant, type IconFamily, type IconProps, type IconSize, type IconSizeKey, Input, type InputProps, LabelValue, type LabelValueProps, ListItem, type ListItemProps, MediaCard, type MediaCardAspectRatio, type MediaCardProps, MonthPicker, type MonthPickerProps, type MonthPickerValue, Pressable, type PressableProps, Progress, type ProgressProps, RADIUS, RadioGroup, type RadioGroupProps, type RadioOption, type Radius, type RadiusKey, type ResolvedColors, SHADOWS, SPACING, Select, type SelectOption, type SelectProps, Separator, type SeparatorProps, Sheet, type SheetProps, Skeleton, type SkeletonProps, Slider, type SliderProps, type Spacing, type SpacingKey, Spinner, type SpinnerProps, type SpinnerSize, Switch, type SwitchProps, TYPOGRAPHY, 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, type Typography, type TypographyKey, defaultDark, defaultLight, deriveColors, getResponsiveFontSize, renderIcon, useTheme, useToast };
1114
+ export { Accordion, type AccordionItem, type AccordionProps, AlertBanner, type AlertBannerProps, type AlertBannerVariant, Avatar, type AvatarProps, type AvatarSize, BREAKPOINTS, Badge, type BadgeProps, type BadgeVariant, Button, ButtonGroup, type ButtonGroupProps, type ButtonProps, type ButtonSize, type ButtonVariant, Card, CardContent, type CardContentProps, CardDescription, type CardDescriptionProps, CardFooter, type CardFooterProps, CardHeader, type CardHeaderProps, type CardProps, CardTitle, type CardTitleProps, type CategoryItem, CategoryStrip, type CategoryStripProps, Checkbox, type CheckboxProps, Chip, ChipGroup, type ChipGroupProps, type ChipOption, type ChipProps, type ColorScheme, ConfirmDialog, type ConfirmDialogProps, CurrencyDisplay, type CurrencyDisplayProps, type CurrencyDisplayVariant, CurrencyInput, CurrencyInput as CurrencyInputLarge, type CurrencyInputProps, DetailRow, type DetailRowLabelWeight, type DetailRowProps, type DetailRowSeparator, EmptyState, type EmptyStateProps, ICON_SIZES, Icon, IconButton, type IconButtonProps, type IconButtonSize, type IconButtonVariant, type IconFamily, type IconProps, type IconSize, type IconSizeKey, Input, type InputProps, LabelValue, type LabelValueProps, ListItem, type ListItemProps, MediaCard, type MediaCardAspectRatio, type MediaCardProps, MenuItem, type MenuItemProps, type MenuItemVariant, MonthPicker, type MonthPickerProps, type MonthPickerValue, Pressable, type PressableProps, Progress, type ProgressProps, RADIUS, RadioGroup, type RadioGroupProps, type RadioOption, type Radius, type RadiusKey, type ResolvedColors, SHADOWS, SPACING, Select, type SelectOption, type SelectProps, Separator, type SeparatorProps, Sheet, type SheetProps, Skeleton, type SkeletonProps, Slider, type SliderProps, type Spacing, type SpacingKey, Spinner, type SpinnerProps, type SpinnerSize, Switch, type SwitchProps, TYPOGRAPHY, type TabItem, Tabs, TabsContent, type TabsContentProps, type TabsProps, Text, type TextProps, type TextVariant, Textarea, type TextareaProps, type Theme, type ThemeColors, ThemeProvider, type ThemeProviderProps, ToastProvider, Toggle, type ToggleProps, type ToggleSize, type ToggleVariant, type Typography, type TypographyKey, defaultDark, defaultLight, deriveColors, getResponsiveFontSize, renderIcon, useTheme, useToast };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  import React from 'react';
2
2
  import { TouchableOpacityProps, ViewStyle, TextProps as TextProps$1, TextInputProps, TextStyle, ActivityIndicatorProps, ImageSourcePropType } from 'react-native';
3
- export { BottomSheetModalProvider } from '@gorhom/bottom-sheet';
3
+ import * as sonner_native from 'sonner-native';
4
+ export { toast } from 'sonner-native';
5
+ export { BottomSheetModalProvider, BottomSheetTextInput as SheetTextInput } from '@gorhom/bottom-sheet';
4
6
 
5
7
  type ThemeColors = {
6
8
  background: string;
@@ -15,6 +17,12 @@ type ThemeColors = {
15
17
  successForeground: string;
16
18
  warning: string;
17
19
  warningForeground: string;
20
+ /** Backdrop/overlay color. Default: 'rgba(0,0,0,0.45)' */
21
+ overlay?: string;
22
+ /** Color accent (e.g. Airbnb coral). Default: same as primary */
23
+ accent?: string;
24
+ /** Text color on accent background. Default: same as primaryForeground */
25
+ accentForeground?: string;
18
26
  };
19
27
  type ResolvedColors = ThemeColors & {
20
28
  foregroundSubtle: string;
@@ -27,6 +35,9 @@ type ResolvedColors = ThemeColors & {
27
35
  successBorder: string;
28
36
  warningTint: string;
29
37
  warningBorder: string;
38
+ overlay: string;
39
+ accentResolved: string;
40
+ accentForegroundResolved: string;
30
41
  ring: string;
31
42
  input: string;
32
43
  };
@@ -134,6 +145,8 @@ interface InputProps extends TextInputProps {
134
145
  error?: string;
135
146
  /** Helper text shown below the input when there is no error. */
136
147
  hint?: string;
148
+ /** Disabled visual state — dimmed appearance, not editable. Also sets `editable={false}`. */
149
+ disabled?: boolean;
137
150
  /** Text or component rendered before the input text. */
138
151
  prefix?: React.ReactNode;
139
152
  /** Text or component rendered after the input text. */
@@ -163,7 +176,7 @@ interface InputProps extends TextInputProps {
163
176
  /** Style for the inner border wrapper (overrides padding, etc). */
164
177
  inputWrapperStyle?: ViewStyle;
165
178
  }
166
- declare function Input({ label, error, hint, prefix, suffix, prefixStyle, suffixStyle, prefixIcon, suffixIcon, prefixIconColor, suffixIconColor, type, containerStyle, inputWrapperStyle, style, onFocus, onBlur, secureTextEntry, ...props }: InputProps): React.JSX.Element;
179
+ declare function Input({ label, error, hint, disabled, prefix, suffix, prefixStyle, suffixStyle, prefixIcon, suffixIcon, prefixIconColor, suffixIconColor, type, containerStyle, inputWrapperStyle, style, onFocus, onBlur, secureTextEntry, editable, ...props }: InputProps): React.JSX.Element;
167
180
 
168
181
  type BadgeVariant = 'default' | 'secondary' | 'destructive' | 'outline' | 'success' | 'warning' | 'successOutline' | 'destructiveOutline' | 'warningOutline';
169
182
  type BadgeSize = 'sm' | 'md' | 'lg';
@@ -296,12 +309,17 @@ interface EmptyStateProps {
296
309
  iconColor?: string;
297
310
  title: string;
298
311
  description?: string;
312
+ /** Custom action node. Use `actionLabel` + `onAction` for a pre-built primary Button. */
299
313
  action?: React.ReactNode;
314
+ /** Label for a convenience primary Button rendered below description. Ignored in compact size. */
315
+ actionLabel?: string;
316
+ /** Called when the convenience action Button is pressed. Required when `actionLabel` is set. */
317
+ onAction?: () => void;
300
318
  /** `compact` hides description/action and uses tighter spacing and a smaller icon. */
301
319
  size?: 'default' | 'compact';
302
320
  style?: ViewStyle;
303
321
  }
304
- declare function EmptyState({ icon, iconName, iconColor, title, description, action, size, style }: EmptyStateProps): React.JSX.Element;
322
+ declare function EmptyState({ icon, iconName, iconColor, title, description, action, actionLabel, onAction, size, style }: EmptyStateProps): React.JSX.Element;
305
323
 
306
324
  interface TextareaProps extends TextInputProps {
307
325
  label?: string;
@@ -449,20 +467,57 @@ interface SheetProps {
449
467
  open: boolean;
450
468
  onClose: () => void;
451
469
  title?: string;
470
+ /** Secondary text below title. */
471
+ subtitle?: string;
472
+ /** @deprecated Use `subtitle` instead. */
452
473
  description?: string;
474
+ /** Show an X close button in the header. */
475
+ showCloseButton?: boolean;
453
476
  children?: React.ReactNode;
454
477
  /** Style for the inner content container. */
455
478
  style?: ViewStyle;
456
- /** Render children inside BottomSheetScrollView so gestures are handled correctly on both platforms. */
479
+ /** Style for the content wrapper (outside the scroll container). */
480
+ contentStyle?: ViewStyle;
481
+ /** Render children inside BottomSheetScrollView. */
457
482
  scrollable?: boolean;
458
483
  /** Cap sheet height (dp). Children scroll when content exceeds this value. */
459
484
  maxHeight?: number;
460
- /** Wrap content in KeyboardAvoidingView. Defaults to platform-appropriate behavior when set. */
461
- keyboardBehavior?: 'padding' | 'height' | 'position' | 'none';
462
- /** Extra vertical offset for the keyboard avoiding view. */
463
- keyboardOffset?: number;
485
+ /**
486
+ * Keyboard behavior how the sheet responds to keyboard appearance.
487
+ * - 'interactive': offset sheet by keyboard size (default, works on both platforms)
488
+ * - 'fillParent': extend sheet to fill parent view (can cause restore issues with dynamic sizing)
489
+ * - 'extend': extend sheet to maximum snap point
490
+ *
491
+ * Default: 'interactive' on both platforms.
492
+ */
493
+ keyboardBehavior?: 'extend' | 'fillParent' | 'interactive';
494
+ /**
495
+ * Keyboard blur behavior — what happens when keyboard dismisses.
496
+ * - 'none': do nothing
497
+ * - 'restore': restore sheet to previous position (default)
498
+ */
499
+ keyboardBlurBehavior?: 'none' | 'restore';
500
+ /**
501
+ * Blur keyboard when user starts dragging the sheet down.
502
+ * Default: true (recommended for better UX)
503
+ */
504
+ enableBlurKeyboardOnGesture?: boolean;
505
+ /**
506
+ * Android-only: defines keyboard input mode.
507
+ * - 'adjustPan': pan the sheet content (default, fixes restore issues with dynamic sizing)
508
+ * - 'adjustResize': resize the sheet container (can cause transparent gap on dismiss)
509
+ */
510
+ android_keyboardInputMode?: 'adjustPan' | 'adjustResize';
511
+ /** Sticky footer rendered below the scroll area. */
512
+ footer?: React.ReactNode;
513
+ /**
514
+ * Array of snap points for the sheet (e.g., ['50%', '85%'] or [200, 500]).
515
+ * When provided, disables enableDynamicSizing.
516
+ * When omitted, sheet uses dynamic sizing (auto-fits content).
517
+ */
518
+ snapPoints?: (string | number)[];
464
519
  }
465
- declare function Sheet({ open, onClose, title, description, children, style, scrollable, maxHeight, keyboardBehavior, keyboardOffset, }: SheetProps): React.JSX.Element;
520
+ declare function Sheet({ open, onClose, title, subtitle, description, showCloseButton, children, style, contentStyle, scrollable, maxHeight, keyboardBehavior, keyboardBlurBehavior, enableBlurKeyboardOnGesture, android_keyboardInputMode, footer, snapPoints, }: SheetProps): React.JSX.Element;
466
521
 
467
522
  interface SelectOption {
468
523
  label: string;
@@ -481,38 +536,47 @@ interface SelectProps {
481
536
  }
482
537
  declare function Select({ options, value, onValueChange, placeholder, label, error, disabled, style, }: SelectProps): React.JSX.Element;
483
538
 
484
- type ToastVariant = 'default' | 'destructive' | 'success' | 'warning';
485
- interface ToastAction {
486
- label: string;
487
- onPress: () => void;
488
- }
489
- interface ToastItem {
490
- id: string;
491
- title?: string;
492
- description?: string;
493
- variant?: ToastVariant;
494
- icon?: React.ReactNode;
495
- iconName?: string;
496
- iconColor?: string;
497
- /** Auto-dismiss delay in milliseconds. Defaults to `3000`. */
498
- duration?: number;
499
- /** Optional inline action button rendered at the end of the toast. */
500
- action?: ToastAction;
501
- }
502
- interface ToastContextValue {
503
- toast: (item: Omit<ToastItem, 'id'>) => void;
504
- dismiss: (id: string) => void;
505
- }
506
- declare function useToast(): ToastContextValue;
507
- /**
508
- * Must wrap the app root alongside ThemeProvider.
509
- * Renders toasts in an absolute overlay at the top of the screen.
510
- * Use `useToast()` anywhere inside to trigger toasts.
511
- */
512
- interface ToastProviderProps {
539
+ declare function useToast(): {
540
+ toast: ((message: string, data?: Omit<sonner_native.ToastProps, "title" | "type" | "variant" | "id" | "jsx" | "promise"> & {
541
+ id?: string | number;
542
+ }) => string | number) & {
543
+ success: (message: string, data?: Omit<sonner_native.ToastProps, "title" | "type" | "variant" | "id" | "jsx" | "promise"> & {
544
+ id?: string | number;
545
+ }) => string | number;
546
+ info: (message: string, data?: Omit<sonner_native.ToastProps, "title" | "type" | "variant" | "id" | "jsx" | "promise"> & {
547
+ id?: string | number;
548
+ }) => string | number;
549
+ error: (message: string, data?: Omit<sonner_native.ToastProps, "title" | "type" | "variant" | "id" | "jsx" | "promise"> & {
550
+ id?: string | number;
551
+ }) => string | number;
552
+ warning: (message: string, data?: Omit<sonner_native.ToastProps, "title" | "type" | "variant" | "id" | "jsx" | "promise"> & {
553
+ id?: string | number;
554
+ }) => string | number;
555
+ custom: (jsx: React.ReactElement, data?: Omit<sonner_native.ToastProps, "title" | "type" | "variant" | "id" | "jsx" | "promise"> & {
556
+ id?: string | number;
557
+ }) => string | number;
558
+ promise: <T>(promise: Promise<T>, options: Omit<{
559
+ promise: Promise<unknown>;
560
+ success: (result: any) => string;
561
+ error: ((error: unknown) => string) | string;
562
+ loading: string;
563
+ styles?: {
564
+ loading?: sonner_native.ToastStyles;
565
+ success?: sonner_native.ToastStyles;
566
+ error?: sonner_native.ToastStyles;
567
+ };
568
+ }, "promise">) => string | number;
569
+ loading: (message: string, data?: Omit<sonner_native.ToastProps, "title" | "type" | "variant" | "id" | "jsx" | "promise"> & {
570
+ id?: string | number;
571
+ }) => string | number;
572
+ dismiss: (id?: string | number) => string | number | undefined;
573
+ wiggle: (id: string | number) => void;
574
+ };
575
+ dismiss: (id?: string | number) => string | number | undefined;
576
+ };
577
+ declare function ToastProvider({ children }: {
513
578
  children: React.ReactNode;
514
- }
515
- declare function ToastProvider({ children }: ToastProviderProps): React.JSX.Element;
579
+ }): React.JSX.Element;
516
580
 
517
581
  interface CurrencyInputProps {
518
582
  value?: string;
@@ -612,6 +676,47 @@ interface ListItemProps {
612
676
  }
613
677
  declare function ListItem({ leftRender, rightRender, trailing, icon, leftIcon, rightIcon, leftIconColor, rightIconColor, title, subtitle, caption, variant, showChevron, showSeparator, onPress, disabled, style, titleStyle, subtitleStyle, captionStyle, }: ListItemProps): React.JSX.Element;
614
678
 
679
+ type MenuItemVariant = 'plain' | 'card';
680
+ interface MenuItemProps {
681
+ label: string;
682
+ /** Secondary text rendered below the label. */
683
+ subtitle?: string;
684
+ /**
685
+ * Icon name from `@expo/vector-icons` rendered on the left.
686
+ * See https://icons.expo.fyi.
687
+ */
688
+ iconName?: string;
689
+ /** Custom icon node rendered on the left. */
690
+ icon?: React.ReactNode;
691
+ /** Override icon color. Defaults to `foreground`. */
692
+ iconColor?: string;
693
+ /**
694
+ * Custom content rendered on the right.
695
+ * When provided, replaces the default chevron.
696
+ * Use for checkboxes, switches, badges, or other controls.
697
+ */
698
+ rightRender?: React.ReactNode;
699
+ /**
700
+ * Show chevron on the right. Defaults to `true`.
701
+ * Ignored when `rightRender` is provided.
702
+ */
703
+ showChevron?: boolean;
704
+ onPress: () => void;
705
+ disabled?: boolean;
706
+ /**
707
+ * - `plain` (default): no background — sits inside a parent surface.
708
+ * - `card`: standalone surface with background + border.
709
+ */
710
+ variant?: MenuItemVariant;
711
+ /** Visual separator line at the bottom. */
712
+ showSeparator?: boolean;
713
+ /** Style applied to the outer container. */
714
+ style?: ViewStyle;
715
+ /** Style applied to the label Text. */
716
+ labelStyle?: TextStyle;
717
+ }
718
+ declare function MenuItem({ label, subtitle, iconName, icon, iconColor, rightRender, showChevron, onPress, disabled, variant, showSeparator, style, labelStyle, }: MenuItemProps): React.JSX.Element;
719
+
615
720
  interface ChipProps {
616
721
  label: string;
617
722
  selected?: boolean;
@@ -762,11 +867,11 @@ type DetailRowSeparator = 'dotted' | 'solid' | 'dashed' | 'none';
762
867
  type DetailRowLabelWeight = 'normal' | 'medium' | 'semibold' | 'bold';
763
868
  interface DetailRowProps {
764
869
  label: React.ReactNode;
765
- value: string;
870
+ value: string | React.ReactNode;
766
871
  /** Dotted/dashed/solid line between label and value. Defaults to 'dotted'. */
767
872
  separator?: DetailRowSeparator;
768
873
  labelWeight?: DetailRowLabelWeight;
769
- /** Semantic color key or hex string for value text. */
874
+ /** Semantic color key or hex string for value text. Only applies when value is a string. */
770
875
  valueColor?: string;
771
876
  /** Node rendered left of the label (e.g. Avatar, Icon). */
772
877
  leftIcon?: React.ReactNode;
@@ -780,6 +885,7 @@ interface DetailRowProps {
780
885
  rightIconColor?: string;
781
886
  style?: ViewStyle;
782
887
  labelStyle?: TextStyle;
888
+ /** Only applies when value is a string. */
783
889
  valueStyle?: TextStyle;
784
890
  }
785
891
  declare function DetailRow({ label, value, separator, labelWeight, valueColor, leftIcon, leftIconName, leftIconColor, rightIconName, rightIconColor, style, labelStyle, valueStyle, }: DetailRowProps): React.JSX.Element;
@@ -975,10 +1081,10 @@ declare const TYPOGRAPHY: {
975
1081
  };
976
1082
  readonly 'uppercase-tag': {
977
1083
  readonly fontFamily: "Poppins-Bold";
978
- readonly fontSize: 8;
1084
+ readonly fontSize: 10;
979
1085
  readonly fontWeight: "700";
980
- readonly lineHeight: 10;
981
- readonly letterSpacing: 0.32;
1086
+ readonly lineHeight: 13;
1087
+ readonly letterSpacing: 0.8;
982
1088
  readonly textTransform: "uppercase";
983
1089
  };
984
1090
  readonly 'button-lg': {
@@ -1005,4 +1111,4 @@ type RadiusKey = keyof Radius;
1005
1111
  type Typography = typeof TYPOGRAPHY;
1006
1112
  type TypographyKey = keyof Typography;
1007
1113
 
1008
- export { Accordion, type AccordionItem, type AccordionProps, AlertBanner, type AlertBannerProps, type AlertBannerVariant, Avatar, type AvatarProps, type AvatarSize, BREAKPOINTS, Badge, type BadgeProps, type BadgeVariant, Button, ButtonGroup, type ButtonGroupProps, type ButtonProps, type ButtonSize, type ButtonVariant, Card, CardContent, type CardContentProps, CardDescription, type CardDescriptionProps, CardFooter, type CardFooterProps, CardHeader, type CardHeaderProps, type CardProps, CardTitle, type CardTitleProps, type CategoryItem, CategoryStrip, type CategoryStripProps, Checkbox, type CheckboxProps, Chip, ChipGroup, type ChipGroupProps, type ChipOption, type ChipProps, type ColorScheme, ConfirmDialog, type ConfirmDialogProps, CurrencyDisplay, type CurrencyDisplayProps, type CurrencyDisplayVariant, CurrencyInput, CurrencyInput as CurrencyInputLarge, type CurrencyInputProps, DetailRow, type DetailRowLabelWeight, type DetailRowProps, type DetailRowSeparator, EmptyState, type EmptyStateProps, ICON_SIZES, Icon, IconButton, type IconButtonProps, type IconButtonSize, type IconButtonVariant, type IconFamily, type IconProps, type IconSize, type IconSizeKey, Input, type InputProps, LabelValue, type LabelValueProps, ListItem, type ListItemProps, MediaCard, type MediaCardAspectRatio, type MediaCardProps, MonthPicker, type MonthPickerProps, type MonthPickerValue, Pressable, type PressableProps, Progress, type ProgressProps, RADIUS, RadioGroup, type RadioGroupProps, type RadioOption, type Radius, type RadiusKey, type ResolvedColors, SHADOWS, SPACING, Select, type SelectOption, type SelectProps, Separator, type SeparatorProps, Sheet, type SheetProps, Skeleton, type SkeletonProps, Slider, type SliderProps, type Spacing, type SpacingKey, Spinner, type SpinnerProps, type SpinnerSize, Switch, type SwitchProps, TYPOGRAPHY, 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, type Typography, type TypographyKey, defaultDark, defaultLight, deriveColors, getResponsiveFontSize, renderIcon, useTheme, useToast };
1114
+ export { Accordion, type AccordionItem, type AccordionProps, AlertBanner, type AlertBannerProps, type AlertBannerVariant, Avatar, type AvatarProps, type AvatarSize, BREAKPOINTS, Badge, type BadgeProps, type BadgeVariant, Button, ButtonGroup, type ButtonGroupProps, type ButtonProps, type ButtonSize, type ButtonVariant, Card, CardContent, type CardContentProps, CardDescription, type CardDescriptionProps, CardFooter, type CardFooterProps, CardHeader, type CardHeaderProps, type CardProps, CardTitle, type CardTitleProps, type CategoryItem, CategoryStrip, type CategoryStripProps, Checkbox, type CheckboxProps, Chip, ChipGroup, type ChipGroupProps, type ChipOption, type ChipProps, type ColorScheme, ConfirmDialog, type ConfirmDialogProps, CurrencyDisplay, type CurrencyDisplayProps, type CurrencyDisplayVariant, CurrencyInput, CurrencyInput as CurrencyInputLarge, type CurrencyInputProps, DetailRow, type DetailRowLabelWeight, type DetailRowProps, type DetailRowSeparator, EmptyState, type EmptyStateProps, ICON_SIZES, Icon, IconButton, type IconButtonProps, type IconButtonSize, type IconButtonVariant, type IconFamily, type IconProps, type IconSize, type IconSizeKey, Input, type InputProps, LabelValue, type LabelValueProps, ListItem, type ListItemProps, MediaCard, type MediaCardAspectRatio, type MediaCardProps, MenuItem, type MenuItemProps, type MenuItemVariant, MonthPicker, type MonthPickerProps, type MonthPickerValue, Pressable, type PressableProps, Progress, type ProgressProps, RADIUS, RadioGroup, type RadioGroupProps, type RadioOption, type Radius, type RadiusKey, type ResolvedColors, SHADOWS, SPACING, Select, type SelectOption, type SelectProps, Separator, type SeparatorProps, Sheet, type SheetProps, Skeleton, type SkeletonProps, Slider, type SliderProps, type Spacing, type SpacingKey, Spinner, type SpinnerProps, type SpinnerSize, Switch, type SwitchProps, TYPOGRAPHY, type TabItem, Tabs, TabsContent, type TabsContentProps, type TabsProps, Text, type TextProps, type TextVariant, Textarea, type TextareaProps, type Theme, type ThemeColors, ThemeProvider, type ThemeProviderProps, ToastProvider, Toggle, type ToggleProps, type ToggleSize, type ToggleVariant, type Typography, type TypographyKey, defaultDark, defaultLight, deriveColors, getResponsiveFontSize, renderIcon, useTheme, useToast };