@koine/react 2.0.0-beta.74 → 2.0.0-beta.76

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 (182) hide show
  1. package/FaviconTags.js +1 -5
  2. package/Meta.js +1 -5
  3. package/NoJs.js +1 -7
  4. package/Polymorphic.js +1 -1
  5. package/calendar/CalendarDaygridCell.js +1 -42
  6. package/calendar/CalendarDaygridNav.js +1 -22
  7. package/calendar/CalendarDaygridTable.js +1 -50
  8. package/calendar/CalendarLegend.js +1 -4
  9. package/calendar/calendar-api-google.js +1 -90
  10. package/calendar/types.js +1 -1
  11. package/calendar/useCalendar.js +1 -175
  12. package/calendar/useDateLocale.js +1 -16
  13. package/calendar/utils.js +1 -172
  14. package/calendar.js +1 -7
  15. package/{components → cjs}/FaviconTags.d.ts +1 -0
  16. package/cjs/FaviconTags.js +1 -0
  17. package/{components → cjs}/Meta.d.ts +1 -0
  18. package/cjs/Meta.js +1 -0
  19. package/{components → cjs}/NoJs.d.ts +1 -0
  20. package/cjs/NoJs.js +1 -0
  21. package/cjs/Polymorphic.js +1 -0
  22. package/cjs/calendar/CalendarDaygridCell.d.ts +35 -0
  23. package/cjs/calendar/CalendarDaygridCell.js +1 -0
  24. package/cjs/calendar/CalendarDaygridNav.d.ts +27 -0
  25. package/cjs/calendar/CalendarDaygridNav.js +1 -0
  26. package/cjs/calendar/CalendarDaygridTable.d.ts +25 -0
  27. package/cjs/calendar/CalendarDaygridTable.js +1 -0
  28. package/cjs/calendar/CalendarLegend.d.ts +18 -0
  29. package/cjs/calendar/CalendarLegend.js +1 -0
  30. package/cjs/calendar/calendar-api-google.d.ts +10 -0
  31. package/cjs/calendar/calendar-api-google.js +1 -0
  32. package/cjs/calendar/types.d.ts +62 -0
  33. package/cjs/calendar/types.js +1 -0
  34. package/cjs/calendar/useCalendar.d.ts +35 -0
  35. package/cjs/calendar/useCalendar.js +1 -0
  36. package/cjs/calendar/useDateLocale.d.ts +2 -0
  37. package/cjs/calendar/useDateLocale.js +1 -0
  38. package/cjs/calendar/utils.d.ts +11 -0
  39. package/cjs/calendar/utils.js +1 -0
  40. package/cjs/calendar.d.ts +7 -0
  41. package/cjs/calendar.js +1 -0
  42. package/{utils → cjs}/classed.d.ts +2 -2
  43. package/cjs/classed.js +1 -0
  44. package/{utils → cjs}/createUseMediaQueryWidth.d.ts +1 -1
  45. package/cjs/createUseMediaQueryWidth.js +1 -0
  46. package/{utils → cjs}/extendComponent.d.ts +1 -1
  47. package/cjs/extendComponent.js +1 -0
  48. package/cjs/forms/antispam.d.ts +27 -0
  49. package/cjs/forms/antispam.js +1 -0
  50. package/cjs/forms.d.ts +1 -0
  51. package/cjs/forms.js +1 -0
  52. package/{hooks → cjs}/index.d.ts +9 -0
  53. package/cjs/index.js +1 -0
  54. package/{utils → cjs}/mergeRefs.d.ts +1 -0
  55. package/cjs/mergeRefs.js +1 -0
  56. package/cjs/package.json +31 -0
  57. package/cjs/types.d.ts +2 -0
  58. package/cjs/types.js +1 -0
  59. package/{hooks → cjs}/useAsyncFn.d.ts +1 -1
  60. package/cjs/useAsyncFn.js +1 -0
  61. package/{hooks → cjs}/useFirstMountState.d.ts +1 -0
  62. package/cjs/useFirstMountState.js +1 -0
  63. package/{hooks → cjs}/useFixedOffset.d.ts +1 -0
  64. package/cjs/useFixedOffset.js +1 -0
  65. package/{hooks → cjs}/useFocus.d.ts +1 -0
  66. package/cjs/useFocus.js +1 -0
  67. package/{hooks → cjs}/useInterval.d.ts +1 -0
  68. package/cjs/useInterval.js +1 -0
  69. package/cjs/useIsomorphicLayoutEffect.d.ts +3 -0
  70. package/cjs/useIsomorphicLayoutEffect.js +1 -0
  71. package/{hooks → cjs}/useKeyUp.d.ts +1 -0
  72. package/cjs/useKeyUp.js +1 -0
  73. package/{hooks → cjs}/useMeasure.d.ts +1 -1
  74. package/cjs/useMeasure.js +1 -0
  75. package/{hooks → cjs}/useMountedState.d.ts +1 -0
  76. package/cjs/useMountedState.js +1 -0
  77. package/{hooks → cjs}/useNavigateAway.d.ts +1 -0
  78. package/cjs/useNavigateAway.js +1 -0
  79. package/{hooks → cjs}/usePrevious.d.ts +1 -0
  80. package/cjs/usePrevious.js +1 -0
  81. package/{hooks → cjs}/usePreviousRef.d.ts +1 -0
  82. package/cjs/usePreviousRef.js +1 -0
  83. package/{hooks → cjs}/useReveal.d.ts +1 -0
  84. package/cjs/useReveal.js +1 -0
  85. package/{hooks → cjs}/useScrollPosition.d.ts +1 -1
  86. package/cjs/useScrollPosition.js +1 -0
  87. package/{hooks → cjs}/useScrollThreshold.d.ts +1 -0
  88. package/cjs/useScrollThreshold.js +1 -0
  89. package/{hooks → cjs}/useScrollTo.d.ts +1 -0
  90. package/cjs/useScrollTo.js +1 -0
  91. package/{hooks → cjs}/useSmoothScroll.d.ts +1 -0
  92. package/cjs/useSmoothScroll.js +1 -0
  93. package/{hooks → cjs}/useSpinDelay.d.ts +1 -0
  94. package/cjs/useSpinDelay.js +1 -0
  95. package/{hooks → cjs}/useTraceUpdate.d.ts +1 -0
  96. package/cjs/useTraceUpdate.js +1 -0
  97. package/{hooks → cjs}/useUpdateEffect.d.ts +1 -0
  98. package/cjs/useUpdateEffect.js +1 -0
  99. package/{hooks → cjs}/useWindowSize.d.ts +1 -0
  100. package/cjs/useWindowSize.js +1 -0
  101. package/classed.d.ts +1 -1
  102. package/classed.js +1 -41
  103. package/createUseMediaQueryWidth.js +1 -38
  104. package/extendComponent.js +1 -9
  105. package/forms/antispam.js +1 -29
  106. package/forms.js +1 -1
  107. package/index.js +1 -26
  108. package/mergeRefs.js +1 -13
  109. package/package.json +172 -15
  110. package/types.js +1 -1
  111. package/useAsyncFn.js +1 -26
  112. package/useFirstMountState.js +1 -10
  113. package/useFixedOffset.js +1 -42
  114. package/useFocus.js +1 -9
  115. package/useInterval.js +1 -20
  116. package/useIsomorphicLayoutEffect.d.ts +2 -2
  117. package/useIsomorphicLayoutEffect.js +1 -4
  118. package/useKeyUp.js +1 -16
  119. package/useMeasure.js +1 -119
  120. package/useMountedState.js +1 -13
  121. package/useNavigateAway.js +1 -25
  122. package/usePrevious.js +1 -9
  123. package/usePreviousRef.js +1 -9
  124. package/useReveal.js +1 -42
  125. package/useScrollPosition.js +1 -58
  126. package/useScrollThreshold.js +1 -26
  127. package/useScrollTo.js +1 -18
  128. package/useSmoothScroll.js +1 -32
  129. package/useSpinDelay.js +1 -36
  130. package/useTraceUpdate.js +1 -17
  131. package/useUpdateEffect.js +1 -11
  132. package/useWindowSize.js +1 -20
  133. package/README.md +0 -1
  134. package/calendar.cjs.d.ts +0 -1
  135. package/calendar.cjs.default.js +0 -1
  136. package/calendar.cjs.js +0 -62
  137. package/calendar.cjs.mjs +0 -2
  138. package/calendar.esm.js +0 -35
  139. package/components/FaviconTags.js +0 -4
  140. package/components/Meta.js +0 -4
  141. package/components/NoJs.js +0 -6
  142. package/forms.cjs.d.ts +0 -1
  143. package/forms.cjs.default.js +0 -1
  144. package/forms.cjs.js +0 -11
  145. package/forms.cjs.mjs +0 -2
  146. package/forms.esm.js +0 -6
  147. package/hooks/index.js +0 -19
  148. package/hooks/useAsyncFn.js +0 -25
  149. package/hooks/useFirstMountState.js +0 -9
  150. package/hooks/useFixedOffset.js +0 -41
  151. package/hooks/useFocus.js +0 -8
  152. package/hooks/useInterval.js +0 -19
  153. package/hooks/useIsomorphicLayoutEffect.d.ts +0 -2
  154. package/hooks/useIsomorphicLayoutEffect.js +0 -3
  155. package/hooks/useKeyUp.js +0 -15
  156. package/hooks/useMeasure.js +0 -118
  157. package/hooks/useMountedState.js +0 -12
  158. package/hooks/useNavigateAway.js +0 -24
  159. package/hooks/usePrevious.js +0 -8
  160. package/hooks/usePreviousRef.js +0 -8
  161. package/hooks/useReveal.js +0 -41
  162. package/hooks/useScrollPosition.js +0 -57
  163. package/hooks/useScrollThreshold.js +0 -25
  164. package/hooks/useScrollTo.js +0 -17
  165. package/hooks/useSmoothScroll.js +0 -31
  166. package/hooks/useSpinDelay.js +0 -35
  167. package/hooks/useTraceUpdate.js +0 -16
  168. package/hooks/useUpdateEffect.js +0 -10
  169. package/hooks/useWindowSize.js +0 -19
  170. package/index.cjs.d.ts +0 -1
  171. package/index.cjs.default.js +0 -1
  172. package/index.cjs.js +0 -87
  173. package/index.cjs.mjs +0 -2
  174. package/index.esm.js +0 -58
  175. package/utils/Polymorphic.js +0 -1
  176. package/utils/classed.js +0 -40
  177. package/utils/createUseMediaQueryWidth.js +0 -37
  178. package/utils/extendComponent.js +0 -8
  179. package/utils/index.d.ts +0 -5
  180. package/utils/index.js +0 -4
  181. package/utils/mergeRefs.js +0 -12
  182. /package/{utils → cjs}/Polymorphic.d.ts +0 -0
