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
package/package.json CHANGED
@@ -1,8 +1,7 @@
1
1
  {
2
2
  "name": "react-native-ruler-date-picker",
3
- "version": "0.1.0",
4
- "description": "A performant, customizable ruler-style date picker for React Native — 60 FPS Reanimated 3 physics, dual-speed haptic feedback, and windowed tick rendering.",
5
- "type": "commonjs",
3
+ "version": "0.2.0",
4
+ "description": "A performant, customizable horizontal ruler date picker & scroll wheel for React Native & Expo — 60 FPS Reanimated 3 physics, dual-speed haptic feedback, and windowed tick rendering.",
6
5
  "main": "lib/commonjs/index.js",
7
6
  "module": "lib/module/index.js",
8
7
  "types": "lib/typescript/index.d.ts",
@@ -32,6 +31,7 @@
32
31
  ],
33
32
  "scripts": {
34
33
  "build": "bob build",
34
+ "prepack": "bob build",
35
35
  "typecheck": "tsc --noEmit",
36
36
  "test": "jest",
37
37
  "lint": "eslint \"src/**/*.{ts,tsx}\"",
@@ -39,14 +39,22 @@
39
39
  },
40
40
  "keywords": [
41
41
  "react-native",
42
+ "react-native-date-picker",
42
43
  "date-picker",
43
44
  "ruler",
45
+ "ruler-date-picker",
44
46
  "scroll-picker",
47
+ "wheel-picker",
48
+ "horizontal-date-picker",
49
+ "timeline-picker",
50
+ "expo",
51
+ "expo-date-picker",
45
52
  "reanimated",
46
53
  "haptics",
54
+ "gesture-handler",
55
+ "ui-components",
47
56
  "ios",
48
- "android",
49
- "gesture-handler"
57
+ "android"
50
58
  ],
