@webority-technologies/mobile 0.0.22 → 0.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/lib/commonjs/components/Accordion/Accordion.js +4 -2
  2. package/lib/commonjs/components/Avatar/Avatar.js +4 -2
  3. package/lib/commonjs/components/Badge/Badge.js +5 -5
  4. package/lib/commonjs/components/Banner/Banner.js +8 -4
  5. package/lib/commonjs/components/BottomNavigation/BottomNavigation.js +6 -4
  6. package/lib/commonjs/components/BottomSheet/BottomSheet.js +8 -9
  7. package/lib/commonjs/components/Box/Box.js +162 -0
  8. package/lib/commonjs/components/Box/index.js +37 -0
  9. package/lib/commonjs/components/Button/Button.js +7 -7
  10. package/lib/commonjs/components/Carousel/Carousel.js +4 -2
  11. package/lib/commonjs/components/Checkbox/Checkbox.js +14 -5
  12. package/lib/commonjs/components/DatePicker/DatePicker.js +9 -7
  13. package/lib/commonjs/components/DateRangePicker/DateRangePicker.js +5 -2
  14. package/lib/commonjs/components/Dialog/Dialog.js +2 -2
  15. package/lib/commonjs/components/FieldBase/FieldBase.js +8 -4
  16. package/lib/commonjs/components/FloatingActionButton/FloatingActionButton.js +13 -5
  17. package/lib/commonjs/components/FormField/FormField.js +61 -25
  18. package/lib/commonjs/components/Input/Input.js +41 -29
  19. package/lib/commonjs/components/KeyboardAwareScrollView/KeyboardAwareScrollView.js +102 -0
  20. package/lib/commonjs/components/KeyboardAwareScrollView/index.js +13 -0
  21. package/lib/commonjs/components/KeyboardToolbar/KeyboardToolbar.js +130 -0
  22. package/lib/commonjs/components/KeyboardToolbar/index.js +13 -0
  23. package/lib/commonjs/components/Modal/Modal.js +17 -6
  24. package/lib/commonjs/components/NumberInput/NumberInput.js +35 -28
  25. package/lib/commonjs/components/OTPInput/OTPInput.js +33 -18
  26. package/lib/commonjs/components/Radio/Radio.js +7 -5
  27. package/lib/commonjs/components/Radio/RadioGroup.js +10 -3
  28. package/lib/commonjs/components/SearchBar/SearchBar.js +4 -2
  29. package/lib/commonjs/components/SegmentedControl/SegmentedControl.js +20 -10
  30. package/lib/commonjs/components/Select/Select.js +33 -32
  31. package/lib/commonjs/components/Skeleton/SkeletonContent.js +5 -2
  32. package/lib/commonjs/components/Slider/Slider.js +42 -26
  33. package/lib/commonjs/components/Spinner/Spinner.js +5 -5
  34. package/lib/commonjs/components/Switch/Switch.js +29 -16
  35. package/lib/commonjs/components/Tabs/Tabs.js +4 -2
  36. package/lib/commonjs/components/Text/Text.js +142 -0
  37. package/lib/commonjs/components/Text/index.js +13 -0
  38. package/lib/commonjs/components/TimePicker/TimePicker.js +10 -7
  39. package/lib/commonjs/components/Toast/Toast.js +22 -10
  40. package/lib/commonjs/components/Tooltip/Tooltip.js +6 -2
  41. package/lib/commonjs/components/index.js +135 -89
  42. package/lib/commonjs/form/FormContext.js +40 -0
  43. package/lib/commonjs/form/index.js +68 -0
  44. package/lib/commonjs/form/path.js +79 -0
  45. package/lib/commonjs/form/rules.js +67 -0
  46. package/lib/commonjs/form/types.js +2 -0
  47. package/lib/commonjs/form/useField.js +54 -0
  48. package/lib/commonjs/form/useForm.js +316 -0
  49. package/lib/commonjs/hooks/index.js +14 -0
  50. package/lib/commonjs/hooks/useControllableState.js +30 -0
  51. package/lib/commonjs/hooks/useReducedMotion.js +31 -0
  52. package/lib/commonjs/index.js +96 -11
  53. package/lib/commonjs/theme/ThemeContext.js +30 -2
  54. package/lib/commonjs/theme/tokens.js +12 -0
  55. package/lib/module/components/Accordion/Accordion.js +4 -2
  56. package/lib/module/components/Avatar/Avatar.js +4 -2
  57. package/lib/module/components/Badge/Badge.js +5 -5
  58. package/lib/module/components/Banner/Banner.js +8 -4
  59. package/lib/module/components/BottomNavigation/BottomNavigation.js +6 -4
  60. package/lib/module/components/BottomSheet/BottomSheet.js +8 -9
  61. package/lib/module/components/Box/Box.js +156 -0
  62. package/lib/module/components/Box/index.js +4 -0
  63. package/lib/module/components/Button/Button.js +7 -7
  64. package/lib/module/components/Carousel/Carousel.js +4 -2
  65. package/lib/module/components/Checkbox/Checkbox.js +14 -5
  66. package/lib/module/components/DatePicker/DatePicker.js +9 -7
  67. package/lib/module/components/DateRangePicker/DateRangePicker.js +5 -2
  68. package/lib/module/components/Dialog/Dialog.js +2 -2
  69. package/lib/module/components/FieldBase/FieldBase.js +8 -4
  70. package/lib/module/components/FloatingActionButton/FloatingActionButton.js +13 -5
  71. package/lib/module/components/FormField/FormField.js +62 -26
  72. package/lib/module/components/Input/Input.js +41 -29
  73. package/lib/module/components/KeyboardAwareScrollView/KeyboardAwareScrollView.js +98 -0
  74. package/lib/module/components/KeyboardAwareScrollView/index.js +4 -0
  75. package/lib/module/components/KeyboardToolbar/KeyboardToolbar.js +125 -0
  76. package/lib/module/components/KeyboardToolbar/index.js +4 -0
  77. package/lib/module/components/Modal/Modal.js +17 -6
  78. package/lib/module/components/NumberInput/NumberInput.js +30 -23
  79. package/lib/module/components/OTPInput/OTPInput.js +30 -15
  80. package/lib/module/components/Radio/Radio.js +7 -5
  81. package/lib/module/components/Radio/RadioGroup.js +10 -3
  82. package/lib/module/components/SearchBar/SearchBar.js +4 -2
  83. package/lib/module/components/SegmentedControl/SegmentedControl.js +20 -10
  84. package/lib/module/components/Select/Select.js +33 -32
  85. package/lib/module/components/Skeleton/SkeletonContent.js +5 -2
  86. package/lib/module/components/Slider/Slider.js +42 -26
  87. package/lib/module/components/Spinner/Spinner.js +5 -5
  88. package/lib/module/components/Switch/Switch.js +29 -16
  89. package/lib/module/components/Tabs/Tabs.js +4 -2
  90. package/lib/module/components/Text/Text.js +138 -0
  91. package/lib/module/components/Text/index.js +4 -0
  92. package/lib/module/components/TimePicker/TimePicker.js +10 -7
  93. package/lib/module/components/Toast/Toast.js +22 -10
  94. package/lib/module/components/Tooltip/Tooltip.js +6 -2
  95. package/lib/module/components/index.js +4 -0
  96. package/lib/module/form/FormContext.js +32 -0
  97. package/lib/module/form/index.js +12 -0
  98. package/lib/module/form/path.js +72 -0
  99. package/lib/module/form/rules.js +52 -0
  100. package/lib/module/form/types.js +2 -0
  101. package/lib/module/form/useField.js +49 -0
  102. package/lib/module/form/useForm.js +312 -0
  103. package/lib/module/hooks/index.js +2 -0
  104. package/lib/module/hooks/useControllableState.js +26 -0
  105. package/lib/module/hooks/useReducedMotion.js +27 -0
  106. package/lib/module/index.js +3 -1
  107. package/lib/module/theme/ThemeContext.js +30 -2
  108. package/lib/module/theme/tokens.js +12 -0
  109. package/lib/typescript/commonjs/components/BottomNavigation/BottomNavigation.d.ts +1 -1
  110. package/lib/typescript/commonjs/components/Box/Box.d.ts +60 -0
  111. package/lib/typescript/commonjs/components/Box/index.d.ts +3 -0
  112. package/lib/typescript/commonjs/components/Button/Button.d.ts +1 -1
  113. package/lib/typescript/commonjs/components/Checkbox/Checkbox.d.ts +3 -2
  114. package/lib/typescript/commonjs/components/DatePicker/DatePicker.d.ts +3 -3
  115. package/lib/typescript/commonjs/components/Dialog/Dialog.d.ts +2 -2
  116. package/lib/typescript/commonjs/components/FormField/FormField.d.ts +13 -2
  117. package/lib/typescript/commonjs/components/KeyboardAwareScrollView/KeyboardAwareScrollView.d.ts +20 -0
  118. package/lib/typescript/commonjs/components/KeyboardAwareScrollView/index.d.ts +3 -0
  119. package/lib/typescript/commonjs/components/KeyboardToolbar/KeyboardToolbar.d.ts +29 -0
  120. package/lib/typescript/commonjs/components/KeyboardToolbar/index.d.ts +3 -0
  121. package/lib/typescript/commonjs/components/NumberInput/NumberInput.d.ts +3 -2
  122. package/lib/typescript/commonjs/components/OTPInput/OTPInput.d.ts +3 -2
  123. package/lib/typescript/commonjs/components/Radio/Radio.d.ts +2 -2
  124. package/lib/typescript/commonjs/components/Radio/RadioGroup.d.ts +3 -2
  125. package/lib/typescript/commonjs/components/SegmentedControl/SegmentedControl.d.ts +3 -2
  126. package/lib/typescript/commonjs/components/Slider/Slider.d.ts +6 -4
  127. package/lib/typescript/commonjs/components/Spinner/Spinner.d.ts +1 -1
  128. package/lib/typescript/commonjs/components/Switch/Switch.d.ts +3 -2
  129. package/lib/typescript/commonjs/components/Text/Text.d.ts +25 -0
  130. package/lib/typescript/commonjs/components/Text/index.d.ts +3 -0
  131. package/lib/typescript/commonjs/components/TimePicker/TimePicker.d.ts +3 -3
  132. package/lib/typescript/commonjs/components/index.d.ts +8 -0
  133. package/lib/typescript/commonjs/form/FormContext.d.ts +17 -0
  134. package/lib/typescript/commonjs/form/index.d.ts +9 -0
  135. package/lib/typescript/commonjs/form/path.d.ts +10 -0
  136. package/lib/typescript/commonjs/form/rules.d.ts +31 -0
  137. package/lib/typescript/commonjs/form/types.d.ts +94 -0
  138. package/lib/typescript/commonjs/form/useField.d.ts +27 -0
  139. package/lib/typescript/commonjs/form/useForm.d.ts +10 -0
  140. package/lib/typescript/commonjs/hooks/index.d.ts +3 -0
  141. package/lib/typescript/commonjs/hooks/useControllableState.d.ts +17 -0
  142. package/lib/typescript/commonjs/hooks/useReducedMotion.d.ts +8 -0
  143. package/lib/typescript/commonjs/index.d.ts +4 -2
  144. package/lib/typescript/commonjs/theme/types.d.ts +15 -0
  145. package/lib/typescript/module/components/BottomNavigation/BottomNavigation.d.ts +1 -1
  146. package/lib/typescript/module/components/Box/Box.d.ts +60 -0
  147. package/lib/typescript/module/components/Box/index.d.ts +3 -0
  148. package/lib/typescript/module/components/Button/Button.d.ts +1 -1
  149. package/lib/typescript/module/components/Checkbox/Checkbox.d.ts +3 -2
  150. package/lib/typescript/module/components/DatePicker/DatePicker.d.ts +3 -3
  151. package/lib/typescript/module/components/Dialog/Dialog.d.ts +2 -2
  152. package/lib/typescript/module/components/FormField/FormField.d.ts +13 -2
  153. package/lib/typescript/module/components/KeyboardAwareScrollView/KeyboardAwareScrollView.d.ts +20 -0
  154. package/lib/typescript/module/components/KeyboardAwareScrollView/index.d.ts +3 -0
  155. package/lib/typescript/module/components/KeyboardToolbar/KeyboardToolbar.d.ts +29 -0
  156. package/lib/typescript/module/components/KeyboardToolbar/index.d.ts +3 -0
  157. package/lib/typescript/module/components/NumberInput/NumberInput.d.ts +3 -2
  158. package/lib/typescript/module/components/OTPInput/OTPInput.d.ts +3 -2
  159. package/lib/typescript/module/components/Radio/Radio.d.ts +2 -2
  160. package/lib/typescript/module/components/Radio/RadioGroup.d.ts +3 -2
  161. package/lib/typescript/module/components/SegmentedControl/SegmentedControl.d.ts +3 -2
  162. package/lib/typescript/module/components/Slider/Slider.d.ts +6 -4
  163. package/lib/typescript/module/components/Spinner/Spinner.d.ts +1 -1
  164. package/lib/typescript/module/components/Switch/Switch.d.ts +3 -2
  165. package/lib/typescript/module/components/Text/Text.d.ts +25 -0
  166. package/lib/typescript/module/components/Text/index.d.ts +3 -0
  167. package/lib/typescript/module/components/TimePicker/TimePicker.d.ts +3 -3
  168. package/lib/typescript/module/components/index.d.ts +8 -0
  169. package/lib/typescript/module/form/FormContext.d.ts +17 -0
  170. package/lib/typescript/module/form/index.d.ts +9 -0
  171. package/lib/typescript/module/form/path.d.ts +10 -0
  172. package/lib/typescript/module/form/rules.d.ts +31 -0
  173. package/lib/typescript/module/form/types.d.ts +94 -0
  174. package/lib/typescript/module/form/useField.d.ts +27 -0
  175. package/lib/typescript/module/form/useForm.d.ts +10 -0
  176. package/lib/typescript/module/hooks/index.d.ts +3 -0
  177. package/lib/typescript/module/hooks/useControllableState.d.ts +17 -0
  178. package/lib/typescript/module/hooks/useReducedMotion.d.ts +8 -0
  179. package/lib/typescript/module/index.d.ts +4 -2
  180. package/lib/typescript/module/theme/types.d.ts +15 -0
  181. package/package.json +1 -1
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ import { useEffect, useState } from 'react';
4
+ import { AccessibilityInfo } from 'react-native';
5
+
6
+ /**
7
+ * Tracks the OS "Reduce Motion" accessibility setting. The library's
8
+ * ThemeProvider uses this to collapse `theme.motion` (durations → 0, springs →
9
+ * near-instant) so animations don't trigger vestibular discomfort; consumers
10
+ * can also read it directly to swap an animated path for a static one.
11
+ */
12
+ export const useReducedMotion = () => {
13
+ const [reduced, setReduced] = useState(false);
14
+ useEffect(() => {
15
+ let mounted = true;
16
+ AccessibilityInfo.isReduceMotionEnabled().then(value => {
17
+ if (mounted) setReduced(value);
18
+ });
19
+ const sub = AccessibilityInfo.addEventListener('reduceMotionChanged', value => setReduced(value));
20
+ return () => {
21
+ mounted = false;
22
+ sub.remove();
23
+ };
24
+ }, []);
25
+ return reduced;
26
+ };
27
+ //# sourceMappingURL=useReducedMotion.js.map
@@ -21,13 +21,15 @@ export { VersionCheck, useVersionCheck } from "./versionCheck/index.js";
21
21
  // Theme
