@koine/react 2.0.0-beta.75 → 2.0.0-beta.77
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.
- package/FaviconTags.js +1 -5
- package/Meta.js +1 -5
- package/NoJs.js +1 -7
- package/Polymorphic.js +1 -1
- package/calendar/CalendarDaygridCell.js +1 -42
- package/calendar/CalendarDaygridNav.js +1 -22
- package/calendar/CalendarDaygridTable.js +1 -50
- package/calendar/CalendarLegend.js +1 -4
- package/calendar/calendar-api-google.js +1 -90
- package/calendar/types.js +1 -1
- package/calendar/useCalendar.js +1 -175
- package/calendar/useDateLocale.js +1 -16
- package/calendar/utils.js +1 -172
- package/calendar.js +1 -7
- package/{components → cjs}/FaviconTags.d.ts +1 -0
- package/cjs/FaviconTags.js +1 -0
- package/{components → cjs}/Meta.d.ts +1 -0
- package/cjs/Meta.js +1 -0
- package/{components → cjs}/NoJs.d.ts +1 -0
- package/cjs/NoJs.js +1 -0
- package/cjs/Polymorphic.js +1 -0
- package/cjs/calendar/CalendarDaygridCell.d.ts +35 -0
- package/cjs/calendar/CalendarDaygridCell.js +1 -0
- package/cjs/calendar/CalendarDaygridNav.d.ts +27 -0
- package/cjs/calendar/CalendarDaygridNav.js +1 -0
- package/cjs/calendar/CalendarDaygridTable.d.ts +25 -0
- package/cjs/calendar/CalendarDaygridTable.js +1 -0
- package/cjs/calendar/CalendarLegend.d.ts +18 -0
- package/cjs/calendar/CalendarLegend.js +1 -0
- package/cjs/calendar/calendar-api-google.d.ts +10 -0
- package/cjs/calendar/calendar-api-google.js +1 -0
- package/cjs/calendar/types.d.ts +62 -0
- package/cjs/calendar/types.js +1 -0
- package/cjs/calendar/useCalendar.d.ts +35 -0
- package/cjs/calendar/useCalendar.js +1 -0
- package/cjs/calendar/useDateLocale.d.ts +2 -0
- package/cjs/calendar/useDateLocale.js +1 -0
- package/cjs/calendar/utils.d.ts +11 -0
- package/cjs/calendar/utils.js +1 -0
- package/cjs/calendar.d.ts +7 -0
- package/cjs/calendar.js +1 -0
- package/{utils → cjs}/classed.d.ts +2 -2
- package/cjs/classed.js +1 -0
- package/{utils → cjs}/createUseMediaQueryWidth.d.ts +1 -1
- package/cjs/createUseMediaQueryWidth.js +1 -0
- package/{utils → cjs}/extendComponent.d.ts +1 -1
- package/cjs/extendComponent.js +1 -0
- package/cjs/forms/antispam.d.ts +27 -0
- package/cjs/forms/antispam.js +1 -0
- package/cjs/forms.d.ts +1 -0
- package/cjs/forms.js +1 -0
- package/{hooks → cjs}/index.d.ts +9 -0
- package/cjs/index.js +1 -0
- package/{utils → cjs}/mergeRefs.d.ts +1 -0
- package/cjs/mergeRefs.js +1 -0
- package/cjs/package.json +31 -0
- package/cjs/types.d.ts +2 -0
- package/cjs/types.js +1 -0
- package/{hooks → cjs}/useAsyncFn.d.ts +1 -1
- package/cjs/useAsyncFn.js +1 -0
- package/{hooks → cjs}/useFirstMountState.d.ts +1 -0
- package/cjs/useFirstMountState.js +1 -0
- package/{hooks → cjs}/useFixedOffset.d.ts +1 -0
- package/cjs/useFixedOffset.js +1 -0
- package/{hooks → cjs}/useFocus.d.ts +1 -0
- package/cjs/useFocus.js +1 -0
- package/{hooks → cjs}/useInterval.d.ts +1 -0
- package/cjs/useInterval.js +1 -0
- package/cjs/useIsomorphicLayoutEffect.d.ts +3 -0
- package/cjs/useIsomorphicLayoutEffect.js +1 -0
- package/{hooks → cjs}/useKeyUp.d.ts +1 -0
- package/cjs/useKeyUp.js +1 -0
- package/{hooks → cjs}/useMeasure.d.ts +1 -1
- package/cjs/useMeasure.js +1 -0
- package/{hooks → cjs}/useMountedState.d.ts +1 -0
- package/cjs/useMountedState.js +1 -0
- package/{hooks → cjs}/useNavigateAway.d.ts +1 -0
- package/cjs/useNavigateAway.js +1 -0
- package/{hooks → cjs}/usePrevious.d.ts +1 -0
- package/cjs/usePrevious.js +1 -0
- package/{hooks → cjs}/usePreviousRef.d.ts +1 -0
- package/cjs/usePreviousRef.js +1 -0
- package/{hooks → cjs}/useReveal.d.ts +1 -0
- package/cjs/useReveal.js +1 -0
- package/{hooks → cjs}/useScrollPosition.d.ts +1 -1
- package/cjs/useScrollPosition.js +1 -0
- package/{hooks → cjs}/useScrollThreshold.d.ts +1 -0
- package/cjs/useScrollThreshold.js +1 -0
- package/{hooks → cjs}/useScrollTo.d.ts +1 -0
- package/cjs/useScrollTo.js +1 -0
- package/{hooks → cjs}/useSmoothScroll.d.ts +1 -0
- package/cjs/useSmoothScroll.js +1 -0
- package/{hooks → cjs}/useSpinDelay.d.ts +1 -0
- package/cjs/useSpinDelay.js +1 -0
- package/{hooks → cjs}/useTraceUpdate.d.ts +1 -0
- package/cjs/useTraceUpdate.js +1 -0
- package/{hooks → cjs}/useUpdateEffect.d.ts +1 -0
- package/cjs/useUpdateEffect.js +1 -0
- package/{hooks → cjs}/useWindowSize.d.ts +1 -0
- package/cjs/useWindowSize.js +1 -0
- package/classed.d.ts +1 -1
- package/classed.js +1 -41
- package/createUseMediaQueryWidth.js +1 -38
- package/extendComponent.js +1 -9
- package/forms/antispam.js +1 -29
- package/forms.js +1 -1
- package/index.js +1 -26
- package/mergeRefs.js +1 -13
- package/package.json +53 -136
- package/types.js +1 -1
- package/useAsyncFn.js +1 -26
- package/useFirstMountState.js +1 -10
- package/useFixedOffset.js +1 -42
- package/useFocus.js +1 -9
- package/useInterval.js +1 -20
- package/useIsomorphicLayoutEffect.d.ts +2 -2
- package/useIsomorphicLayoutEffect.js +1 -4
- package/useKeyUp.js +1 -16
- package/useMeasure.js +1 -119
- package/useMountedState.js +1 -13
- package/useNavigateAway.js +1 -25
- package/usePrevious.js +1 -9
- package/usePreviousRef.js +1 -9
- package/useReveal.js +1 -42
- package/useScrollPosition.js +1 -58
- package/useScrollThreshold.js +1 -26
- package/useScrollTo.js +1 -18
- package/useSmoothScroll.js +1 -32
- package/useSpinDelay.js +1 -36
- package/useTraceUpdate.js +1 -17
- package/useUpdateEffect.js +1 -11
- package/useWindowSize.js +1 -20
- package/README.md +0 -1
- package/calendar.cjs.d.ts +0 -1
- package/calendar.cjs.default.js +0 -1
- package/calendar.cjs.js +0 -62
- package/calendar.cjs.mjs +0 -2
- package/calendar.esm.js +0 -35
- package/components/FaviconTags.js +0 -4
- package/components/Meta.js +0 -4
- package/components/NoJs.js +0 -6
- package/forms.cjs.d.ts +0 -1
- package/forms.cjs.default.js +0 -1
- package/forms.cjs.js +0 -11
- package/forms.cjs.mjs +0 -2
- package/forms.esm.js +0 -6
- package/hooks/index.js +0 -19
- package/hooks/useAsyncFn.js +0 -25
- package/hooks/useFirstMountState.js +0 -9
- package/hooks/useFixedOffset.js +0 -41
- package/hooks/useFocus.js +0 -8
- package/hooks/useInterval.js +0 -19
- package/hooks/useIsomorphicLayoutEffect.d.ts +0 -2
- package/hooks/useIsomorphicLayoutEffect.js +0 -3
- package/hooks/useKeyUp.js +0 -15
- package/hooks/useMeasure.js +0 -118
- package/hooks/useMountedState.js +0 -12
- package/hooks/useNavigateAway.js +0 -24
- package/hooks/usePrevious.js +0 -8
- package/hooks/usePreviousRef.js +0 -8
- package/hooks/useReveal.js +0 -41
- package/hooks/useScrollPosition.js +0 -57
- package/hooks/useScrollThreshold.js +0 -25
- package/hooks/useScrollTo.js +0 -17
- package/hooks/useSmoothScroll.js +0 -31
- package/hooks/useSpinDelay.js +0 -35
- package/hooks/useTraceUpdate.js +0 -16
- package/hooks/useUpdateEffect.js +0 -10
- package/hooks/useWindowSize.js +0 -19
- package/index.cjs.d.ts +0 -1
- package/index.cjs.default.js +0 -1
- package/index.cjs.js +0 -87
- package/index.cjs.mjs +0 -2
- package/index.esm.js +0 -58
- package/utils/Polymorphic.js +0 -1
- package/utils/classed.js +0 -40
- package/utils/createUseMediaQueryWidth.js +0 -37
- package/utils/extendComponent.js +0 -8
- package/utils/index.d.ts +0 -5
- package/utils/index.js +0 -4
- package/utils/mergeRefs.js +0 -12
- /package/{utils → cjs}/Polymorphic.d.ts +0 -0
package/calendar.cjs.js
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
-
var react = require('react');
|
|
7
|
-
var addDays = require('date-fns/addDays');
|
|
8
|
-
var addMonths = require('date-fns/addMonths');
|
|
9
|
-
var addWeeks = require('date-fns/addWeeks');
|
|
10
|
-
var endOfMonth = require('date-fns/endOfMonth');
|
|
11
|
-
var endOfWeek = require('date-fns/endOfWeek');
|
|
12
|
-
var isWithinInterval = require('date-fns/isWithinInterval');
|
|
13
|
-
var startOfWeek = require('date-fns/startOfWeek');
|
|
14
|
-
var subMonths = require('date-fns/subMonths');
|
|
15
|
-
var subWeeks = require('date-fns/subWeeks');
|
|
16
|
-
var format = require('date-fns/format');
|
|
17
|
-
var eachWeekOfInterval = require('date-fns/eachWeekOfInterval');
|
|
18
|
-
var reactSwipeable = require('react-swipeable');
|
|
19
|
-
var differenceInDays = require('date-fns/differenceInDays');
|
|
20
|
-
var subDays = require('date-fns/subDays');
|
|
21
|
-
var utils = require('@koine/utils');
|
|
22
|
-
|
|
23
|
-
function _interopNamespace(e) {
|
|
24
|
-
if (e && e.__esModule) return e;
|
|
25
|
-
var n = Object.create(null);
|
|
26
|
-
if (e) {
|
|
27
|
-
Object.keys(e).forEach(function (k) {
|
|
28
|
-
if (k !== 'default') {
|
|
29
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
30
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
31
|
-
enumerable: true,
|
|
32
|
-
get: function () { return e[k]; }
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
n["default"] = e;
|
|
38
|
-
return Object.freeze(n);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
let getEventTimestamp=e=>{let t=new Date(e);return t.setHours(0,0,0,0),t.valueOf()/1e3};let getDisplayTime=e=>e.getHours()+":"+"0".repeat(2-e.getMinutes().toString().length)+e.getMinutes();let getStartDate=(e,t)=>(e.setHours(0,0,0),"month"===t?e.setDate(1):"week"===t&&(e=startOfWeek.startOfWeek(e,{weekStartsOn:1})),e);let getEndDate=(e,t)=>{let r=e;return "month"===t?r=endOfMonth.endOfMonth(e):"week"===t&&(r=endOfWeek.endOfWeek(e,{weekStartsOn:1})),r.setHours(23,59,59),r};let getPrevDate=(e,t)=>"month"===t?subMonths.subMonths(e,1):subWeeks.subWeeks(e,1);let getNextDate=(e,a)=>"month"===a?addMonths.addMonths(e,1):addWeeks.addWeeks(e,1);let isTodayInView=(e,t)=>isWithinInterval.isWithinInterval(new Date,{start:e,end:t});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$1=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};let processEventsInView=(t,r,a,n)=>{let s=i(t),o=d$1(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(addDays.addDays(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};
|
|
42
|
-
|
|
43
|
-
let d=l=>jsxRuntime.jsxs("svg",{viewBox:"0 0 24 24",fill:"currentColor",stroke:"none",...l,children:[jsxRuntime.jsx("path",{d:"M0 0h24v24H0z"}),jsxRuntime.jsx("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"})]}),o$1={overflow:"hidden",whiteSpace:"nowrap",textOverflow:"ellipsis"};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]=react.useState(!1),O=p.filter(e=>!e.placeholder);return jsxRuntime.jsx(f,{children:p.map((t,p)=>{if(p===u&&!x)return jsxRuntime.jsxs(y,{onClick:()=>M(!0),children:[jsxRuntime.jsx(d,{}),O.length-u]},"overflowMessage"+p);if(p>u&&!x)return null;if(t.placeholder)return jsxRuntime.jsx(react.Fragment,{children:jsxRuntime.jsx($,{$placeholder:!0,children:jsxRuntime.jsx(m,{"aria-hidden":"true",style:{visibility:"hidden"},$placeholder:!0,children:jsxRuntime.jsx(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$1.display="none");let k={$view:c,$selected:a?.uid===t.uid,$past:t.isPast,$color:t.color,$isOutOfRange:t.$isOutOfRange,$isToday:t.$isToday};return jsxRuntime.jsx(react.Fragment,{children:jsxRuntime.jsx($,{style:f,...k,children:jsxRuntime.jsx(m,{role:"button",style:o$1,...k,onClick:()=>s(e=>e?.uid===t.uid?null:t),onMouseEnter:()=>h(t),onMouseLeave:()=>h(null),children:t.allDay?jsxRuntime.jsx(w,{children:t.title}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(g,{children:getDisplayTime(t.start)}),jsxRuntime.jsx(w,{children:t.title})]})})})},t.key)})})};
|
|
44
|
-
|
|
45
|
-
let useDateLocale=(a,l="en")=>{let[r,n]=react.useState(),[o,c]=react.useState(l);return react.useEffect(()=>{let e=async()=>{let e=await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('date-fns/locale/en-US')); });c(a||o),n(e.enUS);};a!==o&&e();},[a,o]),r};
|
|
46
|
-
|
|
47
|
-
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:useDateLocale(c)},x="";return "month"===l&&(x=format.format(C,"MMMM yyyy",v)),"week"===l&&(x=C.getMonth()===p.getMonth()?format.format(C,"# MMMM yyyy",v).replace("#",`${C.getDate()}-${p.getDate()}`):`${format.format(C,"d MMMM",v)} - ${format.format(p,"d MMMM yyyy",v)}`),jsxRuntime.jsxs(m,{children:[jsxRuntime.jsxs(b,{children:[jsxRuntime.jsx(k,{onClick:i}),jsxRuntime.jsx(u,{onClick:M}),jsxRuntime.jsx(h,{onClick:d,disabled:r}),jsxRuntime.jsx(f,{onClick:()=>y("month"),disabled:"month"===l}),jsxRuntime.jsx(g,{onClick:()=>y("week"),disabled:"week"===l})]}),jsxRuntime.jsx(s,{range:a,formatted:x})]})};
|
|
48
|
-
|
|
49
|
-
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]=react.useState(f||[0,1,2,3,4,5,6]),[E,F]=react.useState([]),G=useDateLocale(d),{month:H,weeks:J}=react.useMemo(()=>(function(e){let[t,a]=e,i=eachWeekOfInterval.eachWeekOfInterval({start:t,end:a},{weekStartsOn:1});return {month:t.getMonth(),weeks:i}})(u),[u]),N=reactSwipeable.useSwipeable({onSwipedLeft:c,onSwipedRight:s});return react.useEffect(()=>{F(processEventsInView(h,b,H,J));},[h,b,H,J]),react.useEffect(()=>{G&&G.localize&&!f&&B([1,2,3,4,5,6,0].map(e=>G.localize.day(e,{width:"abbreviated"})));},[G,f]),jsxRuntime.jsxs(C,{...N,children:[jsxRuntime.jsx(D,{children:jsxRuntime.jsx("tr",{children:A.map(t=>jsxRuntime.jsx(S,{scope:"column",children:t},t))})}),jsxRuntime.jsx(k,{children:E.map((r,a)=>jsxRuntime.jsx(z,{...r.props,children:r.days.map(r=>jsxRuntime.jsxs(L,{...r.props,children:[jsxRuntime.jsx(O,{...r.props,children:r.label}),r.events.length>0&&jsxRuntime.jsx(CalendarDaygridCell,{eventClicked:v,setEventClicked:g,eventHovered:w,setEventHovered:y,view:b,maxEvents:j,events:r.events,timestamp:r.timestamp,calendarsMap:x,...q})]}))}))})]})};
|
|
50
|
-
|
|
51
|
-
let KoineCalendarLegend=({calendarsMap:a={},toggleCalendarVisibility:s,LegendItem:d="div",LegendItemStatus:i="span",LegendItemLabel:l="span",LegendItemEvents:t="span"})=>jsxRuntime.jsx(jsxRuntime.Fragment,{children:Object.entries(a).map(([r,a])=>jsxRuntime.jsxs(d,{onClick:()=>s(r),$color:a.color,$empty:0===a.events,disabled:0===a.events,children:[jsxRuntime.jsx(i,{children:a.on?"⬤":"⭘"}),jsxRuntime.jsx(l,{children:a.name}),jsxRuntime.jsx(t,{children:a.events})]},"CalendarLegend."+r))});
|
|
52
|
-
|
|
53
|
-
let getCalendarsEventsFromGoogle=async({calendars:e,...t})=>{let a={};return await Promise.all(e.map(async e=>{addCalendarEvents(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=utils.isUndefined(i.end.dateTime)&&utils.isString(i.end.date),p=i.location||"",D=i.description||"",h=m.getTime()+""+u.getTime();g&&f>u&&(f=subDays.subDays(f,1)).setHours(23,59,59);let y=function(){let t=new Date(u),a=new Date(f),n=[getEventTimestamp(t)];for(;differenceInDays.differenceInDays(a,t);)t.setDate(t.getDate()+1),n.push(getEventTimestamp(t));return n}(),E=utils.arrayToLookup(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}
|
|
54
|
-
|
|
55
|
-
let useCalendar=({locale:d,apiKey:c,calendars:p,events:g,start:m,end:y,view:v="month",timeZone:f="",onError:b})=>{let[w,T]=react.useState(v),D=m||getStartDate(new Date,w),h=y||getEndDate(D,w),[O,P]=react.useState([D,h]),[j,x]=react.useState(isTodayInView(D,h)),[C,L]=react.useState(g||{}),[N,k]=react.useState(null),[q,z]=react.useState(null),[A,B]=react.useReducer((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=react.useCallback(e=>{B({type:"visibility",payload:e});},[B]),F=react.useCallback(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=react.useCallback(async(e,t,l)=>{try{let n=await getCalendarsEventsFromGoogle({apiKey:c,calendars:e,timeZone:f,start:t,end:l});L(n);}catch(e){b&&b(e);}},[L,c,f,b]),H=react.useCallback(()=>{let[e,t]=O,l=getStartDate(new Date,w),n=getEndDate(l,w);P([l,n]),(e.getTime()!==l.getTime()||t.getTime()!==n.getTime())&&(z(null),k(null));},[w,O]),I=react.useCallback(()=>{P(([e])=>{let t=getPrevDate(e,w),l=getEndDate(t,w);return [t,l]}),z(null),k(null);},[w]),J=react.useCallback(()=>{P(([e])=>{let t=getNextDate(e,w),l=getEndDate(t,w);return [t,l]}),z(null),k(null);},[w]),K=react.useCallback(e=>{let t=getStartDate(D,e),l=getEndDate(t,e);P([t,l]),T(e),z(null),k(null);},[D]);return react.useEffect(()=>{let[e,t]=O;G(p,e,t),x(isTodayInView(e,t));},[O]),react.useEffect(()=>{C&&F(C);},[C,F]),react.useEffect(()=>{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})}};
|
|
56
|
-
|
|
57
|
-
exports.CalendarDaygridCell = CalendarDaygridCell;
|
|
58
|
-
exports.KoineCalendarDaygridNav = KoineCalendarDaygridNav;
|
|
59
|
-
exports.KoineCalendarDaygridTable = KoineCalendarDaygridTable;
|
|
60
|
-
exports.KoineCalendarLegend = KoineCalendarLegend;
|
|
61
|
-
exports.useCalendar = useCalendar;
|
|
62
|
-
exports.useDateLocale = useDateLocale;
|
package/calendar.cjs.mjs
DELETED
package/calendar.esm.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
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=e=>{let t=new Date(e);return t.setHours(0,0,0,0),t.valueOf()/1e3};let getDisplayTime=e=>e.getHours()+":"+"0".repeat(2-e.getMinutes().toString().length)+e.getMinutes();let getStartDate=(e,t)=>(e.setHours(0,0,0),"month"===t?e.setDate(1):"week"===t&&(e=startOfWeek(e,{weekStartsOn:1})),e);let getEndDate=(e,t)=>{let r=e;return "month"===t?r=endOfMonth(e):"week"===t&&(r=endOfWeek(e,{weekStartsOn:1})),r.setHours(23,59,59),r};let getPrevDate=(e,t)=>"month"===t?subMonths(e,1):subWeeks(e,1);let getNextDate=(e,a)=>"month"===a?addMonths(e,1):addWeeks(e,1);let isTodayInView=(e,t)=>isWithinInterval(new Date,{start:e,end:t});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$1=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};let processEventsInView=(t,r,a,n)=>{let s=i(t),o=d$1(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(addDays(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};
|
|
20
|
-
|
|
21
|
-
let d=l=>jsxs("svg",{viewBox:"0 0 24 24",fill:"currentColor",stroke:"none",...l,children:[jsx("path",{d:"M0 0h24v24H0z"}),jsx("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"})]}),o$1={overflow:"hidden",whiteSpace:"nowrap",textOverflow:"ellipsis"};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]=useState(!1),O=p.filter(e=>!e.placeholder);return jsx(f,{children:p.map((t,p)=>{if(p===u&&!x)return jsxs(y,{onClick:()=>M(!0),children:[jsx(d,{}),O.length-u]},"overflowMessage"+p);if(p>u&&!x)return null;if(t.placeholder)return jsx(Fragment,{children:jsx($,{$placeholder:!0,children:jsx(m,{"aria-hidden":"true",style:{visibility:"hidden"},$placeholder:!0,children:jsx(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$1.display="none");let k={$view:c,$selected:a?.uid===t.uid,$past:t.isPast,$color:t.color,$isOutOfRange:t.$isOutOfRange,$isToday:t.$isToday};return jsx(Fragment,{children:jsx($,{style:f,...k,children:jsx(m,{role:"button",style:o$1,...k,onClick:()=>s(e=>e?.uid===t.uid?null:t),onMouseEnter:()=>h(t),onMouseLeave:()=>h(null),children:t.allDay?jsx(w,{children:t.title}):jsxs(Fragment$1,{children:[jsx(g,{children:getDisplayTime(t.start)}),jsx(w,{children:t.title})]})})})},t.key)})})};
|
|
22
|
-
|
|
23
|
-
let useDateLocale=(a,l="en")=>{let[r,n]=useState(),[o,c]=useState(l);return useEffect(()=>{let e=async()=>{let e=await import('date-fns/locale/en-US');c(a||o),n(e.enUS);};a!==o&&e();},[a,o]),r};
|
|
24
|
-
|
|
25
|
-
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:useDateLocale(c)},x="";return "month"===l&&(x=format(C,"MMMM yyyy",v)),"week"===l&&(x=C.getMonth()===p.getMonth()?format(C,"# MMMM yyyy",v).replace("#",`${C.getDate()}-${p.getDate()}`):`${format(C,"d MMMM",v)} - ${format(p,"d MMMM yyyy",v)}`),jsxs(m,{children:[jsxs(b,{children:[jsx(k,{onClick:i}),jsx(u,{onClick:M}),jsx(h,{onClick:d,disabled:r}),jsx(f,{onClick:()=>y("month"),disabled:"month"===l}),jsx(g,{onClick:()=>y("week"),disabled:"week"===l})]}),jsx(s,{range:a,formatted:x})]})};
|
|
26
|
-
|
|
27
|
-
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]=useState(f||[0,1,2,3,4,5,6]),[E,F]=useState([]),G=useDateLocale(d),{month:H,weeks:J}=useMemo(()=>(function(e){let[t,a]=e,i=eachWeekOfInterval({start:t,end:a},{weekStartsOn:1});return {month:t.getMonth(),weeks:i}})(u),[u]),N=useSwipeable({onSwipedLeft:c,onSwipedRight:s});return useEffect(()=>{F(processEventsInView(h,b,H,J));},[h,b,H,J]),useEffect(()=>{G&&G.localize&&!f&&B([1,2,3,4,5,6,0].map(e=>G.localize.day(e,{width:"abbreviated"})));},[G,f]),jsxs(C,{...N,children:[jsx(D,{children:jsx("tr",{children:A.map(t=>jsx(S,{scope:"column",children:t},t))})}),jsx(k,{children:E.map((r,a)=>jsx(z,{...r.props,children:r.days.map(r=>jsxs(L,{...r.props,children:[jsx(O,{...r.props,children:r.label}),r.events.length>0&&jsx(CalendarDaygridCell,{eventClicked:v,setEventClicked:g,eventHovered:w,setEventHovered:y,view:b,maxEvents:j,events:r.events,timestamp:r.timestamp,calendarsMap:x,...q})]}))}))})]})};
|
|
28
|
-
|
|
29
|
-
let KoineCalendarLegend=({calendarsMap:a={},toggleCalendarVisibility:s,LegendItem:d="div",LegendItemStatus:i="span",LegendItemLabel:l="span",LegendItemEvents:t="span"})=>jsx(Fragment$1,{children:Object.entries(a).map(([r,a])=>jsxs(d,{onClick:()=>s(r),$color:a.color,$empty:0===a.events,disabled:0===a.events,children:[jsx(i,{children:a.on?"⬤":"⭘"}),jsx(l,{children:a.name}),jsx(t,{children:a.events})]},"CalendarLegend."+r))});
|
|
30
|
-
|
|
31
|
-
let getCalendarsEventsFromGoogle=async({calendars:e,...t})=>{let a={};return await Promise.all(e.map(async e=>{addCalendarEvents(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=isUndefined(i.end.dateTime)&&isString(i.end.date),p=i.location||"",D=i.description||"",h=m.getTime()+""+u.getTime();g&&f>u&&(f=subDays(f,1)).setHours(23,59,59);let y=function(){let t=new Date(u),a=new Date(f),n=[getEventTimestamp(t)];for(;differenceInDays(a,t);)t.setDate(t.getDate()+1),n.push(getEventTimestamp(t));return n}(),E=arrayToLookup(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}
|
|
32
|
-
|
|
33
|
-
let useCalendar=({locale:d,apiKey:c,calendars:p,events:g,start:m,end:y,view:v="month",timeZone:f="",onError:b})=>{let[w,T]=useState(v),D=m||getStartDate(new Date,w),h=y||getEndDate(D,w),[O,P]=useState([D,h]),[j,x]=useState(isTodayInView(D,h)),[C,L]=useState(g||{}),[N,k]=useState(null),[q,z]=useState(null),[A,B]=useReducer((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=useCallback(e=>{B({type:"visibility",payload:e});},[B]),F=useCallback(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=useCallback(async(e,t,l)=>{try{let n=await getCalendarsEventsFromGoogle({apiKey:c,calendars:e,timeZone:f,start:t,end:l});L(n);}catch(e){b&&b(e);}},[L,c,f,b]),H=useCallback(()=>{let[e,t]=O,l=getStartDate(new Date,w),n=getEndDate(l,w);P([l,n]),(e.getTime()!==l.getTime()||t.getTime()!==n.getTime())&&(z(null),k(null));},[w,O]),I=useCallback(()=>{P(([e])=>{let t=getPrevDate(e,w),l=getEndDate(t,w);return [t,l]}),z(null),k(null);},[w]),J=useCallback(()=>{P(([e])=>{let t=getNextDate(e,w),l=getEndDate(t,w);return [t,l]}),z(null),k(null);},[w]),K=useCallback(e=>{let t=getStartDate(D,e),l=getEndDate(t,e);P([t,l]),T(e),z(null),k(null);},[D]);return useEffect(()=>{let[e,t]=O;G(p,e,t),x(isTodayInView(e,t));},[O]),useEffect(()=>{C&&F(C);},[C,F]),useEffect(()=>{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})}};
|
|
34
|
-
|
|
35
|
-
export { CalendarDaygridCell, KoineCalendarDaygridNav, KoineCalendarDaygridTable, KoineCalendarLegend, useCalendar, useDateLocale };
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
export let FaviconTags = ({ name, color, safariTabColor, tileColor, themeColor, }) => {
|
|
3
|
-
return (_jsxs(_Fragment, { children: [_jsx("link", { rel: "shortcut icon", href: "/favicon.ico", type: "image/x-icon" }), _jsx("link", { rel: "apple-touch-icon", sizes: "180x180", href: "/apple-touch-icon.png" }), _jsx("link", { rel: "icon", type: "image/png", sizes: "32x32", href: "/favicon-32x32.png" }), _jsx("link", { rel: "icon", type: "image/png", sizes: "16x16", href: "/favicon-16x16.png" }), _jsx("link", { rel: "manifest", href: "/site.webmanifest" }), _jsx("link", { rel: "mask-icon", href: "/safari-pinned-tab.svg", color: safariTabColor || color }), _jsx("meta", { name: "apple-mobile-web-app-title", content: name }), _jsx("meta", { name: "application-name", content: name }), _jsx("meta", { name: "msapplication-TileColor", content: tileColor || color }), _jsx("meta", { name: "theme-color", content: themeColor || color })] }));
|
|
4
|
-
};
|
package/components/Meta.js
DELETED
package/components/NoJs.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
export let NoJs = (_props) => {
|
|
3
|
-
return (_jsx("script", { id: "no-js", dangerouslySetInnerHTML: {
|
|
4
|
-
__html: `document.querySelector("html").className=document.querySelector("html").className.replace(/no-js/,"") + "js";`,
|
|
5
|
-
} }));
|
|
6
|
-
};
|
package/forms.cjs.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from "./forms";
|
package/forms.cjs.default.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
exports._default = require('./forms.cjs.js').default;
|
package/forms.cjs.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
var yup = require('@kuus/yup');
|
|
6
|
-
var utils = require('@koine/utils');
|
|
7
|
-
|
|
8
|
-
let encodeForm=t=>{let o={},i={};for(let e in t)if(!e.startsWith("_")){let l=utils.encode(e);o[l]=t[e],i[e]=l;}return {encodedSchema:yup.object(o).required(),encodedNames:i}};let decodeForm=e=>{let r={};for(let i in e){let l=utils.decode(i);i.startsWith("_")?r[i.substring(1)]=e[i]:utils.isUndefined(e[i])||""!==e[l]||(r[l]=e[i]);}return r};
|
|
9
|
-
|
|
10
|
-
exports.decodeForm = decodeForm;
|
|
11
|
-
exports.encodeForm = encodeForm;
|
package/forms.cjs.mjs
DELETED
package/forms.esm.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { object } from '@kuus/yup';
|
|
2
|
-
import { encode, decode, isUndefined } from '@koine/utils';
|
|
3
|
-
|
|
4
|
-
let encodeForm=t=>{let o={},i={};for(let e in t)if(!e.startsWith("_")){let l=encode(e);o[l]=t[e],i[e]=l;}return {encodedSchema:object(o).required(),encodedNames:i}};let decodeForm=e=>{let r={};for(let i in e){let l=decode(i);i.startsWith("_")?r[i.substring(1)]=e[i]:isUndefined(e[i])||""!==e[l]||(r[l]=e[i]);}return r};
|
|
5
|
-
|
|
6
|
-
export { decodeForm, encodeForm };
|
package/hooks/index.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
export { useAsyncFn, } from "./useAsyncFn";
|
|
2
|
-
export { useFirstMountState } from "./useFirstMountState";
|
|
3
|
-
export { useFixedOffset } from "./useFixedOffset";
|
|
4
|
-
export { useFocus } from "./useFocus";
|
|
5
|
-
export { useInterval } from "./useInterval";
|
|
6
|
-
export { useIsomorphicLayoutEffect } from "./useIsomorphicLayoutEffect";
|
|
7
|
-
export { useKeyUp } from "./useKeyUp";
|
|
8
|
-
export { useMeasure, } from "./useMeasure";
|
|
9
|
-
export { useMountedState } from "./useMountedState";
|
|
10
|
-
export { useNavigateAway, } from "./useNavigateAway";
|
|
11
|
-
export { usePrevious } from "./usePrevious";
|
|
12
|
-
export { usePreviousRef } from "./usePreviousRef";
|
|
13
|
-
export { useScrollPosition } from "./useScrollPosition";
|
|
14
|
-
export { useScrollThreshold } from "./useScrollThreshold";
|
|
15
|
-
export { useSmoothScroll } from "./useSmoothScroll";
|
|
16
|
-
export { useSpinDelay } from "./useSpinDelay";
|
|
17
|
-
export { useTraceUpdate } from "./useTraceUpdate";
|
|
18
|
-
export { useUpdateEffect } from "./useUpdateEffect";
|
|
19
|
-
export { useWindowSize } from "./useWindowSize";
|
package/hooks/useAsyncFn.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import React, { useCallback, useRef, useState } from "react";
|
|
2
|
-
import { useMountedState } from "./useMountedState";
|
|
3
|
-
export let useAsyncFn = (fn, deps = [], initialState = { loading: false }) => {
|
|
4
|
-
const lastCallId = useRef(0);
|
|
5
|
-
const isMounted = useMountedState();
|
|
6
|
-
const [state, set] = useState(initialState);
|
|
7
|
-
const callback = useCallback((...args) => {
|
|
8
|
-
const callId = ++lastCallId.current;
|
|
9
|
-
if (!state.loading) {
|
|
10
|
-
set((prevState) => ({ ...prevState, loading: true }));
|
|
11
|
-
}
|
|
12
|
-
return fn(...args).then((value) => {
|
|
13
|
-
isMounted() &&
|
|
14
|
-
callId === lastCallId.current &&
|
|
15
|
-
set({ value, loading: false });
|
|
16
|
-
return value;
|
|
17
|
-
}, (error) => {
|
|
18
|
-
isMounted() &&
|
|
19
|
-
callId === lastCallId.current &&
|
|
20
|
-
set({ error, loading: false });
|
|
21
|
-
return error;
|
|
22
|
-
});
|
|
23
|
-
}, deps);
|
|
24
|
-
return [state, callback];
|
|
25
|
-
};
|
package/hooks/useFixedOffset.js
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { useRef } from "react";
|
|
2
|
-
import { debounce } from "@koine/utils";
|
|
3
|
-
import { $each, calculateFixedOffset, injectCss, listenResizeDebounced, } from "@koine/dom";
|
|
4
|
-
import { useIsomorphicLayoutEffect } from "./useIsomorphicLayoutEffect";
|
|
5
|
-
const inject = (value) => {
|
|
6
|
-
injectCss("useFixedOffset", `html{scroll-padding-top: ${value}px}`);
|
|
7
|
-
};
|
|
8
|
-
export let useFixedOffset = (selector) => {
|
|
9
|
-
const fixedOffset = useRef(0);
|
|
10
|
-
useIsomorphicLayoutEffect(() => {
|
|
11
|
-
const update = () => {
|
|
12
|
-
const newFixedOffset = calculateFixedOffset();
|
|
13
|
-
fixedOffset.current = newFixedOffset;
|
|
14
|
-
inject(newFixedOffset);
|
|
15
|
-
};
|
|
16
|
-
update();
|
|
17
|
-
if (ResizeObserver) {
|
|
18
|
-
const observer = new ResizeObserver((entries) => {
|
|
19
|
-
let newFixedOffset = 0;
|
|
20
|
-
entries.forEach((entry) => {
|
|
21
|
-
newFixedOffset += entry.contentRect.height;
|
|
22
|
-
});
|
|
23
|
-
fixedOffset.current = newFixedOffset;
|
|
24
|
-
const updateOnResize = debounce(() => inject(newFixedOffset), 400, true);
|
|
25
|
-
updateOnResize();
|
|
26
|
-
});
|
|
27
|
-
$each(selector || "[data-fixed]", ($el) => {
|
|
28
|
-
if (observer)
|
|
29
|
-
observer.observe($el);
|
|
30
|
-
});
|
|
31
|
-
return () => {
|
|
32
|
-
observer?.disconnect();
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
const listener = listenResizeDebounced(0, update);
|
|
37
|
-
return listener;
|
|
38
|
-
}
|
|
39
|
-
}, [selector]);
|
|
40
|
-
return fixedOffset;
|
|
41
|
-
};
|
package/hooks/useFocus.js
DELETED
package/hooks/useInterval.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { useEffect, useRef } from "react";
|
|
2
|
-
import { noop } from "@koine/utils";
|
|
3
|
-
export let useInterval = (callback, delay, deps = []) => {
|
|
4
|
-
const savedCallback = useRef();
|
|
5
|
-
useEffect(() => {
|
|
6
|
-
savedCallback.current = callback;
|
|
7
|
-
}, [callback, ...deps]);
|
|
8
|
-
useEffect(() => {
|
|
9
|
-
function tick() {
|
|
10
|
-
if (savedCallback.current)
|
|
11
|
-
savedCallback.current();
|
|
12
|
-
}
|
|
13
|
-
if (delay !== null) {
|
|
14
|
-
const id = setInterval(tick, delay);
|
|
15
|
-
return () => clearInterval(id);
|
|
16
|
-
}
|
|
17
|
-
return noop;
|
|
18
|
-
}, [delay]);
|
|
19
|
-
};
|
package/hooks/useKeyUp.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { useEffect } from "react";
|
|
2
|
-
import { on } from "@koine/dom";
|
|
3
|
-
export let useKeyUp = (callback, deps = []) => {
|
|
4
|
-
useEffect(() => {
|
|
5
|
-
const listener = on(window, "keyup", (event) => {
|
|
6
|
-
if (!event.ctrlKey &&
|
|
7
|
-
!event.altKey &&
|
|
8
|
-
!event.shiftKey &&
|
|
9
|
-
!event.metaKey) {
|
|
10
|
-
callback(event);
|
|
11
|
-
}
|
|
12
|
-
});
|
|
13
|
-
return listener;
|
|
14
|
-
}, [callback, ...deps]);
|
|
15
|
-
};
|
package/hooks/useMeasure.js
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import { useEffect, useMemo, useRef, useState } from "react";
|
|
2
|
-
import { debounce, noop } from "@koine/utils";
|
|
3
|
-
import { listenResizeDebounced, listenScrollDebounced, off, on, } from "@koine/dom";
|
|
4
|
-
let observer;
|
|
5
|
-
let findScrollContainers = (element) => {
|
|
6
|
-
const result = [];
|
|
7
|
-
if (!element || element === document.body)
|
|
8
|
-
return result;
|
|
9
|
-
const { overflow, overflowX, overflowY } = window.getComputedStyle(element);
|
|
10
|
-
if ([overflow, overflowX, overflowY].some((prop) => prop === "auto" || prop === "scroll"))
|
|
11
|
-
result.push(element);
|
|
12
|
-
return [...result, ...findScrollContainers(element.parentElement)];
|
|
13
|
-
};
|
|
14
|
-
const keys = [
|
|
15
|
-
"x",
|
|
16
|
-
"y",
|
|
17
|
-
"top",
|
|
18
|
-
"bottom",
|
|
19
|
-
"left",
|
|
20
|
-
"right",
|
|
21
|
-
"width",
|
|
22
|
-
"height",
|
|
23
|
-
];
|
|
24
|
-
const areBoundsEqual = (a, b) => keys.every((key) => a[key] === b[key]);
|
|
25
|
-
export let useMeasure = (options) => {
|
|
26
|
-
const { scroll = false } = options || {};
|
|
27
|
-
const [bounds, setBounds] = useState({
|
|
28
|
-
left: 0,
|
|
29
|
-
top: 0,
|
|
30
|
-
width: 0,
|
|
31
|
-
height: 0,
|
|
32
|
-
bottom: 0,
|
|
33
|
-
right: 0,
|
|
34
|
-
x: 0,
|
|
35
|
-
y: 0,
|
|
36
|
-
});
|
|
37
|
-
const state = useRef([
|
|
38
|
-
null,
|
|
39
|
-
null,
|
|
40
|
-
null,
|
|
41
|
-
bounds,
|
|
42
|
-
]);
|
|
43
|
-
const mounted = useRef(false);
|
|
44
|
-
useEffect(() => {
|
|
45
|
-
mounted.current = true;
|
|
46
|
-
return () => void (mounted.current = false);
|
|
47
|
-
}, []);
|
|
48
|
-
const [forceRefresh, , scrollChange] = useMemo(() => {
|
|
49
|
-
const callback = (..._args) => {
|
|
50
|
-
const [element, , , lastBounds] = state.current;
|
|
51
|
-
if (!element)
|
|
52
|
-
return;
|
|
53
|
-
const size = element.getBoundingClientRect();
|
|
54
|
-
Object.freeze(size);
|
|
55
|
-
if (mounted.current && !areBoundsEqual(lastBounds, size)) {
|
|
56
|
-
state.current[3] = size;
|
|
57
|
-
setBounds(size);
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
const debouncedCallback = debounce(callback);
|
|
61
|
-
return [callback, debouncedCallback, debouncedCallback];
|
|
62
|
-
}, [setBounds]);
|
|
63
|
-
function removeListeners() {
|
|
64
|
-
const [, scrollContainers, resizeObserver] = state.current;
|
|
65
|
-
if (scrollContainers) {
|
|
66
|
-
scrollContainers.forEach((element) => off(element, "scroll", scrollChange));
|
|
67
|
-
state.current[1] = null;
|
|
68
|
-
}
|
|
69
|
-
if (resizeObserver) {
|
|
70
|
-
resizeObserver.disconnect();
|
|
71
|
-
state.current[2] = null;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
function addListeners() {
|
|
75
|
-
const [element, scrollContainers] = state.current;
|
|
76
|
-
if (!element)
|
|
77
|
-
return;
|
|
78
|
-
if (!observer && ResizeObserver) {
|
|
79
|
-
observer = new ResizeObserver(scrollChange);
|
|
80
|
-
state.current[2] = observer;
|
|
81
|
-
observer.observe(element);
|
|
82
|
-
if (scroll && scrollContainers) {
|
|
83
|
-
scrollContainers.forEach((scrollContainer) => on(scrollContainer, "scroll", scrollChange, {
|
|
84
|
-
capture: true,
|
|
85
|
-
passive: true,
|
|
86
|
-
}));
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
const ref = (node) => {
|
|
91
|
-
if (!node || node === state.current[0])
|
|
92
|
-
return;
|
|
93
|
-
removeListeners();
|
|
94
|
-
state.current[0] = node;
|
|
95
|
-
state.current[1] = findScrollContainers(node);
|
|
96
|
-
addListeners();
|
|
97
|
-
};
|
|
98
|
-
useEffect(() => {
|
|
99
|
-
if (scroll) {
|
|
100
|
-
const listener = listenScrollDebounced(0, forceRefresh, 100);
|
|
101
|
-
return listener;
|
|
102
|
-
}
|
|
103
|
-
return noop;
|
|
104
|
-
}, [scroll, forceRefresh]);
|
|
105
|
-
useEffect(() => {
|
|
106
|
-
const listener = listenResizeDebounced(0, forceRefresh, 100);
|
|
107
|
-
return listener;
|
|
108
|
-
}, [forceRefresh]);
|
|
109
|
-
useEffect(() => {
|
|
110
|
-
removeListeners();
|
|
111
|
-
addListeners();
|
|
112
|
-
}, [scroll]);
|
|
113
|
-
useEffect(() => {
|
|
114
|
-
forceRefresh();
|
|
115
|
-
return removeListeners;
|
|
116
|
-
}, []);
|
|
117
|
-
return [ref, bounds, forceRefresh];
|
|
118
|
-
};
|
package/hooks/useMountedState.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { useCallback, useEffect, useRef } from "react";
|
|
2
|
-
export let useMountedState = () => {
|
|
3
|
-
const mountedRef = useRef(false);
|
|
4
|
-
const get = useCallback(() => mountedRef.current, []);
|
|
5
|
-
useEffect(() => {
|
|
6
|
-
mountedRef.current = true;
|
|
7
|
-
return () => {
|
|
8
|
-
mountedRef.current = false;
|
|
9
|
-
};
|
|
10
|
-
}, []);
|
|
11
|
-
return get;
|
|
12
|
-
};
|
package/hooks/useNavigateAway.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { useEffect, useRef } from "react";
|
|
2
|
-
import { on } from "@koine/dom";
|
|
3
|
-
export let useNavigateAway = (handler) => {
|
|
4
|
-
const beforeUnloadHandlerRef = useRef();
|
|
5
|
-
useEffect(() => {
|
|
6
|
-
beforeUnloadHandlerRef.current = (event) => {
|
|
7
|
-
const customMessageOrCondition = handler(event);
|
|
8
|
-
if (customMessageOrCondition) {
|
|
9
|
-
event.preventDefault();
|
|
10
|
-
}
|
|
11
|
-
if (typeof customMessageOrCondition === "string") {
|
|
12
|
-
return (event.returnValue = customMessageOrCondition);
|
|
13
|
-
}
|
|
14
|
-
if (event.defaultPrevented) {
|
|
15
|
-
return (event.returnValue = "");
|
|
16
|
-
}
|
|
17
|
-
return;
|
|
18
|
-
};
|
|
19
|
-
}, [handler]);
|
|
20
|
-
useEffect(() => {
|
|
21
|
-
const listenerBeforeunload = on(window, "beforeunload", (event) => beforeUnloadHandlerRef.current?.(event));
|
|
22
|
-
return listenerBeforeunload;
|
|
23
|
-
}, []);
|
|
24
|
-
};
|
package/hooks/usePrevious.js
DELETED
package/hooks/usePreviousRef.js
DELETED
package/hooks/useReveal.js
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { useEffect, useRef, useState } from "react";
|
|
2
|
-
export let useReveal = ({ direction = "left", offsetStartY = -2, offsetEndY = 0, offsetStartX = "all", }) => {
|
|
3
|
-
const ref = useRef(null);
|
|
4
|
-
const [startY, setStartY] = useState(0);
|
|
5
|
-
const [endY, setEndY] = useState(0);
|
|
6
|
-
const [startX, setStartX] = useState(0);
|
|
7
|
-
useEffect(() => {
|
|
8
|
-
if (!ref.current) {
|
|
9
|
-
return;
|
|
10
|
-
}
|
|
11
|
-
const rect = ref.current.getBoundingClientRect();
|
|
12
|
-
const scrollTop = window.scrollY || document.documentElement.scrollTop;
|
|
13
|
-
const elementHeight = rect.height;
|
|
14
|
-
const elementTop = rect.top;
|
|
15
|
-
const distanceTop = elementTop + scrollTop;
|
|
16
|
-
const offsetTop = offsetStartY ? elementHeight * offsetStartY : 0;
|
|
17
|
-
const offsetBottom = offsetEndY ? elementHeight * offsetEndY : offsetTop;
|
|
18
|
-
const startY = (distanceTop + offsetTop) / document.body.clientHeight;
|
|
19
|
-
const endY = (distanceTop + elementHeight + offsetBottom) / document.body.clientHeight;
|
|
20
|
-
let startX;
|
|
21
|
-
if (offsetStartX === "all") {
|
|
22
|
-
startX = direction === "left" ? -rect.right : rect.left;
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
startX = rect.width * offsetStartX;
|
|
26
|
-
startX = direction === "left" ? -startX : startX;
|
|
27
|
-
}
|
|
28
|
-
setStartY(startY);
|
|
29
|
-
setEndY(endY);
|
|
30
|
-
setStartX(startX);
|
|
31
|
-
}, [
|
|
32
|
-
setStartY,
|
|
33
|
-
setEndY,
|
|
34
|
-
setStartX,
|
|
35
|
-
offsetStartY,
|
|
36
|
-
offsetEndY,
|
|
37
|
-
offsetStartX,
|
|
38
|
-
direction,
|
|
39
|
-
]);
|
|
40
|
-
return { ref, startY, endY, startX };
|
|
41
|
-
};
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { useRef } from "react";
|
|
2
|
-
import { isBrowser } from "@koine/utils";
|
|
3
|
-
import { listenScroll } from "@koine/dom";
|
|
4
|
-
import { useIsomorphicLayoutEffect } from "./useIsomorphicLayoutEffect";
|
|
5
|
-
const zeroPosition = { x: 0, y: 0 };
|
|
6
|
-
const getClientRect = (element) => element?.getBoundingClientRect();
|
|
7
|
-
const getScrollPosition = (element, boundingElement) => {
|
|
8
|
-
if (!isBrowser) {
|
|
9
|
-
return zeroPosition;
|
|
10
|
-
}
|
|
11
|
-
if (!boundingElement) {
|
|
12
|
-
return { x: window.scrollX, y: window.scrollY };
|
|
13
|
-
}
|
|
14
|
-
const targetPosition = getClientRect(element?.current || document.body);
|
|
15
|
-
const containerPosition = getClientRect(boundingElement.current);
|
|
16
|
-
if (!targetPosition) {
|
|
17
|
-
return zeroPosition;
|
|
18
|
-
}
|
|
19
|
-
return containerPosition
|
|
20
|
-
? {
|
|
21
|
-
x: (containerPosition.x || 0) - (targetPosition.x || 0),
|
|
22
|
-
y: (containerPosition.y || 0) - (targetPosition.y || 0),
|
|
23
|
-
}
|
|
24
|
-
: { x: targetPosition.left, y: targetPosition.top };
|
|
25
|
-
};
|
|
26
|
-
export let useScrollPosition = (effect, deps = [], element, boundingElement, wait) => {
|
|
27
|
-
const position = useRef(getScrollPosition(null, boundingElement));
|
|
28
|
-
let throttleTimeout = null;
|
|
29
|
-
const callBack = () => {
|
|
30
|
-
const current = getScrollPosition(element, boundingElement);
|
|
31
|
-
effect(current, position.current);
|
|
32
|
-
position.current = current;
|
|
33
|
-
throttleTimeout = null;
|
|
34
|
-
};
|
|
35
|
-
useIsomorphicLayoutEffect(() => {
|
|
36
|
-
if (!isBrowser) {
|
|
37
|
-
return undefined;
|
|
38
|
-
}
|
|
39
|
-
const handleScroll = () => {
|
|
40
|
-
if (wait) {
|
|
41
|
-
if (throttleTimeout === null) {
|
|
42
|
-
throttleTimeout = window.setTimeout(callBack, wait);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
callBack();
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
const listener = listenScroll(handleScroll, boundingElement?.current);
|
|
50
|
-
return () => {
|
|
51
|
-
listener();
|
|
52
|
-
if (throttleTimeout) {
|
|
53
|
-
clearTimeout(throttleTimeout);
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
}, deps);
|
|
57
|
-
};
|