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/src/presets.ts ADDED
@@ -0,0 +1,108 @@
1
+ import type { TickRule } from './types';
2
+
3
+ /**
4
+ * Calendar preset:
5
+ * - 1st of month: tall (30px), bold, month name + day label
6
+ * - Weekly (every 7th day): medium-tall (24px), labeled with day number
7
+ * - Weekends (Saturday & Sunday): medium (18px)
8
+ * - Base daily ticks: short (12px)
9
+ */
10
+ export const DEFAULT_CALENDAR_TICKS: TickRule[] = [
11
+ {
12
+ condition: 'monthly',
13
+ height: 30,
14
+ width: 3.5,
15
+ label: {
16
+ format: (d) =>
17
+ d.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }),
18
+ fontWeight: '700',
19
+ },
20
+ },
21
+ {
22
+ condition: 'weekly',
23
+ height: 24,
24
+ width: 3,
25
+ label: {
26
+ format: (d) => `${d.getDate()}`,
27
+ fontWeight: '600',
28
+ },
29
+ },
30
+ {
31
+ condition: { dayOfWeek: [0, 6] },
32
+ height: 18,
33
+ width: 2.5,
34
+ },
35
+ {
36
+ // Catch-all daily fallback
37
+ condition: 'daily',
38
+ height: 12,
39
+ width: 2,
40
+ },
41
+ ];
42
+
43
+ /**
44
+ * Metric preset:
45
+ * - Every 10th day: tall (28px), labeled
46
+ * - Every 5th day: medium (18px)
47
+ * - Daily: short (12px)
48
+ */
49
+ export const DEFAULT_METRIC_TICKS: TickRule[] = [
50
+ {
51
+ condition: { interval: 10 },
52
+ height: 28,
53
+ width: 3.5,
54
+ label: {
55
+ format: (d) => `${d.getDate()}`,
56
+ fontWeight: '600',
57
+ },
58
+ },
59
+ {
60
+ condition: { interval: 5 },
61
+ height: 18,
62
+ width: 2.5,
63
+ },
64
+ {
65
+ condition: 'daily',
66
+ height: 12,
67
+ width: 2,
68
+ },
69
+ ];
70
+
71
+ /**
72
+ * Minimal preset:
73
+ * - Weekly (7-day): tall (24px), labeled
74
+ * - Daily: short (12px)
75
+ */
76
+ export const DEFAULT_MINIMAL_TICKS: TickRule[] = [
77
+ {
78
+ condition: 'weekly',
79
+ height: 24,
80
+ width: 3,
81
+ label: {
82
+ format: (d) => `${d.getDate()}`,
83
+ },
84
+ },
85
+ {
86
+ condition: 'daily',
87
+ height: 12,
88
+ width: 2,
89
+ },
90
+ ];
91
+
92
+ /**
93
+ * Resolves a tick configuration prop (preset string or rule array) into an array of TickRule objects.
94
+ */
95
+ export function resolveTickRules(
96
+ ticks?: TickRule[] | 'calendar' | 'metric' | 'minimal'
97
+ ): TickRule[] {
98
+ if (Array.isArray(ticks)) {
99
+ return ticks;
100
+ }
101
+ if (ticks === 'metric') {
102
+ return DEFAULT_METRIC_TICKS;
103
+ }
104
+ if (ticks === 'minimal') {
105
+ return DEFAULT_MINIMAL_TICKS;
106
+ }
107
+ return DEFAULT_CALENDAR_TICKS;
108
+ }
@@ -0,0 +1,123 @@
1
+ import type {
2
+ TickContext,
3
+ TickCondition,
4
+ TickRule,
5
+ ResolvedTick,
6
+ ResolvedRulerTheme,
7
+ } from './types';
8
+ import { formatDateString } from './utils';
9
+
10
+ /**
11
+ * Checks whether a given TickCondition matches the provided TickContext.
12
+ */
13
+ export function matchesCondition(
14
+ condition: TickCondition | undefined,
15
+ ctx: TickContext
16
+ ): boolean {
17
+ if (condition === undefined || condition === 'daily') {
18
+ return true;
19
+ }
20
+
21
+ if (condition === 'weekly') {
22
+ return ctx.offset % 7 === 0;
23
+ }
24
+
25
+ if (condition === 'monthly') {
26
+ return ctx.date.getDate() === 1;
27
+ }
28
+
29
+ if (condition === 'yearly') {
30
+ return ctx.date.getDate() === 1 && ctx.date.getMonth() === 0;
31
+ }
32
+
33
+ if (typeof condition === 'object') {
34
+ if ('interval' in condition && typeof condition.interval === 'number') {
35
+ return condition.interval !== 0 && ctx.offset % condition.interval === 0;
36
+ }
37
+ if ('dayOfWeek' in condition && Array.isArray(condition.dayOfWeek)) {
38
+ return condition.dayOfWeek.includes(ctx.date.getDay());
39
+ }
40
+ }
41
+
42
+ if (typeof condition === 'function') {
43
+ return condition(ctx);
44
+ }
45
+
46
+ return false;
47
+ }
48
+
49
+ /**
50
+ * Resolves visual attributes for a tick by evaluating the rule array in order (first match wins).
51
+ */
52
+ export function resolveTick(
53
+ ctx: TickContext,
54
+ rules: TickRule[],
55
+ theme: ResolvedRulerTheme,
56
+ defaultWidth: number = 3
57
+ ): ResolvedTick {
58
+ // Find the first matching rule, or fall back to the last rule in the list
59
+ const matchedRule =
60
+ rules.find((rule) => matchesCondition(rule.condition, ctx)) ??
61
+ rules[rules.length - 1];
62
+
63
+ const height = matchedRule?.height ?? 12;
64
+ const width = matchedRule?.width ?? defaultWidth;
65
+ const color = matchedRule?.color ?? theme.defaultTickColor;
66
+
67
+ // Resolve label
68
+ let labelText: string | undefined;
69
+ let labelColor = theme.labelColor;
70
+ let labelFontSize = 10;
71
+ let labelFontWeight: ResolvedTick['labelFontWeight'] = 'normal';
72
+
73
+ if (matchedRule?.label) {
74
+ if (typeof matchedRule.label === 'object') {
75
+ labelText = matchedRule.label.format
76
+ ? matchedRule.label.format(ctx.date, ctx)
77
+ : String(ctx.date.getDate());
78
+ if (matchedRule.label.color) labelColor = matchedRule.label.color;
79
+ if (matchedRule.label.fontSize) labelFontSize = matchedRule.label.fontSize;
80
+ if (matchedRule.label.fontWeight) labelFontWeight = matchedRule.label.fontWeight;
81
+ } else if (matchedRule.label === true) {
82
+ labelText = String(ctx.date.getDate());
83
+ }
84
+ }
85
+
86
+ // Resolve dot indicator
87
+ let hasDot = false;
88
+ let dotSize = 6;
89
+ let dotColor = theme.accentColor;
90
+
91
+ if (matchedRule?.dot !== undefined) {
92
+ if (typeof matchedRule.dot === 'object') {
93
+ hasDot = true;
94
+ if (matchedRule.dot.size) dotSize = matchedRule.dot.size;
95
+ if (matchedRule.dot.color) dotColor = matchedRule.dot.color;
96
+ } else if (matchedRule.dot === true) {
97
+ hasDot = true;
98
+ }
99
+ } else if (ctx.isToday) {
100
+ // Default: show today dot if rule didn't explicitly disable it
101
+ hasDot = true;
102
+ }
103
+
104
+ return {
105
+ offset: ctx.offset,
106
+ date: ctx.date,
107
+ dateStr: formatDateString(ctx.date),
108
+ height,
109
+ width,
110
+ color,
111
+ labelText,
112
+ labelColor,
113
+ labelFontSize,
114
+ labelFontWeight,
115
+ hasDot,
116
+ dotSize,
117
+ dotColor,
118
+ customRender: matchedRule?.render,
119
+ isToday: ctx.isToday,
120
+ isSelected: ctx.isSelected,
121
+ isInRange: ctx.isInRange ?? false,
122
+ };
123
+ }