@calchemy/date-react 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 (78) hide show
  1. package/LICENSE +21 -0
  2. package/dist/calendar-scroll.d.ts +2 -0
  3. package/dist/calendar-scroll.d.ts.map +1 -0
  4. package/dist/calendar-scroll.js +225 -0
  5. package/dist/calendar-scroll.js.map +1 -0
  6. package/dist/chunk-KI7GMSS3.js +451 -0
  7. package/dist/chunk-KI7GMSS3.js.map +1 -0
  8. package/dist/chunk-NGJGJXY4.js +34 -0
  9. package/dist/chunk-NGJGJXY4.js.map +1 -0
  10. package/dist/components/Calchemy.d.ts +50 -0
  11. package/dist/components/Calchemy.d.ts.map +1 -0
  12. package/dist/components/Calchemy.js +57 -0
  13. package/dist/components/Calchemy.js.map +1 -0
  14. package/dist/components/calendar/Calendar.d.ts +19 -0
  15. package/dist/components/calendar/Calendar.d.ts.map +1 -0
  16. package/dist/components/calendar/Calendar.js +218 -0
  17. package/dist/components/calendar/Calendar.js.map +1 -0
  18. package/dist/components/calendar/CalendarGrid.d.ts +12 -0
  19. package/dist/components/calendar/CalendarGrid.d.ts.map +1 -0
  20. package/dist/components/calendar/CalendarGrid.js +93 -0
  21. package/dist/components/calendar/CalendarGrid.js.map +1 -0
  22. package/dist/components/calendar/CalendarPeriod.d.ts +6 -0
  23. package/dist/components/calendar/CalendarPeriod.d.ts.map +1 -0
  24. package/dist/components/calendar/CalendarPeriod.js +42 -0
  25. package/dist/components/calendar/CalendarPeriod.js.map +1 -0
  26. package/dist/components/calendar/CalendarPeriodHeading.d.ts +4 -0
  27. package/dist/components/calendar/CalendarPeriodHeading.d.ts.map +1 -0
  28. package/dist/components/calendar/CalendarPeriodHeading.js +9 -0
  29. package/dist/components/calendar/CalendarPeriodHeading.js.map +1 -0
  30. package/dist/components/calendar/CalendarPeriodList.d.ts +6 -0
  31. package/dist/components/calendar/CalendarPeriodList.d.ts.map +1 -0
  32. package/dist/components/calendar/CalendarPeriodList.js +93 -0
  33. package/dist/components/calendar/CalendarPeriodList.js.map +1 -0
  34. package/dist/components/calendar/CalendarScroll.d.ts +8 -0
  35. package/dist/components/calendar/CalendarScroll.d.ts.map +1 -0
  36. package/dist/components/calendar/CalendarScroll.js +115 -0
  37. package/dist/components/calendar/CalendarScroll.js.map +1 -0
  38. package/dist/components/calendar/CalendarSelects.d.ts +12 -0
  39. package/dist/components/calendar/CalendarSelects.d.ts.map +1 -0
  40. package/dist/components/calendar/CalendarSelects.js +31 -0
  41. package/dist/components/calendar/CalendarSelects.js.map +1 -0
  42. package/dist/components/calendar/calendar-period-drag.d.ts +74 -0
  43. package/dist/components/calendar/calendar-period-drag.d.ts.map +1 -0
  44. package/dist/components/calendar/calendar-period-drag.js +374 -0
  45. package/dist/components/calendar/calendar-period-drag.js.map +1 -0
  46. package/dist/components/calendar/context.d.ts +10 -0
  47. package/dist/components/calendar/context.d.ts.map +1 -0
  48. package/dist/components/calendar/context.js +23 -0
  49. package/dist/components/calendar/context.js.map +1 -0
  50. package/dist/components/calendar/date-model.d.ts +36 -0
  51. package/dist/components/calendar/date-model.d.ts.map +1 -0
  52. package/dist/components/calendar/date-model.js +257 -0
  53. package/dist/components/calendar/date-model.js.map +1 -0
  54. package/dist/components/calendar/scroll-preload.d.ts +10 -0
  55. package/dist/components/calendar/scroll-preload.d.ts.map +1 -0
  56. package/dist/components/calendar/scroll-preload.js +80 -0
  57. package/dist/components/calendar/scroll-preload.js.map +1 -0
  58. package/dist/components/calendar/types.d.ts +68 -0
  59. package/dist/components/calendar/types.d.ts.map +1 -0
  60. package/dist/components/calendar/types.js +2 -0
  61. package/dist/components/calendar/types.js.map +1 -0
  62. package/dist/hooks/useCalchemy.d.ts +52 -0
  63. package/dist/hooks/useCalchemy.d.ts.map +1 -0
  64. package/dist/hooks/useCalchemy.js +161 -0
  65. package/dist/hooks/useCalchemy.js.map +1 -0
  66. package/dist/hooks/useDebouncedValue.d.ts +3 -0
  67. package/dist/hooks/useDebouncedValue.d.ts.map +1 -0
  68. package/dist/hooks/useDebouncedValue.js +15 -0
  69. package/dist/hooks/useDebouncedValue.js.map +1 -0
  70. package/dist/index.d.ts +6 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +3 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/inline-completion.d.ts +4 -0
  75. package/dist/inline-completion.d.ts.map +1 -0
  76. package/dist/inline-completion.js +7 -0
  77. package/dist/inline-completion.js.map +1 -0
  78. package/package.json +55 -0
