@webority-technologies/mobile 0.0.14 → 0.0.20

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 (202) hide show
  1. package/lib/commonjs/components/Accordion/Accordion.js +60 -19
  2. package/lib/commonjs/components/AppBar/AppBar.js +29 -20
  3. package/lib/commonjs/components/Avatar/Avatar.js +38 -8
  4. package/lib/commonjs/components/Badge/Badge.js +66 -4
  5. package/lib/commonjs/components/Banner/Banner.js +146 -66
  6. package/lib/commonjs/components/BottomNavigation/BottomNavigation.js +37 -15
  7. package/lib/commonjs/components/BottomSheet/BottomSheet.js +85 -50
  8. package/lib/commonjs/components/Button/Button.js +12 -5
  9. package/lib/commonjs/components/Card/Card.js +106 -16
  10. package/lib/commonjs/components/Carousel/Carousel.js +66 -12
  11. package/lib/commonjs/components/Checkbox/Checkbox.js +11 -7
  12. package/lib/commonjs/components/Chip/Chip.js +44 -12
  13. package/lib/commonjs/components/DatePicker/DatePicker.js +185 -76
  14. package/lib/commonjs/components/DateRangePicker/DateRangePicker.js +133 -59
  15. package/lib/commonjs/components/Dialog/Dialog.js +16 -10
  16. package/lib/commonjs/components/Drawer/Drawer.js +13 -10
  17. package/lib/commonjs/components/FieldBase/FieldBase.js +306 -0
  18. package/lib/commonjs/components/FieldBase/index.js +32 -0
  19. package/lib/commonjs/components/FloatingActionButton/FloatingActionButton.js +69 -44
  20. package/lib/commonjs/components/ForceUpdateDialog/ForceUpdateDialog.js +8 -2
  21. package/lib/commonjs/components/FormField/FormField.js +3 -2
  22. package/lib/commonjs/components/ImageGallery/ImageGallery.js +132 -44
  23. package/lib/commonjs/components/Input/Input.js +144 -181
  24. package/lib/commonjs/components/ListItem/ListItem.js +90 -11
  25. package/lib/commonjs/components/Modal/Modal.js +55 -27
  26. package/lib/commonjs/components/NumberInput/NumberInput.js +60 -106
  27. package/lib/commonjs/components/OTPInput/OTPInput.js +65 -58
  28. package/lib/commonjs/components/PickerTrigger/PickerTrigger.js +185 -0
  29. package/lib/commonjs/components/{AppIcon → PickerTrigger}/index.js +4 -4
  30. package/lib/commonjs/components/ProgressBar/ProgressBar.js +19 -11
  31. package/lib/commonjs/components/Radio/Radio.js +11 -6
  32. package/lib/commonjs/components/Rating/Rating.js +85 -19
  33. package/lib/commonjs/components/SearchBar/SearchBar.js +84 -107
  34. package/lib/commonjs/components/SegmentedControl/SegmentedControl.js +22 -11
  35. package/lib/commonjs/components/Select/Select.js +62 -91
  36. package/lib/commonjs/components/Skeleton/Skeleton.js +131 -174
  37. package/lib/commonjs/components/Skeleton/SkeletonClock.js +117 -0
  38. package/lib/commonjs/components/Skeleton/SkeletonContent.js +164 -81
  39. package/lib/commonjs/components/Skeleton/SkeletonProvider.js +72 -10
  40. package/lib/commonjs/components/Skeleton/index.js +17 -16
  41. package/lib/commonjs/components/Slider/Slider.js +44 -25
  42. package/lib/commonjs/components/Stepper/Stepper.js +199 -29
  43. package/lib/commonjs/components/Swipeable/Swipeable.js +36 -19
  44. package/lib/commonjs/components/Switch/Switch.js +9 -2
  45. package/lib/commonjs/components/Tabs/Tabs.js +84 -21
  46. package/lib/commonjs/components/TimePicker/TimePicker.js +123 -45
  47. package/lib/commonjs/components/Toast/Toast.js +27 -16
  48. package/lib/commonjs/components/Tooltip/Tooltip.js +56 -32
  49. package/lib/commonjs/components/index.js +37 -37
  50. package/lib/commonjs/theme/tokens.js +55 -7
  51. package/lib/module/components/Accordion/Accordion.js +61 -20
  52. package/lib/module/components/AppBar/AppBar.js +29 -20
  53. package/lib/module/components/Avatar/Avatar.js +39 -9
  54. package/lib/module/components/Badge/Badge.js +67 -5
  55. package/lib/module/components/Banner/Banner.js +147 -67
  56. package/lib/module/components/BottomNavigation/BottomNavigation.js +37 -15
  57. package/lib/module/components/BottomSheet/BottomSheet.js +87 -52
  58. package/lib/module/components/Button/Button.js +12 -5
  59. package/lib/module/components/Card/Card.js +107 -17
  60. package/lib/module/components/Carousel/Carousel.js +67 -13
  61. package/lib/module/components/Checkbox/Checkbox.js +11 -7
  62. package/lib/module/components/Chip/Chip.js +45 -13
  63. package/lib/module/components/DatePicker/DatePicker.js +185 -76
  64. package/lib/module/components/DateRangePicker/DateRangePicker.js +134 -60
  65. package/lib/module/components/Dialog/Dialog.js +16 -10
  66. package/lib/module/components/Drawer/Drawer.js +13 -10
  67. package/lib/module/components/FieldBase/FieldBase.js +297 -0
  68. package/lib/module/components/FieldBase/index.js +4 -0
  69. package/lib/module/components/FloatingActionButton/FloatingActionButton.js +69 -44
  70. package/lib/module/components/ForceUpdateDialog/ForceUpdateDialog.js +8 -2
  71. package/lib/module/components/FormField/FormField.js +3 -2
  72. package/lib/module/components/ImageGallery/ImageGallery.js +128 -40
  73. package/lib/module/components/Input/Input.js +144 -179
  74. package/lib/module/components/ListItem/ListItem.js +91 -12
  75. package/lib/module/components/Modal/Modal.js +55 -27
  76. package/lib/module/components/NumberInput/NumberInput.js +60 -106
  77. package/lib/module/components/OTPInput/OTPInput.js +65 -58
  78. package/lib/module/components/PickerTrigger/PickerTrigger.js +181 -0
  79. package/lib/module/components/PickerTrigger/index.js +4 -0
  80. package/lib/module/components/ProgressBar/ProgressBar.js +19 -11
  81. package/lib/module/components/Radio/Radio.js +11 -6
  82. package/lib/module/components/Rating/Rating.js +86 -20
  83. package/lib/module/components/SearchBar/SearchBar.js +84 -107
  84. package/lib/module/components/SegmentedControl/SegmentedControl.js +22 -11
  85. package/lib/module/components/Select/Select.js +62 -91
  86. package/lib/module/components/Skeleton/Skeleton.js +135 -175
  87. package/lib/module/components/Skeleton/SkeletonClock.js +110 -0
  88. package/lib/module/components/Skeleton/SkeletonContent.js +167 -84
  89. package/lib/module/components/Skeleton/SkeletonProvider.js +71 -10
  90. package/lib/module/components/Skeleton/index.js +3 -2
  91. package/lib/module/components/Slider/Slider.js +44 -25
  92. package/lib/module/components/Stepper/Stepper.js +201 -31
  93. package/lib/module/components/Swipeable/Swipeable.js +36 -19
  94. package/lib/module/components/Switch/Switch.js +9 -2
  95. package/lib/module/components/Tabs/Tabs.js +84 -21
  96. package/lib/module/components/TimePicker/TimePicker.js +123 -45
  97. package/lib/module/components/Toast/Toast.js +27 -16
  98. package/lib/module/components/Tooltip/Tooltip.js +56 -32
  99. package/lib/module/components/index.js +2 -2
  100. package/lib/module/theme/tokens.js +55 -7
  101. package/lib/typescript/commonjs/components/Accordion/Accordion.d.ts +10 -5
  102. package/lib/typescript/commonjs/components/AppBar/AppBar.d.ts +8 -0
  103. package/lib/typescript/commonjs/components/Avatar/Avatar.d.ts +12 -6
  104. package/lib/typescript/commonjs/components/Badge/Badge.d.ts +7 -6
  105. package/lib/typescript/commonjs/components/Banner/Banner.d.ts +17 -6
  106. package/lib/typescript/commonjs/components/BottomSheet/BottomSheet.d.ts +7 -0
  107. package/lib/typescript/commonjs/components/Card/Card.d.ts +17 -6
  108. package/lib/typescript/commonjs/components/Carousel/Carousel.d.ts +7 -6
  109. package/lib/typescript/commonjs/components/Checkbox/Checkbox.d.ts +9 -1
  110. package/lib/typescript/commonjs/components/Chip/Chip.d.ts +13 -6
  111. package/lib/typescript/commonjs/components/DatePicker/DatePicker.d.ts +38 -3
  112. package/lib/typescript/commonjs/components/DateRangePicker/DateRangePicker.d.ts +36 -3
  113. package/lib/typescript/commonjs/components/Dialog/Dialog.d.ts +13 -1
  114. package/lib/typescript/commonjs/components/FieldBase/FieldBase.d.ts +141 -0
  115. package/lib/typescript/commonjs/components/FieldBase/index.d.ts +3 -0
  116. package/lib/typescript/commonjs/components/FloatingActionButton/FloatingActionButton.d.ts +8 -6
  117. package/lib/typescript/commonjs/components/FloatingActionButton/index.d.ts +1 -1
  118. package/lib/typescript/commonjs/components/ForceUpdateDialog/ForceUpdateDialog.d.ts +7 -0
  119. package/lib/typescript/commonjs/components/FormField/FormField.d.ts +7 -0
  120. package/lib/typescript/commonjs/components/ImageGallery/ImageGallery.d.ts +6 -4
  121. package/lib/typescript/commonjs/components/Input/Input.d.ts +6 -0
  122. package/lib/typescript/commonjs/components/ListItem/ListItem.d.ts +13 -6
  123. package/lib/typescript/commonjs/components/NumberInput/NumberInput.d.ts +3 -0
  124. package/lib/typescript/commonjs/components/PickerTrigger/PickerTrigger.d.ts +57 -0
  125. package/lib/typescript/commonjs/components/PickerTrigger/index.d.ts +3 -0
  126. package/lib/typescript/commonjs/components/ProgressBar/ProgressBar.d.ts +2 -0
  127. package/lib/typescript/commonjs/components/Radio/Radio.d.ts +3 -0
  128. package/lib/typescript/commonjs/components/Rating/Rating.d.ts +9 -6
  129. package/lib/typescript/commonjs/components/SegmentedControl/SegmentedControl.d.ts +3 -0
  130. package/lib/typescript/commonjs/components/Skeleton/Skeleton.d.ts +49 -20
  131. package/lib/typescript/commonjs/components/Skeleton/SkeletonClock.d.ts +60 -0
  132. package/lib/typescript/commonjs/components/Skeleton/SkeletonContent.d.ts +80 -19
  133. package/lib/typescript/commonjs/components/Skeleton/SkeletonProvider.d.ts +39 -5
  134. package/lib/typescript/commonjs/components/Skeleton/index.d.ts +6 -4
  135. package/lib/typescript/commonjs/components/Slider/Slider.d.ts +12 -1
  136. package/lib/typescript/commonjs/components/Stepper/Stepper.d.ts +18 -6
  137. package/lib/typescript/commonjs/components/Swipeable/Swipeable.d.ts +2 -0
  138. package/lib/typescript/commonjs/components/Switch/Switch.d.ts +1 -0
  139. package/lib/typescript/commonjs/components/Tabs/Tabs.d.ts +26 -2
  140. package/lib/typescript/commonjs/components/TimePicker/TimePicker.d.ts +36 -3
  141. package/lib/typescript/commonjs/components/Toast/Toast.d.ts +8 -0
  142. package/lib/typescript/commonjs/components/Tooltip/Tooltip.d.ts +7 -1
  143. package/lib/typescript/commonjs/components/index.d.ts +5 -5
  144. package/lib/typescript/commonjs/index.d.ts +1 -1
  145. package/lib/typescript/commonjs/theme/index.d.ts +1 -1
  146. package/lib/typescript/commonjs/theme/types.d.ts +553 -11
  147. package/lib/typescript/module/components/Accordion/Accordion.d.ts +10 -5
  148. package/lib/typescript/module/components/AppBar/AppBar.d.ts +8 -0
  149. package/lib/typescript/module/components/Avatar/Avatar.d.ts +12 -6
  150. package/lib/typescript/module/components/Badge/Badge.d.ts +7 -6
  151. package/lib/typescript/module/components/Banner/Banner.d.ts +17 -6
  152. package/lib/typescript/module/components/BottomSheet/BottomSheet.d.ts +7 -0
  153. package/lib/typescript/module/components/Card/Card.d.ts +17 -6
  154. package/lib/typescript/module/components/Carousel/Carousel.d.ts +7 -6
  155. package/lib/typescript/module/components/Checkbox/Checkbox.d.ts +9 -1
  156. package/lib/typescript/module/components/Chip/Chip.d.ts +13 -6
  157. package/lib/typescript/module/components/DatePicker/DatePicker.d.ts +38 -3
  158. package/lib/typescript/module/components/DateRangePicker/DateRangePicker.d.ts +36 -3
  159. package/lib/typescript/module/components/Dialog/Dialog.d.ts +13 -1
  160. package/lib/typescript/module/components/FieldBase/FieldBase.d.ts +141 -0
  161. package/lib/typescript/module/components/FieldBase/index.d.ts +3 -0
  162. package/lib/typescript/module/components/FloatingActionButton/FloatingActionButton.d.ts +8 -6
  163. package/lib/typescript/module/components/FloatingActionButton/index.d.ts +1 -1
  164. package/lib/typescript/module/components/ForceUpdateDialog/ForceUpdateDialog.d.ts +7 -0
  165. package/lib/typescript/module/components/FormField/FormField.d.ts +7 -0
  166. package/lib/typescript/module/components/ImageGallery/ImageGallery.d.ts +6 -4
  167. package/lib/typescript/module/components/Input/Input.d.ts +6 -0
  168. package/lib/typescript/module/components/ListItem/ListItem.d.ts +13 -6
  169. package/lib/typescript/module/components/NumberInput/NumberInput.d.ts +3 -0
  170. package/lib/typescript/module/components/PickerTrigger/PickerTrigger.d.ts +57 -0
  171. package/lib/typescript/module/components/PickerTrigger/index.d.ts +3 -0
  172. package/lib/typescript/module/components/ProgressBar/ProgressBar.d.ts +2 -0
  173. package/lib/typescript/module/components/Radio/Radio.d.ts +3 -0
  174. package/lib/typescript/module/components/Rating/Rating.d.ts +9 -6
  175. package/lib/typescript/module/components/SegmentedControl/SegmentedControl.d.ts +3 -0
  176. package/lib/typescript/module/components/Skeleton/Skeleton.d.ts +49 -20
  177. package/lib/typescript/module/components/Skeleton/SkeletonClock.d.ts +60 -0
  178. package/lib/typescript/module/components/Skeleton/SkeletonContent.d.ts +80 -19
  179. package/lib/typescript/module/components/Skeleton/SkeletonProvider.d.ts +39 -5
  180. package/lib/typescript/module/components/Skeleton/index.d.ts +6 -4
  181. package/lib/typescript/module/components/Slider/Slider.d.ts +12 -1
  182. package/lib/typescript/module/components/Stepper/Stepper.d.ts +18 -6
  183. package/lib/typescript/module/components/Swipeable/Swipeable.d.ts +2 -0
  184. package/lib/typescript/module/components/Switch/Switch.d.ts +1 -0
  185. package/lib/typescript/module/components/Tabs/Tabs.d.ts +26 -2
  186. package/lib/typescript/module/components/TimePicker/TimePicker.d.ts +36 -3
  187. package/lib/typescript/module/components/Toast/Toast.d.ts +8 -0
  188. package/lib/typescript/module/components/Tooltip/Tooltip.d.ts +7 -1
  189. package/lib/typescript/module/components/index.d.ts +5 -5
  190. package/lib/typescript/module/index.d.ts +1 -1
  191. package/lib/typescript/module/theme/index.d.ts +1 -1
  192. package/lib/typescript/module/theme/types.d.ts +553 -11
  193. package/package.json +2 -6
  194. package/lib/commonjs/components/AppIcon/AppIcon.js +0 -120
  195. package/lib/commonjs/types/vector-icons.d.js +0 -2
  196. package/lib/module/components/AppIcon/AppIcon.js +0 -111
  197. package/lib/module/components/AppIcon/index.js +0 -4
  198. package/lib/module/types/vector-icons.d.js +0 -2
  199. package/lib/typescript/commonjs/components/AppIcon/AppIcon.d.ts +0 -20
  200. package/lib/typescript/commonjs/components/AppIcon/index.d.ts +0 -3
  201. package/lib/typescript/module/components/AppIcon/AppIcon.d.ts +0 -20
  202. package/lib/typescript/module/components/AppIcon/index.d.ts +0 -3
