radix-native-ui 0.1.0 → 0.1.2

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.cjs CHANGED
@@ -1,4 +1,5 @@
1
- //#region rolldown:runtime
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ //#region \0rolldown/runtime.js
2
3
  var __create = Object.create;
3
4
  var __defProp = Object.defineProperty;
4
5
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -3144,7 +3145,7 @@ const ToastRoot = (0, react.forwardRef)(({ toast, onDismiss, config, index, styl
3144
3145
  opacity,
3145
3146
  transform: [{ translateY }, { translateX }],
3146
3147
  backgroundColor: colors.backgroundColor,
3147
- borderColor: colors.borderColor,
3148
+ borderColor: "transparent",
3148
3149
  borderWidth: 1,
3149
3150
  borderRadius: theme.radii.large,
3150
3151
  padding: theme.space[4],
@@ -3169,23 +3170,23 @@ const ToastRoot = (0, react.forwardRef)(({ toast, onDismiss, config, index, styl
3169
3170
  accessibilityLiveRegion: "polite",
3170
3171
  accessibilityLabel: toast.accessibilityLabel || toast.title,
3171
3172
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_native.View, {
3172
- style: [styles$32.contentContainer, { alignItems: toast.description ? "flex-start" : "center" }],
3173
+ style: [styles$34.contentContainer, { alignItems: toast.description ? "flex-start" : "center" }],
3173
3174
  children: [
3174
3175
  toast.icon && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
3175
- style: styles$32.iconContainer,
3176
+ style: styles$34.iconContainer,
3176
3177
  children: toast.icon
3177
3178
  }),
3178
3179
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_native.View, {
3179
- style: styles$32.textContainer,
3180
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Text, {
3181
- style: [styles$32.title, {
3180
+ style: styles$34.textContainer,
3181
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
3182
+ style: [styles$34.title, {
3182
3183
  color: colors.textColor,
3183
3184
  fontSize: theme.typography.fontSizes[3].fontSize
3184
3185
  }],
3185
3186
  numberOfLines: 1,
3186
3187
  children: toast.title
3187
- }), toast.description && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Text, {
3188
- style: [styles$32.description, {
3188
+ }), toast.description && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
3189
+ style: [styles$34.description, {
3189
3190
  fontSize: theme.typography.fontSizes[2].fontSize,
3190
3191
  lineHeight: theme.typography.fontSizes[2].fontSize * 1.5,
3191
3192
  opacity: .8
@@ -3196,14 +3197,14 @@ const ToastRoot = (0, react.forwardRef)(({ toast, onDismiss, config, index, styl
3196
3197
  }),
3197
3198
  toast.action && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Pressable, {
3198
3199
  onPress: toast.action.onPress,
3199
- style: ({ pressed }) => [styles$32.actionButton, { opacity: pressed ? .7 : 1 }],
3200
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Text, {
3201
- style: [styles$32.actionText, { color: colors.accentColor }],
3200
+ style: ({ pressed }) => [styles$34.actionButton, { opacity: pressed ? .7 : 1 }],
3201
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
3202
+ style: [styles$34.actionText, { color: colors.accentColor }],
3202
3203
  children: toast.action.label
3203
3204
  })
3204
3205
  }),
3205
3206
  toast.showClose && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Button, {
3206
- style: { backgroundColor: colors.textColor },
3207
+ color: getVariantColorName(toast.variant),
3207
3208
  radius: "large",
3208
3209
  size: 1,
3209
3210
  onPress: () => handleDismiss(true),
@@ -3222,10 +3223,10 @@ const ToastViewport = (0, react.forwardRef)(({ style }, ref) => {
3222
3223
  if (toasts.length === 0) return null;
3223
3224
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_native.View, {
3224
3225
  ref,
3225
- style: [styles$32.viewport, style],
3226
+ style: [styles$34.viewport, style],
3226
3227
  pointerEvents: "box-none",
3227
3228
  children: [topToasts.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.SafeAreaView, {
3228
- style: styles$32.topContainer,
3229
+ style: styles$34.topContainer,
3229
3230
  pointerEvents: "box-none",
3230
3231
  children: topToasts.map((toast, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToastRoot, {
3231
3232
  toast,
@@ -3234,7 +3235,7 @@ const ToastViewport = (0, react.forwardRef)(({ style }, ref) => {
3234
3235
  index
3235
3236
  }, toast.id))
3236
3237
  }), bottomToasts.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.SafeAreaView, {
3237
- style: styles$32.bottomContainer,
3238
+ style: styles$34.bottomContainer,
3238
3239
  pointerEvents: "box-none",
3239
3240
  children: bottomToasts.map((toast, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToastRoot, {
3240
3241
  toast,
@@ -3248,10 +3249,10 @@ const ToastViewport = (0, react.forwardRef)(({ style }, ref) => {
3248
3249
  ToastViewport.displayName = "Toast.Viewport";
3249
3250
  const ToastTitle = (0, react.forwardRef)(({ children, style }, ref) => {
3250
3251
  const theme = useTheme$1();
3251
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Text, {
3252
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
3252
3253
  ref,
3253
3254
  style: [
3254
- styles$32.title,
3255
+ styles$34.title,
3255
3256
  { fontSize: theme.typography.fontSizes[2].fontSize },
3256
3257
  style
3257
3258
  ],
@@ -3261,10 +3262,10 @@ const ToastTitle = (0, react.forwardRef)(({ children, style }, ref) => {
3261
3262
  ToastTitle.displayName = "Toast.Title";
3262
3263
  const ToastDescription = (0, react.forwardRef)(({ children, style }, ref) => {
3263
3264
  const theme = useTheme$1();
3264
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Text, {
3265
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
3265
3266
  ref,
3266
3267
  style: [
3267
- styles$32.description,
3268
+ styles$34.description,
3268
3269
  { fontSize: theme.typography.fontSizes[1].fontSize },
3269
3270
  style
3270
3271
  ],
@@ -3277,7 +3278,7 @@ const ToastClose = (0, react.forwardRef)(({ children, onPress, style }, ref) =>
3277
3278
  ref,
3278
3279
  onPress,
3279
3280
  style: ({ pressed }) => [
3280
- styles$32.closeButton,
3281
+ styles$34.closeButton,
3281
3282
  { opacity: pressed ? .7 : 1 },
3282
3283
  style
3283
3284
  ],
@@ -3287,7 +3288,7 @@ const ToastClose = (0, react.forwardRef)(({ children, onPress, style }, ref) =>
3287
3288
  left: 8,
3288
3289
  right: 8
3289
3290
  },
3290
- children: children || /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Text, { children: "✕" })
3291
+ children: children || /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, { children: "✕" })
3291
3292
  });
3292
3293
  });
3293
3294
  ToastClose.displayName = "Toast.Close";
@@ -3297,18 +3298,18 @@ const ToastAction = (0, react.forwardRef)(({ label, onPress, style }, ref) => {
3297
3298
  ref,
3298
3299
  onPress,
3299
3300
  style: ({ pressed }) => [
3300
- styles$32.actionButton,
3301
+ styles$34.actionButton,
3301
3302
  { opacity: pressed ? .7 : 1 },
3302
3303
  style
3303
3304
  ],
3304
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Text, {
3305
- style: [styles$32.actionText, { color: theme.accentColor === "indigo" ? theme.colors.indigo[9] : theme.colors[theme.accentColor]?.[9] || theme.colors.indigo[9] }],
3305
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
3306
+ style: [styles$34.actionText, { color: theme.accentColor === "indigo" ? theme.colors.indigo[9] : theme.colors[theme.accentColor]?.[9] || theme.colors.indigo[9] }],
3306
3307
  children: label
3307
3308
  })
3308
3309
  });
3309
3310
  });
3310
3311
  ToastAction.displayName = "Toast.Action";
3311
- const styles$32 = react_native.StyleSheet.create({
3312
+ const styles$34 = react_native.StyleSheet.create({
3312
3313
  viewport: {
3313
3314
  ...react_native.StyleSheet.absoluteFillObject,
3314
3315
  pointerEvents: "box-none"
@@ -3342,7 +3343,7 @@ const styles$32 = react_native.StyleSheet.create({
3342
3343
  },
3343
3344
  title: { fontWeight: "500" },
3344
3345
  description: {
3345
- marginTop: 2,
3346
+ marginTop: 1,
3346
3347
  opacity: .8
3347
3348
  },
3348
3349
  actionButton: {
@@ -3408,7 +3409,7 @@ const useThemeContext = () => {
3408
3409
  * 2. themeOptions object (legacy support)
3409
3410
  * 3. Default values
3410
3411
  */
3411
- const ThemeProvider = ({ children, accentColor, grayColor, radius, scaling, panelBackground, mode: initialMode, appearance, forcedMode, onModeChange, themeOptions = {}, toastConfig: userToastConfig }) => {
3412
+ const ThemeProvider = ({ children, accentColor, grayColor, radius, scaling, panelBackground, mode: initialMode, appearance, forcedMode, onModeChange, themeOptions = {}, toastConfig: userToastConfig, haptics: globalHaptics }) => {
3412
3413
  const parentContext = (0, react.useContext)(ThemeContext);
3413
3414
  const deviceColorScheme = useDeviceColorScheme();
3414
3415
  const resolvedInitialMode = appearance === "inherit" ? void 0 : appearance ?? initialMode;
@@ -3426,9 +3427,10 @@ const ThemeProvider = ({ children, accentColor, grayColor, radius, scaling, pane
3426
3427
  parentContext?.mode,
3427
3428
  deviceColorScheme
3428
3429
  ]);
3429
- const handleSetMode = (newMode) => {
3430
- setMode(newMode);
3431
- onModeChange?.(newMode);
3430
+ const handleSetMode = (newAppearance) => {
3431
+ if (newAppearance === "inherit") setMode(deviceColorScheme ?? "light");
3432
+ else setMode(newAppearance);
3433
+ onModeChange?.(newAppearance === "inherit" ? deviceColorScheme ?? "light" : newAppearance);
3432
3434
  };
3433
3435
  const toggleMode = () => {
3434
3436
  handleSetMode(mode === "light" ? "dark" : "light");
@@ -3499,11 +3501,14 @@ const ThemeProvider = ({ children, accentColor, grayColor, radius, scaling, pane
3499
3501
  ...options
3500
3502
  } : t));
3501
3503
  }, []);
3504
+ const resolvedHaptics = globalHaptics ?? true;
3502
3505
  const value = (0, react.useMemo)(() => ({
3503
3506
  theme,
3504
3507
  mode,
3508
+ appearance: appearance ?? "inherit",
3505
3509
  setMode: handleSetMode,
3506
3510
  toggleMode,
3511
+ haptics: resolvedHaptics,
3507
3512
  toastConfig,
3508
3513
  toasts,
3509
3514
  showToast,
@@ -3513,7 +3518,9 @@ const ThemeProvider = ({ children, accentColor, grayColor, radius, scaling, pane
3513
3518
  }), [
3514
3519
  theme,
3515
3520
  mode,
3521
+ appearance,
3516
3522
  toggleMode,
3523
+ resolvedHaptics,
3517
3524
  toastConfig,
3518
3525
  toasts,
3519
3526
  showToast,
@@ -3542,14 +3549,22 @@ const useThemeMode = () => {
3542
3549
  * Hook to access theme mode setter and toggle
3543
3550
  */
3544
3551
  const useThemeActions = () => {
3545
- const { setMode, toggleMode, mode } = useThemeContext();
3552
+ const { setMode, toggleMode, mode, appearance } = useThemeContext();
3546
3553
  return {
3547
3554
  setMode,
3548
3555
  toggleMode,
3549
- mode
3556
+ mode,
3557
+ appearance
3550
3558
  };
3551
3559
  };
3552
3560
  /**
3561
+ * Hook to access the global haptics setting
3562
+ * @returns boolean - whether haptics are enabled globally
3563
+ */
3564
+ const useHaptics = () => {
3565
+ return useThemeContext().haptics;
3566
+ };
3567
+ /**
3553
3568
  * Hook to access toast functionality
3554
3569
  */
3555
3570
  const useToast = () => {
@@ -3621,6 +3636,15 @@ const useThemeColors = () => {
3621
3636
  panel: isDark ? theme.colors.gray.dark[2] : "#ffffff"
3622
3637
  };
3623
3638
  };
3639
+ /**
3640
+ * Hook to access the global haptics setting
3641
+ * @returns boolean - whether haptics are enabled globally
3642
+ */
3643
+ const useHaptics$1 = () => {
3644
+ const context = (0, react.useContext)(ThemeContext);
3645
+ if (!context) throw new Error("useHaptics must be used within a ThemeProvider");
3646
+ return context.haptics;
3647
+ };
3624
3648
 
3625
3649
  //#endregion
3626
3650
  //#region src/components/primitives/View.tsx
@@ -3638,7 +3662,6 @@ const RnView = react.default.memo(react.default.forwardRef(({ style, wrap, ...re
3638
3662
  });
3639
3663
  }));
3640
3664
  RnView.displayName = "RnView";
3641
- var View_default = RnView;
3642
3665
 
3643
3666
  //#endregion
3644
3667
  //#region src/components/primitives/Text.tsx
@@ -3690,7 +3713,6 @@ const RnPressable = react.default.memo(react.default.forwardRef(({ style, onPres
3690
3713
  });
3691
3714
  }));
3692
3715
  RnPressable.displayName = "RnPressable";
3693
- var Pressable_default = RnPressable;
3694
3716
 
3695
3717
  //#endregion
3696
3718
  //#region src/components/primitives/TouchableOpacity.tsx
@@ -3810,10 +3832,67 @@ const RnActivityIndicator = react.default.memo(react.default.forwardRef(({ color
3810
3832
  }));
3811
3833
  RnActivityIndicator.displayName = "RnActivityIndicator";
3812
3834
 
3835
+ //#endregion
3836
+ //#region src/utils/haptics.ts
3837
+ /**
3838
+ * Try to import expo-haptics, fallback to null if not available
3839
+ */
3840
+ let Haptics = null;
3841
+ (async () => {
3842
+ try {
3843
+ Haptics = await import("expo-haptics");
3844
+ } catch {}
3845
+ })();
3846
+ /**
3847
+ * Triggers haptic feedback with graceful fallback
3848
+ *
3849
+ * On iOS with expo-haptics:
3850
+ * - Uses Taptic Engine for precise, varied feedback (10-20ms)
3851
+ *
3852
+ * On Android or without expo-haptics:
3853
+ * - Falls back to basic vibration (10ms on Android, 400ms on iOS)
3854
+ *
3855
+ * @param type - The type of haptic feedback to trigger (default: 'selection')
3856
+ */
3857
+ const triggerHaptic = (type = "selection") => {
3858
+ if (Haptics) try {
3859
+ switch (type) {
3860
+ case "selection":
3861
+ Haptics.selectionAsync();
3862
+ break;
3863
+ case "press":
3864
+ Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);
3865
+ break;
3866
+ case "impactLight":
3867
+ Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);
3868
+ break;
3869
+ case "impactMedium":
3870
+ Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium);
3871
+ break;
3872
+ case "impactHeavy":
3873
+ Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Heavy);
3874
+ break;
3875
+ case "notificationSuccess":
3876
+ Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success);
3877
+ break;
3878
+ case "notificationWarning":
3879
+ Haptics.notificationAsync(Haptics.NotificationFeedbackType.Warning);
3880
+ break;
3881
+ case "notificationError":
3882
+ Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error);
3883
+ break;
3884
+ }
3885
+ } catch (error) {
3886
+ react_native.Platform.OS === "android" && react_native.Vibration.vibrate(10);
3887
+ }
3888
+ else react_native.Platform.OS === "android" && react_native.Vibration.vibrate(10);
3889
+ };
3890
+
3813
3891
  //#endregion
3814
3892
  //#region src/components/primitives/AnimatedPressable.tsx
3815
- const AnimatedPressableComponent = react_native.Animated.createAnimatedComponent(Pressable_default);
3893
+ const AnimatedPressableComponent = react_native.Animated.createAnimatedComponent(RnPressable);
3816
3894
  const AnimatedPressable = react.default.memo(react.default.forwardRef(({ children, onPressIn, onPressOut, disabled, pressedScale = .97, pressedOpacity = .9, animationDuration = 100, hapticFeedback = true, style, ...rest }, ref) => {
3895
+ const globalHaptics = useHaptics$1();
3817
3896
  const scaleAnim = (0, react.useRef)(new react_native.Animated.Value(1)).current;
3818
3897
  const opacityAnim = (0, react.useRef)(new react_native.Animated.Value(1)).current;
3819
3898
  const animatePressIn = (0, react.useCallback)(() => {
@@ -3853,12 +3932,13 @@ const AnimatedPressable = react.default.memo(react.default.forwardRef(({ childre
3853
3932
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedPressableComponent, {
3854
3933
  ref,
3855
3934
  onPressIn: (0, react.useCallback)((event) => {
3856
- if (hapticFeedback && !disabled) react_native.Vibration.vibrate(10);
3935
+ if (globalHaptics && hapticFeedback && !disabled) triggerHaptic("press");
3857
3936
  animatePressIn();
3858
3937
  onPressIn?.(event);
3859
3938
  }, [
3860
3939
  animatePressIn,
3861
3940
  onPressIn,
3941
+ globalHaptics,
3862
3942
  hapticFeedback,
3863
3943
  disabled
3864
3944
  ]),
@@ -3877,15 +3957,14 @@ const AnimatedPressable = react.default.memo(react.default.forwardRef(({ childre
3877
3957
  });
3878
3958
  }));
3879
3959
  AnimatedPressable.displayName = "AnimatedPressable";
3880
- var AnimatedPressable_default = AnimatedPressable;
3881
3960
 
3882
3961
  //#endregion
3883
3962
  //#region src/components/layout/Box.tsx
3884
3963
  const areEqual$12 = (prevProps, nextProps) => {
3885
- if (prevProps.children === nextProps.children && prevProps.style === nextProps.style && prevProps.backgroundColor === nextProps.backgroundColor && prevProps.display === nextProps.display && prevProps.flexDirection === nextProps.flexDirection && prevProps.opacity === nextProps.opacity && prevProps.radius === nextProps.radius) return true;
3964
+ if (prevProps.children === nextProps.children && prevProps.style === nextProps.style && prevProps.backgroundColor === nextProps.backgroundColor && prevProps.display === nextProps.display && prevProps.flexDirection === nextProps.flexDirection && prevProps.flex === nextProps.flex && prevProps.opacity === nextProps.opacity && prevProps.radius === nextProps.radius) return true;
3886
3965
  return false;
3887
3966
  };
3888
- const Box = react.default.memo(react.default.forwardRef(({ asChild = false, children, style, backgroundColor, radius, display, flexDirection, justifyContent, alignItems, flexWrap, flexGrow, flexShrink, flexBasis, alignSelf, width, height, minWidth, maxWidth, minHeight, maxHeight, position, top, right, bottom, left, zIndex, overflow, margin, marginTop, marginBottom, marginLeft, marginRight, marginHorizontal, marginVertical, padding, paddingTop, paddingBottom, paddingLeft, paddingRight, paddingHorizontal, paddingVertical, borderWidth, borderRadius: borderRadiusProp, borderColor, opacity, elevation, ...rest }, ref) => {
3967
+ const Box = react.default.memo(react.default.forwardRef(({ asChild = false, children, style, backgroundColor, radius, display, flexDirection, justifyContent, alignItems, flexWrap, flex, flexGrow, flexShrink, flexBasis, alignSelf, width, height, minWidth, maxWidth, minHeight, maxHeight, position, top, right, bottom, left, zIndex, overflow, margin, marginTop, marginBottom, marginLeft, marginRight, marginHorizontal, marginVertical, padding, paddingTop, paddingBottom, paddingLeft, paddingRight, paddingHorizontal, paddingVertical, borderWidth, borderRadius: borderRadiusProp, borderColor, opacity, elevation, ...rest }, ref) => {
3889
3968
  const theme = useTheme$1();
3890
3969
  const colors = theme.colors.gray;
3891
3970
  const radii = theme.radii;
@@ -3909,6 +3988,7 @@ const Box = react.default.memo(react.default.forwardRef(({ asChild = false, chil
3909
3988
  justifyContent,
3910
3989
  alignItems,
3911
3990
  flexWrap,
3991
+ flex,
3912
3992
  flexGrow,
3913
3993
  flexShrink,
3914
3994
  flexBasis,
@@ -3951,6 +4031,7 @@ const Box = react.default.memo(react.default.forwardRef(({ asChild = false, chil
3951
4031
  justifyContent,
3952
4032
  alignItems,
3953
4033
  flexWrap,
4034
+ flex,
3954
4035
  flexGrow,
3955
4036
  flexShrink,
3956
4037
  flexBasis,
@@ -4749,12 +4830,12 @@ const Strong = react.default.memo(react.default.forwardRef(({ children, style =
4749
4830
  const colors = useThemeMode$1() === "dark" ? theme.colors.gray.dark : theme.colors.gray;
4750
4831
  const strongFont = theme.typography.fonts.strong;
4751
4832
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
4833
+ color,
4752
4834
  ref,
4753
4835
  style: [(0, react.useMemo)(() => ({
4754
4836
  fontFamily: strongFont.fontFamily,
4755
4837
  fontWeight: strongFont.fontWeight,
4756
- fontStyle: strongFont.fontStyle,
4757
- color: color || colors[12]
4838
+ fontStyle: strongFont.fontStyle
4758
4839
  }), [
4759
4840
  strongFont,
4760
4841
  color,
@@ -5015,7 +5096,7 @@ const areEqual = (prevProps, nextProps) => {
5015
5096
  if (prevProps.children === nextProps.children && prevProps.style === nextProps.style && prevProps.variant === nextProps.variant && prevProps.color === nextProps.color && prevProps.radius === nextProps.radius && prevProps.size === nextProps.size && prevProps.disabled === nextProps.disabled && prevProps.loading === nextProps.loading && prevProps.onPress === nextProps.onPress && prevProps.onLongPress === nextProps.onLongPress && prevProps.delayLongPress === nextProps.delayLongPress && prevProps.width === nextProps.width && prevProps.highContrast === nextProps.highContrast) return true;
5016
5097
  return false;
5017
5098
  };
5018
- const Button = react.default.memo(react.default.forwardRef(({ children, style, variant = "classic", color, radius, size = 2, disabled, loading, onPress, accessibilityLabel, width, highContrast, hapticFeedback, ...rest }, ref) => {
5099
+ const Button = react.default.memo(react.default.forwardRef(({ children, style, variant = "solid", color, radius, size = 2, disabled, loading, onPress, accessibilityLabel, width, highContrast, hapticFeedback, ...rest }, ref) => {
5019
5100
  const theme = useTheme$1();
5020
5101
  const mode = useThemeMode$1();
5021
5102
  const isDark = mode === "dark";
@@ -5169,7 +5250,7 @@ const Button = react.default.memo(react.default.forwardRef(({ children, style, v
5169
5250
  children: labelProps.children
5170
5251
  }, "label");
5171
5252
  };
5172
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedPressable_default, {
5253
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedPressable, {
5173
5254
  ref,
5174
5255
  style: [buttonStyle, style],
5175
5256
  onPress: handlePress,
@@ -5202,52 +5283,48 @@ Button.Label = ButtonLabel;
5202
5283
 
5203
5284
  //#endregion
5204
5285
  //#region src/components/forms/IconButton.tsx
5205
- const IconButton = react.default.forwardRef(({ children, style = {}, variant = "classic", color, size = 2, radius, asChild = false, disabled, loading, onPress, accessibilityLabel, highContrast, hapticFeedback, ...rest }, ref) => {
5286
+ const IconButton = react.default.forwardRef(({ children, style = {}, variant = "solid", color, size = 2, radius, asChild = false, disabled, loading, onPress, accessibilityLabel, highContrast, hapticFeedback, ...rest }, ref) => {
5206
5287
  const theme = useTheme$1();
5207
5288
  const mode = useThemeMode$1();
5208
5289
  mode === "dark" ? theme.colors.gray.dark : theme.colors.gray;
5209
5290
  const grayAlpha = getGrayAlpha(theme);
5210
5291
  getAccentColor(theme, mode);
5211
5292
  getAccentAlpha(theme);
5212
- const radii = theme.radii;
5213
- const activeColor = color || theme.accentColor;
5214
- const getBorderRadius = () => {
5215
- if (radius) return radius === "full" ? 9999 : radii[radius];
5216
- };
5217
- const variantColors = getVariantColors(theme, activeColor, mode, variant, highContrast);
5293
+ const radii = theme.radii[radius || theme.radius] ?? theme.radii.medium;
5294
+ const selectedRadius = radius || theme.radius;
5295
+ const variantColors = getVariantColors(theme, color || theme.accentColor, mode, variant, highContrast);
5218
5296
  const getSizeValues = () => {
5219
5297
  switch (size) {
5220
5298
  case 1: return {
5221
5299
  size: 32,
5222
5300
  iconSize: 16,
5223
- borderRadius: radii.small
5301
+ borderRadius: selectedRadius === "full" ? 9999 : radii
5224
5302
  };
5225
5303
  case 3: return {
5226
5304
  size: 56,
5227
5305
  iconSize: 24,
5228
- borderRadius: radii.medium
5306
+ borderRadius: selectedRadius === "full" ? 9999 : radii
5229
5307
  };
5230
5308
  case 4: return {
5231
5309
  size: 64,
5232
5310
  iconSize: 28,
5233
- borderRadius: radii.large
5311
+ borderRadius: selectedRadius === "full" ? 9999 : radii
5234
5312
  };
5235
5313
  default: return {
5236
5314
  size: 40,
5237
5315
  iconSize: 20,
5238
- borderRadius: radii.medium
5316
+ borderRadius: selectedRadius === "full" ? 9999 : radii
5239
5317
  };
5240
5318
  }
5241
5319
  };
5242
5320
  const sizeValues = getSizeValues();
5243
- const customBorderRadius = getBorderRadius();
5244
5321
  const buttonStyle = {
5245
5322
  width: sizeValues.size,
5246
5323
  height: sizeValues.size,
5247
5324
  backgroundColor: disabled ? grayAlpha["3"] : variantColors.backgroundColor,
5248
5325
  borderColor: variantColors.borderColor,
5249
5326
  borderWidth: variant === "outline" ? 1 : 0,
5250
- borderRadius: customBorderRadius !== void 0 ? customBorderRadius : sizeValues.borderRadius,
5327
+ borderRadius: sizeValues.borderRadius,
5251
5328
  opacity: disabled ? .5 : 1,
5252
5329
  alignItems: "center",
5253
5330
  justifyContent: "center"
@@ -5270,7 +5347,7 @@ const IconButton = react.default.forwardRef(({ children, style = {}, variant = "
5270
5347
  ...child.props
5271
5348
  });
5272
5349
  }
5273
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedPressable_default, {
5350
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedPressable, {
5274
5351
  ref,
5275
5352
  style: [buttonStyle, style],
5276
5353
  onPress,
@@ -5287,8 +5364,8 @@ const IconButton = react.default.forwardRef(({ children, style = {}, variant = "
5287
5364
  size: "small",
5288
5365
  color: variantColors.textColor
5289
5366
  }) : react.default.isValidElement(children) ? react.default.cloneElement(children, {
5290
- size: sizeValues.iconSize,
5291
- color: variantColors.textColor
5367
+ size: children.props?.size || sizeValues.iconSize,
5368
+ color: children.props?.color || variantColors.textColor
5292
5369
  }) : children
5293
5370
  });
5294
5371
  });
@@ -5418,7 +5495,6 @@ const TextFieldRoot = react.default.forwardRef(({ children, ...props }, ref) =>
5418
5495
  };
5419
5496
  const inputContainerStyle = {
5420
5497
  width: "100%",
5421
- flex: 1,
5422
5498
  flexDirection: "row",
5423
5499
  alignItems: "center",
5424
5500
  justifyContent: "space-between",
@@ -5442,7 +5518,8 @@ const TextFieldRoot = react.default.forwardRef(({ children, ...props }, ref) =>
5442
5518
  paddingHorizontal: sizeValues.paddingHorizontal / 2,
5443
5519
  minHeight: multiline ? sizeValues.height : void 0,
5444
5520
  height: multiline ? void 0 : sizeValues.height,
5445
- textAlignVertical: multiline ? "top" : "center"
5521
+ textAlignVertical: multiline ? "top" : "center",
5522
+ borderRadius: sizeValues.borderRadius
5446
5523
  };
5447
5524
  const errorStyle = {
5448
5525
  color: theme.colors.ruby[10],
@@ -5468,7 +5545,7 @@ const TextFieldRoot = react.default.forwardRef(({ children, ...props }, ref) =>
5468
5545
  };
5469
5546
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_native.View, {
5470
5547
  style: [
5471
- styles$31.container,
5548
+ styles$33.container,
5472
5549
  containerStyle,
5473
5550
  style
5474
5551
  ],
@@ -5486,7 +5563,7 @@ const TextFieldRoot = react.default.forwardRef(({ children, ...props }, ref) =>
5486
5563
  style: inputInnerContainerStyle,
5487
5564
  children: [
5488
5565
  leftSlots.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
5489
- style: [styles$31.leftSlots, slotWrapperStyle],
5566
+ style: [styles$33.leftSlots, slotWrapperStyle],
5490
5567
  children: leftSlots.map((child, index) => (0, react.isValidElement)(child) ? react.default.cloneElement(child, {
5491
5568
  key: index,
5492
5569
  side: "left"
@@ -5497,11 +5574,11 @@ const TextFieldRoot = react.default.forwardRef(({ children, ...props }, ref) =>
5497
5574
  style: { flex: 1 },
5498
5575
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnTextInput, {
5499
5576
  ...commonInputProps,
5500
- style: [styles$31.input, inputStyle]
5577
+ style: [styles$33.input, inputStyle]
5501
5578
  })
5502
5579
  }),
5503
5580
  rightSlots.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
5504
- style: [styles$31.rightSlots, slotWrapperStyle],
5581
+ style: [styles$33.rightSlots, slotWrapperStyle],
5505
5582
  children: rightSlots.map((child, index) => (0, react.isValidElement)(child) ? react.default.cloneElement(child, {
5506
5583
  key: index,
5507
5584
  side: "right"
@@ -5527,11 +5604,8 @@ const TextField = react.default.forwardRef((props, ref) => {
5527
5604
  TextField.displayName = "TextField";
5528
5605
  TextField.Root = TextFieldRoot;
5529
5606
  TextField.Slot = TextFieldSlot;
5530
- const styles$31 = react_native.StyleSheet.create({
5531
- container: {
5532
- flex: 1,
5533
- width: "100%"
5534
- },
5607
+ const styles$33 = react_native.StyleSheet.create({
5608
+ container: { width: "100%" },
5535
5609
  leftSlots: {
5536
5610
  flexDirection: "row",
5537
5611
  alignItems: "center"
@@ -5543,25 +5617,73 @@ const styles$31 = react_native.StyleSheet.create({
5543
5617
  input: {
5544
5618
  flexDirection: "row",
5545
5619
  width: "100%",
5546
- minWidth: "100%",
5547
- flex: 1
5620
+ minWidth: "100%"
5548
5621
  }
5549
5622
  });
5550
5623
 
5551
5624
  //#endregion
5552
5625
  //#region src/components/forms/TextArea.tsx
5553
- const TextAreaRoot = react.default.forwardRef((props, ref) => {
5626
+ const TextAreaSlot = react.default.forwardRef(({ side, color, gap, paddingHorizontal, paddingLeft, paddingRight, children, ...props }, ref) => {
5627
+ const theme = useTheme$1();
5628
+ const isDark = useThemeMode$1() === "dark";
5629
+ const slotStyle = {
5630
+ ...props.style,
5631
+ gap: gap !== void 0 ? gap : void 0,
5632
+ paddingHorizontal: paddingHorizontal !== void 0 ? paddingHorizontal : void 0,
5633
+ paddingLeft: paddingLeft !== void 0 ? paddingLeft : void 0,
5634
+ paddingRight: paddingRight !== void 0 ? paddingRight : void 0
5635
+ };
5636
+ const coloredChild = (0, react.useMemo)(() => {
5637
+ if (!color || !(0, react.isValidElement)(children)) return children;
5638
+ return react.default.cloneElement(children, { color: theme.colors[color][9] });
5639
+ }, [
5640
+ children,
5641
+ color,
5642
+ theme,
5643
+ isDark
5644
+ ]);
5645
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Slot, {
5646
+ ref,
5647
+ style: slotStyle,
5648
+ ...props,
5649
+ children: coloredChild
5650
+ });
5651
+ });
5652
+ TextAreaSlot.displayName = "TextAreaSlot";
5653
+ const TextAreaRoot = react.default.forwardRef(({ children, ...props }, ref) => {
5554
5654
  const theme = useTheme$1();
5555
5655
  const mode = useThemeMode$1();
5556
5656
  const isDark = mode === "dark";
5557
5657
  const grayScale = isDark ? theme.colors.gray.dark : theme.colors.gray;
5558
5658
  const grayAlpha = getGrayAlpha(theme);
5559
5659
  const { value, onChangeText, placeholder, label, error, disabled = false, color = "gray", highContrast = false, radius = "medium", size = "2", variant = "outline", rows = 4, autoGrow = false, accessibilityLabel, accessibilityHint, style, ...rest } = props;
5660
+ const { leftSlots, rightSlots } = (0, react.useMemo)(() => {
5661
+ const slotChildren = [];
5662
+ react.Children.forEach(children, (child) => {
5663
+ if (!(0, react.isValidElement)(child)) return;
5664
+ if (child.type?.displayName === "TextAreaSlot") slotChildren.push(child);
5665
+ });
5666
+ const leftSlots = [];
5667
+ const rightSlots = [];
5668
+ slotChildren.forEach((child) => {
5669
+ if (!(0, react.isValidElement)(child)) return;
5670
+ const explicitSide = child.props.side;
5671
+ if (explicitSide === "left") leftSlots.push(child);
5672
+ else if (explicitSide === "right") rightSlots.push(child);
5673
+ else if (slotChildren.filter((c) => (0, react.isValidElement)(c) && !c.props?.side).indexOf(child) === 0) leftSlots.push(child);
5674
+ else rightSlots.push(child);
5675
+ });
5676
+ return {
5677
+ leftSlots,
5678
+ rightSlots
5679
+ };
5680
+ }, [children]);
5560
5681
  const [isFocused, setIsFocused] = (0, react.useState)(false);
5561
5682
  const activeColor = color || theme.accentColor;
5562
5683
  const radii = theme.radii[radius] ?? theme.radii.medium;
5563
5684
  const selectedRadius = radius || theme.radius;
5564
5685
  const variantColors = getVariantColors(theme, activeColor, mode, variant, highContrast);
5686
+ const accentColorScale = getColorScale(theme, activeColor, mode);
5565
5687
  const getSizeValues = () => {
5566
5688
  switch (size) {
5567
5689
  case "1": return {
@@ -5590,10 +5712,10 @@ const TextAreaRoot = react.default.forwardRef((props, ref) => {
5590
5712
  };
5591
5713
  const inputContainerBorderColor = () => {
5592
5714
  if (error) return theme.colors.ruby[9];
5593
- else return isFocused ? theme.colors[activeColor]["8"] : "transparent";
5715
+ else return isFocused ? accentColorScale["8"] : "transparent";
5594
5716
  };
5595
5717
  const inputContainerBackgroundColor = () => {
5596
- if (disabled) return isDark ? grayAlpha["3"] : grayAlpha["2"];
5718
+ if (disabled) return isDark ? grayAlpha["2"] : grayAlpha["2"];
5597
5719
  else return variantColors.backgroundColor;
5598
5720
  };
5599
5721
  const inputBorderColor = () => {
@@ -5602,16 +5724,21 @@ const TextAreaRoot = react.default.forwardRef((props, ref) => {
5602
5724
  };
5603
5725
  const inputContainerStyle = {
5604
5726
  width: "100%",
5605
- borderWidth: 2,
5727
+ flexDirection: "row",
5728
+ alignItems: "flex-start",
5729
+ justifyContent: "space-between",
5730
+ borderWidth: variant === "soft" ? 1.4 : 2,
5606
5731
  borderColor: inputContainerBorderColor(),
5607
5732
  backgroundColor: inputContainerBackgroundColor(),
5608
5733
  borderRadius: selectedRadius === "full" ? theme.radii.large : radii,
5609
5734
  opacity: disabled ? .6 : 1
5610
5735
  };
5611
- const inputStyle = {
5736
+ const inputInnerContainerStyle = {
5612
5737
  borderWidth: 1,
5613
5738
  borderColor: inputBorderColor(),
5614
- borderRadius: selectedRadius === "full" ? theme.radii.large : radii,
5739
+ borderRadius: selectedRadius === "full" ? theme.radii.large : radii
5740
+ };
5741
+ const inputStyle = {
5615
5742
  fontSize: sizeValues.fontSize,
5616
5743
  color: color !== "gray" ? variantColors.textColor : grayScale[12],
5617
5744
  padding: sizeValues.padding,
@@ -5625,7 +5752,7 @@ const TextAreaRoot = react.default.forwardRef((props, ref) => {
5625
5752
  };
5626
5753
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_native.View, {
5627
5754
  style: [
5628
- styles$30.container,
5755
+ styles$32.container,
5629
5756
  containerStyle,
5630
5757
  style
5631
5758
  ],
@@ -5637,21 +5764,47 @@ const TextAreaRoot = react.default.forwardRef((props, ref) => {
5637
5764
  }),
5638
5765
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
5639
5766
  style: inputContainerStyle,
5640
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnTextInput, {
5641
- ref,
5642
- value,
5643
- onChangeText,
5644
- placeholder,
5645
- placeholderTextColor: color !== "gray" ? theme.colors[color][12] + "99" : theme.colors.gray[9],
5646
- editable: !disabled,
5647
- multiline: true,
5648
- accessibilityLabel: accessibilityLabel || label,
5649
- accessibilityHint,
5650
- accessibilityState: { disabled },
5651
- style: [styles$30.input, inputStyle],
5652
- onFocus: () => setIsFocused(true),
5653
- onBlur: () => setIsFocused(false),
5654
- ...rest
5767
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(Flex, {
5768
+ align: "stretch",
5769
+ direction: "row",
5770
+ style: inputInnerContainerStyle,
5771
+ children: [
5772
+ leftSlots.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
5773
+ style: styles$32.leftSlots,
5774
+ children: leftSlots.map((child, index) => (0, react.isValidElement)(child) ? react.default.cloneElement(child, {
5775
+ key: index,
5776
+ side: "left"
5777
+ }) : child)
5778
+ }),
5779
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Flex, {
5780
+ direction: "row",
5781
+ style: { flex: 1 },
5782
+ wrap: "wrap",
5783
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnTextInput, {
5784
+ ref,
5785
+ value,
5786
+ onChangeText,
5787
+ placeholder,
5788
+ placeholderTextColor: color !== "gray" ? theme.colors[color][12] + "99" : theme.colors.gray[9],
5789
+ editable: !disabled,
5790
+ multiline: true,
5791
+ accessibilityLabel: accessibilityLabel || label,
5792
+ accessibilityHint,
5793
+ accessibilityState: { disabled },
5794
+ style: [styles$32.input, inputStyle],
5795
+ onFocus: () => setIsFocused(true),
5796
+ onBlur: () => setIsFocused(false),
5797
+ ...rest
5798
+ })
5799
+ }),
5800
+ rightSlots.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
5801
+ style: styles$32.rightSlots,
5802
+ children: rightSlots.map((child, index) => (0, react.isValidElement)(child) ? react.default.cloneElement(child, {
5803
+ key: index,
5804
+ side: "right"
5805
+ }) : child)
5806
+ })
5807
+ ]
5655
5808
  })
5656
5809
  }),
5657
5810
  error && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnText, {
@@ -5669,12 +5822,19 @@ const TextArea = react.default.forwardRef((props, ref) => {
5669
5822
  });
5670
5823
  });
5671
5824
  TextArea.displayName = "TextArea";
5672
- const styles$30 = react_native.StyleSheet.create({
5825
+ TextArea.Root = TextAreaRoot;
5826
+ TextArea.Slot = TextAreaSlot;
5827
+ const styles$32 = react_native.StyleSheet.create({
5673
5828
  container: { width: "100%" },
5674
- input: {
5675
- width: "100%",
5676
- minHeight: 100
5677
- }
5829
+ leftSlots: {
5830
+ flexDirection: "row",
5831
+ alignItems: "flex-start"
5832
+ },
5833
+ rightSlots: {
5834
+ flexDirection: "row",
5835
+ alignItems: "flex-start"
5836
+ },
5837
+ input: { minWidth: "100%" }
5678
5838
  });
5679
5839
 
5680
5840
  //#endregion
@@ -5685,6 +5845,7 @@ const Checkbox = react.default.forwardRef(({ checked, defaultChecked = false, on
5685
5845
  const isChecked = isControlled ? checked : internalChecked;
5686
5846
  const theme = useTheme$1();
5687
5847
  const mode = useThemeMode$1();
5848
+ const globalHaptics = useHaptics$1();
5688
5849
  const isDark = mode === "dark";
5689
5850
  const grayScale = isDark ? theme.colors.gray.dark : theme.colors.gray;
5690
5851
  const grayAlpha = getGrayAlpha(theme);
@@ -5730,7 +5891,7 @@ const Checkbox = react.default.forwardRef(({ checked, defaultChecked = false, on
5730
5891
  setInternalChecked(newChecked);
5731
5892
  onCheckedChange?.(newChecked);
5732
5893
  }
5733
- if (hapticFeedback) react_native.Vibration.vibrate(10);
5894
+ if (globalHaptics && hapticFeedback) triggerHaptic("press");
5734
5895
  }
5735
5896
  };
5736
5897
  const boxStyle = {
@@ -5752,9 +5913,9 @@ const Checkbox = react.default.forwardRef(({ checked, defaultChecked = false, on
5752
5913
  color: theme.colors.gray || grayScale[12],
5753
5914
  fontSize: sizeValues.fontSize
5754
5915
  };
5755
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(AnimatedPressable_default, {
5916
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(AnimatedPressable, {
5756
5917
  ref,
5757
- style: styles$29.container,
5918
+ style: styles$31.container,
5758
5919
  onPress: handlePress,
5759
5920
  disabled,
5760
5921
  accessibilityRole: "checkbox",
@@ -5770,9 +5931,9 @@ const Checkbox = react.default.forwardRef(({ checked, defaultChecked = false, on
5770
5931
  hapticFeedback: false,
5771
5932
  ...rest,
5772
5933
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
5773
- style: [styles$29.checkbox, boxStyle],
5934
+ style: [styles$31.checkbox, boxStyle],
5774
5935
  children: (isChecked || indeterminate) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
5775
- style: [styles$29.icon, iconStyle],
5936
+ style: [styles$31.icon, iconStyle],
5776
5937
  children: indeterminate ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, { style: {
5777
5938
  width: sizeValues.iconSize * .9,
5778
5939
  height: 2.8,
@@ -5803,13 +5964,13 @@ const Checkbox = react.default.forwardRef(({ checked, defaultChecked = false, on
5803
5964
  } })] })
5804
5965
  })
5805
5966
  }), label && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
5806
- style: [styles$29.label, labelStyle],
5967
+ style: [styles$31.label, labelStyle],
5807
5968
  children: label
5808
5969
  })]
5809
5970
  });
5810
5971
  });
5811
5972
  Checkbox.displayName = "Checkbox";
5812
- const styles$29 = react_native.StyleSheet.create({
5973
+ const styles$31 = react_native.StyleSheet.create({
5813
5974
  container: {
5814
5975
  flexDirection: "row",
5815
5976
  alignItems: "center"
@@ -5839,7 +6000,7 @@ const CheckboxGroup = react.default.forwardRef(({ value, onValueChange, items, d
5839
6000
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
5840
6001
  ref,
5841
6002
  style: [
5842
- styles$28.container,
6003
+ styles$30.container,
5843
6004
  containerStyle,
5844
6005
  style
5845
6006
  ],
@@ -5858,7 +6019,7 @@ const CheckboxGroup = react.default.forwardRef(({ value, onValueChange, items, d
5858
6019
  });
5859
6020
  });
5860
6021
  CheckboxGroup.displayName = "CheckboxGroup";
5861
- const styles$28 = react_native.StyleSheet.create({ container: { width: "100%" } });
6022
+ const styles$30 = react_native.StyleSheet.create({ container: { width: "100%" } });
5862
6023
 
5863
6024
  //#endregion
5864
6025
  //#region src/components/forms/CheckboxCards.tsx
@@ -5896,7 +6057,7 @@ const CheckboxCardsRoot = react.default.forwardRef(({ value: controlledValue, de
5896
6057
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
5897
6058
  ref,
5898
6059
  style: [
5899
- styles$27.rootContainer,
6060
+ styles$29.rootContainer,
5900
6061
  containerStyle,
5901
6062
  style
5902
6063
  ],
@@ -5910,6 +6071,7 @@ const CheckboxCardsItem = react.default.forwardRef(({ value, side: itemSide, dis
5910
6071
  const context = useCheckboxCardsContext();
5911
6072
  const theme = useTheme$1();
5912
6073
  const mode = useThemeMode$1();
6074
+ const globalHaptics = useHaptics$1();
5913
6075
  const isDark = mode === "dark";
5914
6076
  const { value: selectedValues, onValueChange, variant, size, color, highContrast, radius, side: rootSide, disabled: rootDisabled } = context;
5915
6077
  const isChecked = selectedValues.includes(value);
@@ -5949,7 +6111,7 @@ const CheckboxCardsItem = react.default.forwardRef(({ value, side: itemSide, dis
5949
6111
  if (!isDisabled) {
5950
6112
  if (isChecked) onValueChange(selectedValues.filter((v) => v !== value));
5951
6113
  else onValueChange([...selectedValues, value]);
5952
- react_native.Vibration.vibrate(10);
6114
+ if (globalHaptics) triggerHaptic("press");
5953
6115
  }
5954
6116
  };
5955
6117
  const cardStyle = {
@@ -5964,10 +6126,10 @@ const CheckboxCardsItem = react.default.forwardRef(({ value, side: itemSide, dis
5964
6126
  gap: theme.space[3]
5965
6127
  };
5966
6128
  sizeValues.indicatorSize, sizeValues.indicatorSize, sizeValues.borderWidth, isChecked ? variantColors.borderColor : grayAlpha["8"], isChecked && variantColors.backgroundColor;
5967
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(AnimatedPressable_default, {
6129
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(AnimatedPressable, {
5968
6130
  ref,
5969
6131
  style: [
5970
- styles$27.itemContainer,
6132
+ styles$29.itemContainer,
5971
6133
  cardStyle,
5972
6134
  style
5973
6135
  ],
@@ -5994,13 +6156,13 @@ const CheckboxCardsItem = react.default.forwardRef(({ value, side: itemSide, dis
5994
6156
  size,
5995
6157
  onCheckedChange: handlePress
5996
6158
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
5997
- style: styles$27.content,
6159
+ style: styles$29.content,
5998
6160
  children
5999
6161
  })]
6000
6162
  });
6001
6163
  });
6002
6164
  CheckboxCardsItem.displayName = "CheckboxCards.Item";
6003
- const styles$27 = react_native.StyleSheet.create({
6165
+ const styles$29 = react_native.StyleSheet.create({
6004
6166
  rootContainer: { width: "100%" },
6005
6167
  itemContainer: { flex: 1 },
6006
6168
  content: { flex: 1 }
@@ -6015,6 +6177,7 @@ const CheckboxCards = {
6015
6177
  const Radio = react.default.forwardRef(({ defaultChecked, value, selected, onSelect, disabled = false, size = "2", variant = "solid", color, label, children, highContrast = false, accessibilityLabel, accessibilityHint, hapticFeedback = true, ...rest }, ref) => {
6016
6178
  const theme = useTheme$1();
6017
6179
  const mode = useThemeMode$1();
6180
+ const globalHaptics = useHaptics$1();
6018
6181
  const grayScale = mode === "dark" ? theme.colors.gray.dark : theme.colors.gray;
6019
6182
  getGrayAlpha(theme);
6020
6183
  const accentScale = getAccentColor(theme, mode);
@@ -6054,7 +6217,7 @@ const Radio = react.default.forwardRef(({ defaultChecked, value, selected, onSel
6054
6217
  if (!disabled) {
6055
6218
  if (onSelect) onSelect(value);
6056
6219
  if (selected === void 0) setIsInternallySelected(true);
6057
- if (hapticFeedback) react_native.Vibration.vibrate(10);
6220
+ if (globalHaptics && hapticFeedback) triggerHaptic("press");
6058
6221
  }
6059
6222
  };
6060
6223
  const outerStyle = {
@@ -6078,9 +6241,9 @@ const Radio = react.default.forwardRef(({ defaultChecked, value, selected, onSel
6078
6241
  color: grayScale[12],
6079
6242
  fontSize: sizeValues.fontSize
6080
6243
  };
6081
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(AnimatedPressable_default, {
6244
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(AnimatedPressable, {
6082
6245
  ref,
6083
- style: styles$26.container,
6246
+ style: styles$28.container,
6084
6247
  onPress: handlePress,
6085
6248
  disabled,
6086
6249
  accessibilityRole: "radio",
@@ -6096,19 +6259,19 @@ const Radio = react.default.forwardRef(({ defaultChecked, value, selected, onSel
6096
6259
  hapticFeedback: false,
6097
6260
  ...rest,
6098
6261
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
6099
- style: [styles$26.radioOuter, outerStyle],
6100
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, { style: [styles$26.radioInner, innerStyle] })
6262
+ style: [styles$28.radioOuter, outerStyle],
6263
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, { style: [styles$28.radioInner, innerStyle] })
6101
6264
  }), children ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
6102
- style: styles$26.content,
6265
+ style: styles$28.content,
6103
6266
  children
6104
6267
  }) : label ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
6105
- style: [styles$26.label, labelStyle],
6268
+ style: [styles$28.label, labelStyle],
6106
6269
  children: label
6107
6270
  }) : null]
6108
6271
  });
6109
6272
  });
6110
6273
  Radio.displayName = "Radio";
6111
- const styles$26 = react_native.StyleSheet.create({
6274
+ const styles$28 = react_native.StyleSheet.create({
6112
6275
  container: {
6113
6276
  flexDirection: "row",
6114
6277
  alignItems: "center"
@@ -6159,7 +6322,7 @@ const RadioGroupRoot = react.default.forwardRef(({ value: controlledValue, defau
6159
6322
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
6160
6323
  ref,
6161
6324
  style: [
6162
- styles$25.container,
6325
+ styles$27.container,
6163
6326
  containerStyle,
6164
6327
  style
6165
6328
  ],
@@ -6190,7 +6353,7 @@ const RadioGroupItem = react.default.forwardRef(({ value, disabled: itemDisabled
6190
6353
  });
6191
6354
  });
6192
6355
  RadioGroupItem.displayName = "RadioGroup.Item";
6193
- const styles$25 = react_native.StyleSheet.create({ container: { width: "100%" } });
6356
+ const styles$27 = react_native.StyleSheet.create({ container: { width: "100%" } });
6194
6357
  const RadioGroup = {
6195
6358
  Root: RadioGroupRoot,
6196
6359
  Item: RadioGroupItem
@@ -6232,7 +6395,7 @@ const RadioCardsRoot = react.default.forwardRef(({ value: controlledValue, defau
6232
6395
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
6233
6396
  ref,
6234
6397
  style: [
6235
- styles$24.rootContainer,
6398
+ styles$26.rootContainer,
6236
6399
  containerStyle,
6237
6400
  style
6238
6401
  ],
@@ -6246,6 +6409,7 @@ const RadioCardsItem = react.default.forwardRef(({ value, side: itemSide, disabl
6246
6409
  const context = useRadioCardsContext();
6247
6410
  const theme = useTheme$1();
6248
6411
  const mode = useThemeMode$1();
6412
+ const globalHaptics = useHaptics$1();
6249
6413
  const isDark = mode === "dark";
6250
6414
  const { value: selectedValue, onValueChange, variant, size, color, highContrast, radius, side: rootSide, disabled: rootDisabled } = context;
6251
6415
  const isSelected = selectedValue === value;
@@ -6281,14 +6445,14 @@ const RadioCardsItem = react.default.forwardRef(({ value, side: itemSide, disabl
6281
6445
  const handlePress = () => {
6282
6446
  if (!isDisabled) {
6283
6447
  onValueChange(value);
6284
- react_native.Vibration.vibrate(10);
6448
+ if (globalHaptics) triggerHaptic("press");
6285
6449
  }
6286
6450
  };
6287
6451
  const cardStyle = {
6288
6452
  padding: sizeValues.padding,
6289
6453
  borderRadius: radius === "full" ? 9999 : radii,
6290
6454
  borderWidth: isSelected ? 1.5 : 1,
6291
- borderColor: isSelected ? variantColors.borderColor : isDark ? grayAlpha["6"] : grayAlpha["6"],
6455
+ borderColor: isSelected ? variantColors.borderColor : ["outline", "surface"].includes(variant) ? isDark ? grayAlpha["6"] : grayAlpha["6"] : "transparent",
6292
6456
  backgroundColor: isSelected ? variantColors.backgroundColor : isDark ? grayAlpha["2"] : grayAlpha["2"],
6293
6457
  opacity: isDisabled ? .5 : 1,
6294
6458
  flexDirection: indicatorSide === "left" ? "row" : "row-reverse",
@@ -6311,10 +6475,10 @@ const RadioCardsItem = react.default.forwardRef(({ value, side: itemSide, disabl
6311
6475
  borderRadius: sizeValues.innerIndicatorSize / 2,
6312
6476
  backgroundColor: variantColors.textColor
6313
6477
  };
6314
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(AnimatedPressable_default, {
6478
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(AnimatedPressable, {
6315
6479
  ref,
6316
6480
  style: [
6317
- styles$24.itemContainer,
6481
+ styles$26.itemContainer,
6318
6482
  cardStyle,
6319
6483
  style
6320
6484
  ],
@@ -6339,15 +6503,15 @@ const RadioCardsItem = react.default.forwardRef(({ value, side: itemSide, disabl
6339
6503
  style: indicatorStyle,
6340
6504
  children: isSelected && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, { style: innerDotStyle })
6341
6505
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
6342
- style: styles$24.content,
6506
+ style: styles$26.content,
6343
6507
  children
6344
6508
  })]
6345
6509
  });
6346
6510
  });
6347
6511
  RadioCardsItem.displayName = "RadioCards.Item";
6348
- const styles$24 = react_native.StyleSheet.create({
6512
+ const styles$26 = react_native.StyleSheet.create({
6349
6513
  rootContainer: { width: "100%" },
6350
- itemContainer: { flex: 1 },
6514
+ itemContainer: {},
6351
6515
  content: { flex: 1 }
6352
6516
  });
6353
6517
  const RadioCards = {
@@ -6360,6 +6524,7 @@ const RadioCards = {
6360
6524
  const Switch = react.default.forwardRef(({ defaultChecked, checked, onCheckedChange, disabled = false, radius = "full", size = "2", color, variant = "solid", thumbColor, label, highContrast, accessibilityLabel, accessibilityHint, hapticFeedback = true, ...rest }, ref) => {
6361
6525
  const theme = useTheme$1();
6362
6526
  const mode = useThemeMode$1();
6527
+ const globalHaptics = useHaptics$1();
6363
6528
  const isDark = mode === "dark";
6364
6529
  const grayScale = isDark ? theme.colors.gray.dark : theme.colors.gray;
6365
6530
  const grayAlpha = getGrayAlpha(theme);
@@ -6377,7 +6542,7 @@ const Switch = react.default.forwardRef(({ defaultChecked, checked, onCheckedCha
6377
6542
  const setChecked = (value) => {
6378
6543
  if (checked === void 0) setInternalChecked(value);
6379
6544
  if (onCheckedChange) onCheckedChange(value);
6380
- if (hapticFeedback && !disabled) react_native.Vibration.vibrate(10);
6545
+ if (globalHaptics && hapticFeedback && !disabled) triggerHaptic("press");
6381
6546
  };
6382
6547
  const animatedValue = (0, react.useRef)(new react_native.Animated.Value(isChecked ? 1 : 0));
6383
6548
  (0, react.useEffect)(() => {
@@ -6443,9 +6608,9 @@ const Switch = react.default.forwardRef(({ defaultChecked, checked, onCheckedCha
6443
6608
  color: grayScale[12],
6444
6609
  fontSize: sizeValues.fontSize
6445
6610
  };
6446
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(AnimatedPressable_default, {
6611
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(AnimatedPressable, {
6447
6612
  ref,
6448
- style: styles$23.container,
6613
+ style: styles$25.container,
6449
6614
  onPress: handlePress,
6450
6615
  disabled,
6451
6616
  accessibilityRole: "switch",
@@ -6461,16 +6626,16 @@ const Switch = react.default.forwardRef(({ defaultChecked, checked, onCheckedCha
6461
6626
  hapticFeedback: false,
6462
6627
  ...rest,
6463
6628
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
6464
- style: [styles$23.track, trackStyle],
6465
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Animated.View, { style: [styles$23.thumb, thumbStyle] })
6629
+ style: [styles$25.track, trackStyle],
6630
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Animated.View, { style: [styles$25.thumb, thumbStyle] })
6466
6631
  }), label && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
6467
- style: [styles$23.label, labelStyle],
6632
+ style: [styles$25.label, labelStyle],
6468
6633
  children: label
6469
6634
  })]
6470
6635
  });
6471
6636
  });
6472
6637
  Switch.displayName = "Switch";
6473
- const styles$23 = react_native.StyleSheet.create({
6638
+ const styles$25 = react_native.StyleSheet.create({
6474
6639
  container: {
6475
6640
  flexDirection: "row",
6476
6641
  alignItems: "center"
@@ -6668,25 +6833,25 @@ function calculateContextMenuPosition(touchPoint, contentSize, screenSize, side
6668
6833
  * ChevronDownIcon - A chevron pointing down using React Native View
6669
6834
  * Can be rotated to point in different directions
6670
6835
  */
6671
- const ChevronDownIcon$1 = react.default.forwardRef(({ width = 9, height = 9, style, color = "currentColor" }, _forwardedRef) => {
6836
+ const ChevronDownIcon = react.default.forwardRef(({ width = 9, height = 9, style, color = "currentColor" }, _forwardedRef) => {
6672
6837
  const armWidth = width * .55;
6673
6838
  const armHeight = 2;
6674
6839
  const armOffset = width * .22;
6675
6840
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_native.View, {
6676
6841
  style: [
6677
- styles$22.chevronContainer,
6842
+ styles$24.chevronContainer,
6678
6843
  {
6679
6844
  width,
6680
6845
  height
6681
6846
  },
6682
6847
  style
6683
6848
  ],
6684
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$22.chevronArm, {
6849
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$24.chevronArm, {
6685
6850
  width: armWidth,
6686
6851
  height: armHeight,
6687
6852
  backgroundColor: color,
6688
6853
  transform: [{ rotate: "45deg" }, { translateX: -armOffset }]
6689
- }] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$22.chevronArm, {
6854
+ }] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$24.chevronArm, {
6690
6855
  width: armWidth,
6691
6856
  height: armHeight,
6692
6857
  backgroundColor: color,
@@ -6694,7 +6859,7 @@ const ChevronDownIcon$1 = react.default.forwardRef(({ width = 9, height = 9, sty
6694
6859
  }] })]
6695
6860
  });
6696
6861
  });
6697
- ChevronDownIcon$1.displayName = "ChevronDownIcon";
6862
+ ChevronDownIcon.displayName = "ChevronDownIcon";
6698
6863
  /**
6699
6864
  * ThickChevronRightIcon - A thick chevron pointing right using React Native View
6700
6865
  */
@@ -6703,19 +6868,19 @@ const ThickChevronRightIcon = react.default.forwardRef(({ width = 9, height = 9,
6703
6868
  const armHeight = 2.5;
6704
6869
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_native.View, {
6705
6870
  style: [
6706
- styles$22.chevronContainer,
6871
+ styles$24.chevronContainer,
6707
6872
  {
6708
6873
  width,
6709
6874
  height
6710
6875
  },
6711
6876
  style
6712
6877
  ],
6713
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$22.chevronArm, {
6878
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$24.chevronArm, {
6714
6879
  width: armWidth,
6715
6880
  height: armHeight,
6716
6881
  backgroundColor: color,
6717
6882
  transform: [{ rotate: "45deg" }, { translateY: -1 }]
6718
- }] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$22.chevronArm, {
6883
+ }] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$24.chevronArm, {
6719
6884
  width: armWidth,
6720
6885
  height: armHeight,
6721
6886
  backgroundColor: color,
@@ -6730,14 +6895,14 @@ ThickChevronRightIcon.displayName = "ThickChevronRightIcon";
6730
6895
  const ThickCheckIcon = react.default.forwardRef(({ width = 9, height = 9, style, color = "currentColor" }, _forwardedRef) => {
6731
6896
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_native.View, {
6732
6897
  style: [
6733
- styles$22.checkContainer,
6898
+ styles$24.checkContainer,
6734
6899
  {
6735
6900
  width,
6736
6901
  height
6737
6902
  },
6738
6903
  style
6739
6904
  ],
6740
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$22.checkShortArm, { backgroundColor: color }] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$22.checkLongArm, { backgroundColor: color }] })]
6905
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$24.checkShortArm, { backgroundColor: color }] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$24.checkLongArm, { backgroundColor: color }] })]
6741
6906
  });
6742
6907
  });
6743
6908
  ThickCheckIcon.displayName = "ThickCheckIcon";
@@ -6747,21 +6912,21 @@ ThickCheckIcon.displayName = "ThickCheckIcon";
6747
6912
  const ThickDividerHorizontalIcon = react.default.forwardRef(({ width = 9, height = 9, style, color = "currentColor" }, _forwardedRef) => {
6748
6913
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
6749
6914
  style: [
6750
- styles$22.dividerContainer,
6915
+ styles$24.dividerContainer,
6751
6916
  {
6752
6917
  width,
6753
6918
  height
6754
6919
  },
6755
6920
  style
6756
6921
  ],
6757
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$22.dividerLine, {
6922
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$24.dividerLine, {
6758
6923
  width: width * .9,
6759
6924
  backgroundColor: color
6760
6925
  }] })
6761
6926
  });
6762
6927
  });
6763
6928
  ThickDividerHorizontalIcon.displayName = "ThickDividerHorizontalIcon";
6764
- const styles$22 = react_native.StyleSheet.create({
6929
+ const styles$24 = react_native.StyleSheet.create({
6765
6930
  chevronContainer: {
6766
6931
  alignItems: "center",
6767
6932
  justifyContent: "center"
@@ -6915,10 +7080,11 @@ const SelectRoot = ({ defaultValue, value: controlledValue, onValueChange, open:
6915
7080
  };
6916
7081
  const SelectTrigger = ({ children, asChild = false }) => {
6917
7082
  const { onOpenChange, open, anchorRef, measureAnchor, disabled } = useSelect();
7083
+ const globalHaptics = useHaptics$1();
6918
7084
  const handlePress = () => {
6919
7085
  measureAnchor();
6920
7086
  onOpenChange(!open);
6921
- react_native.Vibration.vibrate(10);
7087
+ if (globalHaptics) triggerHaptic("press");
6922
7088
  };
6923
7089
  if (asChild && react.default.isValidElement(children)) {
6924
7090
  const child = children;
@@ -6971,7 +7137,7 @@ const SelectValue = ({ placeholder = "Select an option", style }) => {
6971
7137
  flexShrink: 1
6972
7138
  }, style || {}],
6973
7139
  children: selectedText || placeholder
6974
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChevronDownIcon$1, {
7140
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChevronDownIcon, {
6975
7141
  color: selectedText ? variantColors.textColor : grayAlpha[9],
6976
7142
  width: sizeStyles(),
6977
7143
  height: sizeStyles(),
@@ -6995,7 +7161,7 @@ const SelectOverlay = ({ style }) => {
6995
7161
  const { onOpenChange } = useSelect();
6996
7162
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.TouchableWithoutFeedback, {
6997
7163
  onPress: () => onOpenChange(false),
6998
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$21.overlay, style] })
7164
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$23.overlay, style] })
6999
7165
  });
7000
7166
  };
7001
7167
  const SelectContent = ({ children, side = "bottom", sideOffset = 4, align = "start", alignOffset = 0, avoidCollisions = true, size = 2, style }) => {
@@ -7080,7 +7246,7 @@ const SelectContent = ({ children, side = "bottom", sideOffset = 4, align = "sta
7080
7246
  ref: contentRef,
7081
7247
  onLayout: handleLayout,
7082
7248
  style: [
7083
- styles$21.content,
7249
+ styles$23.content,
7084
7250
  {
7085
7251
  backgroundColor: isDark ? colors[3] : colors[1],
7086
7252
  borderRadius: radii.medium,
@@ -7117,6 +7283,7 @@ const SelectItem = ({ children, value: itemValue, disabled = false, style }) =>
7117
7283
  const { value, onValueChange, colors, onOpenChange, size, registerItem, unregisterItem, setSelectedItemText, color } = useSelect();
7118
7284
  const theme = useTheme$1();
7119
7285
  const mode = useThemeMode$1();
7286
+ const globalHaptics = useHaptics$1();
7120
7287
  const isSelected = value === itemValue;
7121
7288
  const extractText = (0, react.useCallback)((node) => {
7122
7289
  if (typeof node === "string") return node;
@@ -7197,7 +7364,7 @@ const SelectItem = ({ children, value: itemValue, disabled = false, style }) =>
7197
7364
  if (!disabled) {
7198
7365
  setSelectedItemText(extractText(children));
7199
7366
  onValueChange(itemValue);
7200
- react_native.Vibration.vibrate(10);
7367
+ if (globalHaptics) triggerHaptic("press");
7201
7368
  }
7202
7369
  };
7203
7370
  const itemPadding = getItemPadding();
@@ -7212,8 +7379,8 @@ const SelectItem = ({ children, value: itemValue, disabled = false, style }) =>
7212
7379
  onPress: handlePress,
7213
7380
  disabled,
7214
7381
  style: [
7215
- styles$21.item,
7216
- disabled && styles$21.itemDisabled,
7382
+ styles$23.item,
7383
+ disabled && styles$23.itemDisabled,
7217
7384
  itemPadding,
7218
7385
  style,
7219
7386
  {
@@ -7277,7 +7444,7 @@ const SelectItem = ({ children, value: itemValue, disabled = false, style }) =>
7277
7444
  const SelectSeparator = ({ style }) => {
7278
7445
  const { colors } = useSelect();
7279
7446
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [
7280
- styles$21.separator,
7447
+ styles$23.separator,
7281
7448
  { backgroundColor: colors[6] },
7282
7449
  style
7283
7450
  ] });
@@ -7321,7 +7488,7 @@ const SelectLabel = ({ children, style = {} }) => {
7321
7488
  children
7322
7489
  });
7323
7490
  };
7324
- const styles$21 = react_native.StyleSheet.create({
7491
+ const styles$23 = react_native.StyleSheet.create({
7325
7492
  overlay: {
7326
7493
  flex: 1,
7327
7494
  backgroundColor: "rgba(0, 0, 0, 0.01)"
@@ -7379,6 +7546,7 @@ const isRangeValue = (value) => {
7379
7546
  const Slider = react.default.forwardRef(({ value: controlledValue, defaultValue, onValueChange, onValueChangeEnd, min = 0, max = 100, step = 1, disabled = false, size = "2", variant = "solid", color, radius = "full", highContrast = false, minStepsBetweenThumbs = 0, label, showValueLabel = false, valueLabelFormatter = (v) => v.toString(), accessibilityLabel, accessibilityHint, style, hapticFeedback = true, ...rest }, ref) => {
7380
7547
  const theme = useTheme$1();
7381
7548
  const mode = useThemeMode$1();
7549
+ const globalHaptics = useHaptics$1();
7382
7550
  const isDark = mode === "dark";
7383
7551
  const grayScale = isDark ? theme.colors.gray.dark : theme.colors.gray;
7384
7552
  const grayAlpha = getGrayAlpha(theme);
@@ -7527,7 +7695,7 @@ const Slider = react.default.forwardRef(({ value: controlledValue, defaultValue,
7527
7695
  const touchX = event.nativeEvent.locationX;
7528
7696
  const position = Math.max(0, Math.min(1, touchX / currentTrackLayout.width));
7529
7697
  const newValue = positionToValue(position);
7530
- if (hapticFeedback) react_native.Vibration.vibrate(10);
7698
+ if (globalHaptics && hapticFeedback) triggerHaptic("press");
7531
7699
  if (valuesRef.current.length === 1) {
7532
7700
  updateValue([newValue]);
7533
7701
  handleValueChangeEnd([newValue]);
@@ -7583,7 +7751,7 @@ const Slider = react.default.forwardRef(({ value: controlledValue, defaultValue,
7583
7751
  const nearestIndex = getNearestThumbIndex(Math.max(0, Math.min(1, touchX / trackLayoutRef2.current.width)));
7584
7752
  setActiveThumbIndex(nearestIndex);
7585
7753
  activeThumbIndexRef.current = nearestIndex;
7586
- if (hapticFeedback) react_native.Vibration.vibrate(10);
7754
+ if (globalHaptics && hapticFeedback) triggerHaptic("selection");
7587
7755
  },
7588
7756
  onPanResponderMove: (_event, gestureState) => {
7589
7757
  if (activeThumbIndexRef.current !== null) handleDrag(gestureState, activeThumbIndexRef.current);
@@ -7592,13 +7760,13 @@ const Slider = react.default.forwardRef(({ value: controlledValue, defaultValue,
7592
7760
  setActiveThumbIndex(null);
7593
7761
  activeThumbIndexRef.current = null;
7594
7762
  handleValueChangeEnd(valuesRef.current);
7595
- if (hapticFeedback) react_native.Vibration.vibrate(10);
7763
+ if (globalHaptics && hapticFeedback) triggerHaptic("selection");
7596
7764
  },
7597
7765
  onPanResponderTerminate: () => {
7598
7766
  setActiveThumbIndex(null);
7599
7767
  activeThumbIndexRef.current = null;
7600
7768
  handleValueChangeEnd(valuesRef.current);
7601
- if (hapticFeedback) react_native.Vibration.vibrate(10);
7769
+ if (globalHaptics && hapticFeedback) triggerHaptic("selection");
7602
7770
  },
7603
7771
  onPanResponderTerminationRequest: () => false
7604
7772
  })).current;
@@ -7744,7 +7912,7 @@ const Slider = react.default.forwardRef(({ value: controlledValue, defaultValue,
7744
7912
  ]);
7745
7913
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(RnView, {
7746
7914
  ref,
7747
- style: [styles$20.container, style],
7915
+ style: [styles$22.container, style],
7748
7916
  accessibilityRole: "adjustable",
7749
7917
  accessibilityLabel: accessibilityLabel || label || "Slider",
7750
7918
  accessibilityHint: accessibilityHint || `Value: ${formatValueLabel()}, range: ${min} to ${max}`,
@@ -7752,17 +7920,17 @@ const Slider = react.default.forwardRef(({ value: controlledValue, defaultValue,
7752
7920
  accessibilityState: { disabled },
7753
7921
  ...rest,
7754
7922
  children: [(label || showValueLabel) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(RnView, {
7755
- style: styles$20.labelContainer,
7923
+ style: styles$22.labelContainer,
7756
7924
  children: [label && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
7757
- style: [styles$20.label, labelStyle],
7925
+ style: [styles$22.label, labelStyle],
7758
7926
  children: label
7759
7927
  }), showValueLabel && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
7760
- style: [styles$20.valueLabel, labelStyle],
7928
+ style: [styles$22.valueLabel, labelStyle],
7761
7929
  children: formatValueLabel()
7762
7930
  })]
7763
7931
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(RnView, {
7764
7932
  ref: trackLayoutRef,
7765
- style: [styles$20.track, {
7933
+ style: [styles$22.track, {
7766
7934
  height: sizeValues.trackHeight,
7767
7935
  borderRadius,
7768
7936
  backgroundColor: trackBackgroundColor,
@@ -7775,15 +7943,15 @@ const Slider = react.default.forwardRef(({ value: controlledValue, defaultValue,
7775
7943
  values.length === 1 && thumbAnimations[0] && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Animated.View, { style: getFilledTrackStyle(thumbAnimations[0], 0) }),
7776
7944
  values.length === 2 && thumbAnimations[0] && thumbAnimations[1] && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Animated.View, { style: getFilledTrackStyle(thumbAnimations[1], 1) }),
7777
7945
  thumbAnimations.slice(0, values.length).map((animatedValue, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Animated.View, {
7778
- style: [styles$20.thumb, getThumbStyle(animatedValue)],
7779
- children: !disabled && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, { style: [styles$20.thumbInner, thumbInnerStyle] })
7946
+ style: [styles$22.thumb, getThumbStyle(animatedValue)],
7947
+ children: !disabled && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, { style: [styles$22.thumbInner, thumbInnerStyle] })
7780
7948
  }, index))
7781
7949
  ]
7782
7950
  })]
7783
7951
  });
7784
7952
  });
7785
7953
  Slider.displayName = "Slider";
7786
- const styles$20 = react_native.StyleSheet.create({
7954
+ const styles$22 = react_native.StyleSheet.create({
7787
7955
  container: { width: "100%" },
7788
7956
  labelContainer: {
7789
7957
  flexDirection: "row",
@@ -7863,7 +8031,7 @@ const DialogOverlay = ({ style }) => {
7863
8031
  const { grayAlpha } = useDialog();
7864
8032
  const overlayColor = useThemeMode$1() === "dark" ? "rgba(0, 0, 0, 0.6)" : "rgba(10, 10, 10, 0.6)";
7865
8033
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.TouchableWithoutFeedback, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [
7866
- styles$19.overlay,
8034
+ styles$21.overlay,
7867
8035
  { backgroundColor: overlayColor },
7868
8036
  style
7869
8037
  ] }) });
@@ -7905,7 +8073,7 @@ const DialogContent = ({ children, style, hideCloseButton = false, size = 2 }) =
7905
8073
  const maxWidth = size <= 2 ? Math.min(screenWidth - 64, 400) : Math.min(screenWidth - 64, 500);
7906
8074
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_native.View, {
7907
8075
  style: [
7908
- styles$19.content,
8076
+ styles$21.content,
7909
8077
  {
7910
8078
  backgroundColor: isDark ? theme.colors.gray.dark[2] : "#ffffff",
7911
8079
  borderRadius: sizeStyles.radius,
@@ -7919,14 +8087,14 @@ const DialogContent = ({ children, style, hideCloseButton = false, size = 2 }) =
7919
8087
  style
7920
8088
  ],
7921
8089
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.ScrollView, {
7922
- style: styles$19.scrollContent,
7923
- contentContainerStyle: styles$19.scrollContentContainer,
8090
+ style: styles$21.scrollContent,
8091
+ contentContainerStyle: styles$21.scrollContentContainer,
7924
8092
  showsVerticalScrollIndicator: true,
7925
8093
  bounces: true,
7926
8094
  children
7927
8095
  }), !hideCloseButton && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Pressable, {
7928
8096
  onPress: handleClose,
7929
- style: [styles$19.closeButton, { backgroundColor: isDark ? "rgba(255, 255, 255, 0.1)" : "rgba(0, 0, 0, 0.1)" }],
8097
+ style: [styles$21.closeButton, { backgroundColor: isDark ? "rgba(255, 255, 255, 0.1)" : "rgba(0, 0, 0, 0.1)" }],
7930
8098
  accessibilityRole: "button",
7931
8099
  accessibilityLabel: "Close dialog",
7932
8100
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
@@ -8011,7 +8179,7 @@ const DialogAction = ({ children, onPress, ...buttonProps }) => {
8011
8179
  children
8012
8180
  });
8013
8181
  };
8014
- const styles$19 = react_native.StyleSheet.create({
8182
+ const styles$21 = react_native.StyleSheet.create({
8015
8183
  overlay: {
8016
8184
  flex: 1,
8017
8185
  backgroundColor: "rgba(0, 0, 0, 0.5)"
@@ -8108,7 +8276,7 @@ const AlertDialogPortal = ({ children, hostId }) => {
8108
8276
  const AlertDialogOverlay = ({ style }) => {
8109
8277
  const overlayColor = useThemeMode$1() === "dark" ? "rgba(0, 0, 0, 0.6)" : "rgba(10, 10, 10, 0.6)";
8110
8278
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.TouchableWithoutFeedback, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [
8111
- styles$18.overlay,
8279
+ styles$20.overlay,
8112
8280
  { backgroundColor: overlayColor },
8113
8281
  style
8114
8282
  ] }) });
@@ -8149,7 +8317,7 @@ const AlertDialogContent = ({ children, style, hideCloseButton = true, size = 2
8149
8317
  };
8150
8318
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_native.View, {
8151
8319
  style: [
8152
- styles$18.content,
8320
+ styles$20.content,
8153
8321
  {
8154
8322
  backgroundColor: isDark ? theme.colors.gray.dark[2] : theme.colors.gray[1],
8155
8323
  borderRadius: sizeStyles.radius,
@@ -8163,14 +8331,14 @@ const AlertDialogContent = ({ children, style, hideCloseButton = true, size = 2
8163
8331
  style
8164
8332
  ],
8165
8333
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.ScrollView, {
8166
- style: styles$18.scrollContent,
8167
- contentContainerStyle: styles$18.scrollContentContainer,
8334
+ style: styles$20.scrollContent,
8335
+ contentContainerStyle: styles$20.scrollContentContainer,
8168
8336
  showsVerticalScrollIndicator: true,
8169
8337
  bounces: true,
8170
8338
  children
8171
8339
  }), !hideCloseButton && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Pressable, {
8172
8340
  onPress: handleClose,
8173
- style: [styles$18.closeButton, { backgroundColor: isDark ? "rgba(255, 255, 255, 0.1)" : "rgba(0, 0, 0, 0.1)" }],
8341
+ style: [styles$20.closeButton, { backgroundColor: isDark ? "rgba(255, 255, 255, 0.1)" : "rgba(0, 0, 0, 0.1)" }],
8174
8342
  accessibilityRole: "button",
8175
8343
  accessibilityLabel: "Close dialog",
8176
8344
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
@@ -8260,7 +8428,7 @@ const AlertDialog = ({ open, onOpenChange, title, description, cancel, action, c
8260
8428
  description && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AlertDialogDescription, { children: description }),
8261
8429
  children,
8262
8430
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_native.View, {
8263
- style: styles$18.actionRow,
8431
+ style: styles$20.actionRow,
8264
8432
  children: [cancel && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AlertDialogCancel, {
8265
8433
  variant: "ghost",
8266
8434
  children: cancel.label || "Cancel"
@@ -8274,7 +8442,7 @@ const AlertDialog = ({ open, onOpenChange, title, description, cancel, action, c
8274
8442
  ] })] })
8275
8443
  });
8276
8444
  };
8277
- const styles$18 = react_native.StyleSheet.create({
8445
+ const styles$20 = react_native.StyleSheet.create({
8278
8446
  overlay: {
8279
8447
  flex: 1,
8280
8448
  backgroundColor: "rgba(0, 0, 0, 0.5)"
@@ -8468,7 +8636,7 @@ const PopoverOverlay = ({ style }) => {
8468
8636
  const { onOpenChange } = usePopover();
8469
8637
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.TouchableWithoutFeedback, {
8470
8638
  onPress: () => onOpenChange(false),
8471
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$17.overlay, style] })
8639
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$19.overlay, style] })
8472
8640
  });
8473
8641
  };
8474
8642
  const PopoverContent = ({ children, side = "bottom", sideOffset = 4, align = "center", alignOffset = 0, avoidCollisions = true, size = 2, style }) => {
@@ -8537,7 +8705,7 @@ const PopoverContent = ({ children, side = "bottom", sideOffset = 4, align = "ce
8537
8705
  ref: contentRef,
8538
8706
  onLayout: handleLayout,
8539
8707
  style: [
8540
- styles$17.content,
8708
+ styles$19.content,
8541
8709
  {
8542
8710
  backgroundColor: colors["1"] || grayAlpha["12"],
8543
8711
  borderRadius: radii.medium,
@@ -8603,7 +8771,7 @@ const PopoverClose = ({ children, ariaLabel = "Close popover" }) => {
8603
8771
  const { onOpenChange, colors } = usePopover();
8604
8772
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Pressable, {
8605
8773
  onPress: () => onOpenChange(false),
8606
- style: styles$17.closeButton,
8774
+ style: styles$19.closeButton,
8607
8775
  accessibilityLabel: ariaLabel,
8608
8776
  accessibilityRole: "button",
8609
8777
  children: children || /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
@@ -8615,7 +8783,7 @@ const PopoverClose = ({ children, ariaLabel = "Close popover" }) => {
8615
8783
  })
8616
8784
  });
8617
8785
  };
8618
- const styles$17 = react_native.StyleSheet.create({
8786
+ const styles$19 = react_native.StyleSheet.create({
8619
8787
  overlay: {
8620
8788
  flex: 1,
8621
8789
  backgroundColor: "rgba(0, 0, 0, 0.01)"
@@ -8776,7 +8944,7 @@ const TooltipPortal = ({ children }) => {
8776
8944
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.TouchableWithoutFeedback, {
8777
8945
  onPress: () => onOpenChange(false),
8778
8946
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
8779
- style: styles$16.overlay,
8947
+ style: styles$18.overlay,
8780
8948
  children
8781
8949
  })
8782
8950
  })
@@ -8837,7 +9005,7 @@ const TooltipContent = ({ children, side = "top", sideOffset = 8, align = "cente
8837
9005
  ref: contentRef,
8838
9006
  onLayout: handleLayout,
8839
9007
  style: [
8840
- styles$16.content,
9008
+ styles$18.content,
8841
9009
  {
8842
9010
  backgroundColor: tooltipBackground,
8843
9011
  borderRadius,
@@ -8863,15 +9031,15 @@ const TooltipContent = ({ children, side = "top", sideOffset = 8, align = "cente
8863
9031
  },
8864
9032
  children
8865
9033
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [
8866
- styles$16.arrow,
8867
- actualSide === "top" && [styles$16.arrowBottom, { borderTopColor: arrowColor }],
8868
- actualSide === "bottom" && [styles$16.arrowTop, { borderBottomColor: arrowColor }],
8869
- actualSide === "left" && [styles$16.arrowRight, {
9034
+ styles$18.arrow,
9035
+ actualSide === "top" && [styles$18.arrowBottom, { borderTopColor: arrowColor }],
9036
+ actualSide === "bottom" && [styles$18.arrowTop, { borderBottomColor: arrowColor }],
9037
+ actualSide === "left" && [styles$18.arrowRight, {
8870
9038
  borderLeftColor: arrowColor,
8871
9039
  borderTopColor: "transparent",
8872
9040
  borderBottomColor: "transparent"
8873
9041
  }],
8874
- actualSide === "right" && [styles$16.arrowLeft, {
9042
+ actualSide === "right" && [styles$18.arrowLeft, {
8875
9043
  borderRightColor: arrowColor,
8876
9044
  borderTopColor: "transparent",
8877
9045
  borderBottomColor: "transparent"
@@ -8910,7 +9078,7 @@ const Tooltip = ({ children, content, side = "top", sideOffset = 8, align = "cen
8910
9078
  }) })]
8911
9079
  });
8912
9080
  };
8913
- const styles$16 = react_native.StyleSheet.create({
9081
+ const styles$18 = react_native.StyleSheet.create({
8914
9082
  overlay: {
8915
9083
  flex: 1,
8916
9084
  backgroundColor: "rgba(0, 0, 0, 0.01)"
@@ -9021,10 +9189,11 @@ const DropdownMenuRoot = ({ children, open: controlledOpen, onOpenChange, defaul
9021
9189
  };
9022
9190
  const DropdownMenuTrigger = ({ children, asChild = false, hapticFeedback = true }) => {
9023
9191
  const { onOpenChange, open, anchorRef, measureAnchor } = useDropdownMenu();
9192
+ const globalHaptics = useHaptics$1();
9024
9193
  const handlePress = () => {
9025
9194
  measureAnchor();
9026
9195
  onOpenChange(!open);
9027
- if (hapticFeedback) react_native.Vibration.vibrate(10);
9196
+ if (globalHaptics && hapticFeedback) triggerHaptic("press");
9028
9197
  };
9029
9198
  if (asChild && react.default.isValidElement(children)) {
9030
9199
  const child = children;
@@ -9036,7 +9205,7 @@ const DropdownMenuTrigger = ({ children, asChild = false, hapticFeedback = true
9036
9205
  }
9037
9206
  });
9038
9207
  }
9039
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedPressable_default, {
9208
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedPressable, {
9040
9209
  ref: anchorRef,
9041
9210
  onPress: handlePress,
9042
9211
  pressedScale: .98,
@@ -9046,18 +9215,6 @@ const DropdownMenuTrigger = ({ children, asChild = false, hapticFeedback = true
9046
9215
  children
9047
9216
  });
9048
9217
  };
9049
- /**
9050
- * Default down chevron icon for dropdown menu trigger
9051
- * Uses Unicode character for React Native compatibility
9052
- */
9053
- const ChevronDownIcon = ({ size, color }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
9054
- style: {
9055
- fontSize: size || 16,
9056
- color: color || "currentColor",
9057
- lineHeight: size ? size + 2 : 18
9058
- },
9059
- children: "▾"
9060
- });
9061
9218
  const DropdownMenuTriggerIcon = ({ icon, variant = "ghost", color, size = 2, disabled, accessibilityLabel = "Open menu", highContrast, style }) => {
9062
9219
  const { onOpenChange, open, anchorRef, measureAnchor } = useDropdownMenu();
9063
9220
  const handlePress = () => {
@@ -9093,7 +9250,7 @@ const DropdownMenuOverlay = ({ style }) => {
9093
9250
  const { onOpenChange } = useDropdownMenu();
9094
9251
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.TouchableWithoutFeedback, {
9095
9252
  onPress: () => onOpenChange(false),
9096
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$15.overlay, style] })
9253
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$17.overlay, style] })
9097
9254
  });
9098
9255
  };
9099
9256
  const DropdownMenuContent = ({ children, side = "bottom", sideOffset = 4, align = "start", alignOffset = 0, avoidCollisions = true, size = 2, style }) => {
@@ -9177,7 +9334,7 @@ const DropdownMenuContent = ({ children, side = "bottom", sideOffset = 4, align
9177
9334
  ref: contentRef,
9178
9335
  onLayout: handleLayout,
9179
9336
  style: [
9180
- styles$15.content,
9337
+ styles$17.content,
9181
9338
  {
9182
9339
  backgroundColor: colors[1],
9183
9340
  borderRadius: radii.medium,
@@ -9208,6 +9365,7 @@ const DropdownMenuGroup = ({ children }) => {
9208
9365
  };
9209
9366
  const DropdownMenuItem = ({ children, color, onSelect, disabled = false, shortcut, style, hapticFeedback = true }) => {
9210
9367
  const { colors, onOpenChange, size } = useDropdownMenu();
9368
+ const globalHaptics = useHaptics$1();
9211
9369
  const theme = useTheme$1();
9212
9370
  const mode = useThemeMode$1();
9213
9371
  const activeColor = color || theme.accentColor;
@@ -9252,17 +9410,17 @@ const DropdownMenuItem = ({ children, color, onSelect, disabled = false, shortcu
9252
9410
  if (!disabled) {
9253
9411
  onSelect?.();
9254
9412
  onOpenChange(false);
9255
- if (hapticFeedback) react_native.Vibration.vibrate(10);
9413
+ if (globalHaptics && hapticFeedback) triggerHaptic("press");
9256
9414
  }
9257
9415
  };
9258
9416
  const itemPadding = getItemPadding();
9259
9417
  const fontSize = getFontSize();
9260
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(AnimatedPressable_default, {
9418
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(AnimatedPressable, {
9261
9419
  onPress: handlePress,
9262
9420
  disabled,
9263
9421
  style: [
9264
- styles$15.item,
9265
- disabled && styles$15.itemDisabled,
9422
+ styles$17.item,
9423
+ disabled && styles$17.itemDisabled,
9266
9424
  { backgroundColor: disabled ? "transparent" : "transparent" },
9267
9425
  itemPadding,
9268
9426
  style
@@ -9292,7 +9450,7 @@ const DropdownMenuItem = ({ children, color, onSelect, disabled = false, shortcu
9292
9450
  const DropdownMenuSeparator = ({ style }) => {
9293
9451
  const { colors } = useDropdownMenu();
9294
9452
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [
9295
- styles$15.separator,
9453
+ styles$17.separator,
9296
9454
  { backgroundColor: colors[6] },
9297
9455
  style
9298
9456
  ] });
@@ -9365,7 +9523,7 @@ const DropdownMenuCheckboxItem = ({ children, checked, onCheckedChange, disabled
9365
9523
  alignItems: "center"
9366
9524
  },
9367
9525
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
9368
- style: [styles$15.checkbox, {
9526
+ style: [styles$17.checkbox, {
9369
9527
  width: checkboxSize,
9370
9528
  height: checkboxSize,
9371
9529
  borderColor: colors[9],
@@ -9392,6 +9550,7 @@ const DropdownMenuCheckboxItem = ({ children, checked, onCheckedChange, disabled
9392
9550
  };
9393
9551
  const DropdownMenuRadioItem = ({ children, value, checked, onCheckedChange, disabled = false, hapticFeedback = true }) => {
9394
9552
  const { colors, size } = useDropdownMenu();
9553
+ const globalHaptics = useHaptics$1();
9395
9554
  const theme = useTheme$1();
9396
9555
  const getFontSize = (0, react.useCallback)(() => {
9397
9556
  switch (size) {
@@ -9412,7 +9571,7 @@ const DropdownMenuRadioItem = ({ children, value, checked, onCheckedChange, disa
9412
9571
  const handlePress = () => {
9413
9572
  if (!disabled) {
9414
9573
  onCheckedChange(value);
9415
- if (hapticFeedback) react_native.Vibration.vibrate(10);
9574
+ if (globalHaptics && hapticFeedback) triggerHaptic("press");
9416
9575
  }
9417
9576
  };
9418
9577
  const itemPadding = (0, react.useCallback)(() => {
@@ -9431,12 +9590,12 @@ const DropdownMenuRadioItem = ({ children, value, checked, onCheckedChange, disa
9431
9590
  };
9432
9591
  }
9433
9592
  }, [size, theme.space])();
9434
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedPressable_default, {
9593
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedPressable, {
9435
9594
  onPress: handlePress,
9436
9595
  disabled,
9437
9596
  style: [
9438
- styles$15.item,
9439
- disabled && styles$15.itemDisabled,
9597
+ styles$17.item,
9598
+ disabled && styles$17.itemDisabled,
9440
9599
  itemPadding
9441
9600
  ],
9442
9601
  accessibilityRole: "menuitem",
@@ -9455,7 +9614,7 @@ const DropdownMenuRadioItem = ({ children, value, checked, onCheckedChange, disa
9455
9614
  flex: 1
9456
9615
  },
9457
9616
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
9458
- style: [styles$15.radio, {
9617
+ style: [styles$17.radio, {
9459
9618
  width: radioSize,
9460
9619
  height: radioSize,
9461
9620
  borderRadius: radioSize / 2,
@@ -9484,6 +9643,7 @@ const DropdownMenuSub = ({ children }) => {
9484
9643
  };
9485
9644
  const DropdownMenuSubTrigger = ({ children, hapticFeedback = true }) => {
9486
9645
  const { colors, openSubmenu, onOpenSubmenu, size } = useDropdownMenu();
9646
+ const globalHaptics = useHaptics$1();
9487
9647
  const theme = useTheme$1();
9488
9648
  const submenuId = "submenu";
9489
9649
  const getFontSize = (0, react.useCallback)(() => {
@@ -9511,13 +9671,13 @@ const DropdownMenuSubTrigger = ({ children, hapticFeedback = true }) => {
9511
9671
  }, [size, theme.space]);
9512
9672
  const handlePress = () => {
9513
9673
  onOpenSubmenu(openSubmenu === submenuId ? null : submenuId);
9514
- if (hapticFeedback) react_native.Vibration.vibrate(10);
9674
+ if (globalHaptics && hapticFeedback) triggerHaptic("press");
9515
9675
  };
9516
9676
  const itemPadding = getItemPadding();
9517
9677
  const fontSize = getFontSize();
9518
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(AnimatedPressable_default, {
9678
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(AnimatedPressable, {
9519
9679
  onPress: handlePress,
9520
- style: [styles$15.item, itemPadding],
9680
+ style: [styles$17.item, itemPadding],
9521
9681
  pressedScale: .98,
9522
9682
  pressedOpacity: .95,
9523
9683
  animationDuration: 100,
@@ -9558,7 +9718,7 @@ const DropdownMenuSubContent = ({ children }) => {
9558
9718
  }
9559
9719
  }, [size, theme.space])();
9560
9720
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
9561
- style: [styles$15.content, {
9721
+ style: [styles$17.content, {
9562
9722
  backgroundColor: colors[1],
9563
9723
  borderRadius: radii.medium,
9564
9724
  borderWidth: 1,
@@ -9573,7 +9733,7 @@ const DropdownMenuSubContent = ({ children }) => {
9573
9733
  children
9574
9734
  });
9575
9735
  };
9576
- const styles$15 = react_native.StyleSheet.create({
9736
+ const styles$17 = react_native.StyleSheet.create({
9577
9737
  overlay: {
9578
9738
  flex: 1,
9579
9739
  backgroundColor: "rgba(0, 0, 0, 0.01)"
@@ -9667,6 +9827,7 @@ const ContextMenuRoot = ({ children, open: controlledOpen, onOpenChange, default
9667
9827
  };
9668
9828
  const ContextMenuTrigger = ({ children, onLongPress, asChild = false, hapticFeedback = true }) => {
9669
9829
  const { setPosition, onOpenChange } = useContextMenuContext();
9830
+ const globalHaptics = useHaptics$1();
9670
9831
  const handleLongPress = (event) => {
9671
9832
  const { pageX, pageY } = event.nativeEvent;
9672
9833
  setPosition({
@@ -9675,7 +9836,7 @@ const ContextMenuTrigger = ({ children, onLongPress, asChild = false, hapticFeed
9675
9836
  });
9676
9837
  onOpenChange(true);
9677
9838
  onLongPress?.(event);
9678
- if (hapticFeedback) react_native.Vibration.vibrate(10);
9839
+ if (globalHaptics && hapticFeedback) triggerHaptic("press");
9679
9840
  };
9680
9841
  if (asChild && react.default.isValidElement(children)) {
9681
9842
  const child = children;
@@ -9684,7 +9845,7 @@ const ContextMenuTrigger = ({ children, onLongPress, asChild = false, hapticFeed
9684
9845
  handleLongPress(e);
9685
9846
  } });
9686
9847
  }
9687
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedPressable_default, {
9848
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedPressable, {
9688
9849
  onLongPress: handleLongPress,
9689
9850
  pressedScale: .98,
9690
9851
  pressedOpacity: .95,
@@ -9709,7 +9870,7 @@ const ContextMenuOverlay = ({ style }) => {
9709
9870
  const { onOpenChange } = useContextMenuContext();
9710
9871
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.TouchableWithoutFeedback, {
9711
9872
  onPress: () => onOpenChange(false),
9712
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$14.overlay, style] })
9873
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [styles$16.overlay, style] })
9713
9874
  });
9714
9875
  };
9715
9876
  /**
@@ -9746,6 +9907,7 @@ const getSizeStyles$2 = (size, theme) => {
9746
9907
  const ContextMenuContent = ({ children, side = "bottom", sideOffset = 4, align = "start", alignOffset = 0, avoidCollisions = true, size = 2, style }) => {
9747
9908
  const { colors, radii, position } = useContextMenuContext();
9748
9909
  const theme = useTheme$1();
9910
+ const mode = useThemeMode$1();
9749
9911
  const contentRef = (0, react.useRef)(null);
9750
9912
  const [contentSize, setContentSize] = (0, react.useState)({
9751
9913
  width: 0,
@@ -9791,12 +9953,11 @@ const ContextMenuContent = ({ children, side = "bottom", sideOffset = 4, align =
9791
9953
  ref: contentRef,
9792
9954
  onLayout: handleLayout,
9793
9955
  style: [
9794
- styles$14.content,
9956
+ styles$16.content,
9795
9957
  {
9796
- backgroundColor: colors[1],
9797
- borderRadius: radii.medium,
9798
- borderWidth: 1,
9799
- borderColor: colors[6],
9958
+ backgroundColor: mode === "dark" ? colors[3] : colors[1],
9959
+ borderRadius: theme.radii[theme.radius] || radii.medium,
9960
+ borderColor: colors[2],
9800
9961
  paddingVertical: sizeStyles.paddingVertical,
9801
9962
  paddingHorizontal: sizeStyles.paddingHorizontal,
9802
9963
  minWidth: sizeStyles.minWidth,
@@ -9826,11 +9987,12 @@ const ContextMenuGroup = ({ children }) => {
9826
9987
  const ContextMenuItem = ({ children, color, onSelect, disabled = false, destructive = false, icon, shortcut, style, hapticFeedback = true }) => {
9827
9988
  const { colors, onOpenChange, size } = useContextMenuContext();
9828
9989
  const theme = useTheme$1();
9990
+ const globalHaptics = useHaptics$1();
9829
9991
  const handlePress = () => {
9830
9992
  if (!disabled) {
9831
9993
  onSelect?.();
9832
9994
  onOpenChange(false);
9833
- if (hapticFeedback) react_native.Vibration.vibrate(10);
9995
+ if (globalHaptics && hapticFeedback) triggerHaptic("press");
9834
9996
  }
9835
9997
  };
9836
9998
  const getFontSize = (0, react.useCallback)(() => {
@@ -9865,12 +10027,12 @@ const ContextMenuItem = ({ children, color, onSelect, disabled = false, destruct
9865
10027
  const itemPadding = getItemPadding();
9866
10028
  const destructiveColor = theme.colors.red[11];
9867
10029
  const textColor = disabled ? colors[8] : destructive ? destructiveColor : colors[12];
9868
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(AnimatedPressable_default, {
10030
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(AnimatedPressable, {
9869
10031
  onPress: handlePress,
9870
10032
  disabled,
9871
10033
  style: [
9872
- styles$14.item,
9873
- disabled && styles$14.itemDisabled,
10034
+ styles$16.item,
10035
+ disabled && styles$16.itemDisabled,
9874
10036
  itemPadding,
9875
10037
  style
9876
10038
  ],
@@ -9906,7 +10068,7 @@ const ContextMenuItem = ({ children, color, onSelect, disabled = false, destruct
9906
10068
  const ContextMenuSeparator = ({ style }) => {
9907
10069
  const { colors } = useContextMenuContext();
9908
10070
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [
9909
- styles$14.separator,
10071
+ styles$16.separator,
9910
10072
  { backgroundColor: colors[6] },
9911
10073
  style
9912
10074
  ] });
@@ -9980,7 +10142,7 @@ const ContextMenuCheckboxItem = ({ children, checked, onCheckedChange, disabled
9980
10142
  flex: 1
9981
10143
  },
9982
10144
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
9983
- style: [styles$14.checkbox, {
10145
+ style: [styles$16.checkbox, {
9984
10146
  width: checkboxSize,
9985
10147
  height: checkboxSize,
9986
10148
  borderColor: colors[9],
@@ -10005,9 +10167,10 @@ const ContextMenuCheckboxItem = ({ children, checked, onCheckedChange, disabled
10005
10167
  })
10006
10168
  });
10007
10169
  };
10008
- const ContextMenuRadioItem = ({ children, value, checked, onCheckedChange, disabled = false }) => {
10170
+ const ContextMenuRadioItem = ({ children, value, checked, onCheckedChange, disabled = false, hapticFeedback = true }) => {
10009
10171
  const { colors, size } = useContextMenuContext();
10010
10172
  const theme = useTheme$1();
10173
+ const globalHaptics = useHaptics$1();
10011
10174
  const getFontSize = (0, react.useCallback)(() => {
10012
10175
  switch (size) {
10013
10176
  case 1: return theme.typography.fontSizes[1].fontSize;
@@ -10027,7 +10190,7 @@ const ContextMenuRadioItem = ({ children, value, checked, onCheckedChange, disab
10027
10190
  const handlePress = () => {
10028
10191
  if (!disabled) {
10029
10192
  onCheckedChange(value);
10030
- react_native.Vibration.vibrate(10);
10193
+ if (globalHaptics && hapticFeedback) triggerHaptic("press");
10031
10194
  }
10032
10195
  };
10033
10196
  const itemPadding = (0, react.useCallback)(() => {
@@ -10046,12 +10209,12 @@ const ContextMenuRadioItem = ({ children, value, checked, onCheckedChange, disab
10046
10209
  };
10047
10210
  }
10048
10211
  }, [size, theme.space])();
10049
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedPressable_default, {
10212
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedPressable, {
10050
10213
  onPress: handlePress,
10051
10214
  disabled,
10052
10215
  style: [
10053
- styles$14.item,
10054
- disabled && styles$14.itemDisabled,
10216
+ styles$16.item,
10217
+ disabled && styles$16.itemDisabled,
10055
10218
  itemPadding
10056
10219
  ],
10057
10220
  accessibilityRole: "menuitem",
@@ -10070,7 +10233,7 @@ const ContextMenuRadioItem = ({ children, value, checked, onCheckedChange, disab
10070
10233
  flex: 1
10071
10234
  },
10072
10235
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
10073
- style: [styles$14.radio, {
10236
+ style: [styles$16.radio, {
10074
10237
  width: radioSize,
10075
10238
  height: radioSize,
10076
10239
  borderRadius: radioSize / 2,
@@ -10094,7 +10257,7 @@ const ContextMenuRadioItem = ({ children, value, checked, onCheckedChange, disab
10094
10257
  })
10095
10258
  });
10096
10259
  };
10097
- const styles$14 = react_native.StyleSheet.create({
10260
+ const styles$16 = react_native.StyleSheet.create({
10098
10261
  overlay: {
10099
10262
  flex: 1,
10100
10263
  backgroundColor: "rgba(0, 0, 0, 0.01)"
@@ -10259,7 +10422,7 @@ const BottomSheetRoot = ({ children, open: controlledOpen, onOpenChange, snapPoi
10259
10422
  },
10260
10423
  onPanResponderRelease: (_, gestureState) => {
10261
10424
  if (gestureState.dy > 100 || gestureState.vy > 500 / 1e3) {
10262
- react_native.Vibration.vibrate(10);
10425
+ if (globalHaptics) triggerHaptic("selection");
10263
10426
  react_native.Animated.timing(translateY, {
10264
10427
  toValue: targetSnapHeight,
10265
10428
  duration: 200,
@@ -10291,7 +10454,9 @@ const BottomSheetRoot = ({ children, open: controlledOpen, onOpenChange, snapPoi
10291
10454
  }
10292
10455
  }, [open]);
10293
10456
  const theme = useTheme$1();
10294
- const colors = useThemeMode$1() === "dark" ? theme.colors.gray.dark : theme.colors.gray;
10457
+ const mode = useThemeMode$1();
10458
+ const globalHaptics = useHaptics$1();
10459
+ const colors = mode === "dark" ? theme.colors.gray.dark : theme.colors.gray;
10295
10460
  const grayAlpha = getGrayAlpha(theme);
10296
10461
  const radii = theme.radii;
10297
10462
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(BottomSheetContext.Provider, {
@@ -10315,15 +10480,16 @@ const BottomSheetRoot = ({ children, open: controlledOpen, onOpenChange, snapPoi
10315
10480
  };
10316
10481
  const BottomSheetTrigger = ({ children, asChild = true, hapticFeedback = false }) => {
10317
10482
  const { onOpenChange, open } = useBottomSheet();
10483
+ const globalHaptics = useHaptics$1();
10318
10484
  const handlePress = () => {
10319
10485
  onOpenChange(true);
10320
- if (hapticFeedback) react_native.Vibration.vibrate(10);
10486
+ if (globalHaptics && hapticFeedback) triggerHaptic("press");
10321
10487
  };
10322
10488
  if (asChild && react.default.isValidElement(children)) return react.default.cloneElement(children, { onPress: (e) => {
10323
10489
  children.props?.onPress?.(e);
10324
10490
  handlePress();
10325
10491
  } });
10326
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedPressable_default, {
10492
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedPressable, {
10327
10493
  onPress: handlePress,
10328
10494
  pressedScale: .98,
10329
10495
  pressedOpacity: .95,
@@ -10345,15 +10511,17 @@ const BottomSheetPortal = ({ children, hostId }) => {
10345
10511
  };
10346
10512
  const BottomSheetOverlay = ({ style, hapticFeedback = true }) => {
10347
10513
  const { onOpenChange } = useBottomSheet();
10348
- const overlayColor = useThemeMode$1() === "dark" ? "rgba(0, 0, 0, 0.6)" : "rgba(10, 10, 10, 0.6)";
10514
+ const mode = useThemeMode$1();
10515
+ const globalHaptics = useHaptics$1();
10516
+ const overlayColor = mode === "dark" ? "rgba(0, 0, 0, 0.6)" : "rgba(10, 10, 10, 0.6)";
10349
10517
  const handlePress = () => {
10350
10518
  onOpenChange(false);
10351
- if (hapticFeedback) react_native.Vibration.vibrate(10);
10519
+ if (globalHaptics && hapticFeedback) triggerHaptic("selection");
10352
10520
  };
10353
10521
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.TouchableWithoutFeedback, {
10354
10522
  onPress: handlePress,
10355
10523
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [
10356
- styles$13.overlay,
10524
+ styles$15.overlay,
10357
10525
  { backgroundColor: overlayColor },
10358
10526
  style
10359
10527
  ] })
@@ -10364,10 +10532,10 @@ const BottomSheetHandle = ({ style }) => {
10364
10532
  const theme = useTheme$1();
10365
10533
  const handleColor = useThemeMode$1() === "dark" ? theme.colors.gray.dark[8] : theme.colors.gray[8];
10366
10534
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Pressable, {
10367
- style: styles$13.handleContainer,
10535
+ style: styles$15.handleContainer,
10368
10536
  ...panHandlers,
10369
10537
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [
10370
- styles$13.handle,
10538
+ styles$15.handle,
10371
10539
  { backgroundColor: handleColor },
10372
10540
  style
10373
10541
  ] })
@@ -10377,7 +10545,9 @@ const BottomSheetContent = ({ children, style, snapPoints: localSnapPoints, size
10377
10545
  const { radii, snapPoints: contextSnapPoints, currentSnapIndex, translateY, snapHeights, panHandlers } = useBottomSheet();
10378
10546
  const theme = useTheme$1();
10379
10547
  const isDark = useThemeMode$1() === "dark";
10548
+ const effectiveSnapPoints = localSnapPoints || contextSnapPoints;
10380
10549
  const targetSnapHeight = snapHeights[currentSnapIndex] || snapHeights[0];
10550
+ const maxTargetSnapHeight = snapHeights[effectiveSnapPoints.length - 1] || snapHeights[0];
10381
10551
  const sizeStyles = getSizeStyles$1(size, theme.space, radii);
10382
10552
  const shadow = getShadow(6, isDark);
10383
10553
  const backgroundColor = isDark ? theme.colors.gray.dark[2] : "#ffffff";
@@ -10385,27 +10555,22 @@ const BottomSheetContent = ({ children, style, snapPoints: localSnapPoints, size
10385
10555
  const borderTopRightRadius = radii.large;
10386
10556
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_native.Animated.View, {
10387
10557
  style: [
10388
- styles$13.content,
10558
+ styles$15.content,
10389
10559
  {
10390
10560
  backgroundColor,
10391
10561
  borderTopLeftRadius,
10392
10562
  borderTopRightRadius,
10393
10563
  flex: 1,
10394
10564
  paddingHorizontal: sizeStyles.paddingHorizontal,
10395
- height: targetSnapHeight,
10565
+ minHeight: targetSnapHeight,
10566
+ maxHeight: maxTargetSnapHeight,
10396
10567
  transform: [{ translateY }],
10397
10568
  ...shadow || {}
10398
10569
  },
10399
10570
  style
10400
10571
  ],
10401
10572
  ...panHandlers,
10402
- children: [!hideHandle && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(BottomSheetHandle, {}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.ScrollView, {
10403
- style: styles$13.scrollContent,
10404
- contentContainerStyle: styles$13.scrollContentContainer,
10405
- showsVerticalScrollIndicator: true,
10406
- bounces: true,
10407
- children
10408
- })]
10573
+ children: [!hideHandle && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(BottomSheetHandle, {}), children]
10409
10574
  });
10410
10575
  };
10411
10576
  const BottomSheetTitle = ({ children, style = {}, size = 4, weight = "bold", align, color, truncate, numberOfLines, fontFamily, opacity, asChild = false, ...rest }) => {
@@ -10455,7 +10620,7 @@ const BottomSheetFooter = ({ children, style, withBorder = true, withPadding = t
10455
10620
  const borderColor = useThemeMode$1() === "dark" ? "rgba(255, 255, 255, 0.1)" : "rgba(0, 0, 0, 0.1)";
10456
10621
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
10457
10622
  style: [
10458
- styles$13.footer,
10623
+ styles$15.footer,
10459
10624
  withBorder && {
10460
10625
  borderTopWidth: 1,
10461
10626
  borderTopColor: borderColor
@@ -10467,16 +10632,17 @@ const BottomSheetFooter = ({ children, style, withBorder = true, withPadding = t
10467
10632
  style
10468
10633
  ],
10469
10634
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
10470
- style: styles$13.footerContent,
10635
+ style: styles$15.footerContent,
10471
10636
  children
10472
10637
  })
10473
10638
  });
10474
10639
  };
10475
10640
  const BottomSheetClose = ({ children, asChild = true, hapticFeedback = false, ...buttonProps }) => {
10476
10641
  const { onOpenChange } = useBottomSheet();
10642
+ const globalHaptics = useHaptics$1();
10477
10643
  const handlePress = () => {
10478
10644
  onOpenChange(false);
10479
- if (hapticFeedback) react_native.Vibration.vibrate(10);
10645
+ if (globalHaptics && hapticFeedback) triggerHaptic("selection");
10480
10646
  };
10481
10647
  if (asChild && children && react.default.isValidElement(children)) return react.default.cloneElement(children, { onPress: (e) => {
10482
10648
  children.props?.onPress?.(e);
@@ -10491,10 +10657,11 @@ const BottomSheetClose = ({ children, asChild = true, hapticFeedback = false, ..
10491
10657
  };
10492
10658
  const BottomSheetAction = ({ children, onPress, hapticFeedback = true, ...buttonProps }) => {
10493
10659
  const { onOpenChange } = useBottomSheet();
10660
+ const globalHaptics = useHaptics$1();
10494
10661
  const handlePress = () => {
10495
10662
  onPress?.();
10496
10663
  onOpenChange(false);
10497
- if (hapticFeedback) react_native.Vibration.vibrate(10);
10664
+ if (globalHaptics && hapticFeedback) triggerHaptic("selection");
10498
10665
  };
10499
10666
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Button, {
10500
10667
  ...buttonProps,
@@ -10502,7 +10669,7 @@ const BottomSheetAction = ({ children, onPress, hapticFeedback = true, ...button
10502
10669
  children
10503
10670
  });
10504
10671
  };
10505
- const styles$13 = react_native.StyleSheet.create({
10672
+ const styles$15 = react_native.StyleSheet.create({
10506
10673
  overlay: {
10507
10674
  flex: 1,
10508
10675
  backgroundColor: "rgba(0, 0, 0, 0.5)"
@@ -10512,7 +10679,8 @@ const styles$13 = react_native.StyleSheet.create({
10512
10679
  left: 0,
10513
10680
  right: 0,
10514
10681
  bottom: 0,
10515
- elevation: 4
10682
+ elevation: 4,
10683
+ paddingBottom: 16
10516
10684
  },
10517
10685
  handleContainer: {
10518
10686
  alignItems: "center",
@@ -10531,8 +10699,7 @@ const styles$13 = react_native.StyleSheet.create({
10531
10699
  footer: {
10532
10700
  flexDirection: "row",
10533
10701
  justifyContent: "flex-end",
10534
- alignItems: "center",
10535
- marginTop: 8
10702
+ alignItems: "center"
10536
10703
  },
10537
10704
  footerContent: {
10538
10705
  flexDirection: "row",
@@ -10554,49 +10721,617 @@ const BottomSheet = {
10554
10721
  };
10555
10722
 
10556
10723
  //#endregion
10557
- //#region src/components/data-display/Avatar.tsx
10558
- const Avatar = react.default.forwardRef(({ src, alt = "Avatar", color, variant = "solid", highContrast, radius, size = 2, fallback, fallbackBehavior = "character", style, accessibilityLabel, children }, ref) => {
10559
- const theme = useTheme$1();
10560
- const mode = useThemeMode$1();
10561
- const isDark = mode === "dark";
10562
- const grayScale = isDark ? theme.colors.gray.dark : theme.colors.gray;
10563
- const grayAlpha = getGrayAlpha(theme);
10564
- const activeColor = color || theme.accentColor;
10565
- const radii = theme.radii[radius] ?? theme.radii.medium;
10566
- const selectedRadius = radius || theme.radius;
10567
- const [imageError, setImageError] = (0, react.useState)(false);
10568
- const variantColors = (0, react.useMemo)(() => getVariantColors(theme, activeColor, mode, variant, highContrast), [
10569
- getVariantColors,
10570
- color,
10571
- variant,
10572
- highContrast,
10573
- isDark,
10574
- theme
10575
- ]);
10576
- const getSizeValues = () => {
10577
- switch (size) {
10578
- case 1: return {
10579
- size: 24,
10580
- fontSize: 10,
10581
- borderWidth: 0,
10582
- borderRadius: selectedRadius === "full" ? 9999 : radii
10583
- };
10584
- case 2: return {
10585
- size: 32,
10586
- fontSize: 12,
10587
- borderWidth: 0,
10588
- borderRadius: selectedRadius === "full" ? 9999 : radii
10589
- };
10590
- case 3: return {
10591
- size: 48,
10592
- fontSize: 18,
10593
- borderWidth: 0,
10594
- borderRadius: selectedRadius === "full" ? 9999 : radii
10595
- };
10596
- case 4: return {
10597
- size: 64,
10598
- fontSize: 24,
10599
- borderWidth: 0,
10724
+ //#region src/components/overlays/Sidebar.tsx
10725
+ const SidebarContext = (0, react.createContext)(null);
10726
+ const useSidebar = () => {
10727
+ const context = (0, react.useContext)(SidebarContext);
10728
+ if (!context) throw new Error("Sidebar components must be used within a Sidebar.Root");
10729
+ return context;
10730
+ };
10731
+ const { width: SCREEN_WIDTH } = react_native.Dimensions.get("window");
10732
+ const SidebarRoot = ({ children, open: controlledOpen, onOpenChange, side = "left", variant = "overlay", width = 280, animationDuration = 300 }) => {
10733
+ const [internalOpen, setInternalOpen] = (0, react.useState)(false);
10734
+ const open = controlledOpen !== void 0 ? controlledOpen : internalOpen;
10735
+ const initialTranslateX = side === "left" ? -width : width;
10736
+ const translateX = (0, react.useRef)(new react_native.Animated.Value(open ? 0 : initialTranslateX)).current;
10737
+ const mainTranslateX = (0, react.useRef)(new react_native.Animated.Value(0)).current;
10738
+ const skipAnimationRef = (0, react.useRef)(false);
10739
+ const swipeDistance = (0, react.useRef)(0);
10740
+ const isSwiping = (0, react.useRef)(false);
10741
+ const startX = (0, react.useRef)(0);
10742
+ const handleOpenChange = (0, react.useCallback)((newOpen, skipAnimation = false) => {
10743
+ skipAnimationRef.current = skipAnimation;
10744
+ if (controlledOpen === void 0) setInternalOpen(newOpen);
10745
+ onOpenChange?.(newOpen);
10746
+ }, [controlledOpen, onOpenChange]);
10747
+ const panResponder = (0, react.useMemo)(() => {
10748
+ return react_native.PanResponder.create({
10749
+ onStartShouldSetPanResponder: () => false,
10750
+ onMoveShouldSetPanResponder: (_, gestureState) => {
10751
+ return Math.abs(gestureState.dx) > 10 && Math.abs(gestureState.dx) > Math.abs(gestureState.dy);
10752
+ },
10753
+ onPanResponderGrant: () => {
10754
+ startX.current = 0;
10755
+ isSwiping.current = true;
10756
+ },
10757
+ onPanResponderMove: (_, gestureState) => {
10758
+ isSwiping.current = true;
10759
+ swipeDistance.current = gestureState.dx;
10760
+ if (side === "left") {
10761
+ const newTranslateX = initialTranslateX + gestureState.dx;
10762
+ const clampedValue = Math.max(-width, Math.min(0, newTranslateX));
10763
+ translateX.setValue(clampedValue);
10764
+ } else {
10765
+ const newTranslateX = initialTranslateX + gestureState.dx;
10766
+ const clampedValue = Math.max(0, Math.min(width, newTranslateX));
10767
+ translateX.setValue(clampedValue);
10768
+ }
10769
+ },
10770
+ onPanResponderRelease: (_, gestureState) => {
10771
+ const threshold = width * .25;
10772
+ const velocityThreshold = 500;
10773
+ if (side === "left") if (gestureState.dx > threshold || gestureState.vx > velocityThreshold / 1e3) react_native.Animated.timing(translateX, {
10774
+ toValue: 0,
10775
+ duration: animationDuration,
10776
+ useNativeDriver: true
10777
+ }).start();
10778
+ else if (gestureState.dx < -threshold || gestureState.vx < -velocityThreshold / 1e3) {
10779
+ if (globalHaptics) triggerHaptic("selection");
10780
+ react_native.Animated.timing(translateX, {
10781
+ toValue: -width,
10782
+ duration: animationDuration,
10783
+ useNativeDriver: true
10784
+ }).start();
10785
+ } else react_native.Animated.spring(translateX, {
10786
+ toValue: open ? 0 : -width,
10787
+ tension: 65,
10788
+ friction: 11,
10789
+ useNativeDriver: true
10790
+ }).start();
10791
+ else if (gestureState.dx < -threshold || gestureState.vx < -velocityThreshold / 1e3) react_native.Animated.timing(translateX, {
10792
+ toValue: 0,
10793
+ duration: animationDuration,
10794
+ useNativeDriver: true
10795
+ }).start();
10796
+ else if (gestureState.dx > threshold || gestureState.vx > velocityThreshold / 1e3) {
10797
+ if (globalHaptics) triggerHaptic("selection");
10798
+ react_native.Animated.timing(translateX, {
10799
+ toValue: width,
10800
+ duration: animationDuration,
10801
+ useNativeDriver: true
10802
+ }).start();
10803
+ } else react_native.Animated.spring(translateX, {
10804
+ toValue: open ? 0 : width,
10805
+ tension: 65,
10806
+ friction: 11,
10807
+ useNativeDriver: true
10808
+ }).start();
10809
+ isSwiping.current = false;
10810
+ }
10811
+ });
10812
+ }, [
10813
+ translateX,
10814
+ width,
10815
+ side,
10816
+ open,
10817
+ initialTranslateX,
10818
+ handleOpenChange,
10819
+ globalHaptics
10820
+ ]);
10821
+ (0, react.useEffect)(() => {
10822
+ if (skipAnimationRef.current) {
10823
+ skipAnimationRef.current = false;
10824
+ return;
10825
+ }
10826
+ if (open) {
10827
+ translateX.setValue(side === "left" ? -width : width);
10828
+ react_native.Animated.timing(translateX, {
10829
+ toValue: 0,
10830
+ duration: animationDuration,
10831
+ useNativeDriver: true
10832
+ }).start();
10833
+ } else react_native.Animated.timing(translateX, {
10834
+ toValue: side === "left" ? -width : width,
10835
+ duration: animationDuration,
10836
+ useNativeDriver: true
10837
+ }).start();
10838
+ }, [
10839
+ open,
10840
+ width,
10841
+ side,
10842
+ translateX,
10843
+ animationDuration
10844
+ ]);
10845
+ (0, react.useEffect)(() => {
10846
+ if (skipAnimationRef.current) return;
10847
+ if (variant === "push") if (open) react_native.Animated.timing(mainTranslateX, {
10848
+ toValue: side === "left" ? width : -width,
10849
+ duration: animationDuration,
10850
+ useNativeDriver: true
10851
+ }).start();
10852
+ else react_native.Animated.timing(mainTranslateX, {
10853
+ toValue: 0,
10854
+ duration: animationDuration,
10855
+ useNativeDriver: true
10856
+ }).start();
10857
+ }, [
10858
+ open,
10859
+ width,
10860
+ side,
10861
+ variant,
10862
+ mainTranslateX,
10863
+ animationDuration
10864
+ ]);
10865
+ const theme = useTheme$1();
10866
+ const mode = useThemeMode$1();
10867
+ const globalHaptics = useHaptics$1();
10868
+ const colors = mode === "dark" ? theme.colors.gray.dark : theme.colors.gray;
10869
+ const grayAlpha = getGrayAlpha(theme);
10870
+ const radii = theme.radii;
10871
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SidebarContext.Provider, {
10872
+ value: {
10873
+ open,
10874
+ onOpenChange: handleOpenChange,
10875
+ side,
10876
+ variant,
10877
+ width,
10878
+ animationDuration,
10879
+ colors,
10880
+ grayAlpha,
10881
+ radii,
10882
+ translateX,
10883
+ mainTranslateX,
10884
+ panHandlers: panResponder.panHandlers,
10885
+ globalHaptics
10886
+ },
10887
+ children
10888
+ });
10889
+ };
10890
+ const SidebarTrigger = ({ children, asChild = true, hapticFeedback = false }) => {
10891
+ const { onOpenChange, globalHaptics } = useSidebar();
10892
+ const handlePress = () => {
10893
+ onOpenChange(true);
10894
+ if (globalHaptics && hapticFeedback) triggerHaptic("selection");
10895
+ };
10896
+ if (asChild && react.default.isValidElement(children)) return react.default.cloneElement(children, { onPress: (e) => {
10897
+ children.props?.onPress?.(e);
10898
+ handlePress();
10899
+ } });
10900
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedPressable, {
10901
+ onPress: handlePress,
10902
+ pressedScale: .98,
10903
+ pressedOpacity: .95,
10904
+ animationDuration: 100,
10905
+ hapticFeedback: false,
10906
+ children
10907
+ });
10908
+ };
10909
+ const SidebarPortal = ({ children }) => {
10910
+ const { open, variant } = useSidebar();
10911
+ if (variant === "push") return null;
10912
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Modal, {
10913
+ transparent: true,
10914
+ visible: open,
10915
+ animationType: "none",
10916
+ supportedOrientations: ["portrait", "landscape"],
10917
+ onRequestClose: () => {},
10918
+ children
10919
+ });
10920
+ };
10921
+ const SidebarOverlay = ({ style, hapticFeedback = true }) => {
10922
+ const { onOpenChange, variant, globalHaptics } = useSidebar();
10923
+ const isDark = useThemeMode$1() === "dark";
10924
+ if (variant === "push") return null;
10925
+ const overlayColor = isDark ? "rgba(0, 0, 0, 0.6)" : "rgba(10, 10, 10, 0.6)";
10926
+ const handlePress = () => {
10927
+ onOpenChange(false);
10928
+ if (globalHaptics && hapticFeedback) triggerHaptic("press");
10929
+ };
10930
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.TouchableWithoutFeedback, {
10931
+ onPress: handlePress,
10932
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [
10933
+ styles$14.overlay,
10934
+ { backgroundColor: overlayColor },
10935
+ style
10936
+ ] })
10937
+ });
10938
+ };
10939
+ const SidebarContent = ({ children, style }) => {
10940
+ const { side, variant, width, translateX, panHandlers, radii, colors } = useSidebar();
10941
+ const theme = useTheme$1();
10942
+ const isDark = useThemeMode$1() === "dark";
10943
+ const backgroundColor = isDark ? theme.colors.gray.dark[2] : "#ffffff";
10944
+ const shadow = getShadow(6, isDark);
10945
+ const borderRadius = side === "left" ? {
10946
+ borderTopRightRadius: radii.large,
10947
+ borderBottomRightRadius: radii.large
10948
+ } : {
10949
+ borderTopLeftRadius: radii.large,
10950
+ borderBottomLeftRadius: radii.large
10951
+ };
10952
+ if (variant === "push") {
10953
+ const positionStyle = side === "left" ? { marginRight: -width } : { marginLeft: -width };
10954
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Animated.View, {
10955
+ style: [{
10956
+ backgroundColor,
10957
+ width,
10958
+ ...borderRadius,
10959
+ transform: [{ translateX }],
10960
+ ...shadow || {},
10961
+ ...positionStyle
10962
+ }, style],
10963
+ ...panHandlers,
10964
+ children
10965
+ });
10966
+ }
10967
+ const positionStyle = side === "left" ? { left: 0 } : { right: 0 };
10968
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Animated.View, {
10969
+ style: [
10970
+ styles$14.content,
10971
+ {
10972
+ backgroundColor,
10973
+ width,
10974
+ ...borderRadius,
10975
+ ...positionStyle,
10976
+ transform: [{ translateX }],
10977
+ ...shadow || {}
10978
+ },
10979
+ style
10980
+ ],
10981
+ ...panHandlers,
10982
+ children
10983
+ });
10984
+ };
10985
+ const SidebarHeader = ({ children, style }) => {
10986
+ const theme = useTheme$1();
10987
+ const borderColor = useThemeMode$1() === "dark" ? "rgba(255, 255, 255, 0.1)" : "rgba(0, 0, 0, 0.1)";
10988
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
10989
+ style: [
10990
+ styles$14.header,
10991
+ {
10992
+ paddingHorizontal: theme.space[4],
10993
+ paddingVertical: theme.space[3],
10994
+ borderBottomWidth: 1,
10995
+ borderBottomColor: borderColor
10996
+ },
10997
+ style
10998
+ ],
10999
+ children
11000
+ });
11001
+ };
11002
+ const SidebarItem = ({ children, onPress, style, hapticFeedback = true }) => {
11003
+ const { onOpenChange, globalHaptics } = useSidebar();
11004
+ const theme = useTheme$1();
11005
+ const isDark = useThemeMode$1() === "dark";
11006
+ const handlePress = () => {
11007
+ onPress?.();
11008
+ onOpenChange(false);
11009
+ if (globalHaptics && hapticFeedback) triggerHaptic("selection");
11010
+ };
11011
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Pressable, {
11012
+ style: ({ pressed }) => [
11013
+ styles$14.item,
11014
+ {
11015
+ paddingHorizontal: theme.space[4],
11016
+ paddingVertical: theme.space[3],
11017
+ backgroundColor: pressed ? isDark ? "rgba(255, 255, 255, 0.1)" : "rgba(0, 0, 0, 0.05)" : "transparent"
11018
+ },
11019
+ style
11020
+ ],
11021
+ onPress: handlePress,
11022
+ children
11023
+ });
11024
+ };
11025
+ const SidebarSeparator = ({ style }) => {
11026
+ const theme = useTheme$1();
11027
+ const borderColor = useThemeMode$1() === "dark" ? "rgba(255, 255, 255, 0.1)" : "rgba(0, 0, 0, 0.1)";
11028
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, { style: [
11029
+ styles$14.separator,
11030
+ {
11031
+ marginHorizontal: theme.space[4],
11032
+ borderBottomWidth: 1,
11033
+ borderBottomColor: borderColor
11034
+ },
11035
+ style
11036
+ ] });
11037
+ };
11038
+ const SidebarBackdrop = ({ style, hapticFeedback = true }) => {
11039
+ const { onOpenChange, variant, globalHaptics } = useSidebar();
11040
+ const isDark = useThemeMode$1() === "dark";
11041
+ if (variant === "overlay") return null;
11042
+ const overlayColor = isDark ? "rgba(0, 0, 0, 0.3)" : "rgba(0, 0, 0, 0.2)";
11043
+ const handlePress = () => {
11044
+ onOpenChange(false);
11045
+ if (globalHaptics && hapticFeedback) triggerHaptic("selection");
11046
+ };
11047
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.TouchableWithoutFeedback, {
11048
+ onPress: handlePress,
11049
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Animated.View, { style: [
11050
+ styles$14.backdrop,
11051
+ { backgroundColor: overlayColor },
11052
+ style
11053
+ ] })
11054
+ });
11055
+ };
11056
+ const SidebarContainer = ({ children }) => {
11057
+ const { animationDuration, variant, side, width, open, onOpenChange, translateX, mainTranslateX } = useSidebar();
11058
+ if (variant !== "push") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children });
11059
+ const containerPanResponder = (0, react.useMemo)(() => {
11060
+ return react_native.PanResponder.create({
11061
+ onStartShouldSetPanResponder: () => false,
11062
+ onMoveShouldSetPanResponder: (_, gestureState) => {
11063
+ if (Math.abs(gestureState.dx) <= 10 || Math.abs(gestureState.dx) <= Math.abs(gestureState.dy)) return false;
11064
+ if (!open) if (side === "left") return gestureState.dx > 10;
11065
+ else return gestureState.dx < -10;
11066
+ return true;
11067
+ },
11068
+ onPanResponderGrant: () => {},
11069
+ onPanResponderMove: (_, gestureState) => {
11070
+ if (side === "left") if (open) {
11071
+ const newTranslateX = gestureState.dx;
11072
+ const clampedValue = Math.max(-width, Math.min(0, newTranslateX));
11073
+ translateX.setValue(clampedValue);
11074
+ mainTranslateX.setValue(clampedValue + width);
11075
+ } else {
11076
+ const newTranslateX = -width + gestureState.dx;
11077
+ const clampedValue = Math.max(-width, Math.min(0, newTranslateX));
11078
+ translateX.setValue(clampedValue);
11079
+ mainTranslateX.setValue(gestureState.dx);
11080
+ }
11081
+ else if (open) {
11082
+ const newTranslateX = width + gestureState.dx;
11083
+ const clampedValue = Math.max(0, Math.min(width, newTranslateX));
11084
+ translateX.setValue(clampedValue);
11085
+ mainTranslateX.setValue(clampedValue - width);
11086
+ } else {
11087
+ const newTranslateX = width + gestureState.dx;
11088
+ const clampedValue = Math.max(0, Math.min(width, newTranslateX));
11089
+ translateX.setValue(clampedValue);
11090
+ mainTranslateX.setValue(gestureState.dx);
11091
+ }
11092
+ },
11093
+ onPanResponderRelease: (_, gestureState) => {
11094
+ const threshold = width * .25;
11095
+ const velocityThreshold = 500;
11096
+ if (side === "left") if (open) if (gestureState.dx < -threshold || gestureState.vx < -velocityThreshold / 1e3) {
11097
+ triggerHaptic("selection");
11098
+ onOpenChange(false, true);
11099
+ react_native.Animated.timing(translateX, {
11100
+ toValue: -width,
11101
+ duration: animationDuration,
11102
+ useNativeDriver: true
11103
+ }).start();
11104
+ react_native.Animated.timing(mainTranslateX, {
11105
+ toValue: 0,
11106
+ duration: animationDuration,
11107
+ useNativeDriver: true
11108
+ }).start();
11109
+ } else {
11110
+ react_native.Animated.spring(translateX, {
11111
+ toValue: 0,
11112
+ tension: 65,
11113
+ friction: 11,
11114
+ useNativeDriver: true
11115
+ }).start();
11116
+ react_native.Animated.spring(mainTranslateX, {
11117
+ toValue: width,
11118
+ tension: 65,
11119
+ friction: 11,
11120
+ useNativeDriver: true
11121
+ }).start();
11122
+ }
11123
+ else if (gestureState.dx > threshold || gestureState.vx > velocityThreshold / 1e3) {
11124
+ react_native.Animated.timing(translateX, {
11125
+ toValue: 0,
11126
+ duration: animationDuration,
11127
+ useNativeDriver: true
11128
+ }).start();
11129
+ react_native.Animated.timing(mainTranslateX, {
11130
+ toValue: width,
11131
+ duration: animationDuration,
11132
+ useNativeDriver: true
11133
+ }).start();
11134
+ onOpenChange(true, true);
11135
+ } else {
11136
+ react_native.Animated.spring(translateX, {
11137
+ toValue: -width,
11138
+ tension: 65,
11139
+ friction: 11,
11140
+ useNativeDriver: true
11141
+ }).start();
11142
+ react_native.Animated.spring(mainTranslateX, {
11143
+ toValue: 0,
11144
+ tension: 65,
11145
+ friction: 11,
11146
+ useNativeDriver: true
11147
+ }).start();
11148
+ }
11149
+ else if (open) if (gestureState.dx > threshold || gestureState.vx > velocityThreshold / 1e3) {
11150
+ triggerHaptic("selection");
11151
+ onOpenChange(false, true);
11152
+ react_native.Animated.timing(translateX, {
11153
+ toValue: width,
11154
+ duration: animationDuration,
11155
+ useNativeDriver: true
11156
+ }).start();
11157
+ react_native.Animated.timing(mainTranslateX, {
11158
+ toValue: 0,
11159
+ duration: animationDuration,
11160
+ useNativeDriver: true
11161
+ }).start();
11162
+ } else {
11163
+ react_native.Animated.spring(translateX, {
11164
+ toValue: 0,
11165
+ tension: 65,
11166
+ friction: 11,
11167
+ useNativeDriver: true
11168
+ }).start();
11169
+ react_native.Animated.spring(mainTranslateX, {
11170
+ toValue: -width,
11171
+ tension: 65,
11172
+ friction: 11,
11173
+ useNativeDriver: true
11174
+ }).start();
11175
+ }
11176
+ else if (gestureState.dx < -threshold || gestureState.vx < -velocityThreshold / 1e3) {
11177
+ react_native.Animated.timing(translateX, {
11178
+ toValue: 0,
11179
+ duration: animationDuration,
11180
+ useNativeDriver: true
11181
+ }).start();
11182
+ react_native.Animated.timing(mainTranslateX, {
11183
+ toValue: -width,
11184
+ duration: animationDuration,
11185
+ useNativeDriver: true
11186
+ }).start();
11187
+ onOpenChange(true, true);
11188
+ } else {
11189
+ react_native.Animated.spring(translateX, {
11190
+ toValue: width,
11191
+ tension: 65,
11192
+ friction: 11,
11193
+ useNativeDriver: true
11194
+ }).start();
11195
+ react_native.Animated.spring(mainTranslateX, {
11196
+ toValue: 0,
11197
+ tension: 65,
11198
+ friction: 11,
11199
+ useNativeDriver: true
11200
+ }).start();
11201
+ }
11202
+ }
11203
+ });
11204
+ }, [
11205
+ side,
11206
+ width,
11207
+ open,
11208
+ onOpenChange,
11209
+ translateX,
11210
+ mainTranslateX,
11211
+ animationDuration
11212
+ ]);
11213
+ const childArray = react.default.Children.toArray(children);
11214
+ let contentChild = null;
11215
+ let mainChild = null;
11216
+ childArray.forEach((child) => {
11217
+ if (react.default.isValidElement(child) && child.type === SidebarContent) contentChild = child;
11218
+ else if (react.default.isValidElement(child) && child.type === SidebarMain) mainChild = child;
11219
+ });
11220
+ if (side === "right" && mainChild && contentChild) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_native.View, {
11221
+ style: styles$14.container,
11222
+ ...containerPanResponder.panHandlers,
11223
+ children: [mainChild, contentChild]
11224
+ });
11225
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
11226
+ style: styles$14.container,
11227
+ ...containerPanResponder.panHandlers,
11228
+ children
11229
+ });
11230
+ };
11231
+ const SidebarMain = ({ children, style }) => {
11232
+ const { side, variant, width, open, mainTranslateX } = useSidebar();
11233
+ useTheme$1();
11234
+ if (variant === "push") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Animated.View, {
11235
+ style: [
11236
+ styles$14.mainContent,
11237
+ {
11238
+ flex: 1,
11239
+ transform: [{ translateX: mainTranslateX }]
11240
+ },
11241
+ style
11242
+ ],
11243
+ children
11244
+ });
11245
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children });
11246
+ };
11247
+ const styles$14 = react_native.StyleSheet.create({
11248
+ container: {
11249
+ flexDirection: "row",
11250
+ flex: 1
11251
+ },
11252
+ overlay: {
11253
+ ...react_native.StyleSheet.absoluteFillObject,
11254
+ zIndex: 1
11255
+ },
11256
+ backdrop: {
11257
+ ...react_native.StyleSheet.absoluteFillObject,
11258
+ zIndex: 1
11259
+ },
11260
+ content: {
11261
+ position: "absolute",
11262
+ top: 0,
11263
+ bottom: 0,
11264
+ zIndex: 2,
11265
+ elevation: 4
11266
+ },
11267
+ scrollContent: { flex: 1 },
11268
+ scrollContentContainer: {
11269
+ flexGrow: 1,
11270
+ paddingBottom: 4
11271
+ },
11272
+ header: {},
11273
+ item: {},
11274
+ separator: { height: 1 },
11275
+ mainContent: {}
11276
+ });
11277
+ const Sidebar = {
11278
+ Root: SidebarRoot,
11279
+ Trigger: SidebarTrigger,
11280
+ Portal: SidebarPortal,
11281
+ Overlay: SidebarOverlay,
11282
+ Content: SidebarContent,
11283
+ Header: SidebarHeader,
11284
+ Item: SidebarItem,
11285
+ Separator: SidebarSeparator,
11286
+ Main: SidebarMain,
11287
+ Backdrop: SidebarBackdrop,
11288
+ Container: SidebarContainer
11289
+ };
11290
+
11291
+ //#endregion
11292
+ //#region src/components/data-display/Avatar.tsx
11293
+ const Avatar = react.default.forwardRef(({ src, alt = "Avatar", color, variant = "solid", highContrast, radius, size = 2, fallback, fallbackBehavior = "character", style, accessibilityLabel, children }, ref) => {
11294
+ const theme = useTheme$1();
11295
+ const mode = useThemeMode$1();
11296
+ const isDark = mode === "dark";
11297
+ const grayScale = isDark ? theme.colors.gray.dark : theme.colors.gray;
11298
+ const grayAlpha = getGrayAlpha(theme);
11299
+ const activeColor = color || theme.accentColor;
11300
+ const radii = theme.radii[radius] ?? theme.radii.medium;
11301
+ const selectedRadius = radius || theme.radius;
11302
+ const [imageError, setImageError] = (0, react.useState)(false);
11303
+ const variantColors = (0, react.useMemo)(() => getVariantColors(theme, activeColor, mode, variant, highContrast), [
11304
+ getVariantColors,
11305
+ color,
11306
+ variant,
11307
+ highContrast,
11308
+ isDark,
11309
+ theme
11310
+ ]);
11311
+ const getSizeValues = () => {
11312
+ switch (size) {
11313
+ case 1: return {
11314
+ size: 24,
11315
+ fontSize: 10,
11316
+ borderWidth: 0,
11317
+ borderRadius: selectedRadius === "full" ? 9999 : radii
11318
+ };
11319
+ case 2: return {
11320
+ size: 32,
11321
+ fontSize: 12,
11322
+ borderWidth: 0,
11323
+ borderRadius: selectedRadius === "full" ? 9999 : radii
11324
+ };
11325
+ case 3: return {
11326
+ size: 48,
11327
+ fontSize: 18,
11328
+ borderWidth: 0,
11329
+ borderRadius: selectedRadius === "full" ? 9999 : radii
11330
+ };
11331
+ case 4: return {
11332
+ size: 64,
11333
+ fontSize: 24,
11334
+ borderWidth: 0,
10600
11335
  borderRadius: selectedRadius === "full" ? 9999 : radii
10601
11336
  };
10602
11337
  case 5: return {
@@ -10648,10 +11383,10 @@ const Avatar = react.default.forwardRef(({ src, alt = "Avatar", color, variant =
10648
11383
  if (!trimmed) return null;
10649
11384
  return trimmed.split(/\s+/).map((word) => word[0]).join("").slice(0, 2).toUpperCase() || null;
10650
11385
  })();
10651
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(View_default, {
11386
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(RnView, {
10652
11387
  ref,
10653
11388
  style: [
10654
- styles$12.avatar,
11389
+ styles$13.avatar,
10655
11390
  {
10656
11391
  width: sizeValues.size,
10657
11392
  height: sizeValues.size,
@@ -10676,8 +11411,8 @@ const Avatar = react.default.forwardRef(({ src, alt = "Avatar", color, variant =
10676
11411
  onError: () => setImageError(true),
10677
11412
  accessibilityLabel: alt,
10678
11413
  testID: "avatar-image"
10679
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(View_default, {
10680
- style: [styles$12.fallback, {
11414
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
11415
+ style: [styles$13.fallback, {
10681
11416
  backgroundColor: variantColors.backgroundColor,
10682
11417
  flex: 1,
10683
11418
  width: "100%",
@@ -10701,7 +11436,7 @@ const AvatarFallback = ({ children }) => {
10701
11436
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children });
10702
11437
  };
10703
11438
  Avatar.Fallback = AvatarFallback;
10704
- const styles$12 = react_native.StyleSheet.create({
11439
+ const styles$13 = react_native.StyleSheet.create({
10705
11440
  avatar: {
10706
11441
  alignItems: "center",
10707
11442
  justifyContent: "center"
@@ -10769,7 +11504,7 @@ const Badge = react.default.forwardRef(({ children, variant = "soft", color, rad
10769
11504
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
10770
11505
  ref,
10771
11506
  style: [
10772
- styles$11.badge,
11507
+ styles$12.badge,
10773
11508
  badgeStyle,
10774
11509
  style
10775
11510
  ],
@@ -10777,13 +11512,13 @@ const Badge = react.default.forwardRef(({ children, variant = "soft", color, rad
10777
11512
  accessibilityRole: "none",
10778
11513
  ...rest,
10779
11514
  children: typeof children === "string" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
10780
- style: [styles$11.text, textStyle],
11515
+ style: [styles$12.text, textStyle],
10781
11516
  children
10782
11517
  }) : children
10783
11518
  });
10784
11519
  });
10785
11520
  Badge.displayName = "Badge";
10786
- const styles$11 = react_native.StyleSheet.create({
11521
+ const styles$12 = react_native.StyleSheet.create({
10787
11522
  badge: {
10788
11523
  flexDirection: "row",
10789
11524
  alignItems: "center"
@@ -11019,14 +11754,14 @@ const Card = react.default.forwardRef(({ asChild = false, children, color, radiu
11019
11754
  style,
11020
11755
  ...rest,
11021
11756
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
11022
- style: [styles$10.card, cardStyle],
11757
+ style: [styles$11.card, cardStyle],
11023
11758
  children
11024
11759
  })
11025
11760
  });
11026
11761
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
11027
11762
  ref,
11028
11763
  style: [
11029
- styles$10.card,
11764
+ styles$11.card,
11030
11765
  cardStyle,
11031
11766
  style
11032
11767
  ],
@@ -11040,7 +11775,7 @@ const CardFooter = ({ children, separate = true }) => {
11040
11775
  useThemeMode$1();
11041
11776
  const grayAlpha = getGrayAlpha(theme);
11042
11777
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
11043
- style: [styles$10.footer, separate && {
11778
+ style: [styles$11.footer, separate && {
11044
11779
  borderTopWidth: 1,
11045
11780
  borderTopColor: grayAlpha["6"],
11046
11781
  marginTop: theme.space[4],
@@ -11050,7 +11785,7 @@ const CardFooter = ({ children, separate = true }) => {
11050
11785
  });
11051
11786
  };
11052
11787
  Card.Footer = CardFooter;
11053
- const styles$10 = react_native.StyleSheet.create({
11788
+ const styles$11 = react_native.StyleSheet.create({
11054
11789
  card: { overflow: "hidden" },
11055
11790
  footer: {
11056
11791
  flexDirection: "row",
@@ -11097,7 +11832,7 @@ const DataListRoot = ({ children, orientation = "horizontal", size = 2, trim = "
11097
11832
  },
11098
11833
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
11099
11834
  style: [
11100
- styles$9.root,
11835
+ styles$10.root,
11101
11836
  rootStyle,
11102
11837
  trimStyles,
11103
11838
  style
@@ -11121,7 +11856,7 @@ const DataListItem = ({ children, align = "baseline", style }) => {
11121
11856
  };
11122
11857
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
11123
11858
  style: [
11124
- styles$9.item,
11859
+ styles$10.item,
11125
11860
  itemStyle,
11126
11861
  style
11127
11862
  ],
@@ -11191,7 +11926,7 @@ const DataListValue = ({ children, style }) => {
11191
11926
  });
11192
11927
  };
11193
11928
  DataListValue.displayName = "DataList.Value";
11194
- const styles$9 = react_native.StyleSheet.create({
11929
+ const styles$10 = react_native.StyleSheet.create({
11195
11930
  root: { width: "100%" },
11196
11931
  item: { width: "100%" }
11197
11932
  });
@@ -11213,7 +11948,7 @@ const FancyList = ({ data, renderItem, keyExtractor, style, showDividers = true,
11213
11948
  const backgroundColor = isDark ? grayAlpha["2"] : grayAlpha["1"];
11214
11949
  const defaultKeyExtractor = (item, index) => {
11215
11950
  if (keyExtractor) return keyExtractor(item, index);
11216
- if ("id" in item) return String(item.id);
11951
+ if (item && typeof item === "object" && "id" in item) return String(item.id);
11217
11952
  return String(index);
11218
11953
  };
11219
11954
  const renderListItem = (info) => {
@@ -11223,7 +11958,7 @@ const FancyList = ({ data, renderItem, keyExtractor, style, showDividers = true,
11223
11958
  borderBottomColor: dividerColor
11224
11959
  };
11225
11960
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
11226
- style: [styles$8.item, itemStyle],
11961
+ style: [styles$9.item, itemStyle],
11227
11962
  children: renderItem({
11228
11963
  item: info.item,
11229
11964
  index: info.index,
@@ -11238,14 +11973,14 @@ const FancyList = ({ data, renderItem, keyExtractor, style, showDividers = true,
11238
11973
  };
11239
11974
  if (!scrollable) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(RnView, {
11240
11975
  style: [
11241
- styles$8.container,
11976
+ styles$9.container,
11242
11977
  listContainerStyle,
11243
11978
  style
11244
11979
  ],
11245
11980
  children: [
11246
11981
  ListHeaderComponent,
11247
11982
  data.map((item, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
11248
- style: styles$8.nonScrollableItem,
11983
+ style: styles$9.nonScrollableItem,
11249
11984
  children: renderItem({
11250
11985
  item,
11251
11986
  index,
@@ -11256,28 +11991,28 @@ const FancyList = ({ data, renderItem, keyExtractor, style, showDividers = true,
11256
11991
  ]
11257
11992
  });
11258
11993
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
11259
- style: [styles$8.container, style],
11994
+ style: [styles$9.container, style],
11260
11995
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnFlatList, {
11261
11996
  data,
11262
11997
  renderItem: renderListItem,
11263
11998
  keyExtractor: defaultKeyExtractor,
11264
- style: [styles$8.flatList, listContainerStyle],
11265
- contentContainerStyle: styles$8.contentContainer,
11999
+ style: [styles$9.flatList, listContainerStyle],
12000
+ contentContainerStyle: styles$9.contentContainer,
11266
12001
  showsVerticalScrollIndicator: true,
11267
12002
  ListEmptyComponent,
11268
12003
  ListHeaderComponent,
11269
12004
  ListFooterComponent,
11270
- ItemSeparatorComponent: () => showDividers ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, { style: [styles$8.divider, {
12005
+ ItemSeparatorComponent: () => showDividers ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, { style: [styles$9.divider, {
11271
12006
  backgroundColor: dividerColor,
11272
12007
  marginHorizontal: theme.space[4]
11273
12008
  }] }) : null,
11274
- ListHeaderComponentStyle: styles$8.listHeaderFooter,
11275
- ListFooterComponentStyle: styles$8.listHeaderFooter
12009
+ ListHeaderComponentStyle: styles$9.listHeaderFooter,
12010
+ ListFooterComponentStyle: styles$9.listHeaderFooter
11276
12011
  })
11277
12012
  });
11278
12013
  };
11279
12014
  FancyList.displayName = "FancyList";
11280
- const styles$8 = react_native.StyleSheet.create({
12015
+ const styles$9 = react_native.StyleSheet.create({
11281
12016
  container: { width: "100%" },
11282
12017
  flatList: { flex: 1 },
11283
12018
  contentContainer: { flexGrow: 1 },
@@ -11381,7 +12116,7 @@ const Progress = (0, react.forwardRef)(({ value, max = 100, size = 2, variant =
11381
12116
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
11382
12117
  ref,
11383
12118
  style: [
11384
- styles$7.track,
12119
+ styles$8.track,
11385
12120
  {
11386
12121
  backgroundColor: trackBackgroundColor,
11387
12122
  borderColor: trackBorder.borderColor,
@@ -11400,7 +12135,7 @@ const Progress = (0, react.forwardRef)(({ value, max = 100, size = 2, variant =
11400
12135
  },
11401
12136
  accessibilityRole: "progressbar",
11402
12137
  testID,
11403
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Animated.View, { style: [styles$7.indicator, {
12138
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Animated.View, { style: [styles$8.indicator, {
11404
12139
  width: animatedWidth,
11405
12140
  backgroundColor: indicatorColor,
11406
12141
  borderRadius: selectedRadius
@@ -11408,7 +12143,7 @@ const Progress = (0, react.forwardRef)(({ value, max = 100, size = 2, variant =
11408
12143
  });
11409
12144
  });
11410
12145
  Progress.displayName = "Progress";
11411
- const styles$7 = react_native.StyleSheet.create({
12146
+ const styles$8 = react_native.StyleSheet.create({
11412
12147
  track: {
11413
12148
  width: "100%",
11414
12149
  overflow: "hidden"
@@ -11441,7 +12176,7 @@ const Spinner = react.default.forwardRef(({ size = "medium", color, highContrast
11441
12176
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
11442
12177
  ref,
11443
12178
  style: [
11444
- styles$6.container,
12179
+ styles$7.container,
11445
12180
  {
11446
12181
  width: sizeConfig.dimension,
11447
12182
  height: sizeConfig.dimension
@@ -11458,148 +12193,312 @@ const Spinner = react.default.forwardRef(({ size = "medium", color, highContrast
11458
12193
  });
11459
12194
  });
11460
12195
  Spinner.displayName = "Spinner";
11461
- const styles$6 = react_native.StyleSheet.create({ container: {
12196
+ const styles$7 = react_native.StyleSheet.create({ container: {
11462
12197
  justifyContent: "center",
11463
12198
  alignItems: "center"
11464
12199
  } });
11465
12200
 
12201
+ //#endregion
12202
+ //#region src/components/data-display/Skeleton.tsx
12203
+ const PULSE_ANIMATION = {
12204
+ duration: 1e3,
12205
+ useNativeDriver: true
12206
+ };
12207
+ const SKELEON_COLORS = {
12208
+ light: "#E5E7EB",
12209
+ dark: "#D1D5DB"
12210
+ };
12211
+ const Skeleton = react.default.forwardRef(({ children, loading = true, style, textStyle, width, height, accessibilityLabel = "Loading", testID }, ref) => {
12212
+ const pulseAnim = (0, react.useRef)(new react_native.Animated.Value(0)).current;
12213
+ (0, react.useEffect)(() => {
12214
+ const animation = react_native.Animated.loop(react_native.Animated.sequence([react_native.Animated.timing(pulseAnim, {
12215
+ toValue: 1,
12216
+ ...PULSE_ANIMATION
12217
+ }), react_native.Animated.timing(pulseAnim, {
12218
+ toValue: 0,
12219
+ ...PULSE_ANIMATION
12220
+ })]));
12221
+ animation.start();
12222
+ return () => {
12223
+ animation.stop();
12224
+ };
12225
+ }, [pulseAnim]);
12226
+ const pulseStyle = { backgroundColor: pulseAnim.interpolate({
12227
+ inputRange: [0, 1],
12228
+ outputRange: [SKELEON_COLORS.light, SKELEON_COLORS.dark]
12229
+ }) };
12230
+ if (!loading) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children });
12231
+ if (!react.default.isValidElement(children) && typeof children === "string") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Animated.Text, {
12232
+ ref,
12233
+ style: [
12234
+ textStyle,
12235
+ pulseStyle,
12236
+ width !== void 0 ? { width } : void 0,
12237
+ height !== void 0 ? { height } : void 0
12238
+ ],
12239
+ accessibilityLabel,
12240
+ accessibilityRole: "progressbar",
12241
+ testID,
12242
+ children
12243
+ });
12244
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.Animated.View, {
12245
+ ref,
12246
+ style: [
12247
+ styles$6.blockContainer,
12248
+ pulseStyle,
12249
+ width !== void 0 ? { width } : void 0,
12250
+ height !== void 0 ? { height } : void 0,
12251
+ style
12252
+ ],
12253
+ accessibilityLabel,
12254
+ accessibilityRole: "progressbar",
12255
+ testID,
12256
+ children: children && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
12257
+ style: styles$6.hiddenChildren,
12258
+ pointerEvents: "none",
12259
+ children
12260
+ })
12261
+ });
12262
+ });
12263
+ Skeleton.displayName = "Skeleton";
12264
+ const styles$6 = react_native.StyleSheet.create({
12265
+ inlineText: {
12266
+ color: "transparent",
12267
+ fontSize: 14,
12268
+ lineHeight: 20,
12269
+ overflow: "hidden"
12270
+ },
12271
+ blockContainer: {
12272
+ minHeight: 20,
12273
+ overflow: "hidden"
12274
+ },
12275
+ hiddenChildren: { opacity: 0 }
12276
+ });
12277
+
11466
12278
  //#endregion
11467
12279
  //#region src/components/data-display/Table.tsx
11468
- const Table = ({ columns, data, style, scrollable = true }) => {
12280
+ const TableContext = (0, react.createContext)(null);
12281
+ const useTableContext = () => {
12282
+ const context = (0, react.useContext)(TableContext);
12283
+ if (!context) throw new Error("Table sub-components must be used within Table.Root");
12284
+ return context;
12285
+ };
12286
+ const TableRoot = react.default.forwardRef(({ children, size = "2", scrollable = true, style }, ref) => {
11469
12287
  const theme = useTheme$1();
11470
- useThemeMode$1() === "dark" ? theme.colors.gray.dark : theme.colors.gray;
11471
- getGrayAlpha(theme);
12288
+ const mode = useThemeMode$1();
12289
+ const isDark = mode === "dark";
12290
+ const grayAlpha = getGrayAlpha(theme, mode);
11472
12291
  const tableStyle = {
11473
12292
  borderRadius: theme.radii.medium,
11474
- overflow: "hidden"
12293
+ overflow: "hidden",
12294
+ backgroundColor: isDark ? grayAlpha["2"] : grayAlpha["1"]
12295
+ };
12296
+ const contextValue = {
12297
+ size,
12298
+ isRoot: true
11475
12299
  };
11476
- const TableContent = () => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(RnView, {
11477
- style: [styles$5.table, tableStyle],
11478
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Thead, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Tr, {
11479
- isHeader: true,
11480
- children: columns.map((column) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Th, {
11481
- width: column.width,
11482
- align: column.align,
11483
- children: column.title
11484
- }, column.key))
11485
- }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Tbody, { children: data.map((row, rowIndex) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Tr, { children: columns.map((column) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Td, {
11486
- align: column.align,
11487
- children: column.render ? column.render(row, rowIndex) : String(row[column.key] ?? "")
11488
- }, column.key)) }, rowIndex)) })]
11489
- });
11490
- if (scrollable) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnScrollView, {
12300
+ const content = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TableContext.Provider, {
12301
+ value: contextValue,
12302
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
12303
+ ref,
12304
+ style: [
12305
+ styles$5.root,
12306
+ tableStyle,
12307
+ style
12308
+ ],
12309
+ children
12310
+ })
12311
+ });
12312
+ if (scrollable) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.ScrollView, {
11491
12313
  horizontal: true,
11492
- style: [styles$5.scrollContainer, style],
11493
12314
  showsHorizontalScrollIndicator: false,
11494
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TableContent, {})
11495
- });
11496
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
11497
- style: [styles$5.container, style],
11498
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TableContent, {})
12315
+ contentContainerStyle: styles$5.scrollContent,
12316
+ children: content
11499
12317
  });
11500
- };
11501
- Table.displayName = "Table";
11502
- const Thead = ({ children }) => {
11503
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
11504
- style: styles$5.thead,
12318
+ return content;
12319
+ });
12320
+ TableRoot.displayName = "Table.Root";
12321
+ const TableHeader = react.default.forwardRef(({ children, style }, ref) => {
12322
+ const theme = useTheme$1();
12323
+ const mode = useThemeMode$1();
12324
+ const isDark = mode === "dark";
12325
+ const grayAlpha = getGrayAlpha(theme, mode);
12326
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
12327
+ ref,
12328
+ style: [
12329
+ styles$5.header,
12330
+ {
12331
+ backgroundColor: isDark ? grayAlpha["3"] : grayAlpha["2"],
12332
+ borderBottomWidth: 0,
12333
+ borderBottomColor: isDark ? grayAlpha["6"] : grayAlpha["5"]
12334
+ },
12335
+ style
12336
+ ],
11505
12337
  children
11506
12338
  });
11507
- };
11508
- const Tbody = ({ children }) => {
11509
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
11510
- style: styles$5.tbody,
12339
+ });
12340
+ TableHeader.displayName = "Table.Header";
12341
+ const TableBody = react.default.forwardRef(({ children, style }, ref) => {
12342
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
12343
+ ref,
12344
+ style: [styles$5.body, style],
11511
12345
  children
11512
12346
  });
11513
- };
11514
- const Tr = ({ children, isHeader = false }) => {
12347
+ });
12348
+ TableBody.displayName = "Table.Body";
12349
+ const TableRow = react.default.forwardRef(({ children, style }, ref) => {
11515
12350
  const theme = useTheme$1();
11516
- const isDark = useThemeMode$1() === "dark";
11517
- isDark ? theme.colors.gray.dark : theme.colors.gray;
11518
- const grayAlpha = getGrayAlpha(theme);
11519
- const headerBackground = isDark ? grayAlpha["3"] : grayAlpha["2"];
11520
- const borderColor = isDark ? grayAlpha["6"] : grayAlpha["5"];
11521
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
12351
+ const mode = useThemeMode$1();
12352
+ const isDark = mode === "dark";
12353
+ const grayAlpha = getGrayAlpha(theme, mode);
12354
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
12355
+ ref,
11522
12356
  style: [
11523
- styles$5.tr,
11524
- isHeader && {
11525
- backgroundColor: headerBackground,
12357
+ styles$5.row,
12358
+ {
12359
+ flex: 1,
11526
12360
  borderBottomWidth: 1,
11527
- borderBottomColor: borderColor
12361
+ borderBottomColor: isDark ? grayAlpha["6"] : grayAlpha["5"]
11528
12362
  },
11529
- !isHeader && {
11530
- borderBottomWidth: 1,
11531
- borderBottomColor: borderColor
11532
- }
12363
+ style
11533
12364
  ],
11534
12365
  children
11535
12366
  });
11536
- };
11537
- const Th = ({ children, width, align = "left" }) => {
12367
+ });
12368
+ TableRow.displayName = "Table.Row";
12369
+ const TableColumnHeaderCell = react.default.forwardRef(({ children, width, align = "left", style }, ref) => {
12370
+ const context = useTableContext();
11538
12371
  const theme = useTheme$1();
11539
12372
  const grayScale = useThemeMode$1() === "dark" ? theme.colors.gray.dark : theme.colors.gray;
11540
- const thStyle = { width };
11541
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
12373
+ const getSizePadding = () => {
12374
+ switch (context.size) {
12375
+ case "1": return {
12376
+ paddingVertical: theme.space[2],
12377
+ paddingHorizontal: theme.space[3]
12378
+ };
12379
+ case "3": return {
12380
+ paddingVertical: theme.space[4],
12381
+ paddingHorizontal: theme.space[5]
12382
+ };
12383
+ default: return {
12384
+ paddingVertical: theme.space[3],
12385
+ paddingHorizontal: theme.space[4]
12386
+ };
12387
+ }
12388
+ };
12389
+ const getSizeFont = () => {
12390
+ switch (context.size) {
12391
+ case "1": return { fontSize: theme.typography.fontSizes[1].fontSize };
12392
+ case "3": return { fontSize: theme.typography.fontSizes[3].fontSize };
12393
+ default: return { fontSize: theme.typography.fontSizes[2].fontSize };
12394
+ }
12395
+ };
12396
+ const padding = getSizePadding();
12397
+ const fontSize = getSizeFont();
12398
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
12399
+ ref,
11542
12400
  style: [
11543
- styles$5.th,
11544
- thStyle,
11545
- justifyContentMap[align]
12401
+ styles$5.cell,
12402
+ {
12403
+ width,
12404
+ alignItems: {
12405
+ left: "flex-start",
12406
+ center: "center",
12407
+ right: "flex-end"
12408
+ }[align],
12409
+ ...padding
12410
+ },
12411
+ style
11546
12412
  ],
11547
12413
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
11548
12414
  style: {
11549
12415
  color: grayScale[12],
11550
12416
  fontWeight: "600",
11551
- fontSize: theme.typography.fontSizes[1].fontSize
12417
+ ...fontSize
11552
12418
  },
11553
12419
  children
11554
12420
  })
11555
12421
  });
11556
- };
11557
- const Td = ({ children, align = "left" }) => {
12422
+ });
12423
+ TableColumnHeaderCell.displayName = "Table.ColumnHeaderCell";
12424
+ const TableCell = react.default.forwardRef(({ children, align = "left", style }, ref) => {
12425
+ const context = useTableContext();
11558
12426
  const theme = useTheme$1();
11559
12427
  const grayScale = useThemeMode$1() === "dark" ? theme.colors.gray.dark : theme.colors.gray;
11560
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RnView, {
11561
- style: [styles$5.td, justifyContentMap[align]],
12428
+ const getSizePadding = () => {
12429
+ switch (context.size) {
12430
+ case "1": return {
12431
+ paddingVertical: theme.space[2],
12432
+ paddingHorizontal: theme.space[3]
12433
+ };
12434
+ case "3": return {
12435
+ paddingVertical: theme.space[4],
12436
+ paddingHorizontal: theme.space[5]
12437
+ };
12438
+ default: return {
12439
+ paddingVertical: theme.space[3],
12440
+ paddingHorizontal: theme.space[4]
12441
+ };
12442
+ }
12443
+ };
12444
+ const getSizeFont = () => {
12445
+ switch (context.size) {
12446
+ case "1": return { fontSize: theme.typography.fontSizes[1].fontSize };
12447
+ case "3": return { fontSize: theme.typography.fontSizes[3].fontSize };
12448
+ default: return { fontSize: theme.typography.fontSizes[2].fontSize };
12449
+ }
12450
+ };
12451
+ const padding = getSizePadding();
12452
+ const fontSize = getSizeFont();
12453
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
12454
+ ref,
12455
+ style: [
12456
+ styles$5.cell,
12457
+ {
12458
+ alignItems: {
12459
+ left: "flex-start",
12460
+ center: "center",
12461
+ right: "flex-end"
12462
+ }[align],
12463
+ ...padding
12464
+ },
12465
+ style
12466
+ ],
11562
12467
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
11563
12468
  style: {
11564
12469
  color: grayScale[11],
11565
- fontSize: theme.typography.fontSizes[1].fontSize
12470
+ ...fontSize
11566
12471
  },
11567
12472
  children
11568
12473
  })
11569
12474
  });
11570
- };
11571
- const justifyContentMap = {
11572
- left: { justifyContent: "flex-start" },
11573
- center: { justifyContent: "center" },
11574
- right: { justifyContent: "flex-end" }
11575
- };
11576
- Table.Thead = Thead;
11577
- Table.Tbody = Tbody;
11578
- Table.Tr = Tr;
11579
- Table.Th = Th;
11580
- Table.Td = Td;
12475
+ });
12476
+ TableCell.displayName = "Table.Cell";
11581
12477
  const styles$5 = react_native.StyleSheet.create({
11582
- container: { width: "100%" },
11583
- scrollContainer: { flex: 1 },
11584
- table: { minWidth: "100%" },
11585
- thead: { flexDirection: "row" },
11586
- tbody: { flexDirection: "column" },
11587
- tr: {
12478
+ scrollContent: { flexGrow: 1 },
12479
+ root: { minWidth: "100%" },
12480
+ header: {
11588
12481
  flexDirection: "row",
11589
- minHeight: 44,
11590
- alignItems: "center",
11591
- borderBottomWidth: 1,
11592
- borderBottomColor: "transparent"
11593
- },
11594
- th: {
11595
- padding: 12,
11596
12482
  minHeight: 44
11597
12483
  },
11598
- td: {
11599
- padding: 12,
12484
+ body: { flexDirection: "column" },
12485
+ row: {
12486
+ flexDirection: "row",
11600
12487
  minHeight: 44
12488
+ },
12489
+ cell: {
12490
+ flex: 1,
12491
+ minWidth: 80
11601
12492
  }
11602
12493
  });
12494
+ const Table = {
12495
+ Root: TableRoot,
12496
+ Header: TableHeader,
12497
+ Body: TableBody,
12498
+ Row: TableRow,
12499
+ ColumnHeaderCell: TableColumnHeaderCell,
12500
+ Cell: TableCell
12501
+ };
11603
12502
 
11604
12503
  //#endregion
11605
12504
  //#region src/components/navigation/SegmentedControl.tsx
@@ -11609,19 +12508,57 @@ function useSegmentedControlContext() {
11609
12508
  if (!context) throw new Error("SegmentedControl.Item must be used within SegmentedControl.Root");
11610
12509
  return context;
11611
12510
  }
12511
+ const SegmentedControlValue = ({ children }) => {
12512
+ const { value: selectedValue, color, isDark, grayScale, activeColor, solidVariantColors, softVariantColors, sizeValues, theme, itemValue, isItemSelected, itemDisabled } = useSegmentedControlContext();
12513
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
12514
+ style: {
12515
+ color: itemDisabled ? grayScale["9"] : color ? isItemSelected ? solidVariantColors.textColor : softVariantColors.textColor : isItemSelected ? grayScale[12] : grayScale[10],
12516
+ fontWeight: isItemSelected ? theme.typography.fontWeights.semibold : theme.typography.fontWeights.regular,
12517
+ fontSize: sizeValues.fontSize
12518
+ },
12519
+ children
12520
+ });
12521
+ };
12522
+ SegmentedControlValue.displayName = "SegmentedControlValue";
12523
+ const SegmentedControlIcon = ({ children }) => {
12524
+ const { color, isDark, grayScale, activeColor, solidVariantColors, softVariantColors, sizeValues, itemValue, isItemSelected, itemDisabled } = useSegmentedControlContext();
12525
+ const iconColor = itemDisabled ? grayScale["9"] : color ? isItemSelected ? solidVariantColors.textColor : softVariantColors.textColor : isItemSelected ? grayScale[12] : grayScale[10];
12526
+ const iconSize = sizeValues.fontSize;
12527
+ return react.default.cloneElement(children, {
12528
+ ...children.props,
12529
+ color: iconColor,
12530
+ size: children.props.size ?? iconSize
12531
+ });
12532
+ };
12533
+ SegmentedControlIcon.displayName = "SegmentedControlIcon";
12534
+ const SegmentedControlItemContext = (0, react.createContext)(null);
11612
12535
  const SegmentedControlItem = ({ value, disabled: itemDisabled, children }) => {
11613
- const { value: selectedValue, onValueChange, disabled, sizeValues, isDark, grayScale, grayAlpha, activeColor, radii, selectedRadius, softVariantColors, solidVariantColors, color, onItemLayout, theme, pillBackgroundColor, hapticFeedback } = useSegmentedControlContext();
12536
+ const { value: selectedValue, onValueChange, disabled, sizeValues, isDark, grayScale, grayAlpha, activeColor, radii, selectedRadius, softVariantColors, solidVariantColors, color, onItemLayout, theme, pillBackgroundColor, hapticFeedback, globalHaptics } = useSegmentedControlContext();
11614
12537
  const isSelected = value === selectedValue;
11615
12538
  const isDisabled = disabled || itemDisabled;
12539
+ const hasValueChild = (0, react.isValidElement)(children) && children.type?.displayName === "SegmentedControlValue";
12540
+ const hasIconChild = (0, react.isValidElement)(children) && children.type?.displayName === "SegmentedControlIcon";
12541
+ const itemContextValue = {
12542
+ itemValue: value,
12543
+ isSelected,
12544
+ isDisabled
12545
+ };
12546
+ const mergedContext = {
12547
+ ...useSegmentedControlContext(),
12548
+ itemValue: value,
12549
+ isItemSelected: isSelected,
12550
+ itemDisabled: isDisabled
12551
+ };
11616
12552
  const handlePress = (0, react.useCallback)(() => {
11617
12553
  if (!isDisabled) {
11618
12554
  onValueChange(value);
11619
- if (hapticFeedback) react_native.Vibration.vibrate(10);
12555
+ if (globalHaptics && hapticFeedback) triggerHaptic("press");
11620
12556
  }
11621
12557
  }, [
11622
12558
  isDisabled,
11623
12559
  onValueChange,
11624
12560
  value,
12561
+ globalHaptics,
11625
12562
  hapticFeedback
11626
12563
  ]);
11627
12564
  const handleLayout = (0, react.useCallback)((event) => {
@@ -11641,23 +12578,29 @@ const SegmentedControlItem = ({ value, disabled: itemDisabled, children }) => {
11641
12578
  fontWeight: isSelected ? theme.typography.fontWeights.semibold : theme.typography.fontWeights.regular,
11642
12579
  fontSize: sizeValues.fontSize
11643
12580
  };
11644
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedPressable_default, {
11645
- style: optionStyle,
11646
- onPress: handlePress,
11647
- onLayout: handleLayout,
11648
- disabled: isDisabled,
11649
- accessibilityRole: "radio",
11650
- accessibilityState: {
11651
- checked: isSelected,
11652
- disabled: isDisabled
11653
- },
11654
- pressedScale: .975,
11655
- pressedOpacity: .9,
11656
- animationDuration: 100,
11657
- hapticFeedback: false,
11658
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
11659
- style: textStyle,
11660
- children
12581
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SegmentedControlItemContext.Provider, {
12582
+ value: itemContextValue,
12583
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SegmentedControlContext.Provider, {
12584
+ value: mergedContext,
12585
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedPressable, {
12586
+ style: optionStyle,
12587
+ onPress: handlePress,
12588
+ onLayout: handleLayout,
12589
+ disabled: isDisabled,
12590
+ accessibilityRole: "radio",
12591
+ accessibilityState: {
12592
+ checked: isSelected,
12593
+ disabled: isDisabled
12594
+ },
12595
+ pressedScale: .975,
12596
+ pressedOpacity: .9,
12597
+ animationDuration: 100,
12598
+ hapticFeedback: false,
12599
+ children: hasValueChild || hasIconChild ? children : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TextComponent, {
12600
+ style: textStyle,
12601
+ children
12602
+ })
12603
+ })
11661
12604
  })
11662
12605
  });
11663
12606
  };
@@ -11665,6 +12608,7 @@ SegmentedControlItem.displayName = "SegmentedControlItem";
11665
12608
  const SegmentedControlRoot = ({ defaultValue, value: controlledValue, onValueChange, disabled = false, color, radius, size = 3, style, highContrast = false, children, hapticFeedback = true }) => {
11666
12609
  const theme = useTheme$1();
11667
12610
  const mode = useThemeMode$1();
12611
+ const globalHaptics = useHaptics$1();
11668
12612
  const isDark = mode === "dark";
11669
12613
  const grayScale = isDark ? theme.colors.gray.dark : theme.colors.gray;
11670
12614
  const grayAlpha = getGrayAlpha(theme);
@@ -11761,7 +12705,11 @@ const SegmentedControlRoot = ({ defaultValue, value: controlledValue, onValueCha
11761
12705
  onItemLayout: handleItemLayout,
11762
12706
  theme,
11763
12707
  pillBackgroundColor,
11764
- hapticFeedback
12708
+ hapticFeedback,
12709
+ globalHaptics,
12710
+ itemValue: null,
12711
+ isItemSelected: false,
12712
+ itemDisabled: false
11765
12713
  };
11766
12714
  const pillWidth = itemLayouts[currentValue]?.width || 0;
11767
12715
  const pillInnerRadius = selectedRadius === "full" ? 9999 : radii;
@@ -11790,7 +12738,9 @@ const SegmentedControlRoot = ({ defaultValue, value: controlledValue, onValueCha
11790
12738
  SegmentedControlRoot.displayName = "SegmentedControlRoot";
11791
12739
  const SegmentedControl = {
11792
12740
  Item: SegmentedControlItem,
11793
- Root: SegmentedControlRoot
12741
+ Root: SegmentedControlRoot,
12742
+ Value: SegmentedControlValue,
12743
+ Icon: SegmentedControlIcon
11794
12744
  };
11795
12745
  const styles$4 = react_native.StyleSheet.create({
11796
12746
  container: {
@@ -12149,6 +13099,7 @@ const AccordionTrigger = react.default.forwardRef(({ children, style, icon, hapt
12149
13099
  const itemContext = useAccordionItemContext();
12150
13100
  const theme = useTheme$1();
12151
13101
  const mode = useThemeMode$1();
13102
+ const globalHaptics = useHaptics$1();
12152
13103
  const { value, open, disabled } = itemContext;
12153
13104
  const { size, dir, collapsible, type, onValueChange } = accordionContext;
12154
13105
  const grayAlpha = getGrayAlpha(theme, mode);
@@ -12196,7 +13147,7 @@ const AccordionTrigger = react.default.forwardRef(({ children, style, icon, hapt
12196
13147
  if (open) onValueChange(currentValue.filter((v) => v !== value));
12197
13148
  else onValueChange([...currentValue, value]);
12198
13149
  }
12199
- if (hapticFeedback) react_native.Vibration.vibrate(10);
13150
+ if (globalHaptics && hapticFeedback) triggerHaptic("selection");
12200
13151
  };
12201
13152
  const rtlRotationInterpolate = rotationAnim.interpolate({
12202
13153
  inputRange: [0, 1],
@@ -12216,7 +13167,7 @@ const AccordionTrigger = react.default.forwardRef(({ children, style, icon, hapt
12216
13167
  const getIconColor = () => {
12217
13168
  return grayAlpha["11"];
12218
13169
  };
12219
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(AnimatedPressable_default, {
13170
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(AnimatedPressable, {
12220
13171
  ref,
12221
13172
  style: [triggerStyle, style],
12222
13173
  onPress: handlePress,
@@ -12254,7 +13205,7 @@ const AccordionTrigger = react.default.forwardRef(({ children, style, icon, hapt
12254
13205
  transform: [{ rotate: rtlRotationInterpolate }],
12255
13206
  marginLeft: theme.space[2]
12256
13207
  },
12257
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChevronDownIcon$1, {
13208
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChevronDownIcon, {
12258
13209
  width: sizeStyles.iconSize,
12259
13210
  height: sizeStyles.iconSize,
12260
13211
  color: getIconColor()
@@ -12486,6 +13437,8 @@ exports.SelectSeparator = SelectSeparator;
12486
13437
  exports.SelectTrigger = SelectTrigger;
12487
13438
  exports.SelectValue = SelectValue;
12488
13439
  exports.Separator = Separator;
13440
+ exports.Sidebar = Sidebar;
13441
+ exports.Skeleton = Skeleton;
12489
13442
  exports.Slider = Slider;
12490
13443
  exports.Slot = Slot;
12491
13444
  exports.Spacer = Spacer;
@@ -12612,6 +13565,7 @@ exports.tomatoAlpha = tomatoAlpha;
12612
13565
  exports.typography = typography;
12613
13566
  exports.useAnchorPosition = useAnchorPosition;
12614
13567
  exports.useDeviceColorScheme = useDeviceColorScheme;
13568
+ exports.useHaptics = useHaptics;
12615
13569
  exports.usePortal = usePortal;
12616
13570
  exports.useResponsive = useResponsive;
12617
13571
  exports.useTheme = useTheme;