react-native-ruler-date-picker 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/README.md +186 -60
  2. package/lib/commonjs/LensTick.js +83 -0
  3. package/lib/commonjs/LensTick.js.map +1 -0
  4. package/lib/commonjs/Ruler.js +38 -0
  5. package/lib/commonjs/Ruler.js.map +1 -0
  6. package/lib/commonjs/RulerContext.js +17 -0
  7. package/lib/commonjs/RulerContext.js.map +1 -0
  8. package/lib/commonjs/RulerDatePicker.js +38 -351
  9. package/lib/commonjs/RulerDatePicker.js.map +1 -1
  10. package/lib/commonjs/RulerDateRangePicker.js +56 -0
  11. package/lib/commonjs/RulerDateRangePicker.js.map +1 -0
  12. package/lib/commonjs/RulerHeader.js +106 -0
  13. package/lib/commonjs/RulerHeader.js.map +1 -0
  14. package/lib/commonjs/RulerIndicator.js +67 -0
  15. package/lib/commonjs/RulerIndicator.js.map +1 -0
  16. package/lib/commonjs/RulerLensTicks.js +55 -0
  17. package/lib/commonjs/RulerLensTicks.js.map +1 -0
  18. package/lib/commonjs/RulerLensTrack.js +52 -0
  19. package/lib/commonjs/RulerLensTrack.js.map +1 -0
  20. package/lib/commonjs/RulerRange.js +39 -0
  21. package/lib/commonjs/RulerRange.js.map +1 -0
  22. package/lib/commonjs/RulerRangeContext.js +17 -0
  23. package/lib/commonjs/RulerRangeContext.js.map +1 -0
  24. package/lib/commonjs/RulerRangeHeader.js +154 -0
  25. package/lib/commonjs/RulerRangeHeader.js.map +1 -0
  26. package/lib/commonjs/RulerRangeHighlight.js +50 -0
  27. package/lib/commonjs/RulerRangeHighlight.js.map +1 -0
  28. package/lib/commonjs/RulerRangeIndicator.js +71 -0
  29. package/lib/commonjs/RulerRangeIndicator.js.map +1 -0
  30. package/lib/commonjs/RulerRangeRoot.js +80 -0
  31. package/lib/commonjs/RulerRangeRoot.js.map +1 -0
  32. package/lib/commonjs/RulerRangeTicks.js +57 -0
  33. package/lib/commonjs/RulerRangeTicks.js.map +1 -0
  34. package/lib/commonjs/RulerRangeTrack.js +46 -0
  35. package/lib/commonjs/RulerRangeTrack.js.map +1 -0
  36. package/lib/commonjs/RulerResetButton.js +46 -0
  37. package/lib/commonjs/RulerResetButton.js.map +1 -0
  38. package/lib/commonjs/RulerRoot.js +87 -0
  39. package/lib/commonjs/RulerRoot.js.map +1 -0
  40. package/lib/commonjs/RulerTicks.js +51 -0
  41. package/lib/commonjs/RulerTicks.js.map +1 -0
  42. package/lib/commonjs/RulerTrack.js +46 -0
  43. package/lib/commonjs/RulerTrack.js.map +1 -0
  44. package/lib/commonjs/Tick.js +41 -36
  45. package/lib/commonjs/Tick.js.map +1 -1
  46. package/lib/commonjs/defaults.js +20 -19
  47. package/lib/commonjs/defaults.js.map +1 -1
  48. package/lib/commonjs/index.js +287 -1
  49. package/lib/commonjs/index.js.map +1 -1
  50. package/lib/commonjs/presets.js +108 -0
  51. package/lib/commonjs/presets.js.map +1 -0
  52. package/lib/commonjs/tickResolver.js +101 -0
  53. package/lib/commonjs/tickResolver.js.map +1 -0
  54. package/lib/commonjs/useHaptics.js +1 -1
  55. package/lib/commonjs/useHaptics.web.js +43 -0
  56. package/lib/commonjs/useHaptics.web.js.map +1 -0
  57. package/lib/commonjs/useRulerDatePicker.js +264 -0
  58. package/lib/commonjs/useRulerDatePicker.js.map +1 -0
  59. package/lib/commonjs/useRulerDateRangePicker.js +313 -0
  60. package/lib/commonjs/useRulerDateRangePicker.js.map +1 -0
  61. package/lib/commonjs/utils.js +61 -47
  62. package/lib/commonjs/utils.js.map +1 -1
  63. package/lib/module/LensTick.js +77 -0
  64. package/lib/module/LensTick.js.map +1 -0
  65. package/lib/module/Ruler.js +35 -0
  66. package/lib/module/Ruler.js.map +1 -0
  67. package/lib/module/RulerContext.js +12 -0
  68. package/lib/module/RulerContext.js.map +1 -0
  69. package/lib/module/RulerDatePicker.js +38 -350
  70. package/lib/module/RulerDatePicker.js.map +1 -1
  71. package/lib/module/RulerDateRangePicker.js +52 -0
  72. package/lib/module/RulerDateRangePicker.js.map +1 -0
  73. package/lib/module/RulerHeader.js +101 -0
  74. package/lib/module/RulerHeader.js.map +1 -0
  75. package/lib/module/RulerIndicator.js +62 -0
  76. package/lib/module/RulerIndicator.js.map +1 -0
  77. package/lib/module/RulerLensTicks.js +50 -0
  78. package/lib/module/RulerLensTicks.js.map +1 -0
  79. package/lib/module/RulerLensTrack.js +47 -0
  80. package/lib/module/RulerLensTrack.js.map +1 -0
  81. package/lib/module/RulerRange.js +36 -0
  82. package/lib/module/RulerRange.js.map +1 -0
  83. package/lib/module/RulerRangeContext.js +12 -0
  84. package/lib/module/RulerRangeContext.js.map +1 -0
  85. package/lib/module/RulerRangeHeader.js +149 -0
  86. package/lib/module/RulerRangeHeader.js.map +1 -0
  87. package/lib/module/RulerRangeHighlight.js +45 -0
  88. package/lib/module/RulerRangeHighlight.js.map +1 -0
  89. package/lib/module/RulerRangeIndicator.js +66 -0
  90. package/lib/module/RulerRangeIndicator.js.map +1 -0
  91. package/lib/module/RulerRangeRoot.js +75 -0
  92. package/lib/module/RulerRangeRoot.js.map +1 -0
  93. package/lib/module/RulerRangeTicks.js +51 -0
  94. package/lib/module/RulerRangeTicks.js.map +1 -0
  95. package/lib/module/RulerRangeTrack.js +41 -0
  96. package/lib/module/RulerRangeTrack.js.map +1 -0
  97. package/lib/module/RulerResetButton.js +41 -0
  98. package/lib/module/RulerResetButton.js.map +1 -0
  99. package/lib/module/RulerRoot.js +82 -0
  100. package/lib/module/RulerRoot.js.map +1 -0
  101. package/lib/module/RulerTicks.js +45 -0
  102. package/lib/module/RulerTicks.js.map +1 -0
  103. package/lib/module/RulerTrack.js +41 -0
  104. package/lib/module/RulerTrack.js.map +1 -0
  105. package/lib/module/Tick.js +41 -36
  106. package/lib/module/Tick.js.map +1 -1
  107. package/lib/module/defaults.js +19 -18
  108. package/lib/module/defaults.js.map +1 -1
  109. package/lib/module/index.js +46 -1
  110. package/lib/module/index.js.map +1 -1
  111. package/lib/module/presets.js +103 -0
  112. package/lib/module/presets.js.map +1 -0
  113. package/lib/module/tickResolver.js +97 -0
  114. package/lib/module/tickResolver.js.map +1 -0
  115. package/lib/module/useHaptics.js +1 -1
  116. package/lib/module/useHaptics.js.map +1 -1
  117. package/lib/module/useHaptics.web.js +39 -0
  118. package/lib/module/useHaptics.web.js.map +1 -0
  119. package/lib/module/useRulerDatePicker.js +260 -0
  120. package/lib/module/useRulerDatePicker.js.map +1 -0
  121. package/lib/module/useRulerDateRangePicker.js +310 -0
  122. package/lib/module/useRulerDateRangePicker.js.map +1 -0
  123. package/lib/module/utils.js +59 -45
  124. package/lib/module/utils.js.map +1 -1
  125. package/lib/typescript/LensTick.d.ts +20 -0
  126. package/lib/typescript/LensTick.d.ts.map +1 -0
  127. package/lib/typescript/Ruler.d.ts +31 -0
  128. package/lib/typescript/Ruler.d.ts.map +1 -0
  129. package/lib/typescript/RulerContext.d.ts +11 -0
  130. package/lib/typescript/RulerContext.d.ts.map +1 -0
  131. package/lib/typescript/RulerDatePicker.d.ts +10 -7
  132. package/lib/typescript/RulerDatePicker.d.ts.map +1 -1
  133. package/lib/typescript/RulerDateRangePicker.d.ts +26 -0
  134. package/lib/typescript/RulerDateRangePicker.d.ts.map +1 -0
  135. package/lib/typescript/RulerHeader.d.ts +14 -0
  136. package/lib/typescript/RulerHeader.d.ts.map +1 -0
  137. package/lib/typescript/RulerIndicator.d.ts +17 -0
  138. package/lib/typescript/RulerIndicator.d.ts.map +1 -0
  139. package/lib/typescript/RulerLensTicks.d.ts +12 -0
  140. package/lib/typescript/RulerLensTicks.d.ts.map +1 -0
  141. package/lib/typescript/RulerLensTrack.d.ts +13 -0
  142. package/lib/typescript/RulerLensTrack.d.ts.map +1 -0
  143. package/lib/typescript/RulerRange.d.ts +32 -0
  144. package/lib/typescript/RulerRange.d.ts.map +1 -0
  145. package/lib/typescript/RulerRangeContext.d.ts +11 -0
  146. package/lib/typescript/RulerRangeContext.d.ts.map +1 -0
  147. package/lib/typescript/RulerRangeHeader.d.ts +12 -0
  148. package/lib/typescript/RulerRangeHeader.d.ts.map +1 -0
  149. package/lib/typescript/RulerRangeHighlight.d.ts +8 -0
  150. package/lib/typescript/RulerRangeHighlight.d.ts.map +1 -0
  151. package/lib/typescript/RulerRangeIndicator.d.ts +17 -0
  152. package/lib/typescript/RulerRangeIndicator.d.ts.map +1 -0
  153. package/lib/typescript/RulerRangeRoot.d.ts +7 -0
  154. package/lib/typescript/RulerRangeRoot.d.ts.map +1 -0
  155. package/lib/typescript/RulerRangeTicks.d.ts +14 -0
  156. package/lib/typescript/RulerRangeTicks.d.ts.map +1 -0
  157. package/lib/typescript/RulerRangeTrack.d.ts +8 -0
  158. package/lib/typescript/RulerRangeTrack.d.ts.map +1 -0
  159. package/lib/typescript/RulerResetButton.d.ts +10 -0
  160. package/lib/typescript/RulerResetButton.d.ts.map +1 -0
  161. package/lib/typescript/RulerRoot.d.ts +7 -0
  162. package/lib/typescript/RulerRoot.d.ts.map +1 -0
  163. package/lib/typescript/RulerTicks.d.ts +9 -0
  164. package/lib/typescript/RulerTicks.d.ts.map +1 -0
  165. package/lib/typescript/RulerTrack.d.ts +8 -0
  166. package/lib/typescript/RulerTrack.d.ts.map +1 -0
  167. package/lib/typescript/Tick.d.ts +3 -16
  168. package/lib/typescript/Tick.d.ts.map +1 -1
  169. package/lib/typescript/defaults.d.ts +6 -9
  170. package/lib/typescript/defaults.d.ts.map +1 -1
  171. package/lib/typescript/index.d.ts +37 -1
  172. package/lib/typescript/index.d.ts.map +1 -1
  173. package/lib/typescript/presets.d.ts +27 -0
  174. package/lib/typescript/presets.d.ts.map +1 -0
  175. package/lib/typescript/tickResolver.d.ts +10 -0
  176. package/lib/typescript/tickResolver.d.ts.map +1 -0
  177. package/lib/typescript/types.d.ts +302 -85
  178. package/lib/typescript/types.d.ts.map +1 -1
  179. package/lib/typescript/useHaptics.web.d.ts +17 -0
  180. package/lib/typescript/useHaptics.web.d.ts.map +1 -0
  181. package/lib/typescript/useRulerDatePicker.d.ts +26 -0
  182. package/lib/typescript/useRulerDatePicker.d.ts.map +1 -0
  183. package/lib/typescript/useRulerDateRangePicker.d.ts +40 -0
  184. package/lib/typescript/useRulerDateRangePicker.d.ts.map +1 -0
  185. package/lib/typescript/utils.d.ts +14 -12
  186. package/lib/typescript/utils.d.ts.map +1 -1
  187. package/package.json +25 -7
  188. package/src/LensTick.tsx +90 -0
  189. package/src/Ruler.ts +32 -0
  190. package/src/RulerContext.tsx +20 -0
  191. package/src/RulerDatePicker.tsx +41 -439
  192. package/src/RulerDateRangePicker.tsx +53 -0
  193. package/src/RulerHeader.tsx +125 -0
  194. package/src/RulerIndicator.tsx +84 -0
  195. package/src/RulerLensTicks.tsx +50 -0
  196. package/src/RulerLensTrack.tsx +45 -0
  197. package/src/RulerRange.ts +33 -0
  198. package/src/RulerRangeContext.tsx +20 -0
  199. package/src/RulerRangeHeader.tsx +180 -0
  200. package/src/RulerRangeHighlight.tsx +47 -0
  201. package/src/RulerRangeIndicator.tsx +85 -0
  202. package/src/RulerRangeRoot.tsx +87 -0
  203. package/src/RulerRangeTicks.tsx +68 -0
  204. package/src/RulerRangeTrack.tsx +39 -0
  205. package/src/RulerResetButton.tsx +59 -0
  206. package/src/RulerRoot.tsx +93 -0
  207. package/src/RulerTicks.tsx +57 -0
  208. package/src/RulerTrack.tsx +39 -0
  209. package/src/Tick.tsx +60 -49
  210. package/src/defaults.ts +21 -19
  211. package/src/index.ts +83 -1
  212. package/src/presets.ts +108 -0
  213. package/src/tickResolver.ts +123 -0
  214. package/src/types.ts +354 -102
  215. package/src/useHaptics.web.ts +55 -0
  216. package/src/useRulerDatePicker.ts +373 -0
  217. package/src/useRulerDateRangePicker.ts +468 -0
  218. package/src/utils.ts +67 -68
  219. package/lib/commonjs/package.json +0 -1
  220. package/lib/module/package.json +0 -1