@@ -6,10 +6,27 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = exports.DatePicker = void 0;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
8
  var _reactNative = require("react-native");
9
+ var _reactNativeSafeAreaContext = require("react-native-safe-area-context");
9
10
  var _index = require("../../theme/index.js");
10
11
  var _index2 = require("../../utils/index.js");
12
+ var _index3 = require("../PickerTrigger/index.js");
11
13
  var _jsxRuntime = require("react/jsx-runtime");
12
14
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
15
+ /**
16
+ * DatePicker operates in two modes:
17
+ *
18
+ * 1. **Controlled-modal mode** — pass `visible` (plus `onSelect` / `onClose`)
19
+ * and own the open state externally. The component renders only the modal.
20
+ * 2. **Trigger mode** — omit `visible`. The component renders a built-in
21
+ * PickerTrigger field (label / value / placeholder / chevron / clear /
22
+ * helper / error / size / variant) and manages its own open state. The
23
+ * field opens the modal on press and closes it on confirm/cancel.
24
+ *
25
+ * `onSelect` / `onClose` are typed optional to support trigger-only usage
26
+ * where the consumer may not need either callback. In controlled-modal mode
27
+ * they remain semantically required.
28
+ */
29
+
13
30
  const DAY_MS = 24 * 60 * 60 * 1000;