@@ -0,0 +1,451 @@
1
+ // src/components/calendar/context.ts
2
+ import { createContext, useContext } from "react";
3
+ var CalchemyContext = createContext(null);
4
+ var CalendarContext = createContext(null);
5
+ var CalendarPeriodContext = createContext(null);
6
+ var CalendarScrollContext = createContext(null);
7
+ function useCalchemyContext() {
8
+ const state = useContext(CalchemyContext);
9
+ if (!state) {
10
+ throw new Error("Calchemy components must be rendered inside Calchemy.Root.");
11
+ }
12
+ return state;
13
+ }
14
+ function useCalchemyCalendar() {
15
+ const state = useContext(CalendarContext);
16
+ if (!state) {
17
+ throw new Error("Calchemy calendar components must be rendered inside Calchemy.Calendar.");
18
+ }
19
+ return state;
20
+ }
21
+ function useCalendarPeriod() {
22
+ return useContext(CalendarPeriodContext);
23
+ }
24
+
25
+ // src/components/calendar/calendar-period-drag.tsx
26
+ import {
27
+ createContext as createContext2,
28
+ useCallback,
29
+ useContext as useContext2,
30
+ useMemo,
31
+ useRef,
32
+ useState
33
+ } from "react";
34
+ import { jsx } from "react/jsx-runtime";
35
+ var CalendarPeriodDragContext = createContext2(null);
36
+ var multipleDragSurfaceStyle = {
37
+ position: "relative",
38
+ userSelect: "none",
39
+ WebkitUserSelect: "none",
40
+ touchAction: "none"
41
+ };
42
+ function useOptionalCalendarPeriodDrag() {
43
+ return useContext2(CalendarPeriodDragContext);
44
+ }
45
+ function useCalendarPeriodDragSurface(dragSelection = true) {
46
+ const calendar = useCalchemyCalendar();
47
+ const multipleSelection = dragSelection && calendar.calchemy.expectedValue === "multiple";
48
+ const surfaceRef = useRef(null);
49
+ const dayCells = useRef(/* @__PURE__ */ new Map());
50
+ const suppressClickRef = useRef(false);
51
+ const dragStateRef = useRef(null);
52
+ const dragPreviewFrameRef = useRef(null);
53
+ const dragGestureCleanupRef = useRef(null);
54
+ const [dragState, setDragState] = useState(null);
55
+ const [dragRectangle, setDragRectangle] = useState(null);
56
+ const previewSelectedKeys = useMemo(
57
+ () => new Set(dragState?.previewKeys ?? []),
58
+ [dragState]
59
+ );
60
+ const acquireDragGestureLock = useCallback(() => {
61
+ if (dragGestureCleanupRef.current || typeof document === "undefined") {
62
+ return;
63
+ }
64
+ const preventGestureDefault = (event) => {
65
+ event.preventDefault();
66
+ };
67
+ const clearDocumentSelection = () => {
68
+ document.getSelection()?.removeAllRanges();
69
+ };
70
+ const previousBodyUserSelect = document.body.style.userSelect;
71
+ const previousDocumentUserSelect = document.documentElement.style.userSelect;
72
+ document.body.style.userSelect = "none";
73
+ document.documentElement.style.userSelect = "none";
74
+ document.addEventListener("pointermove", preventGestureDefault, { capture: true, passive: false });
75
+ document.addEventListener("touchmove", preventGestureDefault, { capture: true, passive: false });
76
+ document.addEventListener("wheel", preventGestureDefault, { capture: true, passive: false });
77
+ document.addEventListener("selectstart", preventGestureDefault, { capture: true });
78
+ document.addEventListener("dragstart", preventGestureDefault, { capture: true });
79
+ clearDocumentSelection();
80
+ dragGestureCleanupRef.current = () => {
81
+ document.removeEventListener("pointermove", preventGestureDefault, { capture: true });
82
+ document.removeEventListener("touchmove", preventGestureDefault, { capture: true });
83
+ document.removeEventListener("wheel", preventGestureDefault, { capture: true });
84
+ document.removeEventListener("selectstart", preventGestureDefault, { capture: true });
85
+ document.removeEventListener("dragstart", preventGestureDefault, { capture: true });
86
+ document.body.style.userSelect = previousBodyUserSelect;
87
+ document.documentElement.style.userSelect = previousDocumentUserSelect;
88
+ clearDocumentSelection();
89
+ dragGestureCleanupRef.current = null;
90
+ };
91
+ }, []);
92
+ const releaseDragGestureLock = useCallback(() => {
93
+ dragGestureCleanupRef.current?.();
94
+ if (dragPreviewFrameRef.current !== null) {
95
+ cancelAnimationFrame(dragPreviewFrameRef.current);
96
+ dragPreviewFrameRef.current = null;
97
+ }
98
+ }, []);
99
+ const scheduleDragPreviewUpdate = useCallback((nextDragState) => {
100
+ dragStateRef.current = nextDragState;
101
+ if (dragPreviewFrameRef.current !== null) {
102
+ return;
103
+ }
104
+ dragPreviewFrameRef.current = requestAnimationFrame(() => {
105
+ setDragState(dragStateRef.current);
106
+ dragPreviewFrameRef.current = null;
107
+ });
108
+ }, []);
109
+ const registerDay = useCallback((element, date, disabled) => {
110
+ const key = date.toString();
111
+ if (element) {
112
+ dayCells.current.set(key, { date, disabled, element });
113
+ return;
114
+ }
115
+ dayCells.current.delete(key);
116
+ }, []);
117
+ const getDayCellFromTarget = useCallback((target) => {
118
+ if (!(target instanceof Element)) {
119
+ return null;
120
+ }
121
+ const button = target.closest("[calchemy-date]");
122
+ if (!(button instanceof HTMLButtonElement)) {
123
+ return null;
124
+ }
125
+ for (const cell of dayCells.current.values()) {
126
+ if (cell.element === button) {
127
+ return cell;
128
+ }
129
+ }
130
+ return null;
131
+ }, []);
132
+ const commitMultipleSelection = useCallback(
133
+ (keys, fallbackDates = []) => {
134
+ const dates = resolveDateKeys(keys, dayCells.current, fallbackDates);
135
+ calendar.selectValue({
136
+ kind: "multiple",
137
+ dates
138
+ });
139
+ },
140
+ [calendar]
141
+ );
142
+ const endDragGesture = useCallback(
143
+ (pointerId) => {
144
+ if (pointerId !== void 0) {
145
+ surfaceRef.current?.releasePointerCapture?.(pointerId);
146
+ }
147
+ releaseDragGestureLock();
148
+ dragStateRef.current = null;
149
+ setDragState(null);
150
+ setDragRectangle(null);
151
+ },
152
+ [releaseDragGestureLock]
153
+ );
154
+ const handlePointerMove = useCallback(
155
+ (event) => {
156
+ const activeDrag = dragStateRef.current;
157
+ if (!multipleSelection || !activeDrag || event.pointerId !== activeDrag.pointerId) {
158
+ return;
159
+ }
160
+ event.preventDefault();
161
+ const current = getPointerPoint(event);
162
+ setDragRectangle({ start: activeDrag.start, current });
163
+ const dragRect = getDragRect(activeDrag.start, current);
164
+ const clipRect = getDragClipRect(surfaceRef.current);
165
+ const gestureKeys = getIntersectingDateKeys(
166
+ dayCells.current,
167
+ dragRect,
168
+ activeDrag.cellBounds,
169
+ clipRect
170
+ );
171
+ const baseKeys = activeDrag.baseDates.map((date) => date.toString());
172
+ const previewKeys = toggleDateKeys(baseKeys, gestureKeys);
173
+ const hasMoved = activeDrag.hasMoved || hasPointerMoved(activeDrag.start, current);
174
+ scheduleDragPreviewUpdate({
175
+ ...activeDrag,
176
+ current,
177
+ previewKeys,
178
+ hasMoved
179
+ });
180
+ },
181
+ [multipleSelection, scheduleDragPreviewUpdate]
182
+ );
183
+ const handlePointerDownCapture = useCallback(
184
+ (event) => {
185
+ if (!multipleSelection || event.button !== 0 || !event.isPrimary) {
186
+ return;
187
+ }
188
+ const baseDates = getMultipleDates(calendar.selected);
189
+ event.preventDefault();
190
+ if (typeof document !== "undefined") {
191
+ document.getSelection()?.removeAllRanges();
192
+ }
193
+ surfaceRef.current = event.currentTarget;
194
+ surfaceRef.current?.setPointerCapture?.(event.pointerId);
195
+ acquireDragGestureLock();
196
+ const nextDragState = {
197
+ pointerId: event.pointerId,
198
+ start: getPointerPoint(event),
199
+ current: getPointerPoint(event),
200
+ baseDates,
201
+ previewKeys: baseDates.map((selectedDate) => selectedDate.toString()),
202
+ hasMoved: false,
203
+ startDayCell: getDayCellFromTarget(event.target),
204
+ cellBounds: snapshotCellBounds(dayCells.current)
205
+ };
206
+ dragStateRef.current = nextDragState;
207
+ setDragState(nextDragState);
208
+ setDragRectangle({
209
+ start: nextDragState.start,
210
+ current: nextDragState.current
211
+ });
212
+ },
213
+ [acquireDragGestureLock, calendar.selected, getDayCellFromTarget, multipleSelection]
214
+ );
215
+ const handlePointerUp = useCallback(
216
+ (event) => {
217
+ const activeDrag = dragStateRef.current;
218
+ if (!multipleSelection || !activeDrag || event.pointerId !== activeDrag.pointerId) {
219
+ return;
220
+ }
221
+ if (dragPreviewFrameRef.current !== null) {
222
+ cancelAnimationFrame(dragPreviewFrameRef.current);
223
+ dragPreviewFrameRef.current = null;
224
+ setDragState(activeDrag);
225
+ }
226
+ event.preventDefault();
227
+ suppressClickRef.current = true;
228
+ setTimeout(() => {
229
+ suppressClickRef.current = false;
230
+ }, 0);
231
+ if (activeDrag.hasMoved) {
232
+ commitMultipleSelection(activeDrag.previewKeys, activeDrag.baseDates);
233
+ } else {
234
+ const dayCell = activeDrag.startDayCell;
235
+ if (dayCell && !dayCell.disabled) {
236
+ const selectedDates = getMultipleDates(calendar.selected);
237
+ const nextKeys = toggleDateKeys(
238
+ selectedDates.map((selectedDate) => selectedDate.toString()),
239
+ [dayCell.date.toString()]
240
+ );
241
+ commitMultipleSelection(nextKeys, selectedDates.concat(dayCell.date));
242
+ }
243
+ }
244
+ endDragGesture(event.pointerId);
245
+ const focused = document.activeElement;
246
+ if (focused instanceof HTMLElement && event.currentTarget.contains(focused)) {
247
+ focused.blur();
248
+ }
249
+ },
250
+ [calendar.selected, commitMultipleSelection, endDragGesture, getDayCellFromTarget, multipleSelection]
251
+ );
252
+ const handlePointerCancel = useCallback(
253
+ (event) => {
254
+ const activeDrag = dragStateRef.current;
255
+ if (!activeDrag || event.pointerId !== activeDrag.pointerId) {
256
+ return;
257
+ }
258
+ endDragGesture(event.pointerId);
259
+ },
260
+ [endDragGesture]
261
+ );
262
+ return useMemo(() => {
263
+ if (!multipleSelection) {
264
+ return null;
265
+ }
266
+ return {
267
+ multipleSelection,
268
+ dragState,
269
+ dragRectangle,
270
+ previewSelectedKeys,
271
+ suppressClickRef,
272
+ surfaceRef,
273
+ registerDay,
274
+ handlePointerDownCapture,
275
+ handlePointerMove,
276
+ handlePointerUp,
277
+ handlePointerCancel
278
+ };
279
+ }, [
280
+ dragRectangle,
281
+ dragState,
282
+ handlePointerCancel,
283
+ handlePointerDownCapture,
284
+ handlePointerMove,
285
+ handlePointerUp,
286
+ multipleSelection,
287
+ previewSelectedKeys,
288
+ registerDay
289
+ ]);
290
+ }
291
+ function CalendarDragRectangleOverlay({
292
+ dragRectangle: dragRectangleProp,
293
+ surfaceRef: surfaceRefProp
294
+ } = {}) {
295
+ const drag = useOptionalCalendarPeriodDrag();
296
+ const dragRectangle = dragRectangleProp ?? drag?.dragRectangle ?? null;
297
+ const surfaceRef = surfaceRefProp ?? drag?.surfaceRef;
298
+ if (!dragRectangle) {
299
+ return null;
300
+ }
301
+ const surface = surfaceRef?.current;
302
+ if (!surface) {
303
+ return null;
304
+ }
305
+ const surfaceRect = surface.getBoundingClientRect();
306
+ const left = Math.min(dragRectangle.start.x, dragRectangle.current.x) - surfaceRect.left;
307
+ const top = Math.min(dragRectangle.start.y, dragRectangle.current.y) - surfaceRect.top;
308
+ const width = Math.abs(dragRectangle.current.x - dragRectangle.start.x);
309
+ const height = Math.abs(dragRectangle.current.y - dragRectangle.start.y);
310
+ return /* @__PURE__ */ jsx(
311
+ "div",
312
+ {
313
+ "aria-hidden": "true",
314
+ "calchemy-drag-rect": "",
315
+ style: {
316
+ position: "absolute",
317
+ left,
318
+ top,
319
+ width,
320
+ height,
321
+ pointerEvents: "none",
322
+ boxSizing: "border-box"
323
+ }
324
+ }
325
+ );
326
+ }
327
+ function CalendarPeriodDragProvider({ value, children }) {
328
+ return /* @__PURE__ */ jsx(CalendarPeriodDragContext.Provider, { value, children });
329
+ }
330
+ function getMultipleDates(value) {
331
+ return value?.kind === "multiple" ? value.dates : [];
332
+ }
333
+ function getSelectedDateKeys(value) {
334
+ return getMultipleDates(value).map((date) => date.toString());
335
+ }
336
+ function toggleDateKeys(baseKeys, toggledKeys) {
337
+ const next = new Set(baseKeys);
338
+ for (const key of toggledKeys) {
339
+ if (next.has(key)) {
340
+ next.delete(key);
341
+ } else {
342
+ next.add(key);
343
+ }
344
+ }
345
+ return Array.from(next).sort();
346
+ }
347
+ function getPointerPoint(event) {
348
+ return { x: event.clientX, y: event.clientY };
349
+ }
350
+ function hasPointerMoved(start, current) {
351
+ return Math.abs(start.x - current.x) > 2 || Math.abs(start.y - current.y) > 2;
352
+ }
353
+ function getDragRect(start, current) {
354
+ const left = Math.min(start.x, current.x);
355
+ const right = Math.max(start.x, current.x);
356
+ const top = Math.min(start.y, current.y);
357
+ const bottom = Math.max(start.y, current.y);
358
+ return {
359
+ left,
360
+ right,
361
+ top,
362
+ bottom,
363
+ x: left,
364
+ y: top,
365
+ width: right - left,
366
+ height: bottom - top,
367
+ toJSON: () => ({})
368
+ };
369
+ }
370
+ function snapshotCellBounds(cells) {
371
+ const bounds = /* @__PURE__ */ new Map();
372
+ for (const [key, cell] of cells) {
373
+ const rect = cell.element.getBoundingClientRect();
374
+ bounds.set(key, {
375
+ left: rect.left,
376
+ right: rect.right,
377
+ top: rect.top,
378
+ bottom: rect.bottom
379
+ });
380
+ }
381
+ return bounds;
382
+ }
383
+ function getDragClipRect(surface) {
384
+ if (!surface) {
385
+ return null;
386
+ }
387
+ const scrollContainer = surface.closest("[calchemy-scroll]");
388
+ if (!(scrollContainer instanceof HTMLElement)) {
389
+ return null;
390
+ }
391
+ const rect = scrollContainer.getBoundingClientRect();
392
+ return {
393
+ left: rect.left,
394
+ right: rect.right,
395
+ top: rect.top,
396
+ bottom: rect.bottom
397
+ };
398
+ }
399
+ function clipBoundsToRect(bounds, clip) {
400
+ const left = Math.max(bounds.left, clip.left);
401
+ const right = Math.min(bounds.right, clip.right);
402
+ const top = Math.max(bounds.top, clip.top);
403
+ const bottom = Math.min(bounds.bottom, clip.bottom);
404
+ if (left > right || top > bottom) {
405
+ return null;
406
+ }
407
+ return { left, right, top, bottom };
408
+ }
409
+ function getIntersectingDateKeys(cells, dragRect, cellBounds, clipRect = null) {
410
+ const clippedDragRect = clipRect ? clipBoundsToRect(dragRect, clipRect) : dragRect;
411
+ if (!clippedDragRect) {
412
+ return [];
413
+ }
414
+ return Array.from(cells.entries()).filter(([key, cell]) => {
415
+ const bounds = cellBounds.get(key);
416
+ if (!bounds || cell.disabled) {
417
+ return false;
418
+ }
419
+ const visibleBounds = clipRect ? clipBoundsToRect(bounds, clipRect) : bounds;
420
+ return visibleBounds && rectsIntersect(clippedDragRect, visibleBounds);
421
+ }).map(([key]) => key);
422
+ }
423
+ function rectsIntersect(left, right) {
424
+ return left.left <= right.right && left.right >= right.left && left.top <= right.bottom && left.bottom >= right.top;
425
+ }
426
+ function resolveDateKeys(keys, cells, fallbackDates) {
427
+ const fallbackByKey = new Map(fallbackDates.map((date) => [date.toString(), date]));
428
+ return Array.from(keys).sort().flatMap((key) => {
429
+ const date = cells.get(key)?.date ?? fallbackByKey.get(key);
430
+ return date ? [date] : [];
431
+ });
432
+ }
433
+
434
+ export {
435
+ CalchemyContext,
436
+ CalendarContext,
437
+ CalendarPeriodContext,
438
+ CalendarScrollContext,
439
+ useCalchemyContext,
440
+ useCalchemyCalendar,
441
+ useCalendarPeriod,
442
+ multipleDragSurfaceStyle,
443
+ useOptionalCalendarPeriodDrag,
444
+ useCalendarPeriodDragSurface,
445
+ CalendarDragRectangleOverlay,
446
+ CalendarPeriodDragProvider,
447
+ getMultipleDates,
448
+ getSelectedDateKeys,
449
+ toggleDateKeys
450
+ };
451
+ //# sourceMappingURL=chunk-KI7GMSS3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/calendar/context.ts","../src/components/calendar/calendar-period-drag.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { CalchemyState } from \"../../hooks/useCalchemy\";\nimport type { CalendarPeriodModel, CalendarScrollContextValue, CalendarState } from \"./types\";\n\nexport const CalchemyContext = createContext<CalchemyState | null>(null);\nexport const CalendarContext = createContext<CalendarState | null>(null);\nexport const CalendarPeriodContext = createContext<CalendarPeriodModel | null>(null);\nexport const CalendarScrollContext = createContext<CalendarScrollContextValue | null>(null);\n\nexport function useCalchemyContext(): CalchemyState {\n const state = useContext(CalchemyContext);\n\n if (!state) {\n throw new Error(\"Calchemy components must be rendered inside Calchemy.Root.\");\n }\n\n return state;\n}\n\nexport function useCalchemyCalendar(): CalendarState {\n const state = useContext(CalendarContext);\n\n if (!state) {\n throw new Error(\"Calchemy calendar components must be rendered inside Calchemy.Calendar.\");\n }\n\n return state;\n}\n\nexport function useCalendarPeriod(): CalendarPeriodModel | null {\n return useContext(CalendarPeriodContext);\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n type PointerEvent,\n type RefObject,\n} from \"react\";\nimport type { DateValue, PlainDate } from \"@calchemy/date-core\";\nimport { useCalchemyCalendar } from \"./context\";\n\ntype Point = {\n x: number;\n y: number;\n};\n\ntype CellBounds = {\n left: number;\n right: number;\n top: number;\n bottom: number;\n};\n\ntype DragState = {\n pointerId: number;\n start: Point;\n current: Point;\n baseDates: PlainDate[];\n previewKeys: string[];\n hasMoved: boolean;\n startDayCell: DayCell | null;\n cellBounds: ReadonlyMap<string, CellBounds>;\n};\n\ntype DayCell = {\n date: PlainDate;\n disabled: boolean;\n element: HTMLButtonElement;\n};\n\ntype DragRectangle = {\n start: Point;\n current: Point;\n};\n\nexport type CalendarPeriodDragContextValue = {\n multipleSelection: boolean;\n dragState: DragState | null;\n dragRectangle: DragRectangle | null;\n previewSelectedKeys: ReadonlySet<string>;\n suppressClickRef: RefObject<boolean>;\n surfaceRef: RefObject<HTMLElement | null>;\n registerDay(element: HTMLButtonElement | null, date: PlainDate, disabled: boolean): void;\n handlePointerDownCapture(event: PointerEvent<HTMLElement>): void;\n handlePointerMove(event: PointerEvent<HTMLElement>): void;\n handlePointerUp(event: PointerEvent<HTMLElement>): void;\n handlePointerCancel(event: PointerEvent<HTMLElement>): void;\n};\n\nconst CalendarPeriodDragContext = createContext<CalendarPeriodDragContextValue | null>(null);\n\nexport const multipleDragSurfaceStyle = {\n position: \"relative\",\n userSelect: \"none\",\n WebkitUserSelect: \"none\",\n touchAction: \"none\",\n} as const;\n\nexport function useOptionalCalendarPeriodDrag(): CalendarPeriodDragContextValue | null {\n return useContext(CalendarPeriodDragContext);\n}\n\nexport function useCalendarPeriodDragSurface(\n dragSelection = true,\n): CalendarPeriodDragContextValue | null {\n const calendar = useCalchemyCalendar();\n const multipleSelection = dragSelection && calendar.calchemy.expectedValue === \"multiple\";\n const surfaceRef = useRef<HTMLElement | null>(null);\n const dayCells = useRef(new Map<string, DayCell>());\n const suppressClickRef = useRef(false);\n const dragStateRef = useRef<DragState | null>(null);\n const dragPreviewFrameRef = useRef<number | null>(null);\n const dragGestureCleanupRef = useRef<(() => void) | null>(null);\n const [dragState, setDragState] = useState<DragState | null>(null);\n const [dragRectangle, setDragRectangle] = useState<DragRectangle | null>(null);\n const previewSelectedKeys = useMemo(\n () => new Set(dragState?.previewKeys ?? []),\n [dragState],\n );\n\n const acquireDragGestureLock = useCallback(() => {\n if (dragGestureCleanupRef.current || typeof document === \"undefined\") {\n return;\n }\n\n const preventGestureDefault = (event: Event) => {\n event.preventDefault();\n };\n\n const clearDocumentSelection = () => {\n document.getSelection()?.removeAllRanges();\n };\n\n const previousBodyUserSelect = document.body.style.userSelect;\n const previousDocumentUserSelect = document.documentElement.style.userSelect;\n document.body.style.userSelect = \"none\";\n document.documentElement.style.userSelect = \"none\";\n\n document.addEventListener(\"pointermove\", preventGestureDefault, { capture: true, passive: false });\n document.addEventListener(\"touchmove\", preventGestureDefault, { capture: true, passive: false });\n document.addEventListener(\"wheel\", preventGestureDefault, { capture: true, passive: false });\n document.addEventListener(\"selectstart\", preventGestureDefault, { capture: true });\n document.addEventListener(\"dragstart\", preventGestureDefault, { capture: true });\n clearDocumentSelection();\n\n dragGestureCleanupRef.current = () => {\n document.removeEventListener(\"pointermove\", preventGestureDefault, { capture: true });\n document.removeEventListener(\"touchmove\", preventGestureDefault, { capture: true });\n document.removeEventListener(\"wheel\", preventGestureDefault, { capture: true });\n document.removeEventListener(\"selectstart\", preventGestureDefault, { capture: true });\n document.removeEventListener(\"dragstart\", preventGestureDefault, { capture: true });\n document.body.style.userSelect = previousBodyUserSelect;\n document.documentElement.style.userSelect = previousDocumentUserSelect;\n clearDocumentSelection();\n dragGestureCleanupRef.current = null;\n };\n }, []);\n\n const releaseDragGestureLock = useCallback(() => {\n dragGestureCleanupRef.current?.();\n if (dragPreviewFrameRef.current !== null) {\n cancelAnimationFrame(dragPreviewFrameRef.current);\n dragPreviewFrameRef.current = null;\n }\n }, []);\n\n const scheduleDragPreviewUpdate = useCallback((nextDragState: DragState) => {\n dragStateRef.current = nextDragState;\n if (dragPreviewFrameRef.current !== null) {\n return;\n }\n\n dragPreviewFrameRef.current = requestAnimationFrame(() => {\n setDragState(dragStateRef.current);\n dragPreviewFrameRef.current = null;\n });\n }, []);\n\n const registerDay = useCallback((element: HTMLButtonElement | null, date: PlainDate, disabled: boolean) => {\n const key = date.toString();\n if (element) {\n dayCells.current.set(key, { date, disabled, element });\n return;\n }\n\n dayCells.current.delete(key);\n }, []);\n\n const getDayCellFromTarget = useCallback((target: EventTarget | null): DayCell | null => {\n if (!(target instanceof Element)) {\n return null;\n }\n\n const button = target.closest(\"[calchemy-date]\");\n if (!(button instanceof HTMLButtonElement)) {\n return null;\n }\n\n for (const cell of dayCells.current.values()) {\n if (cell.element === button) {\n return cell;\n }\n }\n\n return null;\n }, []);\n\n const commitMultipleSelection = useCallback(\n (keys: Iterable<string>, fallbackDates: readonly PlainDate[] = []) => {\n const dates = resolveDateKeys(keys, dayCells.current, fallbackDates);\n calendar.selectValue({\n kind: \"multiple\",\n dates,\n });\n },\n [calendar],\n );\n\n const endDragGesture = useCallback(\n (pointerId?: number) => {\n if (pointerId !== undefined) {\n surfaceRef.current?.releasePointerCapture?.(pointerId);\n }\n\n releaseDragGestureLock();\n dragStateRef.current = null;\n setDragState(null);\n setDragRectangle(null);\n },\n [releaseDragGestureLock],\n );\n\n const handlePointerMove = useCallback(\n (event: PointerEvent<HTMLElement>) => {\n const activeDrag = dragStateRef.current;\n if (!multipleSelection || !activeDrag || event.pointerId !== activeDrag.pointerId) {\n return;\n }\n\n event.preventDefault();\n const current = getPointerPoint(event);\n setDragRectangle({ start: activeDrag.start, current });\n const dragRect = getDragRect(activeDrag.start, current);\n const clipRect = getDragClipRect(surfaceRef.current);\n const gestureKeys = getIntersectingDateKeys(\n dayCells.current,\n dragRect,\n activeDrag.cellBounds,\n clipRect,\n );\n const baseKeys = activeDrag.baseDates.map((date) => date.toString());\n const previewKeys = toggleDateKeys(baseKeys, gestureKeys);\n const hasMoved = activeDrag.hasMoved || hasPointerMoved(activeDrag.start, current);\n scheduleDragPreviewUpdate({\n ...activeDrag,\n current,\n previewKeys,\n hasMoved,\n });\n },\n [multipleSelection, scheduleDragPreviewUpdate],\n );\n\n const handlePointerDownCapture = useCallback(\n (event: PointerEvent<HTMLElement>) => {\n if (!multipleSelection || event.button !== 0 || !event.isPrimary) {\n return;\n }\n\n const baseDates = getMultipleDates(calendar.selected);\n event.preventDefault();\n\n if (typeof document !== \"undefined\") {\n document.getSelection()?.removeAllRanges();\n }\n\n surfaceRef.current = event.currentTarget;\n surfaceRef.current?.setPointerCapture?.(event.pointerId);\n acquireDragGestureLock();\n const nextDragState: DragState = {\n pointerId: event.pointerId,\n start: getPointerPoint(event),\n current: getPointerPoint(event),\n baseDates,\n previewKeys: baseDates.map((selectedDate) => selectedDate.toString()),\n hasMoved: false,\n startDayCell: getDayCellFromTarget(event.target),\n cellBounds: snapshotCellBounds(dayCells.current),\n };\n dragStateRef.current = nextDragState;\n setDragState(nextDragState);\n setDragRectangle({\n start: nextDragState.start,\n current: nextDragState.current,\n });\n },\n [acquireDragGestureLock, calendar.selected, getDayCellFromTarget, multipleSelection],\n );\n\n const handlePointerUp = useCallback(\n (event: PointerEvent<HTMLElement>) => {\n const activeDrag = dragStateRef.current;\n if (!multipleSelection || !activeDrag || event.pointerId !== activeDrag.pointerId) {\n return;\n }\n\n if (dragPreviewFrameRef.current !== null) {\n cancelAnimationFrame(dragPreviewFrameRef.current);\n dragPreviewFrameRef.current = null;\n setDragState(activeDrag);\n }\n\n event.preventDefault();\n\n suppressClickRef.current = true;\n setTimeout(() => {\n suppressClickRef.current = false;\n }, 0);\n\n if (activeDrag.hasMoved) {\n commitMultipleSelection(activeDrag.previewKeys, activeDrag.baseDates);\n } else {\n const dayCell = activeDrag.startDayCell;\n if (dayCell && !dayCell.disabled) {\n const selectedDates = getMultipleDates(calendar.selected);\n const nextKeys = toggleDateKeys(\n selectedDates.map((selectedDate) => selectedDate.toString()),\n [dayCell.date.toString()],\n );\n commitMultipleSelection(nextKeys, selectedDates.concat(dayCell.date));\n }\n }\n\n endDragGesture(event.pointerId);\n\n const focused = document.activeElement;\n if (focused instanceof HTMLElement && event.currentTarget.contains(focused)) {\n focused.blur();\n }\n },\n [calendar.selected, commitMultipleSelection, endDragGesture, getDayCellFromTarget, multipleSelection],\n );\n\n const handlePointerCancel = useCallback(\n (event: PointerEvent<HTMLElement>) => {\n const activeDrag = dragStateRef.current;\n if (!activeDrag || event.pointerId !== activeDrag.pointerId) {\n return;\n }\n\n endDragGesture(event.pointerId);\n },\n [endDragGesture],\n );\n\n return useMemo(() => {\n if (!multipleSelection) {\n return null;\n }\n\n return {\n multipleSelection,\n dragState,\n dragRectangle,\n previewSelectedKeys,\n suppressClickRef,\n surfaceRef,\n registerDay,\n handlePointerDownCapture,\n handlePointerMove,\n handlePointerUp,\n handlePointerCancel,\n };\n }, [\n dragRectangle,\n dragState,\n handlePointerCancel,\n handlePointerDownCapture,\n handlePointerMove,\n handlePointerUp,\n multipleSelection,\n previewSelectedKeys,\n registerDay,\n ]);\n}\n\nexport type CalendarDragRectangleOverlayProps = {\n dragRectangle?: DragRectangle | null;\n surfaceRef?: RefObject<HTMLElement | null>;\n};\n\nexport function CalendarDragRectangleOverlay({\n dragRectangle: dragRectangleProp,\n surfaceRef: surfaceRefProp,\n}: CalendarDragRectangleOverlayProps = {}) {\n const drag = useOptionalCalendarPeriodDrag();\n const dragRectangle = dragRectangleProp ?? drag?.dragRectangle ?? null;\n const surfaceRef = surfaceRefProp ?? drag?.surfaceRef;\n\n if (!dragRectangle) {\n return null;\n }\n\n const surface = surfaceRef?.current;\n if (!surface) {\n return null;\n }\n\n const surfaceRect = surface.getBoundingClientRect();\n const left = Math.min(dragRectangle.start.x, dragRectangle.current.x) - surfaceRect.left;\n const top = Math.min(dragRectangle.start.y, dragRectangle.current.y) - surfaceRect.top;\n const width = Math.abs(dragRectangle.current.x - dragRectangle.start.x);\n const height = Math.abs(dragRectangle.current.y - dragRectangle.start.y);\n\n return (\n <div\n aria-hidden=\"true\"\n calchemy-drag-rect=\"\"\n style={{\n position: \"absolute\",\n left,\n top,\n width,\n height,\n pointerEvents: \"none\",\n boxSizing: \"border-box\",\n }}\n />\n );\n}\n\nexport type CalendarPeriodDragProviderProps = {\n value: CalendarPeriodDragContextValue;\n children: React.ReactNode;\n};\n\nexport function CalendarPeriodDragProvider({ value, children }: CalendarPeriodDragProviderProps) {\n return (\n <CalendarPeriodDragContext.Provider value={value}>{children}</CalendarPeriodDragContext.Provider>\n );\n}\n\nexport function getMultipleDates(value: DateValue | null): PlainDate[] {\n return value?.kind === \"multiple\" ? value.dates : [];\n}\n\nexport function getSelectedDateKeys(value: DateValue | null): string[] {\n return getMultipleDates(value).map((date) => date.toString());\n}\n\nexport function toggleDateKeys(baseKeys: readonly string[], toggledKeys: readonly string[]): string[] {\n const next = new Set(baseKeys);\n for (const key of toggledKeys) {\n if (next.has(key)) {\n next.delete(key);\n } else {\n next.add(key);\n }\n }\n\n return Array.from(next).sort();\n}\n\nfunction getPointerPoint(event: Pick<PointerEvent, \"clientX\" | \"clientY\">): Point {\n return { x: event.clientX, y: event.clientY };\n}\n\nfunction hasPointerMoved(start: Point, current: Point): boolean {\n return Math.abs(start.x - current.x) > 2 || Math.abs(start.y - current.y) > 2;\n}\n\nfunction getDragRect(start: Point, current: Point): DOMRect {\n const left = Math.min(start.x, current.x);\n const right = Math.max(start.x, current.x);\n const top = Math.min(start.y, current.y);\n const bottom = Math.max(start.y, current.y);\n\n return {\n left,\n right,\n top,\n bottom,\n x: left,\n y: top,\n width: right - left,\n height: bottom - top,\n toJSON: () => ({}),\n } as DOMRect;\n}\n\nfunction snapshotCellBounds(cells: ReadonlyMap<string, DayCell>): Map<string, CellBounds> {\n const bounds = new Map<string, CellBounds>();\n for (const [key, cell] of cells) {\n const rect = cell.element.getBoundingClientRect();\n bounds.set(key, {\n left: rect.left,\n right: rect.right,\n top: rect.top,\n bottom: rect.bottom,\n });\n }\n\n return bounds;\n}\n\nfunction getDragClipRect(surface: HTMLElement | null): CellBounds | null {\n if (!surface) {\n return null;\n }\n\n const scrollContainer = surface.closest(\"[calchemy-scroll]\");\n if (!(scrollContainer instanceof HTMLElement)) {\n return null;\n }\n\n const rect = scrollContainer.getBoundingClientRect();\n\n return {\n left: rect.left,\n right: rect.right,\n top: rect.top,\n bottom: rect.bottom,\n };\n}\n\nfunction clipBoundsToRect(\n bounds: Pick<CellBounds, \"left\" | \"right\" | \"top\" | \"bottom\">,\n clip: CellBounds,\n): CellBounds | null {\n const left = Math.max(bounds.left, clip.left);\n const right = Math.min(bounds.right, clip.right);\n const top = Math.max(bounds.top, clip.top);\n const bottom = Math.min(bounds.bottom, clip.bottom);\n\n if (left > right || top > bottom) {\n return null;\n }\n\n return { left, right, top, bottom };\n}\n\nfunction getIntersectingDateKeys(\n cells: ReadonlyMap<string, DayCell>,\n dragRect: DOMRect,\n cellBounds: ReadonlyMap<string, CellBounds>,\n clipRect: CellBounds | null = null,\n): string[] {\n const clippedDragRect = clipRect ? clipBoundsToRect(dragRect, clipRect) : dragRect;\n if (!clippedDragRect) {\n return [];\n }\n\n return Array.from(cells.entries())\n .filter(([key, cell]) => {\n const bounds = cellBounds.get(key);\n if (!bounds || cell.disabled) {\n return false;\n }\n\n const visibleBounds = clipRect ? clipBoundsToRect(bounds, clipRect) : bounds;\n return visibleBounds && rectsIntersect(clippedDragRect, visibleBounds);\n })\n .map(([key]) => key);\n}\n\nfunction rectsIntersect(\n left: Pick<CellBounds, \"left\" | \"right\" | \"top\" | \"bottom\">,\n right: CellBounds,\n): boolean {\n return left.left <= right.right && left.right >= right.left && left.top <= right.bottom && left.bottom >= right.top;\n}\n\nfunction resolveDateKeys(\n keys: Iterable<string>,\n cells: ReadonlyMap<string, DayCell>,\n fallbackDates: readonly PlainDate[],\n): PlainDate[] {\n const fallbackByKey = new Map(fallbackDates.map((date) => [date.toString(), date]));\n return Array.from(keys)\n .sort()\n .flatMap((key) => {\n const date = cells.get(key)?.date ?? fallbackByKey.get(key);\n return date ? [date] : [];\n });\n}\n"],"mappings":"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","names":["createContext","useContext","createContext","useContext"]}
@@ -0,0 +1,34 @@
1
+ // src/components/calendar/context.ts
2
+ import { createContext, useContext } from "react";
3
+ var CalchemyContext = createContext(null);
4
+ var CalendarContext = createContext(null);
5
+ var CalendarPeriodContext = createContext(null);
6
+ var CalendarScrollContext = createContext(null);
7
+ function useCalchemyContext() {
8
+ const state = useContext(CalchemyContext);
9
+ if (!state) {
10
+ throw new Error("Calchemy components must be rendered inside Calchemy.Root.");
11
+ }
12
+ return state;
13
+ }
14
+ function useCalchemyCalendar() {
15
+ const state = useContext(CalendarContext);
16
+ if (!state) {
17
+ throw new Error("Calchemy calendar components must be rendered inside Calchemy.Calendar.");
18
+ }
19
+ return state;
20
+ }
21
+ function useCalendarPeriod() {
22
+ return useContext(CalendarPeriodContext);
23
+ }
24
+
25
+ export {
26
+ CalchemyContext,
27
+ CalendarContext,
28
+ CalendarPeriodContext,
29
+ CalendarScrollContext,
30
+ useCalchemyContext,
31
+ useCalchemyCalendar,
32
+ useCalendarPeriod
33
+ };
34
+ //# sourceMappingURL=chunk-NGJGJXY4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/calendar/context.ts"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { CalchemyState } from \"../../hooks/useCalchemy\";\nimport type { CalendarPeriodModel, CalendarScrollContextValue, CalendarState } from \"./types\";\n\nexport const CalchemyContext = createContext<CalchemyState | null>(null);\nexport const CalendarContext = createContext<CalendarState | null>(null);\nexport const CalendarPeriodContext = createContext<CalendarPeriodModel | null>(null);\nexport const CalendarScrollContext = createContext<CalendarScrollContextValue | null>(null);\n\nexport function useCalchemyContext(): CalchemyState {\n const state = useContext(CalchemyContext);\n\n if (!state) {\n throw new Error(\"Calchemy components must be rendered inside Calchemy.Root.\");\n }\n\n return state;\n}\n\nexport function useCalchemyCalendar(): CalendarState {\n const state = useContext(CalendarContext);\n\n if (!state) {\n throw new Error(\"Calchemy calendar components must be rendered inside Calchemy.Calendar.\");\n }\n\n return state;\n}\n\nexport function useCalendarPeriod(): CalendarPeriodModel | null {\n return useContext(CalendarPeriodContext);\n}\n"],"mappings":";AAAA,SAAS,eAAe,kBAAkB;AAInC,IAAM,kBAAkB,cAAoC,IAAI;AAChE,IAAM,kBAAkB,cAAoC,IAAI;AAChE,IAAM,wBAAwB,cAA0C,IAAI;AAC5E,IAAM,wBAAwB,cAAiD,IAAI;AAEnF,SAAS,qBAAoC;AAClD,QAAM,QAAQ,WAAW,eAAe;AAExC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,4DAA4D;AAAA,EAC9E;AAEA,SAAO;AACT;AAEO,SAAS,sBAAqC;AACnD,QAAM,QAAQ,WAAW,eAAe;AAExC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,yEAAyE;AAAA,EAC3F;AAEA,SAAO;AACT;AAEO,SAAS,oBAAgD;AAC9D,SAAO,WAAW,qBAAqB;AACzC;","names":[]}
@@ -0,0 +1,50 @@
1
+ import type { ComponentPropsWithoutRef, ReactNode } from "react";
2
+ import { type UseCalchemyOptions } from "../hooks/useCalchemy";
3
+ import { Calendar, CalendarHeader, CalendarHeading, CalendarNext, CalendarPrevious } from "./calendar/Calendar";
4
+ import { CalendarGrid, CalendarWeekdays } from "./calendar/CalendarGrid";
5
+ import { CalendarPeriodHeading } from "./calendar/CalendarPeriodHeading";
6
+ import { CalendarPeriod } from "./calendar/CalendarPeriod";
7
+ import { CalendarPeriodList } from "./calendar/CalendarPeriodList";
8
+ import { CalendarMonthSelect, CalendarYearSelect } from "./calendar/CalendarSelects";
9
+ export type CalchemyRootProps = UseCalchemyOptions & {
10
+ children: ReactNode;
11
+ };
12
+ declare function Root(props: CalchemyRootProps): import("react/jsx-runtime").JSX.Element;
13
+ export type CalchemyFieldProps = Omit<ComponentPropsWithoutRef<"input">, "value" | "onChange" | "onKeyDown"> & {
14
+ renderInlineCompletion?: boolean;
15
+ };
16
+ declare function Field({ renderInlineCompletion, readOnly, ...props }: CalchemyFieldProps): import("react/jsx-runtime").JSX.Element;
17
+ export type CalchemyInputModeProps = ComponentPropsWithoutRef<"div"> & {
18
+ fieldLabel?: ReactNode;
19
+ calendarLabel?: ReactNode;
20
+ };
21
+ declare function InputMode({ fieldLabel, calendarLabel, ...props }: CalchemyInputModeProps): import("react/jsx-runtime").JSX.Element;
22
+ export type CalchemyCandidatesProps = ComponentPropsWithoutRef<"div">;
23
+ declare function Candidates(props: CalchemyCandidatesProps): import("react/jsx-runtime").JSX.Element | null;
24
+ export { useCalchemyCalendar, useCalchemyContext } from "./calendar/context";
25
+ export type { CalendarBounds, CalendarDuration, CalendarNamedDates, CalendarPeriodModel, CalendarPeriodUnit, CalendarState, CalendarWeekdayFormat, ParsedCalendarPeriod, } from "./calendar/types";
26
+ export type { CalchemyCalendarHeaderProps, CalchemyCalendarHeadingProps, CalchemyCalendarNavigationProps, CalchemyCalendarProps, } from "./calendar/Calendar";
27
+ export type { CalchemyCalendarGridProps, CalchemyCalendarWeekdaysProps, } from "./calendar/CalendarGrid";
28
+ export type { CalchemyCalendarPeriodHeadingProps } from "./calendar/CalendarPeriodHeading";
29
+ export type { CalchemyCalendarPeriodListProps } from "./calendar/CalendarPeriodList";
30
+ export type { CalchemyCalendarPeriodProps } from "./calendar/CalendarPeriod";
31
+ export type { CalchemyCalendarMonthSelectProps, CalchemyCalendarYearSelectProps, } from "./calendar/CalendarSelects";
32
+ export declare const Calchemy: {
33
+ Root: typeof Root;
34
+ Field: typeof Field;
35
+ InputMode: typeof InputMode;
36
+ Candidates: typeof Candidates;
37
+ Calendar: typeof Calendar;
38
+ CalendarHeader: typeof CalendarHeader;
39
+ CalendarHeading: typeof CalendarHeading;
40
+ CalendarPrevious: typeof CalendarPrevious;
41
+ CalendarNext: typeof CalendarNext;
42
+ CalendarPeriodList: typeof CalendarPeriodList;
43
+ CalendarPeriod: typeof CalendarPeriod;
44
+ CalendarPeriodHeading: typeof CalendarPeriodHeading;
45
+ CalendarWeekdays: typeof CalendarWeekdays;
46
+ CalendarGrid: typeof CalendarGrid;
47
+ CalendarMonthSelect: typeof CalendarMonthSelect;
48
+ CalendarYearSelect: typeof CalendarYearSelect;
49
+ };
50
+ //# sourceMappingURL=Calchemy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Calchemy.d.ts","sourceRoot":"","sources":["../../src/components/Calchemy.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEjE,OAAO,EAAe,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EACL,QAAQ,EACR,cAAc,EACd,eAAe,EACf,YAAY,EACZ,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,MAAM,iBAAiB,GAAG,kBAAkB,GAAG;IACnD,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,iBAAS,IAAI,CAAC,KAAK,EAAE,iBAAiB,2CASrC;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,wBAAwB,CAAC,OAAO,CAAC,EACjC,OAAO,GAAG,UAAU,GAAG,WAAW,CACnC,GAAG;IACF,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,CAAC;AAEF,iBAAS,KAAK,CAAC,EACb,sBAA6B,EAC7B,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,kBAAkB,2CAqBpB;AAED,MAAM,MAAM,sBAAsB,GAAG,wBAAwB,CAAC,KAAK,CAAC,GAAG;IACrE,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B,CAAC;AAEF,iBAAS,SAAS,CAAC,EACjB,UAAmB,EACnB,aAAsB,EACtB,GAAG,KAAK,EACT,EAAE,sBAAsB,2CAuBxB;AAED,MAAM,MAAM,uBAAuB,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;AAEtE,iBAAS,UAAU,CAAC,KAAK,EAAE,uBAAuB,kDAgCjD;AAED,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7E,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,2BAA2B,EAC3B,4BAA4B,EAC5B,+BAA+B,EAC/B,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,yBAAyB,EACzB,6BAA6B,GAC9B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,kCAAkC,EAAE,MAAM,kCAAkC,CAAC;AAC3F,YAAY,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AACrF,YAAY,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAC7E,YAAY,EACV,gCAAgC,EAChC,+BAA+B,GAChC,MAAM,4BAA4B,CAAC;AAEpC,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;CAiBpB,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { CalchemyContext, useCalchemyContext } from "./calendar/context";
3
+ import { useCalchemy } from "../hooks/useCalchemy";
4
+ import { Calendar, CalendarHeader, CalendarHeading, CalendarNext, CalendarPrevious, } from "./calendar/Calendar";
5
+ import { CalendarGrid, CalendarWeekdays } from "./calendar/CalendarGrid";
6
+ import { CalendarPeriodHeading } from "./calendar/CalendarPeriodHeading";
7
+ import { CalendarPeriod } from "./calendar/CalendarPeriod";
8
+ import { CalendarPeriodList } from "./calendar/CalendarPeriodList";
9
+ import { CalendarMonthSelect, CalendarYearSelect, } from "./calendar/CalendarSelects";
10
+ function Root(props) {
11
+ const { children, ...options } = props;
12
+ const state = useCalchemy(options);
13
+ return (_jsx(CalchemyContext.Provider, { value: state, children: children }));
14
+ }
15
+ function Field({ renderInlineCompletion = true, readOnly, ...props }) {
16
+ const state = useCalchemyContext();
17
+ const inputProps = state.getInputProps();
18
+ const completion = state.inputMode === "field" ? state.inlineCompletion : null;
19
+ return (_jsxs("span", { "calchemy-field": "", "calchemy-input-mode": state.inputMode, "calchemy-has-completion": completion ? "" : undefined, children: [renderInlineCompletion && completion ? (_jsxs("span", { "calchemy-field-backdrop": "", "aria-hidden": "true", children: [_jsx("span", { "calchemy-field-typed": "", children: state.inputValue }), _jsx("span", { "calchemy-completions": "", children: completion.suffix })] })) : null, _jsx("input", { ...props, ...inputProps, readOnly: readOnly ?? inputProps.readOnly })] }));
20
+ }
21
+ function InputMode({ fieldLabel = "Type", calendarLabel = "Pick", ...props }) {
22
+ const state = useCalchemyContext();
23
+ return (_jsxs("div", { ...props, "calchemy-mode": "", "calchemy-active": state.inputMode, role: "group", children: [_jsx("button", { type: "button", "calchemy-value": "field", "aria-pressed": state.inputMode === "field", onClick: () => state.setInputMode("field"), children: fieldLabel }), _jsx("button", { type: "button", "calchemy-value": "calendar", "aria-pressed": state.inputMode === "calendar", onClick: () => state.setInputMode("calendar"), children: calendarLabel })] }));
24
+ }
25
+ function Candidates(props) {
26
+ const state = useCalchemyContext();
27
+ if (state.inputMode !== "field" || state.result.status !== "ambiguous") {
28
+ return null;
29
+ }
30
+ const candidates = state.expectedValue && state.expectedValue !== "multiple"
31
+ ? state.result.candidates.filter((candidate) => candidate.value.kind === state.expectedValue)
32
+ : state.result.candidates;
33
+ if (candidates.length === 0) {
34
+ return null;
35
+ }
36
+ return (_jsx("div", { ...props, "calchemy-candidates": "", children: candidates.map((candidate) => (_jsx("button", { type: "button", "calchemy-candidate": "", onClick: () => state.selectCandidate(candidate.id), children: candidate.label }, candidate.id))) }));
37
+ }
38
+ export { useCalchemyCalendar, useCalchemyContext } from "./calendar/context";
39
+ export const Calchemy = {
40
+ Root,
41
+ Field,
42
+ InputMode,
43
+ Candidates,
44
+ Calendar,
45
+ CalendarHeader,
46
+ CalendarHeading,
47
+ CalendarPrevious,
48
+ CalendarNext,
49
+ CalendarPeriodList,
50
+ CalendarPeriod,
51
+ CalendarPeriodHeading,
52
+ CalendarWeekdays,
53
+ CalendarGrid,
54
+ CalendarMonthSelect,
55
+ CalendarYearSelect,
56
+ };
57
+ //# sourceMappingURL=Calchemy.js.map