@koine/react 2.0.0-beta.77 → 2.0.0-beta.78

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 (294) hide show
  1. package/FaviconTags.cjs.d.ts +2 -0
  2. package/FaviconTags.cjs.default.js +1 -0
  3. package/FaviconTags.cjs.js +12 -0
  4. package/FaviconTags.cjs.mjs +2 -0
  5. package/FaviconTags.esm.js +7 -0
  6. package/Meta.cjs.d.ts +2 -0
  7. package/Meta.cjs.default.js +1 -0
  8. package/Meta.cjs.js +12 -0
  9. package/Meta.cjs.mjs +2 -0
  10. package/Meta.esm.js +7 -0
  11. package/NoJs.cjs.d.ts +2 -0
  12. package/NoJs.cjs.default.js +1 -0
  13. package/NoJs.cjs.js +14 -0
  14. package/NoJs.cjs.mjs +2 -0
  15. package/NoJs.esm.js +9 -0
  16. package/Polymorphic.cjs.d.ts +1 -0
  17. package/Polymorphic.cjs.default.js +1 -0
  18. package/Polymorphic.cjs.js +2 -0
  19. package/Polymorphic.cjs.mjs +2 -0
  20. package/Polymorphic.esm.js +1 -0
  21. package/README.md +1 -0
  22. package/calendar.cjs.d.ts +1 -0
  23. package/calendar.cjs.default.js +1 -0
  24. package/calendar.cjs.js +588 -0
  25. package/calendar.cjs.mjs +2 -0
  26. package/calendar.esm.js +561 -0
  27. package/classed.cjs.d.ts +2 -0
  28. package/classed.cjs.default.js +1 -0
  29. package/classed.cjs.js +48 -0
  30. package/classed.cjs.mjs +2 -0
  31. package/classed.d.ts +1 -1
  32. package/classed.esm.js +43 -0
  33. package/createUseMediaQueryWidth.cjs.d.ts +2 -0
  34. package/createUseMediaQueryWidth.cjs.default.js +1 -0
  35. package/createUseMediaQueryWidth.cjs.js +45 -0
  36. package/createUseMediaQueryWidth.cjs.mjs +2 -0
  37. package/createUseMediaQueryWidth.esm.js +40 -0
  38. package/extendComponent.cjs.d.ts +2 -0
  39. package/extendComponent.cjs.default.js +1 -0
  40. package/extendComponent.cjs.js +16 -0
  41. package/extendComponent.cjs.mjs +2 -0
  42. package/extendComponent.esm.js +11 -0
  43. package/forms.cjs.d.ts +1 -0
  44. package/forms.cjs.default.js +1 -0
  45. package/forms.cjs.js +37 -0
  46. package/forms.cjs.mjs +2 -0
  47. package/forms.esm.js +32 -0
  48. package/index.cjs.d.ts +1 -0
  49. package/index.cjs.default.js +1 -0
  50. package/index.cjs.js +63 -0
  51. package/index.cjs.mjs +2 -0
  52. package/index.esm.js +30 -0
  53. package/mergeRefs.cjs.d.ts +2 -0
  54. package/mergeRefs.cjs.default.js +1 -0
  55. package/mergeRefs.cjs.js +19 -0
  56. package/mergeRefs.cjs.mjs +2 -0
  57. package/mergeRefs.esm.js +14 -0
  58. package/package.json +110 -122
  59. package/types.cjs.d.ts +1 -0
  60. package/types.cjs.default.js +1 -0
  61. package/types.cjs.js +2 -0
  62. package/types.cjs.mjs +2 -0
  63. package/types.esm.js +1 -0
  64. package/useAsyncFn.cjs.d.ts +2 -0
  65. package/useAsyncFn.cjs.default.js +1 -0
  66. package/useAsyncFn.cjs.js +33 -0
  67. package/useAsyncFn.cjs.mjs +2 -0
  68. package/useAsyncFn.esm.js +28 -0
  69. package/useFirstMountState.cjs.d.ts +2 -0
  70. package/useFirstMountState.cjs.default.js +1 -0
  71. package/useFirstMountState.cjs.js +17 -0
  72. package/useFirstMountState.cjs.mjs +2 -0
  73. package/useFirstMountState.esm.js +12 -0
  74. package/useFixedOffset.cjs.d.ts +2 -0
  75. package/useFixedOffset.cjs.default.js +1 -0
  76. package/useFixedOffset.cjs.js +49 -0
  77. package/useFixedOffset.cjs.mjs +2 -0
  78. package/useFixedOffset.esm.js +44 -0
  79. package/useFocus.cjs.d.ts +2 -0
  80. package/useFocus.cjs.default.js +1 -0
  81. package/useFocus.cjs.js +16 -0
  82. package/useFocus.cjs.mjs +2 -0
  83. package/useFocus.esm.js +11 -0
  84. package/useInterval.cjs.d.ts +2 -0
  85. package/useInterval.cjs.default.js +1 -0
  86. package/useInterval.cjs.js +27 -0
  87. package/useInterval.cjs.mjs +2 -0
  88. package/useInterval.esm.js +22 -0
  89. package/useIsomorphicLayoutEffect.cjs.d.ts +2 -0
  90. package/useIsomorphicLayoutEffect.cjs.default.js +1 -0
  91. package/useIsomorphicLayoutEffect.cjs.js +11 -0
  92. package/useIsomorphicLayoutEffect.cjs.mjs +2 -0
  93. package/useIsomorphicLayoutEffect.d.ts +2 -2
  94. package/useIsomorphicLayoutEffect.esm.js +6 -0
  95. package/useKeyUp.cjs.d.ts +2 -0
  96. package/useKeyUp.cjs.default.js +1 -0
  97. package/useKeyUp.cjs.js +23 -0
  98. package/useKeyUp.cjs.mjs +2 -0
  99. package/useKeyUp.esm.js +18 -0
  100. package/useMeasure.cjs.d.ts +2 -0
  101. package/useMeasure.cjs.default.js +1 -0
  102. package/useMeasure.cjs.js +126 -0
  103. package/useMeasure.cjs.mjs +2 -0
  104. package/useMeasure.esm.js +121 -0
  105. package/useMountedState.cjs.d.ts +2 -0
  106. package/useMountedState.cjs.default.js +1 -0
  107. package/useMountedState.cjs.js +20 -0
  108. package/useMountedState.cjs.mjs +2 -0
  109. package/useMountedState.esm.js +15 -0
  110. package/useNavigateAway.cjs.d.ts +2 -0
  111. package/useNavigateAway.cjs.default.js +1 -0
  112. package/useNavigateAway.cjs.js +32 -0
  113. package/useNavigateAway.cjs.mjs +2 -0
  114. package/useNavigateAway.esm.js +27 -0
  115. package/usePrevious.cjs.d.ts +2 -0
  116. package/usePrevious.cjs.default.js +1 -0
  117. package/usePrevious.cjs.js +16 -0
  118. package/usePrevious.cjs.mjs +2 -0
  119. package/usePrevious.esm.js +11 -0
  120. package/usePreviousRef.cjs.d.ts +2 -0
  121. package/usePreviousRef.cjs.default.js +1 -0
  122. package/usePreviousRef.cjs.js +16 -0
  123. package/usePreviousRef.cjs.mjs +2 -0
  124. package/usePreviousRef.esm.js +11 -0
  125. package/useScrollPosition.cjs.d.ts +2 -0
  126. package/useScrollPosition.cjs.default.js +1 -0
  127. package/useScrollPosition.cjs.js +65 -0
  128. package/useScrollPosition.cjs.mjs +2 -0
  129. package/useScrollPosition.esm.js +60 -0
  130. package/useScrollThreshold.cjs.d.ts +2 -0
  131. package/useScrollThreshold.cjs.default.js +1 -0
  132. package/useScrollThreshold.cjs.js +33 -0
  133. package/useScrollThreshold.cjs.mjs +2 -0
  134. package/useScrollThreshold.esm.js +28 -0
  135. package/useScrollTo.cjs.d.ts +2 -0
  136. package/useScrollTo.cjs.default.js +1 -0
  137. package/useScrollTo.cjs.js +25 -0
  138. package/useScrollTo.cjs.mjs +2 -0
  139. package/useScrollTo.esm.js +20 -0
  140. package/useSmoothScroll.cjs.d.ts +2 -0
  141. package/useSmoothScroll.cjs.default.js +1 -0
  142. package/useSmoothScroll.cjs.js +40 -0
  143. package/useSmoothScroll.cjs.mjs +2 -0
  144. package/useSmoothScroll.esm.js +35 -0
  145. package/useSpinDelay.cjs.d.ts +2 -0
  146. package/useSpinDelay.cjs.default.js +1 -0
  147. package/useSpinDelay.cjs.js +43 -0
  148. package/useSpinDelay.cjs.mjs +2 -0
  149. package/useSpinDelay.esm.js +38 -0
  150. package/useTraceUpdate.cjs.d.ts +2 -0
  151. package/useTraceUpdate.cjs.default.js +1 -0
  152. package/useTraceUpdate.cjs.js +24 -0
  153. package/useTraceUpdate.cjs.mjs +2 -0
  154. package/useTraceUpdate.esm.js +19 -0
  155. package/useUpdateEffect.cjs.d.ts +2 -0
  156. package/useUpdateEffect.cjs.default.js +1 -0
  157. package/useUpdateEffect.cjs.js +18 -0
  158. package/useUpdateEffect.cjs.mjs +2 -0
  159. package/useUpdateEffect.esm.js +13 -0
  160. package/useWindowSize.cjs.d.ts +2 -0
  161. package/useWindowSize.cjs.default.js +1 -0
  162. package/useWindowSize.cjs.js +27 -0
  163. package/useWindowSize.cjs.mjs +2 -0
  164. package/useWindowSize.esm.js +22 -0
  165. package/FaviconTags.js +0 -1
  166. package/Meta.js +0 -1
  167. package/NoJs.js +0 -1
  168. package/Polymorphic.js +0 -1
  169. package/calendar/CalendarDaygridCell.js +0 -1
  170. package/calendar/CalendarDaygridNav.js +0 -1
  171. package/calendar/CalendarDaygridTable.js +0 -1
  172. package/calendar/CalendarLegend.js +0 -1
  173. package/calendar/calendar-api-google.js +0 -1
  174. package/calendar/types.js +0 -1
  175. package/calendar/useCalendar.js +0 -1
  176. package/calendar/useDateLocale.js +0 -1
  177. package/calendar/utils.js +0 -1
  178. package/calendar.js +0 -1
  179. package/cjs/FaviconTags.d.ts +0 -9
  180. package/cjs/FaviconTags.js +0 -1
  181. package/cjs/Meta.d.ts +0 -5
  182. package/cjs/Meta.js +0 -1
  183. package/cjs/NoJs.d.ts +0 -3
  184. package/cjs/NoJs.js +0 -1
  185. package/cjs/Polymorphic.d.ts +0 -26
  186. package/cjs/Polymorphic.js +0 -1
  187. package/cjs/calendar/CalendarDaygridCell.d.ts +0 -35
  188. package/cjs/calendar/CalendarDaygridCell.js +0 -1
  189. package/cjs/calendar/CalendarDaygridNav.d.ts +0 -27
  190. package/cjs/calendar/CalendarDaygridNav.js +0 -1
  191. package/cjs/calendar/CalendarDaygridTable.d.ts +0 -25
  192. package/cjs/calendar/CalendarDaygridTable.js +0 -1
  193. package/cjs/calendar/CalendarLegend.d.ts +0 -18
  194. package/cjs/calendar/CalendarLegend.js +0 -1
  195. package/cjs/calendar/calendar-api-google.d.ts +0 -10
  196. package/cjs/calendar/calendar-api-google.js +0 -1
  197. package/cjs/calendar/types.d.ts +0 -62
  198. package/cjs/calendar/types.js +0 -1
  199. package/cjs/calendar/useCalendar.d.ts +0 -35
  200. package/cjs/calendar/useCalendar.js +0 -1
  201. package/cjs/calendar/useDateLocale.d.ts +0 -2
  202. package/cjs/calendar/useDateLocale.js +0 -1
  203. package/cjs/calendar/utils.d.ts +0 -11
  204. package/cjs/calendar/utils.js +0 -1
  205. package/cjs/calendar.d.ts +0 -7
  206. package/cjs/calendar.js +0 -1
  207. package/cjs/classed.d.ts +0 -8
  208. package/cjs/classed.js +0 -1
  209. package/cjs/createUseMediaQueryWidth.d.ts +0 -6
  210. package/cjs/createUseMediaQueryWidth.js +0 -1
  211. package/cjs/extendComponent.d.ts +0 -16
  212. package/cjs/extendComponent.js +0 -1
  213. package/cjs/forms/antispam.d.ts +0 -27
  214. package/cjs/forms/antispam.js +0 -1
  215. package/cjs/forms.d.ts +0 -1
  216. package/cjs/forms.js +0 -1
  217. package/cjs/index.d.ts +0 -28
  218. package/cjs/index.js +0 -1
  219. package/cjs/mergeRefs.d.ts +0 -2
  220. package/cjs/mergeRefs.js +0 -1
  221. package/cjs/package.json +0 -31
  222. package/cjs/types.d.ts +0 -2
  223. package/cjs/types.js +0 -1
  224. package/cjs/useAsyncFn.d.ts +0 -24
  225. package/cjs/useAsyncFn.js +0 -1
  226. package/cjs/useFirstMountState.d.ts +0 -2
  227. package/cjs/useFirstMountState.js +0 -1
  228. package/cjs/useFixedOffset.d.ts +0 -2
  229. package/cjs/useFixedOffset.js +0 -1
  230. package/cjs/useFocus.d.ts +0 -2
  231. package/cjs/useFocus.js +0 -1
  232. package/cjs/useInterval.d.ts +0 -2
  233. package/cjs/useInterval.js +0 -1
  234. package/cjs/useIsomorphicLayoutEffect.d.ts +0 -3
  235. package/cjs/useIsomorphicLayoutEffect.js +0 -1
  236. package/cjs/useKeyUp.d.ts +0 -2
  237. package/cjs/useKeyUp.js +0 -1
  238. package/cjs/useMeasure.d.ts +0 -22
  239. package/cjs/useMeasure.js +0 -1
  240. package/cjs/useMountedState.d.ts +0 -2
  241. package/cjs/useMountedState.js +0 -1
  242. package/cjs/useNavigateAway.d.ts +0 -3
  243. package/cjs/useNavigateAway.js +0 -1
  244. package/cjs/usePrevious.d.ts +0 -2
  245. package/cjs/usePrevious.js +0 -1
  246. package/cjs/usePreviousRef.d.ts +0 -2
  247. package/cjs/usePreviousRef.js +0 -1
  248. package/cjs/useReveal.d.ts +0 -13
  249. package/cjs/useReveal.js +0 -1
  250. package/cjs/useScrollPosition.d.ts +0 -7
  251. package/cjs/useScrollPosition.js +0 -1
  252. package/cjs/useScrollThreshold.d.ts +0 -2
  253. package/cjs/useScrollThreshold.js +0 -1
  254. package/cjs/useScrollTo.d.ts +0 -2
  255. package/cjs/useScrollTo.js +0 -1
  256. package/cjs/useSmoothScroll.d.ts +0 -2
  257. package/cjs/useSmoothScroll.js +0 -1
  258. package/cjs/useSpinDelay.d.ts +0 -2
  259. package/cjs/useSpinDelay.js +0 -1
  260. package/cjs/useTraceUpdate.d.ts +0 -2
  261. package/cjs/useTraceUpdate.js +0 -1
  262. package/cjs/useUpdateEffect.d.ts +0 -3
  263. package/cjs/useUpdateEffect.js +0 -1
  264. package/cjs/useWindowSize.d.ts +0 -3
  265. package/cjs/useWindowSize.js +0 -1
  266. package/classed.js +0 -1
  267. package/createUseMediaQueryWidth.js +0 -1
  268. package/extendComponent.js +0 -1
  269. package/forms/antispam.js +0 -1
  270. package/forms.js +0 -1
  271. package/index.js +0 -1
  272. package/mergeRefs.js +0 -1
  273. package/types.js +0 -1
  274. package/useAsyncFn.js +0 -1
  275. package/useFirstMountState.js +0 -1
  276. package/useFixedOffset.js +0 -1
  277. package/useFocus.js +0 -1
  278. package/useInterval.js +0 -1
  279. package/useIsomorphicLayoutEffect.js +0 -1
  280. package/useKeyUp.js +0 -1
  281. package/useMeasure.js +0 -1
  282. package/useMountedState.js +0 -1
  283. package/useNavigateAway.js +0 -1
  284. package/usePrevious.js +0 -1
  285. package/usePreviousRef.js +0 -1
  286. package/useReveal.js +0 -1
  287. package/useScrollPosition.js +0 -1
  288. package/useScrollThreshold.js +0 -1
  289. package/useScrollTo.js +0 -1
  290. package/useSmoothScroll.js +0 -1
  291. package/useSpinDelay.js +0 -1
  292. package/useTraceUpdate.js +0 -1
  293. package/useUpdateEffect.js +0 -1
  294. package/useWindowSize.js +0 -1