14
31
  const GRID_SIZE = 12; // 4 cols x 3 rows for year / decade grids
15
32
  const DECADE_SPAN = 10;
@@ -86,7 +103,6 @@ const buildDecadeCells = anchorYear => {
86
103
  };
87
104
  const DatePicker = props => {
88
105
  const {
89
- visible,
90
106
  value,
91
107
  onSelect,
92
108
  onClose,
@@ -100,9 +116,32 @@ const DatePicker = props => {
100
116
  confirmLabel = 'Confirm',
101
117
  cancelLabel = 'Cancel',
102
118
  style,
103
- testID
119
+ containerStyle,
120
+ headerLabelStyle,
121
+ navButtonStyle,
122
+ footerButtonStyle,
123
+ testID,
124
+ label,
125
+ placeholder,
126
+ helperText,
127
+ error,
128
+ required,
129
+ disabled,
130
+ size,
131
+ variant,
132
+ clearable,
133
+ onClear,
134
+ formatValue,
135
+ triggerStyle
104
136
  } = props;
137
+
138
+ // Controlled vs uncontrolled detection: if `visible` is supplied (even
139
+ // `false`), the consumer owns the open state; otherwise we own it.
140
+ const isControlled = props.visible !== undefined;
141
+ const [internalOpen, setInternalOpen] = (0, _react.useState)(false);
142
+ const open = isControlled ? props.visible : internalOpen;
105
143
  const theme = (0, _index.useTheme)();
144
+ const insets = (0, _reactNativeSafeAreaContext.useSafeAreaInsets)();
106
145
  const styles = (0, _react.useMemo)(() => buildStyles(theme), [theme]);
107
146
  const today = (0, _react.useMemo)(() => startOfDay(new Date()), []);
108
147
  const initialAnchor = value ? startOfDay(value) : today;
@@ -131,17 +170,20 @@ const DatePicker = props => {
131
170
  }
132
171
  }, [value]);