22
22
  export { ThemeProvider, useTheme, useThemeMode, setTheme, setColorMode, getColorMode, getTheme, resetTheme, subscribeTheme, mergeTheme, lightTheme, darkTheme } from "./theme/index.js";
23
23
  // Hooks
24
- export { useToggle, useDebounce, usePressAnimation } from "./hooks/index.js";
24
+ export { useToggle, useDebounce, usePressAnimation, useReducedMotion, useControllableState } from "./hooks/index.js";
25
25
  // Utils
26
26
  export { ScreenDimensions, Breakpoints, Responsive, isScreenSize, isTablet, Spacing, Padding, Margin, triggerHaptic, setHapticImplementation, shadowStyle, compressImage } from "./utils/index.js";
27
27
  // Formatters
28
28
  export { formatDate, formatTime, formatDateTime, formatRelativeTime, formatPhone, normalizePhone, formatCurrency, formatNumber, formatPercent, formatCompactNumber, getInitials } from "./formatters/index.js";
29
29
  // Validators
30
30
  export { isNonEmpty, isEmail, isIndianMobile, isPhone, isUrl, isNumeric, isInteger, isAlphanumeric, isStrongPassword, isIndianPincode, isPan, isGstin, isAadhaar, isIfsc, isHexColor, isBetween, minLength, maxLength } from "./validators/index.js";