@@ -6,3 +6,4 @@ export type FaviconTagsProps = {
6
6
  themeColor?: string;
7
7
  };
8
8
  export declare let FaviconTags: ({ name, color, safariTabColor, tileColor, themeColor, }: FaviconTagsProps) => import("react/jsx-runtime").JSX.Element;
9
+ export default FaviconTags;
@@ -0,0 +1 @@
1
+ import{jsx as e,jsxs as n,Fragment as i}from"react/jsx-runtime";export let FaviconTags=({name:a,color:t,safariTabColor:o,tileColor:c,themeColor:l})=>n(i,{children:[e("link",{rel:"shortcut icon",href:"/favicon.ico",type:"image/x-icon"}),e("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/apple-touch-icon.png"}),e("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicon-32x32.png"}),e("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicon-16x16.png"}),e("link",{rel:"manifest",href:"/site.webmanifest"}),e("link",{rel:"mask-icon",href:"/safari-pinned-tab.svg",color:o||t}),e("meta",{name:"apple-mobile-web-app-title",content:a}),e("meta",{name:"application-name",content:a}),e("meta",{name:"msapplication-TileColor",content:c||t}),e("meta",{name:"theme-color",content:l||t})]});export default FaviconTags;
@@ -2,3 +2,4 @@ export type MetaProps = {
2
2
  zoom?: boolean;
3
3
  };
4
4
  export declare let Meta: ({ zoom }: MetaProps) => import("react/jsx-runtime").JSX.Element;
5
+ export default Meta;
package/cjs/Meta.js ADDED
@@ -0,0 +1 @@
1
+ import{jsx as e}from"react/jsx-runtime";export let Meta=({zoom:t})=>e("meta",{name:"viewport",content:`width=device-width, initial-scale=1, maximum-scale=1${t?"":", user-scalable=0"}`});export default Meta;
@@ -1,2 +1,3 @@
1
1
  export type NoJsProps = Record<string, never>;
2
2
  export declare let NoJs: (_props: NoJsProps) => import("react/jsx-runtime").JSX.Element;