@@ -0,0 +1,264 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useRulerDatePicker = useRulerDatePicker;
7
+ var _react = require("react");
8
+ var _reactNative = require("react-native");
9
+ var _reactNativeReanimated = require("react-native-reanimated");
10
+ var _reactNativeGestureHandler = require("react-native-gesture-handler");
11
+ var _defaults = require("./defaults.js");
12
+ var _presets = require("./presets.js");
13
+ var _tickResolver = require("./tickResolver.js");
14
+ var _utils = require("./utils.js");
15
+ var _useHaptics = require("./useHaptics");
16
+ /**
17
+ * Headless Hook encapsulating gesture physics, Reanimated 3 decay/snapping,
18
+ * windowed tick resolution, and haptics for the Ruler Date Picker.
19
+ */
20
+ function useRulerDatePicker(props = {}) {
21
+ const {
22
+ value,
23
+ defaultValue,
24
+ onChange,
25
+ minDate,
26
+ maxDate,
27
+ ticks = 'calendar',
28
+ tickSpacing = _defaults.DEFAULTS.tickSpacing,
29
+ tickWidth = _defaults.DEFAULTS.tickWidth,
30
+ rulerHeight = _defaults.DEFAULTS.rulerHeight,
31
+ theme: propTheme,
32
+ debounceMs = _defaults.DEFAULTS.debounceMs,
33
+ haptics = true,
34
+ style
35
+ } = props;
36
+ const bufferTicks = _defaults.DEFAULTS.bufferTicks;
37
+ const isHapticsEnabled = typeof haptics === 'boolean' ? haptics : haptics?.enabled ?? true;
38
+ const resolvedHapticTrigger = typeof haptics === 'object' ? haptics.onTrigger : undefined;
39
+ const fastSwipeTickThreshold = (typeof haptics === 'object' ? haptics.fastSwipeTickThreshold : undefined) ?? _defaults.DEFAULTS.fastSwipeTickThreshold;
40
+ const continuousHapticIntervalMs = (typeof haptics === 'object' ? haptics.continuousHapticIntervalMs : undefined) ?? _defaults.DEFAULTS.continuousHapticIntervalMs;
41
+ const height = style?.height ?? _defaults.DEFAULTS.height;
42
+
43
+ // ── Resolved Theme ────────────────────────────────────────────────────────
44
+ const theme = (0, _utils.useResolvedTheme)(propTheme);
45
+
46
+ // ── Resolved Rules ────────────────────────────────────────────────────────
47
+ const rules = (0, _react.useMemo)(() => (0, _presets.resolveTickRules)(ticks), [ticks]);
48
+
49
+ // ── Haptics ───────────────────────────────────────────────────────────────
50
+ const {
51
+ fireDiscreteHaptic,
52
+ startContinuousHaptic,
53
+ stopContinuousHaptic
54
+ } = (0, _useHaptics.useHaptics)({
55
+ enableHaptics: isHapticsEnabled,
56
+ onHapticTrigger: resolvedHapticTrigger,
57
+ continuousHapticIntervalMs
58
+ });
59
+
60
+ // ── Reference Time (Midnight Today) ───────────────────────────────────────
61
+ const todayTime = (0, _react.useMemo)(() => {
62
+ const d = new Date();
63
+ d.setHours(0, 0, 0, 0);
64
+ return d.getTime();
65
+ }, []);
66
+
67
+ // ── Bounds ────────────────────────────────────────────────────────────────
68
+ const {
69
+ minOffset,
70
+ maxOffset
71
+ } = (0, _react.useMemo)(() => (0, _utils.computeDayRange)(todayTime, minDate, maxDate), [todayTime, minDate, maxDate]);
72
+
73
+ // ── Initial Date Calculation ──────────────────────────────────────────────
74
+ const initialDate = (0, _react.useMemo)(() => {
75
+ return (0, _utils.normalizeDate)(value ?? defaultValue ?? new Date());
76
+ // eslint-disable-next-line react-hooks/exhaustive-deps
77
+ }, []);
78
+ const initialOffsetDays = (0, _react.useMemo)(() => {
79
+ return (0, _utils.dateToDayOffset)(initialDate, todayTime);
80
+ // eslint-disable-next-line react-hooks/exhaustive-deps
81
+ }, []);
82
+
83
+ // ── Animated Values ───────────────────────────────────────────────────────
84
+ const translateX = (0, _reactNativeReanimated.useSharedValue)(-initialOffsetDays * tickSpacing);
85
+ const contextX = (0, _reactNativeReanimated.useSharedValue)(0);
86
+ const previousIndex = (0, _reactNativeReanimated.useSharedValue)(-initialOffsetDays);
87
+ const isFastMode = (0, _reactNativeReanimated.useSharedValue)(false);
88
+
89
+ // ── State ─────────────────────────────────────────────────────────────────
90
+ const [selectedDate, setSelectedDate] = (0, _react.useState)(initialDate);
91
+ const [selectedDateStr, setSelectedDateStr] = (0, _react.useState)((0, _utils.formatDateString)(initialDate));
92
+ const [windowCenter, setWindowCenter] = (0, _react.useState)(-initialOffsetDays);
93
+ const debounceTimerRef = (0, _react.useRef)(null);
94
+ const windowDimensions = (0, _reactNative.useWindowDimensions)();
95
+ const width = props.width ?? windowDimensions.width;
96
+ const halfVisible = Math.ceil(width / 2 / tickSpacing);
97
+ const windowSize = halfVisible + bufferTicks;
98
+
99
+ // ── Visible Ticks Resolution ──────────────────────────────────────────────
100
+ const visibleTicks = (0, _react.useMemo)(() => {
101
+ const resolved = [];
102
+ const start = Math.max(windowCenter - windowSize, minOffset);
103
+ const end = Math.min(windowCenter + windowSize, maxOffset);
104
+ for (let i = start; i <= end; i++) {
105
+ const d = (0, _utils.dayOffsetToDate)(i, todayTime);
106
+ const isToday = i === 0;
107
+ const isSelected = (0, _utils.formatDateString)(d) === selectedDateStr;
108
+ resolved.push((0, _tickResolver.resolveTick)({
109
+ date: d,
110
+ offset: i,
111
+ isToday,
112
+ isSelected
113
+ }, rules, theme, tickWidth));
114
+ }
115
+ return resolved;
116
+ }, [windowCenter, windowSize, minOffset, maxOffset, todayTime, selectedDateStr, rules, theme, tickWidth]);
117
+
118
+ // ── Tick Changed Callback ─────────────────────────────────────────────────
119
+ const onTickChanged = (0, _react.useCallback)((index, enteringFastMode) => {
120
+ if (enteringFastMode) {
121
+ startContinuousHaptic();
122
+ } else {
123
+ stopContinuousHaptic();
124
+ fireDiscreteHaptic();
125
+ }
126
+ const d = (0, _utils.dayOffsetToDate)(index, todayTime);
127
+ const dateStr = (0, _utils.formatDateString)(d);
128
+ setSelectedDate(d);
129
+ setSelectedDateStr(dateStr);
130
+ setWindowCenter(prev => {
131
+ if (Math.abs(index - prev) >= 5) {
132
+ return index;
133
+ }
134
+ return prev;
135
+ });
136
+ if (debounceTimerRef.current) {
137
+ clearTimeout(debounceTimerRef.current);
138
+ }
139
+ debounceTimerRef.current = setTimeout(() => {
140
+ onChange?.(d, dateStr);
141
+ }, debounceMs);
142
+ }, [todayTime, onChange, debounceMs, startContinuousHaptic, stopContinuousHaptic, fireDiscreteHaptic]);
143
+
144
+ // ── Animation Settled Callback ────────────────────────────────────────────
145
+ const onAnimationSettled = (0, _react.useCallback)(index => {
146
+ stopContinuousHaptic();
147
+ fireDiscreteHaptic();
148
+ const d = (0, _utils.dayOffsetToDate)(index, todayTime);
149
+ const dateStr = (0, _utils.formatDateString)(d);
150
+ setSelectedDate(d);
151
+ setSelectedDateStr(dateStr);
152
+ setWindowCenter(index);
153
+ onChange?.(d, dateStr);
154
+ }, [todayTime, onChange, stopContinuousHaptic, fireDiscreteHaptic]);
155
+
156
+ // ── Animated Reaction ─────────────────────────────────────────────────────
157
+ (0, _reactNativeReanimated.useAnimatedReaction)(() => Math.round(-translateX.value / tickSpacing), (index, prev) => {
158
+ if (index !== prev && index >= minOffset && index <= maxOffset) {
159
+ previousIndex.value = index;
160
+ const ticksSkipped = prev !== null ? Math.abs(index - prev) : 1;
161
+ const shouldBeFast = ticksSkipped > fastSwipeTickThreshold;
162
+ if (shouldBeFast && !isFastMode.value) {
163
+ isFastMode.value = true;
164
+ (0, _reactNativeReanimated.runOnJS)(onTickChanged)(index, true);
165
+ } else if (!shouldBeFast && isFastMode.value) {
166
+ isFastMode.value = false;
167
+ (0, _reactNativeReanimated.runOnJS)(onTickChanged)(index, false);
168
+ } else if (!shouldBeFast) {
169
+ (0, _reactNativeReanimated.runOnJS)(onTickChanged)(index, false);
170
+ }
171
+ if (shouldBeFast && isFastMode.value) {
172
+ (0, _reactNativeReanimated.runOnJS)(onTickChanged)(index, true);
173
+ }
174
+ }
175
+ }, [tickSpacing, minOffset, maxOffset, fastSwipeTickThreshold]);
176
+
177
+ // ── Pan Gesture ───────────────────────────────────────────────────────────
178
+ const panGesture = (0, _react.useMemo)(() => {
179
+ return _reactNativeGestureHandler.Gesture.Pan().onStart(() => {
180
+ contextX.value = translateX.value;
181
+ }).onUpdate(event => {
182
+ translateX.value = contextX.value + event.translationX;
183
+ }).onEnd(event => {
184
+ translateX.value = (0, _reactNativeReanimated.withDecay)({
185
+ velocity: event.velocityX,
186
+ deceleration: 0.99
187
+ }, finished => {
188
+ if (finished) {
189
+ const maxTranslateX = -minOffset * tickSpacing;
190
+ const minTranslateX = -maxOffset * tickSpacing;
191
+ const clampedX = Math.min(Math.max(translateX.value, minTranslateX), maxTranslateX);
192
+ const snappedIndex = Math.round(clampedX / tickSpacing);
193
+ const snappedX = snappedIndex * tickSpacing;
194
+ translateX.value = (0, _reactNativeReanimated.withTiming)(snappedX, {
195
+ duration: 150
196
+ }, done => {
197
+ if (done) {
198
+ isFastMode.value = false;
199
+ const index = Math.round(-snappedX / tickSpacing);
200
+ (0, _reactNativeReanimated.runOnJS)(onAnimationSettled)(index);
201
+ }
202
+ });
203
+ }
204
+ });
205
+ });
206
+ }, [contextX, translateX, minOffset, maxOffset, tickSpacing, onAnimationSettled, isFastMode]);
207
+
208
+ // ── Programmatic Control ──────────────────────────────────────────────────
209
+ const scrollToDate = (0, _react.useCallback)((targetDate, animated = true) => {
210
+ const d = (0, _utils.normalizeDate)(targetDate);
211
+ const offset = (0, _utils.dateToDayOffset)(d, todayTime);
212
+ const clampedOffset = Math.max(minOffset, Math.min(offset, maxOffset));
213
+ const targetX = -clampedOffset * tickSpacing;
214
+ stopContinuousHaptic();
215
+ if (animated) {
216
+ translateX.value = (0, _reactNativeReanimated.withTiming)(targetX, {
217
+ duration: 250
218
+ }, done => {
219
+ if (done) {
220
+ (0, _reactNativeReanimated.runOnJS)(onAnimationSettled)(clampedOffset);
221
+ }
222
+ });
223
+ } else {
224
+ translateX.value = targetX;
225
+ onAnimationSettled(clampedOffset);
226
+ }
227
+ }, [todayTime, minOffset, maxOffset, tickSpacing, translateX, stopContinuousHaptic, onAnimationSettled]);
228
+ const resetToToday = (0, _react.useCallback)((animated = true) => {
229
+ scrollToDate(new Date(todayTime), animated);
230
+ }, [scrollToDate, todayTime]);
231
+
232
+ // ── Sync with external controlled value ───────────────────────────────────
233
+ const prevValuePropRef = (0, _react.useRef)(value);
234
+ (0, _react.useEffect)(() => {
235
+ if (value !== undefined && value !== prevValuePropRef.current) {
236
+ prevValuePropRef.current = value;
237
+ const target = (0, _utils.normalizeDate)(value);
238
+ if ((0, _utils.formatDateString)(target) !== (0, _utils.formatDateString)(selectedDate)) {
239
+ scrollToDate(target, true);
240
+ }
241
+ }
242
+ }, [value, selectedDate, scrollToDate]);
243
+ const isTodaySelected = (0, _react.useMemo)(() => {
244
+ return selectedDateStr === (0, _utils.formatDateString)(new Date(todayTime));
245
+ }, [selectedDateStr, todayTime]);
246
+ return {
247
+ translateX,
248
+ panGesture,
249
+ selectedDate,
250
+ selectedDateStr,
251
+ isTodaySelected,
252
+ visibleTicks,
253
+ theme,
254
+ tickSpacing,
255
+ rulerHeight,
256
+ height,
257
+ width,
258
+ minOffset,
259
+ maxOffset,
260
+ scrollToDate,
261
+ resetToToday
262
+ };
263
+ }
264
+ //# sourceMappingURL=useRulerDatePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","require","_reactNative","_reactNativeReanimated","_reactNativeGestureHandler","_defaults","_presets","_tickResolver","_utils","_useHaptics","useRulerDatePicker","props","value","defaultValue","onChange","minDate","maxDate","ticks","tickSpacing","DEFAULTS","tickWidth","rulerHeight","theme","propTheme","debounceMs","haptics","style","bufferTicks","isHapticsEnabled","enabled","resolvedHapticTrigger","onTrigger","undefined","fastSwipeTickThreshold","continuousHapticIntervalMs","height","useResolvedTheme","rules","useMemo","resolveTickRules","fireDiscreteHaptic","startContinuousHaptic","stopContinuousHaptic","useHaptics","enableHaptics","onHapticTrigger","todayTime","d","Date","setHours","getTime","minOffset","maxOffset","computeDayRange","initialDate","normalizeDate","initialOffsetDays","dateToDayOffset","translateX","useSharedValue","contextX","previousIndex","isFastMode","selectedDate","setSelectedDate","useState","selectedDateStr","setSelectedDateStr","formatDateString","windowCenter","setWindowCenter","debounceTimerRef","useRef","windowDimensions","useWindowDimensions","width","halfVisible","Math","ceil","windowSize","visibleTicks","resolved","start","max","end","min","i","dayOffsetToDate","isToday","isSelected","push","resolveTick","date","offset","onTickChanged","useCallback","index","enteringFastMode","dateStr","prev","abs","current","clearTimeout","setTimeout","onAnimationSettled","useAnimatedReaction","round","ticksSkipped","shouldBeFast","runOnJS","panGesture","Gesture","Pan","onStart","onUpdate","event","translationX","onEnd","withDecay","velocity","velocityX","deceleration","finished","maxTranslateX","minTranslateX","clampedX","snappedIndex","snappedX","withTiming","duration","done","scrollToDate","targetDate","animated","clampedOffset","targetX","resetToToday","prevValuePropRef","useEffect","target","isTodaySelected"],"sourceRoot":"../../src","sources":["useRulerDatePicker.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,313 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useRulerDateRangePicker = useRulerDateRangePicker;
7
+ var _react = require("react");
8
+ var _reactNative = require("react-native");
9
+ var _reactNativeReanimated = require("react-native-reanimated");
10
+ var _reactNativeGestureHandler = require("react-native-gesture-handler");
11
+ var _defaults = require("./defaults.js");
12
+ var _presets = require("./presets.js");
13
+ var _tickResolver = require("./tickResolver.js");
14
+ var _utils = require("./utils.js");
15
+ var _useHaptics = require("./useHaptics");
16
+ /**
17
+ * Return interface for the `useRulerDateRangePicker` headless hook.
18
+ *
19
+ * @experimental
20
+ */
21
+
22
+ /**
23
+ * Headless Hook for managing Date Range selection with dual pins,
24
+ * range highlight calculations, and Reanimated 3 physics.
25
+ *
26
+ * @experimental This hook is experimental and subject to breaking changes
27
+ * in future minor versions.
28
+ */
29
+ function useRulerDateRangePicker(props = {}) {
30
+ const {
31
+ value,
32
+ defaultValue,
33
+ onChange,
34
+ minDate,
35
+ maxDate,
36
+ ticks = 'calendar',
37
+ tickSpacing = _defaults.DEFAULTS.tickSpacing,
38
+ tickWidth = _defaults.DEFAULTS.tickWidth,
39
+ rulerHeight = _defaults.DEFAULTS.rulerHeight,
40
+ theme: propTheme,
41
+ debounceMs = _defaults.DEFAULTS.debounceMs,
42
+ haptics = true,
43
+ minSpanDays = 1,
44
+ maxSpanDays,
45
+ style
46
+ } = props;
47
+ const bufferTicks = _defaults.DEFAULTS.bufferTicks;
48
+ const isHapticsEnabled = typeof haptics === 'boolean' ? haptics : haptics?.enabled ?? true;
49
+ const resolvedHapticTrigger = typeof haptics === 'object' ? haptics.onTrigger : undefined;
50
+ const fastSwipeTickThreshold = (typeof haptics === 'object' ? haptics.fastSwipeTickThreshold : undefined) ?? _defaults.DEFAULTS.fastSwipeTickThreshold;
51
+ const continuousHapticIntervalMs = (typeof haptics === 'object' ? haptics.continuousHapticIntervalMs : undefined) ?? _defaults.DEFAULTS.continuousHapticIntervalMs;
52
+ const height = style?.height ?? _defaults.DEFAULTS.height;
53
+ const theme = (0, _utils.useResolvedTheme)(propTheme);
54
+ const rules = (0, _react.useMemo)(() => (0, _presets.resolveTickRules)(ticks), [ticks]);
55
+ const {
56
+ fireDiscreteHaptic,
57
+ startContinuousHaptic,
58
+ stopContinuousHaptic
59
+ } = (0, _useHaptics.useHaptics)({
60
+ enableHaptics: isHapticsEnabled,
61
+ onHapticTrigger: resolvedHapticTrigger,
62
+ continuousHapticIntervalMs
63
+ });
64
+ const todayTime = (0, _react.useMemo)(() => {
65
+ const d = new Date();
66
+ d.setHours(0, 0, 0, 0);
67
+ return d.getTime();
68
+ }, []);
69
+ const {
70
+ minOffset,
71
+ maxOffset
72
+ } = (0, _react.useMemo)(() => (0, _utils.computeDayRange)(todayTime, minDate, maxDate), [todayTime, minDate, maxDate]);
73
+
74
+ // ── Initial Dates ─────────────────────────────────────────────────────────
75
+ const initialStartDate = (0, _react.useMemo)(() => {
76
+ if (value?.start) return (0, _utils.normalizeDate)(value.start);
77
+ if (defaultValue?.start) return (0, _utils.normalizeDate)(defaultValue.start);
78
+ return new Date(todayTime);
79
+ // eslint-disable-next-line react-hooks/exhaustive-deps
80
+ }, []);
81
+ const initialEndDate = (0, _react.useMemo)(() => {
82
+ if (value?.end) return (0, _utils.normalizeDate)(value.end);
83
+ if (defaultValue?.end) return (0, _utils.normalizeDate)(defaultValue.end);
84
+ const end = new Date(todayTime);
85
+ end.setDate(end.getDate() + 7);
86
+ return end;
87
+ // eslint-disable-next-line react-hooks/exhaustive-deps
88
+ }, []);
89
+ const [activeHandle, setActiveHandle] = (0, _react.useState)('start');
90
+ const [startDate, setStartDate] = (0, _react.useState)(initialStartDate);
91
+ const [endDate, setEndDate] = (0, _react.useState)(initialEndDate);
92
+ const startOffset = (0, _react.useMemo)(() => (0, _utils.dateToDayOffset)(startDate, todayTime), [startDate, todayTime]);
93
+ const endOffset = (0, _react.useMemo)(() => (0, _utils.dateToDayOffset)(endDate, todayTime), [endDate, todayTime]);
94
+ const activeOffset = activeHandle === 'start' ? startOffset : endOffset;
95
+
96
+ // ── Shared Values ─────────────────────────────────────────────────────────
97
+ const translateX = (0, _reactNativeReanimated.useSharedValue)(-activeOffset * tickSpacing);
98
+ const contextX = (0, _reactNativeReanimated.useSharedValue)(0);
99
+ const previousIndex = (0, _reactNativeReanimated.useSharedValue)(-activeOffset);
100
+ const isFastMode = (0, _reactNativeReanimated.useSharedValue)(false);
101
+ const [windowCenter, setWindowCenter] = (0, _react.useState)(-activeOffset);
102
+ const debounceTimerRef = (0, _react.useRef)(null);
103
+ const windowDimensions = (0, _reactNative.useWindowDimensions)();
104
+ const width = props.width ?? windowDimensions.width;
105
+ const halfVisible = Math.ceil(width / 2 / tickSpacing);
106
+ const windowSize = halfVisible + bufferTicks;
107
+
108
+ // ── Visible Ticks Resolution ──────────────────────────────────────────────
109
+ const visibleTicks = (0, _react.useMemo)(() => {
110
+ const resolved = [];
111
+ const start = Math.max(windowCenter - windowSize, minOffset);
112
+ const end = Math.min(windowCenter + windowSize, maxOffset);
113
+ for (let i = start; i <= end; i++) {
114
+ const d = (0, _utils.dayOffsetToDate)(i, todayTime);
115
+ const isToday = i === 0;
116
+ const isSelected = i === startOffset || i === endOffset;
117
+ const isInRange = i >= startOffset && i <= endOffset;
118
+ resolved.push((0, _tickResolver.resolveTick)({
119
+ date: d,
120
+ offset: i,
121
+ isToday,
122
+ isSelected,
123
+ isInRange
124
+ }, rules, theme, tickWidth));
125
+ }
126
+ return resolved;
127
+ }, [windowCenter, windowSize, minOffset, maxOffset, todayTime, startOffset, endOffset, rules, theme, tickWidth]);
128
+
129
+ // ── Notify Change ─────────────────────────────────────────────────────────
130
+ const emitChange = (0, _react.useCallback)((newStart, newEnd) => {
131
+ const spanDays = Math.round((newEnd.getTime() - newStart.getTime()) / (1000 * 60 * 60 * 24));
132
+ const payload = {
133
+ start: newStart,
134
+ end: newEnd,
135
+ startDate: newStart,
136
+ endDate: newEnd,
137
+ startString: (0, _utils.formatDateString)(newStart),
138
+ endString: (0, _utils.formatDateString)(newEnd),
139
+ spanDays
140
+ };
141
+ onChange?.(payload);
142
+ }, [onChange]);
143
+
144
+ // ── Tick Changed Callback ─────────────────────────────────────────────────
145
+ const onTickChanged = (0, _react.useCallback)((index, enteringFastMode) => {
146
+ if (enteringFastMode) {
147
+ startContinuousHaptic();
148
+ } else {
149
+ stopContinuousHaptic();
150
+ fireDiscreteHaptic();
151
+ }
152
+ setWindowCenter(prev => {
153
+ if (Math.abs(index - prev) >= 5) {
154
+ return index;
155
+ }
156
+ return prev;
157
+ });
158
+ const targetDate = (0, _utils.dayOffsetToDate)(index, todayTime);
159
+ if (activeHandle === 'start') {
160
+ const clampedIndex = Math.min(index, endOffset - minSpanDays);
161
+ const validStart = (0, _utils.dayOffsetToDate)(clampedIndex, todayTime);
162
+ setStartDate(validStart);
163
+ if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current);
164
+ debounceTimerRef.current = setTimeout(() => {
165
+ emitChange(validStart, endDate);
166
+ }, debounceMs);
167
+ } else {
168
+ const clampedIndex = Math.max(index, startOffset + minSpanDays);
169
+ const validEnd = (0, _utils.dayOffsetToDate)(clampedIndex, todayTime);
170
+ setEndDate(validEnd);
171
+ if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current);
172
+ debounceTimerRef.current = setTimeout(() => {
173
+ emitChange(startDate, validEnd);
174
+ }, debounceMs);
175
+ }
176
+ }, [activeHandle, endOffset, startOffset, minSpanDays, todayTime, endDate, startDate, emitChange, debounceMs, startContinuousHaptic, stopContinuousHaptic, fireDiscreteHaptic]);
177
+
178
+ // ── Animation Settled Callback ────────────────────────────────────────────
179
+ const onAnimationSettled = (0, _react.useCallback)(index => {
180
+ stopContinuousHaptic();
181
+ fireDiscreteHaptic();
182
+ setWindowCenter(index);
183
+ if (activeHandle === 'start') {
184
+ const clampedIndex = Math.min(index, endOffset - minSpanDays);
185
+ const validStart = (0, _utils.dayOffsetToDate)(clampedIndex, todayTime);
186
+ setStartDate(validStart);
187
+ emitChange(validStart, endDate);
188
+ } else {
189
+ const clampedIndex = Math.max(index, startOffset + minSpanDays);
190
+ const validEnd = (0, _utils.dayOffsetToDate)(clampedIndex, todayTime);
191
+ setEndDate(validEnd);
192
+ emitChange(startDate, validEnd);
193
+ }
194
+ }, [activeHandle, endOffset, startOffset, minSpanDays, todayTime, endDate, startDate, emitChange, stopContinuousHaptic, fireDiscreteHaptic]);
195
+
196
+ // ── Animated Reaction ─────────────────────────────────────────────────────
197
+ (0, _reactNativeReanimated.useAnimatedReaction)(() => Math.round(-translateX.value / tickSpacing), (index, prev) => {
198
+ if (index !== prev && index >= minOffset && index <= maxOffset) {
199
+ previousIndex.value = index;
200
+ const ticksSkipped = prev !== null ? Math.abs(index - prev) : 1;
201
+ const shouldBeFast = ticksSkipped > fastSwipeTickThreshold;
202
+ if (shouldBeFast && !isFastMode.value) {
203
+ isFastMode.value = true;
204
+ (0, _reactNativeReanimated.runOnJS)(onTickChanged)(index, true);
205
+ } else if (!shouldBeFast && isFastMode.value) {
206
+ isFastMode.value = false;
207
+ (0, _reactNativeReanimated.runOnJS)(onTickChanged)(index, false);
208
+ } else if (!shouldBeFast) {
209
+ (0, _reactNativeReanimated.runOnJS)(onTickChanged)(index, false);
210
+ }
211
+ if (shouldBeFast && isFastMode.value) {
212
+ (0, _reactNativeReanimated.runOnJS)(onTickChanged)(index, true);
213
+ }
214
+ }
215
+ }, [tickSpacing, minOffset, maxOffset, fastSwipeTickThreshold]);
216
+
217
+ // ── Pan Gesture ───────────────────────────────────────────────────────────
218
+ const panGesture = (0, _react.useMemo)(() => {
219
+ return _reactNativeGestureHandler.Gesture.Pan().onStart(() => {
220
+ contextX.value = translateX.value;
221
+ }).onUpdate(event => {
222
+ translateX.value = contextX.value + event.translationX;
223
+ }).onEnd(event => {
224
+ translateX.value = (0, _reactNativeReanimated.withDecay)({
225
+ velocity: event.velocityX,
226
+ deceleration: 0.99
227
+ }, finished => {
228
+ if (finished) {
229
+ const maxTranslateX = -minOffset * tickSpacing;
230
+ const minTranslateX = -maxOffset * tickSpacing;
231
+ const clampedX = Math.min(Math.max(translateX.value, minTranslateX), maxTranslateX);
232
+ const snappedIndex = Math.round(clampedX / tickSpacing);
233
+ const snappedX = snappedIndex * tickSpacing;
234
+ translateX.value = (0, _reactNativeReanimated.withTiming)(snappedX, {
235
+ duration: 150
236
+ }, done => {
237
+ if (done) {
238
+ isFastMode.value = false;
239
+ const index = Math.round(-snappedX / tickSpacing);
240
+ (0, _reactNativeReanimated.runOnJS)(onAnimationSettled)(index);
241
+ }
242
+ });
243
+ }
244
+ });
245
+ });
246
+ }, [contextX, translateX, minOffset, maxOffset, tickSpacing, onAnimationSettled, isFastMode]);
247
+
248
+ // ── Switch Active Handle ──────────────────────────────────────────────────
249
+ const scrollToHandle = (0, _react.useCallback)((handle, animated = true) => {
250
+ setActiveHandle(handle);
251
+ const targetOffset = handle === 'start' ? startOffset : endOffset;
252
+ const targetX = -targetOffset * tickSpacing;
253
+ stopContinuousHaptic();
254
+ if (animated) {
255
+ translateX.value = (0, _reactNativeReanimated.withTiming)(targetX, {
256
+ duration: 250
257
+ }, done => {
258
+ if (done) {
259
+ (0, _reactNativeReanimated.runOnJS)(setWindowCenter)(targetOffset);
260
+ }
261
+ });
262
+ } else {
263
+ translateX.value = targetX;
264
+ setWindowCenter(targetOffset);
265
+ }
266
+ }, [startOffset, endOffset, tickSpacing, translateX, stopContinuousHaptic]);
267
+ const setRange = (0, _react.useCallback)((startInput, endInput) => {
268
+ const s = (0, _utils.normalizeDate)(startInput);
269
+ const e = (0, _utils.normalizeDate)(endInput);
270
+ setStartDate(s);
271
+ setEndDate(e);
272
+ emitChange(s, e);
273
+ }, [emitChange]);
274
+
275
+ // Sync external controlled range
276
+ const prevRangePropRef = (0, _react.useRef)(value);
277
+ (0, _react.useEffect)(() => {
278
+ if (value?.start && value?.end && (value.start !== prevRangePropRef.current?.start || value.end !== prevRangePropRef.current?.end)) {
279
+ prevRangePropRef.current = value;
280
+ const s = (0, _utils.normalizeDate)(value.start);
281
+ const e = (0, _utils.normalizeDate)(value.end);
282
+ if ((0, _utils.formatDateString)(s) !== (0, _utils.formatDateString)(startDate) || (0, _utils.formatDateString)(e) !== (0, _utils.formatDateString)(endDate)) {
283
+ setStartDate(s);
284
+ setEndDate(e);
285
+ }
286
+ }
287
+ }, [value, startDate, endDate]);
288
+ const spanDays = Math.max(0, endOffset - startOffset);
289
+ return {
290
+ translateX,
291
+ panGesture,
292
+ startDate,
293
+ endDate,
294
+ startDateStr: (0, _utils.formatDateString)(startDate),
295
+ endDateStr: (0, _utils.formatDateString)(endDate),
296
+ startOffset,
297
+ endOffset,
298
+ spanDays,
299
+ activeHandle,
300
+ setActiveHandle,
301
+ visibleTicks,
302
+ theme,
303
+ tickSpacing,
304
+ rulerHeight,
305
+ height,
306
+ width,
307
+ minOffset,
308
+ maxOffset,
309
+ scrollToHandle,
310
+ setRange
311
+ };
312
+ }
313
+ //# sourceMappingURL=useRulerDateRangePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","require","_reactNative","_reactNativeReanimated","_reactNativeGestureHandler","_defaults","_presets","_tickResolver","_utils","_useHaptics","useRulerDateRangePicker","props","value","defaultValue","onChange","minDate","maxDate","ticks","tickSpacing","DEFAULTS","tickWidth","rulerHeight","theme","propTheme","debounceMs","haptics","minSpanDays","maxSpanDays","style","bufferTicks","isHapticsEnabled","enabled","resolvedHapticTrigger","onTrigger","undefined","fastSwipeTickThreshold","continuousHapticIntervalMs","height","useResolvedTheme","rules","useMemo","resolveTickRules","fireDiscreteHaptic","startContinuousHaptic","stopContinuousHaptic","useHaptics","enableHaptics","onHapticTrigger","todayTime","d","Date","setHours","getTime","minOffset","maxOffset","computeDayRange","initialStartDate","start","normalizeDate","initialEndDate","end","setDate","getDate","activeHandle","setActiveHandle","useState","startDate","setStartDate","endDate","setEndDate","startOffset","dateToDayOffset","endOffset","activeOffset","translateX","useSharedValue","contextX","previousIndex","isFastMode","windowCenter","setWindowCenter","debounceTimerRef","useRef","windowDimensions","useWindowDimensions","width","halfVisible","Math","ceil","windowSize","visibleTicks","resolved","max","min","i","dayOffsetToDate","isToday","isSelected","isInRange","push","resolveTick","date","offset","emitChange","useCallback","newStart","newEnd","spanDays","round","payload","startString","formatDateString","endString","onTickChanged","index","enteringFastMode","prev","abs","targetDate","clampedIndex","validStart","current","clearTimeout","setTimeout","validEnd","onAnimationSettled","useAnimatedReaction","ticksSkipped","shouldBeFast","runOnJS","panGesture","Gesture","Pan","onStart","onUpdate","event","translationX","onEnd","withDecay","velocity","velocityX","deceleration","finished","maxTranslateX","minTranslateX","clampedX","snappedIndex","snappedX","withTiming","duration","done","scrollToHandle","handle","animated","targetOffset","targetX","setRange","startInput","endInput","s","e","prevRangePropRef","useEffect","startDateStr","endDateStr"],"sourceRoot":"../../src","sources":["useRulerDateRangePicker.ts"],"mappings":"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","ignoreList":[]}