@retray-dev/ui-kit 13.0.0 → 13.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 (132) hide show
  1. package/CONSUMER.md +24 -9
  2. package/README.md +9 -10
  3. package/{COMPONENTS.md → SKILL.md} +296 -860
  4. package/dist/Accordion.d.mts +2 -0
  5. package/dist/Accordion.d.ts +2 -0
  6. package/dist/Accordion.js +1 -0
  7. package/dist/Accordion.mjs +1 -2
  8. package/dist/AlertBanner.mjs +0 -1
  9. package/dist/AppHeader.d.mts +5 -2
  10. package/dist/AppHeader.d.ts +5 -2
  11. package/dist/AppHeader.js +8 -4
  12. package/dist/AppHeader.mjs +1 -2
  13. package/dist/Avatar.mjs +0 -1
  14. package/dist/Badge.mjs +0 -1
  15. package/dist/Button.mjs +0 -1
  16. package/dist/ButtonGroup.mjs +0 -1
  17. package/dist/Card.mjs +0 -1
  18. package/dist/CategoryStrip.mjs +0 -1
  19. package/dist/Checkbox.d.mts +2 -1
  20. package/dist/Checkbox.d.ts +2 -1
  21. package/dist/Checkbox.js +3 -1
  22. package/dist/Checkbox.mjs +1 -2
  23. package/dist/Chip.mjs +0 -1
  24. package/dist/ConfirmDialog.d.mts +2 -1
  25. package/dist/ConfirmDialog.d.ts +2 -1
  26. package/dist/ConfirmDialog.js +26 -14
  27. package/dist/ConfirmDialog.mjs +1 -2
  28. package/dist/CurrencyDisplay.mjs +0 -1
  29. package/dist/CurrencyInput.mjs +0 -1
  30. package/dist/DetailRow.mjs +0 -1
  31. package/dist/EmptyState.mjs +0 -1
  32. package/dist/ErrorBoundary.mjs +0 -1
  33. package/dist/Form.mjs +0 -1
  34. package/dist/HolographicCard.mjs +0 -1
  35. package/dist/IconButton.mjs +0 -1
  36. package/dist/IconPicker.mjs +0 -1
  37. package/dist/ImageUpload.d.mts +1 -3
  38. package/dist/ImageUpload.d.ts +1 -3
  39. package/dist/ImageUpload.js +27 -26
  40. package/dist/ImageUpload.mjs +1 -2
  41. package/dist/ImageViewer.mjs +0 -1
  42. package/dist/Input.mjs +0 -1
  43. package/dist/LabelValue.mjs +0 -1
  44. package/dist/ListGroup.mjs +0 -1
  45. package/dist/ListItem.d.mts +2 -1
  46. package/dist/ListItem.d.ts +2 -1
  47. package/dist/ListItem.js +3 -1
  48. package/dist/ListItem.mjs +1 -2
  49. package/dist/MediaCard.mjs +0 -1
  50. package/dist/MenuGroup.mjs +0 -1
  51. package/dist/MenuItem.d.mts +2 -1
  52. package/dist/MenuItem.d.ts +2 -1
  53. package/dist/MenuItem.js +3 -1
  54. package/dist/MenuItem.mjs +1 -2
  55. package/dist/MonthPicker.mjs +0 -1
  56. package/dist/NumberStepper.d.mts +2 -1
  57. package/dist/NumberStepper.d.ts +2 -1
  58. package/dist/NumberStepper.js +4 -1
  59. package/dist/NumberStepper.mjs +1 -2
  60. package/dist/PagerDots.mjs +0 -1
  61. package/dist/Pressable.mjs +0 -1
  62. package/dist/PricingCard.mjs +0 -1
  63. package/dist/Progress.mjs +0 -1
  64. package/dist/RadioGroup.mjs +0 -1
  65. package/dist/RetrayProvider.mjs +0 -1
  66. package/dist/Select.d.mts +2 -1
  67. package/dist/Select.d.ts +2 -1
  68. package/dist/Select.js +3 -1
  69. package/dist/Select.mjs +1 -2
  70. package/dist/SelectableCard.mjs +0 -1
  71. package/dist/SelectableGrid.js +0 -1
  72. package/dist/SelectableGrid.mjs +1 -2
  73. package/dist/Separator.mjs +0 -1
  74. package/dist/Sheet.d.mts +1 -1
  75. package/dist/Sheet.d.ts +1 -1
  76. package/dist/Sheet.js +26 -13
  77. package/dist/Sheet.mjs +1 -2
  78. package/dist/SheetSelect.mjs +0 -1
  79. package/dist/Skeleton.mjs +0 -1
  80. package/dist/Slider.d.mts +2 -1
  81. package/dist/Slider.d.ts +2 -1
  82. package/dist/Slider.js +2 -0
  83. package/dist/Slider.mjs +1 -2
  84. package/dist/Spinner.mjs +0 -1
  85. package/dist/Stats.mjs +0 -1
  86. package/dist/Switch.d.mts +2 -1
  87. package/dist/Switch.d.ts +2 -1
  88. package/dist/Switch.js +2 -1
  89. package/dist/Switch.mjs +1 -2
  90. package/dist/TabBar.mjs +0 -1
  91. package/dist/Tabs.mjs +0 -1
  92. package/dist/Text.mjs +0 -1
  93. package/dist/Textarea.mjs +0 -1
  94. package/dist/Toast.d.mts +12 -10
  95. package/dist/Toast.d.ts +12 -10
  96. package/dist/Toast.mjs +0 -1
  97. package/dist/Toggle.mjs +0 -1
  98. package/dist/{chunk-TETMEKZE.mjs → chunk-2QXJDRVU.mjs} +4 -1
  99. package/dist/{chunk-CBIZLRYH.mjs → chunk-422IVD3H.mjs} +1 -0
  100. package/dist/{chunk-4ZO5PTKF.mjs → chunk-77UOVFIS.mjs} +3 -1
  101. package/dist/{chunk-2QOHHBJC.mjs → chunk-7BZJRB77.mjs} +25 -15
  102. package/dist/{chunk-UOKFSFNJ.mjs → chunk-C5ZRMR2E.mjs} +2 -0
  103. package/dist/{chunk-E4EQSCKR.mjs → chunk-COA2YZOX.mjs} +3 -1
  104. package/dist/{chunk-6QLBHUEG.mjs → chunk-CZN6L2QU.mjs} +3 -1
  105. package/dist/{chunk-BTUW5LSG.mjs → chunk-E2PONRJG.mjs} +2 -1
  106. package/dist/{chunk-6CR4S6W2.mjs → chunk-H6MQL7PS.mjs} +9 -4
  107. package/dist/{chunk-EROPDCB5.mjs → chunk-HHOOFDBA.mjs} +26 -21
  108. package/dist/{chunk-URIH43IJ.mjs → chunk-IDVUZIVY.mjs} +3 -1
  109. package/dist/{chunk-MP7GLMIR.mjs → chunk-NPCBNGNE.mjs} +0 -1
  110. package/dist/{chunk-V2ZB2XNS.mjs → chunk-UMZTPUB3.mjs} +27 -15
  111. package/dist/fonts.mjs +0 -2
  112. package/dist/index.d.mts +1 -1
  113. package/dist/index.d.ts +1 -1
  114. package/dist/index.js +108 -64
  115. package/dist/index.mjs +13 -14
  116. package/package.json +14 -12
  117. package/src/components/Accordion/Accordion.tsx +3 -0
  118. package/src/components/AppHeader/AppHeader.tsx +25 -10
  119. package/src/components/Checkbox/Checkbox.tsx +3 -0
  120. package/src/components/ConfirmDialog/ConfirmDialog.tsx +30 -14
  121. package/src/components/ImageUpload/ImageUpload.tsx +33 -25
  122. package/src/components/ListItem/ListItem.tsx +3 -0
  123. package/src/components/MenuItem/MenuItem.tsx +3 -0
  124. package/src/components/NumberStepper/NumberStepper.tsx +4 -0
  125. package/src/components/Select/Select.tsx +3 -0
  126. package/src/components/SelectableGrid/SelectableGrid.tsx +0 -1
  127. package/src/components/Sheet/Sheet.tsx +27 -14
  128. package/src/components/Sheet/index.ts +2 -2
  129. package/src/components/Slider/Slider.tsx +3 -0
  130. package/src/components/Switch/Switch.tsx +3 -1
  131. package/src/components/Text/Text.tsx +1 -0
  132. package/dist/chunk-Y6FXYEAI.mjs +0 -8