133
172
 
134
- // Modal open / close animation.
173
+ // Modal open / close animation. Backdrop opacity runs on JS driver — see
174
+ // Modal.tsx for the RN 0.85 / Fabric two-bug reason (view flattening +
175
+ // native-driver opacity on Animated.View with backgroundColor). Sheet
176
+ // transform stays native.
135
177
  (0, _react.useEffect)(() => {
136
178
  if (mode !== 'modal') return;
137
- if (visible) {
138
- (0, _index.setNativeValue)(backdrop, 0);
179
+ if (open) {
180
+ backdrop.setValue(0);
139
181
  (0, _index.setNativeValue)(sheet, 0);
140
182
  _reactNative.Animated.parallel([_reactNative.Animated.timing(backdrop, {
141
183
  toValue: 1,
142
184
  duration: theme.motion.duration.normal,
143
185
  easing: _reactNative.Easing.out(_reactNative.Easing.cubic),
144
- useNativeDriver: true
186
+ useNativeDriver: false
145
187
  }), _reactNative.Animated.spring(sheet, {
146
188
  toValue: 1,
147
189
  damping: theme.motion.spring.gentle.damping,
@@ -150,7 +192,7 @@ const DatePicker = props => {
150
192
  useNativeDriver: true
151
193
  })]).start();
152
194
  }
153
- }, [visible, mode, backdrop, sheet, theme.motion]);
195
+ }, [open, mode, backdrop, sheet, theme.motion]);
154
196
  const disabledIsoSet = (0, _react.useMemo)(() => {
155
197
  const set = new Set();
156
198
  disabledDates?.forEach(d => set.add(toIso(startOfDay(d))));
@@ -191,17 +233,19 @@ const DatePicker = props => {
191
233
  return false;
192
234
  }, [minDay, maxDay]);
193
235
  const animateMonthChange = (0, _react.useCallback)(delta => {
194
- (0, _index2.triggerHaptic)('impactLight');
236
+ if (theme.components.datePicker?.haptic) (0, _index2.triggerHaptic)('impactLight');
195
237
  const direction = delta > 0 ? 1 : -1;
196
- const distance = 32;
238
+ const distance = theme.components.datePicker?.monthSlideDistance ?? 32;
239
+ const outDuration = theme.components.datePicker?.monthSlideOutDuration ?? theme.motion.duration.fast ?? 140;
240
+ const inDuration = theme.components.datePicker?.monthSlideInDuration ?? theme.motion.duration.fast ?? 160;
197
241
  _reactNative.Animated.sequence([_reactNative.Animated.parallel([_reactNative.Animated.timing(monthSlide, {
198
242
  toValue: -direction * distance,
199
- duration: 140,
243
+ duration: outDuration,
200
244
  easing: _reactNative.Easing.out(_reactNative.Easing.quad),
201
245
  useNativeDriver: true
202
246
  }), _reactNative.Animated.timing(monthFade, {
203
247
  toValue: 0,
204
- duration: 140,
248
+ duration: outDuration,
205
249
  useNativeDriver: true
206
250
  })]), _reactNative.Animated.timing(monthSlide, {
207
251
  toValue: direction * distance,
@@ -209,68 +253,71 @@ const DatePicker = props => {
209
253
  useNativeDriver: true
210
254
  }), _reactNative.Animated.parallel([_reactNative.Animated.timing(monthSlide, {
211
255
  toValue: 0,
212
- duration: 160,
256
+ duration: inDuration,
213
257
  easing: _reactNative.Easing.out(_reactNative.Easing.cubic),
214
258
  useNativeDriver: true
215
259
  }), _reactNative.Animated.timing(monthFade, {
216
260
  toValue: 1,
217
- duration: 160,
261
+ duration: inDuration,
218
262
  useNativeDriver: true
219
263
  })])]).start();
220
264
  const next = addMonths(anchor, delta);
221
265
  setAnchor(next);
222
266
  _reactNative.AccessibilityInfo.announceForAccessibility(formatMonthYear(next, locale));
223
- }, [anchor, locale, monthFade, monthSlide]);
267
+ }, [anchor, locale, monthFade, monthSlide, theme.components.datePicker, theme.motion.duration.fast]);
224
268
  const goPrev = (0, _react.useCallback)(() => {
225
269
  if (viewMode === 'days') {
226
270
  animateMonthChange(-1);
227
271
  return;
228
272
  }
229
- (0, _index2.triggerHaptic)('impactLight');
273
+ if (theme.components.datePicker?.haptic) (0, _index2.triggerHaptic)('impactLight');
230
274
  if (viewMode === 'years') {
231
275
  setAnchor(prev => new Date(prev.getFullYear() - GRID_SIZE, prev.getMonth(), 1));
232
276
  } else {
233
277
  setAnchor(prev => new Date(prev.getFullYear() - GRID_SIZE * DECADE_SPAN, prev.getMonth(), 1));
234
278
  }
235
- }, [animateMonthChange, viewMode]);
279
+ }, [animateMonthChange, viewMode, theme.components.datePicker]);
236
280
  const goNext = (0, _react.useCallback)(() => {
237
281
  if (viewMode === 'days') {
238
282
  animateMonthChange(1);
239
283
  return;
240
284
  }
241
- (0, _index2.triggerHaptic)('impactLight');
285
+ if (theme.components.datePicker?.haptic) (0, _index2.triggerHaptic)('impactLight');
242
286
  if (viewMode === 'years') {
243
287
  setAnchor(prev => new Date(prev.getFullYear() + GRID_SIZE, prev.getMonth(), 1));
244
288
  } else {
245
289
  setAnchor(prev => new Date(prev.getFullYear() + GRID_SIZE * DECADE_SPAN, prev.getMonth(), 1));
246
290
  }
247
- }, [animateMonthChange, viewMode]);
291
+ }, [animateMonthChange, viewMode, theme.components.datePicker]);
248
292
 
