@retray-dev/ui-kit 6.0.0 → 6.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.
Files changed (33) hide show
  1. package/COMPONENTS.md +8 -7
  2. package/dist/index.d.mts +47 -23
  3. package/dist/index.d.ts +47 -23
  4. package/dist/index.js +702 -634
  5. package/dist/index.mjs +695 -627
  6. package/package.json +1 -1
  7. package/src/components/Accordion/Accordion.tsx +10 -12
  8. package/src/components/Button/Button.tsx +20 -18
  9. package/src/components/Card/Card.tsx +21 -33
  10. package/src/components/CategoryStrip/CategoryStrip.tsx +45 -38
  11. package/src/components/Checkbox/Checkbox.tsx +31 -50
  12. package/src/components/Chip/Chip.tsx +34 -71
  13. package/src/components/DetailRow/DetailRow.tsx +13 -8
  14. package/src/components/IconButton/IconButton.tsx +20 -18
  15. package/src/components/Input/Input.tsx +39 -22
  16. package/src/components/ListItem/ListItem.tsx +22 -34
  17. package/src/components/MediaCard/MediaCard.tsx +24 -24
  18. package/src/components/MenuItem/MenuItem.tsx +52 -39
  19. package/src/components/MonthPicker/MonthPicker.tsx +12 -2
  20. package/src/components/Pressable/Pressable.tsx +27 -46
  21. package/src/components/Progress/Progress.tsx +21 -12
  22. package/src/components/RadioGroup/RadioGroup.tsx +52 -26
  23. package/src/components/Select/Select.tsx +17 -15
  24. package/src/components/Sheet/Sheet.tsx +4 -1
  25. package/src/components/Skeleton/Skeleton.tsx +24 -13
  26. package/src/components/Slider/Slider.tsx +11 -1
  27. package/src/components/Switch/Switch.tsx +44 -49
  28. package/src/components/Tabs/Tabs.tsx +39 -31
  29. package/src/components/Textarea/Textarea.tsx +29 -12
  30. package/src/components/Toggle/Toggle.tsx +39 -45
  31. package/src/utils/animations.ts +58 -0
  32. package/src/utils/useColorTransition.ts +40 -0
  33. package/src/utils/usePressScale.ts +73 -0
package/COMPONENTS.md CHANGED
@@ -1,4 +1,4 @@
1
- # @retray-dev/ui-kit — Component Reference (v6.0.0)
1
+ # @retray-dev/ui-kit — Component Reference (v6.2.0)
2
2
 
3
3
  This file is the AI reference for this package. It is shipped inside the npm package so consuming projects can import it into their `CLAUDE.md` with:
4
4
 
