react-native-ruler-date-picker 0.1.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 (54) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +124 -0
  3. package/lib/commonjs/RulerDatePicker.js +376 -0
  4. package/lib/commonjs/RulerDatePicker.js.map +1 -0
  5. package/lib/commonjs/Tick.js +79 -0
  6. package/lib/commonjs/Tick.js.map +1 -0
  7. package/lib/commonjs/defaults.js +48 -0
  8. package/lib/commonjs/defaults.js.map +1 -0
  9. package/lib/commonjs/index.js +13 -0
  10. package/lib/commonjs/index.js.map +1 -0
  11. package/lib/commonjs/package.json +1 -0
  12. package/lib/commonjs/types.js +6 -0
  13. package/lib/commonjs/types.js.map +1 -0
  14. package/lib/commonjs/useHaptics.js +83 -0
  15. package/lib/commonjs/useHaptics.js.map +1 -0
  16. package/lib/commonjs/utils.js +99 -0
  17. package/lib/commonjs/utils.js.map +1 -0
  18. package/lib/module/RulerDatePicker.js +371 -0
  19. package/lib/module/RulerDatePicker.js.map +1 -0
  20. package/lib/module/Tick.js +74 -0
  21. package/lib/module/Tick.js.map +1 -0
  22. package/lib/module/defaults.js +44 -0
  23. package/lib/module/defaults.js.map +1 -0
  24. package/lib/module/index.js +4 -0
  25. package/lib/module/index.js.map +1 -0
  26. package/lib/module/package.json +1 -0
  27. package/lib/module/types.js +4 -0
  28. package/lib/module/types.js.map +1 -0
  29. package/lib/module/useHaptics.js +80 -0
  30. package/lib/module/useHaptics.js.map +1 -0
  31. package/lib/module/utils.js +90 -0
  32. package/lib/module/utils.js.map +1 -0
  33. package/lib/typescript/RulerDatePicker.d.ts +21 -0
  34. package/lib/typescript/RulerDatePicker.d.ts.map +1 -0
  35. package/lib/typescript/Tick.d.ts +26 -0
  36. package/lib/typescript/Tick.d.ts.map +1 -0
  37. package/lib/typescript/defaults.d.ts +24 -0
  38. package/lib/typescript/defaults.d.ts.map +1 -0
  39. package/lib/typescript/index.d.ts +3 -0
  40. package/lib/typescript/index.d.ts.map +1 -0
  41. package/lib/typescript/types.d.ts +104 -0
  42. package/lib/typescript/types.d.ts.map +1 -0
  43. package/lib/typescript/useHaptics.d.ts +20 -0
  44. package/lib/typescript/useHaptics.d.ts.map +1 -0
  45. package/lib/typescript/utils.d.ts +31 -0
  46. package/lib/typescript/utils.d.ts.map +1 -0
  47. package/package.json +106 -0
  48. package/src/RulerDatePicker.tsx +462 -0
  49. package/src/Tick.tsx +104 -0
  50. package/src/defaults.ts +44 -0
  51. package/src/index.ts +2 -0
  52. package/src/types.ts +129 -0
  53. package/src/useHaptics.ts +107 -0
  54. package/src/utils.ts +115 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Rehman
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,124 @@
1
+ # react-native-ruler-date-picker
2
+
3
+ A performant, customizable ruler-style date picker for React Native.
4
+
5
+ <!-- TODO: Add hero GIF/video here -->
6
+
7
+ ## ✨ Features
8
+
9
+ - **60 FPS Physics** — Reanimated 3 decay animations with snap-to-tick alignment
10
+ - **Dual-Speed Haptics** — Discrete ticks at slow scroll, continuous buzz at fast swipe
11
+ - **Windowed Rendering** — Only renders visible ticks + buffer for memory efficiency
12
+ - **Fully Customizable** — Every dimension, color, and behavior is configurable via props
13
+ - **Graceful Haptics** — Works with `expo-haptics`, custom handlers, or silently without either
14
+ - **Dark Mode Support** — Auto-detects system color scheme with manual override
15
+
16
+ ## 📦 Installation
17
+
18
+ ```bash
19
+ npm install react-native-ruler-date-picker
20
+ # or
21
+ yarn add react-native-ruler-date-picker
22
+ # or
23
+ pnpm add react-native-ruler-date-picker
24
+ ```
25
+
26
+ ### Peer Dependencies
27
+
28
+ Make sure you have these installed in your project:
29
+
30
+ ```bash
31
+ npm install react-native-reanimated react-native-gesture-handler
32
+ ```
33
+
34
+ Optional (for haptic feedback):
35
+
36
+ ```bash
37
+ npx expo install expo-haptics
38
+ ```
39
+
40
+ ## 🚀 Quick Start
41
+
42
+ ```tsx
43
+ import { RulerDatePicker } from 'react-native-ruler-date-picker';
44
+
45
+ export default function App() {
46
+ const [date, setDate] = useState(new Date());
47
+
48
+ return (
49
+ <RulerDatePicker
50
+ selectedDate={date}
51
+ onSelectDate={(newDate, dateString) => {
52
+ setDate(newDate);
53
+ console.log('Selected:', dateString); // "2026-08-07"
54
+ }}
55
+ />
56
+ );
57
+ }
58
+ ```
59
+
60
+ ## 📐 API Reference
61
+
62
+ ### Props
63
+
64
+ | Prop | Type | Default | Description |
65
+ |---|---|---|---|
66
+ | `selectedDate` | `Date \| string` | **required** | Currently selected date |
67
+ | `onSelectDate` | `(date: Date, dateString: string) => void` | **required** | Called when date changes |
68
+ | `minDate` | `Date` | -365 days | Minimum scrollable date |
69
+ | `maxDate` | `Date` | +365 days | Maximum scrollable date |
70
+ | `labelInterval` | `'daily' \| 'weekly' \| 'monthly' \| (date: Date) => boolean` | `'weekly'` | Which ticks show labels |
71
+ | `highlightDays` | `number[]` | — | Days of week to highlight (0=Sun, 6=Sat) |
72
+ | `tickSpacing` | `number` | `24` | Gap between ticks (px) |
73
+ | `tickHeight` | `number` | `12` | Small tick height (px) |
74
+ | `tickTallHeight` | `number` | `24` | Large/labeled tick height (px) |
75
+ | `tickThickness` | `number` | `4` | Tick bar width (px) |
76
+ | `tickColor` | `string` | auto | Small tick color |
77
+ | `tickTallColor` | `string` | auto | Large tick color (falls back to `tickColor`) |
78
+ | `labelColor` | `string` | auto | Label text color |
79
+ | `accentColor` | `string` | auto | Today dot & reset button color |
80
+ | `indicatorColor` | `string` | auto | Center indicator line color |
81
+ | `backgroundColor` | `string` | `transparent` | Component background |
82
+ | `height` | `number` | `120` | Total component height (px) |
83
+ | `rulerHeight` | `number` | `60` | Ruler track height (px) |
84
+ | `indicatorWidth` | `number` | `2` | Center indicator width (px) |
85
+ | `indicatorHeight` | `number` | `40` | Center indicator height (px) |
86
+ | `todayDotSize` | `number` | `6` | Today dot diameter (px) |
87
+ | `labelFontSize` | `number` | `10` | Tick label font size (px) |
88
+ | `bufferTicks` | `number` | `10` | Off-screen render buffer |
89
+ | `updateDebounceMs` | `number` | `100` | Debounce for `onSelectDate` (ms) |
90
+ | `enableHaptics` | `boolean` | `true` | Enable/disable haptic feedback |
91
+ | `onHapticTrigger` | `(mode: 'tick' \| 'continuous') => void` | — | Custom haptic handler |
92
+ | `fastSwipeTickThreshold` | `number` | `1` | Ticks/frame to trigger fast mode |
93
+ | `continuousHapticIntervalMs` | `number` | `20` | Continuous haptic pulse interval (ms) |
94
+ | `showResetToToday` | `boolean` | `false` | Show "Today" reset button |
95
+ | `renderHeader` | `(date, isToday, resetFn) => ReactNode` | — | Custom header renderer |
96
+
97
+ ## 🎨 Theming
98
+
99
+ Colors auto-detect the system color scheme. Override any color individually:
100
+
101
+ ```tsx
102
+ <RulerDatePicker
103
+ selectedDate={new Date()}
104
+ onSelectDate={handleSelect}
105
+ tickColor="#E5E7EB"
106
+ tickTallColor="#6366F1"
107
+ accentColor="#8B5CF6"
108
+ indicatorColor="#8B5CF6"
109
+ labelColor="#A1A1AA"
110
+ backgroundColor="#18181B"
111
+ />
112
+ ```
113
+
114
+ ## 🤝 Contributing
115
+
116
+ See the [ROADMAP](./ROADMAP.md) for planned features and development phases.
117
+
118
+ 1. Clone the repo
119
+ 2. Install dependencies: `pnpm install`
120
+ 3. Start the example app: `pnpm dev`
121
+
122
+ ## 📄 License
123
+
124
+ MIT © [Rehman](https://md-rehman.dev)
@@ -0,0 +1,376 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.RulerDatePicker = RulerDatePicker;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _reactNative = require("react-native");
9
+ var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
10
+ var _reactNativeGestureHandler = require("react-native-gesture-handler");
11
+ var _defaults = require("./defaults");
12
+ var _utils = require("./utils");
13
+ var _useHaptics = require("./useHaptics");
14
+ var _Tick = require("./Tick");
15
+ var _jsxRuntime = require("react/jsx-runtime");
16
+ 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); }
17
+ const SCREEN_WIDTH = _reactNative.Dimensions.get('window').width;
18
+
19
+ /**
20
+ * A performant, customizable ruler-style date picker for React Native.
21
+ *
22
+ * Features:
23
+ * - 60 FPS scrolling via Reanimated 3 decay physics + snap alignment
24
+ * - Dual-speed haptic feedback engine (discrete ticks vs continuous buzz)
25
+ * - Windowed tick rendering for memory efficiency
26
+ * - Fully configurable dimensions, colors, and behaviors
27
+ *
28
+ * @example
29
+ * ```tsx
30
+ * <RulerDatePicker
31
+ * selectedDate={new Date()}
32
+ * onSelectDate={(date, dateString) => console.log(dateString)}
33
+ * />
34
+ * ```
35
+ */
36
+ function RulerDatePicker(props) {
37
+ const {
38
+ selectedDate,
39
+ onSelectDate,
40
+ minDate,
41
+ maxDate,
42
+ labelInterval,
43
+ highlightDays,
44
+ tickSpacing = _defaults.DEFAULTS.tickSpacing,
45
+ tickHeight = _defaults.DEFAULTS.tickHeight,
46
+ tickTallHeight = _defaults.DEFAULTS.tickTallHeight,
47
+ tickThickness = _defaults.DEFAULTS.tickThickness,
48
+ height = _defaults.DEFAULTS.height,
49
+ rulerHeight = _defaults.DEFAULTS.rulerHeight,
50
+ indicatorWidth = _defaults.DEFAULTS.indicatorWidth,
51
+ indicatorHeight = _defaults.DEFAULTS.indicatorHeight,
52
+ todayDotSize = _defaults.DEFAULTS.todayDotSize,
53
+ labelFontSize = _defaults.DEFAULTS.labelFontSize,
54
+ bufferTicks = _defaults.DEFAULTS.bufferTicks,
55
+ updateDebounceMs = _defaults.DEFAULTS.updateDebounceMs,
56
+ enableHaptics = _defaults.DEFAULTS.enableHaptics,
57
+ onHapticTrigger,
58
+ fastSwipeTickThreshold = _defaults.DEFAULTS.fastSwipeTickThreshold,
59
+ continuousHapticIntervalMs = _defaults.DEFAULTS.continuousHapticIntervalMs,
60
+ showResetToToday = _defaults.DEFAULTS.showResetToToday,
61
+ renderHeader
62
+ } = props;
63
+
64
+ // ── Resolve colors ──────────────────────────────────────────────────────
65
+ const colors = (0, _utils.useResolvedColors)(props);
66
+
67
+ // ── Haptics ─────────────────────────────────────────────────────────────
68
+ const {
69
+ fireDiscreteHaptic,
70
+ startContinuousHaptic,
71
+ stopContinuousHaptic
72
+ } = (0, _useHaptics.useHaptics)({
73
+ enableHaptics,
74
+ onHapticTrigger,
75
+ continuousHapticIntervalMs
76
+ });
77
+
78
+ // ── Reference time (midnight today) ─────────────────────────────────────
79
+ const todayTime = (0, _react.useMemo)(() => {
80
+ const d = new Date();
81
+ d.setHours(0, 0, 0, 0);
82
+ return d.getTime();
83
+ }, []);
84
+
85
+ // ── Date boundaries ─────────────────────────────────────────────────────
86
+ const {
87
+ minOffset,
88
+ maxOffset
89
+ } = (0, _react.useMemo)(() => (0, _utils.computeDayRange)(todayTime, minDate, maxDate), [todayTime, minDate, maxDate]);
90
+
91
+ // ── Initial offset from today ───────────────────────────────────────────
92
+ const initialOffsetDays = (0, _react.useMemo)(() => {
93
+ return (0, _utils.dateToDayOffset)(selectedDate, todayTime);
94
+ // Intentionally only computed once on mount
95
+ // eslint-disable-next-line react-hooks/exhaustive-deps
96
+ }, []);
97
+ const halfVisible = Math.ceil(SCREEN_WIDTH / 2 / tickSpacing);
98
+ const windowSize = halfVisible + bufferTicks;
99
+
100
+ // ── Animated values ─────────────────────────────────────────────────────
101
+ const translateX = (0, _reactNativeReanimated.useSharedValue)(-initialOffsetDays * tickSpacing);
102
+ const contextX = (0, _reactNativeReanimated.useSharedValue)(0);
103
+ const previousIndex = (0, _reactNativeReanimated.useSharedValue)(-initialOffsetDays);
104
+ const isFastMode = (0, _reactNativeReanimated.useSharedValue)(false);
105
+
106
+ // ── State ───────────────────────────────────────────────────────────────
107
+ const initialDateStr = (0, _react.useMemo)(() => {
108
+ const d = typeof selectedDate === 'string' ? new Date(selectedDate) : new Date(selectedDate);
109
+ d.setHours(0, 0, 0, 0);
110
+ return (0, _utils.formatDateString)(d);
111
+ // eslint-disable-next-line react-hooks/exhaustive-deps
112
+ }, []);
113
+ const [displayDateStr, setDisplayDateStr] = (0, _react.useState)(initialDateStr);
114
+ const debounceTimerRef = (0, _react.useRef)(null);
115
+ const [windowCenter, setWindowCenter] = (0, _react.useState)(-initialOffsetDays);
116
+
117
+ // ── Visible ticks (windowed rendering) ──────────────────────────────────
118
+ const visibleTicks = (0, _react.useMemo)(() => {
119
+ const ticks = [];
120
+ const start = Math.max(windowCenter - windowSize, minOffset);
121
+ const end = Math.min(windowCenter + windowSize, maxOffset);
122
+ for (let i = start; i <= end; i++) {
123
+ const d = new Date(todayTime + i * _defaults.MS_PER_DAY);
124
+ ticks.push({
125
+ offset: i,
126
+ isLabeled: (0, _utils.shouldShowLabel)(d, labelInterval, todayTime),
127
+ isToday: i === 0,
128
+ isHighlighted: highlightDays ? highlightDays.includes(d.getDay()) : false,
129
+ dateStr: d.getDate().toString()
130
+ });
131
+ }
132
+ return ticks;
133
+ }, [windowCenter, windowSize, todayTime, minOffset, maxOffset, labelInterval, highlightDays]);
134
+
135
+ // ── Tick change callbacks ───────────────────────────────────────────────
136
+
137
+ const onTickChanged = (0, _react.useCallback)((index, enteringFastMode) => {
138
+ if (enteringFastMode) {
139
+ startContinuousHaptic();
140
+ } else {
141
+ stopContinuousHaptic();
142
+ fireDiscreteHaptic();
143
+ }
144
+
145
+ // Update display date
146
+ const d = (0, _utils.dayOffsetToDate)(index, todayTime);
147
+ const dateStr = (0, _utils.formatDateString)(d);
148
+ setWindowCenter(prevCenter => {
149
+ if (Math.abs(index - prevCenter) >= 5) {
150
+ return index;
151
+ }
152
+ return prevCenter;
153
+ });
154
+
155
+ // Debounce the heavy onSelectDate callback
156
+ if (debounceTimerRef.current) {
157
+ clearTimeout(debounceTimerRef.current);
158
+ }
159
+ debounceTimerRef.current = setTimeout(() => {
160
+ onSelectDate(d, dateStr);
161
+ }, updateDebounceMs);
162
+ }, [todayTime, onSelectDate, updateDebounceMs, startContinuousHaptic, stopContinuousHaptic, fireDiscreteHaptic]);
163
+ const onAnimationSettled = (0, _react.useCallback)(index => {
164
+ stopContinuousHaptic();
165
+ fireDiscreteHaptic();
166
+ const d = (0, _utils.dayOffsetToDate)(index, todayTime);
167
+ const dateStr = (0, _utils.formatDateString)(d);
168
+ setDisplayDateStr(dateStr);
169
+ setWindowCenter(index);
170
+ onSelectDate(d, dateStr);
171
+ }, [todayTime, onSelectDate, stopContinuousHaptic, fireDiscreteHaptic]);
172
+
173
+ // ── Animated reaction ───────────────────────────────────────────────────
174
+ (0, _reactNativeReanimated.useAnimatedReaction)(() => Math.round(-translateX.value / tickSpacing), (index, prev) => {
175
+ if (index !== prev && index >= minOffset && index <= maxOffset) {
176
+ previousIndex.value = index;
177
+ const ticksSkipped = prev !== null ? Math.abs(index - prev) : 1;
178
+ const shouldBeFast = ticksSkipped > fastSwipeTickThreshold;
179
+ if (shouldBeFast && !isFastMode.value) {
180
+ isFastMode.value = true;
181
+ (0, _reactNativeReanimated.runOnJS)(onTickChanged)(index, true);
182
+ } else if (!shouldBeFast && isFastMode.value) {
183
+ isFastMode.value = false;
184
+ (0, _reactNativeReanimated.runOnJS)(onTickChanged)(index, false);
185
+ } else if (!shouldBeFast) {
186
+ (0, _reactNativeReanimated.runOnJS)(onTickChanged)(index, false);
187
+ }
188
+ if (shouldBeFast && isFastMode.value) {
189
+ (0, _reactNativeReanimated.runOnJS)(onTickChanged)(index, true);
190
+ }
191
+ }
192
+ }, [tickSpacing, minOffset, maxOffset, fastSwipeTickThreshold]);
193
+
194
+ // ── Pan gesture ─────────────────────────────────────────────────────────
195
+ const pan = _reactNativeGestureHandler.Gesture.Pan().onStart(() => {
196
+ contextX.value = translateX.value;
197
+ }).onUpdate(event => {
198
+ translateX.value = contextX.value + event.translationX;
199
+ }).onEnd(event => {
200
+ translateX.value = (0, _reactNativeReanimated.withDecay)({
201
+ velocity: event.velocityX,
202
+ deceleration: 0.99
203
+ }, finished => {
204
+ if (finished) {
205
+ const maxTranslateX = -minOffset * tickSpacing;
206
+ const minTranslateX = -maxOffset * tickSpacing;
207
+ const clampedX = Math.min(Math.max(translateX.value, minTranslateX), maxTranslateX);
208
+ const snappedIndex = Math.round(clampedX / tickSpacing);
209
+ const snappedX = snappedIndex * tickSpacing;
210
+ translateX.value = (0, _reactNativeReanimated.withTiming)(snappedX, {
211
+ duration: 150
212
+ }, done => {
213
+ if (done) {
214
+ isFastMode.value = false;
215
+ const index = Math.round(-snappedX / tickSpacing);
216
+ (0, _reactNativeReanimated.runOnJS)(onAnimationSettled)(index);
217
+ }
218
+ });
219
+ }
220
+ });
221
+ });
222
+ const animatedStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => ({
223
+ transform: [{
224
+ translateX: translateX.value
225
+ }]
226
+ }), [translateX]);
227
+
228
+ // ── Header ──────────────────────────────────────────────────────────────
229
+ const displayDate = new Date(displayDateStr);
230
+ const displayFormat = displayDate.toLocaleDateString('en-US', {
231
+ weekday: 'long',
232
+ month: 'long',
233
+ day: 'numeric'
234
+ });
235
+ const displayYear = displayDate.getFullYear();
236
+ const currentYear = new Date().getFullYear();
237
+ const showYear = displayYear !== currentYear;
238
+ const isTodaySelected = displayDateStr === (0, _utils.formatDateString)(new Date(todayTime));
239
+ const handleResetToToday = (0, _react.useCallback)(() => {
240
+ stopContinuousHaptic();
241
+ translateX.value = (0, _reactNativeReanimated.withTiming)(0, {
242
+ duration: 300
243
+ });
244
+ const todayStr = (0, _utils.formatDateString)(new Date(todayTime));
245
+ setDisplayDateStr(todayStr);
246
+ setWindowCenter(0);
247
+ onSelectDate(new Date(todayTime), todayStr);
248
+ }, [todayTime, onSelectDate, stopContinuousHaptic, translateX]);
249
+
250
+ // ── Render ──────────────────────────────────────────────────────────────
251
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
252
+ style: [styles.container, {
253
+ height,
254
+ backgroundColor: colors.backgroundColor
255
+ }],
256
+ children: [renderHeader ? renderHeader(displayDate, isTodaySelected, handleResetToToday) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
257
+ style: styles.headerContainer,
258
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
259
+ style: styles.dateHeader,
260
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
261
+ style: [styles.yearText, {
262
+ color: colors.labelColor
263
+ }],
264
+ children: showYear ? displayYear : ''
265
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
266
+ style: [styles.dateText, {
267
+ color: colors.accentColor
268
+ }],
269
+ children: displayFormat
270
+ })]
271
+ }), showResetToToday && !isTodaySelected && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
272
+ onPress: handleResetToToday,
273
+ style: styles.resetBtn,
274
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
275
+ style: [styles.resetText, {
276
+ color: colors.accentColor
277
+ }],
278
+ children: "Today"
279
+ })
280
+ })]
281
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeGestureHandler.GestureDetector, {
282
+ gesture: pan,
283
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
284
+ style: [styles.rulerContainer, {
285
+ height: rulerHeight
286
+ }],
287
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
288
+ style: [styles.centerIndicator, {
289
+ backgroundColor: colors.indicatorColor,
290
+ width: indicatorWidth,
291
+ height: indicatorHeight
292
+ }]
293
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeReanimated.default.View, {
294
+ style: [styles.ticksWrapper, animatedStyle],
295
+ children: visibleTicks.map(tick => /*#__PURE__*/(0, _jsxRuntime.jsx)(_Tick.Tick, {
296
+ offset: tick.offset,
297
+ isLabeled: tick.isLabeled,
298
+ isToday: tick.isToday,
299
+ isHighlighted: tick.isHighlighted,
300
+ dateStr: tick.dateStr,
301
+ tickSpacing: tickSpacing,
302
+ tickHeight: tickHeight,
303
+ tickTallHeight: tickTallHeight,
304
+ tickThickness: tickThickness,
305
+ tickColor: colors.tickColor,
306
+ tickTallColor: colors.tickTallColor,
307
+ labelColor: colors.labelColor,
308
+ accentColor: colors.accentColor,
309
+ todayDotSize: todayDotSize,
310
+ labelFontSize: labelFontSize,
311
+ rulerHeight: rulerHeight
312
+ }, tick.offset))
313
+ })]
314
+ })
315
+ })]
316
+ });
317
+ }
318
+ const styles = _reactNative.StyleSheet.create({
319
+ container: {
320
+ justifyContent: 'center',
321
+ alignItems: 'center',
322
+ overflow: 'hidden'
323
+ },
324
+ headerContainer: {
325
+ flexDirection: 'row',
326
+ alignItems: 'center',
327
+ justifyContent: 'center',
328
+ width: '100%',
329
+ paddingHorizontal: 20,
330
+ marginBottom: 20,
331
+ height: 40
332
+ },
333
+ dateHeader: {
334
+ alignItems: 'center'
335
+ },
336
+ yearText: {
337
+ fontSize: 12,
338
+ fontWeight: '500',
339
+ marginBottom: 2
340
+ },
341
+ dateText: {
342
+ fontSize: 18,
343
+ fontWeight: '600'
344
+ },
345
+ resetBtn: {
346
+ position: 'absolute',
347
+ right: 20,
348
+ paddingVertical: 6,
349
+ paddingHorizontal: 12,
350
+ borderRadius: 16,
351
+ backgroundColor: 'rgba(0,0,0,0.05)'
352
+ },
353
+ resetText: {
354
+ fontSize: 14,
355
+ fontWeight: '600'
356
+ },
357
+ rulerContainer: {
358
+ width: SCREEN_WIDTH,
359
+ position: 'relative',
360
+ flexDirection: 'row',
361
+ alignItems: 'flex-end',
362
+ justifyContent: 'center'
363
+ },
364
+ centerIndicator: {
365
+ position: 'absolute',
366
+ zIndex: 10,
367
+ bottom: 0
368
+ },
369
+ ticksWrapper: {
370
+ position: 'absolute',
371
+ height: '100%',
372
+ width: 0,
373
+ left: SCREEN_WIDTH / 2
374
+ }
375
+ });
376
+ //# sourceMappingURL=RulerDatePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeReanimated","_reactNativeGestureHandler","_defaults","_utils","_useHaptics","_Tick","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","SCREEN_WIDTH","Dimensions","width","RulerDatePicker","props","selectedDate","onSelectDate","minDate","maxDate","labelInterval","highlightDays","tickSpacing","DEFAULTS","tickHeight","tickTallHeight","tickThickness","height","rulerHeight","indicatorWidth","indicatorHeight","todayDotSize","labelFontSize","bufferTicks","updateDebounceMs","enableHaptics","onHapticTrigger","fastSwipeTickThreshold","continuousHapticIntervalMs","showResetToToday","renderHeader","colors","useResolvedColors","fireDiscreteHaptic","startContinuousHaptic","stopContinuousHaptic","useHaptics","todayTime","useMemo","d","Date","setHours","getTime","minOffset","maxOffset","computeDayRange","initialOffsetDays","dateToDayOffset","halfVisible","Math","ceil","windowSize","translateX","useSharedValue","contextX","previousIndex","isFastMode","initialDateStr","formatDateString","displayDateStr","setDisplayDateStr","useState","debounceTimerRef","useRef","windowCenter","setWindowCenter","visibleTicks","ticks","start","max","end","min","MS_PER_DAY","push","offset","isLabeled","shouldShowLabel","isToday","isHighlighted","includes","getDay","dateStr","getDate","toString","onTickChanged","useCallback","index","enteringFastMode","dayOffsetToDate","prevCenter","abs","current","clearTimeout","setTimeout","onAnimationSettled","useAnimatedReaction","round","value","prev","ticksSkipped","shouldBeFast","runOnJS","pan","Gesture","Pan","onStart","onUpdate","event","translationX","onEnd","withDecay","velocity","velocityX","deceleration","finished","maxTranslateX","minTranslateX","clampedX","snappedIndex","snappedX","withTiming","duration","done","animatedStyle","useAnimatedStyle","transform","displayDate","displayFormat","toLocaleDateString","weekday","month","day","displayYear","getFullYear","currentYear","showYear","isTodaySelected","handleResetToToday","todayStr","jsxs","View","style","styles","container","backgroundColor","children","headerContainer","dateHeader","jsx","Text","yearText","color","labelColor","dateText","accentColor","TouchableOpacity","onPress","resetBtn","resetText","GestureDetector","gesture","rulerContainer","centerIndicator","indicatorColor","ticksWrapper","map","tick","Tick","tickColor","tickTallColor","StyleSheet","create","justifyContent","alignItems","overflow","flexDirection","paddingHorizontal","marginBottom","fontSize","fontWeight","position","right","paddingVertical","borderRadius","zIndex","bottom","left"],"sourceRoot":"../../src","sources":["RulerDatePicker.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAOA,IAAAE,sBAAA,GAAAH,uBAAA,CAAAC,OAAA;AAQA,IAAAG,0BAAA,GAAAH,OAAA;AAGA,IAAAI,SAAA,GAAAJ,OAAA;AACA,IAAAK,MAAA,GAAAL,OAAA;AAQA,IAAAM,WAAA,GAAAN,OAAA;AACA,IAAAO,KAAA,GAAAP,OAAA;AAA8B,IAAAQ,WAAA,GAAAR,OAAA;AAAA,SAAAD,wBAAAU,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAZ,uBAAA,YAAAA,CAAAU,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAE9B,MAAMkB,YAAY,GAAGC,uBAAU,CAACR,GAAG,CAAC,QAAQ,CAAC,CAACS,KAAK;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,eAAeA,CAACC,KAA2B,EAAE;EAC3D,MAAM;IACJC,YAAY;IACZC,YAAY;IACZC,OAAO;IACPC,OAAO;IACPC,aAAa;IACbC,aAAa;IACbC,WAAW,GAAGC,kBAAQ,CAACD,WAAW;IAClCE,UAAU,GAAGD,kBAAQ,CAACC,UAAU;IAChCC,cAAc,GAAGF,kBAAQ,CAACE,cAAc;IACxCC,aAAa,GAAGH,kBAAQ,CAACG,aAAa;IACtCC,MAAM,GAAGJ,kBAAQ,CAACI,MAAM;IACxBC,WAAW,GAAGL,kBAAQ,CAACK,WAAW;IAClCC,cAAc,GAAGN,kBAAQ,CAACM,cAAc;IACxCC,eAAe,GAAGP,kBAAQ,CAACO,eAAe;IAC1CC,YAAY,GAAGR,kBAAQ,CAACQ,YAAY;IACpCC,aAAa,GAAGT,kBAAQ,CAACS,aAAa;IACtCC,WAAW,GAAGV,kBAAQ,CAACU,WAAW;IAClCC,gBAAgB,GAAGX,kBAAQ,CAACW,gBAAgB;IAC5CC,aAAa,GAAGZ,kBAAQ,CAACY,aAAa;IACtCC,eAAe;IACfC,sBAAsB,GAAGd,kBAAQ,CAACc,sBAAsB;IACxDC,0BAA0B,GAAGf,kBAAQ,CAACe,0BAA0B;IAChEC,gBAAgB,GAAGhB,kBAAQ,CAACgB,gBAAgB;IAC5CC;EACF,CAAC,GAAGzB,KAAK;;EAET;EACA,MAAM0B,MAAM,GAAG,IAAAC,wBAAiB,EAAC3B,KAAK,CAAC;;EAEvC;EACA,MAAM;IAAE4B,kBAAkB;IAAEC,qBAAqB;IAAEC;EAAqB,CAAC,GACvE,IAAAC,sBAAU,EAAC;IACTX,aAAa;IACbC,eAAe;IACfE;EACF,CAAC,CAAC;;EAEJ;EACA,MAAMS,SAAS,GAAG,IAAAC,cAAO,EAAC,MAAM;IAC9B,MAAMC,CAAC,GAAG,IAAIC,IAAI,CAAC,CAAC;IACpBD,CAAC,CAACE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACtB,OAAOF,CAAC,CAACG,OAAO,CAAC,CAAC;EACpB,CAAC,EAAE,EAAE,CAAC;;EAEN;EACA,MAAM;IAAEC,SAAS;IAAEC;EAAU,CAAC,GAAG,IAAAN,cAAO,EACtC,MAAM,IAAAO,sBAAe,EAACR,SAAS,EAAE7B,OAAO,EAAEC,OAAO,CAAC,EAClD,CAAC4B,SAAS,EAAE7B,OAAO,EAAEC,OAAO,CAC9B,CAAC;;EAED;EACA,MAAMqC,iBAAiB,GAAG,IAAAR,cAAO,EAAC,MAAM;IACtC,OAAO,IAAAS,sBAAe,EAACzC,YAAY,EAAE+B,SAAS,CAAC;IAC/C;IACA;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMW,WAAW,GAAGC,IAAI,CAACC,IAAI,CAACjD,YAAY,GAAG,CAAC,GAAGW,WAAW,CAAC;EAC7D,MAAMuC,UAAU,GAAGH,WAAW,GAAGzB,WAAW;;EAE5C;EACA,MAAM6B,UAAU,GAAG,IAAAC,qCAAc,EAAC,CAACP,iBAAiB,GAAGlC,WAAW,CAAC;EACnE,MAAM0C,QAAQ,GAAG,IAAAD,qCAAc,EAAC,CAAC,CAAC;EAClC,MAAME,aAAa,GAAG,IAAAF,qCAAc,EAAC,CAACP,iBAAiB,CAAC;EACxD,MAAMU,UAAU,GAAG,IAAAH,qCAAc,EAAC,KAAK,CAAC;;EAExC;EACA,MAAMI,cAAc,GAAG,IAAAnB,cAAO,EAAC,MAAM;IACnC,MAAMC,CAAC,GACL,OAAOjC,YAAY,KAAK,QAAQ,GAC5B,IAAIkC,IAAI,CAAClC,YAAY,CAAC,GACtB,IAAIkC,IAAI,CAAClC,YAAY,CAAC;IAC5BiC,CAAC,CAACE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACtB,OAAO,IAAAiB,uBAAgB,EAACnB,CAAC,CAAC;IAC1B;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,MAAM,CAACoB,cAAc,EAAEC,iBAAiB,CAAC,GAAG,IAAAC,eAAQ,EAACJ,cAAc,CAAC;EACpE,MAAMK,gBAAgB,GAAG,IAAAC,aAAM,EAAuC,IAAI,CAAC;EAC3E,MAAM,CAACC,YAAY,EAAEC,eAAe,CAAC,GAAG,IAAAJ,eAAQ,EAAC,CAACf,iBAAiB,CAAC;;EAEpE;EACA,MAAMoB,YAAY,GAAG,IAAA5B,cAAO,EAAC,MAAM;IACjC,MAAM6B,KAAiB,GAAG,EAAE;IAE5B,MAAMC,KAAK,GAAGnB,IAAI,CAACoB,GAAG,CAACL,YAAY,GAAGb,UAAU,EAAER,SAAS,CAAC;IAC5D,MAAM2B,GAAG,GAAGrB,IAAI,CAACsB,GAAG,CAACP,YAAY,GAAGb,UAAU,EAAEP,SAAS,CAAC;IAE1D,KAAK,IAAIvD,CAAC,GAAG+E,KAAK,EAAE/E,CAAC,IAAIiF,GAAG,EAAEjF,CAAC,EAAE,EAAE;MACjC,MAAMkD,CAAC,GAAG,IAAIC,IAAI,CAACH,SAAS,GAAGhD,CAAC,GAAGmF,oBAAU,CAAC;MAC9CL,KAAK,CAACM,IAAI,CAAC;QACTC,MAAM,EAAErF,CAAC;QACTsF,SAAS,EAAE,IAAAC,sBAAe,EAACrC,CAAC,EAAE7B,aAAa,EAAE2B,SAAS,CAAC;QACvDwC,OAAO,EAAExF,CAAC,KAAK,CAAC;QAChByF,aAAa,EAAEnE,aAAa,GACxBA,aAAa,CAACoE,QAAQ,CAACxC,CAAC,CAACyC,MAAM,CAAC,CAAC,CAAC,GAClC,KAAK;QACTC,OAAO,EAAE1C,CAAC,CAAC2C,OAAO,CAAC,CAAC,CAACC,QAAQ,CAAC;MAChC,CAAC,CAAC;IACJ;IACA,OAAOhB,KAAK;EACd,CAAC,EAAE,CACDH,YAAY,EACZb,UAAU,EACVd,SAAS,EACTM,SAAS,EACTC,SAAS,EACTlC,aAAa,EACbC,aAAa,CACd,CAAC;;EAEF;;EAEA,MAAMyE,aAAa,GAAG,IAAAC,kBAAW,EAC/B,CAACC,KAAa,EAAEC,gBAAyB,KAAK;IAC5C,IAAIA,gBAAgB,EAAE;MACpBrD,qBAAqB,CAAC,CAAC;IACzB,CAAC,MAAM;MACLC,oBAAoB,CAAC,CAAC;MACtBF,kBAAkB,CAAC,CAAC;IACtB;;IAEA;IACA,MAAMM,CAAC,GAAG,IAAAiD,sBAAe,EAACF,KAAK,EAAEjD,SAAS,CAAC;IAC3C,MAAM4C,OAAO,GAAG,IAAAvB,uBAAgB,EAACnB,CAAC,CAAC;IACnC0B,eAAe,CAAEwB,UAAU,IAAK;MAC9B,IAAIxC,IAAI,CAACyC,GAAG,CAACJ,KAAK,GAAGG,UAAU,CAAC,IAAI,CAAC,EAAE;QACrC,OAAOH,KAAK;MACd;MACA,OAAOG,UAAU;IACnB,CAAC,CAAC;;IAEF;IACA,IAAI3B,gBAAgB,CAAC6B,OAAO,EAAE;MAC5BC,YAAY,CAAC9B,gBAAgB,CAAC6B,OAAO,CAAC;IACxC;IACA7B,gBAAgB,CAAC6B,OAAO,GAAGE,UAAU,CAAC,MAAM;MAC1CtF,YAAY,CAACgC,CAAC,EAAE0C,OAAO,CAAC;IAC1B,CAAC,EAAEzD,gBAAgB,CAAC;EACtB,CAAC,EACD,CACEa,SAAS,EACT9B,YAAY,EACZiB,gBAAgB,EAChBU,qBAAqB,EACrBC,oBAAoB,EACpBF,kBAAkB,CAEtB,CAAC;EAED,MAAM6D,kBAAkB,GAAG,IAAAT,kBAAW,EACnCC,KAAa,IAAK;IACjBnD,oBAAoB,CAAC,CAAC;IACtBF,kBAAkB,CAAC,CAAC;IACpB,MAAMM,CAAC,GAAG,IAAAiD,sBAAe,EAACF,KAAK,EAAEjD,SAAS,CAAC;IAC3C,MAAM4C,OAAO,GAAG,IAAAvB,uBAAgB,EAACnB,CAAC,CAAC;IACnCqB,iBAAiB,CAACqB,OAAO,CAAC;IAC1BhB,eAAe,CAACqB,KAAK,CAAC;IACtB/E,YAAY,CAACgC,CAAC,EAAE0C,OAAO,CAAC;EAC1B,CAAC,EACD,CAAC5C,SAAS,EAAE9B,YAAY,EAAE4B,oBAAoB,EAAEF,kBAAkB,CACpE,CAAC;;EAED;EACA,IAAA8D,0CAAmB,EACjB,MAAM9C,IAAI,CAAC+C,KAAK,CAAC,CAAC5C,UAAU,CAAC6C,KAAK,GAAGrF,WAAW,CAAC,EACjD,CAAC0E,KAAK,EAAEY,IAAI,KAAK;IACf,IACEZ,KAAK,KAAKY,IAAI,IACdZ,KAAK,IAAI3C,SAAS,IAClB2C,KAAK,IAAI1C,SAAS,EAClB;MACAW,aAAa,CAAC0C,KAAK,GAAGX,KAAK;MAC3B,MAAMa,YAAY,GAAGD,IAAI,KAAK,IAAI,GAAGjD,IAAI,CAACyC,GAAG,CAACJ,KAAK,GAAGY,IAAI,CAAC,GAAG,CAAC;MAC/D,MAAME,YAAY,GAAGD,YAAY,GAAGxE,sBAAsB;MAE1D,IAAIyE,YAAY,IAAI,CAAC5C,UAAU,CAACyC,KAAK,EAAE;QACrCzC,UAAU,CAACyC,KAAK,GAAG,IAAI;QACvB,IAAAI,8BAAO,EAACjB,aAAa,CAAC,CAACE,KAAK,EAAE,IAAI,CAAC;MACrC,CAAC,MAAM,IAAI,CAACc,YAAY,IAAI5C,UAAU,CAACyC,KAAK,EAAE;QAC5CzC,UAAU,CAACyC,KAAK,GAAG,KAAK;QACxB,IAAAI,8BAAO,EAACjB,aAAa,CAAC,CAACE,KAAK,EAAE,KAAK,CAAC;MACtC,CAAC,MAAM,IAAI,CAACc,YAAY,EAAE;QACxB,IAAAC,8BAAO,EAACjB,aAAa,CAAC,CAACE,KAAK,EAAE,KAAK,CAAC;MACtC;MACA,IAAIc,YAAY,IAAI5C,UAAU,CAACyC,KAAK,EAAE;QACpC,IAAAI,8BAAO,EAACjB,aAAa,CAAC,CAACE,KAAK,EAAE,IAAI,CAAC;MACrC;IACF;EACF,CAAC,EACD,CAAC1E,WAAW,EAAE+B,SAAS,EAAEC,SAAS,EAAEjB,sBAAsB,CAC5D,CAAC;;EAED;EACA,MAAM2E,GAAG,GAAGC,kCAAO,CAACC,GAAG,CAAC,CAAC,CACtBC,OAAO,CAAC,MAAM;IACbnD,QAAQ,CAAC2C,KAAK,GAAG7C,UAAU,CAAC6C,KAAK;EACnC,CAAC,CAAC,CACDS,QAAQ,CAAEC,KAAK,IAAK;IACnBvD,UAAU,CAAC6C,KAAK,GAAG3C,QAAQ,CAAC2C,KAAK,GAAGU,KAAK,CAACC,YAAY;EACxD,CAAC,CAAC,CACDC,KAAK,CAAEF,KAAK,IAAK;IAChBvD,UAAU,CAAC6C,KAAK,GAAG,IAAAa,gCAAS,EAC1B;MACEC,QAAQ,EAAEJ,KAAK,CAACK,SAAS;MACzBC,YAAY,EAAE;IAChB,CAAC,EACAC,QAAQ,IAAK;MACZ,IAAIA,QAAQ,EAAE;QACZ,MAAMC,aAAa,GAAG,CAACxE,SAAS,GAAG/B,WAAW;QAC9C,MAAMwG,aAAa,GAAG,CAACxE,SAAS,GAAGhC,WAAW;QAC9C,MAAMyG,QAAQ,GAAGpE,IAAI,CAACsB,GAAG,CACvBtB,IAAI,CAACoB,GAAG,CAACjB,UAAU,CAAC6C,KAAK,EAAEmB,aAAa,CAAC,EACzCD,aACF,CAAC;QACD,MAAMG,YAAY,GAAGrE,IAAI,CAAC+C,KAAK,CAACqB,QAAQ,GAAGzG,WAAW,CAAC;QACvD,MAAM2G,QAAQ,GAAGD,YAAY,GAAG1G,WAAW;QAC3CwC,UAAU,CAAC6C,KAAK,GAAG,IAAAuB,iCAAU,EAC3BD,QAAQ,EACR;UAAEE,QAAQ,EAAE;QAAI,CAAC,EAChBC,IAAI,IAAK;UACR,IAAIA,IAAI,EAAE;YACRlE,UAAU,CAACyC,KAAK,GAAG,KAAK;YACxB,MAAMX,KAAK,GAAGrC,IAAI,CAAC+C,KAAK,CAAC,CAACuB,QAAQ,GAAG3G,WAAW,CAAC;YACjD,IAAAyF,8BAAO,EAACP,kBAAkB,CAAC,CAACR,KAAK,CAAC;UACpC;QACF,CACF,CAAC;MACH;IACF,CACF,CAAC;EACH,CAAC,CAAC;EAEJ,MAAMqC,aAAa,GAAG,IAAAC,uCAAgB,EACpC,OAAO;IACLC,SAAS,EAAE,CAAC;MAAEzE,UAAU,EAAEA,UAAU,CAAC6C;IAAM,CAAC;EAC9C,CAAC,CAAC,EACF,CAAC7C,UAAU,CACb,CAAC;;EAED;EACA,MAAM0E,WAAW,GAAG,IAAItF,IAAI,CAACmB,cAAc,CAAC;EAC5C,MAAMoE,aAAa,GAAGD,WAAW,CAACE,kBAAkB,CAAC,OAAO,EAAE;IAC5DC,OAAO,EAAE,MAAM;IACfC,KAAK,EAAE,MAAM;IACbC,GAAG,EAAE;EACP,CAAC,CAAC;EACF,MAAMC,WAAW,GAAGN,WAAW,CAACO,WAAW,CAAC,CAAC;EAC7C,MAAMC,WAAW,GAAG,IAAI9F,IAAI,CAAC,CAAC,CAAC6F,WAAW,CAAC,CAAC;EAC5C,MAAME,QAAQ,GAAGH,WAAW,KAAKE,WAAW;EAC5C,MAAME,eAAe,GACnB7E,cAAc,KAAK,IAAAD,uBAAgB,EAAC,IAAIlB,IAAI,CAACH,SAAS,CAAC,CAAC;EAE1D,MAAMoG,kBAAkB,GAAG,IAAApD,kBAAW,EAAC,MAAM;IAC3ClD,oBAAoB,CAAC,CAAC;IACtBiB,UAAU,CAAC6C,KAAK,GAAG,IAAAuB,iCAAU,EAAC,CAAC,EAAE;MAAEC,QAAQ,EAAE;IAAI,CAAC,CAAC;IACnD,MAAMiB,QAAQ,GAAG,IAAAhF,uBAAgB,EAAC,IAAIlB,IAAI,CAACH,SAAS,CAAC,CAAC;IACtDuB,iBAAiB,CAAC8E,QAAQ,CAAC;IAC3BzE,eAAe,CAAC,CAAC,CAAC;IAClB1D,YAAY,CAAC,IAAIiC,IAAI,CAACH,SAAS,CAAC,EAAEqG,QAAQ,CAAC;EAC7C,CAAC,EAAE,CAACrG,SAAS,EAAE9B,YAAY,EAAE4B,oBAAoB,EAAEiB,UAAU,CAAC,CAAC;;EAE/D;EACA,oBACE,IAAAvE,WAAA,CAAA8J,IAAA,EAACrK,YAAA,CAAAsK,IAAI;IACHC,KAAK,EAAE,CACLC,MAAM,CAACC,SAAS,EAChB;MAAE9H,MAAM;MAAE+H,eAAe,EAAEjH,MAAM,CAACiH;IAAgB,CAAC,CACnD;IAAAC,QAAA,GAGDnH,YAAY,GACXA,YAAY,CAACgG,WAAW,EAAEU,eAAe,EAAEC,kBAAkB,CAAC,gBAE9D,IAAA5J,WAAA,CAAA8J,IAAA,EAACrK,YAAA,CAAAsK,IAAI;MAACC,KAAK,EAAEC,MAAM,CAACI,eAAgB;MAAAD,QAAA,gBAClC,IAAApK,WAAA,CAAA8J,IAAA,EAACrK,YAAA,CAAAsK,IAAI;QAACC,KAAK,EAAEC,MAAM,CAACK,UAAW;QAAAF,QAAA,gBAC7B,IAAApK,WAAA,CAAAuK,GAAA,EAAC9K,YAAA,CAAA+K,IAAI;UACHR,KAAK,EAAE,CAACC,MAAM,CAACQ,QAAQ,EAAE;YAAEC,KAAK,EAAExH,MAAM,CAACyH;UAAW,CAAC,CAAE;UAAAP,QAAA,EAEtDV,QAAQ,GAAGH,WAAW,GAAG;QAAE,CACxB,CAAC,eACP,IAAAvJ,WAAA,CAAAuK,GAAA,EAAC9K,YAAA,CAAA+K,IAAI;UACHR,KAAK,EAAE,CACLC,MAAM,CAACW,QAAQ,EACf;YAAEF,KAAK,EAAExH,MAAM,CAAC2H;UAAY,CAAC,CAC7B;UAAAT,QAAA,EAEDlB;QAAa,CACV,CAAC;MAAA,CACH,CAAC,EAENlG,gBAAgB,IAAI,CAAC2G,eAAe,iBACnC,IAAA3J,WAAA,CAAAuK,GAAA,EAAC9K,YAAA,CAAAqL,gBAAgB;QACfC,OAAO,EAAEnB,kBAAmB;QAC5BI,KAAK,EAAEC,MAAM,CAACe,QAAS;QAAAZ,QAAA,eAEvB,IAAApK,WAAA,CAAAuK,GAAA,EAAC9K,YAAA,CAAA+K,IAAI;UACHR,KAAK,EAAE,CACLC,MAAM,CAACgB,SAAS,EAChB;YAAEP,KAAK,EAAExH,MAAM,CAAC2H;UAAY,CAAC,CAC7B;UAAAT,QAAA,EACH;QAED,CAAM;MAAC,CACS,CACnB;IAAA,CACG,CACP,eAGD,IAAApK,WAAA,CAAAuK,GAAA,EAAC5K,0BAAA,CAAAuL,eAAe;MAACC,OAAO,EAAE1D,GAAI;MAAA2C,QAAA,eAC5B,IAAApK,WAAA,CAAA8J,IAAA,EAACrK,YAAA,CAAAsK,IAAI;QAACC,KAAK,EAAE,CAACC,MAAM,CAACmB,cAAc,EAAE;UAAEhJ,MAAM,EAAEC;QAAY,CAAC,CAAE;QAAA+H,QAAA,gBAC5D,IAAApK,WAAA,CAAAuK,GAAA,EAAC9K,YAAA,CAAAsK,IAAI;UACHC,KAAK,EAAE,CACLC,MAAM,CAACoB,eAAe,EACtB;YACElB,eAAe,EAAEjH,MAAM,CAACoI,cAAc;YACtChK,KAAK,EAAEgB,cAAc;YACrBF,MAAM,EAAEG;UACV,CAAC;QACD,CACH,CAAC,eAEF,IAAAvC,WAAA,CAAAuK,GAAA,EAAC7K,sBAAA,CAAAiB,OAAQ,CAACoJ,IAAI;UAACC,KAAK,EAAE,CAACC,MAAM,CAACsB,YAAY,EAAEzC,aAAa,CAAE;UAAAsB,QAAA,EACxD/E,YAAY,CAACmG,GAAG,CAAEC,IAAc,iBAC/B,IAAAzL,WAAA,CAAAuK,GAAA,EAACxK,KAAA,CAAA2L,IAAI;YAEH7F,MAAM,EAAE4F,IAAI,CAAC5F,MAAO;YACpBC,SAAS,EAAE2F,IAAI,CAAC3F,SAAU;YAC1BE,OAAO,EAAEyF,IAAI,CAACzF,OAAQ;YACtBC,aAAa,EAAEwF,IAAI,CAACxF,aAAc;YAClCG,OAAO,EAAEqF,IAAI,CAACrF,OAAQ;YACtBrE,WAAW,EAAEA,WAAY;YACzBE,UAAU,EAAEA,UAAW;YACvBC,cAAc,EAAEA,cAAe;YAC/BC,aAAa,EAAEA,aAAc;YAC7BwJ,SAAS,EAAEzI,MAAM,CAACyI,SAAU;YAC5BC,aAAa,EAAE1I,MAAM,CAAC0I,aAAc;YACpCjB,UAAU,EAAEzH,MAAM,CAACyH,UAAW;YAC9BE,WAAW,EAAE3H,MAAM,CAAC2H,WAAY;YAChCrI,YAAY,EAAEA,YAAa;YAC3BC,aAAa,EAAEA,aAAc;YAC7BJ,WAAW,EAAEA;UAAY,GAhBpBoJ,IAAI,CAAC5F,MAiBX,CACF;QAAC,CACW,CAAC;MAAA,CACZ;IAAC,CACQ,CAAC;EAAA,CACd,CAAC;AAEX;AAEA,MAAMoE,MAAM,GAAG4B,uBAAU,CAACC,MAAM,CAAC;EAC/B5B,SAAS,EAAE;IACT6B,cAAc,EAAE,QAAQ;IACxBC,UAAU,EAAE,QAAQ;IACpBC,QAAQ,EAAE;EACZ,CAAC;EACD5B,eAAe,EAAE;IACf6B,aAAa,EAAE,KAAK;IACpBF,UAAU,EAAE,QAAQ;IACpBD,cAAc,EAAE,QAAQ;IACxBzK,KAAK,EAAE,MAAM;IACb6K,iBAAiB,EAAE,EAAE;IACrBC,YAAY,EAAE,EAAE;IAChBhK,MAAM,EAAE;EACV,CAAC;EACDkI,UAAU,EAAE;IACV0B,UAAU,EAAE;EACd,CAAC;EACDvB,QAAQ,EAAE;IACR4B,QAAQ,EAAE,EAAE;IACZC,UAAU,EAAE,KAAK;IACjBF,YAAY,EAAE;EAChB,CAAC;EACDxB,QAAQ,EAAE;IACRyB,QAAQ,EAAE,EAAE;IACZC,UAAU,EAAE;EACd,CAAC;EACDtB,QAAQ,EAAE;IACRuB,QAAQ,EAAE,UAAU;IACpBC,KAAK,EAAE,EAAE;IACTC,eAAe,EAAE,CAAC;IAClBN,iBAAiB,EAAE,EAAE;IACrBO,YAAY,EAAE,EAAE;IAChBvC,eAAe,EAAE;EACnB,CAAC;EACDc,SAAS,EAAE;IACToB,QAAQ,EAAE,EAAE;IACZC,UAAU,EAAE;EACd,CAAC;EACDlB,cAAc,EAAE;IACd9J,KAAK,EAAEF,YAAY;IACnBmL,QAAQ,EAAE,UAAU;IACpBL,aAAa,EAAE,KAAK;IACpBF,UAAU,EAAE,UAAU;IACtBD,cAAc,EAAE;EAClB,CAAC;EACDV,eAAe,EAAE;IACfkB,QAAQ,EAAE,UAAU;IACpBI,MAAM,EAAE,EAAE;IACVC,MAAM,EAAE;EACV,CAAC;EACDrB,YAAY,EAAE;IACZgB,QAAQ,EAAE,UAAU;IACpBnK,MAAM,EAAE,MAAM;IACdd,KAAK,EAAE,CAAC;IACRuL,IAAI,EAAEzL,YAAY,GAAG;EACvB;AACF,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Tick = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _reactNative = require("react-native");
9
+ var _jsxRuntime = require("react/jsx-runtime");
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ /**
12
+ * Memoized single tick component.
13
+ * Renders a vertical bar with optional label and today dot indicator.
14
+ * Small and large ticks can be independently colored.
15
+ */
16
+ const Tick = exports.Tick = /*#__PURE__*/_react.default.memo(function Tick({
17
+ offset,
18
+ isLabeled,
19
+ isToday,
20
+ dateStr,
21
+ tickSpacing,
22
+ tickHeight,
23
+ tickTallHeight,
24
+ tickThickness,
25
+ tickColor,
26
+ tickTallColor,
27
+ labelColor,
28
+ accentColor,
29
+ todayDotSize,
30
+ labelFontSize,
31
+ rulerHeight
32
+ }) {
33
+ const resolvedTickColor = isLabeled ? tickTallColor : tickColor;
34
+ const resolvedTickHeight = isLabeled ? tickTallHeight : tickHeight;
35
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
36
+ style: [styles.tickContainer, {
37
+ width: tickSpacing,
38
+ height: rulerHeight,
39
+ position: 'absolute',
40
+ left: offset * tickSpacing - tickSpacing / 2
41
+ }],
42
+ children: [isLabeled && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
43
+ style: [styles.tickLabel, {
44
+ color: labelColor,
45
+ fontSize: labelFontSize
46
+ }],
47
+ children: dateStr
48
+ }), isToday && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
49
+ style: [styles.todayDot, {
50
+ backgroundColor: accentColor,
51
+ width: todayDotSize,
52
+ height: todayDotSize,
53
+ borderRadius: todayDotSize / 2
54
+ }]
55
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
56
+ style: {
57
+ backgroundColor: resolvedTickColor,
58
+ width: tickThickness,
59
+ height: resolvedTickHeight,
60
+ borderRadius: tickThickness / 2
61
+ }
62
+ })]
63
+ });
64
+ });
65
+ const styles = _reactNative.StyleSheet.create({
66
+ tickContainer: {
67
+ justifyContent: 'flex-end',
68
+ alignItems: 'center'
69
+ },
70
+ tickLabel: {
71
+ position: 'absolute',
72
+ top: 10
73
+ },
74
+ todayDot: {
75
+ position: 'absolute',
76
+ top: 25
77
+ }
78
+ });
79
+ //# sourceMappingURL=Tick.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_jsxRuntime","e","__esModule","default","Tick","exports","React","memo","offset","isLabeled","isToday","dateStr","tickSpacing","tickHeight","tickTallHeight","tickThickness","tickColor","tickTallColor","labelColor","accentColor","todayDotSize","labelFontSize","rulerHeight","resolvedTickColor","resolvedTickHeight","jsxs","View","style","styles","tickContainer","width","height","position","left","children","jsx","Text","tickLabel","color","fontSize","todayDot","backgroundColor","borderRadius","StyleSheet","create","justifyContent","alignItems","top"],"sourceRoot":"../../src","sources":["Tick.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAAsD,IAAAE,WAAA,GAAAF,OAAA;AAAA,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAsBtD;AACA;AACA;AACA;AACA;AACO,MAAMG,IAAI,GAAAC,OAAA,CAAAD,IAAA,gBAAGE,cAAK,CAACC,IAAI,CAAC,SAASH,IAAIA,CAAC;EAC3CI,MAAM;EACNC,SAAS;EACTC,OAAO;EACPC,OAAO;EACPC,WAAW;EACXC,UAAU;EACVC,cAAc;EACdC,aAAa;EACbC,SAAS;EACTC,aAAa;EACbC,UAAU;EACVC,WAAW;EACXC,YAAY;EACZC,aAAa;EACbC;AACS,CAAC,EAAE;EACZ,MAAMC,iBAAiB,GAAGd,SAAS,GAAGQ,aAAa,GAAGD,SAAS;EAC/D,MAAMQ,kBAAkB,GAAGf,SAAS,GAAGK,cAAc,GAAGD,UAAU;EAElE,oBACE,IAAAb,WAAA,CAAAyB,IAAA,EAAC1B,YAAA,CAAA2B,IAAI;IACHC,KAAK,EAAE,CACLC,MAAM,CAACC,aAAa,EACpB;MACEC,KAAK,EAAElB,WAAW;MAClBmB,MAAM,EAAET,WAAW;MACnBU,QAAQ,EAAE,UAAU;MACpBC,IAAI,EAAEzB,MAAM,GAAGI,WAAW,GAAGA,WAAW,GAAG;IAC7C,CAAC,CACD;IAAAsB,QAAA,GAEDzB,SAAS,iBACR,IAAAT,WAAA,CAAAmC,GAAA,EAACpC,YAAA,CAAAqC,IAAI;MAACT,KAAK,EAAE,CAACC,MAAM,CAACS,SAAS,EAAE;QAAEC,KAAK,EAAEpB,UAAU;QAAEqB,QAAQ,EAAElB;MAAc,CAAC,CAAE;MAAAa,QAAA,EAC7EvB;IAAO,CACJ,CACP,EACAD,OAAO,iBACN,IAAAV,WAAA,CAAAmC,GAAA,EAACpC,YAAA,CAAA2B,IAAI;MACHC,KAAK,EAAE,CACLC,MAAM,CAACY,QAAQ,EACf;QACEC,eAAe,EAAEtB,WAAW;QAC5BW,KAAK,EAAEV,YAAY;QACnBW,MAAM,EAAEX,YAAY;QACpBsB,YAAY,EAAEtB,YAAY,GAAG;MAC/B,CAAC;IACD,CACH,CACF,eACD,IAAApB,WAAA,CAAAmC,GAAA,EAACpC,YAAA,CAAA2B,IAAI;MACHC,KAAK,EAAE;QACLc,eAAe,EAAElB,iBAAiB;QAClCO,KAAK,EAAEf,aAAa;QACpBgB,MAAM,EAAEP,kBAAkB;QAC1BkB,YAAY,EAAE3B,aAAa,GAAG;MAChC;IAAE,CACH,CAAC;EAAA,CACE,CAAC;AAEX,CAAC,CAAC;AAEF,MAAMa,MAAM,GAAGe,uBAAU,CAACC,MAAM,CAAC;EAC/Bf,aAAa,EAAE;IACbgB,cAAc,EAAE,UAAU;IAC1BC,UAAU,EAAE;EACd,CAAC;EACDT,SAAS,EAAE;IACTL,QAAQ,EAAE,UAAU;IACpBe,GAAG,EAAE;EACP,CAAC;EACDP,QAAQ,EAAE;IACRR,QAAQ,EAAE,UAAU;IACpBe,GAAG,EAAE;EACP;AACF,CAAC,CAAC","ignoreList":[]}