249
- // View-mode transition: fade + scale (200ms, native driver).
293
+ // View-mode transition: fade + scale, native driver.
250
294
  const animateViewTransition = (0, _react.useCallback)(() => {
295
+ const dur = theme.components.datePicker?.viewTransitionDuration ?? theme.motion.duration.normal ?? 200;
251
296
  (0, _index.setNativeValue)(viewFade, 0);
252
297
  (0, _index.setNativeValue)(viewScale, 0.9);
253
298
  _reactNative.Animated.parallel([_reactNative.Animated.timing(viewFade, {
254
299
  toValue: 1,
255
- duration: 200,
300
+ duration: dur,
256
301
  easing: _reactNative.Easing.out(_reactNative.Easing.cubic),
257
302
  useNativeDriver: true
258
303
  }), _reactNative.Animated.timing(viewScale, {
259
304
  toValue: 1,
260
- duration: 200,
305
+ duration: dur,
261
306
  easing: _reactNative.Easing.out(_reactNative.Easing.cubic),
262
307
  useNativeDriver: true
263
308
  })]).start();
264
- }, [viewFade, viewScale]);
309
+ }, [viewFade, viewScale, theme.components.datePicker, theme.motion.duration.normal]);
265
310
  const cycleViewMode = (0, _react.useCallback)(() => {
266
- (0, _index2.triggerHaptic)('selection');
311
+ if (theme.components.datePicker?.haptic) (0, _index2.triggerHaptic)('selection');
312
+ const pressDur = theme.components.datePicker?.headerPressDuration ?? 80;
313
+ const releaseDur = theme.components.datePicker?.headerReleaseDuration ?? 100;
267
314
  _reactNative.Animated.sequence([_reactNative.Animated.timing(headerScale, {
268
315
  toValue: 0.96,
269
- duration: 80,
316
+ duration: pressDur,
270
317
  useNativeDriver: true
271
318
  }), _reactNative.Animated.timing(headerScale, {
272
319
  toValue: 1,
273
- duration: 100,
320
+ duration: releaseDur,
274
321
  useNativeDriver: true
275
322
  })]).start();
276
323
  setViewMode(prev => {
@@ -279,23 +326,23 @@ const DatePicker = props => {
279
326
  return 'years';
280
327
  });
281
328
  animateViewTransition();
282
- }, [animateViewTransition, headerScale]);
329
+ }, [animateViewTransition, headerScale, theme.components.datePicker]);
283
330
  const pickYear = (0, _react.useCallback)(year => {
284
- (0, _index2.triggerHaptic)('selection');
331
+ if (theme.components.datePicker?.haptic) (0, _index2.triggerHaptic)('selection');
285
332
  setAnchor(prev => new Date(year, prev.getMonth(), 1));
286
333
  setViewMode('days');
287
334
  animateViewTransition();
288
- }, [animateViewTransition]);
335
+ }, [animateViewTransition, theme.components.datePicker]);
289
336
  const pickDecade = (0, _react.useCallback)(decadeStart => {
290
- (0, _index2.triggerHaptic)('selection');
337
+ if (theme.components.datePicker?.haptic) (0, _index2.triggerHaptic)('selection');
291
338
  // Anchor mid-decade so the year grid centers nicely on this decade.
292
339
  setAnchor(prev => new Date(decadeStart + 4, prev.getMonth(), 1));
293
340
  setViewMode('years');
294
341
  animateViewTransition();
295
- }, [animateViewTransition]);
342
+ }, [animateViewTransition, theme.components.datePicker]);
296
343
  const pressDay = (0, _react.useCallback)(cell => {
297
344
  if (isDisabled(cell.date)) return;
298
- (0, _index2.triggerHaptic)('selection');
345
+ if (theme.components.datePicker?.haptic) (0, _index2.triggerHaptic)('selection');
299
346
  setPendingDate(cell.date);
300
347
  if (!cell.inMonth) {
301
348
  setAnchor(new Date(cell.date.getFullYear(), cell.date.getMonth(), 1));
@@ -308,42 +355,50 @@ const DatePicker = props => {
308
355
  mass: theme.motion.spring.bouncy.mass,
309
356
  useNativeDriver: true
310
357
  }).start();
311
- }, [isDisabled, selectScale, theme.motion.spring.bouncy]);
358
+ }, [isDisabled, selectScale, theme.motion.spring.bouncy, theme.components.datePicker]);
359
+ const finalizeClose = (0, _react.useCallback)(() => {
360
+ if (isControlled) {
361
+ onClose?.();
362
+ } else {
363
+ setInternalOpen(false);
364
+ onClose?.();
365
+ }
366
+ }, [isControlled, onClose]);
312
367
  const handleClose = (0, _react.useCallback)(() => {
313
368
  if (mode !== 'modal') {
314
- onClose();
369
+ finalizeClose();
315
370
  return;
316
371
  }
317
372
  _reactNative.Animated.parallel([_reactNative.Animated.timing(backdrop, {
318
373
  toValue: 0,
319
374
  duration: theme.motion.duration.fast,
320
375
  easing: _reactNative.Easing.in(_reactNative.Easing.cubic),
321
- useNativeDriver: true
376
+ useNativeDriver: false
322
377
  }), _reactNative.Animated.timing(sheet, {
323
378
  toValue: 0,
324
379
  duration: theme.motion.duration.fast,
325
380
  easing: _reactNative.Easing.in(_reactNative.Easing.cubic),
326
381
  useNativeDriver: true
327
382
  })]).start(() => {
328
- onClose();
383
+ finalizeClose();
329
384
  });
330
- }, [backdrop, mode, onClose, sheet, theme.motion.duration.fast]);
385
+ }, [backdrop, mode, finalizeClose, sheet, theme.motion.duration.fast]);
331
386
  const handleCancel = (0, _react.useCallback)(() => {
332
- (0, _index2.triggerHaptic)('selection');
387
+ if (theme.components.datePicker?.haptic) (0, _index2.triggerHaptic)('selection');
333
388
  handleClose();
334
- }, [handleClose]);
389
+ }, [handleClose, theme.components.datePicker]);
335
390
  const handleConfirm = (0, _react.useCallback)(() => {
336
391
  if (!pendingDate) return;
337
- (0, _index2.triggerHaptic)('notificationSuccess');
338
- onSelect(pendingDate);
392
+ if (theme.components.datePicker?.haptic) (0, _index2.triggerHaptic)('notificationSuccess');
393
+ onSelect?.(pendingDate);
339
394
  handleClose();
340
- }, [handleClose, onSelect, pendingDate]);
395
+ }, [handleClose, onSelect, pendingDate, theme.components.datePicker]);
341
396
  const sheetTranslate = sheet.interpolate({
342
397
  inputRange: [0, 1],
343
398
  outputRange: [320, 0]
344
399
  });
