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
@@ -1,104 +1,321 @@
1
1
  import type React from 'react';
2
- export interface RulerDatePickerProps {
3
- /** The currently selected date. Accepts a Date object or a YYYY-MM-DD string. */
4
- selectedDate: Date | string;
5
- /**
6
- * Called when the user scrolls to a new date.
7
- * Provides both the Date object and the formatted YYYY-MM-DD string.
8
- */
9
- onSelectDate: (date: Date, dateString: string) => void;
10
- /** Minimum selectable date. Defaults to 365 days before today. */
11
- minDate?: Date;
12
- /** Maximum selectable date. Defaults to 365 days after today. */
13
- maxDate?: Date;
2
+ import type { StyleProp, ViewStyle, TextStyle } from 'react-native';
3
+ /**
4
+ * Context provided to each tick rule during evaluation.
5
+ */
6
+ export interface TickContext {
7
+ /** The Date represented by this tick */
8
+ date: Date;
9
+ /** Day offset relative to reference time (0 = today) */
10
+ offset: number;
11
+ /** True if this date is today */
12
+ isToday: boolean;
13
+ /** True if this date matches the currently selected date */
14
+ isSelected: boolean;
15
+ /** True if this date falls within the selected range (range picker mode) */
16
+ isInRange?: boolean;
17
+ }
18
+ /**
19
+ * Predicate condition determining when a tick rule matches.
20
+ */
21
+ export type TickCondition = 'daily' | 'weekly' | 'monthly' | 'yearly' | {
22
+ interval: number;
23
+ } | {
24
+ dayOfWeek: number[];
25
+ } | ((ctx: TickContext) => boolean);
26
+ /**
27
+ * Configuration for tick date labels.
28
+ */
29
+ export interface TickLabelConfig {
30
+ /** Custom label text formatter */
31
+ format?: (date: Date, ctx: TickContext) => string;
32
+ /** Text color override */
33
+ color?: string;
34
+ /** Font size in pixels (default: 10) */
35
+ fontSize?: number;
36
+ /** Font weight */
37
+ fontWeight?: TextStyle['fontWeight'];
38
+ }
39
+ /**
40
+ * Configuration for the dot indicator (e.g. today dot or milestone badge).
41
+ */
42
+ export interface TickDotConfig {
43
+ /** Dot diameter in pixels (default: 6) */
44
+ size?: number;
45
+ /** Dot fill color */
46
+ color?: string;
47
+ }
48
+ /**
49
+ * Complete declarative definition for a tick variant.
50
+ * Evaluated top-to-bottom; first matching rule is applied.
51
+ */
52
+ export interface TickRule {
14
53
  /**
15
- * Controls which ticks show a date label.
16
- * - `'daily'` — every tick gets a label
17
- * - `'weekly'` (default) — every 7th day
18
- * - `'monthly'` — 1st of each month
19
- * - `(date: Date) => boolean` — custom callback
54
+ * When this rule applies.
55
+ * If omitted, this rule matches unconditionally (serves as the fallback).
20
56
  */
21
- labelInterval?: 'daily' | 'weekly' | 'monthly' | ((date: Date) => boolean);
22
- /** Days of the week to visually highlight. 0 = Sunday, 6 = Saturday. e.g. [0, 6] for weekends. */
23
- highlightDays?: number[];
24
- /** Gap between ticks in pixels. Default: 24 */
25
- tickSpacing?: number;
26
- /** Height of small (unlabeled) ticks in pixels. Default: 12 */
27
- tickHeight?: number;
28
- /** Height of tall (labeled) ticks in pixels. Default: 24 */
29
- tickTallHeight?: number;
30
- /** Width of each tick bar in pixels. Default: 4 */
31
- tickThickness?: number;
32
- /** Color of small (unlabeled) ticks. */
33
- tickColor?: string;
34
- /** Color of tall (labeled) ticks. Falls back to tickColor if not specified. */
35
- tickTallColor?: string;
36
- /** Color of date label text beneath labeled ticks. */
37
- labelColor?: string;
38
- /** Color of the today dot indicator and reset button text. */
39
- accentColor?: string;
40
- /** Color of the center selection indicator line. */
57
+ condition?: TickCondition;
58
+ /** Height of the tick bar in pixels */
59
+ height: number;
60
+ /** Width/thickness of the tick bar in pixels (defaults to tickWidth or 3) */
61
+ width?: number;
62
+ /** Color of the tick bar */
63
+ color?: string;
64
+ /** Label configuration or boolean (true uses day number) */
65
+ label?: boolean | TickLabelConfig;
66
+ /** Dot badge indicator (e.g., today marker) */
67
+ dot?: boolean | TickDotConfig;
68
+ /** Custom React component render override for this tick */
69
+ render?: (ctx: TickContext) => React.ReactNode;
70
+ }
71
+ /**
72
+ * Resolved visual attributes for rendering a single tick.
73
+ */
74
+ export interface ResolvedTick {
75
+ offset: number;
76
+ date: Date;
77
+ dateStr: string;
78
+ height: number;
79
+ width: number;
80
+ color: string;
81
+ labelText?: string;
82
+ labelColor: string;
83
+ labelFontSize: number;
84
+ labelFontWeight: TextStyle['fontWeight'];
85
+ hasDot: boolean;
86
+ dotSize: number;
87
+ dotColor: string;
88
+ customRender?: (ctx: TickContext) => React.ReactNode;
89
+ isToday: boolean;
90
+ isSelected: boolean;
91
+ isInRange: boolean;
92
+ }
93
+ export interface RulerTheme {
94
+ /** Background color of the picker component */
95
+ background?: string;
96
+ /** Color of the center selection needle */
41
97
  indicatorColor?: string;
42
- /** Background color of the entire component. Default: transparent */
43
- backgroundColor?: string;
44
- /** Total component height in pixels. Default: 120 */
98
+ /** Primary accent color (used for today dot, active labels, etc.) */
99
+ accentColor?: string;
100
+ /** Default label text color */
101
+ labelColor?: string;
102
+ /** Default tick bar color when not overridden by a rule */
103
+ defaultTickColor?: string;
104
+ /** Color for range selection connecting bar in range mode */
105
+ rangeHighlightColor?: string;
106
+ }
107
+ export type ResolvedRulerTheme = Required<RulerTheme>;
108
+ /**
109
+ * Configuration for the center alignment needle indicator.
110
+ */
111
+ export interface IndicatorConfig {
112
+ /** Width of the center indicator needle in pixels (default: 2) */
113
+ width?: number;
114
+ /** Height of the center indicator needle in pixels (default: 40) */
45
115
  height?: number;
46
- /** Height of the ruler track area in pixels. Default: 60 */
47
- rulerHeight?: number;
48
- /** Width of the center selection indicator bar in pixels. Default: 2 */
49
- indicatorWidth?: number;
50
- /** Height of the center selection indicator bar in pixels. Default: 40 */
51
- indicatorHeight?: number;
52
- /** Diameter of the today dot indicator in pixels. Default: 6 */
53
- todayDotSize?: number;
54
- /** Font size of tick date labels in pixels. Default: 10 */
55
- labelFontSize?: number;
56
- /** Number of off-screen ticks to render as buffer on each side. Default: 10 */
57
- bufferTicks?: number;
58
- /** Debounce interval in ms before calling onSelectDate. Default: 100 */
59
- updateDebounceMs?: number;
60
- /** Enable or disable haptic feedback. Default: true */
61
- enableHaptics?: boolean;
116
+ /** Color of the center indicator needle */
117
+ color?: string;
62
118
  /**
63
- * Custom haptic trigger callback. When provided, overrides the default
64
- * expo-haptics implementation. Receives the haptic mode:
65
- * - `'tick'` — single discrete haptic (slow scrolling)
66
- * - `'continuous'` — continuous buzz (fast scrolling)
119
+ * Offset [x, y] in pixels of the center needle pointer.
120
+ * Default: [0, 0] (anchored to bottom).
67
121
  */
68
- onHapticTrigger?: (mode: 'tick' | 'continuous') => void;
69
- /** Number of ticks crossed per frame to trigger fast/continuous haptic mode. Default: 1 */
122
+ offset?: [number, number];
123
+ /** Custom style for the center indicator needle */
124
+ style?: StyleProp<ViewStyle>;
125
+ /** Custom renderer for the center indicator */
126
+ render?: () => React.ReactNode;
127
+ }
128
+ /**
129
+ * Configuration for the date picker header.
130
+ */
131
+ export interface HeaderConfig {
132
+ /** Show "Today" reset button when not on today (default: false) */
133
+ showResetToToday?: boolean;
134
+ /** Text label for the reset button (default: 'Today') */
135
+ resetLabel?: string;
136
+ /** Header container style */
137
+ style?: StyleProp<ViewStyle>;
138
+ /** Header date label style */
139
+ dateStyle?: StyleProp<TextStyle>;
140
+ /** Header year label style */
141
+ yearStyle?: StyleProp<TextStyle>;
142
+ /** Custom date format function for the header text */
143
+ format?: (date: Date) => string;
144
+ /** Custom header renderer replacing the default header */
145
+ render?: (selectedDate: Date, isToday: boolean, resetToToday: () => void) => React.ReactNode;
146
+ }
147
+ /**
148
+ * Configuration for tactile haptic feedback.
149
+ */
150
+ export interface HapticConfig {
151
+ /** Whether haptics are enabled (default: true) */
152
+ enabled?: boolean;
153
+ /** Custom haptic callback (e.g. for Expo Haptics) */
154
+ onTrigger?: (mode: 'tick' | 'continuous') => void;
155
+ /** Speed threshold (ticks/frame) to trigger continuous buzz mode (default: 1) */
70
156
  fastSwipeTickThreshold?: number;
71
- /** Interval in ms between haptic pulses in continuous mode. Default: 20 */
157
+ /** Pulse interval in ms during continuous haptic mode (default: 20) */
72
158
  continuousHapticIntervalMs?: number;
73
- /** Show a "Today" reset button when not on today's date. Default: false */
74
- showResetToToday?: boolean;
159
+ }
160
+ export interface RulerDatePickerProps {
161
+ /** Currently selected date (controlled). Accepts Date or YYYY-MM-DD string. */
162
+ value?: Date | string;
163
+ /** Initial selected date (uncontrolled). Accepts Date or YYYY-MM-DD string. */
164
+ defaultValue?: Date | string;
165
+ /** Called when user scrolls to a date */
166
+ onChange?: (date: Date, dateString: string) => void;
167
+ /** Minimum selectable date */
168
+ minDate?: Date | string;
169
+ /** Maximum selectable date */
170
+ maxDate?: Date | string;
171
+ /** BCP 47 locale string for date formatting (default: system 'default') */
172
+ locale?: string;
173
+ /** Array of tick rules or a preset name ('calendar' | 'metric' | 'minimal') */
174
+ ticks?: TickRule[] | 'calendar' | 'metric' | 'minimal';
175
+ /** Distance in pixels between tick centers (default: 24) */
176
+ tickSpacing?: number;
177
+ /** Base width of tick bars in pixels (default: 3) */
178
+ tickWidth?: number;
179
+ /** Width of the ruler viewport track in pixels (default: window width) */
180
+ width?: number;
181
+ /** Height of the ruler track area in pixels (default: 60) */
182
+ rulerHeight?: number;
183
+ /** Color theme overrides (background, indicatorColor, accentColor, labelColor, etc.) */
184
+ theme?: RulerTheme;
185
+ /** Container style */
186
+ style?: StyleProp<ViewStyle>;
187
+ /** Center indicator needle configuration or boolean toggle (default: true) */
188
+ indicator?: boolean | IndicatorConfig;
189
+ /** Header configuration or boolean toggle (default: true) */
190
+ header?: boolean | HeaderConfig;
191
+ /** Haptics configuration or boolean toggle (default: true) */
192
+ haptics?: boolean | HapticConfig;
75
193
  /**
76
- * Custom header renderer. When provided, replaces the default date header.
77
- * Receives the selected date, whether it's today, and a function to reset to today.
194
+ * Enable non-linear fisheye lens distortion where tick spacing is wider near the center
195
+ * needle and gradually flattens out to standard spacing away from the center.
196
+ * Can be true (for default configuration) or a custom LensConfig object.
78
197
  */
79
- renderHeader?: (selectedDate: Date, isToday: boolean, resetToToday: () => void) => React.ReactNode;
198
+ lensEffect?: boolean | LensConfig;
199
+ /** Debounce ms for onChange during scrolling (default: 100) */
200
+ debounceMs?: number;
201
+ /** Test ID for automated tests */
202
+ testID?: string;
203
+ /** Accessibility label for assistive technologies / screen readers */
204
+ accessibilityLabel?: string;
205
+ }
206
+ export interface LensConfig {
207
+ /**
208
+ * Spacing magnification factor at the center needle.
209
+ * (e.g. 1.6 means 60% wider spacing at the needle).
210
+ * Default: 1.6
211
+ */
212
+ magnification?: number;
213
+ /**
214
+ * Radius in pixels around the center needle over which the magnification
215
+ * smoothly transitions back to standard linear spacing.
216
+ * Default: 60
217
+ */
218
+ radius?: number;
219
+ /**
220
+ * Whether to subtly scale tick bar height and label prominence near the center.
221
+ * Default: true
222
+ */
223
+ scaleTicks?: boolean;
80
224
  }
81
225
  /**
82
- * Internal type for resolved color values.
83
- * @internal
226
+ * Date range boundaries representation.
227
+ *
228
+ * @experimental
84
229
  */
85
- export interface ResolvedColors {
86
- tickColor: string;
87
- tickTallColor: string;
88
- labelColor: string;
89
- accentColor: string;
90
- indicatorColor: string;
91
- backgroundColor: string;
230
+ export interface DateRange {
231
+ start: Date | string;
232
+ end: Date | string;
92
233
  }
93
234
  /**
94
- * Internal tick data used for rendering.
95
- * @internal
235
+ * Payload delivered to onChange when range selection changes.
236
+ *
237
+ * @experimental
96
238
  */
97
- export interface TickData {
98
- offset: number;
99
- isLabeled: boolean;
100
- isToday: boolean;
101
- isHighlighted: boolean;
102
- dateStr: string;
239
+ export interface DateRangeChangePayload {
240
+ start: Date;
241
+ end: Date;
242
+ startDate: Date;
243
+ endDate: Date;
244
+ startString: string;
245
+ endString: string;
246
+ spanDays: number;
247
+ }
248
+ /**
249
+ * Context provided to custom range header render callbacks.
250
+ *
251
+ * @experimental
252
+ */
253
+ export interface RangeHeaderContext {
254
+ start: Date;
255
+ end: Date;
256
+ spanDays: number;
257
+ activeHandle: 'start' | 'end';
258
+ scrollToHandle: (handle: 'start' | 'end', animated?: boolean) => void;
259
+ }
260
+ /**
261
+ * Configuration options for the range header.
262
+ *
263
+ * @experimental
264
+ */
265
+ export interface RangeHeaderConfig {
266
+ /** Header container style */
267
+ style?: StyleProp<ViewStyle>;
268
+ /** Header date label style */
269
+ dateStyle?: StyleProp<TextStyle>;
270
+ /** Custom date format function for start/end labels */
271
+ format?: (date: Date) => string;
272
+ /** Custom header renderer replacing default range header */
273
+ render?: (context: RangeHeaderContext) => React.ReactNode;
274
+ }
275
+ /**
276
+ * Configuration for the date range highlight span connecting the handles.
277
+ *
278
+ * @experimental
279
+ */
280
+ export interface RangeHighlightConfig {
281
+ /** Color of the range connecting highlight strip (default: theme.rangeHighlightColor) */
282
+ color?: string;
283
+ /** Custom style for the range highlight span */
284
+ style?: StyleProp<ViewStyle>;
285
+ /** Custom renderer for the range highlight span */
286
+ render?: (startOffset: number, endOffset: number, tickSpacing: number) => React.ReactNode;
287
+ }
288
+ /**
289
+ * Configuration for the center indicator needle in range mode.
290
+ *
291
+ * @experimental
292
+ */
293
+ export interface RangeIndicatorConfig extends Omit<IndicatorConfig, 'render'> {
294
+ /** Custom renderer for range needle indicator receiving active handle and date */
295
+ render?: (handle: 'start' | 'end', date: Date) => React.ReactNode;
296
+ }
297
+ /**
298
+ * Props for `RulerDateRangePicker`.
299
+ *
300
+ * @experimental This component and its props are experimental. The API may
301
+ * undergo breaking changes in future minor versions.
302
+ */
303
+ export interface RulerDateRangePickerProps extends Omit<RulerDatePickerProps, 'value' | 'defaultValue' | 'onChange' | 'header' | 'indicator'> {
304
+ /** Currently selected date range (controlled) */
305
+ value?: DateRange;
306
+ /** Initial selected date range (uncontrolled) */
307
+ defaultValue?: DateRange;
308
+ /** Called when the selected range changes */
309
+ onChange?: (range: DateRangeChangePayload) => void;
310
+ /** Header configuration or boolean toggle (default: true) */
311
+ header?: boolean | RangeHeaderConfig;
312
+ /** Center indicator needle configuration or boolean toggle (default: true) */
313
+ indicator?: boolean | RangeIndicatorConfig;
314
+ /** Range connecting highlight strip configuration or boolean toggle (default: true) */
315
+ highlight?: boolean | RangeHighlightConfig;
316
+ /** Minimum selectable span in days (default: 1) */
317
+ minSpanDays?: number;
318
+ /** Maximum selectable span in days */
319
+ maxSpanDays?: number;
103
320
  }
104
321
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,oBAAoB;IAEnC,iFAAiF;IACjF,YAAY,EAAE,IAAI,GAAG,MAAM,CAAC;IAC5B;;;OAGG;IACH,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,kEAAkE;IAClE,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,iEAAiE;IACjE,OAAO,CAAC,EAAE,IAAI,CAAC;IAGf;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC;IAC3E,kGAAkG;IAClG,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAGzB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAG1B,uDAAuD;IACvD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,KAAK,IAAI,CAAC;IACxD,2FAA2F;IAC3F,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,2EAA2E;IAC3E,0BAA0B,CAAC,EAAE,MAAM,CAAC;IAGpC,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAG3B;;;OAGG;IACH,YAAY,CAAC,EAAE,CACb,YAAY,EAAE,IAAI,EAClB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,MAAM,IAAI,KACrB,KAAK,CAAC,SAAS,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ interface UseHapticsOptions {
2
+ enableHaptics: boolean;
3
+ onHapticTrigger?: (mode: 'tick' | 'continuous') => void;
4
+ continuousHapticIntervalMs?: number;
5
+ }
6
+ interface HapticsAPI {
7
+ fireDiscreteHaptic: () => void;
8
+ startContinuousHaptic: () => void;
9
+ stopContinuousHaptic: () => void;
10
+ }
11
+ /**
12
+ * Haptics hook implementation for Web environments.
13
+ * Delegates to onHapticTrigger if provided, otherwise gracefully no-ops without requiring expo-haptics.
14
+ */
15
+ export declare function useHaptics({ enableHaptics, onHapticTrigger, continuousHapticIntervalMs, }: UseHapticsOptions): HapticsAPI;
16
+ export {};
17
+ //# sourceMappingURL=useHaptics.web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHaptics.web.d.ts","sourceRoot":"","sources":["../../src/useHaptics.web.ts"],"names":[],"mappings":"AAGA,UAAU,iBAAiB;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,KAAK,IAAI,CAAC;IACxD,0BAA0B,CAAC,EAAE,MAAM,CAAC;CACrC;AAED,UAAU,UAAU;IAClB,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,qBAAqB,EAAE,MAAM,IAAI,CAAC;IAClC,oBAAoB,EAAE,MAAM,IAAI,CAAC;CAClC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EACzB,aAAa,EACb,eAAe,EACf,0BAAgE,GACjE,EAAE,iBAAiB,GAAG,UAAU,CA+BhC"}
@@ -0,0 +1,26 @@
1
+ import { type SharedValue } from 'react-native-reanimated';
2
+ import { type PanGesture } from 'react-native-gesture-handler';
3
+ import type { RulerDatePickerProps, ResolvedTick, ResolvedRulerTheme } from './types';
4
+ export interface UseRulerDatePickerReturn {
5
+ translateX: SharedValue<number>;
6
+ panGesture: PanGesture;
7
+ selectedDate: Date;
8
+ selectedDateStr: string;
9
+ isTodaySelected: boolean;
10
+ visibleTicks: ResolvedTick[];
11
+ theme: ResolvedRulerTheme;
12
+ tickSpacing: number;
13
+ rulerHeight: number;
14
+ height: number;
15
+ width: number;
16
+ minOffset: number;
17
+ maxOffset: number;
18
+ scrollToDate: (targetDate: Date | string, animated?: boolean) => void;
19
+ resetToToday: (animated?: boolean) => void;
20
+ }
21
+ /**
22
+ * Headless Hook encapsulating gesture physics, Reanimated 3 decay/snapping,
23
+ * windowed tick resolution, and haptics for the Ruler Date Picker.
24
+ */
25
+ export declare function useRulerDatePicker(props?: RulerDatePickerProps): UseRulerDatePickerReturn;
26
+ //# sourceMappingURL=useRulerDatePicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRulerDatePicker.d.ts","sourceRoot":"","sources":["../../src/useRulerDatePicker.ts"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAW,KAAK,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAExE,OAAO,KAAK,EACV,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EACnB,MAAM,SAAS,CAAC;AAcjB,MAAM,WAAW,wBAAwB;IAEvC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,UAAU,EAAE,UAAU,CAAC;IAGvB,YAAY,EAAE,IAAI,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IAGzB,YAAY,EAAE,YAAY,EAAE,CAAC;IAG7B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAGlB,YAAY,EAAE,CAAC,UAAU,EAAE,IAAI,GAAG,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACtE,YAAY,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,GAAE,oBAAyB,GAC/B,wBAAwB,CAqT1B"}
@@ -0,0 +1,40 @@
1
+ import { type SharedValue } from 'react-native-reanimated';
2
+ import { type PanGesture } from 'react-native-gesture-handler';
3
+ import type { RulerDateRangePickerProps, ResolvedTick, ResolvedRulerTheme } from './types';
4
+ /**
5
+ * Return interface for the `useRulerDateRangePicker` headless hook.
6
+ *
7
+ * @experimental
8
+ */
9
+ export interface UseRulerDateRangePickerReturn {
10
+ translateX: SharedValue<number>;
11
+ panGesture: PanGesture;
12
+ startDate: Date;
13
+ endDate: Date;
14
+ startDateStr: string;
15
+ endDateStr: string;
16
+ startOffset: number;
17
+ endOffset: number;
18
+ spanDays: number;
19
+ activeHandle: 'start' | 'end';
20
+ setActiveHandle: (handle: 'start' | 'end') => void;
21
+ visibleTicks: ResolvedTick[];
22
+ theme: ResolvedRulerTheme;
23
+ tickSpacing: number;
24
+ rulerHeight: number;
25
+ height: number;
26
+ width: number;
27
+ minOffset: number;
28
+ maxOffset: number;
29
+ scrollToHandle: (handle: 'start' | 'end', animated?: boolean) => void;
30
+ setRange: (start: Date | string, end: Date | string) => void;
31
+ }
32
+ /**
33
+ * Headless Hook for managing Date Range selection with dual pins,
34
+ * range highlight calculations, and Reanimated 3 physics.
35
+ *
36
+ * @experimental This hook is experimental and subject to breaking changes
37
+ * in future minor versions.
38
+ */
39
+ export declare function useRulerDateRangePicker(props?: RulerDateRangePickerProps): UseRulerDateRangePickerReturn;
40
+ //# sourceMappingURL=useRulerDateRangePicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRulerDateRangePicker.d.ts","sourceRoot":"","sources":["../../src/useRulerDateRangePicker.ts"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAW,KAAK,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAExE,OAAO,KAAK,EACV,yBAAyB,EACzB,YAAY,EACZ,kBAAkB,EAEnB,MAAM,SAAS,CAAC;AAcjB;;;;GAIG;AACH,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,UAAU,EAAE,UAAU,CAAC;IAGvB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,GAAG,KAAK,CAAC;IAC9B,eAAe,EAAE,CAAC,MAAM,EAAE,OAAO,GAAG,KAAK,KAAK,IAAI,CAAC;IAGnD,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAGlB,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,GAAG,KAAK,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACtE,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC;CAC9D;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,GAAE,yBAA8B,GACpC,6BAA6B,CAwY/B"}
@@ -1,31 +1,33 @@
1
- import type { RulerDatePickerProps, ResolvedColors } from './types';
1
+ import type { RulerTheme, ResolvedRulerTheme } from './types';
2
2
  /**
3
3
  * Formats a Date object as a local YYYY-MM-DD string,
4
4
  * avoiding timezone shifting bugs caused by toISOString().
5
5
  */
6
6
  export declare function formatDateString(date?: Date): string;
7
+ /**
8
+ * Normalizes a Date or string to a local midnight Date object.
9
+ * Parses YYYY-MM-DD explicitly as local midnight to avoid UTC timezone shifts,
10
+ * and guards against Invalid Dates.
11
+ */
12
+ export declare function normalizeDate(input?: Date | string): Date;
7
13
  /**
8
14
  * Converts a Date or YYYY-MM-DD string to a day offset relative to a reference time.
9
15
  */
10
16
  export declare function dateToDayOffset(date: Date | string, referenceTime: number): number;
11
17
  /**
12
- * Converts a day offset back to a Date object.
18
+ * Converts a day offset back to a Date object at local midnight.
19
+ * Uses native calendar math (setDate) to avoid Daylight Saving Time (DST) 23h/25h hour drift.
13
20
  */
14
21
  export declare function dayOffsetToDate(offset: number, referenceTime: number): Date;
15
- /**
16
- * Resolves user-provided color props against the system color scheme defaults.
17
- * User-provided values always take precedence.
18
- */
19
- export declare function useResolvedColors(props: Pick<RulerDatePickerProps, 'tickColor' | 'tickTallColor' | 'labelColor' | 'accentColor' | 'indicatorColor' | 'backgroundColor'>): ResolvedColors;
20
- /**
21
- * Determines whether a date should display a label based on the labelInterval setting.
22
- */
23
- export declare function shouldShowLabel(date: Date, labelInterval: RulerDatePickerProps['labelInterval'], todayTime: number): boolean;
24
22
  /**
25
23
  * Computes the min/max day offsets from props or defaults.
26
24
  */
27
- export declare function computeDayRange(todayTime: number, minDate?: Date, maxDate?: Date): {
25
+ export declare function computeDayRange(todayTime: number, minDate?: Date | string, maxDate?: Date | string): {
28
26
  minOffset: number;
29
27
  maxOffset: number;
30
28
  };
29
+ /**
30
+ * Resolves user-provided theme against the system color scheme defaults (Light/Dark).
31
+ */
32
+ export declare function useResolvedTheme(theme?: RulerTheme): ResolvedRulerTheme;
31
33
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM,CAKhE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,IAAI,GAAG,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,MAAM,CAIR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAE3E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,IAAI,CACT,oBAAoB,EAClB,WAAW,GACX,eAAe,GACf,YAAY,GACZ,aAAa,GACb,gBAAgB,GAChB,iBAAiB,CACpB,GACA,cAAc,CAYhB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,oBAAoB,CAAC,eAAe,CAAC,EACpD,SAAS,EAAE,MAAM,GAChB,OAAO,CAmBT;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,IAAI,EACd,OAAO,CAAC,EAAE,IAAI,GACb;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAiB1C"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE9D;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM,CAKhE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAwBzD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,IAAI,GAAG,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,MAAM,CAGR;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAK3E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM,EACvB,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM,GACtB;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAqB1C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,kBAAkB,CAYvE"}