@@ -0,0 +1,561 @@
1
+ import { jsx, jsxs, Fragment as Fragment$1 } from 'react/jsx-runtime';
2
+ import { useState, Fragment, useEffect, useMemo, useReducer, useCallback } from 'react';
3
+ import { addDays } from 'date-fns/addDays';
4
+ import { addMonths } from 'date-fns/addMonths';
5
+ import { addWeeks } from 'date-fns/addWeeks';
6
+ import { endOfMonth } from 'date-fns/endOfMonth';
7
+ import { endOfWeek } from 'date-fns/endOfWeek';
8
+ import { isWithinInterval } from 'date-fns/isWithinInterval';
9
+ import { startOfWeek } from 'date-fns/startOfWeek';
10
+ import { subMonths } from 'date-fns/subMonths';
11
+ import { subWeeks } from 'date-fns/subWeeks';
12
+ import { format } from 'date-fns/format';
13
+ import { eachWeekOfInterval } from 'date-fns/eachWeekOfInterval';
14
+ import { useSwipeable } from 'react-swipeable';
15
+ import { differenceInDays } from 'date-fns/differenceInDays';
16
+ import { subDays } from 'date-fns/subDays';
17
+ import { isUndefined, isString, arrayToLookup } from '@koine/utils';
18
+
19
+ let getEventTimestamp = (dateLike) => {
20
+ const date = new Date(dateLike);
21
+ date.setHours(0, 0, 0, 0);
22
+ return date.valueOf() / 1000;
23
+ };
24
+ let getDisplayTime = (date) => date.getHours() +
25
+ ":" +
26
+ "0".repeat(2 - date.getMinutes().toString().length) +
27
+ date.getMinutes();
28
+ let getStartDate = (date, view) => {
29
+ date.setHours(0, 0, 0);
30
+ if (view === "month") {
31
+ date.setDate(1);
32
+ }
33
+ else if (view === "week") {
34
+ date = startOfWeek(date, { weekStartsOn: 1 });
35
+ }
36
+ return date;
37
+ };
38
+ let getEndDate = (start, view) => {
39
+ let end = start;
40
+ if (view === "month") {
41
+ end = endOfMonth(start);
42
+ }
43
+ else if (view === "week") {
44
+ end = endOfWeek(start, { weekStartsOn: 1 });
45
+ }
46
+ end.setHours(23, 59, 59);
47
+ return end;
48
+ };
49
+ let getPrevDate = (date, view) => view === "month" ? subMonths(date, 1) : subWeeks(date, 1);
50
+ let getNextDate = (date, view) => view === "month" ? addMonths(date, 1) : addWeeks(date, 1);
51
+ let isTodayInView = (start, end) => isWithinInterval(new Date(), { start, end });
52
+ let addCalendarEvents = (toAdd, toExtend) => {
53
+ for (const id in toAdd) {
54
+ const event = toAdd[id];
55
+ toExtend[id] = event;
56
+ }
57
+ return toExtend;
58
+ };
59
+ let getEventsByTimestamp = (events) => {
60
+ const output = {};
61
+ for (const uid in events) {
62
+ const event = events[uid];
63
+ event.days.forEach((timestamp) => {
64
+ output[timestamp] = (output[timestamp] || {});
65
+ output[timestamp][uid] = event;
66
+ });
67
+ }
68
+ return output;
69
+ };
70
+ let getSortedEvents = (events) => {
71
+ const output = [];
72
+ for (const uid in events) {
73
+ output.push(events[uid]);
74
+ }
75
+ output.sort((a, b) => {
76
+ const multi = Number(b.multi) - Number(a.multi);
77
+ const allDay = Number(b.allDay) - Number(a.allDay);
78
+ const start = a.start.getTime() - b.start.getTime();
79
+ const created = a.created.getTime() - b.created.getTime();
80
+ return multi || allDay || start || created;
81
+ });
82
+ return output;
83
+ };
84
+ const FREE_SLOT = 0;
85
+ const BUSY_SLOT = 1;
86
+ let processEventsInView = (eventsMap, calendarView, month, weeks) => {
87
+ const eventsByTimestamp = getEventsByTimestamp(eventsMap);
88
+ const eventsList = getSortedEvents(eventsMap);
89
+ const todayDate = new Date();
90
+ const todayTimestamp = getEventTimestamp(todayDate);
91
+ const startedAtTopMap = {};
92
+ const viewWeeks = [];
93
+ for (let weekIdx = 0; weekIdx < weeks.length; weekIdx++) {
94
+ const viewWeek = {
95
+ props: { key: `week.${weekIdx}` },
96
+ days: [],
97
+ };
98
+ const weekStartDate = weeks[weekIdx];
99
+ const weekStartDay = weekStartDate.getDate();
100
+ const weekStartTimestamp = getEventTimestamp(new Date(weekStartDate));
101
+ const weekEndTimestamp = getEventTimestamp(addDays(new Date(weekStartDate), 6));
102
+ for (let dayNumber = 0; dayNumber < 7; dayNumber++) {
103
+ const dayDate = new Date(new Date(weekStartDate).setDate(weekStartDay + dayNumber));
104
+ const dayTimestamp = getEventTimestamp(dayDate);
105
+ const $isToday = todayTimestamp === dayTimestamp;
106
+ const $isOutOfRange = calendarView === "month" && dayDate.getMonth() !== month;
107
+ const contextualProps = {
108
+ $isToday,
109
+ $isOutOfRange,
110
+ };
111
+ const viewDay = {
112
+ props: { key: `day.${dayTimestamp}`, ...contextualProps },
113
+ timestamp: dayTimestamp + "",
114
+ label: dayDate.getDate() + "",
115
+ events: [],
116
+ };
117
+ if (eventsByTimestamp?.[dayTimestamp]) {
118
+ const verticalSlots = Object.keys(eventsByTimestamp[dayTimestamp]).map(() => FREE_SLOT);
119
+ for (let eventIdx = 0; eventIdx < eventsList.length; eventIdx++) {
120
+ const event = eventsList[eventIdx];
121
+ let width = 1;
122
+ let top = 0;
123
+ let firstOfMulti;
124
+ if (!event.daysMap[dayTimestamp]) {
125
+ continue;
126
+ }
127
+ if (event.multi) {
128
+ width = event.days.filter((t) => t >= weekStartTimestamp && t <= weekEndTimestamp).length;
129
+ if (event.days.indexOf(dayTimestamp) === 0 || dayNumber === 0) {
130
+ firstOfMulti = true;
131
+ }
132
+ }
133
+ if (startedAtTopMap[event.uid]) {
134
+ top = startedAtTopMap[event.uid];
135
+ }
136
+ else {
137
+ for (let verticalIdx = 0; verticalIdx < verticalSlots.length; verticalIdx++) {
138
+ const freeOrBusy = verticalSlots[verticalIdx];
139
+ if (freeOrBusy !== BUSY_SLOT) {
140
+ top = verticalIdx;
141
+ break;
142
+ }
143
+ }
144
+ }
145
+ verticalSlots[top] = BUSY_SLOT;
146
+ if (firstOfMulti) {
147
+ startedAtTopMap[event.uid] = top;
148
+ }
149
+ viewDay.events.push({
150
+ key: `event.${dayTimestamp}-${top}`,
151
+ ...contextualProps,
152
+ ...event,
153
+ isPast: todayDate > event.end,
154
+ firstOfMulti,
155
+ top,
156
+ width,
157
+ });
158
+ }
159
+ for (let i = 0; i < verticalSlots.length; i++) {
160
+ if (verticalSlots[i] !== BUSY_SLOT) {
161
+ viewDay.events.push({
162
+ key: `event.${dayTimestamp}-${i}}`,
163
+ placeholder: true,
164
+ top: i,
165
+ });
166
+ }
167
+ }
168
+ viewDay.events.sort((a, b) => a.top - b.top);
169
+ }
170
+ viewWeek.days.push(viewDay);
171
+ }
172
+ viewWeeks.push(viewWeek);
173
+ }
174
+ return viewWeeks;
175
+ };
176
+
177
+ const IconExpand = (props) => {
178
+ return (jsxs("svg", { viewBox: "0 0 24 24", fill: "currentColor", stroke: "none", ...props, children: [jsx("path", { d: "M0 0h24v24H0z" }), jsx("path", { d: "M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z" })] }));
179
+ };
180
+ const styleBtn = {
181
+ overflow: "hidden",
182
+ whiteSpace: "nowrap",
183
+ textOverflow: "ellipsis",
184
+ };
185
+ let CalendarDaygridCell = ({ eventClicked, setEventClicked, setEventHovered, view, maxEvents, events, calendarsMap, Cell = "div", CellOverflow = "div", CellEvent = "div", CellEventBtn = "div", CellEventTitle = "span", CellEventStart = "span", }) => {
186
+ const [isExpanded, expand] = useState(false);
187
+ const eventsWithoutPlaceholders = events.filter((event) => !event.placeholder);
188
+ return (jsx(Cell, { children: events.map((event, i) => {
189
+ if (i === maxEvents && !isExpanded) {
190
+ return (jsxs(CellOverflow, { onClick: () => expand(true), children: [jsx(IconExpand, {}), eventsWithoutPlaceholders.length - maxEvents] }, "overflowMessage" + i));
191
+ }
192
+ if (i > maxEvents && !isExpanded)
193
+ return null;
194
+ if (event.placeholder) {
195
+ return (jsx(Fragment, { children: jsx(CellEvent, { "$placeholder": true, children: jsx(CellEventBtn, { "aria-hidden": "true", style: { visibility: "hidden" }, "$placeholder": true, children: jsx(CellEventTitle, { children: "\u00A0" }) }) }) }, event.key));
196
+ }
197
+ const styleEvent = {
198
+ zIndex: event.firstOfMulti ? 1 : 0,
199
+ position: "relative",
200
+ width: event.firstOfMulti ? `${100 * event.width}%` : "100%",
201
+ };
202
+ if (!calendarsMap[event.calendar.id].on) {
203
+ styleBtn.display = "none";
204
+ }
205
+ const styledProps = {
206
+ $view: view,
207
+ $selected: eventClicked?.uid === event.uid,
208
+ $past: event.isPast,
209
+ $color: event.color,
210
+ $isOutOfRange: event.$isOutOfRange,
211
+ $isToday: event.$isToday,
212
+ };
213
+ return (jsx(Fragment, { children: jsx(CellEvent, { style: styleEvent, ...styledProps, children: jsx(CellEventBtn, { role: "button", style: styleBtn, ...styledProps, onClick: () => setEventClicked((prev) => prev?.uid === event.uid ? null : event), onMouseEnter: () => setEventHovered(event), onMouseLeave: () => setEventHovered(null), children: event.allDay ? (jsx(CellEventTitle, { children: event.title })) : (jsxs(Fragment$1, { children: [jsx(CellEventStart, { children: getDisplayTime(event.start) }), jsx(CellEventTitle, { children: event.title })] })) }) }) }, event.key));
214
+ }) }));
215
+ };
216
+
217
+ let useDateLocale = (locale, defaultLocale = "en") => {
218
+ const [data, setData] = useState();
219
+ const [current, setCurrent] = useState(defaultLocale);
220
+ useEffect(() => {
221
+ const importLocaleFile = async () => {
222
+ const localeToSet = await import('date-fns/locale/en-US');
223
+ setCurrent(locale || current);
224
+ setData(localeToSet.enUS);
225
+ };
226
+ if (locale !== current) {
227
+ importLocaleFile();
228
+ }
229
+ }, [locale, current]);
230
+ return data;
231
+ };
232
+
233
+ let KoineCalendarDaygridNav = ({ range, view, todayInView, handlePrev, handleNext, handleToday, handleView, locale: localeCode, NavRoot = "nav", NavTitle = "div", NavBtns = "div", NavBtnPrev = "button", NavBtnNext = "button", NavBtnToday = "button", NavBtnViewMonth = "button", NavBtnViewWeek = "button", }) => {
234
+ const [start, end] = range;
235
+ const locale = useDateLocale(localeCode);
236
+ const opts = { locale };
237
+ let formatted = "";
238
+ if (view === "month") {
239
+ formatted = format(start, "MMMM yyyy", opts);
240
+ }
241
+ if (view === "week") {
242
+ const inSameMonth = start.getMonth() === end.getMonth();
243
+ if (inSameMonth) {
244
+ formatted = format(start, "# MMMM yyyy", opts).replace("#", `${start.getDate()}-${end.getDate()}`);
245
+ }
246
+ else {
247
+ formatted = `${format(start, "d MMMM", opts)} - ${format(end, "d MMMM yyyy", opts)}`;
248
+ }
249
+ }
250
+ return (jsxs(NavRoot, { children: [jsxs(NavBtns, { children: [jsx(NavBtnPrev, { onClick: handlePrev }), jsx(NavBtnNext, { onClick: handleNext }), jsx(NavBtnToday, { onClick: handleToday, disabled: todayInView }), jsx(NavBtnViewMonth, { onClick: () => handleView("month"), disabled: view === "month" }), jsx(NavBtnViewWeek, { onClick: () => handleView("week"), disabled: view === "week" })] }), jsx(NavTitle, { range: range, formatted: formatted })] }));
251
+ };
252
+
253
+ function getView(range) {
254
+ const [start, end] = range;
255
+ const weeks = eachWeekOfInterval({ start, end }, { weekStartsOn: 1 });
256
+ return {
257
+ month: start.getMonth(),
258
+ weeks,
259
+ };
260
+ }
261
+ let KoineCalendarDaygridTable = ({ locale: localeCode, handlePrev, handleNext, events, dayLabels, view, range, eventClicked, setEventClicked, eventHovered, setEventHovered, calendarsMap = {}, maxEvents = 5, Table = "table", TableHead = "thead", TableHeadCell = "th", TableBody = "tbody", TableBodyRow = "tr", TableBodyCell = "td", TableBodyCellDate = "div", Cell, CellOverflow, CellEvent, CellEventBtn, CellEventTitle, CellEventStart, }) => {
262
+ const restKoine = {
263
+ Cell,
264
+ CellOverflow,
265
+ CellEvent,
266
+ CellEventBtn,
267
+ CellEventTitle,
268
+ CellEventStart,
269
+ };
270
+ const [days, setDays] = useState(dayLabels || [0, 1, 2, 3, 4, 5, 6]);
271
+ const [weeksEvents, setWeeksEvents] = useState([]);
272
+ const locale = useDateLocale(localeCode);
273
+ const { month, weeks } = useMemo(() => getView(range), [range]);
274
+ const swipeableHandlers = useSwipeable({
275
+ onSwipedLeft: handleNext,
276
+ onSwipedRight: handlePrev,
277
+ });
278
+ useEffect(() => {
279
+ setWeeksEvents(processEventsInView(events, view, month, weeks));
280
+ }, [events, view, month, weeks]);
281
+ useEffect(() => {
282
+ if (locale && locale.localize && !dayLabels) {
283
+ setDays([1, 2, 3, 4, 5, 6, 0].map((i) => locale.localize.day(i, { width: "abbreviated" })));
284
+ }
285
+ }, [locale, dayLabels]);
286
+ return (jsxs(Table, { ...swipeableHandlers, children: [jsx(TableHead, { children: jsx("tr", { children: days.map((day) => (jsx(TableHeadCell, { scope: "column", children: day }, day))) }) }), jsx(TableBody, { children: weeksEvents.map((week, i) => (jsx(TableBodyRow, { ...week.props, children: week.days.map((day) => (jsxs(TableBodyCell, { ...day.props, children: [jsx(TableBodyCellDate, { ...day.props, children: day.label }), day.events.length > 0 && (jsx(CalendarDaygridCell, { eventClicked,
287
+ setEventClicked,
288
+ eventHovered,
289
+ setEventHovered,
290
+ view,
291
+ maxEvents,
292
+ events: day.events,
293
+ timestamp: day.timestamp,
294
+ calendarsMap, ...restKoine }))] }))) }))) })] }));
295
+ };
296
+
297
+ let KoineCalendarLegend = ({ calendarsMap = {}, toggleCalendarVisibility, LegendItem = "div", LegendItemStatus = "span", LegendItemLabel = "span", LegendItemEvents = "span", }) => {
298
+ return (jsx(Fragment$1, { children: Object.entries(calendarsMap).map(([id, calendar]) => (jsxs(LegendItem, { onClick: () => toggleCalendarVisibility(id), "$color": calendar.color, "$empty": calendar.events === 0, disabled: calendar.events === 0, children: [jsx(LegendItemStatus, { children: calendar.on ? "\u2b24" : "\u2b58" }), jsx(LegendItemLabel, { children: calendar.name }), jsx(LegendItemEvents, { children: calendar.events })] }, "CalendarLegend." + id))) }));
299
+ };
300
+
301
+ const baseURL = "https://www.googleapis.com/calendar/v3/calendars/";
302
+ let getCalendarsEventsFromGoogle = async ({ calendars, ...options }) => {
303
+ const allEvents = {};
304
+ await Promise.all(calendars.map(async (calendar) => {
305
+ const events = await getCalendarEventsFromGoogle({
306
+ calendar,
307
+ ...options,
308
+ });
309
+ addCalendarEvents(events, allEvents);
310
+ }));
311
+ return allEvents;
312
+ };
313
+ async function getCalendarEventsFromGoogle({ apiKey, calendar, timeZone = "", start, end, }) {
314
+ const events = {};
315
+ const params = new URLSearchParams({
316
+ calendarId: calendar.id,
317
+ timeZone,
318
+ singleEvents: "true",
319
+ maxAttendees: "1",
320
+ maxResults: "9999",
321
+ sanitizeHtml: "true",
322
+ timeMin: start.toISOString(),
323
+ timeMax: end.toISOString(),
324
+ key: apiKey || process.env["GOOGLE_CALENDAR_API_KEY"] || "",
325
+ }).toString();
326
+ const url = baseURL + calendar.id + "/events?" + params;
327
+ try {
328
+ const response = await fetch(url, { method: "GET" });
329
+ const data = (await response.json());
330
+ calendar.name = calendar.name || data.summary;
331
+ data.items.forEach((googleEvent) => {
332
+ const event = transformCalendarEventFromGoogle(googleEvent, calendar);
333
+ events[event.uid] = event;
334
+ });
335
+ }
336
+ catch (e) {
337
+ }
338
+ return events;
339
+ }
340
+ function transformCalendarEventFromGoogle(event, calendar) {
341
+ const created = new Date(event.created);
342
+ const link = event.htmlLink;
343
+ const title = event.summary;
344
+ const status = event.status;
345
+ const start = new Date(event.start.date || event.start.dateTime);
346
+ let end = new Date(event.end.date || event.end.dateTime);
347
+ const color = calendar.color;
348
+ const allDay = isUndefined(event.end.dateTime) && isString(event.end.date);
349
+ const location = event.location || "";
350
+ const description = event.description || "";
351
+ const uid = created.getTime() + "" + start.getTime();
352
+ if (allDay && end > start) {
353
+ end = subDays(end, 1);
354
+ end.setHours(23, 59, 59);
355
+ }
356
+ const days = getDays();
357
+ const daysMap = arrayToLookup(days);
358
+ const multi = days.length > 1;
359
+ function getDays() {
360
+ const from = new Date(start);
361
+ const to = new Date(end);
362
+ const days = [getEventTimestamp(from)];
363
+ while (differenceInDays(to, from)) {
364
+ from.setDate(from.getDate() + 1);
365
+ days.push(getEventTimestamp(from));
366
+ }
367
+ return days;
368
+ }
369
+ return {
370
+ calendar,
371
+ created,
372
+ link,
373
+ title,
374
+ status,
375
+ start,
376
+ end,
377
+ days,
378
+ daysMap,
379
+ multi,
380
+ color,
381
+ allDay,
382
+ location,
383
+ description,
384
+ uid,
385
+ };
386
+ }
387
+
388
+ let useCalendar = ({ locale, apiKey, calendars, events: initialEvents, start: initialStart, end: initialEnd, view: initialView = "month", timeZone = "", onError, }) => {
389
+ const [view, setView] = useState(initialView);
390
+ const start = initialStart || getStartDate(new Date(), view);
391
+ const end = initialEnd || getEndDate(start, view);
392
+ const [range, setRange] = useState([start, end]);
393
+ const [todayInView, setTodayInView] = useState(isTodayInView(start, end));
394
+ const [events, setEvents] = useState(initialEvents || {});
395
+ const [eventHovered, setEventHovered] = useState(null);
396
+ const [eventClicked, setEventClicked] = useState(null);
397
+ const [calendarsMap, updateCalendars] = useReducer((state, action) => {
398
+ const { type } = action;
399
+ switch (type) {
400
+ case "events": {
401
+ const events = action.payload;
402
+ return Object.entries(state).reduce((map, [id, calendar]) => {
403
+ map[id] = {
404
+ ...calendar,
405
+ events: events[id] || 0,
406
+ };
407
+ return map;
408
+ }, {});
409
+ }
410
+ case "visibility": {
411
+ const visible = action.payload;
412
+ if (typeof visible === "string") {
413
+ return {
414
+ ...state,
415
+ [visible]: {
416
+ ...state[visible],
417
+ on: !state[visible].on,
418
+ },
419
+ };
420
+ }
421
+ else {
422
+ return Object.entries(state).reduce((map, [id, calendar]) => {
423
+ map[id] = {
424
+ ...calendar,
425
+ on: visible.indexOf(id) > -1,
426
+ };
427
+ return map;
428
+ }, {});
429
+ }
430
+ }
431
+ default:
432
+ return state;
433
+ }
434
+ }, calendars.reduce((map, calendar) => {
435
+ map[calendar.id] = {
436
+ ...calendar,
437
+ name: calendar.name || "",
438
+ on: true,
439
+ events: 0,
440
+ };
441
+ return map;
442
+ }, {}));
443
+ const toggleCalendarVisibility = useCallback((idOrIds) => {
444
+ updateCalendars({ type: "visibility", payload: idOrIds });
445
+ }, [updateCalendars]);
446
+ const updateCalendarsBasedOnEvents = useCallback((events) => {
447
+ const payload = {};
448
+ for (const uid in events) {
449
+ const { id } = events[uid].calendar;
450
+ payload[id] = payload[id] || 0;
451
+ payload[id]++;
452
+ }
453
+ updateCalendars({ type: "events", payload });
454
+ }, []);
455
+ const loadCalendars = useCallback(async (calendars, start, end) => {
456
+ try {
457
+ const newEvents = await getCalendarsEventsFromGoogle({
458
+ apiKey,
459
+ calendars,
460
+ timeZone,
461
+ start,
462
+ end,
463
+ });
464
+ setEvents(newEvents);
465
+ }
466
+ catch (e) {
467
+ if (onError)
468
+ onError(e);
469
+ }
470
+ }, [setEvents, apiKey, timeZone, onError]);
471
+ const handleToday = useCallback(() => {
472
+ const [start, end] = range;
473
+ const newStart = getStartDate(new Date(), view);
474
+ const newEnd = getEndDate(newStart, view);
475
+ setRange([newStart, newEnd]);
476
+ if (start.getTime() !== newStart.getTime() ||
477
+ end.getTime() !== newEnd.getTime()) {
478
+ setEventClicked(null);
479
+ setEventHovered(null);
480
+ }
481
+ }, [view, range]);
482
+ const handlePrev = useCallback(() => {
483
+ setRange(([start]) => {
484
+ const newStart = getPrevDate(start, view);
485
+ const newEnd = getEndDate(newStart, view);
486
+ return [newStart, newEnd];
487
+ });
488
+ setEventClicked(null);
489
+ setEventHovered(null);
490
+ }, [view]);
491
+ const handleNext = useCallback(() => {
492
+ setRange(([start]) => {
493
+ const newStart = getNextDate(start, view);
494
+ const newEnd = getEndDate(newStart, view);
495
+ return [newStart, newEnd];
496
+ });
497
+ setEventClicked(null);
498
+ setEventHovered(null);
499
+ }, [view]);
500
+ const handleView = useCallback((newView) => {
501
+ const newStart = getStartDate(start, newView);
502
+ const newEnd = getEndDate(newStart, newView);
503
+ setRange([newStart, newEnd]);
504
+ setView(newView);
505
+ setEventClicked(null);
506
+ setEventHovered(null);
507
+ }, [start]);
508
+ useEffect(() => {
509
+ const [start, end] = range;
510
+ loadCalendars(calendars, start, end);
511
+ setTodayInView(isTodayInView(start, end));
512
+ }, [range]);
513
+ useEffect(() => {
514
+ if (events) {
515
+ updateCalendarsBasedOnEvents(events);
516
+ }
517
+ }, [events, updateCalendarsBasedOnEvents]);
518
+ useEffect(() => {
519
+ if (eventClicked) {
520
+ if (!calendarsMap[eventClicked.calendar.id].on) {
521
+ setEventClicked(null);
522
+ }
523
+ }
524
+ }, [calendarsMap, eventClicked, setEventClicked]);
525
+ return {
526
+ view,
527
+ eventClicked,
528
+ setEventClicked,
529
+ eventHovered,
530
+ setEventHovered,
531
+ getDaygridNavProps: () => ({
532
+ locale,
533
+ handlePrev,
534
+ handleNext,
535
+ handleToday,
536
+ handleView,
537
+ todayInView,
538
+ range,
539
+ view,
540
+ }),
541
+ getDaygridTableProps: () => ({
542
+ locale,
543
+ events,
544
+ eventClicked,
545
+ setEventClicked,
546
+ eventHovered,
547
+ setEventHovered,
548
+ handlePrev,
549
+ handleNext,
550
+ calendarsMap,
551
+ range,
552
+ view,
553
+ }),
554
+ getLegendProps: () => ({
555
+ calendarsMap,
556
+ toggleCalendarVisibility,
557
+ }),
558
+ };
559
+ };
560
+
561
+ export { CalendarDaygridCell, KoineCalendarDaygridNav, KoineCalendarDaygridTable, KoineCalendarLegend, useCalendar, useDateLocale };
@@ -0,0 +1,2 @@
1
+ export * from "./classed";
2
+ export { default } from "./classed";
@@ -0,0 +1 @@
1
+ exports._default = require('./classed.cjs.js').default;
package/classed.cjs.js ADDED
@@ -0,0 +1,48 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var react = require('react');
6
+
7
+ let classed = (component) => {
8
+ const type = component.type || component;
9
+ return function (strings, ...args) {
10
+ const WrappedComponent = react.forwardRef(function (props, ref) {
11
+ const argResolved = args
12
+ .map((arg, index) => {
13
+ let result = "";
14
+ if (typeof arg === "function") {
15
+ result = arg(props);
16
+ }
17
+ else if (typeof arg !== "undefined") {
18
+ result = arg.toString();
19
+ }
20
+ return strings[index] + result;
21
+ })
22
+ .join("");
23
+ const isNativeHtmlElement = typeof type === "string";
24
+ const propsToForward = isNativeHtmlElement
25
+ ? {}
26
+ : props;
27
+ if (isNativeHtmlElement) {
28
+ for (const key in props) {
29
+ if (!key.startsWith("$")) {
30
+ propsToForward[key] = props[key];
31
+ }
32
+ }
33
+ }
34
+ let className = argResolved || strings[0];
35
+ className = className.match(/class="([^"]*)/)?.[1] || className;
36
+ className += props?.className ? " " + props?.className : "";
37
+ return react.createElement(type, {
38
+ ...propsToForward,
39
+ className: className || undefined,
40
+ ref,
41
+ });
42
+ });
43
+ return WrappedComponent;
44
+ };
45
+ };
46
+
47
+ exports.classed = classed;
48
+ exports["default"] = classed;
@@ -0,0 +1,2 @@
1
+ export * from './classed.cjs.js';
2
+ export { _default as default } from './classed.cjs.default.js';
package/classed.d.ts CHANGED
@@ -4,5 +4,5 @@ type ClassedAugmentedProps<Props> = Props & {
4
4
  ref?: React.Ref<any>;
5
5
  };