345
400
  const calendar = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
346
- style: [styles.card, style],
401
+ style: [styles.card, style, containerStyle],
347
402
  accessibilityRole: mode === 'modal' ? undefined : 'none',
348
403
  accessible: false,
349
404
  testID: testID,
@@ -360,7 +415,7 @@ const DatePicker = props => {
360
415
  onPress: goPrev,
361
416
  style: ({
362
417
  pressed
363
- }) => [styles.navBtn, pressed && styles.navBtnPressed],
418
+ }) => [styles.navBtn, pressed && styles.navBtnPressed, navButtonStyle],
364
419
  accessibilityRole: "button",
365
420
  accessibilityLabel: viewMode === 'days' ? 'Previous month' : viewMode === 'years' ? 'Previous years' : 'Previous decades',
366
421
  hitSlop: 8,
@@ -370,7 +425,7 @@ const DatePicker = props => {
370
425
  })
371
426
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
372
427
  onPress: cycleViewMode,
373
- style: styles.headerLabelWrap,
428
+ style: [styles.headerLabelWrap, headerLabelStyle],
374
429
  accessibilityRole: "button",
375
430
  accessibilityLabel: viewMode === 'days' ? `${headerLabel}, switch to year selection` : viewMode === 'years' ? `${headerLabel}, switch to decade selection` : `${headerLabel}, switch to year selection`,