@@ -11,12 +11,14 @@ interface AccordionItem {
11
11
  icon?: React.ReactNode;
12
12
  /** Override icon color. Defaults to foregroundMuted. */
13
13
  iconColor?: string;
14
+ /**
14
15
  /**
15
16
  * Action buttons rendered after the trigger content but before the chevron.
16
17
  * Automatically touch-isolated — taps on actions won't toggle the accordion.
17
18
  * Use this instead of embedding interactive elements inside `trigger`.
18
19
  */
19
20
  triggerActions?: React.ReactNode;
21
+ accessibilityHint?: string;
20
22
  }
21
23
  interface AccordionProps {
22
24
  items: AccordionItem[];
@@ -11,12 +11,14 @@ interface AccordionItem {
11
11
  icon?: React.ReactNode;
12
12
  /** Override icon color. Defaults to foregroundMuted. */
13
13
  iconColor?: string;
14
+ /**
14
15
  /**
15
16
  * Action buttons rendered after the trigger content but before the chevron.
16
17
  * Automatically touch-isolated — taps on actions won't toggle the accordion.
17
18
  * Use this instead of embedding interactive elements inside `trigger`.
18
19
  */
19
20
  triggerActions?: React.ReactNode;
21
+ accessibilityHint?: string;
20
22
  }
21
23
  interface AccordionProps {
22
24
  items: AccordionItem[];
package/dist/Accordion.js CHANGED
@@ -142,6 +142,7 @@ function AccordionItemComponent({
142
142
  accessibilityRole: "button",
143
143
  accessibilityState: { expanded: isOpen },
144
144
  accessibilityLabel: typeof item.trigger === "string" ? item.trigger : void 0,
145
+ accessibilityHint: item.accessibilityHint,
145
146
  style: styles.trigger
146
147
  },
147
148
  /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles.triggerContent }, resolvedIcon ? /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles.icon }, resolvedIcon) : null, typeof item.trigger === "string" ? /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.triggerText, { color: colors.foreground }], allowFontScaling: true }, item.trigger) : item.trigger),
@@ -1,8 +1,7 @@
1
- export { Accordion } from './chunk-CBIZLRYH.mjs';
1
+ export { Accordion } from './chunk-422IVD3H.mjs';
2
2
  import './chunk-M53LC4Q7.mjs';
3
3
  import './chunk-IFYMBOEN.mjs';
4
4
  import './chunk-ARONDO7M.mjs';