6
6
  type ClassedFinalProps<Props, Component> = Component extends React.ReactHTML ? React.HTMLProps<Component> & ClassedAugmentedProps<Props> : ClassedAugmentedProps<Props>;
7
- export declare let classed: <Props, Component extends React.ElementType<any, keyof React.JSX.IntrinsicElements> = any>(component: Component) => (strings: TemplateStringsArray, ...args: string[] | ((props: Props) => string)[]) => React.ForwardRefExoticComponent<React.PropsWithoutRef<ClassedFinalProps<Props, Component>> & React.RefAttributes<Component>>;
7
+ export declare let classed: <Props, Component extends React.ElementType<any, keyof React.JSX.IntrinsicElements> = any>(component: Component) => (strings: TemplateStringsArray, ...args: ((props: Props) => string)[] | string[]) => React.ForwardRefExoticComponent<React.PropsWithoutRef<ClassedFinalProps<Props, Component>> & React.RefAttributes<Component>>;
8
8
  export default classed;
package/classed.esm.js ADDED
@@ -0,0 +1,43 @@
1
+ import { forwardRef, createElement } from 'react';
2
+
3
+ let classed = (component) => {
4
+ const type = component.type || component;
5
+ return function (strings, ...args) {
6
+ const WrappedComponent = forwardRef(function (props, ref) {
7
+ const argResolved = args
8
+ .map((arg, index) => {
9
+ let result = "";
10
+ if (typeof arg === "function") {
11
+ result = arg(props);
12
+ }
13
+ else if (typeof arg !== "undefined") {
14
+ result = arg.toString();
15
+ }
16
+ return strings[index] + result;
17
+ })
18
+ .join("");
19
+ const isNativeHtmlElement = typeof type === "string";
20
+ const propsToForward = isNativeHtmlElement
21
+ ? {}
22
+ : props;
23
+ if (isNativeHtmlElement) {
24
+ for (const key in props) {
25
+ if (!key.startsWith("$")) {
26
+ propsToForward[key] = props[key];
27
+ }
28
+ }
29
+ }
30
+ let className = argResolved || strings[0];
31
+ className = className.match(/class="([^"]*)/)?.[1] || className;
32
+ className += props?.className ? " " + props?.className : "";
33
+ return createElement(type, {
34
+ ...propsToForward,
35
+ className: className || undefined,
36
+ ref,
37
+ });
38
+ });
39
+ return WrappedComponent;
40
+ };
41
+ };
42
+
43
+ export { classed, classed as default };
@@ -0,0 +1,2 @@
1
+ export * from "./createUseMediaQueryWidth";
2
+ export { default } from "./createUseMediaQueryWidth";
@@ -0,0 +1 @@
1
+ exports._default = require('./createUseMediaQueryWidth.cjs.js').default;