376
431
  hitSlop: 8,
@@ -404,7 +459,7 @@ const DatePicker = props => {
404
459
  onPress: goNext,
405
460
  style: ({
406
461
  pressed
407
- }) => [styles.navBtn, pressed && styles.navBtnPressed],
462
+ }) => [styles.navBtn, pressed && styles.navBtnPressed, navButtonStyle],
408
463
  accessibilityRole: "button",
409
464
  accessibilityLabel: viewMode === 'days' ? 'Next month' : viewMode === 'years' ? 'Next years' : 'Next decades',
410
465
  hitSlop: 8,
@@ -578,7 +633,7 @@ const DatePicker = props => {
578
633
  onPress: handleCancel,
579
634
  style: ({
580
635
  pressed
581
- }) => [styles.footerBtn, styles.footerCancel, pressed && styles.footerBtnPressed],
636
+ }) => [styles.footerBtn, styles.footerCancel, pressed && styles.footerBtnPressed, footerButtonStyle],
582
637
  accessibilityRole: "button",
583
638
  accessibilityLabel: cancelLabel,
584
639
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
@@ -597,7 +652,7 @@ const DatePicker = props => {
597
652
  opacity: !pendingDate ? 0.5 : 1
598
653
  }, pressed && {
599
654
  backgroundColor: theme.colors.primaryHover
600
- }],
655
+ }, footerButtonStyle],
601
656
  accessibilityRole: "button",
602
657
  accessibilityLabel: confirmLabel,
603
658
  accessibilityState: {
@@ -612,38 +667,92 @@ const DatePicker = props => {
612
667
  })]
613
668
  })]
614
669
  });
670
+ const formatTriggerValue = formatValue ?? (d => d.toLocaleDateString());
671
+ const triggerValueText = value ? formatTriggerValue(value) : undefined;
672
+ const showTrigger = !isControlled;
615
673
  if (mode === 'inline') {
616
- if (!visible) return null;
674
+ if (!open && !showTrigger) return null;
675
+ if (showTrigger) {
676
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
677
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_index3.PickerTrigger, {
678
+ label: label,
679
+ value: triggerValueText,
680
+ placeholder: placeholder,
681
+ helperText: helperText,
682
+ error: error,
683
+ required: required,
684
+ disabled: disabled,
685
+ size: size,
686
+ variant: variant,
687
+ clearable: clearable,
688
+ onClear: onClear,
689
+ onPress: () => setInternalOpen(true),
690
+ triggerStyle: triggerStyle
691
+ }), open ? calendar : null]
692
+ });
693
+ }
617
694
  return calendar;
618
695
  }