51
59
  "repository": {
52
60
  "type": "git",
@@ -93,8 +101,18 @@
93
101
  "source": "src",
94
102
  "output": "lib",
95
103
  "targets": [
96
- "commonjs",
97
- "module",
104
+ [
105
+ "commonjs",
106
+ {
107
+ "esm": true
108
+ }
109
+ ],
110
+ [
111
+ "module",
112
+ {
113
+ "esm": true
114
+ }
115
+ ],
98
116
  [
99
117
  "typescript",
100
118
  {
@@ -0,0 +1,90 @@
1
+ import React from 'react';
2
+ import { StyleSheet } from 'react-native';
3
+ import Animated, { useAnimatedStyle, type SharedValue } from 'react-native-reanimated';
4
+ import { useRulerContext } from './RulerContext';
5
+ import { Tick } from './Tick';
6
+ import type { ResolvedTick } from './types';
7
+
8
+ export interface LensTickProps {
9
+ tick: ResolvedTick;
10
+ tickSpacing: number;
11
+ rulerHeight: number;
12
+ translateX: SharedValue<number>;
13
+ magnification: number;
14
+ radius: number;
15
+ scaleTicks: boolean;
16
+ containerWidth?: number;
17
+ }
18
+
19
+ /**
20
+ * Animated tick item with non-linear hyperbolic-tangent spatial distortion.
21
+ * Tick spacing smoothly magnifies near the center needle and asymptotically
22
+ * flattens out to standard spacing away from the center.
23
+ */
24
+ export function LensTick({
25
+ tick,
26
+ tickSpacing,
27
+ rulerHeight,
28
+ translateX,
29
+ magnification,
30
+ radius,
31
+ scaleTicks,
32
+ containerWidth,
33
+ }: LensTickProps) {
34
+ const { width: contextWidth } = useRulerContext();
35
+ const width = containerWidth ?? contextWidth;
36
+
37
+ const animatedStyle = useAnimatedStyle(() => {
38
+ 'worklet';
39
+ const d = tick.offset * tickSpacing + translateX.value;
40
+ const A = (magnification - 1) * radius;
41
+ const warpedX = d + A * Math.tanh(d / radius);
42
+
43
+ if (!scaleTicks) {
44
+ return {
45
+ transform: [{ translateX: warpedX }],
46
+ };
47
+ }
48
+
49
+ const dist = Math.abs(d);
50
+ const radiusLimit = radius * 1.5;
51
+ const factor = dist < radiusLimit ? 1 - dist / radiusLimit : 0;
52
+ const scale = 1 + (magnification - 1) * 0.25 * factor;
53
+
54
+ return {
55
+ transform: [
56
+ { translateX: warpedX },
57
+ { scale: scale },
58
+ ],
59
+ };
60
+ }, [tick.offset, tickSpacing, translateX, magnification, radius, scaleTicks]);
61
+
62
+ return (
63
+ <Animated.View
64
+ style={[
65
+ styles.lensTickWrapper,
66
+ { height: rulerHeight, left: width / 2 },
67
+ animatedStyle,
68
+ ]}
69
+ >
70
+ <Tick
71
+ tick={{
72
+ ...tick,
73
+ offset: 0,
74
+ }}
75
+ tickSpacing={tickSpacing}
76
+ rulerHeight={rulerHeight}
77
+ />
78
+ </Animated.View>
79
+ );
80
+ }
81
+
82
+ const styles = StyleSheet.create({
83
+ lensTickWrapper: {
84
+ position: 'absolute',
85
+ height: '100%',
86
+ width: 0,
87
+ justifyContent: 'flex-end',
88
+ alignItems: 'center',
89
+ },
90
+ });
package/src/Ruler.ts ADDED
@@ -0,0 +1,32 @@
1
+ import { RulerRoot } from './RulerRoot';
2
+ import { RulerTrack } from './RulerTrack';
3
+ import { RulerIndicator } from './RulerIndicator';
4
+ import { RulerTicks } from './RulerTicks';
5
+ import { Tick } from './Tick';
6
+ import { RulerHeader } from './RulerHeader';
7
+ import { RulerResetButton } from './RulerResetButton';
8
+ import { RulerLensTrack } from './RulerLensTrack';
9
+ import { RulerLensTicks } from './RulerLensTicks';
10
+
11
+ /**
12
+ * Compound Anatomy API for the Ruler Date Picker.
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * <Ruler.Root value={selectedDate} onChange={setSelectedDate}>
17
+ * <Ruler.Header />
18
+ * <Ruler.LensTrack />
19
+ * </Ruler.Root>
20
+ * ```
21
+ */
22
+ export const Ruler = {
23
+ Root: RulerRoot,
24
+ Track: RulerTrack,
25
+ LensTrack: RulerLensTrack,
26
+ Ticks: RulerTicks,
27
+ LensTicks: RulerLensTicks,
28
+ Indicator: RulerIndicator,
29
+ Tick: Tick,
30
+ Header: RulerHeader,
31
+ ResetButton: RulerResetButton,
32
+ };
@@ -0,0 +1,20 @@
1
+ import { createContext, useContext } from 'react';
2
+ import type { UseRulerDatePickerReturn } from './useRulerDatePicker';
3
+ import type { LensConfig, IndicatorConfig, HeaderConfig } from './types';
4
+
5
+ export interface RulerContextValue extends UseRulerDatePickerReturn {
6
+ indicatorConfig?: IndicatorConfig;
7
+ headerConfig?: HeaderConfig;
8
+ locale?: string;
9
+ lensConfig?: Required<LensConfig> | null;
10
+ }
11
+
12
+ export const RulerContext = createContext<RulerContextValue | null>(null);
13
+
14
+ export function useRulerContext(): RulerContextValue {
15
+ const context = useContext(RulerContext);
16
+ if (!context) {
17
+ throw new Error('Ruler compound subcomponents must be rendered within a <Ruler.Root> provider.');
18
+ }
19
+ return context;
20
+ }