@ahrowe/ui 0.42.0 → 0.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +934 -0
- package/README.md +11 -10
- package/dist/cjs-types/common/accordion/accordion.types.d.ts +17 -2
- package/dist/cjs-types/common/actionButtons/actionButtons.types.d.ts +7 -1
- package/dist/cjs-types/common/actionIcon/actionIcon.d.ts +1 -1
- package/dist/cjs-types/common/actionIcon/actionIcon.types.d.ts +7 -9
- package/dist/cjs-types/common/alert/alert.types.d.ts +6 -8
- package/dist/cjs-types/common/animatedLogo/animatedLogo.types.d.ts +3 -2
- package/dist/cjs-types/common/badge/badge.types.d.ts +10 -6
- package/dist/cjs-types/common/button/button.types.d.ts +14 -4
- package/dist/cjs-types/common/calendar/calendar.types.d.ts +25 -10
- package/dist/cjs-types/common/calendar/components/agendaList/agendaList.d.ts +1 -1
- package/dist/cjs-types/common/calendar/components/agendaList/agendaList.types.d.ts +3 -0
- package/dist/cjs-types/common/calendar/components/calendarHeader/calendarHeader.d.ts +1 -1
- package/dist/cjs-types/common/calendar/components/calendarHeader/calendarHeader.types.d.ts +2 -0
- package/dist/cjs-types/common/calendar/components/compactMonth/compactMonth.d.ts +1 -1
- package/dist/cjs-types/common/calendar/components/monthView/monthView.d.ts +1 -1
- package/dist/cjs-types/common/calendar/components/monthView/monthView.types.d.ts +3 -2
- package/dist/cjs-types/common/calendar/components/timeGrid/timeGrid.d.ts +1 -1
- package/dist/cjs-types/common/calendar/components/timeGrid/timeGrid.types.d.ts +9 -1
- package/dist/cjs-types/common/calendar/dates.d.ts +21 -5
- package/dist/cjs-types/common/calendar/format.d.ts +3 -2
- package/dist/cjs-types/common/calendar/layout.d.ts +5 -0
- package/dist/cjs-types/common/calendar/useNow.d.ts +4 -0
- package/dist/cjs-types/common/calendar/view.types.d.ts +9 -2
- package/dist/cjs-types/common/card/card.types.d.ts +16 -2
- package/dist/cjs-types/common/chip/chip.types.d.ts +10 -5
- package/dist/cjs-types/common/copyButton/copyButton.types.d.ts +5 -4
- package/dist/cjs-types/common/fab/components/fabBase/fabBase.d.ts +1 -1
- package/dist/cjs-types/common/fab/components/fabBase/fabBase.types.d.ts +2 -1
- package/dist/cjs-types/common/progressBar/progressBar.d.ts +0 -1
- package/dist/cjs-types/common/progressBar/progressBar.types.d.ts +3 -1
- package/dist/cjs-types/common/splitButton/splitButton.types.d.ts +4 -1
- package/dist/cjs-types/common/styles/tone.d.ts +11 -0
- package/dist/cjs-types/common/themeProvider/color.types.d.ts +20 -0
- package/dist/cjs-types/common/themeProvider/index.d.ts +2 -0
- package/dist/cjs-types/common/themeProvider/theme.types.d.ts +3 -6
- package/dist/cjs-types/common/timeline/timeline.types.d.ts +3 -10
- package/dist/cjs-types/common/toast/index.d.ts +1 -1
- package/dist/cjs-types/common/toast/toast.types.d.ts +7 -3
- package/dist/cjs-types/common/types/actions.types.d.ts +1 -1
- package/dist/cjs-types/common/utils/dismissClick.d.ts +4 -0
- package/dist/cjs-types/common/utils/isDev.d.ts +1 -0
- package/dist/esm/common/accordion/accordion.mjs +1 -1
- package/dist/esm/common/accordion/accordion.mjs.map +1 -1
- package/dist/esm/common/accordion/accordion.module.mjs +1 -1
- package/dist/esm/common/accordion/accordion.module.mjs.map +1 -1
- package/dist/esm/common/accordion/accordion.types.mjs +1 -1
- package/dist/esm/common/accordion/accordion.types.mjs.map +1 -1
- package/dist/esm/common/actionButtons/actionButtons.mjs +1 -1
- package/dist/esm/common/actionButtons/actionButtons.mjs.map +1 -1
- package/dist/esm/common/actionIcon/actionIcon.mjs +1 -1
- package/dist/esm/common/actionIcon/actionIcon.mjs.map +1 -1
- package/dist/esm/common/actionIcon/actionIcon.module.mjs +1 -1
- package/dist/esm/common/actionIcon/actionIcon.module.mjs.map +1 -1
- package/dist/esm/common/alert/alert.mjs +1 -1
- package/dist/esm/common/alert/alert.mjs.map +1 -1
- package/dist/esm/common/alert/alert.module.mjs +1 -1
- package/dist/esm/common/alert/alert.module.mjs.map +1 -1
- package/dist/esm/common/animatedLogo/animatedLogo.mjs +1 -1
- package/dist/esm/common/animatedLogo/animatedLogo.mjs.map +1 -1
- package/dist/esm/common/avatar/avatar.mjs +1 -1
- package/dist/esm/common/avatar/avatar.mjs.map +1 -1
- package/dist/esm/common/badge/badge.mjs +1 -1
- package/dist/esm/common/badge/badge.mjs.map +1 -1
- package/dist/esm/common/badge/badge.module.mjs +1 -1
- package/dist/esm/common/badge/badge.module.mjs.map +1 -1
- package/dist/esm/common/badge/badge.types.mjs +1 -1
- package/dist/esm/common/badge/badge.types.mjs.map +1 -1
- package/dist/esm/common/bodyEnd/bodyEnd.mjs +1 -1
- package/dist/esm/common/bodyEnd/bodyEnd.mjs.map +1 -1
- package/dist/esm/common/breadcrumb/breadcrumb.mjs +1 -1
- package/dist/esm/common/breadcrumb/breadcrumb.mjs.map +1 -1
- package/dist/esm/common/breadcrumb/breadcrumb.module.mjs.map +1 -1
- package/dist/esm/common/button/button.mjs +1 -1
- package/dist/esm/common/button/button.mjs.map +1 -1
- package/dist/esm/common/button/button.module.mjs +1 -1
- package/dist/esm/common/button/button.module.mjs.map +1 -1
- package/dist/esm/common/button/button.types.mjs +1 -1
- package/dist/esm/common/button/button.types.mjs.map +1 -1
- package/dist/esm/common/calendar/calendar.mjs +1 -1
- package/dist/esm/common/calendar/calendar.mjs.map +1 -1
- package/dist/esm/common/calendar/calendar.module.mjs.map +1 -1
- package/dist/esm/common/calendar/calendar.types.mjs.map +1 -1
- package/dist/esm/common/calendar/components/agendaList/agendaList.mjs +1 -1
- package/dist/esm/common/calendar/components/agendaList/agendaList.mjs.map +1 -1
- package/dist/esm/common/calendar/components/agendaList/agendaList.module.mjs.map +1 -1
- package/dist/esm/common/calendar/components/calendarHeader/calendarHeader.mjs +1 -1
- package/dist/esm/common/calendar/components/calendarHeader/calendarHeader.mjs.map +1 -1
- package/dist/esm/common/calendar/components/calendarHeader/calendarHeader.module.mjs +1 -1
- package/dist/esm/common/calendar/components/calendarHeader/calendarHeader.module.mjs.map +1 -1
- package/dist/esm/common/calendar/components/compactMonth/compactMonth.mjs +1 -1
- package/dist/esm/common/calendar/components/compactMonth/compactMonth.mjs.map +1 -1
- package/dist/esm/common/calendar/components/compactMonth/compactMonth.module.mjs +1 -1
- package/dist/esm/common/calendar/components/compactMonth/compactMonth.module.mjs.map +1 -1
- package/dist/esm/common/calendar/components/monthView/monthView.mjs +1 -1
- package/dist/esm/common/calendar/components/monthView/monthView.mjs.map +1 -1
- package/dist/esm/common/calendar/components/monthView/monthView.module.mjs +1 -1
- package/dist/esm/common/calendar/components/monthView/monthView.module.mjs.map +1 -1
- package/dist/esm/common/calendar/components/timeGrid/timeGrid.mjs +1 -1
- package/dist/esm/common/calendar/components/timeGrid/timeGrid.mjs.map +1 -1
- package/dist/esm/common/calendar/components/timeGrid/timeGrid.module.mjs +1 -1
- package/dist/esm/common/calendar/components/timeGrid/timeGrid.module.mjs.map +1 -1
- package/dist/esm/common/calendar/dates.mjs +1 -1
- package/dist/esm/common/calendar/dates.mjs.map +1 -1
- package/dist/esm/common/calendar/format.mjs +1 -1
- package/dist/esm/common/calendar/format.mjs.map +1 -1
- package/dist/esm/common/calendar/layout.mjs +1 -1
- package/dist/esm/common/calendar/layout.mjs.map +1 -1
- package/dist/esm/common/calendar/useNow.mjs +2 -0
- package/dist/esm/common/calendar/useNow.mjs.map +1 -0
- package/dist/esm/common/card/Card.mjs +1 -1
- package/dist/esm/common/card/Card.mjs.map +1 -1
- package/dist/esm/common/card/CardActions.mjs +1 -1
- package/dist/esm/common/card/CardActions.mjs.map +1 -1
- package/dist/esm/common/card/CardHeader.mjs.map +1 -1
- package/dist/esm/common/card/card.module.mjs +1 -1
- package/dist/esm/common/card/card.module.mjs.map +1 -1
- package/dist/esm/common/card/card.types.mjs +1 -1
- package/dist/esm/common/card/card.types.mjs.map +1 -1
- package/dist/esm/common/carousel/carousel.mjs +1 -1
- package/dist/esm/common/carousel/carousel.mjs.map +1 -1
- package/dist/esm/common/carousel/carousel.module.mjs.map +1 -1
- package/dist/esm/common/chip/chip.mjs +1 -1
- package/dist/esm/common/chip/chip.mjs.map +1 -1
- package/dist/esm/common/chip/chip.module.mjs +1 -1
- package/dist/esm/common/chip/chip.module.mjs.map +1 -1
- package/dist/esm/common/chip/chip.types.mjs +1 -1
- package/dist/esm/common/chip/chip.types.mjs.map +1 -1
- package/dist/esm/common/colorPicker/colorPicker.mjs +1 -1
- package/dist/esm/common/colorPicker/colorPicker.mjs.map +1 -1
- package/dist/esm/common/colorPicker/colorPicker.module.mjs.map +1 -1
- package/dist/esm/common/confirmModal/confirmModal.mjs +1 -1
- package/dist/esm/common/confirmModal/confirmModal.mjs.map +1 -1
- package/dist/esm/common/copyButton/copyButton.mjs +1 -1
- package/dist/esm/common/copyButton/copyButton.mjs.map +1 -1
- package/dist/esm/common/copyButton/copyButton.module.mjs +1 -1
- package/dist/esm/common/copyButton/copyButton.module.mjs.map +1 -1
- package/dist/esm/common/errorBoundary/errorBoundary.mjs +2 -2
- package/dist/esm/common/errorBoundary/errorBoundary.mjs.map +1 -1
- package/dist/esm/common/fab/components/fabBase/fabBase.mjs +1 -1
- package/dist/esm/common/fab/components/fabBase/fabBase.mjs.map +1 -1
- package/dist/esm/common/fab/fab.mjs +1 -1
- package/dist/esm/common/fab/fab.mjs.map +1 -1
- package/dist/esm/common/flip/flip.mjs +1 -1
- package/dist/esm/common/flip/flip.mjs.map +1 -1
- package/dist/esm/common/klipyPicker/klipyPicker.mjs +1 -1
- package/dist/esm/common/klipyPicker/klipyPicker.mjs.map +1 -1
- package/dist/esm/common/modal/modal.mjs +1 -1
- package/dist/esm/common/modal/modal.mjs.map +1 -1
- package/dist/esm/common/modal/modal.module.mjs.map +1 -1
- package/dist/esm/common/numberInput/numberInput.mjs +1 -1
- package/dist/esm/common/numberInput/numberInput.mjs.map +1 -1
- package/dist/esm/common/numberInput/numberInput.module.mjs.map +1 -1
- package/dist/esm/common/popover/popover.mjs +1 -1
- package/dist/esm/common/popover/popover.mjs.map +1 -1
- package/dist/esm/common/progressBar/progressBar.mjs +1 -1
- package/dist/esm/common/progressBar/progressBar.mjs.map +1 -1
- package/dist/esm/common/progressBar/progressBar.module.mjs +1 -1
- package/dist/esm/common/progressBar/progressBar.module.mjs.map +1 -1
- package/dist/esm/common/roomDrawer/roomDrawer.mjs +1 -1
- package/dist/esm/common/roomDrawer/roomDrawer.mjs.map +1 -1
- package/dist/esm/common/roomDrawer/roomDrawer.module.mjs.map +1 -1
- package/dist/esm/common/sectionHeader/sectionHeader.mjs.map +1 -1
- package/dist/esm/common/splitButton/splitButton.mjs +1 -1
- package/dist/esm/common/splitButton/splitButton.mjs.map +1 -1
- package/dist/esm/common/styles/tone.mjs +4 -0
- package/dist/esm/common/styles/tone.mjs.map +1 -0
- package/dist/esm/common/styles/tone.module.mjs +2 -0
- package/dist/esm/common/styles/tone.module.mjs.map +1 -0
- package/dist/esm/common/themeProvider/color.types.mjs +2 -0
- package/dist/esm/common/themeProvider/color.types.mjs.map +1 -0
- package/dist/esm/common/themeProvider/defaultTheme.mjs +1 -1
- package/dist/esm/common/themeProvider/defaultTheme.mjs.map +1 -1
- package/dist/esm/common/tilt/tilt.mjs +1 -1
- package/dist/esm/common/tilt/tilt.mjs.map +1 -1
- package/dist/esm/common/timeInput/timeInput.mjs +1 -1
- package/dist/esm/common/timeInput/timeInput.mjs.map +1 -1
- package/dist/esm/common/timeline/timeline.mjs +1 -1
- package/dist/esm/common/timeline/timeline.mjs.map +1 -1
- package/dist/esm/common/timeline/timeline.module.mjs +1 -1
- package/dist/esm/common/timeline/timeline.module.mjs.map +1 -1
- package/dist/esm/common/timeline/timeline.types.mjs +1 -1
- package/dist/esm/common/timeline/timeline.types.mjs.map +1 -1
- package/dist/esm/common/timer/timer.mjs +1 -1
- package/dist/esm/common/timer/timer.mjs.map +1 -1
- package/dist/esm/common/timer/timer.module.mjs +1 -1
- package/dist/esm/common/timer/timer.module.mjs.map +1 -1
- package/dist/esm/common/toast/toast.mjs +1 -1
- package/dist/esm/common/toast/toast.mjs.map +1 -1
- package/dist/esm/common/toast/toast.module.mjs +1 -1
- package/dist/esm/common/toast/toast.module.mjs.map +1 -1
- package/dist/esm/common/toast/toastHost.mjs +1 -1
- package/dist/esm/common/toast/toastHost.mjs.map +1 -1
- package/dist/esm/common/utils/dismissClick.mjs +2 -0
- package/dist/esm/common/utils/dismissClick.mjs.map +1 -0
- package/dist/esm/common/utils/isDev.mjs +2 -0
- package/dist/esm/common/utils/isDev.mjs.map +1 -0
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/services/formValidation/FormValidatorGroupWithForm.mjs +1 -1
- package/dist/esm/services/formValidation/FormValidatorGroupWithForm.mjs.map +1 -1
- package/dist/index.cjs +5 -3
- package/dist/index.cjs.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types/common/accordion/accordion.types.d.ts +17 -2
- package/dist/types/common/actionButtons/actionButtons.types.d.ts +7 -1
- package/dist/types/common/actionIcon/actionIcon.d.ts +1 -1
- package/dist/types/common/actionIcon/actionIcon.types.d.ts +7 -9
- package/dist/types/common/alert/alert.types.d.ts +6 -8
- package/dist/types/common/animatedLogo/animatedLogo.types.d.ts +3 -2
- package/dist/types/common/badge/badge.types.d.ts +10 -6
- package/dist/types/common/button/button.types.d.ts +14 -4
- package/dist/types/common/calendar/calendar.types.d.ts +25 -10
- package/dist/types/common/calendar/components/agendaList/agendaList.d.ts +1 -1
- package/dist/types/common/calendar/components/agendaList/agendaList.types.d.ts +3 -0
- package/dist/types/common/calendar/components/calendarHeader/calendarHeader.d.ts +1 -1
- package/dist/types/common/calendar/components/calendarHeader/calendarHeader.types.d.ts +2 -0
- package/dist/types/common/calendar/components/compactMonth/compactMonth.d.ts +1 -1
- package/dist/types/common/calendar/components/monthView/monthView.d.ts +1 -1
- package/dist/types/common/calendar/components/monthView/monthView.types.d.ts +3 -2
- package/dist/types/common/calendar/components/timeGrid/timeGrid.d.ts +1 -1
- package/dist/types/common/calendar/components/timeGrid/timeGrid.types.d.ts +9 -1
- package/dist/types/common/calendar/dates.d.ts +21 -5
- package/dist/types/common/calendar/format.d.ts +3 -2
- package/dist/types/common/calendar/layout.d.ts +5 -0
- package/dist/types/common/calendar/useNow.d.ts +4 -0
- package/dist/types/common/calendar/view.types.d.ts +9 -2
- package/dist/types/common/card/card.types.d.ts +16 -2
- package/dist/types/common/chip/chip.types.d.ts +10 -5
- package/dist/types/common/copyButton/copyButton.types.d.ts +5 -4
- package/dist/types/common/fab/components/fabBase/fabBase.d.ts +1 -1
- package/dist/types/common/fab/components/fabBase/fabBase.types.d.ts +2 -1
- package/dist/types/common/progressBar/progressBar.d.ts +0 -1
- package/dist/types/common/progressBar/progressBar.types.d.ts +3 -1
- package/dist/types/common/splitButton/splitButton.types.d.ts +4 -1
- package/dist/types/common/styles/tone.d.ts +11 -0
- package/dist/types/common/themeProvider/color.types.d.ts +20 -0
- package/dist/types/common/themeProvider/index.d.ts +2 -0
- package/dist/types/common/themeProvider/theme.types.d.ts +3 -6
- package/dist/types/common/timeline/timeline.types.d.ts +3 -10
- package/dist/types/common/toast/index.d.ts +1 -1
- package/dist/types/common/toast/toast.types.d.ts +7 -3
- package/dist/types/common/types/actions.types.d.ts +1 -1
- package/dist/types/common/utils/dismissClick.d.ts +4 -0
- package/dist/types/common/utils/isDev.d.ts +1 -0
- package/docs/Accordion.md +74 -5
- package/docs/ActionButtons.md +6 -3
- package/docs/ActionIcon.md +39 -14
- package/docs/Alert.md +27 -17
- package/docs/AnimatedLogo.md +1 -1
- package/docs/Badge.md +24 -7
- package/docs/Button.md +98 -40
- package/docs/ButtonGroup.md +18 -18
- package/docs/CLAUDE.md +21 -11
- package/docs/Calendar.md +35 -17
- package/docs/Card.md +53 -14
- package/docs/Chip.md +24 -9
- package/docs/ConfigProvider.md +3 -3
- package/docs/CopyButton.md +6 -5
- package/docs/ProgressBar.md +7 -4
- package/docs/SectionHeader.md +1 -1
- package/docs/SplitButton.md +6 -5
- package/docs/ThemeColor.md +103 -0
- package/docs/ThemeProvider.md +5 -5
- package/docs/Timeline.md +18 -9
- package/docs/Toast.md +25 -11
- package/package.json +3 -2
- package/dist/esm/common/accordion/accordion.plain.module.mjs +0 -2
- package/dist/esm/common/accordion/accordion.plain.module.mjs.map +0 -1
- package/dist/esm/common/accordion/accordion.primary.module.mjs +0 -2
- package/dist/esm/common/accordion/accordion.primary.module.mjs.map +0 -1
- package/dist/esm/common/alert/alert.types.mjs +0 -2
- package/dist/esm/common/alert/alert.types.mjs.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{renderIcon as e}from"../../../utils/renderIcon.mjs";import{dateToDay as t}from"../../../utils/day.mjs";import{CalendarView as n}from"../../calendar.types.mjs";import{MINUTES_PER_DAY as r,addDays as i,atMinutes as a,dayDiff as o,endAfter as s,isSameDay as c,minutesOfDay as l,periodRange as u,shownDays as d,stepDate as ee}from"../../dates.mjs";import{formatClockRange as te,formatDayNumber as ne,formatHour as re,formatLongDate as ie,formatTimeRange as ae,formatWeekday as oe}from"../../format.mjs";import{eventEnd as f,isAllDayLike as se,limitLanes as ce,packDay as le,packLanes as ue}from"../../layout.mjs";import{clamp as p,pageStep as de,snap as fe}from"../../gesture.mjs";import{useGestures as pe}from"../../useGestures.mjs";import{usePager as me}from"../../usePager.mjs";import m from"../../pager.module.mjs";import h from"./timeGrid.module.mjs";import{useEffect as he,useLayoutEffect as ge,useRef as g,useState as _}from"react";import v from"classnames";import{faChevronDown as _e}from"@fortawesome/free-solid-svg-icons";import{Fragment as ve,jsx as y,jsxs as b}from"react/jsx-runtime";var ye=[-1,0,1],be=Array.from({length:23},(e,t)=>t+1),xe=3,Se=45,Ce=7,x=4;function we(){let[e,t]=_(()=>new Date);return he(()=>{let e;function n(){e=setTimeout(()=>{t(new Date),n()},6e4-Date.now()%6e4)}return n(),()=>clearTimeout(e)},[]),e}function Te({scroller:e,head:t,body:n},r,i,a,o){let s=r.current?.base??n.getBoundingClientRect().height/24;if(!s)return;let c=Math.max((e.clientHeight-t.offsetHeight)/24,1),l=p(i,Math.min(c,s),s*x);r.current={hour:l,base:s},e.style.setProperty(`--custom-calendar-hour-height`,`${l}px`);let u=e.getBoundingClientRect().top;e.scrollTop=n.offsetTop+a*l-(o-u)}function S({events:x,date:S,view:C,locale:w,weekStartsOn:Ee,slotMinutes:T,hidden:E,scrollToHour:De,text:D,onDateChange:Oe,onOpenDay:O,onEventClick:k,onEventChange:A,onSlotCreate:j,renderEvent:M,classNames:N,slotStyles:P,zoomRef:F}){let I=g(null),L=g(null),R=g(null),z=g(null),B=g(null),ke=g(null),V=g(x),H=g(null),[U,Ae]=_(null),[W,je]=_(!1),G=we(),K=C===n.Day?1:7,q=u(C,S,Ee).start,J=d(q,K,E),Me=U?V.current:x,Y=me(t(q),e=>Oe(ee(C,S,e,E)),()=>I.current);function X(){let e=I.current,t=L.current,n=R.current;return e&&t&&n?{scroller:e,head:t,body:n}:null}ge(()=>{let e=I.current,t=R.current;if(!e||!t)return;let n=t.offsetHeight/24;if(!n)return;let r=new Date,i=J.some(e=>c(e,r)),a=De??(i?Math.max(0,l(r)/60-1):Ce);e.scrollTop=p(a,0,24)*n},[]),he(()=>{let e=I.current;if(!e)return;function t(e){if(!e.ctrlKey)return;let t=X();if(!t)return;e.preventDefault();let n=t.body.getBoundingClientRect(),r=n.height/24;r&&Te(t,F,r*Math.exp(-e.deltaY*.01),(e.clientY-n.top)/r,e.clientY)}return e.addEventListener(`wheel`,t,{passive:!1}),()=>e.removeEventListener(`wheel`,t)},[F]);function Ne(e){let t=z.current;if(!t)return null;let n=t.getBoundingClientRect();if(!n.width||!n.height)return null;let i=p(Math.floor((e.x-n.left)/n.width*J.length),0,J.length-1);return{day:o(q,J[i]),minutes:p((e.y-n.top)/n.height*r,0,r)}}function Pe(e){return o(q,e)*r+l(e)}function Z(e,t){let n=Ne(t);if(!n)return null;let o=K*r;if(e.kind===`create`){let t=Math.floor(e.anchor/T)*T,[o,c]=n.minutes>=t?[t,Math.max(Math.ceil(n.minutes/T)*T,t+T)]:[Math.floor(n.minutes/T)*T,t+T],l=i(q,e.day),u=a(l,o);return{start:u,end:s(u,a(l,Math.min(c,r)),c-o)}}let c=n.day*r+n.minutes,l=Pe(e.event.start);if(e.kind===`move`){let t=p(fe(c-e.grab,T),Math.min(l,0),o-T),n=a(q,t),r=f(e.event).getTime()-e.event.start.getTime();return{start:n,end:new Date(n.getTime()+r)}}let u=p(fe(c,T),l+T,Math.max(o,l+T)),d=e.event.start;return{start:d,end:s(d,a(q,u),u-l)}}function Q(e){B.current=e,Ae(e)}function Fe(e){return x.find(t=>String(t.id)===e.dataset.calEvent)}pe(I,{onPress:Y.finish,canSwipe:()=>!0,onSwipeMove:Y.move,onSwipeEnd:(e,t)=>Y.settle(de(e,Y.width(),t)),dragFrom:(e,t)=>{if(!z.current?.contains(e))return null;let n=Ne(t);if(!n)return null;let a=e.closest(`[data-cal-event]`);if(a){let t=A?Fe(a):void 0;if(!t||t.readOnly)return null;let i={start:t.start,end:f(t)};return e.closest(`[data-cal-resize]`)?{kind:`resize`,event:t,...i}:{kind:`move`,event:t,grab:n.day*r+n.minutes-Pe(t.start),...i}}if(!j)return null;let o=i(q,n.day);return{kind:`create`,day:n.day,anchor:n.minutes,start:o,end:o}},onDragStart:(e,t)=>{V.current=x,Q({...e,...Z(e,t)})},onDragMove:e=>{let t=B.current,n=t&&Z(t,e);t&&n&&(n.start.getTime()!==t.start.getTime()||n.end.getTime()!==t.end.getTime())&&Q({...t,...n})},onDragEnd:e=>{let t=B.current;if(Q(null),!t)return;let{start:n,end:r}=Z(t,e)??t;if(t.kind===`create`){j?.({start:n,end:r,allDay:!1},Le(t.day,n,r));return}(n.getTime()!==t.event.start.getTime()||r.getTime()!==f(t.event).getTime())&&A?.({event:t.event,start:n,end:r})},onDragCancel:()=>Q(null),onPinchStart:(e,t)=>{let n=R.current;if(!n)return;let r=n.getBoundingClientRect(),i=r.height/24;i&&(H.current={hour:i,anchorHour:(e.y-r.top)/i,distance:t})},onPinchMove:(e,t)=>{let n=H.current,r=X();n&&r&&n.distance&&Te(r,F,n.hour*t/n.distance,n.anchorHour,e.y)},onPinchEnd:()=>{H.current=null},autoScroll:()=>{let e=I.current,t=L.current;if(!e||!t)return null;let n=e.getBoundingClientRect();return{element:e,top:n.top+t.offsetHeight,bottom:n.bottom}}});function Ie(e,t){if(!j||e.target.closest(`[data-cal-event]`))return;let n=e.currentTarget.getBoundingClientRect();if(!n.height)return;let i=(e.clientY-n.top)/n.height*r,s=p(Math.floor(i/T)*T,0,r-T),c=a(t,s),l=new Date(c.getTime()+Math.max(60,T)*6e4),u=a(t,r),d={start:c,end:l<u?l:u,allDay:!1};j(d,Le(o(q,t),d.start,d.end))}function Le(e,t,n){let a=ke.current;if(!a)return I.current;let s=i(q,e+1),c=l(t),u=n>=s?r:l(n),d=Math.max(J.findIndex(t=>o(q,t)===e),0);return a.style.left=`${d/J.length*100}%`,a.style.width=`${100/J.length}%`,a.style.top=`${c/r*100}%`,a.style.height=`${Math.max(u-c,0)/r*100}%`,a}function Re(e){let{event:t}=e;return y(`button`,{type:`button`,"data-cal-event":String(t.id),className:v(h.timeGridBar,e.continuesBefore&&h.timeGridBarContinuesBefore,e.continuesAfter&&h.timeGridBarContinuesAfter,N?.event),style:{"--event-color":t.color,gridColumn:`${e.start+1} / span ${e.span}`,gridRow:e.lane+1,...P?.event},"aria-label":`${t.title}, ${D.allDay}`,onClick:e=>k?.(t,e.currentTarget),children:y(`span`,{className:h.timeGridBarTitle,"aria-hidden":!0,children:M?M(t,{singleLine:!0}):t.title})},t.id)}function ze(e){let{event:t}=e,n=e.bottom-e.top,i=n<Se,a=ae(t.start,f(t),w),o=!!A&&!t.readOnly&&!e.continuesAfter,s=U&&U.kind!==`create`&&U.event===t;return b(`button`,{type:`button`,"data-cal-event":String(t.id),"aria-label":`${t.title}, ${a}`,className:v(h.timeGridEvent,i&&h.timeGridEventShort,n<15&&h.timeGridEventBrief,e.continuesBefore&&h.timeGridEventContinuesBefore,e.continuesAfter&&h.timeGridEventContinuesAfter,(k||o)&&h.timeGridEventInteractive,s&&h.timeGridEventDragged,N?.event),style:{"--event-color":t.color,top:`${e.top/r*100}%`,"--span":`${n/r*100}%`,left:`calc(var(--column-width) * ${e.column/e.columns})`,width:`calc(var(--column-width) * ${e.span/e.columns})`,...P?.event},onClick:e=>k?.(t,e.currentTarget),children:[y(`span`,{className:h.timeGridEventTitle,"aria-hidden":!0,children:M?M(t,{singleLine:i}):t.title}),y(`span`,{className:h.timeGridEventTime,"aria-hidden":!0,children:te(t.start,f(t),w)}),o&&y(`span`,{"data-cal-resize":!0,className:h.timeGridResize,"aria-hidden":!0})]},t.id)}function Be(e){if(!U)return null;let t=e,n=i(e,1);if(U.end<=t&&U.start<t||U.start>=n)return null;let a=U.start<t?0:l(U.start),o=U.end>=n?r:l(U.end),s=U.kind===`create`?void 0:U.event.color,c=U.kind===`create`?null:U.event.title;return b(`div`,{className:h.timeGridPreview,style:{"--event-color":s,top:`${a/r*100}%`,height:`${Math.max(o-a,15)/r*100}%`},"aria-hidden":!0,children:[c&&y(`span`,{className:h.timeGridEventTitle,children:c}),y(`span`,{className:h.timeGridPreviewTime,children:te(U.start,U.end,w)})]})}let $=ye.map(e=>{let t=u(C,ee(C,S,e,E),Ee).start,n=d(t,K,E),r=ue(Me,n,se);return{step:e,start:t,dates:n,lanes:W?{visible:r,moreLane:0,hidden:n.map(()=>0)}:ce(r,n.length,xe)}}),Ve=$[1].lanes.hidden.some(e=>e>0),He=e=>v(m.pagerPane,e===-1&&m.pagerPanePrev,e===1&&m.pagerPaneNext);return b(`div`,{ref:I,tabIndex:-1,className:h.timeGrid,style:{"--days":J.length,"--custom-calendar-hour-height":F.current?`${F.current.hour}px`:void 0},children:[b(`div`,{ref:L,className:h.timeGridHead,children:[y(`div`,{className:h.timeGridCorner,children:(Ve||W)&&y(`button`,{type:`button`,className:v(h.timeGridToggle,W&&h.timeGridToggleOpen),"aria-label":D.allDay,"aria-expanded":W,onClick:()=>je(e=>!e),children:e(_e)})}),y(`div`,{className:m.pagerViewport,children:y(`div`,{ref:Y.trackRef,className:m.pagerTrack,children:$.map(({step:e,start:n,dates:r,lanes:i})=>b(`div`,{className:v(He(e),h.timeGridHeadPane),inert:e!==0,"aria-hidden":e!==0||void 0,children:[r.map(e=>{let n=c(e,G),r=b(ve,{children:[y(`span`,{className:h.timeGridWeekday,children:oe(e,w,`short`)}),y(`span`,{className:v(h.timeGridDayNumber,n&&h.timeGridDayNumberToday),children:ne(e,w)})]}),i={className:v(h.timeGridDayHeader,N?.dayHeader),style:P?.dayHeader,"aria-current":n?`date`:void 0};return K>1&&O?y(`button`,{type:`button`,...i,className:v(i.className,h.timeGridDayHeaderLink),"aria-label":ie(e,w),onClick:()=>O(e),children:r},t(e)):y(`div`,{...i,children:r},t(e))}),b(`div`,{className:h.timeGridAllDay,"aria-label":D.allDay,role:`group`,children:[i.visible.map(Re),i.hidden.map((e,t)=>e>0&&y(`div`,{"aria-hidden":!0,className:h.timeGridMore,style:{gridColumn:t+1,gridRow:i.moreLane+1},onClick:()=>je(!0),children:D.more(e)},`more-${t}`))]})]},t(n)))})})]}),b(`div`,{ref:R,className:h.timeGridBody,children:[y(`div`,{className:h.timeGridGutter,"aria-hidden":!0,children:be.map(e=>y(`span`,{className:h.timeGridHour,style:{top:`${e/24*100}%`},children:re(e,w)},e))}),y(`div`,{className:m.pagerViewport,children:y(`div`,{ref:Y.trackRef,className:m.pagerTrack,children:$.map(({step:e,start:n,dates:r})=>b(`div`,{ref:e===0?z:void 0,className:v(He(e),h.timeGridBodyPane),inert:e!==0,"aria-hidden":e!==0||void 0,children:[r.map(n=>{let r=c(n,G);return b(`div`,{role:`group`,"aria-label":ie(n,w),"data-cal-column":t(n),className:v(h.timeGridColumn,r&&h.timeGridColumnToday,j&&h.timeGridColumnCreatable,N?.cell),style:P?.cell,onClick:e=>Ie(e,n),children:[le(Me,n).map(ze),r&&y(`div`,{className:h.timeGridNow,style:{top:`${l(G)/1440*100}%`},"aria-hidden":!0}),e===0&&Be(n)]},t(n))}),e===0&&y(`div`,{ref:ke,className:h.timeGridSlot,"aria-hidden":!0})]},t(n)))})})]})]})}export{S as default};
|
|
1
|
+
"use client";import{cssColor as e}from"../../../styles/tone.mjs";import t from"../../../actionIcon/actionIcon.mjs";import{isDismissClick as n}from"../../../utils/dismissClick.mjs";import{dateToDay as r}from"../../../utils/day.mjs";import{MINUTES_PER_DAY as i,addDays as a,allDaySlot as o,atMinutes as s,dayDiff as c,endAfter as l,isSameDay as u,minutesOfDay as d,periodRange as f,shownDays as ee,stepDate as te,weekNumber as ne}from"../../dates.mjs";import{formatClockRange as re,formatDayNumber as ie,formatHour as ae,formatLongDate as oe,formatTimeRange as se,formatWeekday as ce}from"../../format.mjs";import{useNow as le}from"../../useNow.mjs";import{eventEnd as p,isAllDayLike as ue,limitLanes as de,moveByDays as fe,packDay as pe,packLanes as me}from"../../layout.mjs";import{clamp as m,pageStep as he,snap as ge}from"../../gesture.mjs";import{useGestures as _e}from"../../useGestures.mjs";import{usePager as ve}from"../../usePager.mjs";import h from"../../pager.module.mjs";import g from"./timeGrid.module.mjs";import{useEffect as ye,useLayoutEffect as be,useRef as _,useState as xe}from"react";import v from"classnames";import{faChevronDown as Se}from"@fortawesome/free-solid-svg-icons";import{Fragment as Ce,jsx as y,jsxs as b}from"react/jsx-runtime";var we=[-1,0,1],Te=Array.from({length:23},(e,t)=>t+1),Ee=3,De=45,Oe=7,x=4;function ke({scroller:e,head:t,body:n},r,i,a,o){let s=r.current?.base??n.getBoundingClientRect().height/24;if(!s)return;let c=Math.max((e.clientHeight-t.offsetHeight)/24,1),l=m(i,Math.min(c,s),s*x);r.current={hour:l,base:s},e.style.setProperty(`--custom-calendar-hour-height`,`${l}px`);let u=e.getBoundingClientRect().top;e.scrollTop=n.offsetTop+a*l-(o-u)}function S({events:x,date:S,period:C,locale:w,weekStartsOn:Ae,slotMinutes:T,hidden:E,scrollToHour:je,workingHours:Me,showWeekNumbers:Ne,text:D,onDateChange:Pe,onOpenDay:Fe,onEventClick:O,onEventChange:k,onSlotCreate:A,renderEvent:j,eventClassName:Ie,classNames:M,slotStyles:N,zoomRef:P}){let F=_(null),I=_(null),L=_(null),R=_(null),z=_(null),B=_(null),Le=_(null),Re=_(x),V=_(null),[H,ze]=xe(null),[U,Be]=xe(!1),W=le(),G=f(C,S,Ae,E),K=G.start,Ve=c(G.start,G.end),q=ee(K,Ve,E),He=H?Re.current:x,J=ve(r(K),e=>Pe(te(C,S,e,E)),()=>F.current);function Ue(){let e=F.current,t=I.current,n=L.current;return e&&t&&n?{scroller:e,head:t,body:n}:null}be(()=>{let e=F.current,t=L.current;if(!e||!t)return;let n=t.offsetHeight/24;if(!n)return;let r=q.some(e=>u(e,W)),i=je??(r?Math.max(0,d(W)/60-1):Me?.[0]??Oe);e.scrollTop=m(i,0,24)*n},[]),ye(()=>{let e=F.current;if(!e)return;function t(e){if(!e.ctrlKey)return;let t=Ue();if(!t)return;e.preventDefault();let n=t.body.getBoundingClientRect(),r=n.height/24;r&&ke(t,P,r*Math.exp(-e.deltaY*.01),(e.clientY-n.top)/r,e.clientY)}return e.addEventListener(`wheel`,t,{passive:!1}),()=>e.removeEventListener(`wheel`,t)},[P]);function Y(e,t){let n=m(Math.floor((e-t.left)/t.width*q.length),0,q.length-1);return c(K,q[n])}function We(e){let t=R.current;if(!t)return null;let n=t.getBoundingClientRect();return!n.width||!n.height?null:{day:Y(e.x,n),minutes:m((e.y-n.top)/n.height*i,0,i)}}function Ge(e){let t=z.current?.getBoundingClientRect();return t?.width?Y(e.x,t):null}function Ke({event:e,grabbed:t},n){if(e)return fe(e,n-t);let{start:r,end:i}=o(a(K,t),a(K,n));return{start:r,end:i}}function qe(e){return c(K,e)*i+d(e)}function X(e,t){if(e.kind===`allDay`){let n=Ge(t);return n===null?null:Ke(e,n)}let n=We(t);if(!n)return null;let r=Ve*i;if(e.kind===`create`){let t=Math.floor(e.anchor/T)*T,[r,o]=n.minutes>=t?[t,Math.max(Math.ceil(n.minutes/T)*T,t+T)]:[Math.floor(n.minutes/T)*T,t+T],c=a(K,e.day),u=s(c,r);return{start:u,end:l(u,s(c,Math.min(o,i)),o-r)}}let o=n.day*i+n.minutes,c=qe(e.event.start);if(e.kind===`move`){let t=m(ge(o-e.grab,T),Math.min(c,0),r-T),n=s(K,t),i=p(e.event).getTime()-e.event.start.getTime();return{start:n,end:new Date(n.getTime()+i)}}let u=m(ge(o,T),c+T,Math.max(r,c+T)),d=e.event.start;return{start:d,end:l(d,s(K,u),u-c)}}function Z(e){B.current=e,ze(e)}function Je(e){return x.find(t=>String(t.id)===e.dataset.calEvent)}_e(F,{onPress:J.finish,canSwipe:()=>!0,onSwipeMove:J.move,onSwipeEnd:(e,t)=>J.settle(he(e,J.width(),t)),dragFrom:(e,t)=>{if(z.current?.contains(e))return Ye(e,t);if(!R.current?.contains(e))return null;let n=We(t);if(!n)return null;let r=e.closest(`[data-cal-event]`);if(r){let t=k?Je(r):void 0;if(!t||t.readOnly)return null;let a={start:t.start,end:p(t)};return e.closest(`[data-cal-resize]`)?{kind:`resize`,event:t,...a}:{kind:`move`,event:t,grab:n.day*i+n.minutes-qe(t.start),...a}}if(!A)return null;let o=a(K,n.day);return{kind:`create`,day:n.day,anchor:n.minutes,start:o,end:o}},onDragStart:(e,t)=>{Re.current=x,Z({...e,...X(e,t)})},onDragMove:e=>{let t=B.current,n=t&&X(t,e);t&&n&&(n.start.getTime()!==t.start.getTime()||n.end.getTime()!==t.end.getTime())&&Z({...t,...n})},onDragEnd:e=>{let t=B.current;if(Z(null),!t)return;let{start:n,end:r}=X(t,e)??t;if(t.kind===`create`){A?.({start:n,end:r,allDay:!1},$e(t.day,n,r));return}let{event:i}=t;if(!i){A?.({start:n,end:r,allDay:!0},Xe(n));return}(n.getTime()!==i.start.getTime()||r.getTime()!==p(i).getTime())&&k?.({event:i,start:n,end:r})},onDragCancel:()=>Z(null),onPinchStart:(e,t)=>{let n=L.current;if(!n)return;let r=n.getBoundingClientRect(),i=r.height/24;i&&(V.current={hour:i,anchorHour:(e.y-r.top)/i,distance:t})},onPinchMove:(e,t)=>{let n=V.current,r=Ue();n&&r&&n.distance&&ke(r,P,n.hour*t/n.distance,n.anchorHour,e.y)},onPinchEnd:()=>{V.current=null},autoScroll:()=>{let e=F.current,t=I.current;if(!e||!t||B.current?.kind===`allDay`)return null;let n=e.getBoundingClientRect();return{element:e,top:n.top+t.offsetHeight,bottom:n.bottom}}});function Ye(e,t){let n=Ge(t);if(n===null||e.closest(`[data-cal-more]`))return null;let r=e.closest(`[data-cal-event]`);if(r){let e=k?Je(r):void 0;return!e||e.readOnly?null:{kind:`allDay`,event:e,grabbed:n,start:e.start,end:p(e)}}if(!A)return null;let{start:i,end:s}=o(a(K,n));return{kind:`allDay`,event:null,grabbed:n,start:i,end:s}}function Xe(e){return I.current?.querySelector(`[data-cal-head-day="${r(e)}"]`)??F.current}function Ze(e){if(!A||n(e.nativeEvent)||e.target.closest(`[data-cal-event], [data-cal-more]`))return;let t=e.currentTarget.getBoundingClientRect();if(!t.width)return;let r=a(K,Y(e.clientX,t));A(o(r),Xe(r))}function Qe(e,t){if(!A||n(e.nativeEvent)||e.target.closest(`[data-cal-event]`))return;let r=e.currentTarget.getBoundingClientRect();if(!r.height)return;let a=(e.clientY-r.top)/r.height*i,o=m(Math.floor(a/T)*T,0,i-T),l=s(t,o),u=new Date(l.getTime()+Math.max(60,T)*6e4),d=s(t,i),f={start:l,end:u<d?u:d,allDay:!1};A(f,$e(c(K,t),f.start,f.end))}function $e(e,t,n){let r=Le.current;if(!r)return F.current;let o=a(K,e+1),s=d(t),l=n>=o?i:d(n),u=Math.max(q.findIndex(t=>c(K,t)===e),0);return r.style.left=`${u/q.length*100}%`,r.style.width=`${100/q.length}%`,r.style.top=`${s/i*100}%`,r.style.height=`${Math.max(l-s,0)/i*100}%`,r}function et(t){let{event:n}=t;return y(`button`,{type:`button`,"data-cal-event":String(n.id),className:v(g.timeGridBar,t.continuesBefore&&g.timeGridBarContinuesBefore,t.continuesAfter&&g.timeGridBarContinuesAfter,H?.kind===`allDay`&&H.event===n&&g.timeGridBarDragged,M?.event,Ie?.(n)),style:{"--event-color":n.color&&e(n.color),gridColumn:`${t.start+1} / span ${t.span}`,gridRow:t.lane+1,...N?.event},"aria-label":`${n.title}, ${D.allDay}`,onClick:e=>O?.(n,e.currentTarget),children:y(`span`,{className:g.timeGridBarTitle,"aria-hidden":!0,children:j?j(n,{singleLine:!0}):n.title})},n.id)}function tt(t){let{event:n}=t,r=t.bottom-t.top,a=r<De,o=se(n.start,p(n),w),s=!!k&&!n.readOnly&&!t.continuesAfter,c=H&&H.kind!==`create`&&H.event===n;return b(`button`,{type:`button`,"data-cal-event":String(n.id),"aria-label":`${n.title}, ${o}`,className:v(g.timeGridEvent,a&&g.timeGridEventShort,r<15&&g.timeGridEventBrief,t.continuesBefore&&g.timeGridEventContinuesBefore,t.continuesAfter&&g.timeGridEventContinuesAfter,(O||s)&&g.timeGridEventInteractive,c&&g.timeGridEventDragged,M?.event,Ie?.(n)),style:{"--event-color":n.color&&e(n.color),top:`${t.top/i*100}%`,"--span":`${r/i*100}%`,left:`calc(var(--column-width) * ${t.column/t.columns})`,width:`calc(var(--column-width) * ${t.span/t.columns})`,...N?.event},onClick:e=>O?.(n,e.currentTarget),children:[y(`span`,{className:g.timeGridEventTitle,"aria-hidden":!0,children:j?j(n,{singleLine:a}):n.title}),y(`span`,{className:g.timeGridEventTime,"aria-hidden":!0,children:re(n.start,p(n),w)}),s&&y(`span`,{"data-cal-resize":!0,className:g.timeGridResize,"aria-hidden":!0})]},n.id)}function nt(t){if(!H||H.kind===`allDay`)return null;let n=t,r=a(t,1);if(H.end<=n&&H.start<n||H.start>=r)return null;let o=H.start<n?0:d(H.start),s=H.end>=r?i:d(H.end),c=H.kind===`create`?void 0:H.event.color,l=H.kind===`create`?null:H.event.title;return b(`div`,{className:g.timeGridPreview,style:{"--event-color":c&&e(c),top:`${o/i*100}%`,height:`${Math.max(s-o,15)/i*100}%`},"aria-hidden":!0,children:[l&&y(`span`,{className:g.timeGridEventTitle,children:l}),y(`span`,{className:g.timeGridPreviewTime,children:re(H.start,H.end,w)})]})}function rt(t){if(H?.kind!==`allDay`)return null;let n={id:``,title:``,allDay:!0,...H.event,start:H.start,end:H.end},[r]=me([n],t);return r?y(`div`,{className:v(g.timeGridBar,g.timeGridBarPreview),style:{"--event-color":H.event?.color&&e(H.event.color),gridColumn:`${r.start+1} / span ${r.span}`,gridRow:1},"aria-hidden":!0,children:y(`span`,{className:g.timeGridBarTitle,children:H.event?.title})}):null}let Q=we.map(e=>{let t=f(C,te(C,S,e,E),Ae,E),n=t.start,r=ee(n,c(n,t.end),E),i=me(He,r,ue);return{step:e,start:n,dates:r,lanes:U?{visible:i,moreLane:0,hidden:r.map(()=>0)}:de(i,r.length,Ee)}}),it=Q[1].lanes.hidden.some(e=>e>0),$=Me?.map(e=>m(e,0,24)/24*100),at=$!==void 0&&$[0]>$[1],ot=e=>v(h.pagerPane,e===-1&&h.pagerPanePrev,e===1&&h.pagerPaneNext);return b(`div`,{ref:F,tabIndex:-1,className:g.timeGrid,style:{"--days":q.length,"--custom-calendar-hour-height":P.current?`${P.current.hour}px`:void 0,"--work-start":$&&`${Math.min(...$)}%`,"--work-end":$&&`${Math.max(...$)}%`},children:[b(`div`,{ref:I,className:g.timeGridHead,children:[b(`div`,{className:g.timeGridCorner,children:[Ne&&y(`span`,{className:g.timeGridWeekNumber,children:D.weekNumber(ne(q[Math.floor(q.length/2)]))}),(it||U)&&y(t,{className:v(g.timeGridToggle,U&&g.timeGridToggleOpen),icon:Se,title:D.allDay,"aria-label":D.allDay,"aria-expanded":U,onClick:()=>Be(e=>!e)})]}),y(`div`,{className:h.pagerViewport,children:y(`div`,{ref:J.trackRef,className:h.pagerTrack,children:Q.map(({step:e,start:t,dates:n,lanes:i})=>b(`div`,{className:v(ot(e),g.timeGridHeadPane),inert:e!==0,"aria-hidden":e!==0||void 0,children:[n.map(e=>{let t=u(e,W),n=b(Ce,{children:[y(`span`,{className:g.timeGridWeekday,children:ce(e,w,`short`)}),y(`span`,{className:v(g.timeGridDayNumber,t&&g.timeGridDayNumberToday),children:ie(e,w)})]}),i={className:v(g.timeGridDayHeader,M?.dayHeader),style:N?.dayHeader,"aria-current":t?`date`:void 0,"data-cal-head-day":r(e)};return q.length>1&&Fe?y(`button`,{type:`button`,...i,className:v(i.className,g.timeGridDayHeaderLink),"aria-label":oe(e,w),onClick:()=>Fe(e),children:n},r(e)):y(`div`,{...i,children:n},r(e))}),b(`div`,{ref:e===0?z:void 0,className:v(g.timeGridAllDay,A&&g.timeGridAllDayCreatable),"aria-label":D.allDay,role:`group`,onClick:Ze,children:[i.visible.map(et),i.hidden.map((e,t)=>e>0&&y(`div`,{"aria-hidden":!0,"data-cal-more":!0,className:g.timeGridMore,style:{gridColumn:t+1,gridRow:i.moreLane+1},onClick:()=>Be(!0),children:D.more(e)},`more-${t}`)),e===0&&rt(n)]})]},r(t)))})})]}),b(`div`,{ref:L,className:g.timeGridBody,children:[y(`div`,{className:g.timeGridGutter,"aria-hidden":!0,children:Te.map(e=>y(`span`,{className:g.timeGridHour,style:{top:`${e/24*100}%`},children:ae(e,w)},e))}),y(`div`,{className:h.pagerViewport,children:y(`div`,{ref:J.trackRef,className:h.pagerTrack,children:Q.map(({step:e,start:t,dates:n})=>b(`div`,{ref:e===0?R:void 0,className:v(ot(e),g.timeGridBodyPane),inert:e!==0,"aria-hidden":e!==0||void 0,children:[n.map(t=>{let n=u(t,W);return b(`div`,{role:`group`,"aria-label":oe(t,w),"data-cal-column":r(t),className:v(g.timeGridColumn,n&&g.timeGridColumnToday,$&&g.timeGridColumnWorking,at&&g.timeGridColumnWorkingOvernight,A&&g.timeGridColumnCreatable,M?.cell),style:N?.cell,onClick:e=>Qe(e,t),children:[pe(He,t).map(tt),n&&y(`div`,{className:g.timeGridNow,style:{top:`${d(W)/1440*100}%`},"aria-hidden":!0}),e===0&&nt(t)]},r(t))}),e===0&&y(`div`,{ref:Le,className:g.timeGridSlot,"aria-hidden":!0})]},r(t)))})})]})]})}export{S as default};
|
|
2
2
|
//# sourceMappingURL=timeGrid.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeGrid.mjs","names":[],"sources":["../../../../../../package/common/calendar/components/timeGrid/timeGrid.tsx"],"sourcesContent":["import {\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type MouseEvent,\n type ReactElement,\n type RefObject,\n} from 'react';\nimport cx from 'classnames';\nimport { faChevronDown } from '@fortawesome/free-solid-svg-icons';\n\nimport { renderIcon } from 'components/common/utils/renderIcon';\nimport { CalendarView, type CalendarEvent } from '../../calendar.types';\nimport {\n addDays,\n atMinutes,\n dayDiff,\n dateToDay,\n endAfter,\n isSameDay,\n MINUTES_PER_DAY,\n minutesOfDay,\n periodRange,\n shownDays,\n stepDate,\n} from '../../dates';\nimport {\n formatClockRange,\n formatDayNumber,\n formatHour,\n formatLongDate,\n formatTimeRange,\n formatWeekday,\n} from '../../format';\nimport { clamp, pageStep, snap } from '../../gesture';\nimport {\n BRIEF_EVENT_MINUTES,\n eventEnd,\n isAllDayLike,\n limitLanes,\n packDay,\n packLanes,\n type LaneBar,\n type LimitedLanes,\n type TimedBox,\n} from '../../layout';\nimport { useGestures, type GesturePoint } from '../../useGestures';\nimport { usePager } from '../../usePager';\nimport type { TimeDrag, TimeGridProps, TimeGridZoom } from './timeGrid.types';\n\nimport pagerStyles from '../../pager.module.pcss';\nimport styles from './timeGrid.module.pcss';\n\nconst STEPS = [-1, 0, 1] as const;\nconst HOURS = Array.from({ length: 23 }, (_, i) => i + 1);\nconst ALL_DAY_LANES = 3;\n/** Below this an event is drawn on one line, its time after its title. */\nconst SHORT_EVENT_MINUTES = 45;\n/** Hour first scrolled to when today is not in view. */\nconst DEFAULT_SCROLL_HOUR = 7;\n/** Deepest zoom, as a multiple of the theme's hour height. */\nconst MAX_ZOOM = 4;\n\n/** The current time, updated on each minute boundary: it also carries the now-line past midnight. */\nfunction useNow(): Date {\n const [now, setNow] = useState(() => new Date());\n useEffect(() => {\n let timer: ReturnType<typeof setTimeout>;\n function schedule() {\n timer = setTimeout(\n () => {\n setNow(new Date());\n schedule();\n },\n 60_000 - (Date.now() % 60_000),\n );\n }\n schedule();\n return () => clearTimeout(timer);\n }, []);\n return now;\n}\n\ninterface ZoomElements {\n scroller: HTMLElement;\n head: HTMLElement;\n body: HTMLElement;\n}\n\n/**\n * Sets the hour height, and scrolls so `anchorHour` stays under `clientY`: zooming pivots on the\n * fingers or the cursor instead of the top of the day.\n */\nfunction zoomTo(\n { scroller, head, body }: ZoomElements,\n zoomRef: RefObject<TimeGridZoom | null>,\n hour: number,\n anchorHour: number,\n clientY: number,\n) {\n const base = zoomRef.current?.base ?? body.getBoundingClientRect().height / 24;\n if (!base) return;\n // Zoomed out, the whole day fits exactly.\n const min = Math.max((scroller.clientHeight - head.offsetHeight) / 24, 1);\n const next = clamp(hour, Math.min(min, base), base * MAX_ZOOM);\n zoomRef.current = { hour: next, base };\n scroller.style.setProperty('--custom-calendar-hour-height', `${next}px`);\n const top = scroller.getBoundingClientRect().top;\n scroller.scrollTop = body.offsetTop + anchorHour * next - (clientY - top);\n}\n\nfunction TimeGrid<E extends CalendarEvent>({\n events,\n date,\n view,\n locale,\n weekStartsOn,\n slotMinutes,\n hidden,\n scrollToHour,\n text,\n onDateChange,\n onOpenDay,\n onEventClick,\n onEventChange,\n onSlotCreate,\n renderEvent,\n classNames,\n slotStyles,\n zoomRef,\n}: TimeGridProps<E>): ReactElement {\n const scrollerRef = useRef<HTMLDivElement>(null);\n const headRef = useRef<HTMLDivElement>(null);\n const bodyRef = useRef<HTMLDivElement>(null);\n const currentRef = useRef<HTMLDivElement>(null);\n const dragRef = useRef<TimeDrag<E> | null>(null);\n const slotRef = useRef<HTMLDivElement>(null);\n const snapshot = useRef(events);\n const pinchRef = useRef<{ hour: number; anchorHour: number; distance: number } | null>(null);\n const [drag, setDrag] = useState<TimeDrag<E> | null>(null);\n const [allDayOpen, setAllDayOpen] = useState(false);\n const now = useNow();\n\n const periodDays = view === CalendarView.Day ? 1 : 7;\n const rangeStart = periodRange(view, date, weekStartsOn).start;\n const columns = shownDays(rangeStart, periodDays, hidden);\n // While a drag runs, the grid renders the events as they were when it began: the touch that\n // started it keeps targeting the element it landed on, and iOS stops delivering its moves if\n // a re-render replaces that element.\n const shown = drag ? snapshot.current : events;\n\n const pager = usePager(\n dateToDay(rangeStart),\n (step) => onDateChange(stepDate(view, date, step, hidden)),\n () => scrollerRef.current,\n );\n\n function zoomElements(): ZoomElements | null {\n const scroller = scrollerRef.current;\n const head = headRef.current;\n const body = bodyRef.current;\n return scroller && head && body ? { scroller, head, body } : null;\n }\n\n // Once, on mount: paging keeps the scroll position, so the same hours stay under the eye.\n useLayoutEffect(() => {\n const scroller = scrollerRef.current;\n const body = bodyRef.current;\n if (!scroller || !body) return;\n const hour = body.offsetHeight / 24;\n if (!hour) return;\n const current = new Date();\n const todayShown = columns.some((day) => isSameDay(day, current));\n const target = scrollToHour ?? (todayShown ? Math.max(0, minutesOfDay(current) / 60 - 1) : DEFAULT_SCROLL_HOUR);\n scroller.scrollTop = clamp(target, 0, 24) * hour;\n // oxlint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n const scroller = scrollerRef.current;\n if (!scroller) return;\n // Trackpad pinches arrive as a wheel with Ctrl held (Chromium, Firefox); Safari sends\n // `gesturechange` instead, and there the trackpad zooms the page as usual.\n function onWheel(event: WheelEvent) {\n if (!event.ctrlKey) return;\n const elements = zoomElements();\n if (!elements) return;\n event.preventDefault();\n const rect = elements.body.getBoundingClientRect();\n const hour = rect.height / 24;\n if (!hour) return;\n zoomTo(\n elements,\n zoomRef,\n hour * Math.exp(-event.deltaY * 0.01),\n (event.clientY - rect.top) / hour,\n event.clientY,\n );\n }\n scroller.addEventListener('wheel', onWheel, { passive: false });\n return () => scroller.removeEventListener('wheel', onWheel);\n // zoomElements only reads refs.\n // oxlint-disable-next-line react-hooks/exhaustive-deps\n }, [zoomRef]);\n\n /** `day` counts from the period's first day, hidden ones included, so it adds up to a date. */\n function pointAt(point: GesturePoint): { day: number; minutes: number } | null {\n const pane = currentRef.current;\n if (!pane) return null;\n const rect = pane.getBoundingClientRect();\n if (!rect.width || !rect.height) return null;\n const column = clamp(Math.floor(((point.x - rect.left) / rect.width) * columns.length), 0, columns.length - 1);\n return {\n day: dayDiff(rangeStart, columns[column]),\n minutes: clamp(((point.y - rect.top) / rect.height) * MINUTES_PER_DAY, 0, MINUTES_PER_DAY),\n };\n }\n\n /** Wall-clock minutes from the first shown midnight: negative before it. */\n function minutesFromStart(value: Date): number {\n return dayDiff(rangeStart, value) * MINUTES_PER_DAY + minutesOfDay(value);\n }\n\n function preview(current: TimeDrag<E>, point: GesturePoint): { start: Date; end: Date } | null {\n const at = pointAt(point);\n if (!at) return null;\n const limit = periodDays * MINUTES_PER_DAY;\n\n if (current.kind === 'create') {\n const anchor = Math.floor(current.anchor / slotMinutes) * slotMinutes;\n const [from, to] =\n at.minutes >= anchor\n ? [anchor, Math.max(Math.ceil(at.minutes / slotMinutes) * slotMinutes, anchor + slotMinutes)]\n : [Math.floor(at.minutes / slotMinutes) * slotMinutes, anchor + slotMinutes];\n const day = addDays(rangeStart, current.day);\n const start = atMinutes(day, from);\n return { start, end: endAfter(start, atMinutes(day, Math.min(to, MINUTES_PER_DAY)), to - from) };\n }\n\n const pointer = at.day * MINUTES_PER_DAY + at.minutes;\n const eventStart = minutesFromStart(current.event.start);\n if (current.kind === 'move') {\n const from = clamp(snap(pointer - current.grab, slotMinutes), Math.min(eventStart, 0), limit - slotMinutes);\n const start = atMinutes(rangeStart, from);\n // The real length, not the wall-clock one, so a move across a clock change keeps it.\n const length = eventEnd(current.event).getTime() - current.event.start.getTime();\n return { start, end: new Date(start.getTime() + length) };\n }\n const to = clamp(snap(pointer, slotMinutes), eventStart + slotMinutes, Math.max(limit, eventStart + slotMinutes));\n const start = current.event.start;\n return { start, end: endAfter(start, atMinutes(rangeStart, to), to - eventStart) };\n }\n\n function setDragState(next: TimeDrag<E> | null) {\n dragRef.current = next;\n setDrag(next);\n }\n\n function findEvent(element: HTMLElement): E | undefined {\n return events.find((candidate) => String(candidate.id) === element.dataset.calEvent);\n }\n\n useGestures<TimeDrag<E>>(scrollerRef, {\n onPress: pager.finish,\n canSwipe: () => true,\n onSwipeMove: pager.move,\n onSwipeEnd: (dx, velocity) => pager.settle(pageStep(dx, pager.width(), velocity)),\n dragFrom: (target, point) => {\n if (!currentRef.current?.contains(target)) return null;\n const at = pointAt(point);\n if (!at) return null;\n const element = target.closest<HTMLElement>('[data-cal-event]');\n if (element) {\n const event = onEventChange ? findEvent(element) : undefined;\n if (!event || event.readOnly) return null;\n const current = { start: event.start, end: eventEnd(event) };\n if (target.closest('[data-cal-resize]')) return { kind: 'resize', event, ...current };\n const grab = at.day * MINUTES_PER_DAY + at.minutes - minutesFromStart(event.start);\n return { kind: 'move', event, grab, ...current };\n }\n if (!onSlotCreate) return null;\n const day = addDays(rangeStart, at.day);\n return { kind: 'create', day: at.day, anchor: at.minutes, start: day, end: day };\n },\n onDragStart: (started, point) => {\n snapshot.current = events;\n setDragState({ ...started, ...preview(started, point) });\n },\n onDragMove: (point) => {\n const current = dragRef.current;\n const next = current && preview(current, point);\n if (!current || !next) return;\n if (next.start.getTime() === current.start.getTime() && next.end.getTime() === current.end.getTime()) return;\n setDragState({ ...current, ...next });\n },\n onDragEnd: (point) => {\n const current = dragRef.current;\n setDragState(null);\n if (!current) return;\n const { start, end } = preview(current, point) ?? current;\n if (current.kind === 'create') {\n onSlotCreate?.({ start, end, allDay: false }, markSlot(current.day, start, end));\n return;\n }\n const unchanged =\n start.getTime() === current.event.start.getTime() && end.getTime() === eventEnd(current.event).getTime();\n if (!unchanged) onEventChange?.({ event: current.event, start, end });\n },\n onDragCancel: () => setDragState(null),\n onPinchStart: (center, distance) => {\n const body = bodyRef.current;\n if (!body) return;\n const rect = body.getBoundingClientRect();\n const hour = rect.height / 24;\n if (!hour) return;\n pinchRef.current = { hour, anchorHour: (center.y - rect.top) / hour, distance };\n },\n onPinchMove: (center, distance) => {\n const pinch = pinchRef.current;\n const elements = zoomElements();\n if (!pinch || !elements || !pinch.distance) return;\n zoomTo(elements, zoomRef, (pinch.hour * distance) / pinch.distance, pinch.anchorHour, center.y);\n },\n onPinchEnd: () => {\n pinchRef.current = null;\n },\n autoScroll: () => {\n const scroller = scrollerRef.current;\n const head = headRef.current;\n if (!scroller || !head) return null;\n const rect = scroller.getBoundingClientRect();\n // The sticky head covers the top of the scroller, so the zone starts below it.\n return { element: scroller, top: rect.top + head.offsetHeight, bottom: rect.bottom };\n },\n });\n\n function handleColumnClick(clickEvent: MouseEvent<HTMLDivElement>, day: Date) {\n if (!onSlotCreate || (clickEvent.target as Element).closest('[data-cal-event]')) return;\n const rect = clickEvent.currentTarget.getBoundingClientRect();\n if (!rect.height) return;\n const minutes = ((clickEvent.clientY - rect.top) / rect.height) * MINUTES_PER_DAY;\n const from = clamp(Math.floor(minutes / slotMinutes) * slotMinutes, 0, MINUTES_PER_DAY - slotMinutes);\n const start = atMinutes(day, from);\n // Real time, not the clock: across a clock change an hour on the clock is none or two.\n const end = new Date(start.getTime() + Math.max(60, slotMinutes) * 60_000);\n const midnight = atMinutes(day, MINUTES_PER_DAY);\n const slot = { start, end: end < midnight ? end : midnight, allDay: false };\n onSlotCreate(slot, markSlot(dayDiff(rangeStart, day), slot.start, slot.end));\n }\n\n /**\n * Moves the invisible box over a new slot and returns it: the anchor `onSlotCreate` hands out,\n * so the app can open its editor right next to the slot, as `onEventClick` lets it for an event.\n */\n function markSlot(dayIndex: number, start: Date, end: Date): HTMLElement {\n const marker = slotRef.current;\n if (!marker) return scrollerRef.current!;\n const next = addDays(rangeStart, dayIndex + 1);\n const top = minutesOfDay(start);\n const bottom = end >= next ? MINUTES_PER_DAY : minutesOfDay(end);\n const column = Math.max(\n columns.findIndex((day) => dayDiff(rangeStart, day) === dayIndex),\n 0,\n );\n marker.style.left = `${(column / columns.length) * 100}%`;\n marker.style.width = `${100 / columns.length}%`;\n marker.style.top = `${(top / MINUTES_PER_DAY) * 100}%`;\n // Never upside down: on the day the clocks go back, a slot can end on an earlier clock time.\n marker.style.height = `${(Math.max(bottom - top, 0) / MINUTES_PER_DAY) * 100}%`;\n return marker;\n }\n\n function renderAllDayBar(bar: LaneBar<E>) {\n const { event } = bar;\n return (\n <button\n key={event.id}\n type='button'\n data-cal-event={String(event.id)}\n className={cx(\n styles.timeGridBar,\n bar.continuesBefore && styles.timeGridBarContinuesBefore,\n bar.continuesAfter && styles.timeGridBarContinuesAfter,\n classNames?.event,\n )}\n style={\n {\n '--event-color': event.color,\n gridColumn: `${bar.start + 1} / span ${bar.span}`,\n gridRow: bar.lane + 1,\n ...slotStyles?.event,\n } as CSSProperties\n }\n aria-label={`${event.title}, ${text.allDay}`}\n onClick={(clickEvent) => onEventClick?.(event, clickEvent.currentTarget)}\n >\n <span className={styles.timeGridBarTitle} aria-hidden>\n {renderEvent ? renderEvent(event, { singleLine: true }) : event.title}\n </span>\n </button>\n );\n }\n\n function renderBox(box: TimedBox<E>) {\n const { event } = box;\n const minutes = box.bottom - box.top;\n const short = minutes < SHORT_EVENT_MINUTES;\n const when = formatTimeRange(event.start, eventEnd(event), locale);\n const resizable = Boolean(onEventChange) && !event.readOnly && !box.continuesAfter;\n const dragged = drag && drag.kind !== 'create' && drag.event === event;\n return (\n <button\n key={event.id}\n type='button'\n data-cal-event={String(event.id)}\n aria-label={`${event.title}, ${when}`}\n className={cx(\n styles.timeGridEvent,\n short && styles.timeGridEventShort,\n minutes < BRIEF_EVENT_MINUTES && styles.timeGridEventBrief,\n box.continuesBefore && styles.timeGridEventContinuesBefore,\n box.continuesAfter && styles.timeGridEventContinuesAfter,\n (onEventClick || resizable) && styles.timeGridEventInteractive,\n dragged && styles.timeGridEventDragged,\n classNames?.event,\n )}\n style={\n {\n '--event-color': event.color,\n top: `${(box.top / MINUTES_PER_DAY) * 100}%`,\n '--span': `${(minutes / MINUTES_PER_DAY) * 100}%`,\n left: `calc(var(--column-width) * ${box.column / box.columns})`,\n width: `calc(var(--column-width) * ${box.span / box.columns})`,\n ...slotStyles?.event,\n } as CSSProperties\n }\n onClick={(clickEvent) => onEventClick?.(event, clickEvent.currentTarget)}\n >\n <span className={styles.timeGridEventTitle} aria-hidden>\n {renderEvent ? renderEvent(event, { singleLine: short }) : event.title}\n </span>\n <span className={styles.timeGridEventTime} aria-hidden>\n {formatClockRange(event.start, eventEnd(event), locale)}\n </span>\n {resizable && <span data-cal-resize className={styles.timeGridResize} aria-hidden />}\n </button>\n );\n }\n\n function renderPreview(day: Date) {\n if (!drag) return null;\n const dayStart = day;\n const next = addDays(day, 1);\n if (drag.end <= dayStart && drag.start < dayStart) return null;\n if (drag.start >= next) return null;\n const top = drag.start < dayStart ? 0 : minutesOfDay(drag.start);\n const bottom = drag.end >= next ? MINUTES_PER_DAY : minutesOfDay(drag.end);\n const color = drag.kind === 'create' ? undefined : drag.event.color;\n const title = drag.kind === 'create' ? null : drag.event.title;\n return (\n <div\n className={styles.timeGridPreview}\n style={\n {\n '--event-color': color,\n top: `${(top / MINUTES_PER_DAY) * 100}%`,\n height: `${(Math.max(bottom - top, 15) / MINUTES_PER_DAY) * 100}%`,\n } as CSSProperties\n }\n aria-hidden\n >\n {title && <span className={styles.timeGridEventTitle}>{title}</span>}\n <span className={styles.timeGridPreviewTime}>{formatClockRange(drag.start, drag.end, locale)}</span>\n </div>\n );\n }\n\n const panes = STEPS.map((step) => {\n const start = periodRange(view, stepDate(view, date, step, hidden), weekStartsOn).start;\n const dates = shownDays(start, periodDays, hidden);\n const allDay = packLanes(shown, dates, isAllDayLike);\n const lanes: LimitedLanes<E> = allDayOpen\n ? { visible: allDay, moreLane: 0, hidden: dates.map(() => 0) }\n : limitLanes(allDay, dates.length, ALL_DAY_LANES);\n return { step, start, dates, lanes };\n });\n const hasHidden = panes[1].lanes.hidden.some((count) => count > 0);\n const paneClass = (step: number) =>\n cx(pagerStyles.pagerPane, step === -1 && pagerStyles.pagerPanePrev, step === 1 && pagerStyles.pagerPaneNext);\n\n return (\n <div\n ref={scrollerRef}\n tabIndex={-1}\n className={styles.timeGrid}\n style={\n {\n '--days': columns.length,\n '--custom-calendar-hour-height': zoomRef.current ? `${zoomRef.current.hour}px` : undefined,\n } as CSSProperties\n }\n >\n <div ref={headRef} className={styles.timeGridHead}>\n <div className={styles.timeGridCorner}>\n {(hasHidden || allDayOpen) && (\n <button\n type='button'\n className={cx(styles.timeGridToggle, allDayOpen && styles.timeGridToggleOpen)}\n aria-label={text.allDay}\n aria-expanded={allDayOpen}\n onClick={() => setAllDayOpen((open) => !open)}\n >\n {renderIcon(faChevronDown)}\n </button>\n )}\n </div>\n <div className={pagerStyles.pagerViewport}>\n <div ref={pager.trackRef} className={pagerStyles.pagerTrack}>\n {panes.map(({ step, start, dates, lanes }) => (\n <div\n key={dateToDay(start)}\n className={cx(paneClass(step), styles.timeGridHeadPane)}\n inert={step !== 0}\n aria-hidden={step !== 0 || undefined}\n >\n {dates.map((day) => {\n const isToday = isSameDay(day, now);\n const content = (\n <>\n <span className={styles.timeGridWeekday}>{formatWeekday(day, locale, 'short')}</span>\n <span className={cx(styles.timeGridDayNumber, isToday && styles.timeGridDayNumberToday)}>\n {formatDayNumber(day, locale)}\n </span>\n </>\n );\n const shared = {\n className: cx(styles.timeGridDayHeader, classNames?.dayHeader),\n style: slotStyles?.dayHeader,\n 'aria-current': isToday ? ('date' as const) : undefined,\n };\n return periodDays > 1 && onOpenDay ? (\n <button\n key={dateToDay(day)}\n type='button'\n {...shared}\n className={cx(shared.className, styles.timeGridDayHeaderLink)}\n aria-label={formatLongDate(day, locale)}\n onClick={() => onOpenDay(day)}\n >\n {content}\n </button>\n ) : (\n <div key={dateToDay(day)} {...shared}>\n {content}\n </div>\n );\n })}\n <div className={styles.timeGridAllDay} aria-label={text.allDay} role='group'>\n {lanes.visible.map(renderAllDayBar)}\n {lanes.hidden.map(\n (count, column) =>\n count > 0 && (\n <div\n key={`more-${column}`}\n aria-hidden\n className={styles.timeGridMore}\n style={{ gridColumn: column + 1, gridRow: lanes.moreLane + 1 }}\n onClick={() => setAllDayOpen(true)}\n >\n {text.more(count)}\n </div>\n ),\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n\n <div ref={bodyRef} className={styles.timeGridBody}>\n <div className={styles.timeGridGutter} aria-hidden>\n {HOURS.map((hour) => (\n <span key={hour} className={styles.timeGridHour} style={{ top: `${(hour / 24) * 100}%` }}>\n {formatHour(hour, locale)}\n </span>\n ))}\n </div>\n <div className={pagerStyles.pagerViewport}>\n <div ref={pager.trackRef} className={pagerStyles.pagerTrack}>\n {panes.map(({ step, start, dates }) => (\n <div\n key={dateToDay(start)}\n ref={step === 0 ? currentRef : undefined}\n className={cx(paneClass(step), styles.timeGridBodyPane)}\n inert={step !== 0}\n aria-hidden={step !== 0 || undefined}\n >\n {dates.map((day) => {\n const isToday = isSameDay(day, now);\n return (\n <div\n key={dateToDay(day)}\n role='group'\n aria-label={formatLongDate(day, locale)}\n data-cal-column={dateToDay(day)}\n className={cx(\n styles.timeGridColumn,\n isToday && styles.timeGridColumnToday,\n onSlotCreate && styles.timeGridColumnCreatable,\n classNames?.cell,\n )}\n style={slotStyles?.cell}\n onClick={(clickEvent) => handleColumnClick(clickEvent, day)}\n >\n {packDay(shown, day).map(renderBox)}\n {isToday && (\n <div\n className={styles.timeGridNow}\n style={{ top: `${(minutesOfDay(now) / MINUTES_PER_DAY) * 100}%` }}\n aria-hidden\n />\n )}\n {step === 0 && renderPreview(day)}\n </div>\n );\n })}\n {step === 0 && <div ref={slotRef} className={styles.timeGridSlot} aria-hidden />}\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nexport default TimeGrid;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"timeGrid.mjs","names":[],"sources":["../../../../../../package/common/calendar/components/timeGrid/timeGrid.tsx"],"sourcesContent":["import {\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type MouseEvent,\n type ReactElement,\n type RefObject,\n} from 'react';\nimport cx from 'classnames';\nimport { faChevronDown } from '@fortawesome/free-solid-svg-icons';\n\nimport ActionIcon from 'components/common/actionIcon';\nimport { isDismissClick } from 'components/common/utils/dismissClick';\nimport type { CalendarEvent } from '../../calendar.types';\nimport {\n addDays,\n allDaySlot,\n atMinutes,\n dayDiff,\n dateToDay,\n endAfter,\n isSameDay,\n MINUTES_PER_DAY,\n minutesOfDay,\n periodRange,\n shownDays,\n stepDate,\n weekNumber,\n} from '../../dates';\nimport {\n formatClockRange,\n formatDayNumber,\n formatHour,\n formatLongDate,\n formatTimeRange,\n formatWeekday,\n} from '../../format';\nimport { clamp, pageStep, snap } from '../../gesture';\nimport {\n BRIEF_EVENT_MINUTES,\n eventEnd,\n isAllDayLike,\n limitLanes,\n moveByDays,\n packDay,\n packLanes,\n type LaneBar,\n type LimitedLanes,\n type TimedBox,\n} from '../../layout';\nimport { useGestures, type GesturePoint } from '../../useGestures';\nimport { useNow } from '../../useNow';\nimport { usePager } from '../../usePager';\nimport type { AllDayDrag, TimeDrag, TimeGridProps, TimeGridZoom } from './timeGrid.types';\n\nimport pagerStyles from '../../pager.module.pcss';\nimport styles from './timeGrid.module.pcss';\nimport { cssColor } from '../../../styles/tone';\n\nconst STEPS = [-1, 0, 1] as const;\nconst HOURS = Array.from({ length: 23 }, (_, i) => i + 1);\nconst ALL_DAY_LANES = 3;\n/** Below this an event is drawn on one line, its time after its title. */\nconst SHORT_EVENT_MINUTES = 45;\n/** Hour first scrolled to when today is not in view and no working hours are set. */\nconst DEFAULT_SCROLL_HOUR = 7;\n/** Deepest zoom, as a multiple of the theme's hour height. */\nconst MAX_ZOOM = 4;\n\ninterface ZoomElements {\n scroller: HTMLElement;\n head: HTMLElement;\n body: HTMLElement;\n}\n\n/**\n * Sets the hour height, and scrolls so `anchorHour` stays under `clientY`: zooming pivots on the\n * fingers or the cursor instead of the top of the day.\n */\nfunction zoomTo(\n { scroller, head, body }: ZoomElements,\n zoomRef: RefObject<TimeGridZoom | null>,\n hour: number,\n anchorHour: number,\n clientY: number,\n) {\n const base = zoomRef.current?.base ?? body.getBoundingClientRect().height / 24;\n if (!base) return;\n // Zoomed out, the whole day fits exactly.\n const min = Math.max((scroller.clientHeight - head.offsetHeight) / 24, 1);\n const next = clamp(hour, Math.min(min, base), base * MAX_ZOOM);\n zoomRef.current = { hour: next, base };\n scroller.style.setProperty('--custom-calendar-hour-height', `${next}px`);\n const top = scroller.getBoundingClientRect().top;\n scroller.scrollTop = body.offsetTop + anchorHour * next - (clientY - top);\n}\n\nfunction TimeGrid<E extends CalendarEvent>({\n events,\n date,\n period,\n locale,\n weekStartsOn,\n slotMinutes,\n hidden,\n scrollToHour,\n workingHours,\n showWeekNumbers,\n text,\n onDateChange,\n onOpenDay,\n onEventClick,\n onEventChange,\n onSlotCreate,\n renderEvent,\n eventClassName,\n classNames,\n slotStyles,\n zoomRef,\n}: TimeGridProps<E>): ReactElement {\n const scrollerRef = useRef<HTMLDivElement>(null);\n const headRef = useRef<HTMLDivElement>(null);\n const bodyRef = useRef<HTMLDivElement>(null);\n const currentRef = useRef<HTMLDivElement>(null);\n const allDayRef = useRef<HTMLDivElement>(null);\n const dragRef = useRef<TimeDrag<E> | null>(null);\n const slotRef = useRef<HTMLDivElement>(null);\n const snapshot = useRef(events);\n const pinchRef = useRef<{ hour: number; anchorHour: number; distance: number } | null>(null);\n const [drag, setDrag] = useState<TimeDrag<E> | null>(null);\n const [allDayOpen, setAllDayOpen] = useState(false);\n const now = useNow();\n\n const range = periodRange(period, date, weekStartsOn, hidden);\n const rangeStart = range.start;\n /** Calendar days the period spans, hidden ones included. */\n const periodDays = dayDiff(range.start, range.end);\n const columns = shownDays(rangeStart, periodDays, hidden);\n // While a drag runs, the grid renders the events as they were when it began: the touch that\n // started it keeps targeting the element it landed on, and iOS stops delivering its moves if\n // a re-render replaces that element.\n const shown = drag ? snapshot.current : events;\n\n const pager = usePager(\n dateToDay(rangeStart),\n (step) => onDateChange(stepDate(period, date, step, hidden)),\n () => scrollerRef.current,\n );\n\n function zoomElements(): ZoomElements | null {\n const scroller = scrollerRef.current;\n const head = headRef.current;\n const body = bodyRef.current;\n return scroller && head && body ? { scroller, head, body } : null;\n }\n\n // Once, on mount: paging keeps the scroll position, so the same hours stay under the eye.\n useLayoutEffect(() => {\n const scroller = scrollerRef.current;\n const body = bodyRef.current;\n if (!scroller || !body) return;\n const hour = body.offsetHeight / 24;\n if (!hour) return;\n const todayShown = columns.some((day) => isSameDay(day, now));\n const target =\n scrollToHour ??\n (todayShown ? Math.max(0, minutesOfDay(now) / 60 - 1) : (workingHours?.[0] ?? DEFAULT_SCROLL_HOUR));\n scroller.scrollTop = clamp(target, 0, 24) * hour;\n // oxlint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n const scroller = scrollerRef.current;\n if (!scroller) return;\n // Trackpad pinches arrive as a wheel with Ctrl held (Chromium, Firefox); Safari sends\n // `gesturechange` instead, and there the trackpad zooms the page as usual.\n function onWheel(event: WheelEvent) {\n if (!event.ctrlKey) return;\n const elements = zoomElements();\n if (!elements) return;\n event.preventDefault();\n const rect = elements.body.getBoundingClientRect();\n const hour = rect.height / 24;\n if (!hour) return;\n zoomTo(\n elements,\n zoomRef,\n hour * Math.exp(-event.deltaY * 0.01),\n (event.clientY - rect.top) / hour,\n event.clientY,\n );\n }\n scroller.addEventListener('wheel', onWheel, { passive: false });\n return () => scroller.removeEventListener('wheel', onWheel);\n // zoomElements only reads refs.\n // oxlint-disable-next-line react-hooks/exhaustive-deps\n }, [zoomRef]);\n\n /** Days from the period's first day, hidden ones included, to the column under `x` in `rect`. */\n function dayAt(x: number, rect: DOMRect): number {\n const column = clamp(Math.floor(((x - rect.left) / rect.width) * columns.length), 0, columns.length - 1);\n return dayDiff(rangeStart, columns[column]);\n }\n\n /** `day` counts from the period's first day, hidden ones included, so it adds up to a date. */\n function pointAt(point: GesturePoint): { day: number; minutes: number } | null {\n const pane = currentRef.current;\n if (!pane) return null;\n const rect = pane.getBoundingClientRect();\n if (!rect.width || !rect.height) return null;\n return {\n day: dayAt(point.x, rect),\n minutes: clamp(((point.y - rect.top) / rect.height) * MINUTES_PER_DAY, 0, MINUTES_PER_DAY),\n };\n }\n\n function allDayAt(point: GesturePoint): number | null {\n const rect = allDayRef.current?.getBoundingClientRect();\n return rect?.width ? dayAt(point.x, rect) : null;\n }\n\n /** Whole days: the event moved by as many as the pointer has, or the days a new slot covers. */\n function allDayPreview({ event, grabbed }: AllDayDrag<E>, over: number): { start: Date; end: Date } {\n if (event) return moveByDays(event, over - grabbed);\n const { start, end } = allDaySlot(addDays(rangeStart, grabbed), addDays(rangeStart, over));\n return { start, end };\n }\n\n /** Wall-clock minutes from the first shown midnight: negative before it. */\n function minutesFromStart(value: Date): number {\n return dayDiff(rangeStart, value) * MINUTES_PER_DAY + minutesOfDay(value);\n }\n\n function preview(current: TimeDrag<E>, point: GesturePoint): { start: Date; end: Date } | null {\n if (current.kind === 'allDay') {\n const over = allDayAt(point);\n return over === null ? null : allDayPreview(current, over);\n }\n const at = pointAt(point);\n if (!at) return null;\n const limit = periodDays * MINUTES_PER_DAY;\n\n if (current.kind === 'create') {\n const anchor = Math.floor(current.anchor / slotMinutes) * slotMinutes;\n const [from, to] =\n at.minutes >= anchor\n ? [anchor, Math.max(Math.ceil(at.minutes / slotMinutes) * slotMinutes, anchor + slotMinutes)]\n : [Math.floor(at.minutes / slotMinutes) * slotMinutes, anchor + slotMinutes];\n const day = addDays(rangeStart, current.day);\n const start = atMinutes(day, from);\n return { start, end: endAfter(start, atMinutes(day, Math.min(to, MINUTES_PER_DAY)), to - from) };\n }\n\n const pointer = at.day * MINUTES_PER_DAY + at.minutes;\n const eventStart = minutesFromStart(current.event.start);\n if (current.kind === 'move') {\n const from = clamp(snap(pointer - current.grab, slotMinutes), Math.min(eventStart, 0), limit - slotMinutes);\n const start = atMinutes(rangeStart, from);\n // The real length, not the wall-clock one, so a move across a clock change keeps it.\n const length = eventEnd(current.event).getTime() - current.event.start.getTime();\n return { start, end: new Date(start.getTime() + length) };\n }\n const to = clamp(snap(pointer, slotMinutes), eventStart + slotMinutes, Math.max(limit, eventStart + slotMinutes));\n const start = current.event.start;\n return { start, end: endAfter(start, atMinutes(rangeStart, to), to - eventStart) };\n }\n\n function setDragState(next: TimeDrag<E> | null) {\n dragRef.current = next;\n setDrag(next);\n }\n\n function findEvent(element: HTMLElement): E | undefined {\n return events.find((candidate) => String(candidate.id) === element.dataset.calEvent);\n }\n\n useGestures<TimeDrag<E>>(scrollerRef, {\n onPress: pager.finish,\n canSwipe: () => true,\n onSwipeMove: pager.move,\n onSwipeEnd: (dx, velocity) => pager.settle(pageStep(dx, pager.width(), velocity)),\n dragFrom: (target, point) => {\n if (allDayRef.current?.contains(target)) return allDayDragFrom(target, point);\n if (!currentRef.current?.contains(target)) return null;\n const at = pointAt(point);\n if (!at) return null;\n const element = target.closest<HTMLElement>('[data-cal-event]');\n if (element) {\n const event = onEventChange ? findEvent(element) : undefined;\n if (!event || event.readOnly) return null;\n const current = { start: event.start, end: eventEnd(event) };\n if (target.closest('[data-cal-resize]')) return { kind: 'resize', event, ...current };\n const grab = at.day * MINUTES_PER_DAY + at.minutes - minutesFromStart(event.start);\n return { kind: 'move', event, grab, ...current };\n }\n if (!onSlotCreate) return null;\n const day = addDays(rangeStart, at.day);\n return { kind: 'create', day: at.day, anchor: at.minutes, start: day, end: day };\n },\n onDragStart: (started, point) => {\n snapshot.current = events;\n setDragState({ ...started, ...preview(started, point) });\n },\n onDragMove: (point) => {\n const current = dragRef.current;\n const next = current && preview(current, point);\n if (!current || !next) return;\n if (next.start.getTime() === current.start.getTime() && next.end.getTime() === current.end.getTime()) return;\n setDragState({ ...current, ...next });\n },\n onDragEnd: (point) => {\n const current = dragRef.current;\n setDragState(null);\n if (!current) return;\n const { start, end } = preview(current, point) ?? current;\n if (current.kind === 'create') {\n onSlotCreate?.({ start, end, allDay: false }, markSlot(current.day, start, end));\n return;\n }\n const { event } = current;\n if (!event) {\n onSlotCreate?.({ start, end, allDay: true }, dayHeader(start));\n return;\n }\n const unchanged = start.getTime() === event.start.getTime() && end.getTime() === eventEnd(event).getTime();\n if (!unchanged) onEventChange?.({ event, start, end });\n },\n onDragCancel: () => setDragState(null),\n onPinchStart: (center, distance) => {\n const body = bodyRef.current;\n if (!body) return;\n const rect = body.getBoundingClientRect();\n const hour = rect.height / 24;\n if (!hour) return;\n pinchRef.current = { hour, anchorHour: (center.y - rect.top) / hour, distance };\n },\n onPinchMove: (center, distance) => {\n const pinch = pinchRef.current;\n const elements = zoomElements();\n if (!pinch || !elements || !pinch.distance) return;\n zoomTo(elements, zoomRef, (pinch.hour * distance) / pinch.distance, pinch.anchorHour, center.y);\n },\n onPinchEnd: () => {\n pinchRef.current = null;\n },\n autoScroll: () => {\n const scroller = scrollerRef.current;\n const head = headRef.current;\n // A drag in the all-day row is above the hours, where the zone would scroll them up.\n if (!scroller || !head || dragRef.current?.kind === 'allDay') return null;\n const rect = scroller.getBoundingClientRect();\n // The sticky head covers the top of the scroller, so the zone starts below it.\n return { element: scroller, top: rect.top + head.offsetHeight, bottom: rect.bottom };\n },\n });\n\n function allDayDragFrom(target: Element, point: GesturePoint): AllDayDrag<E> | null {\n const grabbed = allDayAt(point);\n if (grabbed === null || target.closest('[data-cal-more]')) return null;\n const element = target.closest<HTMLElement>('[data-cal-event]');\n if (element) {\n const event = onEventChange ? findEvent(element) : undefined;\n if (!event || event.readOnly) return null;\n return { kind: 'allDay', event, grabbed, start: event.start, end: eventEnd(event) };\n }\n if (!onSlotCreate) return null;\n const { start, end } = allDaySlot(addDays(rangeStart, grabbed));\n return { kind: 'allDay', event: null, grabbed, start, end };\n }\n\n /** The header of `day`'s column: what a new all-day slot is anchored to. */\n function dayHeader(day: Date): HTMLElement {\n const header = headRef.current?.querySelector<HTMLElement>(`[data-cal-head-day=\"${dateToDay(day)}\"]`);\n return header ?? scrollerRef.current!;\n }\n\n function handleAllDayClick(clickEvent: MouseEvent<HTMLDivElement>) {\n if (!onSlotCreate || isDismissClick(clickEvent.nativeEvent)) return;\n if ((clickEvent.target as Element).closest('[data-cal-event], [data-cal-more]')) return;\n const rect = clickEvent.currentTarget.getBoundingClientRect();\n if (!rect.width) return;\n const day = addDays(rangeStart, dayAt(clickEvent.clientX, rect));\n onSlotCreate(allDaySlot(day), dayHeader(day));\n }\n\n function handleColumnClick(clickEvent: MouseEvent<HTMLDivElement>, day: Date) {\n if (!onSlotCreate || isDismissClick(clickEvent.nativeEvent)) return;\n if ((clickEvent.target as Element).closest('[data-cal-event]')) return;\n const rect = clickEvent.currentTarget.getBoundingClientRect();\n if (!rect.height) return;\n const minutes = ((clickEvent.clientY - rect.top) / rect.height) * MINUTES_PER_DAY;\n const from = clamp(Math.floor(minutes / slotMinutes) * slotMinutes, 0, MINUTES_PER_DAY - slotMinutes);\n const start = atMinutes(day, from);\n // Real time, not the clock: across a clock change an hour on the clock is none or two.\n const end = new Date(start.getTime() + Math.max(60, slotMinutes) * 60_000);\n const midnight = atMinutes(day, MINUTES_PER_DAY);\n const slot = { start, end: end < midnight ? end : midnight, allDay: false };\n onSlotCreate(slot, markSlot(dayDiff(rangeStart, day), slot.start, slot.end));\n }\n\n /**\n * Moves the invisible box over a new slot and returns it: the anchor `onSlotCreate` hands out,\n * so the app can open its editor right next to the slot, as `onEventClick` lets it for an event.\n */\n function markSlot(dayIndex: number, start: Date, end: Date): HTMLElement {\n const marker = slotRef.current;\n if (!marker) return scrollerRef.current!;\n const next = addDays(rangeStart, dayIndex + 1);\n const top = minutesOfDay(start);\n const bottom = end >= next ? MINUTES_PER_DAY : minutesOfDay(end);\n const column = Math.max(\n columns.findIndex((day) => dayDiff(rangeStart, day) === dayIndex),\n 0,\n );\n marker.style.left = `${(column / columns.length) * 100}%`;\n marker.style.width = `${100 / columns.length}%`;\n marker.style.top = `${(top / MINUTES_PER_DAY) * 100}%`;\n // Never upside down: on the day the clocks go back, a slot can end on an earlier clock time.\n marker.style.height = `${(Math.max(bottom - top, 0) / MINUTES_PER_DAY) * 100}%`;\n return marker;\n }\n\n function renderAllDayBar(bar: LaneBar<E>) {\n const { event } = bar;\n return (\n <button\n key={event.id}\n type='button'\n data-cal-event={String(event.id)}\n className={cx(\n styles.timeGridBar,\n bar.continuesBefore && styles.timeGridBarContinuesBefore,\n bar.continuesAfter && styles.timeGridBarContinuesAfter,\n drag?.kind === 'allDay' && drag.event === event && styles.timeGridBarDragged,\n classNames?.event,\n eventClassName?.(event),\n )}\n style={\n {\n '--event-color': event.color && cssColor(event.color),\n gridColumn: `${bar.start + 1} / span ${bar.span}`,\n gridRow: bar.lane + 1,\n ...slotStyles?.event,\n } as CSSProperties\n }\n aria-label={`${event.title}, ${text.allDay}`}\n onClick={(clickEvent) => onEventClick?.(event, clickEvent.currentTarget)}\n >\n <span className={styles.timeGridBarTitle} aria-hidden>\n {renderEvent ? renderEvent(event, { singleLine: true }) : event.title}\n </span>\n </button>\n );\n }\n\n function renderBox(box: TimedBox<E>) {\n const { event } = box;\n const minutes = box.bottom - box.top;\n const short = minutes < SHORT_EVENT_MINUTES;\n const when = formatTimeRange(event.start, eventEnd(event), locale);\n const resizable = Boolean(onEventChange) && !event.readOnly && !box.continuesAfter;\n const dragged = drag && drag.kind !== 'create' && drag.event === event;\n return (\n <button\n key={event.id}\n type='button'\n data-cal-event={String(event.id)}\n aria-label={`${event.title}, ${when}`}\n className={cx(\n styles.timeGridEvent,\n short && styles.timeGridEventShort,\n minutes < BRIEF_EVENT_MINUTES && styles.timeGridEventBrief,\n box.continuesBefore && styles.timeGridEventContinuesBefore,\n box.continuesAfter && styles.timeGridEventContinuesAfter,\n (onEventClick || resizable) && styles.timeGridEventInteractive,\n dragged && styles.timeGridEventDragged,\n classNames?.event,\n eventClassName?.(event),\n )}\n style={\n {\n '--event-color': event.color && cssColor(event.color),\n top: `${(box.top / MINUTES_PER_DAY) * 100}%`,\n '--span': `${(minutes / MINUTES_PER_DAY) * 100}%`,\n left: `calc(var(--column-width) * ${box.column / box.columns})`,\n width: `calc(var(--column-width) * ${box.span / box.columns})`,\n ...slotStyles?.event,\n } as CSSProperties\n }\n onClick={(clickEvent) => onEventClick?.(event, clickEvent.currentTarget)}\n >\n <span className={styles.timeGridEventTitle} aria-hidden>\n {renderEvent ? renderEvent(event, { singleLine: short }) : event.title}\n </span>\n <span className={styles.timeGridEventTime} aria-hidden>\n {formatClockRange(event.start, eventEnd(event), locale)}\n </span>\n {resizable && <span data-cal-resize className={styles.timeGridResize} aria-hidden />}\n </button>\n );\n }\n\n function renderPreview(day: Date) {\n if (!drag || drag.kind === 'allDay') return null;\n const dayStart = day;\n const next = addDays(day, 1);\n if (drag.end <= dayStart && drag.start < dayStart) return null;\n if (drag.start >= next) return null;\n const top = drag.start < dayStart ? 0 : minutesOfDay(drag.start);\n const bottom = drag.end >= next ? MINUTES_PER_DAY : minutesOfDay(drag.end);\n const color = drag.kind === 'create' ? undefined : drag.event.color;\n const title = drag.kind === 'create' ? null : drag.event.title;\n return (\n <div\n className={styles.timeGridPreview}\n style={\n {\n '--event-color': color && cssColor(color),\n top: `${(top / MINUTES_PER_DAY) * 100}%`,\n height: `${(Math.max(bottom - top, 15) / MINUTES_PER_DAY) * 100}%`,\n } as CSSProperties\n }\n aria-hidden\n >\n {title && <span className={styles.timeGridEventTitle}>{title}</span>}\n <span className={styles.timeGridPreviewTime}>{formatClockRange(drag.start, drag.end, locale)}</span>\n </div>\n );\n }\n\n /** Where an all-day drag would put its days, drawn over the bars. */\n function renderAllDayPreview(dates: readonly Date[]) {\n if (drag?.kind !== 'allDay') return null;\n const target = { id: '', title: '', allDay: true, ...drag.event, start: drag.start, end: drag.end };\n const [bar] = packLanes([target], dates);\n if (!bar) return null;\n return (\n <div\n className={cx(styles.timeGridBar, styles.timeGridBarPreview)}\n style={\n {\n '--event-color': drag.event?.color && cssColor(drag.event.color),\n gridColumn: `${bar.start + 1} / span ${bar.span}`,\n gridRow: 1,\n } as CSSProperties\n }\n aria-hidden\n >\n <span className={styles.timeGridBarTitle}>{drag.event?.title}</span>\n </div>\n );\n }\n\n const panes = STEPS.map((step) => {\n const paneRange = periodRange(period, stepDate(period, date, step, hidden), weekStartsOn, hidden);\n const start = paneRange.start;\n const dates = shownDays(start, dayDiff(start, paneRange.end), hidden);\n const allDay = packLanes(shown, dates, isAllDayLike);\n const lanes: LimitedLanes<E> = allDayOpen\n ? { visible: allDay, moreLane: 0, hidden: dates.map(() => 0) }\n : limitLanes(allDay, dates.length, ALL_DAY_LANES);\n return { step, start, dates, lanes };\n });\n const hasHidden = panes[1].lanes.hidden.some((count) => count > 0);\n const work = workingHours?.map((hour) => (clamp(hour, 0, 24) / 24) * 100);\n // Working from the evening into the morning, such as `[22, 6]`: shaded between its end and start.\n const overnight = work !== undefined && work[0] > work[1];\n const paneClass = (step: number) =>\n cx(pagerStyles.pagerPane, step === -1 && pagerStyles.pagerPanePrev, step === 1 && pagerStyles.pagerPaneNext);\n\n return (\n <div\n ref={scrollerRef}\n tabIndex={-1}\n className={styles.timeGrid}\n style={\n {\n '--days': columns.length,\n '--custom-calendar-hour-height': zoomRef.current ? `${zoomRef.current.hour}px` : undefined,\n '--work-start': work && `${Math.min(...work)}%`,\n '--work-end': work && `${Math.max(...work)}%`,\n } as CSSProperties\n }\n >\n <div ref={headRef} className={styles.timeGridHead}>\n <div className={styles.timeGridCorner}>\n {showWeekNumbers && (\n // Numbered by the ISO week holding most of the shown days, which the middle one is in.\n <span className={styles.timeGridWeekNumber}>\n {text.weekNumber(weekNumber(columns[Math.floor(columns.length / 2)]))}\n </span>\n )}\n {(hasHidden || allDayOpen) && (\n <ActionIcon\n className={cx(styles.timeGridToggle, allDayOpen && styles.timeGridToggleOpen)}\n icon={faChevronDown}\n title={text.allDay}\n aria-label={text.allDay}\n aria-expanded={allDayOpen}\n onClick={() => setAllDayOpen((open) => !open)}\n />\n )}\n </div>\n <div className={pagerStyles.pagerViewport}>\n <div ref={pager.trackRef} className={pagerStyles.pagerTrack}>\n {panes.map(({ step, start, dates, lanes }) => (\n <div\n key={dateToDay(start)}\n className={cx(paneClass(step), styles.timeGridHeadPane)}\n inert={step !== 0}\n aria-hidden={step !== 0 || undefined}\n >\n {dates.map((day) => {\n const isToday = isSameDay(day, now);\n const content = (\n <>\n <span className={styles.timeGridWeekday}>{formatWeekday(day, locale, 'short')}</span>\n <span className={cx(styles.timeGridDayNumber, isToday && styles.timeGridDayNumberToday)}>\n {formatDayNumber(day, locale)}\n </span>\n </>\n );\n const shared = {\n className: cx(styles.timeGridDayHeader, classNames?.dayHeader),\n style: slotStyles?.dayHeader,\n 'aria-current': isToday ? ('date' as const) : undefined,\n 'data-cal-head-day': dateToDay(day),\n };\n return columns.length > 1 && onOpenDay ? (\n <button\n key={dateToDay(day)}\n type='button'\n {...shared}\n className={cx(shared.className, styles.timeGridDayHeaderLink)}\n aria-label={formatLongDate(day, locale)}\n onClick={() => onOpenDay(day)}\n >\n {content}\n </button>\n ) : (\n <div key={dateToDay(day)} {...shared}>\n {content}\n </div>\n );\n })}\n <div\n ref={step === 0 ? allDayRef : undefined}\n className={cx(styles.timeGridAllDay, onSlotCreate && styles.timeGridAllDayCreatable)}\n aria-label={text.allDay}\n role='group'\n onClick={handleAllDayClick}\n >\n {lanes.visible.map(renderAllDayBar)}\n {lanes.hidden.map(\n (count, column) =>\n count > 0 && (\n <div\n key={`more-${column}`}\n aria-hidden\n data-cal-more\n className={styles.timeGridMore}\n style={{ gridColumn: column + 1, gridRow: lanes.moreLane + 1 }}\n onClick={() => setAllDayOpen(true)}\n >\n {text.more(count)}\n </div>\n ),\n )}\n {step === 0 && renderAllDayPreview(dates)}\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n\n <div ref={bodyRef} className={styles.timeGridBody}>\n <div className={styles.timeGridGutter} aria-hidden>\n {HOURS.map((hour) => (\n <span key={hour} className={styles.timeGridHour} style={{ top: `${(hour / 24) * 100}%` }}>\n {formatHour(hour, locale)}\n </span>\n ))}\n </div>\n <div className={pagerStyles.pagerViewport}>\n <div ref={pager.trackRef} className={pagerStyles.pagerTrack}>\n {panes.map(({ step, start, dates }) => (\n <div\n key={dateToDay(start)}\n ref={step === 0 ? currentRef : undefined}\n className={cx(paneClass(step), styles.timeGridBodyPane)}\n inert={step !== 0}\n aria-hidden={step !== 0 || undefined}\n >\n {dates.map((day) => {\n const isToday = isSameDay(day, now);\n return (\n <div\n key={dateToDay(day)}\n role='group'\n aria-label={formatLongDate(day, locale)}\n data-cal-column={dateToDay(day)}\n className={cx(\n styles.timeGridColumn,\n isToday && styles.timeGridColumnToday,\n work && styles.timeGridColumnWorking,\n overnight && styles.timeGridColumnWorkingOvernight,\n onSlotCreate && styles.timeGridColumnCreatable,\n classNames?.cell,\n )}\n style={slotStyles?.cell}\n onClick={(clickEvent) => handleColumnClick(clickEvent, day)}\n >\n {packDay(shown, day).map(renderBox)}\n {isToday && (\n <div\n className={styles.timeGridNow}\n style={{ top: `${(minutesOfDay(now) / MINUTES_PER_DAY) * 100}%` }}\n aria-hidden\n />\n )}\n {step === 0 && renderPreview(day)}\n </div>\n );\n })}\n {step === 0 && <div ref={slotRef} className={styles.timeGridSlot} aria-hidden />}\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nexport default TimeGrid;\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";var e=`timeGrid_eQt1f`,t=`timeGrid-head_QeMAH`,n=`timeGrid-corner_ass6Y`,r=`timeGrid-
|
|
1
|
+
"use client";var e=`timeGrid_eQt1f`,t=`timeGrid-head_QeMAH`,n=`timeGrid-corner_ass6Y`,r=`timeGrid-weekNumber_F7Cap`,i=`timeGrid-toggle_q0Oh4`,a=`timeGrid-toggle-open_CkMZf`,o=`timeGrid-headPane_KOqbR`,s=`timeGrid-dayHeader_nyugU`,c=`timeGrid-dayHeader-link_vE861`,l=`timeGrid-dayNumber_3xDPg`,u=`timeGrid-dayNumber-today_em4ho`,d=`timeGrid-weekday_BEOk2`,f=`timeGrid-allDay_sBaRg`,p=`timeGrid-allDay-creatable_H-gdV`,m=`timeGrid-bar_bGt1p`,h=`timeGrid-bar-continuesBefore_XRW1T`,g=`timeGrid-bar-continuesAfter_BsjNh`,_=`timeGrid-bar-title_iVZsx`,v=`timeGrid-bar-dragged_wxIVh`,y=`timeGrid-bar-preview_7L-kL`,b=`timeGrid-more_Fo6hf`,x=`timeGrid-body_Vzvbo`,S=`timeGrid-gutter_OuCf-`,C=`timeGrid-hour_wVF05`,w=`timeGrid-bodyPane_Ji1lF`,T=`timeGrid-column_mEJNy`,E=`timeGrid-column-today_goKa0`,D=`timeGrid-column-working_UQmgz`,O=`timeGrid-column-working-overnight_0wWgI`,k=`timeGrid-column-creatable_5MQ8P`,A=`timeGrid-event_qLWLI`,j=`timeGrid-event-short_akp1j`,M=`timeGrid-event-brief_AX4PC`,N=`timeGrid-resize_LdiRH`,P=`timeGrid-event-continuesBefore_uGyO5`,F=`timeGrid-event-continuesAfter_p-hcM`,I=`timeGrid-event-interactive_TXdJ8`,L=`timeGrid-event-dragged_UrxXL`,R=`timeGrid-event-title_uDvkI`,z=`timeGrid-event-time_O5W3b`,B=`timeGrid-preview_nfmke`,V=`timeGrid-preview-time_8hmVF`,H=`timeGrid-slot_s7iMI`,U=`timeGrid-now_Rs5aE`,W=`calendarNowPulse_DDoyI`,G={timeGrid:e,"timeGrid-head":`timeGrid-head_QeMAH`,timeGridHead:t,"timeGrid-corner":`timeGrid-corner_ass6Y`,timeGridCorner:n,"timeGrid-weekNumber":`timeGrid-weekNumber_F7Cap`,timeGridWeekNumber:r,"timeGrid-toggle":`timeGrid-toggle_q0Oh4`,timeGridToggle:i,"timeGrid-toggle-open":`timeGrid-toggle-open_CkMZf`,timeGridToggleOpen:a,"timeGrid-headPane":`timeGrid-headPane_KOqbR`,timeGridHeadPane:o,"timeGrid-dayHeader":`timeGrid-dayHeader_nyugU`,timeGridDayHeader:s,"timeGrid-dayHeader-link":`timeGrid-dayHeader-link_vE861`,timeGridDayHeaderLink:c,"timeGrid-dayNumber":`timeGrid-dayNumber_3xDPg`,timeGridDayNumber:l,"timeGrid-dayNumber-today":`timeGrid-dayNumber-today_em4ho`,timeGridDayNumberToday:u,"timeGrid-weekday":`timeGrid-weekday_BEOk2`,timeGridWeekday:d,"timeGrid-allDay":`timeGrid-allDay_sBaRg`,timeGridAllDay:f,"timeGrid-allDay-creatable":`timeGrid-allDay-creatable_H-gdV`,timeGridAllDayCreatable:p,"timeGrid-bar":`timeGrid-bar_bGt1p`,timeGridBar:m,"timeGrid-bar-continuesBefore":`timeGrid-bar-continuesBefore_XRW1T`,timeGridBarContinuesBefore:h,"timeGrid-bar-continuesAfter":`timeGrid-bar-continuesAfter_BsjNh`,timeGridBarContinuesAfter:g,"timeGrid-bar-title":`timeGrid-bar-title_iVZsx`,timeGridBarTitle:_,"timeGrid-bar-dragged":`timeGrid-bar-dragged_wxIVh`,timeGridBarDragged:v,"timeGrid-bar-preview":`timeGrid-bar-preview_7L-kL`,timeGridBarPreview:y,"timeGrid-more":`timeGrid-more_Fo6hf`,timeGridMore:b,"timeGrid-body":`timeGrid-body_Vzvbo`,timeGridBody:x,"timeGrid-gutter":`timeGrid-gutter_OuCf-`,timeGridGutter:S,"timeGrid-hour":`timeGrid-hour_wVF05`,timeGridHour:C,"timeGrid-bodyPane":`timeGrid-bodyPane_Ji1lF`,timeGridBodyPane:w,"timeGrid-column":`timeGrid-column_mEJNy`,timeGridColumn:T,"timeGrid-column-today":`timeGrid-column-today_goKa0`,timeGridColumnToday:E,"timeGrid-column-working":`timeGrid-column-working_UQmgz`,timeGridColumnWorking:D,"timeGrid-column-working-overnight":`timeGrid-column-working-overnight_0wWgI`,timeGridColumnWorkingOvernight:O,"timeGrid-column-creatable":`timeGrid-column-creatable_5MQ8P`,timeGridColumnCreatable:k,"timeGrid-event":`timeGrid-event_qLWLI`,timeGridEvent:A,"timeGrid-event-short":`timeGrid-event-short_akp1j`,timeGridEventShort:j,"timeGrid-event-brief":`timeGrid-event-brief_AX4PC`,timeGridEventBrief:M,"timeGrid-resize":`timeGrid-resize_LdiRH`,timeGridResize:N,"timeGrid-event-continuesBefore":`timeGrid-event-continuesBefore_uGyO5`,timeGridEventContinuesBefore:P,"timeGrid-event-continuesAfter":`timeGrid-event-continuesAfter_p-hcM`,timeGridEventContinuesAfter:F,"timeGrid-event-interactive":`timeGrid-event-interactive_TXdJ8`,timeGridEventInteractive:I,"timeGrid-event-dragged":`timeGrid-event-dragged_UrxXL`,timeGridEventDragged:L,"timeGrid-event-title":`timeGrid-event-title_uDvkI`,timeGridEventTitle:R,"timeGrid-event-time":`timeGrid-event-time_O5W3b`,timeGridEventTime:z,"timeGrid-preview":`timeGrid-preview_nfmke`,timeGridPreview:B,"timeGrid-preview-time":`timeGrid-preview-time_8hmVF`,timeGridPreviewTime:V,"timeGrid-slot":`timeGrid-slot_s7iMI`,timeGridSlot:H,"timeGrid-now":`timeGrid-now_Rs5aE`,timeGridNow:U,calendarNowPulse:W};export{W as calendarNowPulse,G as default,e as timeGrid,f as timeGridAllDay,p as timeGridAllDayCreatable,m as timeGridBar,g as timeGridBarContinuesAfter,h as timeGridBarContinuesBefore,v as timeGridBarDragged,y as timeGridBarPreview,_ as timeGridBarTitle,x as timeGridBody,w as timeGridBodyPane,T as timeGridColumn,k as timeGridColumnCreatable,E as timeGridColumnToday,D as timeGridColumnWorking,O as timeGridColumnWorkingOvernight,n as timeGridCorner,s as timeGridDayHeader,c as timeGridDayHeaderLink,l as timeGridDayNumber,u as timeGridDayNumberToday,A as timeGridEvent,M as timeGridEventBrief,F as timeGridEventContinuesAfter,P as timeGridEventContinuesBefore,L as timeGridEventDragged,I as timeGridEventInteractive,j as timeGridEventShort,z as timeGridEventTime,R as timeGridEventTitle,S as timeGridGutter,t as timeGridHead,o as timeGridHeadPane,C as timeGridHour,b as timeGridMore,U as timeGridNow,B as timeGridPreview,V as timeGridPreviewTime,N as timeGridResize,H as timeGridSlot,i as timeGridToggle,a as timeGridToggleOpen,r as timeGridWeekNumber,d as timeGridWeekday};
|
|
2
2
|
//# sourceMappingURL=timeGrid.module.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeGrid.module.mjs","names":[],"sources":["../../../../../../package/common/calendar/components/timeGrid/timeGrid.module.pcss"],"sourcesContent":["/* One vertical scroller holds the sticky head and the body, so the head's day columns line up\n with the body's by construction, scrollbar or not. Only the two tracks inside move sideways.\n Everything positioned in time uses percentages of the day, so zooming rewrites one custom\n property and nothing else. */\n.timeGrid {\n --gutter: 3.5em;\n --lane: 1.375em;\n\n position: relative;\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n outline: none;\n user-select: none;\n -webkit-touch-callout: none;\n\n /* Horizontal swipes page, pinches zoom, vertical drags still scroll. */\n touch-action: pan-y;\n\n &-head {\n position: sticky;\n top: 0;\n z-index: 1;\n display: grid;\n grid-template-columns: var(--gutter) minmax(0, 1fr);\n border-bottom: 1px solid var(--border-color);\n background: var(--background);\n }\n\n &-corner {\n display: flex;\n align-items: flex-end;\n justify-content: center;\n padding-bottom: 0.25em;\n }\n\n &-toggle {\n display: grid;\n place-items: center;\n width: 1.75em;\n height: 1.75em;\n padding: 0;\n border: 0;\n border-radius: 50%;\n background: transparent;\n color: var(--text-dark);\n font-size: 0.75em;\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n transition: transform 0.2s ease;\n\n &:hover {\n background: var(--background-accent-light);\n }\n\n &:focus-visible {\n outline: 2px solid var(--focus-border-color, var(--primary-color));\n }\n\n &-open {\n transform: rotate(180deg);\n }\n }\n\n &-headPane {\n display: grid;\n grid-template-columns: repeat(var(--days), minmax(0, 1fr));\n align-content: start;\n background: var(--background);\n }\n\n &-dayHeader {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.125em;\n padding: 0.375em 0 0.25em;\n border: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n\n &-link {\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n\n &:hover .timeGrid-dayNumber:not(.timeGrid-dayNumber-today) {\n background: var(--background-accent-light);\n }\n\n &:focus-visible {\n outline: 2px solid var(--focus-border-color, var(--primary-color));\n outline-offset: -2px;\n border-radius: var(--default-border-radius);\n }\n }\n }\n\n &-weekday {\n font-size: 0.6875em;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--text-dark);\n }\n\n &-dayNumber {\n display: grid;\n place-items: center;\n width: 1.875em;\n height: 1.875em;\n border-radius: 50%;\n font-size: 1.125em;\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n transition: background-color 0.15s ease;\n\n &-today {\n background: var(--custom-calendar-today-color);\n color: var(--text-on-primary);\n font-weight: 700;\n }\n }\n\n &-allDay {\n grid-column: 1 / -1;\n display: grid;\n grid-template-columns: repeat(var(--days), minmax(0, 1fr));\n grid-auto-rows: var(--lane);\n row-gap: 2px;\n min-height: 0.5em;\n padding: 2px 0 4px;\n }\n\n &-bar {\n --event: var(--event-color, var(--primary-color));\n\n min-width: 0;\n margin: 0 2px;\n padding: 0 0.5em;\n overflow: hidden;\n border: 0;\n border-radius: var(--custom-calendar-event-radius);\n background: color-mix(in oklab, var(--event) 22%, var(--background));\n box-shadow: inset 3px 0 0 var(--event);\n color: var(--text-color);\n font: inherit;\n font-size: 0.75em;\n font-weight: 500;\n text-align: left;\n white-space: nowrap;\n text-overflow: ellipsis;\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n\n &:hover {\n background: color-mix(in oklab, var(--event) 32%, var(--background));\n }\n\n &:focus-visible {\n outline: 2px solid var(--focus-border-color, var(--primary-color));\n }\n\n &-continuesBefore {\n margin-left: 0;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n box-shadow: none;\n }\n\n &-continuesAfter {\n margin-right: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n &-title {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &-more {\n align-self: center;\n margin: 0 2px;\n padding: 0 0.5em;\n border-radius: var(--custom-calendar-event-radius);\n font-size: 0.75em;\n font-weight: 600;\n white-space: nowrap;\n color: var(--text-dark);\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n\n &:hover {\n background: var(--background-accent-light);\n }\n }\n\n /* Its own stacking context, which keeps everything drawn in the hours under the sticky head\n above. Inside it, the now-line and the drag preview come after the events in the markup,\n and so paint over them without a z-index. */\n &-body {\n isolation: isolate;\n display: grid;\n grid-template-columns: var(--gutter) minmax(0, 1fr);\n height: calc(24 * var(--custom-calendar-hour-height));\n }\n\n &-gutter {\n position: relative;\n }\n\n &-hour {\n position: absolute;\n right: 0.625em;\n font-size: 0.6875em;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n color: var(--text-light);\n transform: translateY(-50%);\n }\n\n &-bodyPane {\n position: relative;\n display: grid;\n grid-template-columns: repeat(var(--days), minmax(0, 1fr));\n height: 100%;\n background: var(--background);\n }\n\n /* Hour lines, and fainter half-hour lines between them. */\n &-column {\n /* Events leave a strip on the right free, so there is always somewhere to press to create. */\n --column-width: calc(100% - 0.75em);\n\n position: relative;\n min-width: 0;\n border-left: 1px solid var(--border-color);\n background-image:\n linear-gradient(var(--border-color) 1px, transparent 1px),\n linear-gradient(color-mix(in oklab, var(--border-color) 45%, transparent) 1px, transparent 1px);\n background-position:\n 0 0,\n 0 calc(var(--custom-calendar-hour-height) / 2);\n background-size: 100% var(--custom-calendar-hour-height);\n\n &-today {\n background-color: color-mix(in oklab, var(--custom-calendar-today-color) 4%, transparent);\n }\n\n &-creatable {\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n }\n }\n\n &-event {\n --event: var(--event-color, var(--primary-color));\n\n position: absolute;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n min-width: 0;\n height: var(--span);\n margin: 0;\n padding: 0.2em 0.45em 0.2em 0.6em;\n overflow: hidden;\n container-type: size;\n border: 0;\n border-radius: var(--custom-calendar-event-radius);\n background: color-mix(in oklab, var(--event) 22%, var(--background));\n\n /* The outline in the page colour keeps side-by-side events apart. */\n box-shadow:\n inset 3px 0 0 var(--event),\n 0 0 0 1px var(--background);\n color: var(--text-color);\n font: inherit;\n font-size: 0.75em;\n line-height: 1.3;\n text-align: left;\n transition:\n background-color 0.15s ease,\n opacity 0.15s ease;\n\n &:hover {\n background: color-mix(in oklab, var(--event) 32%, var(--background));\n }\n\n &:focus-visible {\n z-index: 1;\n outline: 2px solid var(--focus-border-color, var(--primary-color));\n }\n\n &-short {\n flex-direction: row;\n\n /* Not `baseline`: a 15-minute event is shorter than its line, and centring clips it evenly\n rather than cutting off the bottom. Title and time share a font size, so they still line up. */\n align-items: center;\n gap: 0.4em;\n padding-block: 0;\n }\n\n /* Too short for its label, which would be clipped to nothing: a bar of its real length, and\n the label on a line of its own beneath it, in the room packDay leaves for it. */\n &-brief {\n /* One line, with room for the descenders that a line height of 1 clips in Firefox. Keep\n BRIEF_LABEL_MINUTES in layout.ts at least this tall at the default hour height. */\n --label: 1.25em;\n\n isolation: isolate;\n height: calc(var(--span) + var(--label));\n align-items: flex-end;\n line-height: var(--label);\n background: none;\n box-shadow: none;\n\n /* Under the label, which it covers once zoomed in: see the @container rule below. */\n &::before {\n content: '';\n position: absolute;\n z-index: -1;\n top: 0;\n right: 0;\n left: 0;\n height: max(2px, 100% - var(--label));\n border-radius: inherit;\n background: var(--event);\n transition:\n background-color 0.15s ease,\n opacity 0.15s ease;\n }\n\n &:hover {\n background: none;\n\n &::before {\n opacity: 0.75;\n }\n }\n\n /* On the bar's end, which is the event's, rather than under the label. */\n .timeGrid-resize {\n bottom: calc(var(--label) - 0.3em);\n height: 0.6em;\n max-height: none;\n }\n }\n\n &-continuesBefore {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n\n &-continuesAfter {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n &-interactive {\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n }\n\n &-dragged {\n opacity: 0.4;\n }\n\n &-title {\n flex: none;\n overflow: hidden;\n font-weight: 600;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n &-time {\n overflow: hidden;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n text-overflow: ellipsis;\n color: var(--text-dark);\n }\n }\n\n &-resize {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n height: 0.625em;\n\n /* Half at most, so a short event keeps a part that moves it: a finger's grip is taller. */\n max-height: 50%;\n cursor: ns-resize;\n\n /* A visible grip where a finger is the pointer, since there is no hover to reveal it. */\n @media (pointer: coarse) {\n height: 1.5em;\n\n &::after {\n content: '';\n position: absolute;\n bottom: 0.3em;\n left: 50%;\n width: 1.5em;\n height: 0.25em;\n border-radius: 0.125em;\n background: color-mix(in oklab, var(--event) 70%, var(--background));\n translate: -50% 0;\n }\n }\n }\n\n &-preview {\n --event: var(--event-color, var(--primary-color));\n\n position: absolute;\n left: 0;\n width: var(--column-width);\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n padding: 0.2em 0.45em 0.2em 0.6em;\n overflow: hidden;\n border-radius: var(--custom-calendar-event-radius);\n background: color-mix(in oklab, var(--event) 32%, var(--background));\n box-shadow:\n inset 3px 0 0 var(--event),\n 0 0.5em 1.25em color-mix(in oklab, var(--text-color) 22%, transparent);\n color: var(--text-color);\n font-size: 0.75em;\n line-height: 1.3;\n pointer-events: none;\n\n &-time {\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n }\n }\n\n /* The anchor `onSlotCreate` hands out, moved over each new slot. Transparent rather than\n hidden, so it keeps the box a popover measures and anchors to. */\n &-slot {\n position: absolute;\n opacity: 0;\n pointer-events: none;\n }\n\n &-now {\n position: absolute;\n right: 0;\n left: 0;\n height: 2px;\n margin-top: -1px;\n background: var(--custom-calendar-now-color);\n pointer-events: none;\n\n &::before {\n content: '';\n position: absolute;\n top: 50%;\n left: 0;\n width: 0.625em;\n height: 0.625em;\n border-radius: 50%;\n background: var(--custom-calendar-now-color);\n translate: -50% -50%;\n animation: calendarNowPulse 2.4s ease-in-out infinite;\n }\n }\n}\n\n/* Zoomed in until its bar holds its label, a brief event is drawn like any other, its label\n centred in the bar. 2.5em is twice the label's line: a condition cannot read `--label`. */\n@container (height >= 2.5em) {\n .timeGrid-event-brief::before {\n background: color-mix(in oklab, var(--event) 22%, var(--background));\n box-shadow: inset 3px 0 0 var(--event);\n }\n\n .timeGrid-event-brief:hover::before {\n background: color-mix(in oklab, var(--event) 32%, var(--background));\n opacity: 1;\n }\n\n .timeGrid-event-brief .timeGrid-event-title,\n .timeGrid-event-brief .timeGrid-event-time {\n align-self: flex-start;\n margin-top: calc((100cqh - 2 * var(--label)) / 2);\n }\n}\n\n/* An event shorter than its text shows its colour alone, not a slice of clipped letters. The `em`\n is the event's own font size, and zooming in brings the text back. */\n@container (height < 0.8em) {\n .timeGrid-event-title,\n .timeGrid-event-time {\n display: none;\n }\n}\n\n@keyframes calendarNowPulse {\n 50% {\n box-shadow: 0 0 0 0.3em color-mix(in oklab, var(--custom-calendar-now-color) 25%, transparent);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .timeGrid-toggle {\n transition: none;\n }\n\n .timeGrid-now::before {\n animation: none;\n }\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"timeGrid.module.mjs","names":[],"sources":["../../../../../../package/common/calendar/components/timeGrid/timeGrid.module.pcss"],"sourcesContent":["/* One vertical scroller holds the sticky head and the body, so the head's day columns line up\n with the body's by construction, scrollbar or not. Only the two tracks inside move sideways.\n Everything positioned in time uses percentages of the day, so zooming rewrites one custom\n property and nothing else. */\n.timeGrid {\n --gutter: 3.5em;\n --lane: 1.375em;\n\n position: relative;\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n outline: none;\n user-select: none;\n -webkit-touch-callout: none;\n\n /* Horizontal swipes page, pinches zoom, vertical drags still scroll. */\n touch-action: pan-y;\n\n &-head {\n position: sticky;\n top: 0;\n z-index: 1;\n display: grid;\n grid-template-columns: var(--gutter) minmax(0, 1fr);\n border-bottom: 1px solid var(--border-color);\n background: var(--background);\n }\n\n &-corner {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-end;\n padding-bottom: 0.25em;\n }\n\n /* At the top, level with the weekday names, while the toggle stays at the bottom. Wraps rather\n than spill over the first day: a translation such as `Semaine 40` is wider than the gutter. */\n &-weekNumber {\n max-width: 100%;\n margin-bottom: auto;\n padding-top: 0.55em;\n overflow-wrap: anywhere;\n font-size: 0.6875em;\n font-weight: 600;\n text-align: center;\n color: var(--text-light);\n }\n\n /* Points down to expand and up to collapse: the rotation says which, so it stays. Two classes,\n to outrank Button's own font-size whichever stylesheet loads first. */\n & &-toggle {\n font-size: 0.75em;\n transition: transform 0.2s ease;\n\n &-open {\n transform: rotate(180deg);\n }\n }\n\n &-headPane {\n display: grid;\n grid-template-columns: repeat(var(--days), minmax(0, 1fr));\n align-content: start;\n background: var(--background);\n }\n\n &-dayHeader {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.125em;\n padding: 0.375em 0 0.25em;\n border: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n\n &-link {\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n\n &:hover .timeGrid-dayNumber:not(.timeGrid-dayNumber-today) {\n background: var(--background-accent-light);\n }\n\n &:focus-visible {\n outline: 2px solid var(--focus-border-color, var(--primary-color));\n outline-offset: -2px;\n border-radius: var(--default-border-radius);\n }\n }\n }\n\n &-weekday {\n font-size: 0.6875em;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--text-dark);\n }\n\n &-dayNumber {\n display: grid;\n place-items: center;\n width: 1.875em;\n height: 1.875em;\n border-radius: 50%;\n font-size: 1.125em;\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n transition: background-color 0.15s ease;\n\n &-today {\n background: var(--custom-calendar-today-color);\n color: var(--text-on-primary);\n font-weight: 700;\n }\n }\n\n &-allDay {\n grid-column: 1 / -1;\n display: grid;\n grid-template-columns: repeat(var(--days), minmax(0, 1fr));\n grid-auto-rows: var(--lane);\n row-gap: 2px;\n min-height: 0.5em;\n padding: 2px 0 4px;\n\n /* A lane's height even when empty, so there is something to click to create. */\n &-creatable {\n min-height: var(--lane);\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n }\n }\n\n &-bar {\n --event: var(--event-color, var(--primary-color));\n\n min-width: 0;\n margin: 0 2px;\n padding: 0 0.5em;\n overflow: hidden;\n border: 0;\n border-radius: var(--custom-calendar-event-radius);\n background: color-mix(in oklab, var(--event) 22%, var(--background));\n box-shadow: inset 3px 0 0 var(--event);\n color: var(--text-color);\n font: inherit;\n font-size: 0.75em;\n font-weight: 500;\n text-align: left;\n white-space: nowrap;\n text-overflow: ellipsis;\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n\n &:hover {\n background: color-mix(in oklab, var(--event) 32%, var(--background));\n }\n\n &:focus-visible {\n outline: 2px solid var(--focus-border-color, var(--primary-color));\n }\n\n &-continuesBefore {\n margin-left: 0;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n box-shadow: none;\n }\n\n &-continuesAfter {\n margin-right: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n &-title {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n &-dragged {\n opacity: 0.4;\n }\n\n &-preview {\n background: color-mix(in oklab, var(--event) 32%, var(--background));\n box-shadow:\n inset 3px 0 0 var(--event),\n 0 0.25em 0.75em color-mix(in oklab, var(--text-color) 22%, transparent);\n pointer-events: none;\n }\n }\n\n &-more {\n align-self: center;\n margin: 0 2px;\n padding: 0 0.5em;\n border-radius: var(--custom-calendar-event-radius);\n font-size: 0.75em;\n font-weight: 600;\n white-space: nowrap;\n color: var(--text-dark);\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n\n &:hover {\n background: var(--background-accent-light);\n }\n }\n\n /* Its own stacking context, which keeps everything drawn in the hours under the sticky head\n above. Inside it, the now-line and the drag preview come after the events in the markup,\n and so paint over them without a z-index. */\n &-body {\n isolation: isolate;\n display: grid;\n grid-template-columns: var(--gutter) minmax(0, 1fr);\n height: calc(24 * var(--custom-calendar-hour-height));\n }\n\n &-gutter {\n position: relative;\n }\n\n &-hour {\n position: absolute;\n right: 0.625em;\n font-size: 0.6875em;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n color: var(--text-light);\n transform: translateY(-50%);\n }\n\n &-bodyPane {\n position: relative;\n display: grid;\n grid-template-columns: repeat(var(--days), minmax(0, 1fr));\n height: 100%;\n background: var(--background);\n }\n\n /* Hour lines, and fainter half-hour lines between them. */\n &-column {\n /* Events leave a strip on the right free, so there is always somewhere to press to create. */\n --column-width: calc(100% - 0.75em);\n --hour-line: linear-gradient(var(--border-color) 1px, transparent 1px);\n --half-hour-line: linear-gradient(color-mix(in oklab, var(--border-color) 45%, transparent) 1px, transparent 1px);\n\n position: relative;\n min-width: 0;\n border-left: 1px solid var(--border-color);\n background-image: var(--hour-line), var(--half-hour-line);\n background-position:\n 0 0,\n 0 calc(var(--custom-calendar-hour-height) / 2);\n background-size: 100% var(--custom-calendar-hour-height);\n\n &-today {\n background-color: color-mix(in oklab, var(--custom-calendar-today-color) 4%, transparent);\n }\n\n /* A layer under the hour lines rather than over them, so it can be opaque and still let them\n show, and over today's tint, which is the background colour. */\n &-working {\n --outside: var(--custom-calendar-off-hours-color);\n --inside: transparent;\n\n background-image:\n var(--hour-line), var(--half-hour-line),\n linear-gradient(\n var(--outside) var(--work-start),\n var(--inside) var(--work-start) var(--work-end),\n var(--outside) var(--work-end)\n );\n background-position:\n 0 0,\n 0 calc(var(--custom-calendar-hour-height) / 2),\n 0 0;\n background-size:\n 100% var(--custom-calendar-hour-height),\n 100% var(--custom-calendar-hour-height),\n 100% 100%;\n\n /* `--work-start` is the earlier hour, so an overnight shift is the part outside the band. */\n &-overnight {\n --outside: transparent;\n --inside: var(--custom-calendar-off-hours-color);\n }\n }\n\n &-creatable {\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n }\n }\n\n &-event {\n --event: var(--event-color, var(--primary-color));\n\n position: absolute;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n min-width: 0;\n height: var(--span);\n margin: 0;\n padding: 0.2em 0.45em 0.2em 0.6em;\n overflow: hidden;\n container-type: size;\n border: 0;\n border-radius: var(--custom-calendar-event-radius);\n background: color-mix(in oklab, var(--event) 22%, var(--background));\n\n /* The outline in the page colour keeps side-by-side events apart. */\n box-shadow:\n inset 3px 0 0 var(--event),\n 0 0 0 1px var(--background);\n color: var(--text-color);\n font: inherit;\n font-size: 0.75em;\n line-height: 1.3;\n text-align: left;\n transition:\n background-color 0.15s ease,\n opacity 0.15s ease;\n\n &:hover {\n background: color-mix(in oklab, var(--event) 32%, var(--background));\n }\n\n &:focus-visible {\n z-index: 1;\n outline: 2px solid var(--focus-border-color, var(--primary-color));\n }\n\n &-short {\n flex-direction: row;\n\n /* Not `baseline`: a 15-minute event is shorter than its line, and centring clips it evenly\n rather than cutting off the bottom. Title and time share a font size, so they still line up. */\n align-items: center;\n gap: 0.4em;\n padding-block: 0;\n }\n\n /* Too short for its label, which would be clipped to nothing: a bar of its real length, and\n the label on a line of its own beneath it, in the room packDay leaves for it. */\n &-brief {\n /* One line, with room for the descenders that a line height of 1 clips in Firefox. Keep\n BRIEF_LABEL_MINUTES in layout.ts at least this tall at the default hour height. */\n --label: 1.25em;\n\n isolation: isolate;\n height: calc(var(--span) + var(--label));\n align-items: flex-end;\n line-height: var(--label);\n background: none;\n box-shadow: none;\n\n /* Under the label, which it covers once zoomed in: see the @container rule below. */\n &::before {\n content: '';\n position: absolute;\n z-index: -1;\n top: 0;\n right: 0;\n left: 0;\n height: max(2px, 100% - var(--label));\n border-radius: inherit;\n background: var(--event);\n transition:\n background-color 0.15s ease,\n opacity 0.15s ease;\n }\n\n &:hover {\n background: none;\n\n &::before {\n opacity: 0.75;\n }\n }\n\n /* On the bar's end, which is the event's, rather than under the label. */\n .timeGrid-resize {\n bottom: calc(var(--label) - 0.3em);\n height: 0.6em;\n max-height: none;\n }\n }\n\n &-continuesBefore {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n\n &-continuesAfter {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n &-interactive {\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n }\n\n &-dragged {\n opacity: 0.4;\n }\n\n &-title {\n flex: none;\n overflow: hidden;\n font-weight: 600;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n &-time {\n overflow: hidden;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n text-overflow: ellipsis;\n color: var(--text-dark);\n }\n }\n\n &-resize {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n height: 0.625em;\n\n /* Half at most, so a short event keeps a part that moves it: a finger's grip is taller. */\n max-height: 50%;\n cursor: ns-resize;\n\n /* A visible grip where a finger is the pointer, since there is no hover to reveal it. */\n @media (pointer: coarse) {\n height: 1.5em;\n\n &::after {\n content: '';\n position: absolute;\n bottom: 0.3em;\n left: 50%;\n width: 1.5em;\n height: 0.25em;\n border-radius: 0.125em;\n background: color-mix(in oklab, var(--event) 70%, var(--background));\n translate: -50% 0;\n }\n }\n }\n\n &-preview {\n --event: var(--event-color, var(--primary-color));\n\n position: absolute;\n left: 0;\n width: var(--column-width);\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n padding: 0.2em 0.45em 0.2em 0.6em;\n overflow: hidden;\n border-radius: var(--custom-calendar-event-radius);\n background: color-mix(in oklab, var(--event) 32%, var(--background));\n box-shadow:\n inset 3px 0 0 var(--event),\n 0 0.5em 1.25em color-mix(in oklab, var(--text-color) 22%, transparent);\n color: var(--text-color);\n font-size: 0.75em;\n line-height: 1.3;\n pointer-events: none;\n\n &-time {\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n }\n }\n\n /* The anchor `onSlotCreate` hands out, moved over each new slot. Transparent rather than\n hidden, so it keeps the box a popover measures and anchors to. */\n &-slot {\n position: absolute;\n opacity: 0;\n pointer-events: none;\n }\n\n &-now {\n position: absolute;\n right: 0;\n left: 0;\n height: 2px;\n margin-top: -1px;\n background: var(--custom-calendar-now-color);\n pointer-events: none;\n\n &::before {\n content: '';\n position: absolute;\n top: 50%;\n left: 0;\n width: 0.625em;\n height: 0.625em;\n border-radius: 50%;\n background: var(--custom-calendar-now-color);\n translate: -50% -50%;\n animation: calendarNowPulse 2.4s ease-in-out infinite;\n }\n }\n}\n\n/* Zoomed in until its bar holds its label, a brief event is drawn like any other, its label\n centred in the bar. 2.5em is twice the label's line: a condition cannot read `--label`. */\n@container (height >= 2.5em) {\n .timeGrid-event-brief::before {\n background: color-mix(in oklab, var(--event) 22%, var(--background));\n box-shadow: inset 3px 0 0 var(--event);\n }\n\n .timeGrid-event-brief:hover::before {\n background: color-mix(in oklab, var(--event) 32%, var(--background));\n opacity: 1;\n }\n\n .timeGrid-event-brief .timeGrid-event-title,\n .timeGrid-event-brief .timeGrid-event-time {\n align-self: flex-start;\n margin-top: calc((100cqh - 2 * var(--label)) / 2);\n }\n}\n\n/* An event shorter than its text shows its colour alone, not a slice of clipped letters. The `em`\n is the event's own font size, and zooming in brings the text back. */\n@container (height < 0.8em) {\n .timeGrid-event-title,\n .timeGrid-event-time {\n display: none;\n }\n}\n\n@keyframes calendarNowPulse {\n 50% {\n box-shadow: 0 0 0 0.3em color-mix(in oklab, var(--custom-calendar-now-color) 25%, transparent);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .timeGrid .timeGrid-toggle {\n transition: none;\n }\n\n .timeGrid-now::before {\n animation: none;\n }\n}\n"],"mappings":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{dateToDay as e}from"../utils/day.mjs";import{CalendarView as t}from"./calendar.types.mjs";var n=1440;function r(e){return new Date(e.getFullYear(),e.getMonth(),e.getDate())}function i(e,t){return new Date(e.getFullYear(),e.getMonth(),e.getDate()+t)}function a(e,t){return new Date(e.getFullYear(),e.getMonth(),e.getDate()+t,e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds())}function o(e,t){return new Date(e,t+1,0).getDate()}function s(e,t){let n=new Date(e.getFullYear(),e.getMonth()+t,1),r=Math.min(e.getDate(),o(n.getFullYear(),n.getMonth()));return new Date(n.getFullYear(),n.getMonth(),r)}function c(e){return new Date(e.getFullYear(),e.getMonth(),1)}function l(e,t){return i(e,-((e.getDay()-t+7)%7))}function u(e,t){let n=Date.UTC(e.getFullYear(),e.getMonth(),e.getDate()),r=Date.UTC(t.getFullYear(),t.getMonth(),t.getDate());return Math.round((r-n)/864e5)}function d(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function f(e){return e.getHours()*60+e.getMinutes()}function p(e,t){return new Date(e.getFullYear(),e.getMonth(),e.getDate(),0,t)}function m(e,t,n){return t>e?t:new Date(e.getTime()+n*6e4)}
|
|
1
|
+
"use client";import{dateToDay as e}from"../utils/day.mjs";import{CalendarView as t}from"./calendar.types.mjs";var n=1440;function r(e){return new Date(e.getFullYear(),e.getMonth(),e.getDate())}function i(e,t){return new Date(e.getFullYear(),e.getMonth(),e.getDate()+t)}function a(e,t){return new Date(e.getFullYear(),e.getMonth(),e.getDate()+t,e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds())}function o(e,t){return new Date(e,t+1,0).getDate()}function s(e,t){let n=new Date(e.getFullYear(),e.getMonth()+t,1),r=Math.min(e.getDate(),o(n.getFullYear(),n.getMonth()));return new Date(n.getFullYear(),n.getMonth(),r)}function c(e){return new Date(e.getFullYear(),e.getMonth(),1)}function l(e,t){return i(e,-((e.getDay()-t+7)%7))}function u(e,t){let n=Date.UTC(e.getFullYear(),e.getMonth(),e.getDate()),r=Date.UTC(t.getFullYear(),t.getMonth(),t.getDate());return Math.round((r-n)/864e5)}function d(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function f(e){return e.getHours()*60+e.getMinutes()}function p(e,t){return new Date(e.getFullYear(),e.getMonth(),e.getDate(),0,t)}function m(e,t,n){return t>e?t:new Date(e.getTime()+n*6e4)}var h=new Set,g=`narrowWeek`;function _(e){return e===t.Day?1:e===`narrowWeek`?3:0}function v(e,n,i){return _(e)>0?r(n):e===t.Week?l(n,i):c(n)}function y(e,n,r,a=h){let o=v(e,n,r),c=_(e);if(c>0)return{start:o,end:i(S(o,c-1,a),1)};switch(e){case t.Month:{let e=l(o,r);return{start:e,end:i(e,42)}}case t.Week:return{start:o,end:i(o,7)};default:return{start:o,end:s(o,1)}}}function b(e){let t=new Set(e);return t.size===0||[0,1,2,3,4,5,6].every(e=>t.has(e))?h:t}function x(e,t,n=1){let a=r(e);for(;t.has(a.getDay());)a=i(a,n);return a}function S(e,t,n){let r=t<0?-1:1,a=e;for(let e=0;e<Math.abs(t);e++)a=x(i(a,r),n,r);return a}function C(e,n,r,a=h){let o=_(e);return o>0?S(n,r*o,a):e===t.Week?i(n,7*r):s(n,r)}function w(e,t,n,r=h){return{start:y(e,C(e,t,-1,r),n,r).start,end:y(e,C(e,t,1,r),n,r).end}}function T(e,t=e){let[n,a]=t<e?[t,e]:[e,t];return{start:r(n),end:i(a,1),allDay:!0}}function E(e,n,r,a){if(e===t.Month||e===t.Agenda)return T(n);let o=p(n,Math.min(r.getHours()+1,23)*60),s=new Date(o.getTime()+Math.max(60,a)*6e4),c=i(n,1);return{start:o,end:s<c?s:c,allDay:!1}}function D(e){let t=l(e,1),n=i(t,3).getFullYear();return u(l(new Date(n,0,4),1),t)/7+1}function O(e,t){return Array.from({length:t},(t,n)=>i(e,n))}function k(e,t,n=h){return O(e,t).filter(e=>!n.has(e.getDay()))}var A={ArrowLeft:-1,ArrowRight:1,ArrowUp:-7,ArrowDown:7};function j(e,t,n){return e in A?i(t,A[e]):e===`Home`?l(t,n):e===`End`?i(l(t,n),6):e===`PageUp`?s(t,-1):e===`PageDown`?s(t,1):null}function M(e,t,n,r=h){let i=j(e,t,n);return i&&x(i,r,e===`ArrowLeft`||e===`End`?-1:1)}export{n as MINUTES_PER_DAY,g as NARROW_WEEK,i as addDays,s as addMonths,T as allDaySlot,p as atMinutes,e as dateToDay,u as dayDiff,O as daysFrom,o as daysInMonth,m as endAfter,M as gridKeyTarget,b as hiddenDaySet,d as isSameDay,f as minutesOfDay,E as newEventSlot,y as periodRange,v as periodStart,w as rangeWithNeighbours,a as shiftDays,x as shownDay,k as shownDays,r as startOfDay,c as startOfMonth,l as startOfWeek,C as stepDate,D as weekNumber};
|
|
2
2
|
//# sourceMappingURL=dates.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dates.mjs","names":[],"sources":["../../../../package/common/calendar/dates.ts"],"sourcesContent":["import { CalendarView, type CalendarRange, type CalendarWeekStart } from './calendar.types';\n\n// All arithmetic goes through the local date fields rather than milliseconds: a day with a\n// daylight-saving change is 23 or 25 hours long, so adding 86 400 000 ms lands on the wrong day.\n\nexport const MINUTES_PER_DAY = 1440;\n\nexport function startOfDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n}\n\n/** Midnight, `days` calendar days away. */\nexport function addDays(date: Date, days: number): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days);\n}\n\n/** The same wall-clock time, `days` calendar days away. */\nexport function shiftDays(date: Date, days: number): Date {\n return new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate() + days,\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n date.getMilliseconds(),\n );\n}\n\nexport function daysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate();\n}\n\n/** Midnight, `months` months away. The day is clamped, so 31 January plus one month is the end of February. */\nexport function addMonths(date: Date, months: number): Date {\n const target = new Date(date.getFullYear(), date.getMonth() + months, 1);\n const day = Math.min(date.getDate(), daysInMonth(target.getFullYear(), target.getMonth()));\n return new Date(target.getFullYear(), target.getMonth(), day);\n}\n\nexport function startOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), 1);\n}\n\nexport function startOfWeek(date: Date, weekStartsOn: CalendarWeekStart): Date {\n return addDays(date, -((date.getDay() - weekStartsOn + 7) % 7));\n}\n\n/** Calendar days from `a` to `b`, whatever their times of day. */\nexport function dayDiff(a: Date, b: Date): number {\n const utcA = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());\n const utcB = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());\n return Math.round((utcB - utcA) / 86_400_000);\n}\n\nexport function isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n}\n\n// `'2026-09-26'` is also the key for lookups and React keys. Never `getTime()`: where a clock\n// change happens at midnight (America/Santiago), the day's first moment is 01:00, and two paths to\n// the same day disagree.\nexport { dateToDay } from '../utils/day';\n\n/** Wall-clock minutes since midnight. On a 25-hour day the repeated hour maps onto itself. */\nexport function minutesOfDay(date: Date): number {\n return date.getHours() * 60 + date.getMinutes();\n}\n\n/**\n * The wall-clock time `minutes` after the start of `day`; 1440 is the next midnight. A time the\n * clock skips resolves forwards (02:30 becomes 03:30) and a repeated one to its first occurrence.\n */\nexport function atMinutes(day: Date, minutes: number): Date {\n return new Date(day.getFullYear(), day.getMonth(), day.getDate(), 0, minutes);\n}\n\n/**\n * `end`, unless a clock change turned the range around: where one end lands in the hour the\n * clocks skip, a wall-clock end can fall on or before its start. Then `minutes` of real time\n * after the start instead.\n */\nexport function endAfter(start: Date, end: Date, minutes: number): Date {\n return end > start ? end : new Date(start.getTime() + minutes * 60_000);\n}\n\n/** Midnight of the first day of the period `date` is in. */\nexport function periodStart(view: CalendarView, date: Date, weekStartsOn: CalendarWeekStart): Date {\n switch (view) {\n case CalendarView.Week:\n return startOfWeek(date, weekStartsOn);\n case CalendarView.Day:\n return startOfDay(date);\n default:\n return startOfMonth(date);\n }\n}\n\n/** The days a view shows for `date`. The month view is always six full weeks. */\nexport function periodRange(view: CalendarView, date: Date, weekStartsOn: CalendarWeekStart): CalendarRange {\n const start = periodStart(view, date, weekStartsOn);\n switch (view) {\n case CalendarView.Month: {\n const gridStart = startOfWeek(start, weekStartsOn);\n return { start: gridStart, end: addDays(gridStart, 42) };\n }\n case CalendarView.Week:\n return { start, end: addDays(start, 7) };\n case CalendarView.Day:\n return { start, end: addDays(start, 1) };\n default:\n return { start, end: addMonths(start, 1) };\n }\n}\n\nconst NO_DAYS: ReadonlySet<number> = new Set();\n\n/** `hiddenDays` as a lookup. A list that leaves no day of the week hides nothing. */\nexport function hiddenDaySet(hiddenDays: readonly number[] | undefined): ReadonlySet<number> {\n const hidden = new Set(hiddenDays);\n return hidden.size === 0 || [0, 1, 2, 3, 4, 5, 6].every((day) => hidden.has(day)) ? NO_DAYS : hidden;\n}\n\n/** `date`, or the first shown day from it on in `direction`. */\nexport function shownDay(date: Date, hidden: ReadonlySet<number>, direction: 1 | -1 = 1): Date {\n let day = startOfDay(date);\n while (hidden.has(day.getDay())) day = addDays(day, direction);\n return day;\n}\n\n/** `date` moved by `steps` periods, keeping its place in the period where it can. */\nexport function stepDate(view: CalendarView, date: Date, steps: number, hidden: ReadonlySet<number> = NO_DAYS): Date {\n switch (view) {\n case CalendarView.Week:\n return addDays(date, 7 * steps);\n case CalendarView.Day: {\n const direction = steps < 0 ? -1 : 1;\n let day = date;\n for (let i = 0; i < Math.abs(steps); i++) day = shownDay(addDays(day, direction), hidden, direction);\n return day;\n }\n default:\n return addMonths(date, steps);\n }\n}\n\n/** The shown period plus one on either side: what the swipe pager can reveal. */\nexport function rangeWithNeighbours(\n view: CalendarView,\n date: Date,\n weekStartsOn: CalendarWeekStart,\n hidden: ReadonlySet<number> = NO_DAYS,\n): CalendarRange {\n return {\n start: periodRange(view, stepDate(view, date, -1, hidden), weekStartsOn).start,\n end: periodRange(view, stepDate(view, date, 1, hidden), weekStartsOn).end,\n };\n}\n\n/** Midnight of each of `count` days from `start`. */\nexport function daysFrom(start: Date, count: number): Date[] {\n return Array.from({ length: count }, (_, i) => addDays(start, i));\n}\n\n/** The days of `count` from `start` that are not hidden: the columns a row of them draws. */\nexport function shownDays(start: Date, count: number, hidden: ReadonlySet<number> = NO_DAYS): Date[] {\n return daysFrom(start, count).filter((day) => !hidden.has(day.getDay()));\n}\n\nconst KEY_DAYS: Record<string, number> = { ArrowLeft: -1, ArrowRight: 1, ArrowUp: -7, ArrowDown: 7 };\n\nfunction keyTarget(key: string, day: Date, weekStartsOn: CalendarWeekStart): Date | null {\n if (key in KEY_DAYS) return addDays(day, KEY_DAYS[key]);\n if (key === 'Home') return startOfWeek(day, weekStartsOn);\n if (key === 'End') return addDays(startOfWeek(day, weekStartsOn), 6);\n if (key === 'PageUp') return addMonths(day, -1);\n if (key === 'PageDown') return addMonths(day, 1);\n return null;\n}\n\n/**\n * The day a month grid moves to for `key`, or `null` for a key it does not handle. A hidden day\n * gives way to the next shown one in the direction the key points, so the focus stays on a cell.\n */\nexport function gridKeyTarget(\n key: string,\n day: Date,\n weekStartsOn: CalendarWeekStart,\n hidden: ReadonlySet<number> = NO_DAYS,\n): Date | null {\n const target = keyTarget(key, day, weekStartsOn);\n return target && shownDay(target, hidden, key === 'ArrowLeft' || key === 'End' ? -1 : 1);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dates.mjs","names":[],"sources":["../../../../package/common/calendar/dates.ts"],"sourcesContent":["import { CalendarView, type CalendarRange, type CalendarSlot, type CalendarWeekStart } from './calendar.types';\n\n// All arithmetic goes through the local date fields rather than milliseconds: a day with a\n// daylight-saving change is 23 or 25 hours long, so adding 86 400 000 ms lands on the wrong day.\n\nexport const MINUTES_PER_DAY = 1440;\n\nexport function startOfDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n}\n\n/** Midnight, `days` calendar days away. */\nexport function addDays(date: Date, days: number): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days);\n}\n\n/** The same wall-clock time, `days` calendar days away. */\nexport function shiftDays(date: Date, days: number): Date {\n return new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate() + days,\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n date.getMilliseconds(),\n );\n}\n\nexport function daysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate();\n}\n\n/** Midnight, `months` months away. The day is clamped, so 31 January plus one month is the end of February. */\nexport function addMonths(date: Date, months: number): Date {\n const target = new Date(date.getFullYear(), date.getMonth() + months, 1);\n const day = Math.min(date.getDate(), daysInMonth(target.getFullYear(), target.getMonth()));\n return new Date(target.getFullYear(), target.getMonth(), day);\n}\n\nexport function startOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), 1);\n}\n\nexport function startOfWeek(date: Date, weekStartsOn: CalendarWeekStart): Date {\n return addDays(date, -((date.getDay() - weekStartsOn + 7) % 7));\n}\n\n/** Calendar days from `a` to `b`, whatever their times of day. */\nexport function dayDiff(a: Date, b: Date): number {\n const utcA = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());\n const utcB = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());\n return Math.round((utcB - utcA) / 86_400_000);\n}\n\nexport function isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n}\n\n// `'2026-09-26'` is also the key for lookups and React keys. Never `getTime()`: where a clock\n// change happens at midnight (America/Santiago), the day's first moment is 01:00, and two paths to\n// the same day disagree.\nexport { dateToDay } from '../utils/day';\n\n/** Wall-clock minutes since midnight. On a 25-hour day the repeated hour maps onto itself. */\nexport function minutesOfDay(date: Date): number {\n return date.getHours() * 60 + date.getMinutes();\n}\n\n/**\n * The wall-clock time `minutes` after the start of `day`; 1440 is the next midnight. A time the\n * clock skips resolves forwards (02:30 becomes 03:30) and a repeated one to its first occurrence.\n */\nexport function atMinutes(day: Date, minutes: number): Date {\n return new Date(day.getFullYear(), day.getMonth(), day.getDate(), 0, minutes);\n}\n\n/**\n * `end`, unless a clock change turned the range around: where one end lands in the hour the\n * clocks skip, a wall-clock end can fall on or before its start. Then `minutes` of real time\n * after the start instead.\n */\nexport function endAfter(start: Date, end: Date, minutes: number): Date {\n return end > start ? end : new Date(start.getTime() + minutes * 60_000);\n}\n\nconst NO_DAYS: ReadonlySet<number> = new Set();\n\n/**\n * The Week view of a narrow calendar: three shown days from the selected one, paged by three, where\n * seven columns would leave no room for a title. Not a `CalendarView`: the switcher still says Week.\n */\nexport const NARROW_WEEK = 'narrowWeek';\n\n/** What the period arithmetic is keyed by: a view, or the narrow calendar's Week. */\nexport type CalendarPeriod = CalendarView | typeof NARROW_WEEK;\n\n/** Shown days in a period that runs from the selected day, or 0 for one fixed to a week or month. */\nfunction rollingDays(period: CalendarPeriod): number {\n if (period === CalendarView.Day) return 1;\n return period === NARROW_WEEK ? 3 : 0;\n}\n\n/** Midnight of the first day of the period `date` is in. */\nexport function periodStart(period: CalendarPeriod, date: Date, weekStartsOn: CalendarWeekStart): Date {\n if (rollingDays(period) > 0) return startOfDay(date);\n return period === CalendarView.Week ? startOfWeek(date, weekStartsOn) : startOfMonth(date);\n}\n\n/** The days a view shows for `date`. The month view is always six full weeks. */\nexport function periodRange(\n period: CalendarPeriod,\n date: Date,\n weekStartsOn: CalendarWeekStart,\n hidden: ReadonlySet<number> = NO_DAYS,\n): CalendarRange {\n const start = periodStart(period, date, weekStartsOn);\n const rolling = rollingDays(period);\n if (rolling > 0) return { start, end: addDays(stepShownDays(start, rolling - 1, hidden), 1) };\n switch (period) {\n case CalendarView.Month: {\n const gridStart = startOfWeek(start, weekStartsOn);\n return { start: gridStart, end: addDays(gridStart, 42) };\n }\n case CalendarView.Week:\n return { start, end: addDays(start, 7) };\n default:\n return { start, end: addMonths(start, 1) };\n }\n}\n\n/** `hiddenDays` as a lookup. A list that leaves no day of the week hides nothing. */\nexport function hiddenDaySet(hiddenDays: readonly number[] | undefined): ReadonlySet<number> {\n const hidden = new Set(hiddenDays);\n return hidden.size === 0 || [0, 1, 2, 3, 4, 5, 6].every((day) => hidden.has(day)) ? NO_DAYS : hidden;\n}\n\n/** `date`, or the first shown day from it on in `direction`. */\nexport function shownDay(date: Date, hidden: ReadonlySet<number>, direction: 1 | -1 = 1): Date {\n let day = startOfDay(date);\n while (hidden.has(day.getDay())) day = addDays(day, direction);\n return day;\n}\n\n/** `steps` shown days on from the shown day `date`, or back for a negative count. */\nfunction stepShownDays(date: Date, steps: number, hidden: ReadonlySet<number>): Date {\n const direction = steps < 0 ? -1 : 1;\n let day = date;\n for (let i = 0; i < Math.abs(steps); i++) day = shownDay(addDays(day, direction), hidden, direction);\n return day;\n}\n\n/** `date` moved by `steps` periods, keeping its place in the period where it can. */\nexport function stepDate(\n period: CalendarPeriod,\n date: Date,\n steps: number,\n hidden: ReadonlySet<number> = NO_DAYS,\n): Date {\n const rolling = rollingDays(period);\n if (rolling > 0) return stepShownDays(date, steps * rolling, hidden);\n return period === CalendarView.Week ? addDays(date, 7 * steps) : addMonths(date, steps);\n}\n\n/** The shown period plus one on either side: what the swipe pager can reveal. */\nexport function rangeWithNeighbours(\n period: CalendarPeriod,\n date: Date,\n weekStartsOn: CalendarWeekStart,\n hidden: ReadonlySet<number> = NO_DAYS,\n): CalendarRange {\n return {\n start: periodRange(period, stepDate(period, date, -1, hidden), weekStartsOn, hidden).start,\n end: periodRange(period, stepDate(period, date, 1, hidden), weekStartsOn, hidden).end,\n };\n}\n\n/** Every day from `first` to `last`, in either order: what creating whole days hands out. */\nexport function allDaySlot(first: Date, last: Date = first): CalendarSlot {\n const [from, to] = last < first ? [last, first] : [first, last];\n return { start: startOfDay(from), end: addDays(to, 1), allDay: true };\n}\n\n/**\n * What the header's New event button creates on `day`: in the week and day views the hour from\n * the next full hour of the clock, as calendar apps do, and elsewhere the whole day.\n */\nexport function newEventSlot(period: CalendarPeriod, day: Date, now: Date, slotMinutes: number): CalendarSlot {\n if (period === CalendarView.Month || period === CalendarView.Agenda) return allDaySlot(day);\n // 23:00 at the latest, even after 23:00 today: the slot stays on the selected day.\n const start = atMinutes(day, Math.min(now.getHours() + 1, 23) * 60);\n // Real time, as a click on empty time makes it: across a clock change an hour on the clock is none or two.\n const end = new Date(start.getTime() + Math.max(60, slotMinutes) * 60_000);\n const midnight = addDays(day, 1);\n return { start, end: end < midnight ? end : midnight, allDay: false };\n}\n\n/** The ISO 8601 week `date` falls in: weeks run Monday to Sunday, and week 1 holds 4 January. */\nexport function weekNumber(date: Date): number {\n const monday = startOfWeek(date, 1);\n // A week across New Year belongs to the year of its Thursday.\n const year = addDays(monday, 3).getFullYear();\n return dayDiff(startOfWeek(new Date(year, 0, 4), 1), monday) / 7 + 1;\n}\n\n/** Midnight of each of `count` days from `start`. */\nexport function daysFrom(start: Date, count: number): Date[] {\n return Array.from({ length: count }, (_, i) => addDays(start, i));\n}\n\n/** The days of `count` from `start` that are not hidden: the columns a row of them draws. */\nexport function shownDays(start: Date, count: number, hidden: ReadonlySet<number> = NO_DAYS): Date[] {\n return daysFrom(start, count).filter((day) => !hidden.has(day.getDay()));\n}\n\nconst KEY_DAYS: Record<string, number> = { ArrowLeft: -1, ArrowRight: 1, ArrowUp: -7, ArrowDown: 7 };\n\nfunction keyTarget(key: string, day: Date, weekStartsOn: CalendarWeekStart): Date | null {\n if (key in KEY_DAYS) return addDays(day, KEY_DAYS[key]);\n if (key === 'Home') return startOfWeek(day, weekStartsOn);\n if (key === 'End') return addDays(startOfWeek(day, weekStartsOn), 6);\n if (key === 'PageUp') return addMonths(day, -1);\n if (key === 'PageDown') return addMonths(day, 1);\n return null;\n}\n\n/**\n * The day a month grid moves to for `key`, or `null` for a key it does not handle. A hidden day\n * gives way to the next shown one in the direction the key points, so the focus stays on a cell.\n */\nexport function gridKeyTarget(\n key: string,\n day: Date,\n weekStartsOn: CalendarWeekStart,\n hidden: ReadonlySet<number> = NO_DAYS,\n): Date | null {\n const target = keyTarget(key, day, weekStartsOn);\n return target && shownDay(target, hidden, key === 'ArrowLeft' || key === 'End' ? -1 : 1);\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{CalendarView as e}from"./calendar.types.mjs";import{addDays as
|
|
1
|
+
"use client";import{CalendarView as e}from"./calendar.types.mjs";import{NARROW_WEEK as t,addDays as n}from"./dates.mjs";var r=new Map,i;function a(){return i===void 0&&(i=new Intl.DateTimeFormat().resolvedOptions().timeZone,queueMicrotask(()=>{i=void 0})),i}function o(e,t){let n=`${a()}|${e??``}|${JSON.stringify(t)}`,i=r.get(n);return i||(i=new Intl.DateTimeFormat(e,t),r.set(n,i)),i}function s(e,t,n){return e.formatRange(t,n)}var c=new Map;function l(e){let t=e??``,n=c.get(t);if(n!==void 0)return n;let r=1;try{let t=e??new Intl.DateTimeFormat().resolvedOptions().locale,n=new Intl.Locale(t),i=n.getWeekInfo?.()??n.weekInfo;i&&(r=i.firstDay%7)}catch{}return c.set(t,r),r}function u(e){let t=o(e,{hour:`numeric`}).resolvedOptions().hourCycle;return t===`h11`||t===`h12`}function d(e,t){return o(t,{hour:`numeric`,minute:`2-digit`}).format(e)}function f(e,t,n){return s(o(n,{hour:`numeric`,minute:`2-digit`}),e,t)}function p(e,t,n){let r=new Date(2e3,0,1,e.getHours(),e.getMinutes()),i=new Date(2e3,0,1,t.getHours(),t.getMinutes());try{return s(o(n,{hour:`numeric`,minute:`2-digit`}),r,i)}catch{return d(e,n)}}function m(e,t){let n=new Date(2e3,0,1,e);return u(t)?o(t,{hour:`numeric`}).format(n):o(t,{hour:`2-digit`,minute:`2-digit`}).format(n)}function h(e,t,n){return o(t,{weekday:n}).format(e)}function g(e,t){return o(t,{day:`numeric`}).format(e)}function _(e,t){return o(t,{weekday:`long`,day:`numeric`,month:`long`,year:`numeric`}).format(e)}function v(e,t){return o(t,{month:`long`,year:`numeric`}).format(e)}function y(r,i,a,c){switch(r){case e.Week:case t:return s(o(c,{day:`numeric`,month:`short`,year:`numeric`}),a.start,n(a.end,-1));case e.Day:return _(i,c);default:return v(i,c)}}export{p as formatClockRange,g as formatDayNumber,m as formatHour,_ as formatLongDate,v as formatMonthTitle,y as formatPeriodTitle,d as formatTime,f as formatTimeRange,h as formatWeekday,o as formatter,l as localeWeekStart};
|
|
2
2
|
//# sourceMappingURL=format.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.mjs","names":[],"sources":["../../../../package/common/calendar/format.ts"],"sourcesContent":["import { CalendarView, type CalendarRange, type CalendarWeekStart } from './calendar.types';\nimport { addDays } from './dates';\n\n// `locale` is passed to Intl as given, and `undefined` means the browser's locale. Not\n// `getLocale()` from services/localization: it narrows to a few supported locales and maps\n// en-GB to en-US, which would give British users 12-hour times.\n\nconst formatters = new Map<string, Intl.DateTimeFormat>();\nlet zone: string | undefined;\n\n/**\n * Read once per task: reading the zone costs as much as building a formatter. Its name, not its\n * offsets, because Casablanca and Brazzaville share January's and July's but not March's.\n */\nfunction currentZone(): string {\n if (zone === undefined) {\n zone = new Intl.DateTimeFormat().resolvedOptions().timeZone;\n queueMicrotask(() => {\n zone = undefined;\n });\n }\n return zone;\n}\n\n/**\n * Cached, since building one costs about fifty times more than using it. A formatter keeps the\n * time zone it was built in while `Date` follows the current one, so the key carries the zone: a\n * zone change (the device's, or `process.env.TZ` between tests) then builds a new formatter\n * instead of labelling days in the old zone.\n */\nexport function formatter(locale: string | undefined, options: Intl.DateTimeFormatOptions): Intl.DateTimeFormat {\n const key = `${currentZone()}|${locale ?? ''}|${JSON.stringify(options)}`;\n let cached = formatters.get(key);\n if (!cached) {\n cached = new Intl.DateTimeFormat(locale, options);\n formatters.set(key, cached);\n }\n return cached;\n}\n\n// ES2020's lib predates `formatRange`, which every supported browser has had since 2021.\nfunction formatRange(format: Intl.DateTimeFormat, start: Date, end: Date): string {\n return (format as Intl.DateTimeFormat & { formatRange(a: Date, b: Date): string }).formatRange(start, end);\n}\n\ntype WeekInfoLocale = Intl.Locale & {\n getWeekInfo?: () => { firstDay: number };\n /** The accessor form Chrome 99 to 129 and Safari 15.4 to 16 shipped before the method. */\n weekInfo?: { firstDay: number };\n};\n\nconst weekStarts = new Map<string, CalendarWeekStart>();\n\n/**\n * The locale's first day of the week, falling back to Monday where `getWeekInfo` is missing:\n * it is Baseline only since July 2026 (Chrome 130, Firefox 153, Safari 17).\n */\nexport function localeWeekStart(locale: string | undefined): CalendarWeekStart {\n const key = locale ?? '';\n const cached = weekStarts.get(key);\n if (cached !== undefined) return cached;\n\n let result: CalendarWeekStart = 1;\n try {\n const tag = locale ?? new Intl.DateTimeFormat().resolvedOptions().locale;\n const info = new Intl.Locale(tag) as WeekInfoLocale;\n const weekInfo = info.getWeekInfo?.() ?? info.weekInfo;\n // `firstDay` counts 1 (Monday) to 7 (Sunday); `getDay()` counts 0 (Sunday) to 6.\n if (weekInfo) result = (weekInfo.firstDay % 7) as CalendarWeekStart;\n } catch {\n // An invalid tag: Intl.DateTimeFormat would have thrown for it too, so keep the fallback.\n }\n weekStarts.set(key, result);\n return result;\n}\n\nfunction uses12Hour(locale: string | undefined): boolean {\n // `hourCycle` is missing from ES2020's lib typings, not from any supported browser.\n const options = formatter(locale, { hour: 'numeric' }).resolvedOptions() as { hourCycle?: string };\n const cycle = options.hourCycle;\n return cycle === 'h11' || cycle === 'h12';\n}\n\nexport function formatTime(date: Date, locale: string | undefined): string {\n return formatter(locale, { hour: 'numeric', minute: '2-digit' }).format(date);\n}\n\n/** A time span, with the dates added by Intl where the two ends fall on different days. */\nexport function formatTimeRange(start: Date, end: Date, locale: string | undefined): string {\n return formatRange(formatter(locale, { hour: 'numeric', minute: '2-digit' }), start, end);\n}\n\n/**\n * The clock times alone, `10:00 PM to 2:00 AM` as the locale writes it, where `formatTimeRange` would add both dates for\n * an event that crosses midnight. Both ends are moved onto one day for it. The first spec of\n * `formatRange` threw a RangeError for an end earlier than the start; an engine still doing that\n * gets the start time alone.\n */\nexport function formatClockRange(start: Date, end: Date, locale: string | undefined): string {\n const from = new Date(2000, 0, 1, start.getHours(), start.getMinutes());\n const to = new Date(2000, 0, 1, end.getHours(), end.getMinutes());\n try {\n return formatRange(formatter(locale, { hour: 'numeric', minute: '2-digit' }), from, to);\n } catch {\n return formatTime(start, locale);\n }\n}\n\n/** `9 AM` where the locale counts to twelve, `09:00` where it counts to 24. */\nexport function formatHour(hour: number, locale: string | undefined): string {\n const date = new Date(2000, 0, 1, hour);\n return uses12Hour(locale)\n ? formatter(locale, { hour: 'numeric' }).format(date)\n : formatter(locale, { hour: '2-digit', minute: '2-digit' }).format(date);\n}\n\nexport function formatWeekday(date: Date, locale: string | undefined, width: 'long' | 'short' | 'narrow'): string {\n return formatter(locale, { weekday: width }).format(date);\n}\n\n/** The day of the month in the locale's own digits. */\nexport function formatDayNumber(date: Date, locale: string | undefined): string {\n return formatter(locale, { day: 'numeric' }).format(date);\n}\n\nexport function formatLongDate(date: Date, locale: string | undefined): string {\n return formatter(locale, { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' }).format(date);\n}\n\nexport function formatShortDate(date: Date, locale: string | undefined): string {\n return formatter(locale, { weekday: 'short', day: 'numeric', month: 'short' }).format(date);\n}\n\nexport function formatMonthTitle(date: Date, locale: string | undefined): string {\n return formatter(locale, { month: 'long', year: 'numeric' }).format(date);\n}\n\nexport function formatPeriodTitle(\n
|
|
1
|
+
{"version":3,"file":"format.mjs","names":[],"sources":["../../../../package/common/calendar/format.ts"],"sourcesContent":["import { CalendarView, type CalendarRange, type CalendarWeekStart } from './calendar.types';\nimport { addDays, NARROW_WEEK, type CalendarPeriod } from './dates';\n\n// `locale` is passed to Intl as given, and `undefined` means the browser's locale. Not\n// `getLocale()` from services/localization: it narrows to a few supported locales and maps\n// en-GB to en-US, which would give British users 12-hour times.\n\nconst formatters = new Map<string, Intl.DateTimeFormat>();\nlet zone: string | undefined;\n\n/**\n * Read once per task: reading the zone costs as much as building a formatter. Its name, not its\n * offsets, because Casablanca and Brazzaville share January's and July's but not March's.\n */\nfunction currentZone(): string {\n if (zone === undefined) {\n zone = new Intl.DateTimeFormat().resolvedOptions().timeZone;\n queueMicrotask(() => {\n zone = undefined;\n });\n }\n return zone;\n}\n\n/**\n * Cached, since building one costs about fifty times more than using it. A formatter keeps the\n * time zone it was built in while `Date` follows the current one, so the key carries the zone: a\n * zone change (the device's, or `process.env.TZ` between tests) then builds a new formatter\n * instead of labelling days in the old zone.\n */\nexport function formatter(locale: string | undefined, options: Intl.DateTimeFormatOptions): Intl.DateTimeFormat {\n const key = `${currentZone()}|${locale ?? ''}|${JSON.stringify(options)}`;\n let cached = formatters.get(key);\n if (!cached) {\n cached = new Intl.DateTimeFormat(locale, options);\n formatters.set(key, cached);\n }\n return cached;\n}\n\n// ES2020's lib predates `formatRange`, which every supported browser has had since 2021.\nfunction formatRange(format: Intl.DateTimeFormat, start: Date, end: Date): string {\n return (format as Intl.DateTimeFormat & { formatRange(a: Date, b: Date): string }).formatRange(start, end);\n}\n\ntype WeekInfoLocale = Intl.Locale & {\n getWeekInfo?: () => { firstDay: number };\n /** The accessor form Chrome 99 to 129 and Safari 15.4 to 16 shipped before the method. */\n weekInfo?: { firstDay: number };\n};\n\nconst weekStarts = new Map<string, CalendarWeekStart>();\n\n/**\n * The locale's first day of the week, falling back to Monday where `getWeekInfo` is missing:\n * it is Baseline only since July 2026 (Chrome 130, Firefox 153, Safari 17).\n */\nexport function localeWeekStart(locale: string | undefined): CalendarWeekStart {\n const key = locale ?? '';\n const cached = weekStarts.get(key);\n if (cached !== undefined) return cached;\n\n let result: CalendarWeekStart = 1;\n try {\n const tag = locale ?? new Intl.DateTimeFormat().resolvedOptions().locale;\n const info = new Intl.Locale(tag) as WeekInfoLocale;\n const weekInfo = info.getWeekInfo?.() ?? info.weekInfo;\n // `firstDay` counts 1 (Monday) to 7 (Sunday); `getDay()` counts 0 (Sunday) to 6.\n if (weekInfo) result = (weekInfo.firstDay % 7) as CalendarWeekStart;\n } catch {\n // An invalid tag: Intl.DateTimeFormat would have thrown for it too, so keep the fallback.\n }\n weekStarts.set(key, result);\n return result;\n}\n\nfunction uses12Hour(locale: string | undefined): boolean {\n // `hourCycle` is missing from ES2020's lib typings, not from any supported browser.\n const options = formatter(locale, { hour: 'numeric' }).resolvedOptions() as { hourCycle?: string };\n const cycle = options.hourCycle;\n return cycle === 'h11' || cycle === 'h12';\n}\n\nexport function formatTime(date: Date, locale: string | undefined): string {\n return formatter(locale, { hour: 'numeric', minute: '2-digit' }).format(date);\n}\n\n/** A time span, with the dates added by Intl where the two ends fall on different days. */\nexport function formatTimeRange(start: Date, end: Date, locale: string | undefined): string {\n return formatRange(formatter(locale, { hour: 'numeric', minute: '2-digit' }), start, end);\n}\n\n/**\n * The clock times alone, `10:00 PM to 2:00 AM` as the locale writes it, where `formatTimeRange` would add both dates for\n * an event that crosses midnight. Both ends are moved onto one day for it. The first spec of\n * `formatRange` threw a RangeError for an end earlier than the start; an engine still doing that\n * gets the start time alone.\n */\nexport function formatClockRange(start: Date, end: Date, locale: string | undefined): string {\n const from = new Date(2000, 0, 1, start.getHours(), start.getMinutes());\n const to = new Date(2000, 0, 1, end.getHours(), end.getMinutes());\n try {\n return formatRange(formatter(locale, { hour: 'numeric', minute: '2-digit' }), from, to);\n } catch {\n return formatTime(start, locale);\n }\n}\n\n/** `9 AM` where the locale counts to twelve, `09:00` where it counts to 24. */\nexport function formatHour(hour: number, locale: string | undefined): string {\n const date = new Date(2000, 0, 1, hour);\n return uses12Hour(locale)\n ? formatter(locale, { hour: 'numeric' }).format(date)\n : formatter(locale, { hour: '2-digit', minute: '2-digit' }).format(date);\n}\n\nexport function formatWeekday(date: Date, locale: string | undefined, width: 'long' | 'short' | 'narrow'): string {\n return formatter(locale, { weekday: width }).format(date);\n}\n\n/** The day of the month in the locale's own digits. */\nexport function formatDayNumber(date: Date, locale: string | undefined): string {\n return formatter(locale, { day: 'numeric' }).format(date);\n}\n\nexport function formatLongDate(date: Date, locale: string | undefined): string {\n return formatter(locale, { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' }).format(date);\n}\n\nexport function formatShortDate(date: Date, locale: string | undefined): string {\n return formatter(locale, { weekday: 'short', day: 'numeric', month: 'short' }).format(date);\n}\n\nexport function formatMonthTitle(date: Date, locale: string | undefined): string {\n return formatter(locale, { month: 'long', year: 'numeric' }).format(date);\n}\n\nexport function formatPeriodTitle(\n period: CalendarPeriod,\n date: Date,\n range: CalendarRange,\n locale: string | undefined,\n): string {\n switch (period) {\n case CalendarView.Week:\n case NARROW_WEEK:\n return formatRange(\n formatter(locale, { day: 'numeric', month: 'short', year: 'numeric' }),\n range.start,\n addDays(range.end, -1),\n );\n case CalendarView.Day:\n return formatLongDate(date, locale);\n default:\n return formatMonthTitle(date, locale);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{MINUTES_PER_DAY as e,addDays as t,dayDiff as n,
|
|
1
|
+
"use client";import{MINUTES_PER_DAY as e,addDays as t,dayDiff as n,endAfter as r,minutesOfDay as i,shiftDays as a,startOfDay as o}from"./dates.mjs";var s=864e5,c=20;function l(e){return e.end<e.start?e.start:e.end}function u(e,t){let n=a(e.start,t),i=(l(e).getTime()-e.start.getTime())/6e4;return{start:n,end:r(n,a(l(e),t),i)}}function d(e){return!!e.allDay||l(e).getTime()-e.start.getTime()>=s}function f(e){let r=o(e.start),i=l(e);if(e.allDay){let e=o(i);return{first:r,last:n(r,e)>=1?t(e,-1):r}}return{first:r,last:i>e.start?o(new Date(i.getTime()-1)):r}}function p(e,t){let n=Number(d(t))-Number(d(e));if(n!==0)return n;let r=e.start.getTime()-t.start.getTime();if(r!==0)return r;let i=l(t).getTime()-l(e).getTime();return i===0?e.title.localeCompare(t.title):i}function m(e,t){let r=t.map(()=>[]);for(let i of e){let{first:e,last:a}=f(i);t.forEach((t,o)=>{n(e,t)>=0&&n(t,a)>=0&&r[o].push(i)})}for(let e of r)e.sort(p);return r}function h(n,r){let a=o(r),s=t(a,1),u=[];for(let t of n){if(d(t))continue;let{start:n}=t,r=l(t);if(n>=s||r<=a&&n<a)continue;let o=n<a,f=r>s,p=o?0:i(n),m=Math.max(r>=s?e:i(r),p),h=m-p<15?Math.min(m+c,e):m;u.push({event:t,top:p,bottom:m,reach:h,column:0,columns:1,span:1,continuesBefore:o,continuesAfter:f})}u.sort((e,t)=>e.top-t.top||t.reach-e.reach);let f=[],p=-1;for(let e of u)f.length>0&&e.top>=p&&(g(f),f=[]),f.push(e),p=Math.max(p,e.reach);return f.length>0&&g(f),u}function g(e){let t=[];for(let n of e){let e=t.findIndex(e=>e<=n.top);e===-1&&(e=t.push(0)-1),n.column=e,t[e]=n.reach}let n=t.length;for(let t of e){t.columns=n;let r=1;for(let i=t.column+1;i<n&&!e.some(e=>e.column===i&&e.top<t.reach&&e.reach>t.top);i++)r++;t.span=r}}function _(e,t,r=()=>!0){let i=[];for(let a of e){if(!r(a))continue;let{first:e,last:o}=f(a),s=t.findIndex(t=>n(e,t)>=0&&n(t,o)>=0);if(s===-1)continue;let c=s;for(;c+1<t.length&&n(t[c+1],o)>=0;)c++;i.push({event:a,start:s,span:c-s+1,lane:0,continuesBefore:n(e,t[s])>0,continuesAfter:n(t[c],o)>0})}i.sort((e,t)=>e.start-t.start||t.span-e.span||p(e.event,t.event));let a=[];for(let e of i){let t=a.findIndex(t=>t<=e.start);t===-1&&(t=a.push(0)-1),e.lane=t,a[t]=e.start+e.span}return i}function v(e,t,n){let r=Math.max(n-1,0),i=Array.from({length:t},()=>0);for(let t of e)for(let e=t.start;e<t.start+t.span;e++)i[e]=Math.max(i[e],t.lane+1);let a=Array.from({length:t},()=>0),o=[];for(let t of e){let e=t.lane<r;if(!e&&t.lane===r){e=!0;for(let r=t.start;r<t.start+t.span;r++)i[r]>n&&(e=!1)}if(e){o.push(t);continue}for(let e=t.start;e<t.start+t.span;e++)a[e]++}return{visible:o,moreLane:r,hidden:a}}export{p as compareEvents,f as eventDays,l as eventEnd,m as eventsByDay,d as isAllDayLike,v as limitLanes,u as moveByDays,h as packDay,_ as packLanes};
|
|
2
2
|
//# sourceMappingURL=layout.mjs.map
|