@ahrowe/ui 0.42.0 → 0.44.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 +946 -0
- package/README.md +14 -12
- 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/configProvider/configProvider.types.d.ts +4 -0
- 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/loader/index.d.ts +2 -0
- package/dist/cjs-types/common/loader/loader.d.ts +4 -0
- package/dist/cjs-types/common/loader/loader.types.d.ts +31 -0
- package/dist/cjs-types/common/loadingOverlay/index.d.ts +2 -0
- package/dist/cjs-types/common/loadingOverlay/loadingOverlay.d.ts +4 -0
- package/dist/cjs-types/common/loadingOverlay/loadingOverlay.types.d.ts +21 -0
- 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 +7 -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/cjs-types/index.d.ts +4 -1
- 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/checkbox/checkbox.mjs +1 -1
- package/dist/esm/common/checkbox/checkbox.mjs.map +1 -1
- package/dist/esm/common/checkbox/checkbox.module.mjs +1 -1
- package/dist/esm/common/checkbox/checkbox.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/dropdown/dropdown.mjs +1 -1
- package/dist/esm/common/dropdown/dropdown.mjs.map +1 -1
- package/dist/esm/common/dropdown/dropdown.module.mjs +1 -1
- package/dist/esm/common/dropdown/dropdown.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/kanbanBoard/KanbanColumn.mjs +1 -1
- package/dist/esm/common/kanbanBoard/KanbanColumn.mjs.map +1 -1
- package/dist/esm/common/kanbanBoard/kanbanBoard.module.mjs +1 -1
- package/dist/esm/common/kanbanBoard/kanbanBoard.module.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/loader/loader.mjs +2 -0
- package/dist/esm/common/loader/loader.mjs.map +1 -0
- package/dist/esm/common/loader/loader.module.mjs +2 -0
- package/dist/esm/common/loader/loader.module.mjs.map +1 -0
- package/dist/esm/common/loader/loader.types.mjs +2 -0
- package/dist/esm/common/loader/loader.types.mjs.map +1 -0
- package/dist/esm/common/loadingOverlay/loadingOverlay.mjs +2 -0
- package/dist/esm/common/loadingOverlay/loadingOverlay.mjs.map +1 -0
- package/dist/esm/common/loadingOverlay/loadingOverlay.module.mjs +2 -0
- package/dist/esm/common/loadingOverlay/loadingOverlay.module.mjs.map +1 -0
- 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/common/virtualList/virtualList.mjs +1 -1
- package/dist/esm/common/virtualList/virtualList.mjs.map +1 -1
- package/dist/esm/common/virtualList/virtualList.module.mjs +1 -1
- package/dist/esm/common/virtualList/virtualList.module.mjs.map +1 -1
- 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/configProvider/configProvider.types.d.ts +4 -0
- 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/loader/index.d.ts +2 -0
- package/dist/types/common/loader/loader.d.ts +4 -0
- package/dist/types/common/loader/loader.types.d.ts +31 -0
- package/dist/types/common/loadingOverlay/index.d.ts +2 -0
- package/dist/types/common/loadingOverlay/loadingOverlay.d.ts +4 -0
- package/dist/types/common/loadingOverlay/loadingOverlay.types.d.ts +21 -0
- 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 +7 -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/dist/types/index.d.ts +4 -1
- 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 +24 -13
- package/docs/Calendar.md +35 -17
- package/docs/Card.md +53 -14
- package/docs/Checkbox.md +1 -1
- package/docs/Chip.md +24 -9
- package/docs/ConfigProvider.md +4 -4
- package/docs/CopyButton.md +6 -5
- package/docs/Loader.md +95 -0
- package/docs/LoadingOverlay.md +85 -0
- package/docs/ProgressBar.md +7 -4
- package/docs/SectionHeader.md +1 -1
- package/docs/Skeleton.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/cjs-types/common/loading/index.d.ts +0 -1
- package/dist/cjs-types/common/loading/spinnerLoading/index.d.ts +0 -2
- package/dist/cjs-types/common/loading/spinnerLoading/spinnerLoading.d.ts +0 -6
- 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
- package/dist/esm/common/loading/spinnerLoading/index.mjs +0 -2
- package/dist/esm/common/loading/spinnerLoading/index.mjs.map +0 -1
- package/dist/esm/common/loading/spinnerLoading/spinnerLoading.mjs +0 -2
- package/dist/esm/common/loading/spinnerLoading/spinnerLoading.mjs.map +0 -1
- package/dist/esm/common/loading/spinnerLoading/spinnerLoading.module.mjs +0 -2
- package/dist/esm/common/loading/spinnerLoading/spinnerLoading.module.mjs.map +0 -1
- package/dist/types/common/loading/index.d.ts +0 -1
- package/dist/types/common/loading/spinnerLoading/index.d.ts +0 -2
- package/dist/types/common/loading/spinnerLoading/spinnerLoading.d.ts +0 -6
- package/docs/Loading.md +0 -68
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monthView.mjs","names":[],"sources":["../../../../../../package/common/calendar/components/monthView/monthView.tsx"],"sourcesContent":["import {\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n type MouseEvent,\n type ReactElement,\n} from 'react';\nimport cx from 'classnames';\n\nimport Button from 'components/common/button';\nimport Popover from 'components/common/popover';\nimport { PopoverAlign, PopoverPlacement } from 'components/common/popover/popover.types';\nimport { isSelfActivation } from 'components/common/utils/activationKey';\nimport { CalendarView, type CalendarEvent } from '../../calendar.types';\nimport {\n addDays,\n addMonths,\n dayDiff,\n dateToDay,\n endAfter,\n gridKeyTarget,\n isSameDay,\n periodRange,\n shiftDays,\n shownDays,\n startOfMonth,\n startOfWeek,\n} from '../../dates';\nimport { formatDayNumber, formatLongDate, formatMonthTitle, formatTime, formatWeekday } from '../../format';\nimport { clamp, pageStep } from '../../gesture';\nimport { eventDays, eventEnd, eventsByDay, isAllDayLike, limitLanes, packLanes, type LaneBar } from '../../layout';\nimport { useGestures, type GesturePoint } from '../../useGestures';\nimport { usePager } from '../../usePager';\nimport AgendaList from '../agendaList';\nimport type { MonthDrag, MonthViewProps } from './monthView.types';\n\nimport pagerStyles from '../../pager.module.pcss';\nimport styles from './monthView.module.pcss';\n\nconst STEPS = [-1, 0, 1] as const;\n\nfunction MonthView<E extends CalendarEvent>({\n events,\n date,\n locale,\n weekStartsOn,\n hidden,\n text,\n onDateChange,\n onOpenDay,\n onEventClick,\n onEventChange,\n onSlotCreate,\n renderEvent,\n classNames,\n slotStyles,\n}: MonthViewProps<E>): ReactElement {\n const rootRef = useRef<HTMLDivElement>(null);\n const viewportRef = useRef<HTMLDivElement>(null);\n const currentRef = useRef<HTMLDivElement>(null);\n const pendingFocus = useRef<string | null>(null);\n const [capacity, setCapacity] = useState(Infinity);\n const [list, setList] = useState<{ day: Date; anchor: HTMLElement; fromKeyboard: boolean } | null>(null);\n const [drag, setDrag] = useState<MonthDrag<E> | null>(null);\n\n const month = startOfMonth(date);\n const today = new Date();\n const weekdays = shownDays(startOfWeek(today, weekStartsOn), 7, hidden);\n const gridStart = periodRange(CalendarView.Month, month, weekStartsOn).start;\n const rowDates = (paneStart: Date, row: number) => shownDays(addDays(paneStart, row * 7), 7, hidden);\n\n const pager = usePager(\n dateToDay(month),\n (step) => onDateChange(addMonths(date, step)),\n () => currentRef.current?.querySelector<HTMLElement>('[tabindex=\"0\"]') ?? null,\n );\n\n // Lanes that fit a cell, from the real geometry, so `+N` appears exactly when bars would clip.\n // Without layout (jsdom) there is nothing to measure, and every event is shown.\n useLayoutEffect(() => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n function measure() {\n const bars = viewport!.querySelector<HTMLElement>('[data-cal-bars]');\n if (!bars || bars.clientHeight === 0) {\n setCapacity(Infinity);\n return;\n }\n const style = getComputedStyle(bars);\n const lane = parseFloat(style.gridAutoRows);\n const gap = parseFloat(style.rowGap) || 0;\n const top = parseFloat(style.paddingTop) || 0;\n setCapacity(lane > 0 ? Math.max(1, Math.floor((bars.clientHeight - top + gap) / (lane + gap))) : Infinity);\n }\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(viewport);\n return () => observer.disconnect();\n }, []);\n\n // Arrowing onto a day of the next month pages first, so the cell to focus only exists after\n // the render that follows.\n useLayoutEffect(() => {\n const key = pendingFocus.current;\n if (key === null) return;\n pendingFocus.current = null;\n currentRef.current?.querySelector<HTMLElement>(`[data-cal-day=\"${key}\"]`)?.focus();\n });\n\n function dayAt(point: GesturePoint): Date | null {\n const pane = currentRef.current;\n if (!pane) return null;\n const rect = pane.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return null;\n const count = weekdays.length;\n const column = clamp(Math.floor(((point.x - rect.left) / rect.width) * count), 0, count - 1);\n const row = clamp(Math.floor(((point.y - rect.top) / rect.height) * 6), 0, 5);\n return rowDates(gridStart, row)[column];\n }\n\n function cellFor(day: Date): HTMLElement | null {\n return currentRef.current?.querySelector<HTMLElement>(`[data-cal-day=\"${dateToDay(day)}\"]`) ?? null;\n }\n\n useGestures<MonthDrag<E>>(rootRef, {\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 (!onEventChange) return null;\n const element = target.closest<HTMLElement>('[data-cal-event]');\n if (!element || !currentRef.current?.contains(element)) return null;\n const event = events.find((candidate) => String(candidate.id) === element.dataset.calEvent);\n const grabbed = dayAt(point);\n if (!event || event.readOnly || grabbed === null) return null;\n return { event, grabbed, offset: 0 };\n },\n onDragStart: setDrag,\n onDragMove: (point) => {\n const day = dayAt(point);\n if (day === null) return;\n setDrag((current) => {\n if (!current) return current;\n const offset = dayDiff(current.grabbed, day);\n return offset === current.offset ? current : { ...current, offset };\n });\n },\n onDragEnd: (point) => {\n setDrag(null);\n const day = dayAt(point);\n if (!drag || day === null) return;\n const offset = dayDiff(drag.grabbed, day);\n if (offset === 0) return;\n const start = shiftDays(drag.event.start, offset);\n const length = (eventEnd(drag.event).getTime() - drag.event.start.getTime()) / 60_000;\n onEventChange?.({\n event: drag.event,\n start,\n end: endAfter(start, shiftDays(drag.event.end, offset), length),\n });\n },\n onDragCancel: () => setDrag(null),\n });\n\n function openList(day: Date, fromKeyboard: boolean) {\n const anchor = cellFor(day);\n if (anchor) setList({ day, anchor, fromKeyboard });\n }\n\n function handleCellClick(clickEvent: MouseEvent<HTMLDivElement>, day: Date) {\n if (onOpenDay && (clickEvent.target as Element).closest('[data-cal-day-number]')) {\n onOpenDay(day);\n return;\n }\n onSlotCreate?.({ start: day, end: addDays(day, 1), allDay: true }, clickEvent.currentTarget);\n }\n\n function handleKeyDown(keyEvent: KeyboardEvent<HTMLDivElement>, day: Date) {\n const next = gridKeyTarget(keyEvent.key, day, weekStartsOn, hidden);\n if (!next) {\n if (isSelfActivation(keyEvent)) {\n keyEvent.preventDefault();\n openList(day, true);\n }\n return;\n }\n keyEvent.preventDefault();\n pendingFocus.current = dateToDay(next);\n onDateChange(next);\n }\n\n function renderBar(bar: LaneBar<E>) {\n const { event } = bar;\n const filled = isAllDayLike(event) || bar.span > 1 || bar.continuesBefore || bar.continuesAfter;\n const interactive = Boolean(onEventClick) || (Boolean(onEventChange) && !event.readOnly);\n return (\n <div\n key={event.id}\n data-cal-event={String(event.id)}\n className={cx(\n styles.monthViewBar,\n filled ? styles.monthViewBarFilled : styles.monthViewBarTimed,\n bar.continuesBefore && styles.monthViewBarContinuesBefore,\n bar.continuesAfter && styles.monthViewBarContinuesAfter,\n interactive && styles.monthViewBarInteractive,\n drag?.event === event && styles.monthViewBarDragging,\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 onClick={(clickEvent) => onEventClick?.(event, clickEvent.currentTarget)}\n >\n {!filled && <span className={styles.monthViewDot} />}\n {!filled && <span className={styles.monthViewTime}>{formatTime(event.start, locale)}</span>}\n <span className={styles.monthViewBarTitle}>\n {renderEvent ? renderEvent(event, { singleLine: true }) : event.title}\n </span>\n </div>\n );\n }\n\n function renderPane(step: (typeof STEPS)[number]) {\n const paneMonth = addMonths(month, step);\n const isCurrent = step === 0;\n const paneStart = periodRange(CalendarView.Month, paneMonth, weekStartsOn).start;\n\n let target: { from: Date; to: Date } | null = null;\n if (isCurrent && drag && drag.offset !== 0) {\n const { first, last } = eventDays(drag.event);\n target = { from: addDays(first, drag.offset), to: addDays(last, drag.offset) };\n }\n\n return (\n <div\n key={dateToDay(paneMonth)}\n ref={isCurrent ? currentRef : undefined}\n className={cx(\n pagerStyles.pagerPane,\n step === -1 && pagerStyles.pagerPanePrev,\n step === 1 && pagerStyles.pagerPaneNext,\n styles.monthViewPane,\n )}\n inert={!isCurrent}\n aria-hidden={!isCurrent || undefined}\n >\n {Array.from({ length: 6 }, (_, row) => {\n const dates = rowDates(paneStart, row);\n const perDay = eventsByDay(events, dates);\n const lanes = limitLanes(packLanes(events, dates), dates.length, capacity);\n return (\n <div key={dateToDay(dates[0])} role='row' className={styles.monthViewWeek}>\n {dates.map((day, column) => {\n const count = perDay[column].length;\n const isToday = isSameDay(day, today);\n const name = formatLongDate(day, locale);\n return (\n <div\n key={dateToDay(day)}\n role='gridcell'\n data-cal-day={dateToDay(day)}\n tabIndex={isCurrent && isSameDay(day, date) ? 0 : -1}\n aria-current={isToday ? 'date' : undefined}\n aria-label={count > 0 ? `${name}, ${text.eventCount(count)}` : name}\n className={cx(\n styles.monthViewCell,\n day.getMonth() !== paneMonth.getMonth() && styles.monthViewCellOutside,\n onSlotCreate && styles.monthViewCellCreatable,\n target &&\n dayDiff(target.from, day) >= 0 &&\n dayDiff(day, target.to) >= 0 &&\n styles.monthViewCellTarget,\n classNames?.cell,\n )}\n style={slotStyles?.cell}\n onClick={(clickEvent) => handleCellClick(clickEvent, day)}\n onKeyDown={(keyEvent) => handleKeyDown(keyEvent, day)}\n >\n <span\n data-cal-day-number\n aria-hidden\n className={cx(\n styles.monthViewDayNumber,\n isToday && styles.monthViewDayNumberToday,\n onOpenDay && styles.monthViewDayNumberLink,\n )}\n >\n {formatDayNumber(day, locale)}\n </span>\n </div>\n );\n })}\n {/* Pointer only: a keyboard reaches a day's events through Enter on its cell. */}\n <div data-cal-bars aria-hidden className={styles.monthViewBars}>\n {lanes.visible.map(renderBar)}\n {lanes.hidden.map(\n (count, column) =>\n count > 0 && (\n <div\n key={`more-${column}`}\n className={styles.monthViewMore}\n style={{ gridColumn: column + 1, gridRow: lanes.moreLane + 1 }}\n onClick={() => openList(dates[column], false)}\n >\n {text.more(count)}\n </div>\n ),\n )}\n </div>\n </div>\n );\n })}\n </div>\n );\n }\n\n return (\n <div ref={rootRef} className={styles.monthView} style={{ '--days': weekdays.length } as CSSProperties}>\n <div role='grid' aria-label={formatMonthTitle(date, locale)} className={styles.monthViewGrid}>\n <div role='row' className={styles.monthViewWeekdays}>\n {weekdays.map((day) => (\n <div\n key={day.getDay()}\n role='columnheader'\n aria-label={formatWeekday(day, locale, 'long')}\n className={cx(styles.monthViewWeekday, classNames?.dayHeader)}\n style={slotStyles?.dayHeader}\n >\n {formatWeekday(day, locale, 'short')}\n </div>\n ))}\n </div>\n <div ref={viewportRef} className={cx(pagerStyles.pagerViewport, styles.monthViewViewport)}>\n <div ref={pager.trackRef} className={pagerStyles.pagerTrack}>\n {STEPS.map(renderPane)}\n </div>\n </div>\n </div>\n <Popover\n anchor={list?.anchor ?? null}\n isOpen={list !== null}\n onOpenChange={(open) => !open && setList(null)}\n // Enter on a cell is a key event of ours, which Popover cannot see, so it is told.\n focusOnOpen={list?.fromKeyboard ?? false}\n placement={PopoverPlacement.Bottom}\n align={PopoverAlign.Start}\n content={\n list && (\n <div className={styles.monthViewList}>\n <div className={styles.monthViewListTitle}>{formatLongDate(list.day, locale)}</div>\n <AgendaList\n className={styles.monthViewListEvents}\n events={events}\n start={list.day}\n days={1}\n showDayHeaders={false}\n locale={locale}\n text={text}\n onEventClick={(event) => {\n setList(null);\n // The list's own row unmounts with the popover, so the day's cell anchors it.\n onEventClick?.(event, list.anchor);\n }}\n renderEvent={renderEvent}\n classNames={classNames}\n slotStyles={slotStyles}\n />\n {onSlotCreate && (\n <Button\n className={styles.monthViewListCreate}\n onClick={() => {\n setList(null);\n onSlotCreate({ start: list.day, end: addDays(list.day, 1), allDay: true }, list.anchor);\n }}\n >\n {text.newEvent}\n </Button>\n )}\n </div>\n )\n }\n />\n </div>\n );\n}\n\nexport default MonthView;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"monthView.mjs","names":[],"sources":["../../../../../../package/common/calendar/components/monthView/monthView.tsx"],"sourcesContent":["import {\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n type MouseEvent,\n type ReactElement,\n} from 'react';\nimport cx from 'classnames';\n\nimport Button from 'components/common/button';\nimport Popover from 'components/common/popover';\nimport { PopoverAlign, PopoverPlacement } from 'components/common/popover/popover.types';\nimport { isSelfActivation } from 'components/common/utils/activationKey';\nimport { isDismissClick } from 'components/common/utils/dismissClick';\nimport { CalendarView, type CalendarEvent } from '../../calendar.types';\nimport {\n addDays,\n addMonths,\n allDaySlot,\n dayDiff,\n dateToDay,\n gridKeyTarget,\n isSameDay,\n periodRange,\n shownDays,\n startOfMonth,\n startOfWeek,\n weekNumber,\n} from '../../dates';\nimport { formatDayNumber, formatLongDate, formatMonthTitle, formatTime, formatWeekday } from '../../format';\nimport { clamp, pageStep } from '../../gesture';\nimport { eventDays, eventsByDay, isAllDayLike, limitLanes, moveByDays, packLanes, type LaneBar } from '../../layout';\nimport { useGestures, type GesturePoint } from '../../useGestures';\nimport { usePager } from '../../usePager';\nimport AgendaList from '../agendaList';\nimport type { MonthDrag, MonthViewProps } from './monthView.types';\n\nimport pagerStyles from '../../pager.module.pcss';\nimport styles from './monthView.module.pcss';\nimport { cssColor } from '../../../styles/tone';\n\nconst STEPS = [-1, 0, 1] as const;\n\nfunction MonthView<E extends CalendarEvent>({\n events,\n date,\n today,\n locale,\n weekStartsOn,\n hidden,\n showWeekNumbers,\n text,\n onDateChange,\n onOpenDay,\n onEventClick,\n onEventChange,\n onSlotCreate,\n renderEvent,\n eventClassName,\n classNames,\n slotStyles,\n}: MonthViewProps<E>): ReactElement {\n const rootRef = useRef<HTMLDivElement>(null);\n const viewportRef = useRef<HTMLDivElement>(null);\n const currentRef = useRef<HTMLDivElement>(null);\n const pendingFocus = useRef<string | null>(null);\n const dragRef = useRef<MonthDrag<E> | null>(null);\n const [capacity, setCapacity] = useState(Infinity);\n const [list, setList] = useState<{ day: Date; anchor: HTMLElement; fromKeyboard: boolean } | null>(null);\n const [drag, setDrag] = useState<MonthDrag<E> | null>(null);\n\n const month = startOfMonth(date);\n const weekdays = shownDays(startOfWeek(today, weekStartsOn), 7, hidden);\n const gridStart = periodRange(CalendarView.Month, month, weekStartsOn).start;\n const rowDates = (paneStart: Date, row: number) => shownDays(addDays(paneStart, row * 7), 7, hidden);\n\n const pager = usePager(\n dateToDay(month),\n (step) => onDateChange(addMonths(date, step)),\n () => currentRef.current?.querySelector<HTMLElement>('[tabindex=\"0\"]') ?? null,\n );\n\n // Lanes that fit a cell, from the real geometry, so `+N` appears exactly when bars would clip.\n // Without layout (jsdom) there is nothing to measure, and every event is shown.\n useLayoutEffect(() => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n function measure() {\n const bars = viewport!.querySelector<HTMLElement>('[data-cal-bars]');\n if (!bars || bars.clientHeight === 0) {\n setCapacity(Infinity);\n return;\n }\n const style = getComputedStyle(bars);\n const lane = parseFloat(style.gridAutoRows);\n const gap = parseFloat(style.rowGap) || 0;\n const top = parseFloat(style.paddingTop) || 0;\n setCapacity(lane > 0 ? Math.max(1, Math.floor((bars.clientHeight - top + gap) / (lane + gap))) : Infinity);\n }\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(viewport);\n return () => observer.disconnect();\n }, []);\n\n // Arrowing onto a day of the next month pages first, so the cell to focus only exists after\n // the render that follows.\n useLayoutEffect(() => {\n const key = pendingFocus.current;\n if (key === null) return;\n pendingFocus.current = null;\n currentRef.current?.querySelector<HTMLElement>(`[data-cal-day=\"${key}\"]`)?.focus();\n });\n\n function dayAt(point: GesturePoint): Date | null {\n const pane = currentRef.current;\n if (!pane) return null;\n const rect = pane.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return null;\n const count = weekdays.length;\n const column = clamp(Math.floor(((point.x - rect.left) / rect.width) * count), 0, count - 1);\n const row = clamp(Math.floor(((point.y - rect.top) / rect.height) * 6), 0, 5);\n return rowDates(gridStart, row)[column];\n }\n\n function cellFor(day: Date): HTMLElement | null {\n return currentRef.current?.querySelector<HTMLElement>(`[data-cal-day=\"${dateToDay(day)}\"]`) ?? null;\n }\n\n // Mirrored in a ref, as in the time grid: a release can arrive before the render of the move\n // before it, and has to drop where that move was.\n function setDragState(next: MonthDrag<E> | null) {\n dragRef.current = next;\n setDrag(next);\n }\n\n useGestures<MonthDrag<E>>(rootRef, {\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 grabbed = dayAt(point);\n if (grabbed === null) return null;\n const element = target.closest<HTMLElement>('[data-cal-event]');\n if (element) {\n const event = onEventChange && events.find((candidate) => String(candidate.id) === element.dataset.calEvent);\n return event && !event.readOnly ? { event, grabbed, offset: 0 } : null;\n }\n // A day number that opens its day is a link, and a press on it is a click however it moves.\n if (!onSlotCreate || target.closest('[data-cal-more]')) return null;\n if (onOpenDay && target.closest('[data-cal-day-number]')) return null;\n return { event: null, grabbed, offset: 0 };\n },\n onDragStart: setDragState,\n onDragMove: (point) => {\n const current = dragRef.current;\n const day = dayAt(point);\n if (!current || day === null) return;\n const offset = dayDiff(current.grabbed, day);\n if (offset !== current.offset) setDragState({ ...current, offset });\n },\n onDragEnd: (point) => {\n const current = dragRef.current;\n setDragState(null);\n const day = dayAt(point);\n if (!current || day === null) return;\n const { event, grabbed } = current;\n if (!event) {\n const slot = allDaySlot(grabbed, day);\n onSlotCreate?.(slot, cellFor(slot.start) ?? rootRef.current!);\n return;\n }\n const offset = dayDiff(grabbed, day);\n if (offset !== 0) onEventChange?.({ event, ...moveByDays(event, offset) });\n },\n onDragCancel: () => setDragState(null),\n });\n\n function openList(day: Date, fromKeyboard: boolean) {\n const anchor = cellFor(day);\n if (anchor) setList({ day, anchor, fromKeyboard });\n }\n\n function handleCellClick(clickEvent: MouseEvent<HTMLDivElement>, day: Date) {\n if (onOpenDay && (clickEvent.target as Element).closest('[data-cal-day-number]')) {\n onOpenDay(day);\n return;\n }\n if (isDismissClick(clickEvent.nativeEvent)) return;\n onSlotCreate?.(allDaySlot(day), clickEvent.currentTarget);\n }\n\n function handleKeyDown(keyEvent: KeyboardEvent<HTMLDivElement>, day: Date) {\n const next = gridKeyTarget(keyEvent.key, day, weekStartsOn, hidden);\n if (!next) {\n if (isSelfActivation(keyEvent)) {\n keyEvent.preventDefault();\n openList(day, true);\n }\n return;\n }\n keyEvent.preventDefault();\n pendingFocus.current = dateToDay(next);\n onDateChange(next);\n }\n\n function renderBar(bar: LaneBar<E>) {\n const { event } = bar;\n const filled = isAllDayLike(event) || bar.span > 1 || bar.continuesBefore || bar.continuesAfter;\n const interactive = Boolean(onEventClick) || (Boolean(onEventChange) && !event.readOnly);\n return (\n <div\n key={event.id}\n data-cal-event={String(event.id)}\n className={cx(\n styles.monthViewBar,\n filled ? styles.monthViewBarFilled : styles.monthViewBarTimed,\n bar.continuesBefore && styles.monthViewBarContinuesBefore,\n bar.continuesAfter && styles.monthViewBarContinuesAfter,\n interactive && styles.monthViewBarInteractive,\n drag?.event === event && styles.monthViewBarDragging,\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 onClick={(clickEvent) => onEventClick?.(event, clickEvent.currentTarget)}\n >\n {!filled && <span className={styles.monthViewDot} />}\n {!filled && <span className={styles.monthViewTime}>{formatTime(event.start, locale)}</span>}\n <span className={styles.monthViewBarTitle}>\n {renderEvent ? renderEvent(event, { singleLine: true }) : event.title}\n </span>\n </div>\n );\n }\n\n function renderPane(step: (typeof STEPS)[number]) {\n const paneMonth = addMonths(month, step);\n const isCurrent = step === 0;\n const paneStart = periodRange(CalendarView.Month, paneMonth, weekStartsOn).start;\n\n let target: { from: Date; to: Date } | null = null;\n if (isCurrent && drag?.event && drag.offset !== 0) {\n const { first, last } = eventDays(drag.event);\n target = { from: addDays(first, drag.offset), to: addDays(last, drag.offset) };\n } else if (isCurrent && drag && !drag.event) {\n const over = addDays(drag.grabbed, drag.offset);\n target = drag.offset < 0 ? { from: over, to: drag.grabbed } : { from: drag.grabbed, to: over };\n }\n\n return (\n <div\n key={dateToDay(paneMonth)}\n ref={isCurrent ? currentRef : undefined}\n className={cx(\n pagerStyles.pagerPane,\n step === -1 && pagerStyles.pagerPanePrev,\n step === 1 && pagerStyles.pagerPaneNext,\n styles.monthViewPane,\n )}\n inert={!isCurrent}\n aria-hidden={!isCurrent || undefined}\n >\n {Array.from({ length: 6 }, (_, row) => {\n const dates = rowDates(paneStart, row);\n const perDay = eventsByDay(events, dates);\n const lanes = limitLanes(packLanes(events, dates), dates.length, capacity);\n // Numbered by the ISO week holding most of its days, which the middle one is in.\n const week = showWeekNumbers ? text.weekNumber(weekNumber(dates[Math.floor(dates.length / 2)])) : undefined;\n return (\n <div key={dateToDay(dates[0])} role='row' aria-label={week} className={styles.monthViewWeek}>\n {dates.map((day, column) => {\n const count = perDay[column].length;\n const isToday = isSameDay(day, today);\n const name = formatLongDate(day, locale);\n return (\n <div\n key={dateToDay(day)}\n role='gridcell'\n data-cal-day={dateToDay(day)}\n tabIndex={isCurrent && isSameDay(day, date) ? 0 : -1}\n aria-current={isToday ? 'date' : undefined}\n aria-label={count > 0 ? `${name}, ${text.eventCount(count)}` : name}\n className={cx(\n styles.monthViewCell,\n day.getMonth() !== paneMonth.getMonth() && styles.monthViewCellOutside,\n onSlotCreate && styles.monthViewCellCreatable,\n target &&\n dayDiff(target.from, day) >= 0 &&\n dayDiff(day, target.to) >= 0 &&\n styles.monthViewCellTarget,\n classNames?.cell,\n )}\n style={slotStyles?.cell}\n onClick={(clickEvent) => handleCellClick(clickEvent, day)}\n onKeyDown={(keyEvent) => handleKeyDown(keyEvent, day)}\n >\n <span\n data-cal-day-number\n aria-hidden\n className={cx(\n styles.monthViewDayNumber,\n isToday && styles.monthViewDayNumberToday,\n onOpenDay && styles.monthViewDayNumberLink,\n )}\n >\n {formatDayNumber(day, locale)}\n </span>\n {week && column === 0 && (\n <span aria-hidden className={styles.monthViewWeekNumber}>\n {week}\n </span>\n )}\n </div>\n );\n })}\n {/* Pointer only: a keyboard reaches a day's events through Enter on its cell. */}\n <div data-cal-bars aria-hidden className={styles.monthViewBars}>\n {lanes.visible.map(renderBar)}\n {lanes.hidden.map(\n (count, column) =>\n count > 0 && (\n <div\n key={`more-${column}`}\n data-cal-more\n className={styles.monthViewMore}\n style={{ gridColumn: column + 1, gridRow: lanes.moreLane + 1 }}\n onClick={() => openList(dates[column], false)}\n >\n {text.more(count)}\n </div>\n ),\n )}\n </div>\n </div>\n );\n })}\n </div>\n );\n }\n\n return (\n <div ref={rootRef} className={styles.monthView} style={{ '--days': weekdays.length } as CSSProperties}>\n <div role='grid' aria-label={formatMonthTitle(date, locale)} className={styles.monthViewGrid}>\n <div role='row' className={styles.monthViewWeekdays}>\n {weekdays.map((day) => (\n <div\n key={day.getDay()}\n role='columnheader'\n aria-label={formatWeekday(day, locale, 'long')}\n className={cx(styles.monthViewWeekday, classNames?.dayHeader)}\n style={slotStyles?.dayHeader}\n >\n {formatWeekday(day, locale, 'short')}\n </div>\n ))}\n </div>\n <div ref={viewportRef} className={cx(pagerStyles.pagerViewport, styles.monthViewViewport)}>\n <div ref={pager.trackRef} className={pagerStyles.pagerTrack}>\n {STEPS.map(renderPane)}\n </div>\n </div>\n </div>\n <Popover\n anchor={list?.anchor ?? null}\n isOpen={list !== null}\n onOpenChange={(open) => !open && setList(null)}\n // Enter on a cell is a key event of ours, which Popover cannot see, so it is told.\n focusOnOpen={list?.fromKeyboard ?? false}\n placement={PopoverPlacement.Bottom}\n align={PopoverAlign.Start}\n content={\n list && (\n <div className={styles.monthViewList}>\n <div className={styles.monthViewListTitle}>{formatLongDate(list.day, locale)}</div>\n <AgendaList\n className={styles.monthViewListEvents}\n events={events}\n start={list.day}\n days={1}\n showDayHeaders={false}\n locale={locale}\n today={today}\n text={text}\n onEventClick={(event) => {\n setList(null);\n // The list's own row unmounts with the popover, so the day's cell anchors it.\n onEventClick?.(event, list.anchor);\n }}\n renderEvent={renderEvent}\n eventClassName={eventClassName}\n classNames={classNames}\n slotStyles={slotStyles}\n />\n {onSlotCreate && (\n <Button\n className={styles.monthViewListCreate}\n onClick={() => {\n setList(null);\n onSlotCreate(allDaySlot(list.day), list.anchor);\n }}\n >\n {text.newEvent}\n </Button>\n )}\n </div>\n )\n }\n />\n </div>\n );\n}\n\nexport default MonthView;\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";var e=`monthView_COWAp`,t=`monthView-grid_MG0UZ`,n=`monthView-weekdays_BHTuU`,r=`monthView-weekday_ycA-L`,i=`monthView-viewport_LpCe1`,a=`monthView-pane_bHUbv`,o=`monthView-week_gnh6Y`,s=`monthView-cell_ypx-s`,c=`monthView-cell-outside_1Mr0V`,l=`monthView-cell-creatable_BxZde`,u=`monthView-cell-target_-oYgU`,d=`monthView-dayNumber_voxGS`,f=`monthView-dayNumber-today_G7coa`,p=`monthView-dayNumber-link_5k317`,m=`monthView-bars_DW4bv`,
|
|
1
|
+
"use client";var e=`monthView_COWAp`,t=`monthView-grid_MG0UZ`,n=`monthView-weekdays_BHTuU`,r=`monthView-weekday_ycA-L`,i=`monthView-viewport_LpCe1`,a=`monthView-pane_bHUbv`,o=`monthView-week_gnh6Y`,s=`monthView-cell_ypx-s`,c=`monthView-cell-outside_1Mr0V`,l=`monthView-cell-creatable_BxZde`,u=`monthView-cell-target_-oYgU`,d=`monthView-dayNumber_voxGS`,f=`monthView-dayNumber-today_G7coa`,p=`monthView-dayNumber-link_5k317`,m=`monthView-weekNumber_UE8T-`,h=`monthView-bars_DW4bv`,g=`monthView-bar_9zcHJ`,_=`monthView-bar-filled_Mq2Ca`,v=`monthView-bar-timed_C8Xwi`,y=`monthView-bar-continuesBefore_DBSlE`,b=`monthView-bar-continuesAfter_cEvZo`,x=`monthView-bar-interactive_FGu9C`,S=`monthView-bar-dragging_sxndr`,C=`monthView-bar-title_-X5yZ`,w=`monthView-dot_81QmI`,T=`monthView-time_W-u-E`,E=`monthView-more_m2PXd`,D=`monthView-list_4pG-Y`,O=`monthView-list-title_oM-3e`,k=`monthView-list-events_RsMQ6`,A=`monthView-list-create_e7EdY`,j={monthView:e,"monthView-grid":`monthView-grid_MG0UZ`,monthViewGrid:t,"monthView-weekdays":`monthView-weekdays_BHTuU`,monthViewWeekdays:n,"monthView-weekday":`monthView-weekday_ycA-L`,monthViewWeekday:r,"monthView-viewport":`monthView-viewport_LpCe1`,monthViewViewport:i,"monthView-pane":`monthView-pane_bHUbv`,monthViewPane:a,"monthView-week":`monthView-week_gnh6Y`,monthViewWeek:o,"monthView-cell":`monthView-cell_ypx-s`,monthViewCell:s,"monthView-cell-outside":`monthView-cell-outside_1Mr0V`,monthViewCellOutside:c,"monthView-cell-creatable":`monthView-cell-creatable_BxZde`,monthViewCellCreatable:l,"monthView-cell-target":`monthView-cell-target_-oYgU`,monthViewCellTarget:u,"monthView-dayNumber":`monthView-dayNumber_voxGS`,monthViewDayNumber:d,"monthView-dayNumber-today":`monthView-dayNumber-today_G7coa`,monthViewDayNumberToday:f,"monthView-dayNumber-link":`monthView-dayNumber-link_5k317`,monthViewDayNumberLink:p,"monthView-weekNumber":`monthView-weekNumber_UE8T-`,monthViewWeekNumber:m,"monthView-bars":`monthView-bars_DW4bv`,monthViewBars:h,"monthView-bar":`monthView-bar_9zcHJ`,monthViewBar:g,"monthView-bar-filled":`monthView-bar-filled_Mq2Ca`,monthViewBarFilled:_,"monthView-bar-timed":`monthView-bar-timed_C8Xwi`,monthViewBarTimed:v,"monthView-bar-continuesBefore":`monthView-bar-continuesBefore_DBSlE`,monthViewBarContinuesBefore:y,"monthView-bar-continuesAfter":`monthView-bar-continuesAfter_cEvZo`,monthViewBarContinuesAfter:b,"monthView-bar-interactive":`monthView-bar-interactive_FGu9C`,monthViewBarInteractive:x,"monthView-bar-dragging":`monthView-bar-dragging_sxndr`,monthViewBarDragging:S,"monthView-bar-title":`monthView-bar-title_-X5yZ`,monthViewBarTitle:C,"monthView-dot":`monthView-dot_81QmI`,monthViewDot:w,"monthView-time":`monthView-time_W-u-E`,monthViewTime:T,"monthView-more":`monthView-more_m2PXd`,monthViewMore:E,"monthView-list":`monthView-list_4pG-Y`,monthViewList:D,"monthView-list-title":`monthView-list-title_oM-3e`,monthViewListTitle:O,"monthView-list-events":`monthView-list-events_RsMQ6`,monthViewListEvents:k,"monthView-list-create":`monthView-list-create_e7EdY`,monthViewListCreate:A};export{j as default,e as monthView,g as monthViewBar,b as monthViewBarContinuesAfter,y as monthViewBarContinuesBefore,S as monthViewBarDragging,_ as monthViewBarFilled,x as monthViewBarInteractive,v as monthViewBarTimed,C as monthViewBarTitle,h as monthViewBars,s as monthViewCell,l as monthViewCellCreatable,c as monthViewCellOutside,u as monthViewCellTarget,d as monthViewDayNumber,p as monthViewDayNumberLink,f as monthViewDayNumberToday,w as monthViewDot,t as monthViewGrid,D as monthViewList,A as monthViewListCreate,k as monthViewListEvents,O as monthViewListTitle,E as monthViewMore,a as monthViewPane,T as monthViewTime,i as monthViewViewport,o as monthViewWeek,m as monthViewWeekNumber,r as monthViewWeekday,n as monthViewWeekdays};
|
|
2
2
|
//# sourceMappingURL=monthView.module.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monthView.module.mjs","names":[],"sources":["../../../../../../package/common/calendar/components/monthView/monthView.module.pcss"],"sourcesContent":[".monthView {\n display: flex;\n flex: 1;\n flex-direction: column;\n min-height: 0;\n user-select: none;\n -webkit-touch-callout: none;\n\n /* Horizontal swipes page the month; vertical ones still scroll the page. */\n touch-action: pan-y;\n\n &-grid {\n display: flex;\n flex: 1;\n flex-direction: column;\n min-height: 0;\n }\n\n &-weekdays {\n display: grid;\n grid-template-columns: repeat(var(--days), minmax(0, 1fr));\n border-bottom: 1px solid var(--border-color);\n }\n\n &-weekday {\n padding: 0.5em 0.625em;\n overflow: hidden;\n font-size: 0.6875em;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-overflow: ellipsis;\n text-transform: uppercase;\n white-space: nowrap;\n color: var(--text-dark);\n }\n\n &-viewport {\n flex: 1;\n min-height: 0;\n }\n\n /* Six equal rows whatever the month, so every pane has the same height while swiping and a\n row never grows to fit its events: that is what the `+N` buttons are for. */\n &-pane {\n display: grid;\n grid-template-rows: repeat(6, minmax(0, 1fr));\n background: var(--background);\n }\n\n &-week {\n position: relative;\n display: grid;\n grid-template-columns: repeat(var(--days), minmax(0, 1fr));\n min-height: 0;\n\n & + & {\n border-top: 1px solid var(--border-color);\n }\n }\n\n &-cell {\n min-width: 0;\n padding: 0.25em;\n outline: none;\n\n & + & {\n border-left: 1px solid var(--border-color);\n }\n\n &:focus-visible {\n box-shadow: inset 0 0 0 2px var(--focus-border-color, var(--primary-color));\n }\n\n &-outside {\n background: color-mix(in oklab, var(--background-accent) 40%, transparent);\n color: var(--text-light);\n }\n\n &-creatable {\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n\n &:hover {\n background: color-mix(in oklab, var(--primary-color) 5%, transparent);\n }\n }\n\n &-target {\n background: color-mix(in oklab, var(--primary-color) 14%, transparent);\n }\n }\n\n &-dayNumber {\n display: inline-grid;\n place-items: center;\n min-width: 1.75em;\n height: 1.75em;\n padding: 0 0.25em;\n border-radius: 0.875em;\n font-size: 0.8125em;\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 &-link {\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n\n &:not(.monthView-dayNumber-today):hover {\n background: var(--background-accent);\n }\n }\n }\n\n /* Laid over the week's cells and starting below the day numbers. Its `grid-auto-rows`,\n `row-gap` and `padding-top` are read back to work out how many lanes fit, so change them\n here rather than overriding them on a bar. */\n &-bars {\n position: absolute;\n inset: 0;\n display: grid;\n grid-template-columns: repeat(var(--days), minmax(0, 1fr));\n grid-auto-rows: 1.375em;\n row-gap: 2px;\n align-content: start;\n padding-top: 1.75em;\n overflow: hidden;\n pointer-events: none;\n }\n\n &-bar {\n --event: var(--event-color, var(--primary-color));\n\n display: flex;\n align-items: center;\n gap: 0.3em;\n min-width: 0;\n margin: 0 0.25em;\n padding: 0 0.4em;\n overflow: hidden;\n border-radius: var(--custom-calendar-event-radius);\n font-size: 0.75em;\n white-space: nowrap;\n pointer-events: auto;\n transition:\n background-color 0.15s ease,\n opacity 0.15s ease;\n\n &-filled {\n background: color-mix(in oklab, var(--event) 22%, var(--background));\n box-shadow: inset 3px 0 0 var(--event);\n font-weight: 500;\n\n &:hover {\n background: color-mix(in oklab, var(--event) 32%, var(--background));\n }\n }\n\n &-timed:hover {\n background: color-mix(in oklab, var(--event) 12%, transparent);\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 &-interactive {\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n }\n\n &-dragging {\n opacity: 0.45;\n }\n\n &-title {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &-dot {\n flex: none;\n width: 0.5em;\n height: 0.5em;\n border-radius: 50%;\n background: var(--event);\n }\n\n &-time {\n flex: none;\n font-variant-numeric: tabular-nums;\n color: var(--text-dark);\n }\n\n &-more {\n align-self: center;\n margin: 0 0.25em;\n padding: 0 0.4em;\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 pointer-events: auto;\n\n &:hover {\n background: var(--background-accent-light);\n }\n }\n\n &-list {\n display: flex;\n flex-direction: column;\n gap: 0.25em;\n width: 18em;\n max-width: 100%;\n\n &-title {\n padding: 0.25em 0.625em;\n font-size: 0.8125em;\n font-weight: 600;\n color: var(--text-dark);\n }\n\n /* Scrolls inside the popover rather than growing it past the screen. */\n &-events {\n max-height: 18em;\n }\n\n &-create {\n align-self: flex-start;\n margin: 0.25em 0.625em 0.125em;\n }\n }\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"monthView.module.mjs","names":[],"sources":["../../../../../../package/common/calendar/components/monthView/monthView.module.pcss"],"sourcesContent":[".monthView {\n display: flex;\n flex: 1;\n flex-direction: column;\n min-height: 0;\n user-select: none;\n -webkit-touch-callout: none;\n\n /* Horizontal swipes page the month; vertical ones still scroll the page. */\n touch-action: pan-y;\n\n &-grid {\n display: flex;\n flex: 1;\n flex-direction: column;\n min-height: 0;\n }\n\n &-weekdays {\n display: grid;\n grid-template-columns: repeat(var(--days), minmax(0, 1fr));\n border-bottom: 1px solid var(--border-color);\n }\n\n &-weekday {\n padding: 0.5em 0.625em;\n overflow: hidden;\n font-size: 0.6875em;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-overflow: ellipsis;\n text-transform: uppercase;\n white-space: nowrap;\n color: var(--text-dark);\n }\n\n &-viewport {\n flex: 1;\n min-height: 0;\n }\n\n /* Six equal rows whatever the month, so every pane has the same height while swiping and a\n row never grows to fit its events: that is what the `+N` buttons are for. */\n &-pane {\n display: grid;\n grid-template-rows: repeat(6, minmax(0, 1fr));\n background: var(--background);\n }\n\n &-week {\n position: relative;\n display: grid;\n grid-template-columns: repeat(var(--days), minmax(0, 1fr));\n min-height: 0;\n\n & + & {\n border-top: 1px solid var(--border-color);\n }\n }\n\n &-cell {\n position: relative;\n min-width: 0;\n padding: 0.25em;\n outline: none;\n\n & + & {\n border-left: 1px solid var(--border-color);\n }\n\n &:focus-visible {\n box-shadow: inset 0 0 0 2px var(--focus-border-color, var(--primary-color));\n }\n\n &-outside {\n background: color-mix(in oklab, var(--background-accent) 40%, transparent);\n color: var(--text-light);\n }\n\n &-creatable {\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n\n &:hover {\n background: color-mix(in oklab, var(--primary-color) 5%, transparent);\n }\n }\n\n &-target {\n background: color-mix(in oklab, var(--primary-color) 14%, transparent);\n }\n }\n\n &-dayNumber {\n display: inline-grid;\n place-items: center;\n min-width: 1.75em;\n height: 1.75em;\n padding: 0 0.25em;\n border-radius: 0.875em;\n font-size: 0.8125em;\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 &-link {\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n\n &:not(.monthView-dayNumber-today):hover {\n background: var(--background-accent);\n }\n }\n }\n\n /* Top right of the row's first cell, in the band above the bars and level with the day number:\n the cell's 0.25em padding and the number's 1.75em at 0.8125em, in this label's 0.6875em. */\n &-weekNumber {\n position: absolute;\n top: calc(0.25em / 0.6875);\n right: 0.5em;\n\n /* Clear of the day number, in a narrow cell or a long translation. */\n max-width: calc(100% - 3.5em);\n overflow: hidden;\n font-size: 0.6875em;\n font-weight: 600;\n line-height: calc(1.75em * 0.8125 / 0.6875);\n white-space: nowrap;\n text-overflow: ellipsis;\n color: var(--text-light);\n }\n\n /* Laid over the week's cells and starting below the day numbers. Its `grid-auto-rows`,\n `row-gap` and `padding-top` are read back to work out how many lanes fit, so change them\n here rather than overriding them on a bar. */\n &-bars {\n position: absolute;\n inset: 0;\n display: grid;\n grid-template-columns: repeat(var(--days), minmax(0, 1fr));\n grid-auto-rows: 1.375em;\n row-gap: 2px;\n align-content: start;\n padding-top: 1.75em;\n overflow: hidden;\n pointer-events: none;\n }\n\n &-bar {\n --event: var(--event-color, var(--primary-color));\n\n display: flex;\n align-items: center;\n gap: 0.3em;\n min-width: 0;\n margin: 0 0.25em;\n padding: 0 0.4em;\n overflow: hidden;\n border-radius: var(--custom-calendar-event-radius);\n font-size: 0.75em;\n white-space: nowrap;\n pointer-events: auto;\n transition:\n background-color 0.15s ease,\n opacity 0.15s ease;\n\n &-filled {\n background: color-mix(in oklab, var(--event) 22%, var(--background));\n box-shadow: inset 3px 0 0 var(--event);\n font-weight: 500;\n\n &:hover {\n background: color-mix(in oklab, var(--event) 32%, var(--background));\n }\n }\n\n &-timed:hover {\n background: color-mix(in oklab, var(--event) 12%, transparent);\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 &-interactive {\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n }\n\n &-dragging {\n opacity: 0.45;\n }\n\n &-title {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n &-dot {\n flex: none;\n width: 0.5em;\n height: 0.5em;\n border-radius: 50%;\n background: var(--event);\n }\n\n &-time {\n flex: none;\n font-variant-numeric: tabular-nums;\n color: var(--text-dark);\n }\n\n &-more {\n align-self: center;\n margin: 0 0.25em;\n padding: 0 0.4em;\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 pointer-events: auto;\n\n &:hover {\n background: var(--background-accent-light);\n }\n }\n\n &-list {\n display: flex;\n flex-direction: column;\n gap: 0.25em;\n width: 18em;\n max-width: 100%;\n\n &-title {\n padding: 0.25em 0.625em;\n font-size: 0.8125em;\n font-weight: 600;\n color: var(--text-dark);\n }\n\n /* Scrolls inside the popover rather than growing it past the screen. */\n &-events {\n max-height: 18em;\n }\n\n &-create {\n align-self: flex-start;\n margin: 0.25em 0.625em 0.125em;\n }\n }\n}\n"],"mappings":""}
|
|
@@ -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":"ylCAuDA,IAAM,GAAQ,CAAC,GAAI,EAAG,CAAC,EACjB,GAAQ,MAAM,KAAK,CAAE,OAAQ,EAAG,GAAI,EAAG,IAAM,EAAI,CAAC,EAClD,GAAgB,EAEhB,GAAsB,GAEtB,GAAsB,EAEtB,EAAW,EAGjB,SAAS,IAAe,CACtB,GAAM,CAAC,EAAK,GAAU,MAAe,IAAI,IAAM,EAe/C,OAdA,OAAgB,CACd,IAAI,EACJ,SAAS,GAAW,CAClB,EAAQ,eACA,CACJ,EAAO,IAAI,IAAM,EACjB,EAAS,CACX,EACA,IAAU,KAAK,IAAI,EAAI,GACzB,CACF,CAEA,OADA,EAAS,MACI,aAAa,CAAK,CACjC,EAAG,CAAC,CAAC,EACE,CACT,CAYA,SAAS,GACP,CAAE,WAAU,OAAM,QAClB,EACA,EACA,EACA,EACA,CACA,IAAM,EAAO,EAAQ,SAAS,MAAQ,EAAK,sBAAsB,CAAC,CAAC,OAAS,GAC5E,GAAI,CAAC,EAAM,OAEX,IAAM,EAAM,KAAK,KAAK,EAAS,aAAe,EAAK,cAAgB,GAAI,CAAC,EAClE,EAAO,EAAM,EAAM,KAAK,IAAI,EAAK,CAAI,EAAG,EAAO,CAAQ,EAC7D,EAAQ,QAAU,CAAE,KAAM,EAAM,MAAK,EACrC,EAAS,MAAM,YAAY,gCAAiC,GAAG,EAAK,GAAG,EACvE,IAAM,EAAM,EAAS,sBAAsB,CAAC,CAAC,IAC7C,EAAS,UAAY,EAAK,UAAY,EAAa,GAAQ,EAAU,EACvE,CAEA,SAAS,EAAkC,CACzC,SACA,OACA,OACA,SACA,gBACA,cACA,SACA,gBACA,OACA,gBACA,YACA,eACA,gBACA,eACA,cACA,aACA,aACA,WACiC,CACjC,IAAM,EAAc,EAAuB,IAAI,EACzC,EAAU,EAAuB,IAAI,EACrC,EAAU,EAAuB,IAAI,EACrC,EAAa,EAAuB,IAAI,EACxC,EAAU,EAA2B,IAAI,EACzC,GAAU,EAAuB,IAAI,EACrC,EAAW,EAAO,CAAM,EACxB,EAAW,EAAsE,IAAI,EACrF,CAAC,EAAM,IAAW,EAA6B,IAAI,EACnD,CAAC,EAAY,IAAiB,EAAS,EAAK,EAC5C,EAAM,GAAO,EAEb,EAAa,IAAS,EAAa,IAAM,EAAI,EAC7C,EAAa,EAAY,EAAM,EAAM,EAAY,CAAC,CAAC,MACnD,EAAU,EAAU,EAAY,EAAY,CAAM,EAIlD,GAAQ,EAAO,EAAS,QAAU,EAElC,EAAQ,GACZ,EAAU,CAAU,EACnB,GAAS,GAAa,GAAS,EAAM,EAAM,EAAM,CAAM,CAAC,MACnD,EAAY,OACpB,EAEA,SAAS,GAAoC,CAC3C,IAAM,EAAW,EAAY,QACvB,EAAO,EAAQ,QACf,EAAO,EAAQ,QACrB,OAAO,GAAY,GAAQ,EAAO,CAAE,WAAU,OAAM,MAAK,EAAI,IAC/D,CAGA,OAAsB,CACpB,IAAM,EAAW,EAAY,QACvB,EAAO,EAAQ,QACrB,GAAI,CAAC,GAAY,CAAC,EAAM,OACxB,IAAM,EAAO,EAAK,aAAe,GACjC,GAAI,CAAC,EAAM,OACX,IAAM,EAAU,IAAI,KACd,EAAa,EAAQ,KAAM,GAAQ,EAAU,EAAK,CAAO,CAAC,EAC1D,EAAS,KAAiB,EAAa,KAAK,IAAI,EAAG,EAAa,CAAO,EAAI,GAAK,CAAC,EAAI,IAC3F,EAAS,UAAY,EAAM,EAAQ,EAAG,EAAE,EAAI,CAE9C,EAAG,CAAC,CAAC,EAEL,OAAgB,CACd,IAAM,EAAW,EAAY,QAC7B,GAAI,CAAC,EAAU,OAGf,SAAS,EAAQ,EAAmB,CAClC,GAAI,CAAC,EAAM,QAAS,OACpB,IAAM,EAAW,EAAa,EAC9B,GAAI,CAAC,EAAU,OACf,EAAM,eAAe,EACrB,IAAM,EAAO,EAAS,KAAK,sBAAsB,EAC3C,EAAO,EAAK,OAAS,GACtB,GACL,GACE,EACA,EACA,EAAO,KAAK,IAAI,CAAC,EAAM,OAAS,GAAI,GACnC,EAAM,QAAU,EAAK,KAAO,EAC7B,EAAM,OACR,CACF,CAEA,OADA,EAAS,iBAAiB,QAAS,EAAS,CAAE,QAAS,EAAM,CAAC,MACjD,EAAS,oBAAoB,QAAS,CAAO,CAG5D,EAAG,CAAC,CAAO,CAAC,EAGZ,SAAS,GAAQ,EAA8D,CAC7E,IAAM,EAAO,EAAW,QACxB,GAAI,CAAC,EAAM,OAAO,KAClB,IAAM,EAAO,EAAK,sBAAsB,EACxC,GAAI,CAAC,EAAK,OAAS,CAAC,EAAK,OAAQ,OAAO,KACxC,IAAM,EAAS,EAAM,KAAK,OAAQ,EAAM,EAAI,EAAK,MAAQ,EAAK,MAAS,EAAQ,MAAM,EAAG,EAAG,EAAQ,OAAS,CAAC,EAC7G,MAAO,CACL,IAAK,EAAQ,EAAY,EAAQ,EAAO,EACxC,QAAS,GAAQ,EAAM,EAAI,EAAK,KAAO,EAAK,OAAU,EAAiB,EAAG,CAAe,CAC3F,CACF,CAGA,SAAS,GAAiB,EAAqB,CAC7C,OAAO,EAAQ,EAAY,CAAK,EAAI,EAAkB,EAAa,CAAK,CAC1E,CAEA,SAAS,EAAQ,EAAsB,EAAwD,CAC7F,IAAM,EAAK,GAAQ,CAAK,EACxB,GAAI,CAAC,EAAI,OAAO,KAChB,IAAM,EAAQ,EAAa,EAE3B,GAAI,EAAQ,OAAS,SAAU,CAC7B,IAAM,EAAS,KAAK,MAAM,EAAQ,OAAS,CAAW,EAAI,EACpD,CAAC,EAAM,GACX,EAAG,SAAW,EACV,CAAC,EAAQ,KAAK,IAAI,KAAK,KAAK,EAAG,QAAU,CAAW,EAAI,EAAa,EAAS,CAAW,CAAC,EAC1F,CAAC,KAAK,MAAM,EAAG,QAAU,CAAW,EAAI,EAAa,EAAS,CAAW,EACzE,EAAM,EAAQ,EAAY,EAAQ,GAAG,EACrC,EAAQ,EAAU,EAAK,CAAI,EACjC,MAAO,CAAE,QAAO,IAAK,EAAS,EAAO,EAAU,EAAK,KAAK,IAAI,EAAI,CAAe,CAAC,EAAG,EAAK,CAAI,CAAE,CACjG,CAEA,IAAM,EAAU,EAAG,IAAM,EAAkB,EAAG,QACxC,EAAa,GAAiB,EAAQ,MAAM,KAAK,EACvD,GAAI,EAAQ,OAAS,OAAQ,CAC3B,IAAM,EAAO,EAAM,GAAK,EAAU,EAAQ,KAAM,CAAW,EAAG,KAAK,IAAI,EAAY,CAAC,EAAG,EAAQ,CAAW,EACpG,EAAQ,EAAU,EAAY,CAAI,EAElC,EAAS,EAAS,EAAQ,KAAK,CAAC,CAAC,QAAQ,EAAI,EAAQ,MAAM,MAAM,QAAQ,EAC/E,MAAO,CAAE,QAAO,IAAK,IAAI,KAAK,EAAM,QAAQ,EAAI,CAAM,CAAE,CAC1D,CACA,IAAM,EAAK,EAAM,GAAK,EAAS,CAAW,EAAG,EAAa,EAAa,KAAK,IAAI,EAAO,EAAa,CAAW,CAAC,EAC1G,EAAQ,EAAQ,MAAM,MAC5B,MAAO,CAAE,QAAO,IAAK,EAAS,EAAO,EAAU,EAAY,CAAE,EAAG,EAAK,CAAU,CAAE,CACnF,CAEA,SAAS,EAAa,EAA0B,CAC9C,EAAQ,QAAU,EAClB,GAAQ,CAAI,CACd,CAEA,SAAS,GAAU,EAAqC,CACtD,OAAO,EAAO,KAAM,GAAc,OAAO,EAAU,EAAE,IAAM,EAAQ,QAAQ,QAAQ,CACrF,CAEA,GAAyB,EAAa,CACpC,QAAS,EAAM,OACf,aAAgB,GAChB,YAAa,EAAM,KACnB,YAAa,EAAI,IAAa,EAAM,OAAO,GAAS,EAAI,EAAM,MAAM,EAAG,CAAQ,CAAC,EAChF,UAAW,EAAQ,IAAU,CAC3B,GAAI,CAAC,EAAW,SAAS,SAAS,CAAM,EAAG,OAAO,KAClD,IAAM,EAAK,GAAQ,CAAK,EACxB,GAAI,CAAC,EAAI,OAAO,KAChB,IAAM,EAAU,EAAO,QAAqB,kBAAkB,EAC9D,GAAI,EAAS,CACX,IAAM,EAAQ,EAAgB,GAAU,CAAO,EAAI,IAAA,GACnD,GAAI,CAAC,GAAS,EAAM,SAAU,OAAO,KACrC,IAAM,EAAU,CAAE,MAAO,EAAM,MAAO,IAAK,EAAS,CAAK,CAAE,EAG3D,OAFI,EAAO,QAAQ,mBAAmB,EAAU,CAAE,KAAM,SAAU,QAAO,GAAG,CAAQ,EAE7E,CAAE,KAAM,OAAQ,QAAO,KADjB,EAAG,IAAM,EAAkB,EAAG,QAAU,GAAiB,EAAM,KAAK,EAC7C,GAAG,CAAQ,CACjD,CACA,GAAI,CAAC,EAAc,OAAO,KAC1B,IAAM,EAAM,EAAQ,EAAY,EAAG,GAAG,EACtC,MAAO,CAAE,KAAM,SAAU,IAAK,EAAG,IAAK,OAAQ,EAAG,QAAS,MAAO,EAAK,IAAK,CAAI,CACjF,EACA,aAAc,EAAS,IAAU,CAC/B,EAAS,QAAU,EACnB,EAAa,CAAE,GAAG,EAAS,GAAG,EAAQ,EAAS,CAAK,CAAE,CAAC,CACzD,EACA,WAAa,GAAU,CACrB,IAAM,EAAU,EAAQ,QAClB,EAAO,GAAW,EAAQ,EAAS,CAAK,EACzC,GAAY,IACb,EAAK,MAAM,QAAQ,IAAM,EAAQ,MAAM,QAAQ,GAAK,EAAK,IAAI,QAAQ,IAAM,EAAQ,IAAI,QAAQ,IACnG,EAAa,CAAE,GAAG,EAAS,GAAG,CAAK,CAAC,CACtC,EACA,UAAY,GAAU,CACpB,IAAM,EAAU,EAAQ,QAExB,GADA,EAAa,IAAI,EACb,CAAC,EAAS,OACd,GAAM,CAAE,QAAO,OAAQ,EAAQ,EAAS,CAAK,GAAK,EAClD,GAAI,EAAQ,OAAS,SAAU,CAC7B,IAAe,CAAE,QAAO,MAAK,OAAQ,EAAM,EAAG,GAAS,EAAQ,IAAK,EAAO,CAAG,CAAC,EAC/E,MACF,EAEE,EAAM,QAAQ,IAAM,EAAQ,MAAM,MAAM,QAAQ,GAAK,EAAI,QAAQ,IAAM,EAAS,EAAQ,KAAK,CAAC,CAAC,QAAQ,IACzF,IAAgB,CAAE,MAAO,EAAQ,MAAO,QAAO,KAAI,CAAC,CACtE,EACA,iBAAoB,EAAa,IAAI,EACrC,cAAe,EAAQ,IAAa,CAClC,IAAM,EAAO,EAAQ,QACrB,GAAI,CAAC,EAAM,OACX,IAAM,EAAO,EAAK,sBAAsB,EAClC,EAAO,EAAK,OAAS,GACtB,IACL,EAAS,QAAU,CAAE,OAAM,YAAa,EAAO,EAAI,EAAK,KAAO,EAAM,UAAS,EAChF,EACA,aAAc,EAAQ,IAAa,CACjC,IAAM,EAAQ,EAAS,QACjB,EAAW,EAAa,EACzB,GAAU,GAAa,EAAM,UAClC,GAAO,EAAU,EAAU,EAAM,KAAO,EAAY,EAAM,SAAU,EAAM,WAAY,EAAO,CAAC,CAChG,EACA,eAAkB,CAChB,EAAS,QAAU,IACrB,EACA,eAAkB,CAChB,IAAM,EAAW,EAAY,QACvB,EAAO,EAAQ,QACrB,GAAI,CAAC,GAAY,CAAC,EAAM,OAAO,KAC/B,IAAM,EAAO,EAAS,sBAAsB,EAE5C,MAAO,CAAE,QAAS,EAAU,IAAK,EAAK,IAAM,EAAK,aAAc,OAAQ,EAAK,MAAO,CACrF,CACF,CAAC,EAED,SAAS,GAAkB,EAAwC,EAAW,CAC5E,GAAI,CAAC,GAAiB,EAAW,OAAmB,QAAQ,kBAAkB,EAAG,OACjF,IAAM,EAAO,EAAW,cAAc,sBAAsB,EAC5D,GAAI,CAAC,EAAK,OAAQ,OAClB,IAAM,GAAY,EAAW,QAAU,EAAK,KAAO,EAAK,OAAU,EAC5D,EAAO,EAAM,KAAK,MAAM,EAAU,CAAW,EAAI,EAAa,EAAG,EAAkB,CAAW,EAC9F,EAAQ,EAAU,EAAK,CAAI,EAE3B,EAAM,IAAI,KAAK,EAAM,QAAQ,EAAI,KAAK,IAAI,GAAI,CAAW,EAAI,GAAM,EACnE,EAAW,EAAU,EAAK,CAAe,EACzC,EAAO,CAAE,QAAO,IAAK,EAAM,EAAW,EAAM,EAAU,OAAQ,EAAM,EAC1E,EAAa,EAAM,GAAS,EAAQ,EAAY,CAAG,EAAG,EAAK,MAAO,EAAK,GAAG,CAAC,CAC7E,CAMA,SAAS,GAAS,EAAkB,EAAa,EAAwB,CACvE,IAAM,EAAS,GAAQ,QACvB,GAAI,CAAC,EAAQ,OAAO,EAAY,QAChC,IAAM,EAAO,EAAQ,EAAY,EAAW,CAAC,EACvC,EAAM,EAAa,CAAK,EACxB,EAAS,GAAO,EAAO,EAAkB,EAAa,CAAG,EACzD,EAAS,KAAK,IAClB,EAAQ,UAAW,GAAQ,EAAQ,EAAY,CAAG,IAAM,CAAQ,EAChE,CACF,EAMA,MALA,GAAO,MAAM,KAAO,GAAI,EAAS,EAAQ,OAAU,IAAI,GACvD,EAAO,MAAM,MAAQ,GAAG,IAAM,EAAQ,OAAO,GAC7C,EAAO,MAAM,IAAM,GAAI,EAAM,EAAmB,IAAI,GAEpD,EAAO,MAAM,OAAS,GAAI,KAAK,IAAI,EAAS,EAAK,CAAC,EAAI,EAAmB,IAAI,GACtE,CACT,CAEA,SAAS,GAAgB,EAAiB,CACxC,GAAM,CAAE,SAAU,EAClB,OACE,EAAC,SAAD,CAEE,KAAK,SACL,iBAAgB,OAAO,EAAM,EAAE,EAC/B,UAAW,EACT,EAAO,YACP,EAAI,iBAAmB,EAAO,2BAC9B,EAAI,gBAAkB,EAAO,0BAC7B,GAAY,KACd,EACA,MACE,CACE,gBAAiB,EAAM,MACvB,WAAY,GAAG,EAAI,MAAQ,EAAE,UAAU,EAAI,OAC3C,QAAS,EAAI,KAAO,EACpB,GAAG,GAAY,KACjB,EAEF,aAAY,GAAG,EAAM,MAAM,IAAI,EAAK,SACpC,QAAU,GAAe,IAAe,EAAO,EAAW,aAAa,EAEvE,SAAA,EAAC,OAAD,CAAM,UAAW,EAAO,iBAAkB,cAAA,GACvC,SAAA,EAAc,EAAY,EAAO,CAAE,WAAY,EAAK,CAAC,EAAI,EAAM,KAC5D,CAAA,CACA,EAvBD,EAAM,EAuBL,CAEZ,CAEA,SAAS,GAAU,EAAkB,CACnC,GAAM,CAAE,SAAU,EACZ,EAAU,EAAI,OAAS,EAAI,IAC3B,EAAQ,EAAU,GAClB,EAAO,GAAgB,EAAM,MAAO,EAAS,CAAK,EAAG,CAAM,EAC3D,EAAY,EAAQ,GAAkB,CAAC,EAAM,UAAY,CAAC,EAAI,eAC9D,EAAU,GAAQ,EAAK,OAAS,UAAY,EAAK,QAAU,EACjE,OACE,EAAC,SAAD,CAEE,KAAK,SACL,iBAAgB,OAAO,EAAM,EAAE,EAC/B,aAAY,GAAG,EAAM,MAAM,IAAI,IAC/B,UAAW,EACT,EAAO,cACP,GAAS,EAAO,mBAChB,EAAA,IAAiC,EAAO,mBACxC,EAAI,iBAAmB,EAAO,6BAC9B,EAAI,gBAAkB,EAAO,6BAC5B,GAAgB,IAAc,EAAO,yBACtC,GAAW,EAAO,qBAClB,GAAY,KACd,EACA,MACE,CACE,gBAAiB,EAAM,MACvB,IAAK,GAAI,EAAI,IAAM,EAAmB,IAAI,GAC1C,SAAU,GAAI,EAAU,EAAmB,IAAI,GAC/C,KAAM,8BAA8B,EAAI,OAAS,EAAI,QAAQ,GAC7D,MAAO,8BAA8B,EAAI,KAAO,EAAI,QAAQ,GAC5D,GAAG,GAAY,KACjB,EAEF,QAAU,GAAe,IAAe,EAAO,EAAW,aAAa,EAzBzE,SAAA,CA2BE,EAAC,OAAD,CAAM,UAAW,EAAO,mBAAoB,cAAA,GACzC,SAAA,EAAc,EAAY,EAAO,CAAE,WAAY,CAAM,CAAC,EAAI,EAAM,KAC7D,CAAA,EACN,EAAC,OAAD,CAAM,UAAW,EAAO,kBAAmB,cAAA,GACxC,SAAA,GAAiB,EAAM,MAAO,EAAS,CAAK,EAAG,CAAM,CAClD,CAAA,EACL,GAAa,EAAC,OAAD,CAAM,kBAAA,GAAgB,UAAW,EAAO,eAAgB,cAAA,EAAa,CAAA,CAC7E,CAjCD,EAAA,EAAM,EAiCL,CAEZ,CAEA,SAAS,GAAc,EAAW,CAChC,GAAI,CAAC,EAAM,OAAO,KAClB,IAAM,EAAW,EACX,EAAO,EAAQ,EAAK,CAAC,EAE3B,GADI,EAAK,KAAO,GAAY,EAAK,MAAQ,GACrC,EAAK,OAAS,EAAM,OAAO,KAC/B,IAAM,EAAM,EAAK,MAAQ,EAAW,EAAI,EAAa,EAAK,KAAK,EACzD,EAAS,EAAK,KAAO,EAAO,EAAkB,EAAa,EAAK,GAAG,EACnE,EAAQ,EAAK,OAAS,SAAW,IAAA,GAAY,EAAK,MAAM,MACxD,EAAQ,EAAK,OAAS,SAAW,KAAO,EAAK,MAAM,MACzD,OACE,EAAC,MAAD,CACE,UAAW,EAAO,gBAClB,MACE,CACE,gBAAiB,EACjB,IAAK,GAAI,EAAM,EAAmB,IAAI,GACtC,OAAQ,GAAI,KAAK,IAAI,EAAS,EAAK,EAAE,EAAI,EAAmB,IAAI,EAClE,EAEF,cAAA,GATF,SAAA,CAWG,GAAS,EAAC,OAAD,CAAM,UAAW,EAAO,mBAAqB,SAAA,CAAY,CAAA,EACnE,EAAC,OAAD,CAAM,UAAW,EAAO,oBAAsB,SAAA,GAAiB,EAAK,MAAO,EAAK,IAAK,CAAM,CAAQ,CAAA,CAChG,GAET,CAEA,IAAM,EAAQ,GAAM,IAAK,GAAS,CAChC,IAAM,EAAQ,EAAY,EAAM,GAAS,EAAM,EAAM,EAAM,CAAM,EAAG,EAAY,CAAC,CAAC,MAC5E,EAAQ,EAAU,EAAO,EAAY,CAAM,EAC3C,EAAS,GAAU,GAAO,EAAO,EAAY,EAInD,MAAO,CAAE,OAAM,QAAO,QAAO,MAHE,EAC3B,CAAE,QAAS,EAAQ,SAAU,EAAG,OAAQ,EAAM,QAAU,CAAC,CAAE,EAC3D,GAAW,EAAQ,EAAM,OAAQ,EAAa,CACf,CACrC,CAAC,EACK,GAAY,EAAM,EAAE,CAAC,MAAM,OAAO,KAAM,GAAU,EAAQ,CAAC,EAC3D,GAAa,GACjB,EAAG,EAAY,UAAW,IAAS,IAAM,EAAY,cAAe,IAAS,GAAK,EAAY,aAAa,EAE7G,OACE,EAAC,MAAD,CACE,IAAK,EACL,SAAU,GACV,UAAW,EAAO,SAClB,MACE,CACE,SAAU,EAAQ,OAClB,gCAAiC,EAAQ,QAAU,GAAG,EAAQ,QAAQ,KAAK,IAAM,IAAA,EACnF,EARJ,SAAA,CAWE,EAAC,MAAD,CAAK,IAAK,EAAS,UAAW,EAAO,aAArC,SAAA,CACE,EAAC,MAAD,CAAK,UAAW,EAAO,eACnB,UAAA,IAAa,IACb,EAAC,SAAD,CACE,KAAK,SACL,UAAW,EAAG,EAAO,eAAgB,GAAc,EAAO,kBAAkB,EAC5E,aAAY,EAAK,OACjB,gBAAe,EACf,YAAe,GAAe,GAAS,CAAC,CAAI,EAE3C,SAAA,EAAW,EAAa,CACnB,CAAA,CAEP,CAAA,EACL,EAAC,MAAD,CAAK,UAAW,EAAY,cAC1B,SAAA,EAAC,MAAD,CAAK,IAAK,EAAM,SAAU,UAAW,EAAY,WAC9C,SAAA,EAAM,KAAK,CAAE,OAAM,QAAO,QAAO,WAChC,EAAC,MAAD,CAEE,UAAW,EAAG,GAAU,CAAI,EAAG,EAAO,gBAAgB,EACtD,MAAO,IAAS,EAChB,cAAa,IAAS,GAAK,IAAA,GAJ7B,SAAA,CAMG,EAAM,IAAK,GAAQ,CAClB,IAAM,EAAU,EAAU,EAAK,CAAG,EAC5B,EACJ,EAAA,GAAA,CAAA,SAAA,CACE,EAAC,OAAD,CAAM,UAAW,EAAO,gBAAkB,SAAA,GAAc,EAAK,EAAQ,OAAO,CAAQ,CAAA,EACpF,EAAC,OAAD,CAAM,UAAW,EAAG,EAAO,kBAAmB,GAAW,EAAO,sBAAsB,EACnF,SAAA,GAAgB,EAAK,CAAM,CACxB,CAAA,CACN,CAAA,CAAA,EAEE,EAAS,CACb,UAAW,EAAG,EAAO,kBAAmB,GAAY,SAAS,EAC7D,MAAO,GAAY,UACnB,eAAgB,EAAW,OAAmB,IAAA,EAChD,EACA,OAAO,EAAa,GAAK,EACvB,EAAC,SAAD,CAEE,KAAK,SACL,GAAI,EACJ,UAAW,EAAG,EAAO,UAAW,EAAO,qBAAqB,EAC5D,aAAY,GAAe,EAAK,CAAM,EACtC,YAAe,EAAU,CAAG,EAE3B,SAAA,CACK,EARD,EAAU,CAAG,CAQZ,EAER,EAAC,MAAD,CAA0B,GAAI,EAC3B,SAAA,CACE,EAFK,EAAU,CAAG,CAElB,CAET,CAAC,EACD,EAAC,MAAD,CAAK,UAAW,EAAO,eAAgB,aAAY,EAAK,OAAQ,KAAK,QAArE,SAAA,CACG,EAAM,QAAQ,IAAI,EAAe,EACjC,EAAM,OAAO,KACX,EAAO,IACN,EAAQ,GACN,EAAC,MAAD,CAEE,cAAA,GACA,UAAW,EAAO,aAClB,MAAO,CAAE,WAAY,EAAS,EAAG,QAAS,EAAM,SAAW,CAAE,EAC7D,YAAe,GAAc,EAAI,EAEhC,SAAA,EAAK,KAAK,CAAK,CACb,EAPE,QAAQ,GAOV,CAEX,CACG,CACF,CAAA,CAAA,CAtDE,EAAA,EAAU,CAAK,CAsDjB,CACN,CACE,CAAA,CACF,CAAA,CACF,CAEL,CAAA,EAAA,EAAC,MAAD,CAAK,IAAK,EAAS,UAAW,EAAO,aAArC,SAAA,CACE,EAAC,MAAD,CAAK,UAAW,EAAO,eAAgB,cAAA,GACpC,SAAA,GAAM,IAAK,GACV,EAAC,OAAD,CAAiB,UAAW,EAAO,aAAc,MAAO,CAAE,IAAK,GAAI,EAAO,GAAM,IAAI,EAAG,EACpF,SAAA,GAAW,EAAM,CAAM,CACpB,EAFK,CAEL,CACP,CACE,CAAA,EACL,EAAC,MAAD,CAAK,UAAW,EAAY,cAC1B,SAAA,EAAC,MAAD,CAAK,IAAK,EAAM,SAAU,UAAW,EAAY,WAC9C,SAAA,EAAM,KAAK,CAAE,OAAM,QAAO,WACzB,EAAC,MAAD,CAEE,IAAK,IAAS,EAAI,EAAa,IAAA,GAC/B,UAAW,EAAG,GAAU,CAAI,EAAG,EAAO,gBAAgB,EACtD,MAAO,IAAS,EAChB,cAAa,IAAS,GAAK,IAAA,GAL7B,SAAA,CAOG,EAAM,IAAK,GAAQ,CAClB,IAAM,EAAU,EAAU,EAAK,CAAG,EAClC,OACE,EAAC,MAAD,CAEE,KAAK,QACL,aAAY,GAAe,EAAK,CAAM,EACtC,kBAAiB,EAAU,CAAG,EAC9B,UAAW,EACT,EAAO,eACP,GAAW,EAAO,oBAClB,GAAgB,EAAO,wBACvB,GAAY,IACd,EACA,MAAO,GAAY,KACnB,QAAU,GAAe,GAAkB,EAAY,CAAG,EAZ5D,SAAA,CAcG,GAAQ,GAAO,CAAG,CAAC,CAAC,IAAI,EAAS,EACjC,GACC,EAAC,MAAD,CACE,UAAW,EAAO,YAClB,MAAO,CAAE,IAAK,GAAI,EAAa,CAAG,EAAA,KAAuB,IAAI,EAAG,EAChE,cAAA,EACD,CAAA,EAEF,IAAS,GAAK,GAAc,CAAG,CAC7B,CAtBE,EAAA,EAAU,CAAG,CAsBf,CAET,CAAC,EACA,IAAS,GAAK,EAAC,MAAD,CAAK,IAAK,GAAS,UAAW,EAAO,aAAc,cAAA,EAAa,CAAA,CAC5E,CApCE,EAAA,EAAU,CAAK,CAoCjB,CACN,CACE,CAAA,CACF,CAAA,CACF,CACF,CAAA,CAAA,GAET"}
|
|
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
|