5
5
  import './chunk-MZ6WRTD2.mjs';
6
6
  import './chunk-KSSVIFYR.mjs';
7
7
  import './chunk-2CE3TQVY.mjs';
8
- import './chunk-Y6FXYEAI.mjs';
@@ -3,4 +3,3 @@ import './chunk-QY3X2UYR.mjs';
3
3
  import './chunk-MZ6WRTD2.mjs';
4
4
  import './chunk-KSSVIFYR.mjs';
5
5
  import './chunk-2CE3TQVY.mjs';
6
- import './chunk-Y6FXYEAI.mjs';
@@ -10,7 +10,9 @@ interface AppHeaderProps {
10
10
  onBack?: () => void;
11
11
  /** Icon name for the back button. Defaults to `'chevron-left'`. */
12
12
  backIconName?: string;
13
- /** Custom left content overrides the back button. */
13
+ /** Icon name for a decorative icon shown left of the title, after the back button. Ignored when `left` is provided. */
14
+ iconName?: string;
15
+ /** Custom left content — overrides the back button and `iconName`. */
14
16
  left?: React.ReactNode;
15
17
  /** Custom right content (actions). */
16
18
  right?: React.ReactNode;
@@ -34,7 +36,8 @@ interface AppHeaderProps {
34
36
  *
35
37
  * @example
36
38
  * <AppHeader title="Settings" onBack={navigation.goBack} right={<IconButton iconName="more-horizontal" variant="text" />} />
39
+ * <AppHeader title="Perfil" iconName="user" onBack={navigation.goBack} />
37
40
  */
38
- declare function AppHeader({ title, subtitle, onBack, backIconName, left, right, titleAlign, bordered, withSafeArea, backgroundColor, style, }: AppHeaderProps): React.JSX.Element;
41
+ declare function AppHeader({ title, subtitle, onBack, backIconName, iconName, left, right, titleAlign, bordered, withSafeArea, backgroundColor, style, }: AppHeaderProps): React.JSX.Element;
39
42
 
40
43
  export { AppHeader, type AppHeaderProps };
@@ -10,7 +10,9 @@ interface AppHeaderProps {
10
10
  onBack?: () => void;
11
11
  /** Icon name for the back button. Defaults to `'chevron-left'`. */
12
12
  backIconName?: string;
13
- /** Custom left content overrides the back button. */
13
+ /** Icon name for a decorative icon shown left of the title, after the back button. Ignored when `left` is provided. */
14
+ iconName?: string;
15
+ /** Custom left content — overrides the back button and `iconName`. */
14
16
  left?: React.ReactNode;
15
17
  /** Custom right content (actions). */
16
18
  right?: React.ReactNode;
@@ -34,7 +36,8 @@ interface AppHeaderProps {
34
36
  *
35
37
  * @example
36
38
  * <AppHeader title="Settings" onBack={navigation.goBack} right={<IconButton iconName="more-horizontal" variant="text" />} />
39
+ * <AppHeader title="Perfil" iconName="user" onBack={navigation.goBack} />
37
40
  */
38
- declare function AppHeader({ title, subtitle, onBack, backIconName, left, right, titleAlign, bordered, withSafeArea, backgroundColor, style, }: AppHeaderProps): React.JSX.Element;
41
+ declare function AppHeader({ title, subtitle, onBack, backIconName, iconName, left, right, titleAlign, bordered, withSafeArea, backgroundColor, style, }: AppHeaderProps): React.JSX.Element;
39
42
 
40
43
  export { AppHeader, type AppHeaderProps };
package/dist/AppHeader.js CHANGED
@@ -215,6 +215,7 @@ function AppHeader({
215
215
  subtitle,
216
216
  onBack,
217
217
  backIconName = "chevron-left",
218
+ iconName,
218
219
  left,
219
220
  right,
220
221
  titleAlign = "auto",
@@ -228,7 +229,7 @@ function AppHeader({
228
229
  const { width } = reactNative.useWindowDimensions();
229
230
  const isWide = width >= BREAKPOINTS.wide;
230
231
  const centered = titleAlign === "center" || titleAlign === "auto" && isWide;
231
- const leftNode = left ?? (onBack ? /* @__PURE__ */ React4__default.default.createElement(
232
+ const leftNode = left ?? /* @__PURE__ */ React4__default.default.createElement(React4__default.default.Fragment, null, onBack ? /* @__PURE__ */ React4__default.default.createElement(
232
233
  IconButton,
233
234
  {
234
235
  iconName: backIconName,
@@ -237,7 +238,7 @@ function AppHeader({
237
238
  onPress: onBack,
238
239
  accessibilityLabel: "Atr\xE1s"
239
240
  }
240
- ) : null);
241
+ ) : null, iconName && !left ? /* @__PURE__ */ React4__default.default.createElement(Icon, { name: iconName, size: 20, color: colors.foreground }) : null);
241
242
  const titleBlock = /* @__PURE__ */ React4__default.default.createElement(reactNative.View, { style: [styles2.titleBlock, centered && styles2.titleBlockCentered], pointerEvents: "none" }, title ? /* @__PURE__ */ React4__default.default.createElement(
242
243
  reactNative.Text,
243
244
  {
@@ -287,10 +288,13 @@ var styles2 = reactNative.StyleSheet.create({
287
288
  minWidth: s(44),
288
289
  flexDirection: "row",
289
290
  alignItems: "center",
290
- justifyContent: "flex-start"
291
+ justifyContent: "flex-start",
292
+ paddingLeft: s(8),
293
+ gap: s(4)
291
294
  },
292
295
  sideRight: {
293
- justifyContent: "flex-end"
296
+ justifyContent: "flex-end",
297
+ paddingRight: s(8)
294
298
  },
295
299
  titleBlock: {
296
300
  flex: 1,
@@ -1,4 +1,4 @@
1
- export { AppHeader } from './chunk-6CR4S6W2.mjs';
1
+ export { AppHeader } from './chunk-H6MQL7PS.mjs';
2
2
  import './chunk-ZTPYUU5C.mjs';
3
3
  import './chunk-IFYMBOEN.mjs';
4
4
  import './chunk-ARONDO7M.mjs';
@@ -6,4 +6,3 @@ import './chunk-QY3X2UYR.mjs';
6
6
  import './chunk-MZ6WRTD2.mjs';
7
7
  import './chunk-KSSVIFYR.mjs';
8
8
  import './chunk-2CE3TQVY.mjs';
9
- import './chunk-Y6FXYEAI.mjs';
package/dist/Avatar.mjs CHANGED
@@ -1,4 +1,3 @@
1
1
  export { Avatar, AvatarGroup } from './chunk-IGU223UM.mjs';
2
2
  import './chunk-KSSVIFYR.mjs';
3
3
  import './chunk-2CE3TQVY.mjs';
4
- import './chunk-Y6FXYEAI.mjs';
package/dist/Badge.mjs CHANGED
@@ -2,4 +2,3 @@ export { Badge } from './chunk-AZV7KNJI.mjs';
2
2
  import './chunk-MZ6WRTD2.mjs';
3
3
  import './chunk-KSSVIFYR.mjs';
4
4
  import './chunk-2CE3TQVY.mjs';
5
- import './chunk-Y6FXYEAI.mjs';
package/dist/Button.mjs CHANGED
@@ -6,4 +6,3 @@ import './chunk-QY3X2UYR.mjs';
6
6
  import './chunk-MZ6WRTD2.mjs';
7
7
  import './chunk-KSSVIFYR.mjs';
8
8
  import './chunk-2CE3TQVY.mjs';
9
- import './chunk-Y6FXYEAI.mjs';
@@ -1,3 +1,2 @@
1
1
  export { ButtonGroup } from './chunk-3BBOZ3OQ.mjs';
2
2
  import './chunk-2CE3TQVY.mjs';
3
- import './chunk-Y6FXYEAI.mjs';
package/dist/Card.mjs CHANGED
@@ -4,4 +4,3 @@ import './chunk-ARONDO7M.mjs';
4
4
  import './chunk-QY3X2UYR.mjs';
5
5
  import './chunk-KSSVIFYR.mjs';
6
6
  import './chunk-2CE3TQVY.mjs';
7
- import './chunk-Y6FXYEAI.mjs';
@@ -6,4 +6,3 @@ import './chunk-QY3X2UYR.mjs';
6
6
  import './chunk-MZ6WRTD2.mjs';
7
7
  import './chunk-KSSVIFYR.mjs';
8
8
  import './chunk-2CE3TQVY.mjs';
9
- import './chunk-Y6FXYEAI.mjs';
@@ -8,7 +8,8 @@ interface CheckboxProps {
8
8
  disabled?: boolean;
9
9
  style?: ViewStyle;
10
10
  accessibilityLabel?: string;
11
+ accessibilityHint?: string;
11
12
  }
12
- declare function Checkbox({ checked, onCheckedChange, label, disabled, style, accessibilityLabel, }: CheckboxProps): React.JSX.Element;
13
+ declare function Checkbox({ checked, onCheckedChange, label, disabled, style, accessibilityLabel, accessibilityHint, }: CheckboxProps): React.JSX.Element;
13
14
 
14
15
  export { Checkbox, type CheckboxProps };
@@ -8,7 +8,8 @@ interface CheckboxProps {
8
8
  disabled?: boolean;
9
9
  style?: ViewStyle;
10
10
  accessibilityLabel?: string;
11
+ accessibilityHint?: string;
11
12
  }
12
- declare function Checkbox({ checked, onCheckedChange, label, disabled, style, accessibilityLabel, }: CheckboxProps): React.JSX.Element;
13
+ declare function Checkbox({ checked, onCheckedChange, label, disabled, style, accessibilityLabel, accessibilityHint, }: CheckboxProps): React.JSX.Element;
13
14
 
14
15
  export { Checkbox, type CheckboxProps };
package/dist/Checkbox.js CHANGED
@@ -72,7 +72,8 @@ function Checkbox({
72
72
  label,
73
73
  disabled,
74
74
  style,
75
- accessibilityLabel
75
+ accessibilityLabel,
76
+ accessibilityHint
76
77
  }) {
77
78
  const { colors } = useTheme();
78
79
  const handlePress = () => {
@@ -93,6 +94,7 @@ function Checkbox({
93
94
  touchSoundDisabled: true,
94
95
  accessibilityRole: "checkbox",
95
96
  accessibilityLabel: accessibilityLabel ?? label,
97
+ accessibilityHint,
96
98
  accessibilityState: { checked, disabled: !!disabled }
97
99
  },
98
100
  /* @__PURE__ */ React2__default.default.createElement(
package/dist/Checkbox.mjs CHANGED
@@ -1,7 +1,6 @@
1
- export { Checkbox } from './chunk-4ZO5PTKF.mjs';
1
+ export { Checkbox } from './chunk-77UOVFIS.mjs';
2
2
  import './chunk-M53LC4Q7.mjs';
3
3
  import './chunk-IFYMBOEN.mjs';
4
4
  import './chunk-ARONDO7M.mjs';
5
5
  import './chunk-KSSVIFYR.mjs';
6
6
  import './chunk-2CE3TQVY.mjs';
7
- import './chunk-Y6FXYEAI.mjs';
package/dist/Chip.mjs CHANGED
@@ -6,4 +6,3 @@ import './chunk-QY3X2UYR.mjs';
6
6
  import './chunk-MZ6WRTD2.mjs';
7
7
  import './chunk-KSSVIFYR.mjs';
8
8
  import './chunk-2CE3TQVY.mjs';
9
- import './chunk-Y6FXYEAI.mjs';
@@ -11,7 +11,8 @@ interface ConfirmDialogProps {
11
11
  showCloseButton?: boolean;
12
12
  onConfirm: () => void;
13
13
  onCancel: () => void;
14
+ accessibilityHint?: string;
14
15
  }
15
- declare function ConfirmDialog({ visible, title, subtitle, confirmLabel, cancelLabel, confirmVariant, loading, showCloseButton, onConfirm, onCancel, }: ConfirmDialogProps): React.JSX.Element;
16
+ declare function ConfirmDialog({ visible, title, subtitle, confirmLabel, cancelLabel, confirmVariant, loading, showCloseButton, onConfirm, onCancel, accessibilityHint, }: ConfirmDialogProps): React.JSX.Element;
16
17
 
17
18
  export { ConfirmDialog, type ConfirmDialogProps };
@@ -11,7 +11,8 @@ interface ConfirmDialogProps {
11
11
  showCloseButton?: boolean;
12
12
  onConfirm: () => void;
13
13
  onCancel: () => void;
14
+ accessibilityHint?: string;
14
15
  }
15
- declare function ConfirmDialog({ visible, title, subtitle, confirmLabel, cancelLabel, confirmVariant, loading, showCloseButton, onConfirm, onCancel, }: ConfirmDialogProps): React.JSX.Element;
16
+ declare function ConfirmDialog({ visible, title, subtitle, confirmLabel, cancelLabel, confirmVariant, loading, showCloseButton, onConfirm, onCancel, accessibilityHint, }: ConfirmDialogProps): React.JSX.Element;
16
17
 
17
18
  export { ConfirmDialog, type ConfirmDialogProps };
@@ -261,28 +261,39 @@ function ConfirmDialog({
261
261
  loading = false,
262
262
  showCloseButton = false,
263
263
  onConfirm,
264
- onCancel
264
+ onCancel,
265
+ accessibilityHint
265
266
  }) {
266
267
  const { colors } = useTheme();
267
268
  const insets = reactNativeSafeAreaContext.useSafeAreaInsets();
268
269
  const ref = React3.useRef(null);
269
- const wasOpened = React3.useRef(false);
270
- const isPresentedRef = React3.useRef(false);
270
+ const dialogState = React3.useRef("idle");
271
+ const onCancelRef = React3.useRef(onCancel);
271
272
  const name = React3.useId();
272
- const handleDismiss = React3.useCallback(() => {
273
- isPresentedRef.current = false;
274
- onCancel();
273
+ const [tick, setTick] = React3.useState(0);
274
+ React3.useEffect(() => {
275
+ onCancelRef.current = onCancel;
275
276
  }, [onCancel]);
277
+ const handleDismiss = React3.useCallback(() => {
278
+ dialogState.current = "idle";
279
+ onCancelRef.current?.();
280
+ setTick((t) => t + 1);
281
+ }, []);
276
282
  React3.useEffect(() => {
277
- if (visible && !isPresentedRef.current) {
278
- impactMedium();
279
- ref.current?.present();
280
- wasOpened.current = true;
281
- isPresentedRef.current = true;
282
- } else if (!visible && wasOpened.current && isPresentedRef.current) {
283
- ref.current?.dismiss();
283
+ if (visible) {
284
+ if (dialogState.current === "idle") {
285
+ dialogState.current = "presenting";
286
+ impactMedium();
287
+ ref.current?.present();
288
+ dialogState.current = "presented";
289
+ }
290
+ } else {
291
+ if (dialogState.current === "presented" || dialogState.current === "presenting") {
292
+ dialogState.current = "dismissing";
293
+ ref.current?.dismiss();
294
+ }
284
295
  }
285
- }, [visible]);
296
+ }, [visible, tick]);
286
297
  const renderBackdrop = React3.useCallback(
287
298
  (props) => /* @__PURE__ */ React3__default.default.createElement(
288
299
  bottomSheet.BottomSheetBackdrop,
@@ -332,6 +343,7 @@ function ConfirmDialog({
332
343
  notificationSuccess();
333
344
  onConfirm();
334
345
  },
346
+ accessibilityHint,
335
347
  icon: /* @__PURE__ */ React3__default.default.createElement(
336
348
  vectorIcons.Feather,
337
349
  {
@@ -1,4 +1,4 @@
1
- export { ConfirmDialog } from './chunk-V2ZB2XNS.mjs';
1
+ export { ConfirmDialog } from './chunk-UMZTPUB3.mjs';
2
2
  import './chunk-Y6YS33GM.mjs';
3
3
  import './chunk-M53LC4Q7.mjs';
4
4
  import './chunk-IFYMBOEN.mjs';
@@ -7,4 +7,3 @@ import './chunk-QY3X2UYR.mjs';
7
7
  import './chunk-MZ6WRTD2.mjs';
8
8
  import './chunk-KSSVIFYR.mjs';
9
9
  import './chunk-2CE3TQVY.mjs';
10
- import './chunk-Y6FXYEAI.mjs';
@@ -1,4 +1,3 @@
1
1
  export { CurrencyDisplay } from './chunk-PI6RULJX.mjs';
2
2
  import './chunk-KSSVIFYR.mjs';
3
3
  import './chunk-2CE3TQVY.mjs';
4
- import './chunk-Y6FXYEAI.mjs';
@@ -4,4 +4,3 @@ import './chunk-M53LC4Q7.mjs';
4
4
  import './chunk-MZ6WRTD2.mjs';
5
5
  import './chunk-KSSVIFYR.mjs';
6
6
  import './chunk-2CE3TQVY.mjs';
7
- import './chunk-Y6FXYEAI.mjs';
@@ -2,4 +2,3 @@ export { DetailRow } from './chunk-KAGADD2O.mjs';
2
2
  import './chunk-MZ6WRTD2.mjs';
3
3
  import './chunk-KSSVIFYR.mjs';
4
4
  import './chunk-2CE3TQVY.mjs';
5
- import './chunk-Y6FXYEAI.mjs';
@@ -7,4 +7,3 @@ import './chunk-QY3X2UYR.mjs';
7
7
  import './chunk-MZ6WRTD2.mjs';
8
8
  import './chunk-KSSVIFYR.mjs';
9
9
  import './chunk-2CE3TQVY.mjs';
10
- import './chunk-Y6FXYEAI.mjs';
@@ -4,4 +4,3 @@ import './chunk-QY3X2UYR.mjs';
4
4
  import './chunk-MZ6WRTD2.mjs';
5
5
  import './chunk-KSSVIFYR.mjs';
6
6
  import './chunk-2CE3TQVY.mjs';
7
- import './chunk-Y6FXYEAI.mjs';
package/dist/Form.mjs CHANGED
@@ -1,4 +1,3 @@
1
1
  export { Form, FormField, FormFooter, FormSection } from './chunk-KPTY7UYQ.mjs';
2
2
  import './chunk-KSSVIFYR.mjs';
3
3
  import './chunk-2CE3TQVY.mjs';
4
- import './chunk-Y6FXYEAI.mjs';
@@ -1,7 +1,6 @@
1
1
  import { PressableCard } from './chunk-IFYMBOEN.mjs';
2
2
  import { impactLight } from './chunk-ARONDO7M.mjs';
3
3
  import { RADIUS } from './chunk-QY3X2UYR.mjs';
4
- import './chunk-Y6FXYEAI.mjs';
5
4
  import React, { useMemo, useEffect } from 'react';
6
5
  import { Platform } from 'react-native';
7
6
  import { useImage, vec, Canvas, Group, Image, RoundedRect, LinearGradient } from '@shopify/react-native-skia';
@@ -4,4 +4,3 @@ import './chunk-ARONDO7M.mjs';
4
4
  import './chunk-MZ6WRTD2.mjs';
5
5
  import './chunk-KSSVIFYR.mjs';
6
6
  import './chunk-2CE3TQVY.mjs';
7
- import './chunk-Y6FXYEAI.mjs';
@@ -5,4 +5,3 @@ import './chunk-QY3X2UYR.mjs';
5
5
  import './chunk-MZ6WRTD2.mjs';
6
6
  import './chunk-KSSVIFYR.mjs';
7
7
  import './chunk-2CE3TQVY.mjs';
8
- import './chunk-Y6FXYEAI.mjs';
@@ -20,14 +20,12 @@ interface ImageUploadProps {
20
20
  borderRadius?: number;
21
21
  /** Aspect ratio for the selected image. Defaults to 'cover'. */
22
22
  resizeMode?: 'cover' | 'contain' | 'stretch';
23
- /** Whether to allow the user to crop the image after selecting. Defaults to true. */
24
- allowsEditing?: boolean;
25
23
  disabled?: boolean;
26
24
  style?: ViewStyle;
27
25
  accessibilityLabel?: string;
28
26
  /** Called synchronously when user taps the upload area, before dynamic import and permission request. */
29
27
  onPickerStarting?: () => void;
30
28
  }
31
- declare function ImageUpload({ value, onChange, loading, placeholder, showPlaceholderText, width, height, borderRadius, resizeMode, allowsEditing, disabled, style, accessibilityLabel, onPickerStarting, }: ImageUploadProps): React.JSX.Element;
29
+ declare function ImageUpload({ value, onChange, loading, placeholder, showPlaceholderText, width, height, borderRadius, resizeMode, disabled, style, accessibilityLabel, onPickerStarting, }: ImageUploadProps): React.JSX.Element;
32
30
 
33
31
  export { ImageUpload, type ImageUploadProps };
@@ -20,14 +20,12 @@ interface ImageUploadProps {
20
20
  borderRadius?: number;
21
21
  /** Aspect ratio for the selected image. Defaults to 'cover'. */
22
22
  resizeMode?: 'cover' | 'contain' | 'stretch';
23
- /** Whether to allow the user to crop the image after selecting. Defaults to true. */
24
- allowsEditing?: boolean;
25
23
  disabled?: boolean;
26
24
  style?: ViewStyle;
27
25
  accessibilityLabel?: string;
28
26
  /** Called synchronously when user taps the upload area, before dynamic import and permission request. */
29
27
  onPickerStarting?: () => void;
30
28
  }
31
- declare function ImageUpload({ value, onChange, loading, placeholder, showPlaceholderText, width, height, borderRadius, resizeMode, allowsEditing, disabled, style, accessibilityLabel, onPickerStarting, }: ImageUploadProps): React.JSX.Element;
29
+ declare function ImageUpload({ value, onChange, loading, placeholder, showPlaceholderText, width, height, borderRadius, resizeMode, disabled, style, accessibilityLabel, onPickerStarting, }: ImageUploadProps): React.JSX.Element;
32
30
 
33
31
  export { ImageUpload, type ImageUploadProps };
@@ -11,12 +11,7 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
11
 
12
12
  var React3__default = /*#__PURE__*/_interopDefault(React3);
13
13
 
14
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
15
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
16
- }) : x)(function(x) {
17
- if (typeof require !== "undefined") return require.apply(this, arguments);
18
- throw Error('Dynamic require of "' + x + '" is not supported');
19
- });
14
+ // src/components/ImageUpload/ImageUpload.tsx
20
15
  var _haptics = null;
21
16
  var _loaded = false;
22
17
  async function getHaptics() {
@@ -127,7 +122,6 @@ function ImageUpload({
127
122
  height = 200,
128
123
  borderRadius = RADIUS.lg,
129
124
  resizeMode = "cover",
130
- allowsEditing = true,
131
125
  disabled = false,
132
126
  style,
133
127
  accessibilityLabel,
@@ -135,25 +129,32 @@ function ImageUpload({
135
129
  }) {
136
130
  const { colors } = useTheme();
137
131
  const [imageLoaded, setImageLoaded] = React3.useState(false);
132
+ const [isPicking, setIsPicking] = React3.useState(false);
138
133
  const handlePress = async () => {
139
- if (disabled || loading) return;
134
+ if (disabled || loading || isPicking) return;
140
135
  impactLight();
141
136
  onPickerStarting?.();
142
- let picker;
137
+ setIsPicking(true);
143
138
  try {
144
- picker = __require("expo-image-picker");
139
+ const { launchImageLibrary } = await import('react-native-image-picker');
140
+ const result = await new Promise((resolve) => {
141
+ launchImageLibrary(
142
+ {
143
+ mediaType: "photo",
144
+ quality: 0.8,
145
+ selectionLimit: 1,
146
+ includeBase64: false
147
+ },
148
+ resolve
149
+ );
150
+ });
151
+ if (!result.didCancel && !result.errorCode && result.assets?.[0]?.uri) {
152
+ setImageLoaded(false);
153
+ onChange?.(result.assets[0].uri);
154
+ }
145
155
  } catch {
146
- if (__DEV__) console.warn("[ImageUpload] expo-image-picker not installed.");
147
- return;
148
- }
149
- const result = await picker.launchImageLibraryAsync({
150
- mediaTypes: ["images"],
151
- allowsEditing,
152
- quality: 0.8
153
- });
154
- if (!result.canceled && result.assets?.[0]) {
155
- setImageLoaded(false);
156
- onChange?.(result.assets[0].uri);
156
+ } finally {
157
+ setIsPicking(false);
157
158
  }
158
159
  };
159
160
  const containerStyle = {
@@ -196,7 +197,7 @@ function ImageUpload({
196
197
  },
197
198
  placeholder
198
199
  ) : null),
199
- loading ? /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: [styles2.loadingOverlay, { backgroundColor: colors.overlay }] }, /* @__PURE__ */ React3__default.default.createElement(Spinner, { size: "md" })) : null,
200
+ loading || isPicking ? /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: [styles2.loadingOverlay, { backgroundColor: colors.overlay }] }, /* @__PURE__ */ React3__default.default.createElement(Spinner, { size: "md" })) : null,
200
201
  value && !loading ? /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles2.editBadge, pointerEvents: "none" }, /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: [styles2.editBadgeInner, { backgroundColor: colors.overlay }] }, /* @__PURE__ */ React3__default.default.createElement(vectorIcons.Feather, { name: "edit-2", size: ms(12), color: "#fff" }))) : null
201
202
  );
202
203
  }
@@ -219,12 +220,12 @@ var styles2 = reactNative.StyleSheet.create({
219
220
  },
220
221
  editBadge: {
221
222
  position: "absolute",
222
- bottom: vs(8),
223
- right: s(8)
223
+ bottom: vs(14),
224
+ right: s(14)
224
225
  },
225
226
  editBadgeInner: {
226
- width: s(28),
227
- height: s(28),
227
+ width: s(24),
228
+ height: s(24),
228
229
  borderRadius: 999,
229
230
  alignItems: "center",
230
231
  justifyContent: "center"
@@ -1,8 +1,7 @@
1
- export { ImageUpload } from './chunk-EROPDCB5.mjs';
1
+ export { ImageUpload } from './chunk-HHOOFDBA.mjs';
2
2
  import './chunk-2VIDP72N.mjs';
3
3
  import './chunk-IFYMBOEN.mjs';
4
4
  import './chunk-ARONDO7M.mjs';
5
5
  import './chunk-QY3X2UYR.mjs';
6
6
  import './chunk-KSSVIFYR.mjs';
7
7
  import './chunk-2CE3TQVY.mjs';
8
- import './chunk-Y6FXYEAI.mjs';
@@ -7,4 +7,3 @@ import './chunk-ARONDO7M.mjs';
7
7
  import './chunk-MZ6WRTD2.mjs';
8
8
  import './chunk-KSSVIFYR.mjs';
9
9
  import './chunk-2CE3TQVY.mjs';
10
- import './chunk-Y6FXYEAI.mjs';
package/dist/Input.mjs CHANGED
@@ -3,4 +3,3 @@ import './chunk-M53LC4Q7.mjs';
3
3
  import './chunk-MZ6WRTD2.mjs';
4
4
  import './chunk-KSSVIFYR.mjs';
5
5
  import './chunk-2CE3TQVY.mjs';
6
- import './chunk-Y6FXYEAI.mjs';
@@ -2,4 +2,3 @@ export { LabelValue } from './chunk-DE25XTVQ.mjs';
2
2
  import './chunk-MZ6WRTD2.mjs';
3
3
  import './chunk-KSSVIFYR.mjs';
4
4
  import './chunk-2CE3TQVY.mjs';
5
- import './chunk-Y6FXYEAI.mjs';
@@ -2,4 +2,3 @@ export { ListGroup, ListGroupFooter, ListGroupHeader } from './chunk-OBV72JD4.mj
2
2
  import './chunk-QY3X2UYR.mjs';
3
3
  import './chunk-KSSVIFYR.mjs';
4
4
  import './chunk-2CE3TQVY.mjs';
5
- import './chunk-Y6FXYEAI.mjs';
@@ -64,8 +64,9 @@ interface ListItemProps {
64
64
  captionStyle?: TextStyle;
65
65
  /** Accessibility label override. Defaults to the title. */
66
66
  accessibilityLabel?: string;
67
+ accessibilityHint?: string;
67
68
  }
68
- declare function ListItemBase({ imageSource, leftRender, rightRender, rightActions, leftIcon, rightIcon, leftIconColor, rightIconColor, title, subtitle, caption, variant, showChevron, showSeparator, onPress, disabled, style, titleStyle, subtitleStyle, subtitleNumberOfLines, captionStyle, accessibilityLabel, }: ListItemProps): React.JSX.Element;
69
+ declare function ListItemBase({ imageSource, leftRender, rightRender, rightActions, leftIcon, rightIcon, leftIconColor, rightIconColor, title, subtitle, caption, variant, showChevron, showSeparator, onPress, disabled, style, titleStyle, subtitleStyle, subtitleNumberOfLines, captionStyle, accessibilityLabel, accessibilityHint, }: ListItemProps): React.JSX.Element;
69
70
  declare const ListItem: React.MemoExoticComponent<typeof ListItemBase>;
70
71
 
71
72
  export { ListItem, type ListItemProps };
@@ -64,8 +64,9 @@ interface ListItemProps {
64
64
  captionStyle?: TextStyle;
65
65
  /** Accessibility label override. Defaults to the title. */
66
66
  accessibilityLabel?: string;
67
+ accessibilityHint?: string;
67
68
  }
68
- declare function ListItemBase({ imageSource, leftRender, rightRender, rightActions, leftIcon, rightIcon, leftIconColor, rightIconColor, title, subtitle, caption, variant, showChevron, showSeparator, onPress, disabled, style, titleStyle, subtitleStyle, subtitleNumberOfLines, captionStyle, accessibilityLabel, }: ListItemProps): React.JSX.Element;
69
+ declare function ListItemBase({ imageSource, leftRender, rightRender, rightActions, leftIcon, rightIcon, leftIconColor, rightIconColor, title, subtitle, caption, variant, showChevron, showSeparator, onPress, disabled, style, titleStyle, subtitleStyle, subtitleNumberOfLines, captionStyle, accessibilityLabel, accessibilityHint, }: ListItemProps): React.JSX.Element;
69
70
  declare const ListItem: React.MemoExoticComponent<typeof ListItemBase>;
70
71
 
71
72
  export { ListItem, type ListItemProps };
package/dist/ListItem.js CHANGED
@@ -120,7 +120,8 @@ function ListItemBase({
120
120
  subtitleStyle,
121
121
  subtitleNumberOfLines = 2,
122
122
  captionStyle,
123
- accessibilityLabel
123
+ accessibilityLabel,
124
+ accessibilityHint
124
125
  }) {
125
126
  const { colors } = useTheme();
126
127
  const handlePress = () => {
@@ -185,6 +186,7 @@ function ListItemBase({
185
186
  activateOnHover: true,
186
187
  accessibilityRole: "button",
187
188
  accessibilityLabel: a11yLabel,
189
+ accessibilityHint,
188
190
  accessibilityState: { disabled: !!disabled }
189
191
  },
190
192
  content
package/dist/ListItem.mjs CHANGED
@@ -1,8 +1,7 @@
1
- export { ListItem } from './chunk-6QLBHUEG.mjs';
1
+ export { ListItem } from './chunk-CZN6L2QU.mjs';
2
2
  import './chunk-IFYMBOEN.mjs';
3
3
  import './chunk-ARONDO7M.mjs';
4
4
  import './chunk-QY3X2UYR.mjs';
5
5
  import './chunk-MZ6WRTD2.mjs';
6
6
  import './chunk-KSSVIFYR.mjs';
7
7
  import './chunk-2CE3TQVY.mjs';
8
- import './chunk-Y6FXYEAI.mjs';
@@ -5,4 +5,3 @@ import './chunk-QY3X2UYR.mjs';
5
5
  import './chunk-MZ6WRTD2.mjs';
6
6
  import './chunk-KSSVIFYR.mjs';
7
7
  import './chunk-2CE3TQVY.mjs';
8
- import './chunk-Y6FXYEAI.mjs';