31
+ // Form engine (dependency-free; replaces Formik + Yup)
32
+ export { useForm, useField, useFieldArray, Form, useFormContext, useOptionalFormContext, rules, getPath, setPath, deletePath } from "./form/index.js";
31
33
  // Network
32
34
  export { useNetworkStatus, getNetworkStatus, addNetworkStatusListener, NetworkStatusBanner } from "./network/index.js";
33
35
  // Permissions
@@ -4,7 +4,30 @@ import React, { createContext, useContext, useEffect, useMemo, useState } from '
4
4
  import { Appearance } from 'react-native';
5
5
  import { darkTheme, lightTheme } from "./tokens.js";
6
6
  import { mergeTheme } from "./merge.js";
7
+ import { useReducedMotion } from "../hooks/useReducedMotion.js";
7
8
  import { jsx as _jsx } from "react/jsx-runtime";
9
+ const REDUCED_SPRING = {
10
+ damping: 100,
11
+ stiffness: 1000,
12
+ mass: 1
13
+ };
14
+ // Reduce Motion: collapse timed animations to instant and make springs settle in
15
+ // ~1 frame, so vestibular-sensitive users aren't subjected to slides/scales/bounces.
16
+ const collapseMotion = motion => ({
17
+ ...motion,
18
+ duration: {
19
+ instant: 0,
20
+ fast: 0,
21
+ normal: 0,
22
+ slow: 0,
23
+ slower: 0
24
+ },
25
+ spring: {
26
+ gentle: REDUCED_SPRING,
27
+ bouncy: REDUCED_SPRING,
28
+ snappy: REDUCED_SPRING
29
+ }
30
+ });
8
31
  const defaultValue = {
9
32
  theme: lightTheme,
10
33
  mode: 'light',
@@ -30,11 +53,16 @@ export const ThemeProvider = ({
30
53
  return () => sub.remove();
31
54
  }, []);
32
55
  const mode = preference === 'system' ? systemMode : preference;
56
+ const reduceMotion = useReducedMotion();
33
57
  const theme = useMemo(() => {
34
58
  const base = mode === 'dark' ? darkTheme : lightTheme;
35
59
  const overrides = mode === 'dark' ? darkOverrides : lightOverrides;
36
- return overrides ? mergeTheme(base, overrides) : base;
37
- }, [mode, lightOverrides, darkOverrides]);
60
+ const merged = overrides ? mergeTheme(base, overrides) : base;
61
+ return reduceMotion ? {
62
+ ...merged,
63
+ motion: collapseMotion(merged.motion)
64
+ } : merged;
65
+ }, [mode, lightOverrides, darkOverrides, reduceMotion]);
38
66
  const value = useMemo(() => ({
39
67
  theme,
40
68
  mode,
@@ -521,6 +521,12 @@ export const lightTheme = {
521
521
  warning: '#F59E0B',
522
522
  error: '#E5484D',
523
523
  info: '#3B82F6',
524
+ onPrimary: '#FFFFFF',
525
+ onSecondary: '#0F0F1A',
526
+ onSuccess: '#FFFFFF',
527
+ onWarning: '#0F0F1A',
528
+ onError: '#FFFFFF',
529
+ onInfo: '#FFFFFF',
524
530
  text: {
525
531
  primary: '#0F0F1A',
526
532
  secondary: '#52525B',
@@ -576,6 +582,12 @@ export const darkTheme = {
576
582
  warning: '#FBBF24',
577
583
  error: '#F87171',
578
584
  info: '#60A5FA',
585
+ onPrimary: '#0F0F1A',
586
+ onSecondary: '#FAFAFA',
587
+ onSuccess: '#0F0F1A',
588
+ onWarning: '#0F0F1A',
589
+ onError: '#0F0F1A',
590
+ onInfo: '#0F0F1A',
579
591
  text: {
580
592
  primary: '#FAFAFA',
581
593
  secondary: '#B4B4BB',
@@ -20,7 +20,7 @@ export interface TabConfig {
20
20
  export interface BottomNavigationProps {
21
21
  tabs: TabConfig[];
22
22
  activeTab: string;
23
- onTabPress: (tabKey: string) => void;
23
+ onChange: (tabKey: string) => void;
24
24
  haptic?: HapticType | false;
25
25
  showLabels?: boolean;
26
26
  variant?: BottomNavigationVariant;
@@ -0,0 +1,60 @@
1
+ import React from 'react';
2
+ import { View } from 'react-native';
3
+ import type { StyleProp, ViewProps, ViewStyle } from 'react-native';
4
+ import type { ColorPalette, RadiusScale, SpacingScale, Theme } from '../../theme/types';
5
+ export type SpacingToken = keyof SpacingScale;
6
+ export type RadiusToken = keyof RadiusScale;
7
+ export type BackgroundToken = keyof ColorPalette['background'];
8
+ export interface BoxProps extends ViewProps {
9
+ /** padding (all sides) */
10
+ p?: SpacingToken;
11
+ /** paddingHorizontal */
12
+ px?: SpacingToken;
13
+ /** paddingVertical */
14
+ py?: SpacingToken;
15
+ pt?: SpacingToken;
16
+ pr?: SpacingToken;
17
+ pb?: SpacingToken;
18
+ pl?: SpacingToken;
19
+ /** margin (all sides) */
20
+ m?: SpacingToken;
21
+ mx?: SpacingToken;
22
+ my?: SpacingToken;
23
+ mt?: SpacingToken;
24
+ mr?: SpacingToken;
25
+ mb?: SpacingToken;
26
+ ml?: SpacingToken;
27
+ /** Flexbox gap between children (spacing token). */
28
+ gap?: SpacingToken;
29
+ /** Background — a `colors.background.*` token or a raw colour string. */
30
+ bg?: BackgroundToken | (string & {});
31
+ radius?: RadiusToken;
32
+ /** Draw a hairline border in `colors.border.primary`. */
33
+ border?: boolean;
34
+ flex?: number;
35
+ align?: ViewStyle['alignItems'];
36
+ justify?: ViewStyle['justifyContent'];
37
+ direction?: ViewStyle['flexDirection'];
38
+ wrap?: boolean;
39
+ style?: StyleProp<ViewStyle>;
40
+ }
41
+ type LayoutProps = Omit<BoxProps, 'style' | 'children'>;
42
+ export declare const resolveBoxStyle: (theme: Theme, p: LayoutProps) => ViewStyle;
43
+ declare const Box: React.ForwardRefExoticComponent<BoxProps & React.RefAttributes<View>>;
44
+ export type StackProps = Omit<BoxProps, 'direction'>;
45
+ /** Vertical flex container with token spacing between children (default gap `md`). */
46
+ declare const Stack: React.ForwardRefExoticComponent<StackProps & React.RefAttributes<View>>;
47
+ export type RowProps = Omit<BoxProps, 'direction'>;
48
+ /** Horizontal flex container (default `align="center"`, gap `sm`). */
49
+ declare const Row: React.ForwardRefExoticComponent<RowProps & React.RefAttributes<View>>;
50
+ export interface SpacerProps {
51
+ /** Fixed spacer of this spacing token. Omit for a flexible spacer (`flex: 1`). */
52
+ size?: SpacingToken;
53
+ style?: StyleProp<ViewStyle>;
54
+ testID?: string;
55
+ }
56
+ /** Fixed gap (`size`) or a flexible push (`flex: 1`) between siblings. */
57
+ declare const Spacer: React.FC<SpacerProps>;
58
+ export { Box, Stack, Row, Spacer };
59
+ export default Box;
60
+ //# sourceMappingURL=Box.d.ts.map
@@ -0,0 +1,3 @@
1
+ export { Box, Stack, Row, Spacer, resolveBoxStyle } from './Box';
2
+ export type { BoxProps, StackProps, RowProps, SpacerProps } from './Box';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -4,7 +4,7 @@ import type { PressableProps, StyleProp, TextStyle, ViewStyle } from 'react-nati
4
4
  import type { GradientDefinition } from '../../theme/types';
5
5
  import type { HapticType } from '../../utils/hapticUtils';
6
6
  export type ButtonVariant = 'solid' | 'outline' | 'ghost' | 'link';
7
- export type ButtonTone = 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'neutral';
7
+ export type ButtonTone = 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'neutral';
8
8
  export type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
9
9
  export interface ButtonProps extends Omit<PressableProps, 'style' | 'children'> {
10
10
  title?: string;
@@ -5,8 +5,9 @@ import type { HapticType } from '../../utils/hapticUtils';
5
5
  export type CheckboxSize = 'sm' | 'md' | 'lg';
6
6
  export type CheckboxTone = 'primary' | 'success' | 'warning' | 'error';
7
7
  export interface CheckboxProps extends Omit<PressableProps, 'style' | 'children' | 'onPress'> {
8
- checked: boolean;
9
- onChange: (checked: boolean) => void;
8
+ checked?: boolean;
9
+ defaultChecked?: boolean;
10
+ onChange?: (checked: boolean) => void;
10
11
  indeterminate?: boolean;
11
12
  disabled?: boolean;
12
13
  label?: string;
@@ -6,21 +6,21 @@ export type WeekStart = 0 | 1 | 6;
6
6
  /**
7
7
  * DatePicker operates in two modes:
8
8
  *
9
- * 1. **Controlled-modal mode** — pass `visible` (plus `onSelect` / `onClose`)
9
+ * 1. **Controlled-modal mode** — pass `visible` (plus `onChange` / `onClose`)
10
10
  * and own the open state externally. The component renders only the modal.
11
11
  * 2. **Trigger mode** — omit `visible`. The component renders a built-in
12
12
  * PickerTrigger field (label / value / placeholder / chevron / clear /
13
13
  * helper / error / size / variant) and manages its own open state. The
14
14
  * field opens the modal on press and closes it on confirm/cancel.
15
15
  *
16
- * `onSelect` / `onClose` are typed optional to support trigger-only usage
16
+ * `onChange` / `onClose` are typed optional to support trigger-only usage
17
17
  * where the consumer may not need either callback. In controlled-modal mode
18
18
  * they remain semantically required.
19
19
  */
20
20
  export interface DatePickerProps {
21
21
  visible?: boolean;
22
22
  value?: Date | null;
23
- onSelect?: (date: Date) => void;
23
+ onChange?: (date: Date) => void;
24
24
  onClose?: () => void;
25
25
  minDate?: Date;
26
26
  maxDate?: Date;
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import type { StyleProp, TextStyle, ViewStyle } from 'react-native';
3
- export type DialogVariant = 'default' | 'success' | 'warning' | 'danger' | 'info';
4
- export type DialogActionTone = 'primary' | 'neutral' | 'danger';
3
+ export type DialogVariant = 'default' | 'success' | 'warning' | 'error' | 'info';
4
+ export type DialogActionTone = 'primary' | 'neutral' | 'error';
5
5
  export interface DialogAction {
6
6
  label: string;
7
7
  onPress: () => void;
@@ -1,18 +1,29 @@
1
1
  import React from 'react';
2
2
  import { View } from 'react-native';
3
3
  import type { StyleProp, TextStyle, ViewStyle } from 'react-native';
4
+ import type { FieldInputProps } from '../../form/types';
4
5
  export type FormFieldLayout = 'stacked' | 'inline';
5
6
  export interface FormFieldProps {
6
7
  label?: string;
7
8
  helperText?: string;
8
9
  /**
9
10
  * When truthy: helperText is hidden, error is shown in the error colour,
10
- * and the container reports `accessibilityState.invalid = true`.
11
+ * and the container reports the invalid state to assistive tech.
12
+ * Ignored when `name` connects to a <Form> with an element child (the child
13
+ * renders its own error then).
11
14
  */
12
15
  error?: string;
13
16
  /** Appends ' *' (in theme.colors.error) to the label. */
14
17
  required?: boolean;
15
- children: React.ReactNode;
18
+ /**
19
+ * Connect this field to the surrounding `<Form>` by name. With an element
20
+ * child (e.g. `<Input/>`) the field's value/onChangeText/onBlur/error are
21
+ * injected automatically — best for text inputs. For non-text controls
22
+ * (Select, Switch, DatePicker…) use the render-prop form:
23
+ * `<FormField name="x">{(f) => <Select value={f.value} onChange={f.onChange} />}</FormField>`.
24
+ */
25
+ name?: string;
26
+ children: React.ReactNode | ((field: FieldInputProps) => React.ReactNode);
16
27
  /** 'stacked' (default): label above input. 'inline': label left, input right. */
17
28
  layout?: FormFieldLayout;
18
29
  labelStyle?: StyleProp<TextStyle>;
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import { ScrollView } from 'react-native';
3
+ import type { ScrollViewProps } from 'react-native';
4
+ export interface KeyboardAwareScrollViewProps extends ScrollViewProps {
5
+ /** Gap kept between the focused field and the top of the keyboard. Default 24. */
6
+ extraScrollHeight?: number;
7
+ /** Disable the keyboard-following behaviour (still a normal ScrollView). Default false. */
8
+ disabled?: boolean;
9
+ }
10
+ /**
11
+ * A ScrollView that keeps the focused input visible above the keyboard — no
12
+ * native dependency. On keyboard show it pads the content by the keyboard
13
+ * height and scrolls the focused TextInput so its bottom sits `extraScrollHeight`
14
+ * above the keyboard, but only when it would otherwise be covered (so already-
15
+ * visible fields don't jump). The classic measure-and-scroll approach, in pure RN.
16
+ */
17
+ declare const KeyboardAwareScrollView: React.ForwardRefExoticComponent<KeyboardAwareScrollViewProps & React.RefAttributes<ScrollView>>;
18
+ export { KeyboardAwareScrollView };
19
+ export default KeyboardAwareScrollView;
20
+ //# sourceMappingURL=KeyboardAwareScrollView.d.ts.map
@@ -0,0 +1,3 @@
1
+ export { KeyboardAwareScrollView } from './KeyboardAwareScrollView';
2
+ export type { KeyboardAwareScrollViewProps } from './KeyboardAwareScrollView';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,29 @@
1
+ import React from 'react';
2
+ import type { StyleProp, ViewStyle } from 'react-native';
3
+ export interface KeyboardToolbarProps {
4
+ /** Label for the dismiss button. Default 'Done'. */
5
+ doneLabel?: string;
6
+ /** Show the prev/next chevrons. Default: true when prev/next handlers resolve. */
7
+ showNavigation?: boolean;
8
+ /** Override the dismiss action. Default: `Keyboard.dismiss()`. */
9
+ onDone?: () => void;
10
+ /** Override "next field". Default: the surrounding `<Form>`'s `focusNext`. */
11
+ onNext?: () => void;
12
+ /** Override "previous field". Default: the surrounding `<Form>`'s `focusPrev`. */
13
+ onPrev?: () => void;
14
+ /** Custom content rendered between the nav chevrons and the Done button. */
15
+ leading?: React.ReactNode;
16
+ style?: StyleProp<ViewStyle>;
17
+ testID?: string;
18
+ }
19
+ /**
20
+ * An accessory bar pinned just above the keyboard — pure RN, no native
21
+ * dependency. Shows a Done (dismiss) button and optional prev/next chevrons
22
+ * that, inside a `<Form>`, walk the registered field order. Render it at the
23
+ * screen root (a `flex: 1` ancestor) so its `bottom: keyboardHeight` offset
24
+ * lands it on top of the keyboard. Renders nothing while the keyboard is hidden.
25
+ */
26
+ declare const KeyboardToolbar: React.FC<KeyboardToolbarProps>;
27
+ export { KeyboardToolbar };
28
+ export default KeyboardToolbar;
29
+ //# sourceMappingURL=KeyboardToolbar.d.ts.map
@@ -0,0 +1,3 @@
1
+ export { KeyboardToolbar } from './KeyboardToolbar';
2
+ export type { KeyboardToolbarProps } from './KeyboardToolbar';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -8,8 +8,9 @@ export interface NumberInputRef {
8
8
  clear: () => void;
9
9
  }
10
10
  export interface NumberInputProps {
11
- value: number;
12
- onChange: (value: number) => void;
11
+ value?: number;
12
+ defaultValue?: number;
13
+ onChange?: (value: number) => void;
13
14
  min?: number;
14
15
  max?: number;
15
16
  step?: number;
@@ -7,8 +7,9 @@ export interface OTPInputRef {
7
7
  clear: () => void;
8
8
  }
9
9
  export interface OTPInputProps {
10
- value: string;
11
- onChange: (value: string) => void;
10
+ value?: string;
11
+ defaultValue?: string;
12
+ onChange?: (value: string) => void;
12
13
  onComplete?: (value: string) => void;
13
14
  length?: number;
14
15
  keyboardType?: 'number-pad' | 'default';
@@ -7,7 +7,7 @@ export type RadioTone = 'primary' | 'success' | 'warning' | 'error';
7
7
  export type RadioValue = string | number;
8
8
  export interface RadioGroupContextValue {
9
9
  selectedValue: RadioValue | undefined;
10
- onSelect: (value: RadioValue) => void;
10
+ onChange: (value: RadioValue) => void;
11
11
  disabled: boolean;
12
12
  }
13
13
  export declare const RadioGroupContext: React.Context<RadioGroupContextValue | null>;
@@ -15,7 +15,7 @@ export declare const useRadioGroup: () => RadioGroupContextValue | null;
15
15
  export interface RadioProps extends Omit<PressableProps, 'style' | 'children' | 'onPress'> {
16
16
  value: RadioValue;
17
17
  selected?: boolean;
18
- onSelect?: (value: RadioValue) => void;
18
+ onChange?: (value: RadioValue) => void;
19
19
  disabled?: boolean;
20
20
  label?: string;
21
21
  size?: RadioSize;
@@ -2,8 +2,9 @@ import React from 'react';
2
2
  import type { StyleProp, ViewStyle } from 'react-native';
3
3
  import type { RadioValue } from './Radio';
4
4
  export interface RadioGroupProps {
5
- value: RadioValue;
6
- onChange: (value: RadioValue) => void;
5
+ value?: RadioValue;
6
+ defaultValue?: RadioValue;
7
+ onChange?: (value: RadioValue) => void;
7
8
  children: React.ReactNode;
8
9
  disabled?: boolean;
9
10
  accessibilityLabel?: string;
@@ -18,8 +18,9 @@ export interface SegmentItem {
18
18
  }
19
19
  export interface SegmentedControlProps {
20
20
  segments: SegmentItem[];
21
- value: SegmentValue;
22
- onChange: (value: SegmentValue) => void;
21
+ value?: SegmentValue;
22
+ defaultValue?: SegmentValue;
23
+ onChange?: (value: SegmentValue) => void;
23
24
  size?: SegmentedControlSize;
24
25
  fullWidth?: boolean;
25
26
  disabled?: boolean;
@@ -29,13 +29,15 @@ interface SliderCommonProps {
29
29
  }
30
30
  interface SliderSingleProps extends SliderCommonProps {
31
31
  range?: false;
32
- value: number;
33
- onChange: (value: number) => void;
32
+ value?: number;
33
+ defaultValue?: number;
34
+ onChange?: (value: number) => void;
34
35
  }
35
36
  interface SliderRangeProps extends SliderCommonProps {
36
37
  range: true;
37
- value: [number, number];
38
- onChange: (value: [number, number]) => void;
38
+ value?: [number, number];
39
+ defaultValue?: [number, number];
40
+ onChange?: (value: [number, number]) => void;
39
41
  }
40
42
  export type SliderProps = SliderSingleProps | SliderRangeProps;
41
43
  declare const Slider: React.ForwardRefExoticComponent<SliderProps & React.RefAttributes<View>>;
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { View } from 'react-native';
3
3
  import type { StyleProp, ViewStyle } from 'react-native';
4
- export type SpinnerSize = 'small' | 'medium' | 'large';
4
+ export type SpinnerSize = 'sm' | 'md' | 'lg';
5
5
  export type SpinnerVariant = 'circular' | 'dots';
6
6
  export interface SpinnerProps {
7
7
  size?: SpinnerSize;
@@ -5,8 +5,9 @@ import type { HapticType } from '../../utils/hapticUtils';
5
5
  export type SwitchSize = 'sm' | 'md' | 'lg';
6
6
  export type SwitchTone = 'primary' | 'success' | 'warning' | 'error';
7
7
  export interface SwitchProps extends Omit<PressableProps, 'style' | 'children' | 'onPress'> {
8
- value: boolean;
9
- onValueChange: (value: boolean) => void;
8
+ value?: boolean;
9
+ defaultValue?: boolean;
10
+ onChange?: (value: boolean) => void;
10
11
  disabled?: boolean;
11
12
  size?: SwitchSize;
12
13
  tone?: SwitchTone;
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ import { Text as RNText } from 'react-native';
3
+ import type { StyleProp, TextProps as RNTextProps, TextStyle } from 'react-native';
4
+ import type { FontWeightKey } from '../../theme';
5
+ import type { TypographyScale } from '../../theme/types';
6
+ export type TextVariant = 'display' | 'h1' | 'h2' | 'h3' | 'title' | 'body' | 'bodySmall' | 'caption' | 'label' | 'overline';
7
+ export type TextColor = 'primary' | 'secondary' | 'tertiary' | 'inverse' | 'disabled' | 'link' | 'success' | 'warning' | 'error' | 'info';
8
+ export interface TextProps extends Omit<RNTextProps, 'style'> {
9
+ variant?: TextVariant;
10
+ /** Text role token, semantic tone, or a raw colour string. Defaults per variant. */
11
+ color?: TextColor | (string & {});
12
+ /** Override the variant's weight. */
13
+ weight?: FontWeightKey;
14
+ /** Override the variant's size — a typography token or a pixel number. */
15
+ size?: keyof TypographyScale['fontSize'] | number;
16
+ align?: TextStyle['textAlign'];
17
+ italic?: boolean;
18
+ underline?: boolean;
19
+ children?: React.ReactNode;
20
+ style?: StyleProp<TextStyle>;
21
+ }
22
+ declare const Text: React.ForwardRefExoticComponent<TextProps & React.RefAttributes<RNText>>;
23
+ export { Text };
24
+ export default Text;
25
+ //# sourceMappingURL=Text.d.ts.map
@@ -0,0 +1,3 @@
1
+ export { Text } from './Text';
2
+ export type { TextProps, TextVariant, TextColor } from './Text';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -11,19 +11,19 @@ export interface TimeValue {
11
11
  /**
12
12
  * TimePicker supports two modes:
13
13
  *
14
- * 1. Controlled-modal mode — pass `visible`, `onSelect`, `onClose`. The
14
+ * 1. Controlled-modal mode — pass `visible`, `onChange`, `onClose`. The
15
15
  * component renders only the modal sheet and the caller owns open/close
16
16
  * state plus its own trigger UI.
17
17
  * 2. Trigger mode — omit `visible`. The component renders a PickerTrigger
18
18
  * field (label / value / placeholder / chevron / clear / helper / error)
19
- * and manages its own modal open state. `onSelect` is still called on
19
+ * and manages its own modal open state. `onChange` is still called on
20
20
  * confirm.
21
21
  */
22
22
  export interface TimePickerProps {
23
23
  /** Controlled-modal visibility. When omitted, the component enters trigger mode. */
24
24
  visible?: boolean;
25
25
  value?: TimeValue | null;
26
- onSelect?: (time: TimeValue) => void;
26
+ onChange?: (time: TimeValue) => void;
27
27
  onClose?: () => void;
28
28
  format?: TimeFormat;
29
29
  minuteStep?: MinuteStep;
@@ -12,6 +12,14 @@ export { BottomSheet, useBottomSheet } from './BottomSheet';
12
12
  export type { BottomSheetContextValue, BottomSheetProps, BottomSheetRef } from './BottomSheet';
13
13
  export { Button } from './Button';
14
14
  export type { ButtonProps, ButtonVariant, ButtonTone, ButtonSize } from './Button';
15
+ export { Box, Stack, Row, Spacer } from './Box';
16
+ export type { BoxProps, StackProps, RowProps, SpacerProps } from './Box';
17
+ export { Text } from './Text';
18
+ export type { TextProps, TextVariant, TextColor } from './Text';
19
+ export { KeyboardAwareScrollView } from './KeyboardAwareScrollView';
20
+ export type { KeyboardAwareScrollViewProps } from './KeyboardAwareScrollView';
21
+ export { KeyboardToolbar } from './KeyboardToolbar';
22
+ export type { KeyboardToolbarProps } from './KeyboardToolbar';
15
23
  export { Card } from './Card';
16
24
  export type { CardProps, CardVariant, CardElevation, CardPadding, CardRadius } from './Card';
17
25
  export { Carousel } from './Carousel';
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import type { FormApi, FormValues } from './types';
3
+ export interface FormProps {
4
+ /** The object returned by {@link useForm}. */
5
+ form: FormApi<FormValues>;
6
+ children: React.ReactNode;
7
+ }
8
+ /**
9
+ * Provides a {@link useForm} instance to descendants so `<FormField name>`,
10
+ * {@link useField} and {@link useFieldArray} can bind by name.
11
+ */
12
+ export declare const Form: React.FC<FormProps>;
13
+ /** Read the surrounding form. Throws if there is no `<Form>` ancestor. */
14
+ export declare function useFormContext<Values extends FormValues = FormValues>(): FormApi<Values>;
15
+ /** Read the surrounding form, or null when there is no `<Form>` ancestor. */
16
+ export declare function useOptionalFormContext(): FormApi<FormValues> | null;
17
+ //# sourceMappingURL=FormContext.d.ts.map
@@ -0,0 +1,9 @@
1
+ export { useForm } from './useForm';
2
+ export { useField, useFieldArray } from './useField';
3
+ export type { FieldArrayApi } from './useField';
4
+ export { Form, useFormContext, useOptionalFormContext } from './FormContext';
5
+ export type { FormProps } from './FormContext';
6
+ export { getPath, setPath, deletePath } from './path';
7
+ export * as rules from './rules';
8
+ export type { FormApi, FormConfig, FormValues, FormErrors, FormTouched, FieldState, FieldInputProps, FocusableNode, ValidationRule, ValidationResult, FieldRules, ValidationSchema, FormValidateFn, ValidateOn, SubmitHelpers } from './types';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Immutable get/set/delete for dot- and bracket-notation field paths
3
+ * ("address.city", "phones[0]", "items[2].qty"). Lets a single flat `name`
4
+ * string address nested values and array items, so the form engine can treat
5
+ * every field uniformly regardless of how deep it lives in the value tree.
6
+ */
7
+ export declare const getPath: (obj: unknown, path: string) => unknown;
8
+ export declare const setPath: <T>(obj: T, path: string, value: unknown) => T;
9
+ export declare const deletePath: <T>(obj: T, path: string) => T;
10
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1,31 @@
1
+ import type { PasswordRules } from '../validators';
2
+ import type { FormValues, ValidationRule } from './types';
3
+ export declare const required: (message?: string) => ValidationRule;
4
+ export declare const email: (message?: string) => ValidationRule;
5
+ export declare const mobile: (message?: string) => ValidationRule;
6
+ export declare const phone: (message?: string) => ValidationRule;
7
+ export declare const url: (message?: string) => ValidationRule;
8
+ export declare const numeric: (message?: string) => ValidationRule;
9
+ export declare const integer: (message?: string) => ValidationRule;
10
+ export declare const alphanumeric: (message?: string) => ValidationRule;
11
+ export declare const pincode: (message?: string) => ValidationRule;
12
+ export declare const pan: (message?: string) => ValidationRule;
13
+ export declare const gstin: (message?: string) => ValidationRule;
14
+ export declare const aadhaar: (message?: string) => ValidationRule;
15
+ export declare const ifsc: (message?: string) => ValidationRule;
16
+ export declare const minLength: (length: number, message?: string) => ValidationRule;
17
+ export declare const maxLength: (length: number, message?: string) => ValidationRule;
18
+ export declare const min: (n: number, message?: string) => ValidationRule;
19
+ export declare const max: (n: number, message?: string) => ValidationRule;
20
+ export declare const pattern: (regex: RegExp, message?: string) => ValidationRule;
21
+ export declare const oneOf: (allowed: readonly unknown[], message?: string) => ValidationRule;
22
+ /** Cross-field equality (e.g. confirm-password). `otherField` is a field path. */
23
+ export declare const matches: (otherField: string, message?: string) => ValidationRule<unknown, FormValues>;
24
+ export declare const strongPassword: (rules?: PasswordRules, message?: string) => ValidationRule;
25
+ /**
26
+ * Wrap any custom check. Return `true` (valid), `false` (invalid → default
27
+ * message), or a string (invalid → that message). Async is supported — return
28
+ * a Promise of the same.
29
+ */
30
+ export declare const custom: (fn: (value: any, allValues: FormValues) => boolean | string | Promise<boolean | string>, message?: string) => ValidationRule;
31
+ //# sourceMappingURL=rules.d.ts.map