619
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Modal, {
620
- visible: visible,
696
+ const modalNode = /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Modal, {
697
+ visible: open,
621
698
  transparent: true,
622
- statusBarTranslucent: true,
699
+ statusBarTranslucent: true
700
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
701
+ // @ts-ignore — Android-only RN 0.71+; iOS ignores it.
702
+ ,
703
+ navigationBarTranslucent: true,
623
704
  animationType: "none",
624
705
  onRequestClose: handleClose,
625
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Animated.View, {
706
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View
707
+ // Backdrop wraps the sheet (not sibling) — on Fabric a sibling
708
+ // backdrop is occluded by the sheet wrapper regardless of order.
709
+ // collapsable={false} prevents flattening; plain View + pre-baked
710
+ // rgba colour avoids the Fabric animated-opacity-on-coloured-View bug.
711
+ , {
712
+ collapsable: false,
626
713
  style: [styles.backdrop, {
627
- opacity: backdrop,
628
714
  backgroundColor: theme.colors.background.overlay
629
715
  }],
630
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
716
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
631
717
  style: _reactNative.StyleSheet.absoluteFill,
632
718
  onPress: handleClose,
633
719
  accessibilityLabel: "Dismiss"
634
- })
635
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Animated.View, {
636
- style: [styles.sheetWrap, {
637
- opacity: sheet,
638
- transform: [{
639
- translateY: sheetTranslate
640
- }]
641
- }],
642
- accessibilityViewIsModal: true,
643
- accessibilityRole: "none",
644
- children: calendar
645
- })]
720
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Animated.View, {
721
+ style: [styles.sheetWrap, {
722
+ // Push the sheet up by the system nav-bar inset so its content
723
+ // never lands behind Android gesture/3-button chrome.
724
+ paddingBottom: insets.bottom + theme.spacing.lg,
725
+ opacity: sheet,
726
+ transform: [{
727
+ translateY: sheetTranslate
728
+ }]
729
+ }],
730
+ accessibilityViewIsModal: true,
731
+ accessibilityRole: "none",
732
+ children: calendar
733
+ })]
734
+ })
646
735
  });
736
+ if (showTrigger) {
737
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
738
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_index3.PickerTrigger, {
739
+ label: label,
740
+ value: triggerValueText,
741
+ placeholder: placeholder,
742
+ helperText: helperText,
743
+ error: error,
744
+ required: required,
745
+ disabled: disabled,
746
+ size: size,
747
+ variant: variant,
748
+ clearable: clearable,
749
+ onClear: onClear,
750
+ onPress: () => setInternalOpen(true),
751
+ triggerStyle: triggerStyle
752
+ }), modalNode]
753
+ });
754
+ }
755
+ return modalNode;
647
756
  };
648
757
  exports.DatePicker = DatePicker;
649
758
  const buildStyles = theme => {
@@ -685,8 +794,8 @@ const buildStyles = theme => {
685
794
  marginBottom: theme.spacing.md
686
795
  },
687
796
  navBtn: {
688
- width: 36,
689
- height: 36,
797
+ width: theme.components.datePicker?.navButtonSize ?? 36,
798
+ height: theme.components.datePicker?.navButtonSize ?? 36,
690
799
  borderRadius: theme.radius.full,
691
800
  alignItems: 'center',
692
801
  justifyContent: 'center',
@@ -696,8 +805,8 @@ const buildStyles = theme => {
696
805
  backgroundColor: theme.colors.surface.pressed
697
806
  },
698
807
  navText: {
699
- fontSize: 22,
700
- lineHeight: 24,
808
+ fontSize: theme.components.datePicker?.navTextFontSize ?? 22,
809
+ lineHeight: theme.components.datePicker?.navTextLineHeight ?? 24,
701
810
  color: theme.colors.text.primary,
702
811
  fontWeight: theme.typography.fontWeight.semibold
703
812
  },
@@ -746,12 +855,12 @@ const buildStyles = theme => {
746
855
  aspectRatio: 1,
747
856
  alignItems: 'center',
748
857
  justifyContent: 'center',
749
- padding: 2
858
+ padding: theme.components.datePicker?.dayCellPadding ?? 2
750
859
  },
751
860
  dayInner: {
752
861
  width: '100%',
753
862
  height: '100%',
754
- borderRadius: theme.radius.full,
863
+ borderRadius: theme.components.datePicker?.dayInnerBorderRadius ?? theme.radius.full,
755
864
  alignItems: 'center',
756
865
  justifyContent: 'center'
757
866
  },
@@ -767,12 +876,12 @@ const buildStyles = theme => {
767
876
  aspectRatio: 1.6,
768
877
  alignItems: 'center',
769
878
  justifyContent: 'center',
770
- padding: 4
879
+ padding: theme.components.datePicker?.yearCellPadding ?? 4
771
880
  },
772
881
  yearInner: {
773
882
  width: '100%',
774
883
  height: '100%',
775
- borderRadius: theme.radius.lg,
884
+ borderRadius: theme.components.datePicker?.yearInnerBorderRadius ?? theme.radius.lg,
776
885
  alignItems: 'center',
777
886
  justifyContent: 'center'
778
887
  },
@@ -783,7 +892,7 @@ const buildStyles = theme => {
783
892
  decadeRangeText: {
784
893
  fontSize: theme.typography.fontSize.xs,
785
894
  fontWeight: theme.typography.fontWeight.medium,
786
- marginTop: 2
895
+ marginTop: theme.components.datePicker?.decadeRangeMarginTop ?? 2
787
896
  },
788
897
  footer: {
789
898
  flexDirection: 'row',
@@ -796,7 +905,7 @@ const buildStyles = theme => {
796
905
  paddingHorizontal: theme.spacing.lg,
797
906
  paddingVertical: theme.spacing.sm,
798
907
  borderRadius: theme.radius.md,
799
- minHeight: 40,
908
+ minHeight: theme.components.datePicker?.footerButtonMinHeight ?? 40,
800
909
  alignItems: 'center',
801
910
  justifyContent: 'center'
802
911
  },