@@ -359,7 +359,7 @@ const styles = StyleSheet.create({
359
359
  ```tsx
360
360
  import { MenuItem } from '@retray-dev/ui-kit'
361
361
  // variants: 'plain' (default) | 'card'
362
- <MenuItem label="Profile" iconName="user" onPress={() => {}} />
362
+ <MenuItem label="Profile" subtitle="Edit your details" iconName="user" onPress={() => {}} />
363
363
  <MenuItem label="Notifications" iconName="bell" rightRender={<Switch value={on} onValueChange={setOn} />} showChevron={false} onPress={() => {}} />
364
364
  ```
365
365
 
@@ -517,9 +517,9 @@ Access resolved values via `useTheme().colors.overlay`, `.accentResolved`, `.acc
517
517
 
518
518
  **Shape:** `borderRadius: RADIUS.md = 14px` — Airbnb-aligned rounded rect on all variants. Exception: `IconButton` uses `RADIUS.full` (perfect circle).
519
519
 
520
- **Animations:** Scale springs to 0.95 on `onPressIn`, back to 1.0 on `onPressOut`.
520
+ **Animations:** `usePressScale` hook — Reanimated v4, UI thread. Scale springs to 0.95 (`SPRINGS.pressIn`) on `onPressIn`, back to 1.0 (`SPRINGS.pressOut`) on `onPressOut`. Web: hover scale 1.02.
521
521
 
522
- **Haptics:** `impactLight` on every press.
522
+ **Haptics:** `impactMedium` on every press.
523
523
 
524
524
  **Examples:**
525
525
  ```tsx
@@ -2301,13 +2301,14 @@ dismiss(id)
2301
2301
 
2302
2302
  **Import:** `import { MenuItem } from '@retray-dev/ui-kit'`
2303
2303
 
2304
- **When to use:** Settings screens, navigation lists, menu entries — icon + label + optional right content. Purpose-built for Airbnb-style settings rows. Use `ListItem` when you need subtitle, caption, or more complex layouts.
2304
+ **When to use:** Settings screens, navigation lists, menu entries — icon + label + optional subtitle + optional right content. Purpose-built for Airbnb-style settings rows. Use `ListItem` when you need caption, metadata rows, or more complex layouts beyond label+subtitle.
2305
2305
 
2306
2306
  **Important:** MenuItem has **zero horizontal padding** by design — the consumer controls spacing. Wrap in a container with padding for standalone use, or use `variant="card"` for auto-styled surfaces.
2307
2307
 
2308
2308
  | Prop | Type | Default | Notes |
2309
2309
  |------|------|---------|-------|
2310
2310
  | label | `string` | required | Row label |
2311
+ | subtitle | `string` | — | Secondary text below label. Uses `mutedForeground` color |
2311
2312
  | iconName | `string` | — | Icon from `@expo/vector-icons`. Auto-resolved across all 6 families |
2312
2313
  | icon | `ReactNode` | — | Custom icon (used if `iconName` not set) |
2313
2314
  | iconColor | `string` | — | Override icon color. Defaults to `foreground` |
@@ -2324,14 +2325,14 @@ dismiss(id)
2324
2325
  - Height: 54dp — consistent settings row
2325
2326
  - Chevron: shown by default (`showChevron={true}`). Can be replaced via `rightRender` prop
2326
2327
  - `rightRender` — arbitrary right slot content (Switch, Checkbox, Badge, etc). When set, chevron is hidden
2327
- - Press scale: 0.97 spring (`stiffness: 350, damping: 28, mass: 0.9`)
2328
+ - Press scale: 0.97 (`PRESS_SCALE.row`) via `usePressScale` with `SPRINGS.surfacePressIn/Out` — Reanimated v4, UI thread
2328
2329
  - Haptics: `selectionAsync` on press
2329
2330
 
2330
2331
  **Example:**
2331
2332
  ```tsx
2332
2333
  // Settings screen (wrap in container with padding)
2333
2334
  <View style={{ padding: 16, backgroundColor: colors.card, borderRadius: 12 }}>
2334
- <MenuItem label="Personal info" iconName="user" onPress={() => navigate('profile')} showSeparator />
2335
+ <MenuItem label="Personal info" subtitle="Name, email, phone" iconName="user" onPress={() => navigate('profile')} showSeparator />
2335
2336
  <MenuItem label="Security" iconName="shield" onPress={() => navigate('security')} showSeparator />
2336
2337
  <MenuItem label="Privacy" iconName="lock" onPress={() => navigate('privacy')} showSeparator />
2337
2338
  <MenuItem
package/dist/index.d.mts CHANGED
@@ -91,7 +91,7 @@ interface ButtonProps extends TouchableOpacityProps {
91
91
  iconColor?: string;
92
92
  iconPosition?: 'left' | 'right';
93
93
  }
94
- declare function Button({ label, variant, size, loading, fullWidth, icon, iconName, iconColor, iconPosition, disabled, style, onPress, ...props }: ButtonProps): React.JSX.Element;
94
+ declare function Button({ label, variant, size, loading, fullWidth, icon, iconName, iconColor, iconPosition, disabled, style, onPress, accessibilityLabel, accessibilityHint, ...props }: ButtonProps): React.JSX.Element;
95
95
 
96
96
  interface ButtonGroupProps {
97
97
  children: React.ReactNode;
@@ -130,7 +130,7 @@ interface IconButtonProps extends TouchableOpacityProps {
130
130
  */
131
131
  badge?: boolean | number;
132
132
  }
133
- declare function IconButton({ iconName, icon, iconColor, variant, size, loading, badge, disabled, style, onPress, ...props }: IconButtonProps): React.JSX.Element;
133
+ declare function IconButton({ iconName, icon, iconColor, variant, size, loading, badge, disabled, style, onPress, accessibilityLabel, accessibilityHint, ...props }: IconButtonProps): React.JSX.Element;
134
134
 
135
135
  type TextVariant = 'display-hero' | 'display-xl' | 'display-lg' | 'display-md' | 'display-sm' | 'title-md' | 'title-sm' | 'body-md' | 'body-sm' | 'caption' | 'caption-sm' | 'badge-text' | 'micro-label' | 'uppercase-tag' | 'button-lg' | 'button-sm';
136
136
  interface TextProps extends TextProps$1 {
@@ -176,7 +176,7 @@ interface InputProps extends TextInputProps {
176
176
  /** Style for the inner border wrapper (overrides padding, etc). */
177
177
  inputWrapperStyle?: ViewStyle;
178
178
  }
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;
179
+ declare function Input({ label, error, hint, disabled, prefix, suffix, prefixStyle, suffixStyle, prefixIcon, suffixIcon, prefixIconColor, suffixIconColor, type, containerStyle, inputWrapperStyle, style, onFocus, onBlur, secureTextEntry, editable, accessibilityLabel, ...props }: InputProps): React.JSX.Element;
180
180
 
181
181
  type BadgeVariant = 'default' | 'secondary' | 'destructive' | 'outline' | 'success' | 'warning' | 'successOutline' | 'destructiveOutline' | 'warningOutline';
182
182
  type BadgeSize = 'sm' | 'md' | 'lg';
@@ -202,11 +202,13 @@ declare function Badge({ label, children, variant, size, icon, iconName, iconCol
202
202
  type CardVariant = 'elevated' | 'outlined' | 'filled';
203
203
  interface CardProps {
204
204
  children: React.ReactNode;
205
- /** Visual style variant. `'elevated'` (default) has shadow, `'outlined'` has border only, `'filled'` uses accent background. */
205
+ /** Visual style variant. `'elevated'` (default) has shadow, `'outlined'` has border only, `'filled'` uses accent background. */
206
206
  variant?: CardVariant;
207
207
  /** Makes the card tappable. Adds press animation and haptic feedback. */
208
208
  onPress?: () => void;
209
209
  style?: ViewStyle;
210
+ /** Accessibility label for the card (when interactive). */
211
+ accessibilityLabel?: string;
210
212
  }
211
213
  interface CardHeaderProps {
212
214
  children: React.ReactNode;
@@ -228,7 +230,7 @@ interface CardFooterProps {
228
230
  children: React.ReactNode;
229
231
  style?: ViewStyle;
230
232
  }
231
- declare function Card({ children, variant, onPress, style }: CardProps): React.JSX.Element;
233
+ declare function Card({ children, variant, onPress, style, accessibilityLabel }: CardProps): React.JSX.Element;
232
234
  declare function CardHeader({ children, style }: CardHeaderProps): React.JSX.Element;
233
235
  declare function CardTitle({ children, style }: CardTitleProps): React.JSX.Element;
234
236
  declare function CardDescription({ children, style }: CardDescriptionProps): React.JSX.Element;
@@ -295,8 +297,9 @@ interface ProgressProps {
295
297
  max?: number;
296
298
  variant?: ProgressVariant;
297
299
  style?: ViewStyle;
300
+ accessibilityLabel?: string;
298
301
  }
299
- declare function Progress({ value, max, variant, style }: ProgressProps): React.JSX.Element;
302
+ declare function Progress({ value, max, variant, style, accessibilityLabel }: ProgressProps): React.JSX.Element;
300
303
 
301
304
  interface EmptyStateProps {
302
305
  icon?: React.ReactNode;
@@ -338,7 +341,7 @@ interface TextareaProps extends TextInputProps {
338
341
  /** Style for the outer container `View`. Use `style` (from `TextInputProps`) to style the `TextInput` itself. */
339
342
  containerStyle?: ViewStyle;
340
343
  }
341
- declare function Textarea({ label, error, hint, rows, prefixIcon, prefixIconNode, prefixIconColor, containerStyle, style, onFocus, onBlur, ...props }: TextareaProps): React.JSX.Element;
344
+ declare function Textarea({ label, error, hint, rows, prefixIcon, prefixIconNode, prefixIconColor, containerStyle, style, onFocus, onBlur, accessibilityLabel, ...props }: TextareaProps): React.JSX.Element;
342
345
 
343
346
  interface CheckboxProps {
344
347
  checked?: boolean;
@@ -346,16 +349,18 @@ interface CheckboxProps {
346
349
  label?: string;
347
350
  disabled?: boolean;
348
351
  style?: ViewStyle;
352
+ accessibilityLabel?: string;
349
353
  }
350
- declare function Checkbox({ checked, onCheckedChange, label, disabled, style, }: CheckboxProps): React.JSX.Element;
354
+ declare function Checkbox({ checked, onCheckedChange, label, disabled, style, accessibilityLabel, }: CheckboxProps): React.JSX.Element;
351
355
 
352
356
  interface SwitchProps {
353
357
  checked?: boolean;
354
358
  onCheckedChange?: (checked: boolean) => void;
355
359
  disabled?: boolean;
356
360
  style?: ViewStyle;
361
+ accessibilityLabel?: string;
357
362
  }
358
- declare function Switch({ checked, onCheckedChange, disabled, style }: SwitchProps): React.JSX.Element;
363
+ declare function Switch({ checked, onCheckedChange, disabled, style, accessibilityLabel }: SwitchProps): React.JSX.Element;
359
364
 
360
365
  type ToggleVariant = 'default' | 'outline';
361
366
  type ToggleSize = 'sm' | 'md' | 'lg';
@@ -384,7 +389,7 @@ interface ToggleProps extends TouchableOpacityProps {
384
389
  /** Override the resolved active icon color. Defaults to `primary`. */
385
390
  activeIconColor?: string;
386
391
  }
387
- declare function Toggle({ pressed, onPressedChange, variant, size, label, icon, activeIcon, iconName, activeIconName, iconColor, activeIconColor, disabled, style, ...props }: ToggleProps): React.JSX.Element;
392
+ declare function Toggle({ pressed, onPressedChange, variant, size, label, icon, activeIcon, iconName, activeIconName, iconColor, activeIconColor, disabled, style, accessibilityLabel, ...props }: ToggleProps): React.JSX.Element;
388
393
 
389
394
  interface RadioOption {
390
395
  label: string;
@@ -397,8 +402,9 @@ interface RadioGroupProps {
397
402
  onValueChange?: (value: string) => void;
398
403
  orientation?: 'vertical' | 'horizontal';
399
404
  style?: ViewStyle;
405
+ accessibilityLabel?: string;
400
406
  }
401
- declare function RadioGroup({ options, value, onValueChange, orientation, style, }: RadioGroupProps): React.JSX.Element;
407
+ declare function RadioGroup({ options, value, onValueChange, orientation, style, accessibilityLabel, }: RadioGroupProps): React.JSX.Element;
402
408
 
403
409
  interface TabItem {
404
410
  label: string;
@@ -533,8 +539,9 @@ interface SelectProps {
533
539
  error?: string;
534
540
  disabled?: boolean;
535
541
  style?: ViewStyle;
542
+ accessibilityLabel?: string;
536
543
  }
537
- declare function Select({ options, value, onValueChange, placeholder, label, error, disabled, style, }: SelectProps): React.JSX.Element;
544
+ declare function Select({ options, value, onValueChange, placeholder, label, error, disabled, style, accessibilityLabel, }: SelectProps): React.JSX.Element;
538
545
 
539
546
  declare function useToast(): {
540
547
  toast: ((message: string, data?: Omit<sonner_native.ToastProps, "title" | "type" | "variant" | "id" | "jsx" | "promise"> & {
@@ -673,12 +680,16 @@ interface ListItemProps {
673
680
  subtitleStyle?: TextStyle;
674
681
  /** Style applied to the caption Text. */
675
682
  captionStyle?: TextStyle;
683
+ /** Accessibility label override. Defaults to the title. */
684
+ accessibilityLabel?: string;
676
685
  }
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;
686
+ declare function ListItem({ leftRender, rightRender, trailing, icon, leftIcon, rightIcon, leftIconColor, rightIconColor, title, subtitle, caption, variant, showChevron, showSeparator, onPress, disabled, style, titleStyle, subtitleStyle, captionStyle, accessibilityLabel, }: ListItemProps): React.JSX.Element;
678
687
 
679
688
  type MenuItemVariant = 'plain' | 'card';
680
689
  interface MenuItemProps {
681
690
  label: string;
691
+ /** Secondary text rendered below the label. */
692
+ subtitle?: string;
682
693
  /**
683
694
  * Icon name from `@expo/vector-icons` rendered on the left.
684
695
  * See https://icons.expo.fyi.
@@ -712,8 +723,10 @@ interface MenuItemProps {
712
723
  style?: ViewStyle;
713
724
  /** Style applied to the label Text. */
714
725
  labelStyle?: TextStyle;
726
+ /** Accessibility label override. Defaults to label. */
727
+ accessibilityLabel?: string;
715
728
  }
716
- declare function MenuItem({ label, iconName, icon, iconColor, rightRender, showChevron, onPress, disabled, variant, showSeparator, style, labelStyle, }: MenuItemProps): React.JSX.Element;
729
+ declare function MenuItem({ label, subtitle, iconName, icon, iconColor, rightRender, showChevron, onPress, disabled, variant, showSeparator, style, labelStyle, accessibilityLabel, }: MenuItemProps): React.JSX.Element;
717
730
 
718
731
  interface ChipProps {
719
732
  label: string;
@@ -724,6 +737,7 @@ interface ChipProps {
724
737
  /** Icon name from @expo/vector-icons resolved automatically. */
725
738
  iconName?: string;
726
739
  style?: ViewStyle;
740
+ accessibilityLabel?: string;
727
741
  }
728
742
  interface ChipOption {
729
743
  label: string;
@@ -742,7 +756,7 @@ interface ChipGroupProps {
742
756
  multiSelect?: boolean;
743
757
  style?: ViewStyle;
744
758
  }
745
- declare function Chip({ label, selected, onPress, icon, iconName, style }: ChipProps): React.JSX.Element;
759
+ declare function Chip({ label, selected, onPress, icon, iconName, style, accessibilityLabel }: ChipProps): React.JSX.Element;
746
760
  declare function ChipGroup({ options, value, onValueChange, multiSelect, style }: ChipGroupProps): React.JSX.Element;
747
761
 
748
762
  interface ConfirmDialogProps {
@@ -813,8 +827,10 @@ interface MediaCardProps {
813
827
  imageStyle?: ViewStyle;
814
828
  /** Additional content rendered below caption. */
815
829
  footer?: React.ReactNode;
830
+ /** Accessibility label override. Defaults to title (and subtitle if present). */
831
+ accessibilityLabel?: string;
816
832
  }
817
- declare function MediaCard({ imageSource, aspectRatio, badge, actionIcon, actionIconName, actionActive, onActionPress, title, subtitle, caption, onPress, style, imageStyle, footer, }: MediaCardProps): React.JSX.Element;
833
+ declare function MediaCard({ imageSource, aspectRatio, badge, actionIcon, actionIconName, actionActive, onActionPress, title, subtitle, caption, onPress, style, imageStyle, footer, accessibilityLabel, }: MediaCardProps): React.JSX.Element;
818
834
 
819
835
  interface CategoryItem {
820
836
  label: string;
@@ -834,8 +850,9 @@ interface CategoryStripProps {
834
850
  style?: ViewStyle;
835
851
  /** Style applied to each pill item. */
836
852
  itemStyle?: ViewStyle;
853
+ accessibilityLabel?: string;
837
854
  }
838
- declare function CategoryStrip({ categories, value, onValueChange, multiSelect, style, itemStyle, }: CategoryStripProps): React.JSX.Element;
855
+ declare function CategoryStrip({ categories, value, onValueChange, multiSelect, style, itemStyle, accessibilityLabel, }: CategoryStripProps): React.JSX.Element;
839
856
 
840
857
  interface PressableProps extends Omit<TouchableOpacityProps, 'activeOpacity'> {
841
858
  /** Children content to render inside the pressable. */
@@ -844,7 +861,10 @@ interface PressableProps extends Omit<TouchableOpacityProps, 'activeOpacity'> {
844
861
  onPress?: () => void;
845
862
  /** Scale value on press. Defaults to `0.98` (MediaCard-style). */
846
863
  pressScale?: number;
847
- /** Bounciness of the spring animation on release. Defaults to `4`. */
864
+ /**
865
+ * @deprecated Use Reanimated spring config via `pressOutSpring` instead. Ignored.
866
+ * Kept for backwards compatibility with v6.x consumers.
867
+ */
848
868
  bounciness?: number;
849
869
  /** Enable haptic feedback on press. Defaults to `true`. */
850
870
  haptics?: boolean;
@@ -856,20 +876,23 @@ interface PressableProps extends Omit<TouchableOpacityProps, 'activeOpacity'> {
856
876
  hoverScale?: number;
857
877
  }
858
878
  /**
859
- * Generic pressable with beautiful spring bounce effect matching MediaCard interaction.
860
- * Use for custom pressable content that needs consistent press feel.
879
+ * Generic pressable with a calibrated spring bounce Apple HIG / Airbnb feel.
880
+ * All animation runs on the UI thread via Reanimated v4 worklets.
881
+ *
882
+ * Use this for any custom pressable surface that needs consistent press feel
883
+ * (cards, list rows, image tiles, etc).
861
884
  */
862
- declare function Pressable({ children, onPress, pressScale, bounciness, haptics, style, disabled, hoverScale, ...touchableProps }: PressableProps): React.JSX.Element;
885
+ declare function Pressable({ children, onPress, pressScale, haptics, style, disabled, hoverScale, ...touchableProps }: PressableProps): React.JSX.Element;
863
886
 
864
887
  type DetailRowSeparator = 'dotted' | 'solid' | 'dashed' | 'none';
865
888
  type DetailRowLabelWeight = 'normal' | 'medium' | 'semibold' | 'bold';
866
889
  interface DetailRowProps {
867
890
  label: React.ReactNode;
868
- value: string;
891
+ value: string | React.ReactNode;
869
892
  /** Dotted/dashed/solid line between label and value. Defaults to 'dotted'. */
870
893
  separator?: DetailRowSeparator;
871
894
  labelWeight?: DetailRowLabelWeight;
872
- /** Semantic color key or hex string for value text. */
895
+ /** Semantic color key or hex string for value text. Only applies when value is a string. */
873
896
  valueColor?: string;
874
897
  /** Node rendered left of the label (e.g. Avatar, Icon). */
875
898
  leftIcon?: React.ReactNode;
@@ -883,6 +906,7 @@ interface DetailRowProps {
883
906
  rightIconColor?: string;
884
907
  style?: ViewStyle;
885
908
  labelStyle?: TextStyle;
909
+ /** Only applies when value is a string. */
886
910
  valueStyle?: TextStyle;
887
911
  }
888
912
  declare function DetailRow({ label, value, separator, labelWeight, valueColor, leftIcon, leftIconName, leftIconColor, rightIconName, rightIconColor, style, labelStyle, valueStyle, }: DetailRowProps): React.JSX.Element;
package/dist/index.d.ts CHANGED
@@ -91,7 +91,7 @@ interface ButtonProps extends TouchableOpacityProps {
91
91
  iconColor?: string;
92
92
  iconPosition?: 'left' | 'right';
93
93
  }
94
- declare function Button({ label, variant, size, loading, fullWidth, icon, iconName, iconColor, iconPosition, disabled, style, onPress, ...props }: ButtonProps): React.JSX.Element;
94
+ declare function Button({ label, variant, size, loading, fullWidth, icon, iconName, iconColor, iconPosition, disabled, style, onPress, accessibilityLabel, accessibilityHint, ...props }: ButtonProps): React.JSX.Element;
95
95
 
96
96
  interface ButtonGroupProps {
97
97
  children: React.ReactNode;
@@ -130,7 +130,7 @@ interface IconButtonProps extends TouchableOpacityProps {
130
130
  */
131
131
  badge?: boolean | number;
132
132
  }
133
- declare function IconButton({ iconName, icon, iconColor, variant, size, loading, badge, disabled, style, onPress, ...props }: IconButtonProps): React.JSX.Element;
133
+ declare function IconButton({ iconName, icon, iconColor, variant, size, loading, badge, disabled, style, onPress, accessibilityLabel, accessibilityHint, ...props }: IconButtonProps): React.JSX.Element;
134
134
 
135
135
  type TextVariant = 'display-hero' | 'display-xl' | 'display-lg' | 'display-md' | 'display-sm' | 'title-md' | 'title-sm' | 'body-md' | 'body-sm' | 'caption' | 'caption-sm' | 'badge-text' | 'micro-label' | 'uppercase-tag' | 'button-lg' | 'button-sm';
136
136
  interface TextProps extends TextProps$1 {
@@ -176,7 +176,7 @@ interface InputProps extends TextInputProps {
176
176
  /** Style for the inner border wrapper (overrides padding, etc). */
177
177
  inputWrapperStyle?: ViewStyle;
178
178
  }
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;
179
+ declare function Input({ label, error, hint, disabled, prefix, suffix, prefixStyle, suffixStyle, prefixIcon, suffixIcon, prefixIconColor, suffixIconColor, type, containerStyle, inputWrapperStyle, style, onFocus, onBlur, secureTextEntry, editable, accessibilityLabel, ...props }: InputProps): React.JSX.Element;
180
180
 
181
181
  type BadgeVariant = 'default' | 'secondary' | 'destructive' | 'outline' | 'success' | 'warning' | 'successOutline' | 'destructiveOutline' | 'warningOutline';
182
182
  type BadgeSize = 'sm' | 'md' | 'lg';
@@ -202,11 +202,13 @@ declare function Badge({ label, children, variant, size, icon, iconName, iconCol
202
202
  type CardVariant = 'elevated' | 'outlined' | 'filled';
203
203
  interface CardProps {
204
204
  children: React.ReactNode;
205
- /** Visual style variant. `'elevated'` (default) has shadow, `'outlined'` has border only, `'filled'` uses accent background. */
205
+ /** Visual style variant. `'elevated'` (default) has shadow, `'outlined'` has border only, `'filled'` uses accent background. */
206
206
  variant?: CardVariant;
207
207
  /** Makes the card tappable. Adds press animation and haptic feedback. */
208
208
  onPress?: () => void;
209
209
  style?: ViewStyle;
210
+ /** Accessibility label for the card (when interactive). */
211
+ accessibilityLabel?: string;
210
212
  }
211
213
  interface CardHeaderProps {
212
214
  children: React.ReactNode;
@@ -228,7 +230,7 @@ interface CardFooterProps {
228
230
  children: React.ReactNode;
229
231
  style?: ViewStyle;
230
232
  }
231
- declare function Card({ children, variant, onPress, style }: CardProps): React.JSX.Element;
233
+ declare function Card({ children, variant, onPress, style, accessibilityLabel }: CardProps): React.JSX.Element;
232
234
  declare function CardHeader({ children, style }: CardHeaderProps): React.JSX.Element;
233
235
  declare function CardTitle({ children, style }: CardTitleProps): React.JSX.Element;
234
236
  declare function CardDescription({ children, style }: CardDescriptionProps): React.JSX.Element;
@@ -295,8 +297,9 @@ interface ProgressProps {
295
297
  max?: number;
296
298
  variant?: ProgressVariant;
297
299
  style?: ViewStyle;
300
+ accessibilityLabel?: string;
298
301
  }
299
- declare function Progress({ value, max, variant, style }: ProgressProps): React.JSX.Element;
302
+ declare function Progress({ value, max, variant, style, accessibilityLabel }: ProgressProps): React.JSX.Element;
300
303
 
301
304
  interface EmptyStateProps {
302
305
  icon?: React.ReactNode;
@@ -338,7 +341,7 @@ interface TextareaProps extends TextInputProps {
338
341
  /** Style for the outer container `View`. Use `style` (from `TextInputProps`) to style the `TextInput` itself. */
339
342
  containerStyle?: ViewStyle;
340
343
  }
341
- declare function Textarea({ label, error, hint, rows, prefixIcon, prefixIconNode, prefixIconColor, containerStyle, style, onFocus, onBlur, ...props }: TextareaProps): React.JSX.Element;
344
+ declare function Textarea({ label, error, hint, rows, prefixIcon, prefixIconNode, prefixIconColor, containerStyle, style, onFocus, onBlur, accessibilityLabel, ...props }: TextareaProps): React.JSX.Element;
342
345
 
343
346
  interface CheckboxProps {
344
347
  checked?: boolean;
@@ -346,16 +349,18 @@ interface CheckboxProps {
346
349
  label?: string;
347
350
  disabled?: boolean;
348
351
  style?: ViewStyle;
352
+ accessibilityLabel?: string;
349
353
  }
350
- declare function Checkbox({ checked, onCheckedChange, label, disabled, style, }: CheckboxProps): React.JSX.Element;
354
+ declare function Checkbox({ checked, onCheckedChange, label, disabled, style, accessibilityLabel, }: CheckboxProps): React.JSX.Element;
351
355
 
352
356
  interface SwitchProps {
353
357
  checked?: boolean;
354
358
  onCheckedChange?: (checked: boolean) => void;
355
359
  disabled?: boolean;
356
360
  style?: ViewStyle;
361
+ accessibilityLabel?: string;
357
362
  }
358
- declare function Switch({ checked, onCheckedChange, disabled, style }: SwitchProps): React.JSX.Element;
363
+ declare function Switch({ checked, onCheckedChange, disabled, style, accessibilityLabel }: SwitchProps): React.JSX.Element;
359
364
 
360
365
  type ToggleVariant = 'default' | 'outline';
361
366
  type ToggleSize = 'sm' | 'md' | 'lg';
@@ -384,7 +389,7 @@ interface ToggleProps extends TouchableOpacityProps {
384
389
  /** Override the resolved active icon color. Defaults to `primary`. */
385
390
  activeIconColor?: string;
386
391
  }
387
- declare function Toggle({ pressed, onPressedChange, variant, size, label, icon, activeIcon, iconName, activeIconName, iconColor, activeIconColor, disabled, style, ...props }: ToggleProps): React.JSX.Element;
392
+ declare function Toggle({ pressed, onPressedChange, variant, size, label, icon, activeIcon, iconName, activeIconName, iconColor, activeIconColor, disabled, style, accessibilityLabel, ...props }: ToggleProps): React.JSX.Element;
388
393
 
389
394
  interface RadioOption {
390
395
  label: string;
@@ -397,8 +402,9 @@ interface RadioGroupProps {
397
402
  onValueChange?: (value: string) => void;
398
403
  orientation?: 'vertical' | 'horizontal';
399
404
  style?: ViewStyle;
405
+ accessibilityLabel?: string;
400
406
  }
401
- declare function RadioGroup({ options, value, onValueChange, orientation, style, }: RadioGroupProps): React.JSX.Element;
407
+ declare function RadioGroup({ options, value, onValueChange, orientation, style, accessibilityLabel, }: RadioGroupProps): React.JSX.Element;
402
408
 
403
409
  interface TabItem {
404
410
  label: string;
@@ -533,8 +539,9 @@ interface SelectProps {
533
539
  error?: string;
534
540
  disabled?: boolean;
535
541
  style?: ViewStyle;
542
+ accessibilityLabel?: string;
536
543
  }
537
- declare function Select({ options, value, onValueChange, placeholder, label, error, disabled, style, }: SelectProps): React.JSX.Element;
544
+ declare function Select({ options, value, onValueChange, placeholder, label, error, disabled, style, accessibilityLabel, }: SelectProps): React.JSX.Element;
538
545
 
539
546
  declare function useToast(): {
540
547
  toast: ((message: string, data?: Omit<sonner_native.ToastProps, "title" | "type" | "variant" | "id" | "jsx" | "promise"> & {
@@ -673,12 +680,16 @@ interface ListItemProps {
673
680
  subtitleStyle?: TextStyle;
674
681
  /** Style applied to the caption Text. */
675
682
  captionStyle?: TextStyle;
683
+ /** Accessibility label override. Defaults to the title. */
684
+ accessibilityLabel?: string;
676
685
  }
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;
686
+ declare function ListItem({ leftRender, rightRender, trailing, icon, leftIcon, rightIcon, leftIconColor, rightIconColor, title, subtitle, caption, variant, showChevron, showSeparator, onPress, disabled, style, titleStyle, subtitleStyle, captionStyle, accessibilityLabel, }: ListItemProps): React.JSX.Element;
678
687
 
679
688
  type MenuItemVariant = 'plain' | 'card';
680
689
  interface MenuItemProps {
681
690
  label: string;
691
+ /** Secondary text rendered below the label. */
692
+ subtitle?: string;
682
693
  /**
683
694
  * Icon name from `@expo/vector-icons` rendered on the left.
684
695
  * See https://icons.expo.fyi.
@@ -712,8 +723,10 @@ interface MenuItemProps {
712
723
  style?: ViewStyle;
713
724
  /** Style applied to the label Text. */
714
725
  labelStyle?: TextStyle;
726
+ /** Accessibility label override. Defaults to label. */
727
+ accessibilityLabel?: string;
715
728
  }
716
- declare function MenuItem({ label, iconName, icon, iconColor, rightRender, showChevron, onPress, disabled, variant, showSeparator, style, labelStyle, }: MenuItemProps): React.JSX.Element;
729
+ declare function MenuItem({ label, subtitle, iconName, icon, iconColor, rightRender, showChevron, onPress, disabled, variant, showSeparator, style, labelStyle, accessibilityLabel, }: MenuItemProps): React.JSX.Element;
717
730
 
718
731
  interface ChipProps {
719
732
  label: string;
@@ -724,6 +737,7 @@ interface ChipProps {
724
737
  /** Icon name from @expo/vector-icons resolved automatically. */
725
738
  iconName?: string;
726
739
  style?: ViewStyle;
740
+ accessibilityLabel?: string;
727
741
  }
728
742
  interface ChipOption {
729
743
  label: string;
@@ -742,7 +756,7 @@ interface ChipGroupProps {
742
756
  multiSelect?: boolean;
743
757
  style?: ViewStyle;
744
758
  }
745
- declare function Chip({ label, selected, onPress, icon, iconName, style }: ChipProps): React.JSX.Element;
759
+ declare function Chip({ label, selected, onPress, icon, iconName, style, accessibilityLabel }: ChipProps): React.JSX.Element;
746
760
  declare function ChipGroup({ options, value, onValueChange, multiSelect, style }: ChipGroupProps): React.JSX.Element;
747
761
 
748
762
  interface ConfirmDialogProps {
@@ -813,8 +827,10 @@ interface MediaCardProps {
813
827
  imageStyle?: ViewStyle;
814
828
  /** Additional content rendered below caption. */
815
829
  footer?: React.ReactNode;
830
+ /** Accessibility label override. Defaults to title (and subtitle if present). */
831
+ accessibilityLabel?: string;
816
832
  }
817
- declare function MediaCard({ imageSource, aspectRatio, badge, actionIcon, actionIconName, actionActive, onActionPress, title, subtitle, caption, onPress, style, imageStyle, footer, }: MediaCardProps): React.JSX.Element;
833
+ declare function MediaCard({ imageSource, aspectRatio, badge, actionIcon, actionIconName, actionActive, onActionPress, title, subtitle, caption, onPress, style, imageStyle, footer, accessibilityLabel, }: MediaCardProps): React.JSX.Element;
818
834
 
819
835
  interface CategoryItem {
820
836
  label: string;
@@ -834,8 +850,9 @@ interface CategoryStripProps {
834
850
  style?: ViewStyle;
835
851
  /** Style applied to each pill item. */
836
852
  itemStyle?: ViewStyle;
853
+ accessibilityLabel?: string;
837
854
  }
838
- declare function CategoryStrip({ categories, value, onValueChange, multiSelect, style, itemStyle, }: CategoryStripProps): React.JSX.Element;
855
+ declare function CategoryStrip({ categories, value, onValueChange, multiSelect, style, itemStyle, accessibilityLabel, }: CategoryStripProps): React.JSX.Element;
839
856
 
840
857
  interface PressableProps extends Omit<TouchableOpacityProps, 'activeOpacity'> {
841
858
  /** Children content to render inside the pressable. */
@@ -844,7 +861,10 @@ interface PressableProps extends Omit<TouchableOpacityProps, 'activeOpacity'> {
844
861
  onPress?: () => void;
845
862
  /** Scale value on press. Defaults to `0.98` (MediaCard-style). */
846
863
  pressScale?: number;
847
- /** Bounciness of the spring animation on release. Defaults to `4`. */
864
+ /**
865
+ * @deprecated Use Reanimated spring config via `pressOutSpring` instead. Ignored.
866
+ * Kept for backwards compatibility with v6.x consumers.
867
+ */
848
868
  bounciness?: number;
849
869
  /** Enable haptic feedback on press. Defaults to `true`. */
850
870
  haptics?: boolean;
@@ -856,20 +876,23 @@ interface PressableProps extends Omit<TouchableOpacityProps, 'activeOpacity'> {
856
876
  hoverScale?: number;
857
877
  }
858
878
  /**
859
- * Generic pressable with beautiful spring bounce effect matching MediaCard interaction.
860
- * Use for custom pressable content that needs consistent press feel.
879
+ * Generic pressable with a calibrated spring bounce Apple HIG / Airbnb feel.
880
+ * All animation runs on the UI thread via Reanimated v4 worklets.
881
+ *
882
+ * Use this for any custom pressable surface that needs consistent press feel
883
+ * (cards, list rows, image tiles, etc).
861
884
  */
862
- declare function Pressable({ children, onPress, pressScale, bounciness, haptics, style, disabled, hoverScale, ...touchableProps }: PressableProps): React.JSX.Element;
885
+ declare function Pressable({ children, onPress, pressScale, haptics, style, disabled, hoverScale, ...touchableProps }: PressableProps): React.JSX.Element;
863
886
 
864
887
  type DetailRowSeparator = 'dotted' | 'solid' | 'dashed' | 'none';
865
888
  type DetailRowLabelWeight = 'normal' | 'medium' | 'semibold' | 'bold';
866
889
  interface DetailRowProps {
867
890
  label: React.ReactNode;
868
- value: string;
891
+ value: string | React.ReactNode;
869
892
  /** Dotted/dashed/solid line between label and value. Defaults to 'dotted'. */
870
893
  separator?: DetailRowSeparator;
871
894
  labelWeight?: DetailRowLabelWeight;
872
- /** Semantic color key or hex string for value text. */
895
+ /** Semantic color key or hex string for value text. Only applies when value is a string. */
873
896
  valueColor?: string;
874
897
  /** Node rendered left of the label (e.g. Avatar, Icon). */
875
898
  leftIcon?: React.ReactNode;
@@ -883,6 +906,7 @@ interface DetailRowProps {
883
906
  rightIconColor?: string;
884
907
  style?: ViewStyle;
885
908
  labelStyle?: TextStyle;
909
+ /** Only applies when value is a string. */
886
910
  valueStyle?: TextStyle;
887
911
  }
888
912
  declare function DetailRow({ label, value, separator, labelWeight, valueColor, leftIcon, leftIconName, leftIconColor, rightIconName, rightIconColor, style, labelStyle, valueStyle, }: DetailRowProps): React.JSX.Element;