3
+ export default NoJs;
package/cjs/NoJs.js ADDED
@@ -0,0 +1 @@
1
+ import{jsx as e}from"react/jsx-runtime";export let NoJs=t=>e("script",{id:"no-js",dangerouslySetInnerHTML:{__html:'document.querySelector("html").className=document.querySelector("html").className.replace(/no-js/,"") + "js";'}});export default NoJs;
@@ -0,0 +1 @@
1
+ export{};
@@ -0,0 +1,35 @@
1
+ import type { KoineComponent, KoineComponentProps } from "../types";
2
+ import type { CalendarView, CalendarViewDayProps, CalendarViewEvent, CalendarsMap } from "./types";
3
+ import type { UseCalendarReturn } from "./useCalendar";
4
+ export type KoineCalendarDaygridCellProps = {
5
+ eventClicked?: UseCalendarReturn["eventClicked"];
6
+ setEventClicked: UseCalendarReturn["setEventClicked"];
7
+ eventHovered?: UseCalendarReturn["eventHovered"];
8
+ setEventHovered: UseCalendarReturn["setEventHovered"];
9
+ view: CalendarView;
10
+ maxEvents: number;
11
+ events: CalendarViewEvent[];
12
+ calendarsMap: CalendarsMap;
13
+ };
14
+ export type CalendarDaygridCellStyledProps = CalendarViewDayProps & {
15
+ $view: CalendarView;
16
+ $selected?: boolean;
17
+ $past?: boolean;
18
+ $color: string;
19
+ };
20
+ export type CalendarDaygridCellEventProps = React.ComponentPropsWithoutRef<"div"> & ((CalendarDaygridCellStyledProps & {
21
+ $placeholder?: false;
22
+ }) | {
23
+ $placeholder: true;
24
+ });
25
+ export type CalendarDaygridCellEventBtnProps = CalendarDaygridCellEventProps;
26
+ export type CalendarDaygridCellComponents = {
27
+ Cell?: KoineComponent;
28
+ CellOverflow?: KoineComponent;
29
+ CellEvent?: KoineComponent<CalendarDaygridCellEventProps>;
30
+ CellEventBtn?: KoineComponent<CalendarDaygridCellEventBtnProps>;
31
+ CellEventTitle?: KoineComponent;
32
+ CellEventStart?: KoineComponent;
33
+ };
34
+ export type CalendarDaygridCellProps = KoineComponentProps<KoineCalendarDaygridCellProps, CalendarDaygridCellComponents>;
35
+ export declare let CalendarDaygridCell: ({ eventClicked, setEventClicked, setEventHovered, view, maxEvents, events, calendarsMap, Cell, CellOverflow, CellEvent, CellEventBtn, CellEventTitle, CellEventStart, }: CalendarDaygridCellProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ import{jsx as e,jsxs as i,Fragment as l}from"react/jsx-runtime";import{Fragment as r,useState as t}from"react";import{getDisplayTime as n}from"./utils";let d=l=>i("svg",{viewBox:"0 0 24 24",fill:"currentColor",stroke:"none",...l,children:[e("path",{d:"M0 0h24v24H0z"}),e("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"})]}),o={overflow:"hidden",whiteSpace:"nowrap",textOverflow:"ellipsis"};export let CalendarDaygridCell=({eventClicked:a,setEventClicked:s,setEventHovered:h,view:c,maxEvents:u,events:p,calendarsMap:v,Cell:f="div",CellOverflow:y="div",CellEvent:$="div",CellEventBtn:m="div",CellEventTitle:w="span",CellEventStart:g="span"})=>{let[x,M]=t(!1),O=p.filter(e=>!e.placeholder);return e(f,{children:p.map((t,p)=>{if(p===u&&!x)return i(y,{onClick:()=>M(!0),children:[e(d,{}),O.length-u]},"overflowMessage"+p);if(p>u&&!x)return null;if(t.placeholder)return e(r,{children:e($,{$placeholder:!0,children:e(m,{"aria-hidden":"true",style:{visibility:"hidden"},$placeholder:!0,children:e(w,{children:" "})})})},t.key);let f={zIndex:t.firstOfMulti?1:0,position:"relative",width:t.firstOfMulti?`${100*t.width}%`:"100%"};v[t.calendar.id].on||(o.display="none");let k={$view:c,$selected:a?.uid===t.uid,$past:t.isPast,$color:t.color,$isOutOfRange:t.$isOutOfRange,$isToday:t.$isToday};return e(r,{children:e($,{style:f,...k,children:e(m,{role:"button",style:o,...k,onClick:()=>s(e=>e?.uid===t.uid?null:t),onMouseEnter:()=>h(t),onMouseLeave:()=>h(null),children:t.allDay?e(w,{children:t.title}):i(l,{children:[e(g,{children:n(t.start)}),e(w,{children:t.title})]})})})},t.key)})})};
@@ -0,0 +1,27 @@
1
+ import type { KoineComponent, KoineComponentProps } from "../types";
2
+ import type { CalendarRange, CalendarView } from "./types";
3
+ export type KoineCalendarDaygridNavProps = {
4
+ locale: string;
5
+ range: CalendarRange;
6
+ view: CalendarView;
7
+ todayInView?: boolean;
8
+ handlePrev: () => any;
9
+ handleNext: () => any;
10
+ handleToday: () => any;
11
+ handleView: (view: CalendarView) => any;
12
+ };
13
+ export type CalendarDaygridNavTitleProps = {
14
+ range: CalendarRange;
15
+ formatted: string;
16
+ };
17
+ export type CalendarDaygridNavProps = KoineComponentProps<KoineCalendarDaygridNavProps, {
18
+ NavRoot?: KoineComponent;
19
+ NavTitle?: KoineComponent<CalendarDaygridNavTitleProps>;
20
+ NavBtns?: KoineComponent;
21
+ NavBtnPrev?: KoineComponent;
22
+ NavBtnNext?: KoineComponent;
23
+ NavBtnToday?: KoineComponent;
24
+ NavBtnViewMonth?: KoineComponent;
25
+ NavBtnViewWeek?: KoineComponent;
26
+ }>;
27
+ export declare let KoineCalendarDaygridNav: ({ range, view, todayInView, handlePrev, handleNext, handleToday, handleView, locale: localeCode, NavRoot, NavTitle, NavBtns, NavBtnPrev, NavBtnNext, NavBtnToday, NavBtnViewMonth, NavBtnViewWeek, }: CalendarDaygridNavProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ import{jsx as e,jsxs as t}from"react/jsx-runtime";import{format as o}from"date-fns/format";import{useDateLocale as n}from"./useDateLocale";export let KoineCalendarDaygridNav=({range:a,view:l,todayInView:r,handlePrev:i,handleNext:M,handleToday:d,handleView:y,locale:c,NavRoot:m="nav",NavTitle:s="div",NavBtns:b="div",NavBtnPrev:k="button",NavBtnNext:u="button",NavBtnToday:h="button",NavBtnViewMonth:f="button",NavBtnViewWeek:g="button"})=>{let[C,p]=a,v={locale:n(c)},x="";return"month"===l&&(x=o(C,"MMMM yyyy",v)),"week"===l&&(x=C.getMonth()===p.getMonth()?o(C,"# MMMM yyyy",v).replace("#",`${C.getDate()}-${p.getDate()}`):`${o(C,"d MMMM",v)} - ${o(p,"d MMMM yyyy",v)}`),t(m,{children:[t(b,{children:[e(k,{onClick:i}),e(u,{onClick:M}),e(h,{onClick:d,disabled:r}),e(f,{onClick:()=>y("month"),disabled:"month"===l}),e(g,{onClick:()=>y("week"),disabled:"week"===l})]}),e(s,{range:a,formatted:x})]})};
@@ -0,0 +1,25 @@
1
+ import type { KoineComponent, KoineComponentProps } from "../types";
2
+ import { type CalendarDaygridCellComponents, type CalendarDaygridCellProps } from "./CalendarDaygridCell";
3
+ import type { CalendarEventsMap, CalendarRange, CalendarView, CalendarViewDayProps } from "./types";
4
+ export type CalendarDaygridTableBodyCellProps = CalendarViewDayProps;
5
+ export type CalendarDaygridTableBodyCellDateProps = CalendarViewDayProps;
6
+ export type KoineCalendarDaygridTableProps = {
7
+ maxEvents?: CalendarDaygridCellProps["maxEvents"];
8
+ locale: string;
9
+ events: CalendarEventsMap;
10
+ handlePrev: () => any;
11
+ handleNext: () => any;
12
+ view: CalendarView;
13
+ range: CalendarRange;
14
+ dayLabels?: string[];
15
+ } & Pick<CalendarDaygridCellProps, "eventClicked" | "setEventClicked" | "eventHovered" | "setEventHovered" | "calendarsMap">;
16
+ export type CalendarDaygridTableProps = KoineComponentProps<KoineCalendarDaygridTableProps, {
17
+ Table?: KoineComponent;
18
+ TableHead?: KoineComponent;
19
+ TableHeadCell?: KoineComponent;
20
+ TableBody?: KoineComponent;
21
+ TableBodyCell?: KoineComponent<CalendarDaygridTableBodyCellProps>;
22
+ TableBodyCellDate?: KoineComponent<CalendarDaygridTableBodyCellDateProps>;
23
+ TableBodyRow?: KoineComponent;
24
+ } & CalendarDaygridCellComponents>;
25
+ export declare let KoineCalendarDaygridTable: ({ locale: localeCode, handlePrev, handleNext, events, dayLabels, view, range, eventClicked, setEventClicked, eventHovered, setEventHovered, calendarsMap, maxEvents, Table, TableHead, TableHeadCell, TableBody, TableBodyRow, TableBodyCell, TableBodyCellDate, Cell, CellOverflow, CellEvent, CellEventBtn, CellEventTitle, CellEventStart, }: CalendarDaygridTableProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ import{jsx as e,jsxs as t}from"react/jsx-runtime";import{eachWeekOfInterval as r}from"date-fns/eachWeekOfInterval";import{useEffect as a,useMemo as i,useState as l}from"react";import{useSwipeable as o}from"react-swipeable";import{CalendarDaygridCell as n}from"./CalendarDaygridCell";import{useDateLocale as m}from"./useDateLocale";import{processEventsInView as p}from"./utils";export let KoineCalendarDaygridTable=({locale:d,handlePrev:s,handleNext:c,events:h,dayLabels:f,view:b,range:u,eventClicked:v,setEventClicked:g,eventHovered:w,setEventHovered:y,calendarsMap:x={},maxEvents:j=5,Table:C="table",TableHead:D="thead",TableHeadCell:S="th",TableBody:k="tbody",TableBodyRow:z="tr",TableBodyCell:L="td",TableBodyCellDate:O="div",Cell:I,CellOverflow:K,CellEvent:M,CellEventBtn:R,CellEventTitle:T,CellEventStart:W})=>{let q={Cell:I,CellOverflow:K,CellEvent:M,CellEventBtn:R,CellEventTitle:T,CellEventStart:W},[A,B]=l(f||[0,1,2,3,4,5,6]),[E,F]=l([]),G=m(d),{month:H,weeks:J}=i(()=>(function(e){let[t,a]=e,i=r({start:t,end:a},{weekStartsOn:1});return{month:t.getMonth(),weeks:i}})(u),[u]),N=o({onSwipedLeft:c,onSwipedRight:s});return a(()=>{F(p(h,b,H,J))},[h,b,H,J]),a(()=>{G&&G.localize&&!f&&B([1,2,3,4,5,6,0].map(e=>G.localize.day(e,{width:"abbreviated"})))},[G,f]),t(C,{...N,children:[e(D,{children:e("tr",{children:A.map(t=>e(S,{scope:"column",children:t},t))})}),e(k,{children:E.map((r,a)=>e(z,{...r.props,children:r.days.map(r=>t(L,{...r.props,children:[e(O,{...r.props,children:r.label}),r.events.length>0&&e(n,{eventClicked:v,setEventClicked:g,eventHovered:w,setEventHovered:y,view:b,maxEvents:j,events:r.events,timestamp:r.timestamp,calendarsMap:x,...q})]}))}))})]})};
@@ -0,0 +1,18 @@
1
+ import type { KoineComponent, KoineComponentProps } from "../types";
2
+ import type { CalendarsMap } from "./types";
3
+ export type KoineCalendarLegendProps = {
4
+ toggleCalendarVisibility: (id: string) => void;
5
+ calendarsMap: CalendarsMap;
6
+ };
7
+ export type CalendarLegendItemProps = React.ComponentPropsWithoutRef<"div"> & {
8
+ $color: string;
9
+ $empty: boolean;
10
+ disabled: boolean;
11
+ };
12
+ export type CalendarLegendProps = KoineComponentProps<KoineCalendarLegendProps, {
13
+ LegendItem?: KoineComponent<CalendarLegendItemProps>;
14
+ LegendItemStatus?: KoineComponent;
15
+ LegendItemLabel?: KoineComponent;
16
+ LegendItemEvents?: KoineComponent;
17
+ }>;
18
+ export declare let KoineCalendarLegend: ({ calendarsMap, toggleCalendarVisibility, LegendItem, LegendItemStatus, LegendItemLabel, LegendItemEvents, }: CalendarLegendProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ import{jsx as e,jsxs as n,Fragment as r}from"react/jsx-runtime";export let KoineCalendarLegend=({calendarsMap:a={},toggleCalendarVisibility:s,LegendItem:d="div",LegendItemStatus:i="span",LegendItemLabel:l="span",LegendItemEvents:t="span"})=>e(r,{children:Object.entries(a).map(([r,a])=>n(d,{onClick:()=>s(r),$color:a.color,$empty:0===a.events,disabled:0===a.events,children:[e(i,{children:a.on?"⬤":"⭘"}),e(l,{children:a.name}),e(t,{children:a.events})]},"CalendarLegend."+r))});
@@ -0,0 +1,10 @@
1
+ import type { CalendarEventsMap, Calendars } from "./types";
2
+ type GetCalendarsEventsFromGoogleOptions = {
3
+ apiKey?: string;
4
+ start: Date;
5
+ end: Date;
6
+ timeZone?: string;
7
+ calendars: Calendars;
8
+ };
9
+ export declare let getCalendarsEventsFromGoogle: ({ calendars, ...options }: GetCalendarsEventsFromGoogleOptions) => Promise<CalendarEventsMap>;
10
+ export {};
@@ -0,0 +1 @@
1
+ import{differenceInDays as e}from"date-fns/differenceInDays";import{subDays as t}from"date-fns/subDays";import{arrayToLookup as a,isString as n,isUndefined as r}from"@koine/utils";import{addCalendarEvents as i,getEventTimestamp as s}from"./utils";export let getCalendarsEventsFromGoogle=async({calendars:e,...t})=>{let a={};return await Promise.all(e.map(async e=>{i(await o({calendar:e,...t}),a)})),a};async function o({apiKey:i,calendar:o,timeZone:m="",start:d,end:l}){let c={},u=new URLSearchParams({calendarId:o.id,timeZone:m,singleEvents:"true",maxAttendees:"1",maxResults:"9999",sanitizeHtml:"true",timeMin:d.toISOString(),timeMax:l.toISOString(),key:i||process.env.GOOGLE_CALENDAR_API_KEY||""}).toString(),f="https://www.googleapis.com/calendar/v3/calendars/"+o.id+"/events?"+u;try{let i=await fetch(f,{method:"GET"}),m=await i.json();o.name=o.name||m.summary,m.items.forEach(i=>{let m=function(i,o){let m=new Date(i.created),d=i.htmlLink,l=i.summary,c=i.status,u=new Date(i.start.date||i.start.dateTime),f=new Date(i.end.date||i.end.dateTime),w=o.color,g=r(i.end.dateTime)&&n(i.end.date),p=i.location||"",D=i.description||"",h=m.getTime()+""+u.getTime();g&&f>u&&(f=t(f,1)).setHours(23,59,59);let y=function(){let t=new Date(u),a=new Date(f),n=[s(t)];for(;e(a,t);)t.setDate(t.getDate()+1),n.push(s(t));return n}(),E=a(y),S=y.length>1;return{calendar:o,created:m,link:d,title:l,status:c,start:u,end:f,days:y,daysMap:E,multi:S,color:w,allDay:g,location:p,description:D,uid:h}}(i,o);c[m.uid]=m})}catch(e){}return c}
@@ -0,0 +1,62 @@
1
+ export type Calendar = {
2
+ id: string;
3
+ color: string;
4
+ name?: string;
5
+ };
6
+ export type Calendars = Calendar[];
7
+ export type CalendarsMap = Record<Calendar["id"], Required<Calendar> & {
8
+ on?: boolean;
9
+ events?: number;
10
+ }>;
11
+ export type CalendarRange = [Date, Date];
12
+ export type CalendarView = "month" | "week";
13
+ export type CalendarEvent = {
14
+ calendar: Calendar;
15
+ days: number[];
16
+ daysMap: Record<number, 1>;
17
+ multi: boolean;
18
+ allDay: boolean;
19
+ link: string;
20
+ title: string;
21
+ status: string;
22
+ created: Date;
23
+ start: Date;
24
+ end: Date;
25
+ color: string;
26
+ location: string;
27
+ description: string;
28
+ uid: string;
29
+ };
30
+ export type CalendarEventsByTimestamp = Record<number, CalendarEventsMap>;
31
+ export type CalendarEventsMap = Record<CalendarEvent["uid"], CalendarEvent>;
32
+ export type CalendarViewWeeks = CalendarViewWeek[];
33
+ export type CalendarViewWeek = {
34
+ props: {
35
+ key: string;
36
+ };
37
+ days: CalendarViewDay[];
38
+ };
39
+ export type CalendarViewDay = {
40
+ props: {
41
+ key: string;
42
+ } & CalendarViewDayProps;
43
+ label: string;
44
+ timestamp: string;
45
+ events: CalendarViewEvent[];
46
+ };
47
+ export type CalendarViewDayProps = {
48
+ $isToday?: boolean;
49
+ $isOutOfRange?: boolean;
50
+ };
51
+ export type CalendarViewEvent = {
52
+ key: string;
53
+ placeholder: true;
54
+ top: number;
55
+ } | (CalendarEvent & CalendarViewDayProps & {
56
+ key: string;
57
+ placeholder?: false;
58
+ top: number;
59
+ width: number;
60
+ firstOfMulti?: boolean;
61
+ isPast?: boolean;
62
+ });
@@ -0,0 +1 @@
1
+ export{};
@@ -0,0 +1,35 @@
1
+ import type { KoineCalendarDaygridNavProps } from "./CalendarDaygridNav";
2
+ import type { KoineCalendarDaygridTableProps } from "./CalendarDaygridTable";
3
+ import type { KoineCalendarLegendProps } from "./CalendarLegend";
4
+ import type { CalendarEvent, CalendarEventsMap, CalendarView, Calendars } from "./types";
5
+ export type UseCalendarProps = {
6
+ locale: string;
7
+ calendars: Calendars;
8
+ apiKey?: string;
9
+ events?: CalendarEventsMap;
10
+ start?: Date;
11
+ end?: Date;
12
+ view?: CalendarView;
13
+ timeZone?: string;
14
+ onError?: (e: any) => void;
15
+ };
16
+ export type UseCalendarReturn = ReturnType<typeof useCalendar>;
17
+ export type CalendarsUpdateActionEvents = {
18
+ type: "events";
19
+ payload: Record<string, number>;
20
+ };
21
+ export type CalendarsUpdateActionVisibility = {
22
+ type: "visibility";
23
+ payload: string | string[];
24
+ };
25
+ export type CalendarsUpdateAction = CalendarsUpdateActionEvents | CalendarsUpdateActionVisibility;
26
+ export declare let useCalendar: ({ locale, apiKey, calendars, events: initialEvents, start: initialStart, end: initialEnd, view: initialView, timeZone, onError, }: UseCalendarProps) => {
27
+ view: "month" | "week";
28
+ eventClicked: CalendarEvent | null;
29
+ setEventClicked: import("react").Dispatch<import("react").SetStateAction<CalendarEvent | null>>;
30
+ eventHovered: CalendarEvent | null;
31
+ setEventHovered: import("react").Dispatch<import("react").SetStateAction<CalendarEvent | null>>;
32
+ getDaygridNavProps: () => KoineCalendarDaygridNavProps;
33
+ getDaygridTableProps: () => KoineCalendarDaygridTableProps;
34
+ getLegendProps: () => KoineCalendarLegendProps;
35
+ };
@@ -0,0 +1 @@
1
+ import{useCallback as e,useEffect as t,useReducer as l,useState as n}from"react";import{getCalendarsEventsFromGoogle as r}from"./calendar-api-google";import{getEndDate as a,getNextDate as i,getPrevDate as u,getStartDate as o,isTodayInView as s}from"./utils";export let useCalendar=({locale:d,apiKey:c,calendars:p,events:g,start:m,end:y,view:v="month",timeZone:f="",onError:b})=>{let[w,T]=n(v),D=m||o(new Date,w),h=y||a(D,w),[O,P]=n([D,h]),[j,x]=n(s(D,h)),[C,L]=n(g||{}),[N,k]=n(null),[q,z]=n(null),[A,B]=l((e,t)=>{let{type:l}=t;switch(l){case"events":{let l=t.payload;return Object.entries(e).reduce((e,[t,n])=>(e[t]={...n,events:l[t]||0},e),{})}case"visibility":{let l=t.payload;if("string"==typeof l)return{...e,[l]:{...e[l],on:!e[l].on}};return Object.entries(e).reduce((e,[t,n])=>(e[t]={...n,on:l.indexOf(t)>-1},e),{})}default:return e}},p.reduce((e,t)=>(e[t.id]={...t,name:t.name||"",on:!0,events:0},e),{})),E=e(e=>{B({type:"visibility",payload:e})},[B]),F=e(e=>{let t={};for(let l in e){let{id:n}=e[l].calendar;t[n]=t[n]||0,t[n]++}B({type:"events",payload:t})},[]),G=e(async(e,t,l)=>{try{let n=await r({apiKey:c,calendars:e,timeZone:f,start:t,end:l});L(n)}catch(e){b&&b(e)}},[L,c,f,b]),H=e(()=>{let[e,t]=O,l=o(new Date,w),n=a(l,w);P([l,n]),(e.getTime()!==l.getTime()||t.getTime()!==n.getTime())&&(z(null),k(null))},[w,O]),I=e(()=>{P(([e])=>{let t=u(e,w),l=a(t,w);return[t,l]}),z(null),k(null)},[w]),J=e(()=>{P(([e])=>{let t=i(e,w),l=a(t,w);return[t,l]}),z(null),k(null)},[w]),K=e(e=>{let t=o(D,e),l=a(t,e);P([t,l]),T(e),z(null),k(null)},[D]);return t(()=>{let[e,t]=O;G(p,e,t),x(s(e,t))},[O]),t(()=>{C&&F(C)},[C,F]),t(()=>{q&&!A[q.calendar.id].on&&z(null)},[A,q,z]),{view:w,eventClicked:q,setEventClicked:z,eventHovered:N,setEventHovered:k,getDaygridNavProps:()=>({locale:d,handlePrev:I,handleNext:J,handleToday:H,handleView:K,todayInView:j,range:O,view:w}),getDaygridTableProps:()=>({locale:d,events:C,eventClicked:q,setEventClicked:z,eventHovered:N,setEventHovered:k,handlePrev:I,handleNext:J,calendarsMap:A,range:O,view:w}),getLegendProps:()=>({calendarsMap:A,toggleCalendarVisibility:E})}};
@@ -0,0 +1,2 @@
1
+ import type { Locale } from "date-fns";
2
+ export declare let useDateLocale: (locale?: string, defaultLocale?: string) => Locale | undefined;
@@ -0,0 +1 @@
1
+ import{useEffect as e,useState as t}from"react";export let useDateLocale=(a,l="en")=>{let[r,n]=t(),[o,c]=t(l);return e(()=>{let e=async()=>{let e=await import("date-fns/locale/en-US");c(a||o),n(e.enUS)};a!==o&&e()},[a,o]),r};
@@ -0,0 +1,11 @@
1
+ import type { CalendarEventsMap, CalendarView, CalendarViewWeeks } from "./types";
2
+ export declare let getEventTimestamp: (dateLike: number | Date | string) => number;
3
+ export declare let getDisplayTime: (date: Date) => string;
4
+ export declare let getStartDate: (date: Date, view: CalendarView) => Date;
5
+ export declare let getEndDate: (start: Date, view: CalendarView) => Date;
6
+ export declare let getPrevDate: (date: Date, view: CalendarView) => Date;
7
+ export declare let getNextDate: (date: Date, view: CalendarView) => Date;
8
+ export declare let isTodayInView: (start: Date, end: Date) => boolean;
9
+ export declare let mergeCalendarEvents: (first: CalendarEventsMap, second: CalendarEventsMap) => CalendarEventsMap;
10
+ export declare let addCalendarEvents: (toAdd: CalendarEventsMap, toExtend: CalendarEventsMap) => CalendarEventsMap;
11
+ export declare let processEventsInView: (eventsMap: CalendarEventsMap, calendarView: CalendarView, month: number, weeks: Date[]) => CalendarViewWeeks;
@@ -0,0 +1 @@
1
+ import{addDays as e}from"date-fns/addDays";import{addMonths as t}from"date-fns/addMonths";import{addWeeks as r}from"date-fns/addWeeks";import{endOfMonth as a}from"date-fns/endOfMonth";import{endOfWeek as n}from"date-fns/endOfWeek";import{isWithinInterval as s}from"date-fns/isWithinInterval";import{startOfWeek as o}from"date-fns/startOfWeek";import{subMonths as l}from"date-fns/subMonths";import{subWeeks as m}from"date-fns/subWeeks";export let getEventTimestamp=e=>{let t=new Date(e);return t.setHours(0,0,0,0),t.valueOf()/1e3};export let getDisplayTime=e=>e.getHours()+":"+"0".repeat(2-e.getMinutes().toString().length)+e.getMinutes();export let getStartDate=(e,t)=>(e.setHours(0,0,0),"month"===t?e.setDate(1):"week"===t&&(e=o(e,{weekStartsOn:1})),e);export let getEndDate=(e,t)=>{let r=e;return"month"===t?r=a(e):"week"===t&&(r=n(e,{weekStartsOn:1})),r.setHours(23,59,59),r};export let getPrevDate=(e,t)=>"month"===t?l(e,1):m(e,1);export let getNextDate=(e,a)=>"month"===a?t(e,1):r(e,1);export let isTodayInView=(e,t)=>s(new Date,{start:e,end:t});export let mergeCalendarEvents=(e,t)=>{let r={};return addCalendarEvents(e,r),addCalendarEvents(t,r),r};export let addCalendarEvents=(e,t)=>{for(let r in e){let a=e[r];t[r]=a}return t};let i=e=>{let t={};for(let r in e){let a=e[r];a.days.forEach(e=>{t[e]=t[e]||{},t[e][r]=a})}return t},d=e=>{let t=[];for(let r in e)t.push(e[r]);return t.sort((e,t)=>{let r=Number(t.multi)-Number(e.multi),a=Number(t.allDay)-Number(e.allDay),n=e.start.getTime()-t.start.getTime(),s=e.created.getTime()-t.created.getTime();return r||a||n||s}),t};export let processEventsInView=(t,r,a,n)=>{let s=i(t),o=d(t),l=new Date,m=getEventTimestamp(l),p={},f=[];for(let t=0;t<n.length;t++){let i={props:{key:`week.${t}`},days:[]},d=n[t],u=d.getDate(),g=getEventTimestamp(new Date(d)),h=getEventTimestamp(e(new Date(d),6));for(let e=0;e<7;e++){let t=new Date(new Date(d).setDate(u+e)),n=getEventTimestamp(t),f={$isToday:m===n,$isOutOfRange:"month"===r&&t.getMonth()!==a},v={props:{key:`day.${n}`,...f},timestamp:n+"",label:t.getDate()+"",events:[]};if(s?.[n]){let t=Object.keys(s[n]).map(()=>0);for(let r=0;r<o.length;r++){let a;let s=o[r],m=1,i=0;if(s.daysMap[n]){if(s.multi&&(m=s.days.filter(e=>e>=g&&e<=h).length,(0===s.days.indexOf(n)||0===e)&&(a=!0)),p[s.uid])i=p[s.uid];else for(let e=0;e<t.length;e++)if(1!==t[e]){i=e;break}t[i]=1,a&&(p[s.uid]=i),v.events.push({key:`event.${n}-${i}`,...f,...s,isPast:l>s.end,firstOfMulti:a,top:i,width:m})}}for(let e=0;e<t.length;e++)1!==t[e]&&v.events.push({key:`event.${n}-${e}}`,placeholder:!0,top:e});v.events.sort((e,t)=>e.top-t.top)}i.days.push(v)}f.push(i)}return f};
@@ -0,0 +1,7 @@
1
+ export * from "./calendar/CalendarDaygridCell";
2
+ export * from "./calendar/CalendarDaygridNav";
3
+ export * from "./calendar/CalendarDaygridTable";
4
+ export * from "./calendar/CalendarLegend";
5
+ export * from "./calendar/useCalendar";
6
+ export * from "./calendar/useDateLocale";
7
+ export * from "./calendar/types";
@@ -0,0 +1 @@
1
+ export*from"./calendar/CalendarDaygridCell";export*from"./calendar/CalendarDaygridNav";export*from"./calendar/CalendarDaygridTable";export*from"./calendar/CalendarLegend";export*from"./calendar/useCalendar";export*from"./calendar/useDateLocale";export*from"./calendar/types";
@@ -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: ((props: Props) => string)[] | string[]) => React.ForwardRefExoticComponent<React.PropsWithoutRef<ClassedFinalProps<Props, Component>> & React.RefAttributes<Component>>;
8
- export {};
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>>;
8
+ export default classed;
package/cjs/classed.js ADDED
@@ -0,0 +1 @@
1
+ import{createElement as t,forwardRef as e}from"react";export let classed=r=>{let s=r.type||r;return function(r,...a){return e(function(e,n){let o=a.map((t,s)=>{let a="";return"function"==typeof t?a=t(e):void 0!==t&&(a=t.toString()),r[s]+a}).join(""),l="string"==typeof s,i=l?{}:e;if(l)for(let t in e)t.startsWith("$")||(i[t]=e[t]);let c=o||r[0];return c=(c.match(/class="([^"]*)/)?.[1]||c)+(e?.className?" "+e?.className:""),t(s,{...i,className:c||void 0,ref:n})})}};export default classed;
@@ -3,4 +3,4 @@ type _MediaQuerWidthDefExplicit<TBreakpoint extends string> = `min-${TBreakpoint
3
3
  export type MediaQuerWidthDef<TBreakpoint extends string> = `${TBreakpoint}` | _MediaQuerWidthDefExplicit<TBreakpoint>;
4
4
  export type MediaQueryWidth<TBreakpoint extends string> = `@${MediaQuerWidthDef<TBreakpoint>}`;
5
5
  export declare let createUseMediaQueryWidth: <TBreakpointsConfig extends GetMediaQueryWidthResolversBreakpoints>(customBreakpoints: TBreakpointsConfig) => <TBreakpoints extends Extract<keyof TBreakpointsConfig, string>>(media: `@${TBreakpoints}` | `@min-${TBreakpoints}` | `@max-${TBreakpoints}` | `@up-${TBreakpoints}` | `@down-${TBreakpoints}` | `@between-${TBreakpoints}_${TBreakpoints}` | `@only-${TBreakpoints}`, serverValue?: null | boolean) => boolean | null;
6
- export {};
6
+ export default createUseMediaQueryWidth;
@@ -0,0 +1 @@
1
+ import{useState as e}from"react";import{getMediaQueryWidthResolvers as t,isUndefined as r}from"@koine/utils";import{useIsomorphicLayoutEffect as i}from"./useIsomorphicLayoutEffect";export let createUseMediaQueryWidth=n=>{let a=t(n);return function(t,n){let[o,s]=t.substring(1).split("-");r(s)&&(s=o),r(o)&&(o="min");let[d,m]=s.split("_"),u=a[o](d,m),[c,l]=e(r(n)?null:n);return i(()=>{let e=window.matchMedia(u),t=e=>{l(e.matches)};return(l(e.matches),e.addEventListener)?(e.addEventListener("change",t),()=>{e.removeEventListener("change",t)}):(e.addListener(t),()=>{e.removeListener(t)})},[u]),c}};export default createUseMediaQueryWidth;
@@ -13,4 +13,4 @@ export type WithComponents<Props, Components extends OverridableComponents> = Pr
13
13
  [Name in keyof Components]: NonNullable<Components[Name]["type"] extends keyof JSX.IntrinsicElements ? React.ElementType<Components[Name]["motionable"] extends true ? Omit<React.ComponentPropsWithoutRef<Components[Name]["type"]>, HtmlAttributesCollidingWithMotionProps> & Components[Name]["props"] : React.ComponentPropsWithoutRef<Components[Name]["type"]> & Components[Name]["props"]> : Components[Name]["type"]>;
14
14
  };
15
15
  type HtmlAttributesCollidingWithMotionProps = "style" | "onDrag" | "onDragStart" | "onDragEnd" | "onAnimationStart" | "onAnimationEnd";
16
- export {};
16
+ export default extendComponent;
@@ -0,0 +1 @@
1
+ import{createElement as e}from"react";export let extendComponent=(t,o)=>Object.assign(o=>e(t,o),{...o,defaultProps:o});export default extendComponent;
@@ -0,0 +1,27 @@
1
+ import { type ObjectShape } from "@kuus/yup";
2
+ export declare let encodeForm: <T extends ObjectShape = {}>(validationRules: T) => {
3
+ encodedSchema: import("@kuus/yup").ObjectSchema<{
4
+ [x: string]: T[keyof T] extends import("@kuus/yup").ISchema<any, any, any, any> ? T[keyof T]["__outputType"] : T[keyof T] extends {
5
+ readonly key: string;
6
+ readonly isContext: boolean;
7
+ readonly isValue: boolean;
8
+ readonly isSibling: boolean;
9
+ readonly path: any;
10
+ readonly getter: (data: unknown) => unknown;
11
+ readonly map?: ((value: unknown) => infer T_1) | undefined;
12
+ readonly __isYupRef: boolean;
13
+ getValue(value: any, parent?: {} | undefined, context?: {} | undefined): infer T_1;
14
+ cast(value: any, options?: {
15
+ parent?: {} | undefined;
16
+ context?: {} | undefined;
17
+ } | undefined): infer T_1;
18
+ resolve(): any;
19
+ describe(): import("@kuus/yup").SchemaRefDescription;
20
+ toString(): string;
21
+ } ? T_1 : unknown;
22
+ }, import("@kuus/yup").AnyObject, {
23
+ [x: string]: T[keyof T] extends import("@kuus/yup").ISchema<any, import("@kuus/yup").AnyObject, any, any> ? T[keyof T]["__default"] : undefined;
24
+ }, "">;
25
+ encodedNames: Record<keyof T, string>;
26
+ };
27
+ export declare let decodeForm: <ReturnAs extends Record<string, unknown> = {}, FormData_1 extends Record<string, unknown> = {}>(formData: FormData_1) => ReturnAs;
@@ -0,0 +1 @@
1
+ import{object as e}from"@kuus/yup";import{decode as t,encode as r,isUndefined as o}from"@koine/utils";export let encodeForm=t=>{let o={},i={};for(let e in t)if(!e.startsWith("_")){let l=r(e);o[l]=t[e],i[e]=l}return{encodedSchema:e(o).required(),encodedNames:i}};export let decodeForm=e=>{let r={};for(let i in e){let l=t(i);i.startsWith("_")?r[i.substring(1)]=e[i]:o(e[i])||""!==e[l]||(r[l]=e[i])}return r};
package/cjs/forms.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "./forms/antispam";
package/cjs/forms.js ADDED
@@ -0,0 +1 @@
1
+ export*from"./forms/antispam";
@@ -1,3 +1,11 @@
1
+ export { classed } from "./classed";
2
+ export { createUseMediaQueryWidth, type MediaQuerWidthDef, type MediaQueryWidth, } from "./createUseMediaQueryWidth";
3
+ export { type ExtendableComponent, type OverridableComponents, type WithComponents, extendComponent, } from "./extendComponent";
4
+ export { FaviconTags, type FaviconTagsProps } from "./FaviconTags";
5
+ export { mergeRefs } from "./mergeRefs";
6
+ export { Meta, type MetaProps } from "./Meta";
7
+ export { NoJs, type NoJsProps } from "./NoJs";
8
+ export type { Polymorphic } from "./Polymorphic";
1
9
  export { useAsyncFn, type UseAsyncFnReturn, type UseAsyncState, } from "./useAsyncFn";
2
10
  export { useFirstMountState } from "./useFirstMountState";
3
11
  export { useFixedOffset } from "./useFixedOffset";
@@ -17,3 +25,4 @@ export { useSpinDelay } from "./useSpinDelay";
17
25
  export { useTraceUpdate } from "./useTraceUpdate";
18
26
  export { useUpdateEffect } from "./useUpdateEffect";
19
27
  export { useWindowSize } from "./useWindowSize";
28
+ export type { KoineComponentProps, KoineComponent } from "./types";
package/cjs/index.js ADDED
@@ -0,0 +1 @@
1
+ export{classed}from"./classed";export{createUseMediaQueryWidth}from"./createUseMediaQueryWidth";export{extendComponent}from"./extendComponent";export{FaviconTags}from"./FaviconTags";export{mergeRefs}from"./mergeRefs";export{Meta}from"./Meta";export{NoJs}from"./NoJs";export{useAsyncFn}from"./useAsyncFn";export{useFirstMountState}from"./useFirstMountState";export{useFixedOffset}from"./useFixedOffset";export{useFocus}from"./useFocus";export{useInterval}from"./useInterval";export{useIsomorphicLayoutEffect}from"./useIsomorphicLayoutEffect";export{useKeyUp}from"./useKeyUp";export{useMeasure}from"./useMeasure";export{useMountedState}from"./useMountedState";export{useNavigateAway}from"./useNavigateAway";export{usePrevious}from"./usePrevious";export{usePreviousRef}from"./usePreviousRef";export{useScrollPosition}from"./useScrollPosition";export{useScrollThreshold}from"./useScrollThreshold";export{useSmoothScroll}from"./useSmoothScroll";export{useSpinDelay}from"./useSpinDelay";export{useTraceUpdate}from"./useTraceUpdate";export{useUpdateEffect}from"./useUpdateEffect";export{useWindowSize}from"./useWindowSize";
@@ -1 +1,2 @@
1
1
  export declare let mergeRefs: <T = Element>(refs: (import("react").MutableRefObject<T> | import("react").LegacyRef<T>)[]) => (instance: T | null) => void;
2
+ export default mergeRefs;
@@ -0,0 +1 @@
1
+ export let mergeRefs=e=>r=>{e.forEach(e=>{"function"==typeof e?e(r):null!=e&&(e.current=r)})};export default mergeRefs;
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@koine/react",
3
+ "sideEffects": false,
4
+ "dependencies": {
5
+ "@koine/dom": "*",
6
+ "@koine/utils": "*"
7
+ },
8
+ "peerDependencies": {
9
+ "@kuus/yup": "1.0.0-beta.7",
10
+ "date-fns": "^3.2.0",
11
+ "react": "^18.2.0",
12
+ "react-swipeable": "^7.0.1"
13
+ },
14
+ "peerDependenciesMeta": {
15
+ "@kuus/yup": {
16
+ "optional": true
17
+ },
18
+ "date-fns": {
19
+ "optional": true
20
+ },
21
+ "react-swipeable": {
22
+ "optional": true
23
+ },
24
+ "tailwindcss": {
25
+ "optional": true
26
+ }
27
+ },
28
+ "module": "./index.js",
29
+ "type": "module",
30
+ "main": "./index.js"
31
+ }
package/cjs/types.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export type KoineComponentProps<BaseComponentProps, ExtendableProps> = BaseComponentProps & ExtendableProps;
2
+ export type KoineComponent<Props = any> = string | React.ForwardRefExoticComponent<Props> | React.ExoticComponent<Props> | React.FC<Props> | ((props: Props) => JSX.Element);
package/cjs/types.js ADDED
@@ -0,0 +1 @@
1
+ export{};
@@ -21,4 +21,4 @@ export type UseAsyncState<T> = {
21
21
  type StateFromFunctionReturningPromise<T extends FunctionReturningPromise> = UseAsyncState<PromiseType<ReturnType<T>>>;
22
22
  export type UseAsyncFnReturn<T extends FunctionReturningPromise = FunctionReturningPromise> = [StateFromFunctionReturningPromise<T>, T];
23
23
  export declare let useAsyncFn: <T extends FunctionReturningPromise>(fn: T, deps?: React.DependencyList, initialState?: StateFromFunctionReturningPromise<T>) => UseAsyncFnReturn<T>;
24
- export {};
24
+ export default useAsyncFn;
@@ -0,0 +1 @@
1
+ import{useCallback as e,useRef as t,useState as r}from"react";import{useMountedState as n}from"./useMountedState";export let useAsyncFn=(o,u=[],l={loading:!1})=>{let a=t(0),d=n(),[i,c]=r(l),g=e((...e)=>{let t=++a.current;return i.loading||c(e=>({...e,loading:!0})),o(...e).then(e=>(d()&&t===a.current&&c({value:e,loading:!1}),e),e=>(d()&&t===a.current&&c({error:e,loading:!1}),e))},u);return[i,g]};export default useAsyncFn;
@@ -1 +1,2 @@
1
1
  export declare let useFirstMountState: () => boolean;
2
+ export default useFirstMountState;
@@ -0,0 +1 @@
1
+ import{useRef as t}from"react";export let useFirstMountState=()=>{let r=t(!0);return r.current?(r.current=!1,!0):r.current};export default useFirstMountState;
@@ -1 +1,2 @@
1
1
  export declare let useFixedOffset: (selector?: string) => import("react").MutableRefObject<number>;
2
+ export default useFixedOffset;
@@ -0,0 +1 @@
1
+ import{useRef as e}from"react";import{debounce as t}from"@koine/utils";import{$each as r,calculateFixedOffset as o,injectCss as i,listenResizeDebounced as f}from"@koine/dom";import{useIsomorphicLayoutEffect as s}from"./useIsomorphicLayoutEffect";let n=e=>{i("useFixedOffset",`html{scroll-padding-top: ${e}px}`)};export let useFixedOffset=i=>{let l=e(0);return s(()=>{let e=()=>{let e=o();l.current=e,n(e)};if(e(),!ResizeObserver)return f(0,e);{let e=new ResizeObserver(e=>{let r=0;e.forEach(e=>{r+=e.contentRect.height}),l.current=r,t(()=>n(r),400,!0)()});return r(i||"[data-fixed]",t=>{e&&e.observe(t)}),()=>{e?.disconnect()}}},[i]),l};export default useFixedOffset;
@@ -1 +1,2 @@
1
1
  export declare let useFocus: () => (import("react").RefObject<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement> | (() => void))[];
2
+ export default useFocus;
@@ -0,0 +1 @@
1
+ import{useRef as e}from"react";export let useFocus=()=>{let r=e(null);return[r,()=>{r.current&&r.current.focus()}]};export default useFocus;
@@ -1 +1,2 @@
1
1
  export declare let useInterval: <T extends () => unknown>(callback: T, delay: number, deps?: unknown[]) => void;
2
+ export default useInterval;
@@ -0,0 +1 @@
1
+ import{useEffect as r,useRef as e}from"react";import{noop as t}from"@koine/utils";export let useInterval=(n,l,u=[])=>{let o=e();r(()=>{o.current=n},[n,...u]),r(()=>{if(null!==l){let r=setInterval(function(){o.current&&o.current()},l);return()=>clearInterval(r)}return t},[l])};export default useInterval;
@@ -0,0 +1,3 @@
1
+ import { useEffect } from "react";
2
+ export declare let useIsomorphicLayoutEffect: typeof useEffect;
3
+ export default useIsomorphicLayoutEffect;
@@ -0,0 +1 @@
1
+ import{useEffect as o,useLayoutEffect as t}from"react";import{isBrowser as e}from"@koine/utils";export let useIsomorphicLayoutEffect=e?t:o;export default useIsomorphicLayoutEffect;
@@ -1 +1,2 @@
1
1
  export declare let useKeyUp: (callback: (event: KeyboardEvent) => void, deps?: unknown[]) => void;
2
+ export default useKeyUp;
@@ -0,0 +1 @@
1
+ import{useEffect as e}from"react";import{on as t}from"@koine/dom";export let useKeyUp=(o,r=[])=>{e(()=>t(window,"keyup",e=>{e.ctrlKey||e.altKey||e.shiftKey||e.metaKey||o(e)}),[o,...r])};export default useKeyUp;
@@ -19,4 +19,4 @@ export type UseMeasureReturn = [
19
19
  () => void
20
20
  ];
21
21
  export declare let useMeasure: (options?: UseMeasureOptions) => UseMeasureReturn;
22
- export {};
22
+ export default useMeasure;
@@ -0,0 +1 @@
1
+ let e;import{useEffect as t,useMemo as r,useRef as n,useState as u}from"react";import{debounce as l,noop as o}from"@koine/utils";import{listenResizeDebounced as c,listenScrollDebounced as i,off as s,on as f}from"@koine/dom";let m=e=>{let t=[];if(!e||e===document.body)return t;let{overflow:r,overflowX:n,overflowY:u}=window.getComputedStyle(e);return[r,n,u].some(e=>"auto"===e||"scroll"===e)&&t.push(e),[...t,...m(e.parentElement)]},p=["x","y","top","bottom","left","right","width","height"],d=(e,t)=>p.every(r=>e[r]===t[r]);export let useMeasure=p=>{let{scroll:h=!1}=p||{},[a,b]=u({left:0,top:0,width:0,height:0,bottom:0,right:0,x:0,y:0}),g=n([null,null,null,a]),v=n(!1);t(()=>(v.current=!0,()=>void(v.current=!1)),[]);let[w,,y]=r(()=>{let e=(...e)=>{let[t,,,r]=g.current;if(!t)return;let n=t.getBoundingClientRect();Object.freeze(n),v.current&&!d(r,n)&&(g.current[3]=n,b(n))},t=l(e);return[e,t,t]},[b]);function x(){let[,e,t]=g.current;e&&(e.forEach(e=>s(e,"scroll",y)),g.current[1]=null),t&&(t.disconnect(),g.current[2]=null)}function z(){let[t,r]=g.current;t&&!e&&ResizeObserver&&(e=new ResizeObserver(y),g.current[2]=e,e.observe(t),h&&r&&r.forEach(e=>f(e,"scroll",y,{capture:!0,passive:!0})))}return t(()=>h?i(0,w,100):o,[h,w]),t(()=>c(0,w,100),[w]),t(()=>{x(),z()},[h]),t(()=>(w(),x),[]),[e=>{e&&e!==g.current[0]&&(x(),g.current[0]=e,g.current[1]=m(e),z())},a,w]};export default useMeasure;
@@ -1 +1,2 @@
1
1
  export declare let useMountedState: () => (() => boolean);
2
+ export default useMountedState;
@@ -0,0 +1 @@
1
+ import{useCallback as t,useEffect as e,useRef as r}from"react";export let useMountedState=()=>{let u=r(!1),n=t(()=>u.current,[]);return e(()=>(u.current=!0,()=>{u.current=!1}),[]),n};export default useMountedState;
@@ -1,2 +1,3 @@
1
1
  export type UseNavigateAwayHandler = (event: BeforeUnloadEvent) => string | boolean;
2
2
  export declare let useNavigateAway: (handler: UseNavigateAwayHandler) => void;
3
+ export default useNavigateAway;
@@ -0,0 +1 @@
1
+ import{useEffect as e,useRef as t}from"react";import{on as r}from"@koine/dom";export let useNavigateAway=a=>{let o=t();e(()=>{o.current=e=>{let t=a(e);return(t&&e.preventDefault(),"string"==typeof t)?e.returnValue=t:e.defaultPrevented?e.returnValue="":void 0}},[a]),e(()=>r(window,"beforeunload",e=>o.current?.(e)),[])};export default useNavigateAway;
@@ -1 +1,2 @@
1
1
  export declare let usePrevious: <T extends unknown>(state: T, defaulValue: T) => T;
2
+ export default usePrevious;
@@ -0,0 +1 @@
1
+ import{useState as e}from"react";export let usePrevious=(r,t)=>{let[o,u]=e([r,t]);return o[1]!==r&&u([o[1],r]),o[0]};export default usePrevious;
@@ -1 +1,2 @@
1
1
  export declare let usePreviousRef: <T extends unknown>(value: T) => T | undefined;
2
+ export default usePreviousRef;
@@ -0,0 +1 @@
1
+ import{useEffect as e,useRef as r}from"react";export let usePreviousRef=t=>{let u=r();return e(()=>{u.current=t}),u.current};export default usePreviousRef;
@@ -10,3 +10,4 @@ export declare let useReveal: <T extends HTMLElement = HTMLDivElement>({ directi
10
10
  endY: number;
11
11
  startX: number;
12
12
  };
13
+ export default useReveal;
@@ -0,0 +1 @@
1
+ import{useEffect as e,useRef as t,useState as l}from"react";export let useReveal=({direction:n="left",offsetStartY:o=-2,offsetEndY:r=0,offsetStartX:u="all"})=>{let c=t(null),[i,d]=l(0),[f,m]=l(0),[a,g]=l(0);return e(()=>{let e;if(!c.current)return;let t=c.current.getBoundingClientRect(),l=window.scrollY||document.documentElement.scrollTop,i=t.height,f=t.top+l,a=o?i*o:0,h=r?i*r:a,p=(f+a)/document.body.clientHeight,s=(f+i+h)/document.body.clientHeight;"all"===u?e="left"===n?-t.right:t.left:(e=t.width*u,e="left"===n?-e:e),d(p),m(s),g(e)},[d,m,g,o,r,u,n]),{ref:c,startY:i,endY:f,startX:a}};export default useReveal;