@manzanohq/calendar-lite 0.1.1
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/LICENSE +191 -0
- package/cdn/calendar.component.d.ts +146 -0
- package/cdn/calendar.component.js +2 -0
- package/cdn/calendar.component.js.map +7 -0
- package/cdn/calendar.d.ts +9 -0
- package/cdn/calendar.js +2 -0
- package/cdn/calendar.js.map +7 -0
- package/cdn/calendar.styles.d.ts +3 -0
- package/cdn/calendar.styles.js +2 -0
- package/cdn/calendar.styles.js.map +7 -0
- package/cdn/calendar.types.d.ts +99 -0
- package/cdn/calendar.types.js +2 -0
- package/cdn/calendar.types.js.map +7 -0
- package/cdn/chunks/chunk.B6XGWUEF.js +1 -0
- package/cdn/chunks/chunk.B6XGWUEF.js.map +7 -0
- package/cdn/chunks/chunk.BYWXPW2P.js +2 -0
- package/cdn/chunks/chunk.BYWXPW2P.js.map +7 -0
- package/cdn/chunks/chunk.EOXXNYIW.js +2 -0
- package/cdn/chunks/chunk.EOXXNYIW.js.map +7 -0
- package/cdn/chunks/chunk.MGICPQBB.js +2 -0
- package/cdn/chunks/chunk.MGICPQBB.js.map +7 -0
- package/cdn/chunks/chunk.OEC274YS.js +915 -0
- package/cdn/chunks/chunk.OEC274YS.js.map +7 -0
- package/cdn/chunks/chunk.PJFNXC5P.js +307 -0
- package/cdn/chunks/chunk.PJFNXC5P.js.map +7 -0
- package/cdn/index.d.ts +3 -0
- package/cdn/index.js +2 -0
- package/cdn/index.js.map +7 -0
- package/cdn/internal/date-utils.d.ts +74 -0
- package/cdn/internal/date-utils.js +2 -0
- package/cdn/internal/date-utils.js.map +7 -0
- package/cdn/internal/event-layout.d.ts +67 -0
- package/cdn/internal/event-layout.js +2 -0
- package/cdn/internal/event-layout.js.map +7 -0
- package/dist/calendar.component.d.ts +146 -0
- package/dist/calendar.component.d.ts.map +1 -0
- package/dist/calendar.component.js +1218 -0
- package/dist/calendar.component.js.map +7 -0
- package/dist/calendar.d.ts +9 -0
- package/dist/calendar.d.ts.map +1 -0
- package/dist/calendar.js +5 -0
- package/dist/calendar.js.map +7 -0
- package/dist/calendar.styles.d.ts +3 -0
- package/dist/calendar.styles.d.ts.map +1 -0
- package/dist/calendar.styles.js +923 -0
- package/dist/calendar.styles.js.map +7 -0
- package/dist/calendar.types.d.ts +99 -0
- package/dist/calendar.types.d.ts.map +1 -0
- package/dist/calendar.types.js +1 -0
- package/dist/calendar.types.js.map +7 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +7 -0
- package/dist/internal/date-utils.d.ts +74 -0
- package/dist/internal/date-utils.d.ts.map +1 -0
- package/dist/internal/date-utils.js +133 -0
- package/dist/internal/date-utils.js.map +7 -0
- package/dist/internal/event-layout.d.ts +67 -0
- package/dist/internal/event-layout.d.ts.map +1 -0
- package/dist/internal/event-layout.js +224 -0
- package/dist/internal/event-layout.js.map +7 -0
- package/package.json +37 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/calendar.styles.ts"],
|
|
4
|
+
"sourcesContent": ["import { css } from 'lit';\nimport componentStyles from '@manzanohq/components/dist/styles/component.styles.js';\n\nexport default [\n componentStyles,\n css`\n /* ------------------------------------------------------------------ */\n /* Host & public/private custom property pattern */\n /* ------------------------------------------------------------------ */\n :host {\n --_calendar-bg: var(--mz-calendar-bg, var(--mz-color-surface));\n --_calendar-border: var(--mz-calendar-border-color, var(--mz-color-border));\n --_calendar-event-bg: var(--mz-calendar-event-bg, var(--mz-color-primary));\n --_calendar-event-color: var(--mz-calendar-event-color, var(--mz-color-on-primary));\n --_calendar-slot-height: var(--mz-calendar-slot-height, 3.5rem);\n --_calendar-today-bg: var(--mz-calendar-today-bg, color-mix(in srgb, var(--mz-color-primary) 5%, transparent));\n --_calendar-now-color: var(--mz-calendar-now-indicator-color, var(--mz-color-danger));\n --_calendar-gutter-width: var(--mz-calendar-gutter-width, 4.5rem);\n --_calendar-header-bg: var(--mz-calendar-header-bg, var(--mz-color-surface));\n\n display: block;\n min-height: var(--mz-calendar-min-height, 400px);\n font-family: var(--mz-font-sans);\n background: var(--_calendar-bg);\n color: var(--mz-color-text);\n border: var(--mz-border-width-sm) solid var(--_calendar-border);\n border-radius: var(--mz-radius-lg);\n overflow: hidden;\n container-type: inline-size;\n container-name: calendar;\n }\n\n /* ------------------------------------------------------------------ */\n /* Toolbar */\n /* ------------------------------------------------------------------ */\n .calendar__toolbar {\n display: flex;\n align-items: center;\n gap: var(--mz-space-sm);\n padding: var(--mz-space-sm) var(--mz-space-lg);\n border-bottom: var(--mz-border-width-sm) solid var(--_calendar-border);\n background: var(--_calendar-header-bg);\n flex-wrap: wrap;\n }\n\n .calendar__toolbar-nav {\n display: flex;\n align-items: center;\n gap: var(--mz-space-2xs);\n }\n\n .calendar__toolbar-title {\n flex: 1;\n font-size: var(--mz-font-size-lg);\n font-weight: var(--mz-font-weight-semibold);\n white-space: nowrap;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-left: var(--mz-space-xs);\n }\n\n .calendar__toolbar-views {\n display: flex;\n background: var(--_calendar-border);\n border-radius: var(--mz-radius-sm);\n padding: 1px;\n }\n\n .calendar__btn {\n appearance: none;\n border: var(--mz-border-width-sm) solid var(--_calendar-border);\n background: var(--_calendar-bg);\n color: var(--mz-color-text);\n font-family: var(--mz-font-sans);\n font-size: var(--mz-font-size-sm);\n font-weight: var(--mz-font-weight-medium);\n padding: var(--mz-space-2xs) var(--mz-space-sm);\n border-radius: var(--mz-radius-sm);\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n line-height: 1.5;\n transition: background var(--mz-transition-fast) ease,\n border-color var(--mz-transition-fast) ease,\n color var(--mz-transition-fast) ease;\n }\n\n .calendar__btn:hover {\n background: color-mix(in srgb, var(--mz-color-text) 6%, var(--_calendar-bg));\n }\n\n .calendar__btn:focus-visible {\n outline: var(--mz-focus-ring);\n outline-offset: var(--mz-focus-ring-offset);\n }\n\n /* View toggle buttons \u2014 segmented control style */\n .calendar__toolbar-views .calendar__btn {\n border: none;\n border-radius: calc(var(--mz-radius-sm) - 1px);\n padding: var(--mz-space-2xs) var(--mz-space-sm);\n font-size: var(--mz-font-size-xs);\n background: var(--_calendar-bg);\n }\n\n .calendar__toolbar-views .calendar__btn:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n\n .calendar__toolbar-views .calendar__btn:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n .calendar__toolbar-views .calendar__btn:hover {\n background: color-mix(in srgb, var(--mz-color-text) 8%, var(--_calendar-bg));\n }\n\n .calendar__btn--active {\n background: var(--mz-color-primary);\n color: var(--mz-color-on-primary);\n border-color: var(--mz-color-primary);\n }\n\n .calendar__btn--active:hover {\n background: var(--mz-color-primary);\n }\n\n .calendar__toolbar-views .calendar__btn--active {\n background: var(--mz-color-primary);\n color: var(--mz-color-on-primary);\n }\n\n .calendar__toolbar-views .calendar__btn--active:hover {\n background: var(--mz-color-primary);\n }\n\n /* ------------------------------------------------------------------ */\n /* aria-live region (visually hidden) */\n /* ------------------------------------------------------------------ */\n .calendar__live {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n /* ------------------------------------------------------------------ */\n /* Time grid: scroll container (header + allday + body) */\n /* ------------------------------------------------------------------ */\n .calendar__scroll-container {\n overflow-y: auto;\n max-height: var(--mz-calendar-body-height, 800px);\n position: relative;\n }\n\n /* Styled scrollbar \u2014 subtle, warm */\n .calendar__scroll-container::-webkit-scrollbar {\n width: 6px;\n }\n\n .calendar__scroll-container::-webkit-scrollbar-track {\n background: transparent;\n }\n\n .calendar__scroll-container::-webkit-scrollbar-thumb {\n background: color-mix(in srgb, var(--mz-color-text) 18%, transparent);\n border-radius: 3px;\n }\n\n .calendar__scroll-container::-webkit-scrollbar-thumb:hover {\n background: color-mix(in srgb, var(--mz-color-text) 30%, transparent);\n }\n\n :host([no-scroll]) .calendar__scroll-container {\n overflow-y: visible;\n max-height: none;\n }\n\n .calendar__sticky-header {\n position: sticky;\n top: 0;\n z-index: 3;\n }\n\n /* ------------------------------------------------------------------ */\n /* Time grid: header row (day headers) */\n /* ------------------------------------------------------------------ */\n .calendar__header {\n display: grid;\n grid-template-columns: var(--_calendar-gutter-width) repeat(var(--_day-count, 7), minmax(var(--_calendar-min-col-width, 3rem), 1fr));\n border-bottom: var(--mz-border-width-sm) solid var(--_calendar-border);\n background: var(--_calendar-header-bg);\n }\n\n .calendar__gutter-header {\n border-right: var(--mz-border-width-sm) solid var(--_calendar-border);\n }\n\n .calendar__day-header {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 1px;\n padding: var(--mz-space-xs) var(--mz-space-xs);\n font-size: var(--mz-font-size-2xs);\n font-weight: var(--mz-font-weight-semibold);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: color-mix(in srgb, var(--mz-color-text) 55%, transparent);\n border-left: var(--mz-border-width-sm) solid var(--_calendar-border);\n }\n\n .calendar__day-header--today {\n color: var(--mz-color-primary);\n }\n\n .calendar__day-number {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n height: 1.75rem;\n border-radius: 50%;\n font-size: var(--mz-font-size-md);\n font-weight: var(--mz-font-weight-semibold);\n line-height: 1;\n color: var(--mz-color-text);\n }\n\n .calendar__day-number--today {\n background: var(--mz-color-primary);\n color: var(--mz-color-on-primary);\n }\n\n /* ------------------------------------------------------------------ */\n /* Time grid: all-day row */\n /* ------------------------------------------------------------------ */\n .calendar__allday {\n display: grid;\n grid-template-columns: var(--_calendar-gutter-width) repeat(var(--_day-count, 7), minmax(var(--_calendar-min-col-width, 3rem), 1fr));\n border-bottom: var(--mz-border-width-sm) solid var(--_calendar-border);\n min-height: 2rem;\n position: relative;\n background: var(--_calendar-header-bg);\n }\n\n .calendar__allday-label {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n font-size: var(--mz-font-size-2xs);\n color: color-mix(in srgb, var(--mz-color-text) 45%, transparent);\n padding: var(--mz-space-2xs) var(--mz-space-xs);\n border-right: var(--mz-border-width-sm) solid var(--_calendar-border);\n }\n\n .calendar__allday-cell {\n position: relative;\n border-left: var(--mz-border-width-sm) solid var(--_calendar-border);\n min-height: 1.75rem;\n padding: var(--mz-space-2xs) var(--mz-space-2xs);\n display: flex;\n flex-direction: column;\n gap: 1px;\n }\n\n /* ------------------------------------------------------------------ */\n /* Time grid: body (time slots) */\n /* ------------------------------------------------------------------ */\n .calendar__body {\n display: grid;\n grid-template-columns: var(--_calendar-gutter-width) 1fr;\n position: relative;\n }\n\n .calendar__gutter {\n display: flex;\n flex-direction: column;\n border-right: var(--mz-border-width-sm) solid var(--_calendar-border);\n }\n\n .calendar__hour-label {\n height: var(--_calendar-slot-height);\n display: flex;\n align-items: flex-start;\n justify-content: flex-end;\n padding-right: var(--mz-space-sm);\n font-size: var(--mz-font-size-2xs);\n font-weight: var(--mz-font-weight-medium);\n color: color-mix(in srgb, var(--mz-color-text) 45%, transparent);\n transform: translateY(-0.5em);\n user-select: none;\n letter-spacing: 0.01em;\n white-space: nowrap;\n }\n\n /* Full format shown by default, short hidden */\n .calendar__hour-short {\n display: none;\n }\n\n .calendar__grid {\n position: relative;\n display: grid;\n grid-template-rows: repeat(var(--_slot-count, 48), var(--_calendar-slot-height));\n grid-template-columns: repeat(var(--_day-count, 7), minmax(var(--_calendar-min-col-width, 3rem), 1fr));\n }\n\n /* Horizontal slot lines */\n .calendar__slot-line {\n grid-column: 1 / -1;\n border-bottom: var(--mz-border-width-sm) solid var(--_calendar-border);\n pointer-events: none;\n }\n\n .calendar__slot-line--hour {\n border-bottom-style: solid;\n }\n\n .calendar__slot-line--half {\n border-bottom-color: color-mix(in srgb, var(--_calendar-border) 50%, transparent);\n border-bottom-style: solid;\n }\n\n /* Vertical day dividers */\n .calendar__day-divider {\n position: absolute;\n top: 0;\n bottom: 0;\n border-left: var(--mz-border-width-sm) solid var(--_calendar-border);\n pointer-events: none;\n z-index: 1;\n }\n\n /* Today column highlight */\n .calendar__today-col {\n position: absolute;\n top: 0;\n bottom: 0;\n background: var(--_calendar-today-bg);\n pointer-events: none;\n z-index: 0;\n }\n\n /* ------------------------------------------------------------------ */\n /* Events (time grid) */\n /* ------------------------------------------------------------------ */\n .calendar__event {\n position: absolute;\n border-radius: var(--mz-radius-sm);\n padding: var(--mz-space-2xs) var(--mz-space-xs);\n font-size: var(--mz-font-size-xs);\n line-height: 1.35;\n overflow: hidden;\n cursor: pointer;\n user-select: none;\n z-index: 2;\n background: var(--_event-bg, var(--_calendar-event-bg));\n color: var(--_event-color, var(--_calendar-event-color));\n border-left: 3px solid color-mix(in srgb, var(--_event-bg, var(--_calendar-event-bg)) 70%, #000);\n transition: box-shadow var(--mz-transition-fast) ease;\n }\n\n .calendar__event:hover {\n box-shadow: var(--mz-shadow-md);\n z-index: 4;\n }\n\n .calendar__event:focus-visible {\n outline: var(--mz-focus-ring);\n outline-offset: var(--mz-focus-ring-offset);\n z-index: 5;\n }\n\n .calendar__event-title {\n font-weight: var(--mz-font-weight-semibold);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .calendar__event-time {\n font-size: var(--mz-font-size-2xs);\n opacity: 0.8;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n /* Resize handle at bottom of event */\n .calendar__event-resize {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 8px;\n cursor: s-resize;\n z-index: 3;\n }\n\n .calendar__event-resize::after {\n content: '';\n position: absolute;\n bottom: 2px;\n left: 50%;\n transform: translateX(-50%);\n width: 1.5rem;\n height: 2px;\n border-radius: 1px;\n background: currentColor;\n opacity: 0;\n transition: opacity var(--mz-transition-fast) ease;\n }\n\n .calendar__event:hover .calendar__event-resize::after {\n opacity: 0.5;\n }\n\n /* All-day event in the all-day row */\n .calendar__allday-event {\n display: block;\n border-radius: var(--mz-radius-sm);\n padding: 2px var(--mz-space-xs);\n font-size: var(--mz-font-size-xs);\n font-weight: var(--mz-font-weight-semibold);\n line-height: 1.5;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n cursor: pointer;\n user-select: none;\n background: var(--_event-bg, var(--_calendar-event-bg));\n color: var(--_event-color, var(--_calendar-event-color));\n }\n\n .calendar__allday-event:hover {\n box-shadow: var(--mz-shadow-sm);\n }\n\n .calendar__allday-event:focus-visible {\n outline: var(--mz-focus-ring);\n outline-offset: var(--mz-focus-ring-offset);\n }\n\n /* ------------------------------------------------------------------ */\n /* Now indicator */\n /* ------------------------------------------------------------------ */\n .calendar__now-indicator {\n position: absolute;\n left: 0;\n right: 0;\n height: 2px;\n background: var(--_calendar-now-color);\n z-index: 6;\n pointer-events: none;\n }\n\n .calendar__now-indicator::before {\n content: '';\n position: absolute;\n left: -4px;\n top: -3px;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--_calendar-now-color);\n }\n\n /* ------------------------------------------------------------------ */\n /* Drag selection highlight */\n /* ------------------------------------------------------------------ */\n .calendar__drag-selection {\n position: absolute;\n background: color-mix(in srgb, var(--mz-color-primary) 15%, transparent);\n border: 2px solid color-mix(in srgb, var(--mz-color-primary) 60%, transparent);\n border-radius: var(--mz-radius-sm);\n z-index: 3;\n pointer-events: none;\n }\n\n /* ------------------------------------------------------------------ */\n /* Month grid */\n /* ------------------------------------------------------------------ */\n .calendar__month-grid {\n display: grid;\n grid-template-columns: repeat(7, minmax(0, 1fr));\n flex: 1;\n }\n\n .calendar__month-weekday {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--mz-space-sm) var(--mz-space-xs);\n font-size: var(--mz-font-size-2xs);\n font-weight: var(--mz-font-weight-semibold);\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: color-mix(in srgb, var(--mz-color-text) 50%, transparent);\n border-bottom: var(--mz-border-width-sm) solid var(--_calendar-border);\n min-width: 0;\n }\n\n .calendar__month-cell {\n min-height: 5.5rem;\n padding: var(--mz-space-2xs) var(--mz-space-xs);\n border-bottom: var(--mz-border-width-sm) solid var(--_calendar-border);\n border-right: var(--mz-border-width-sm) solid var(--_calendar-border);\n position: relative;\n overflow: hidden;\n min-width: 0;\n }\n\n .calendar__month-cell:nth-child(7n) {\n border-right: none;\n }\n\n .calendar__month-cell--outside {\n background: color-mix(in srgb, var(--mz-color-text) 2%, var(--_calendar-bg));\n }\n\n .calendar__month-cell--today {\n background: var(--_calendar-today-bg);\n }\n\n .calendar__month-date {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.5rem;\n height: 1.5rem;\n font-size: var(--mz-font-size-xs);\n font-weight: var(--mz-font-weight-medium);\n margin-bottom: var(--mz-space-2xs);\n }\n\n .calendar__month-date--today {\n background: var(--mz-color-primary);\n color: var(--mz-color-on-primary);\n border-radius: 50%;\n font-weight: var(--mz-font-weight-semibold);\n }\n\n .calendar__month-date--outside {\n opacity: 0.35;\n }\n\n .calendar__month-event {\n display: block;\n border-radius: var(--mz-radius-sm);\n padding: 2px var(--mz-space-xs);\n font-size: var(--mz-font-size-xs);\n font-weight: var(--mz-font-weight-medium);\n line-height: 1.4;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n cursor: pointer;\n user-select: none;\n background: var(--_event-bg, var(--_calendar-event-bg));\n color: var(--_event-color, var(--_calendar-event-color));\n margin-bottom: 2px;\n }\n\n .calendar__month-event:hover {\n box-shadow: var(--mz-shadow-sm);\n }\n\n .calendar__month-event:focus-visible {\n outline: var(--mz-focus-ring);\n outline-offset: var(--mz-focus-ring-offset);\n }\n\n .calendar__month-overflow {\n font-size: var(--mz-font-size-xs);\n color: color-mix(in srgb, var(--mz-color-text) 50%, transparent);\n padding: 2px var(--mz-space-xs);\n cursor: pointer;\n user-select: none;\n font-weight: var(--mz-font-weight-medium);\n }\n\n .calendar__month-overflow:hover {\n color: var(--mz-color-primary);\n }\n\n /* ------------------------------------------------------------------ */\n /* List view */\n /* ------------------------------------------------------------------ */\n .calendar__list {\n display: flex;\n flex-direction: column;\n }\n\n .calendar__list-day {\n border-bottom: var(--mz-border-width-sm) solid var(--_calendar-border);\n }\n\n .calendar__list-day-header {\n display: flex;\n gap: var(--mz-space-sm);\n padding: var(--mz-space-sm) var(--mz-space-lg);\n font-size: var(--mz-font-size-sm);\n font-weight: var(--mz-font-weight-semibold);\n background: color-mix(in srgb, var(--mz-color-text) 3%, var(--_calendar-bg));\n }\n\n .calendar__list-event {\n display: flex;\n align-items: center;\n gap: var(--mz-space-sm);\n padding: var(--mz-space-sm) var(--mz-space-lg);\n cursor: pointer;\n transition: background var(--mz-transition-fast) ease;\n }\n\n .calendar__list-event:hover {\n background: color-mix(in srgb, var(--mz-color-text) 4%, var(--_calendar-bg));\n }\n\n .calendar__list-event:focus-visible {\n outline: var(--mz-focus-ring);\n outline-offset: var(--mz-focus-ring-offset);\n }\n\n .calendar__list-event-dot {\n width: 0.5rem;\n height: 0.5rem;\n border-radius: 50%;\n background: var(--_event-bg, var(--_calendar-event-bg));\n flex-shrink: 0;\n }\n\n .calendar__list-event-time {\n font-size: var(--mz-font-size-xs);\n color: color-mix(in srgb, var(--mz-color-text) 50%, transparent);\n min-width: 6rem;\n }\n\n .calendar__list-event-title {\n font-size: var(--mz-font-size-sm);\n font-weight: var(--mz-font-weight-medium);\n flex: 1;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n /* ------------------------------------------------------------------ */\n /* Resource headers */\n /* ------------------------------------------------------------------ */\n .calendar__resource-header {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--mz-space-sm) var(--mz-space-sm);\n font-size: var(--mz-font-size-xs);\n font-weight: var(--mz-font-weight-semibold);\n border-left: var(--mz-border-width-sm) solid var(--_calendar-border);\n text-align: center;\n }\n\n /* Resource timeline */\n .calendar__timeline {\n display: grid;\n overflow-x: auto;\n }\n\n .calendar__timeline-resource-label {\n display: flex;\n align-items: center;\n padding: var(--mz-space-sm) var(--mz-space-md);\n font-size: var(--mz-font-size-sm);\n font-weight: var(--mz-font-weight-medium);\n border-bottom: var(--mz-border-width-sm) solid var(--_calendar-border);\n border-right: var(--mz-border-width-sm) solid var(--_calendar-border);\n min-width: 8rem;\n background: var(--_calendar-header-bg);\n }\n\n .calendar__timeline-row {\n display: grid;\n grid-template-columns: repeat(var(--_slot-count, 48), var(--_calendar-slot-height));\n border-bottom: var(--mz-border-width-sm) solid var(--_calendar-border);\n position: relative;\n min-height: 2.5rem;\n }\n\n .calendar__timeline-slot {\n border-right: var(--mz-border-width-sm) solid var(--_calendar-border);\n }\n\n .calendar__timeline-slot--hour {\n border-right-style: solid;\n }\n\n .calendar__timeline-slot--half {\n border-right-color: color-mix(in srgb, var(--_calendar-border) 50%, transparent);\n border-right-style: solid;\n }\n\n /* ------------------------------------------------------------------ */\n /* Empty state */\n /* ------------------------------------------------------------------ */\n .calendar__empty {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--mz-space-lg);\n color: color-mix(in srgb, var(--mz-color-text) 40%, transparent);\n font-size: var(--mz-font-size-sm);\n font-style: italic;\n }\n\n /* ------------------------------------------------------------------ */\n /* Responsive: compact (tablet-ish, \u2264768px container) */\n /* ------------------------------------------------------------------ */\n @container calendar (max-width: 768px) {\n .calendar__toolbar {\n padding: var(--mz-space-xs) var(--mz-space-sm);\n gap: var(--mz-space-xs);\n }\n\n .calendar__toolbar-title {\n font-size: var(--mz-font-size-md);\n padding-left: var(--mz-space-2xs);\n }\n\n .calendar {\n --_calendar-gutter-width: 3.5rem;\n }\n\n .calendar__month-cell {\n min-height: 4.5rem;\n }\n }\n\n /* ------------------------------------------------------------------ */\n /* Responsive: narrow (mobile, \u2264540px container) */\n /* ------------------------------------------------------------------ */\n @container calendar (max-width: 540px) {\n .calendar__scroll-container {\n max-height: var(--mz-calendar-body-height, 500px);\n }\n\n .calendar__toolbar {\n padding: var(--mz-space-xs) var(--mz-space-sm);\n gap: var(--mz-space-2xs);\n }\n\n /* Title on its own row */\n .calendar__toolbar-title {\n font-size: var(--mz-font-size-sm);\n font-weight: var(--mz-font-weight-semibold);\n padding-left: 0;\n order: -1;\n flex-basis: 100%;\n }\n\n .calendar__toolbar-nav {\n gap: 2px;\n }\n\n .calendar__toolbar-views .calendar__btn {\n padding: 3px var(--mz-space-xs);\n font-size: 0.6875rem;\n }\n\n .calendar__btn {\n padding: var(--mz-space-2xs) var(--mz-space-xs);\n font-size: var(--mz-font-size-xs);\n line-height: 1.4;\n }\n\n .calendar {\n --_calendar-gutter-width: 2.75rem;\n --_calendar-slot-height: var(--mz-calendar-slot-height, 2.75rem);\n }\n\n .calendar__hour-label {\n font-size: 0.625rem;\n padding-right: var(--mz-space-2xs);\n letter-spacing: -0.01em;\n }\n\n /* Swap to short hour format (e.g. \"9 AM\" instead of \"9:00 AM\") */\n .calendar__hour-full {\n display: none;\n }\n\n .calendar__hour-short {\n display: inline;\n }\n\n .calendar__allday-label {\n font-size: 0.5625rem;\n padding: var(--mz-space-2xs) 2px;\n }\n\n .calendar__day-header {\n padding: var(--mz-space-2xs) 0;\n font-size: 0.5625rem;\n letter-spacing: 0.02em;\n }\n\n .calendar__day-number {\n width: 1.375rem;\n height: 1.375rem;\n font-size: var(--mz-font-size-xs);\n }\n\n .calendar__event {\n padding: 2px var(--mz-space-2xs);\n font-size: 0.6875rem;\n line-height: 1.3;\n border-left-width: 2px;\n }\n\n .calendar__event-time {\n font-size: 0.5625rem;\n }\n\n .calendar__allday-event {\n font-size: 0.6875rem;\n padding: 1px var(--mz-space-2xs);\n }\n\n .calendar__month-cell {\n min-height: 3.25rem;\n padding: 2px;\n }\n\n .calendar__month-date {\n width: 1.25rem;\n height: 1.25rem;\n font-size: 0.625rem;\n }\n\n .calendar__month-event {\n font-size: 0.625rem;\n padding: 1px 3px;\n line-height: 1.35;\n border-radius: 2px;\n }\n\n .calendar__month-overflow {\n font-size: 0.625rem;\n padding: 1px 3px;\n }\n\n .calendar__month-weekday {\n padding: var(--mz-space-2xs) 0;\n font-size: 0.5625rem;\n }\n\n /* List view \u2014 tighter on mobile */\n .calendar__list-event {\n padding: var(--mz-space-xs) var(--mz-space-sm);\n gap: var(--mz-space-xs);\n }\n\n .calendar__list-event-time {\n font-size: 0.6875rem;\n min-width: 4.5rem;\n }\n\n .calendar__list-event-title {\n font-size: var(--mz-font-size-xs);\n }\n\n .calendar__list-day-header {\n padding: var(--mz-space-xs) var(--mz-space-sm);\n font-size: var(--mz-font-size-xs);\n }\n\n /* Resource headers tighter */\n .calendar__resource-header {\n padding: var(--mz-space-xs) var(--mz-space-2xs);\n font-size: 0.625rem;\n }\n }\n\n /* ------------------------------------------------------------------ */\n /* Touch: larger hit targets */\n /* ------------------------------------------------------------------ */\n @media (pointer: coarse) {\n .calendar__btn {\n min-height: 2.25rem;\n min-width: 2.25rem;\n }\n\n .calendar__event-resize {\n height: 12px;\n }\n\n .calendar__month-event {\n min-height: 1.375rem;\n line-height: 1.375rem;\n }\n\n .calendar__allday-event {\n min-height: 1.375rem;\n line-height: 1.375rem;\n }\n\n .calendar__list-event {\n min-height: 2.5rem;\n }\n }\n `\n];\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,OAAAA,MAAW,MACpB,OAAOC,MAAqB,wDAE5B,IAAOC,EAAQ,CACbD,EACAD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAk5BF",
|
|
6
|
+
"names": ["css", "componentStyles", "calendar_styles_default"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import{a as A}from"./chunk.OEC274YS.js";import{a as K,b as tt,c as et}from"./chunk.EOXXNYIW.js";import{a as M,b as E,c as j,d as P,f as O,g as z,i as U,j as S,k as B,l as J,m as Q,n as b,o as I,p as x,q as Z}from"./chunk.BYWXPW2P.js";import{a as g}from"./chunk.MGICPQBB.js";import{html as d,nothing as C}from"lit";import{property as _,state as F}from"lit/decorators.js";import{classMap as H}from"lit/directives/class-map.js";import{styleMap as W}from"lit/directives/style-map.js";import{ManzanoElement as ot}from"@manzanohq/components/dist/internal/manzano-element.js";import{watch as q}from"@manzanohq/components/dist/internal/watch.js";import{drag as nt}from"@manzanohq/components/dist/internal/drag.js";var m=class extends ot{constructor(){super(...arguments);this.view="timeGridWeek";this.date=(()=>{let t=new Date;return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")}`})();this.events=[];this.resources=[];this.slotDuration=30;this.slotMinTime="00:00";this.slotMaxTime="24:00";this.allDaySlot=!0;this.selectable=!1;this.editable=!1;this.nowIndicator=!0;this.firstDay=0;this.locale="";this.duration=0;this.dayMaxEvents=4;this.noScroll=!1;this.eventContent=null;this.currentDate=new Date;this.nowMinutes=0;this.dragSelection=null;this._containerWidth=0;this.nowTimer=null;this.dragCleanup=null;this.resizeObserver=null;this.liveText=""}connectedCallback(){super.connectedCallback(),this.updateNowMinutes(),this.nowIndicator&&(this.nowTimer=setInterval(()=>this.updateNowMinutes(),6e4)),this.resizeObserver=new ResizeObserver(t=>{for(let e of t)this._containerWidth=e.contentRect.width}),this.resizeObserver.observe(this)}disconnectedCallback(){super.disconnectedCallback(),this.nowTimer&&(clearInterval(this.nowTimer),this.nowTimer=null),this.dragCleanup&&(this.dragCleanup(),this.dragCleanup=null),this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null)}handleDateChange(t,e){if(e){let i=e.split("-").map(Number);i.length===3&&(this.currentDate=new Date(i[0],i[1]-1,i[2]))}}handleViewChange(){this.emitDatesSet(),this.announceLive(`View changed to ${this.getViewLabel(this.view)}`)}handleNowIndicatorChange(t,e){e&&!this.nowTimer?this.nowTimer=setInterval(()=>this.updateNowMinutes(),6e4):!e&&this.nowTimer&&(clearInterval(this.nowTimer),this.nowTimer=null)}prev(){this.currentDate=this.getOffsetDate(-1),this.emitDatesSet(),this.announceLive(this.getTitle())}next(){this.currentDate=this.getOffsetDate(1),this.emitDatesSet(),this.announceLive(this.getTitle())}today(){this.currentDate=M(new Date),this.emitDatesSet(),this.announceLive("Today")}gotoDate(t){this.currentDate=M(t instanceof Date?t:new Date(t)),this.emitDatesSet()}changeView(t){this.view=t}getDate(){return new Date(this.currentDate)}addEvent(t){this.events=[...this.events,t]}updateEvent(t){this.events=this.events.map(e=>e.id===t.id?t:e)}removeEvent(t){this.events=this.events.filter(e=>e.id!==t)}refetchEvents(){this.events=[...this.events]}updateNowMinutes(){let t=new Date;this.nowMinutes=b(t.getHours(),t.getMinutes())}getResolvedLocale(){return this.locale||void 0}get responsiveDayCount(){if(this.duration>0)return this.duration;let t=this.view;if(t==="timeGridWeek"||t==="listWeek"||t==="resourceTimeGridWeek"){if(this._containerWidth>0&&this._containerWidth<540)return 3;if(this._containerWidth>=540&&this._containerWidth<768)return 5}return 0}getVisibleDays(){let t=this.view,e=this.currentDate;if(this.duration>0){let n=[];for(let a=0;a<this.duration;a++)n.push(E(M(e),a));return n}let i=this.responsiveDayCount;switch(t){case"timeGridWeek":case"resourceTimeGridWeek":case"listWeek":if(i>0&&i<7){let n=[];for(let a=0;a<i;a++)n.push(E(M(e),a));return n}return O(e,this.firstDay);case"timeGridDay":case"resourceTimeGridDay":return U(e);default:return O(e,this.firstDay)}}getOffsetDate(t){let e=this.currentDate;if(this.duration>0)return E(e,t*this.duration);let i=this.responsiveDayCount;switch(this.view){case"timeGridWeek":case"resourceTimeGridWeek":case"listWeek":return E(e,t*(i>0&&i<7?i:7));case"timeGridDay":case"resourceTimeGridDay":return E(e,t);case"dayGridMonth":{let n=new Date(e);return n.setMonth(n.getMonth()+t),n}case"resourceTimeline":return E(e,t);default:return E(e,t*7)}}getVisibleRange(){if(this.view==="dayGridMonth"){let e=new Date(this.currentDate.getFullYear(),this.currentDate.getMonth(),1),i=new Date(this.currentDate.getFullYear(),this.currentDate.getMonth()+1,0);return{start:M(e),end:M(E(i,1))}}let t=this.getVisibleDays();return{start:M(t[0]),end:M(E(t[t.length-1],1))}}emitDatesSet(){let t=this.getVisibleRange();this.emit("mz-calendar-dates-set",{detail:{start:t.start,end:t.end,view:this.view}})}announceLive(t){this.liveText=t,this.requestUpdate()}getTitle(){let t=this.getResolvedLocale(),e=this.currentDate;if(this.view==="dayGridMonth")return Q(e,t);if(this.view==="timeGridDay"||this.view==="resourceTimeGridDay")return new Intl.DateTimeFormat(t,{weekday:"long",month:"long",day:"numeric",year:"numeric"}).format(e);let i=this.getVisibleDays(),n=i[0],a=i[i.length-1],o=this.responsiveDayCount;if(o>0&&o<7){if(n.getMonth()===a.getMonth())return`${new Intl.DateTimeFormat(t,{month:"short"}).format(n)} ${n.getDate()}\u2013${a.getDate()}, ${n.getFullYear()}`;let c=new Intl.DateTimeFormat(t,{month:"short",day:"numeric"}).format(n),r=new Intl.DateTimeFormat(t,{month:"short",day:"numeric",year:"numeric"}).format(a);return`${c} \u2013 ${r}`}if(n.getMonth()===a.getMonth())return`${new Intl.DateTimeFormat(t,{month:"short"}).format(n)} ${n.getDate()}\u2013${a.getDate()}, ${n.getFullYear()}`;if(n.getFullYear()===a.getFullYear()){let c=new Intl.DateTimeFormat(t,{month:"short"}).format(n),r=new Intl.DateTimeFormat(t,{month:"short"}).format(a);return`${c} ${n.getDate()} \u2013 ${r} ${a.getDate()}, ${n.getFullYear()}`}let s=new Intl.DateTimeFormat(t,{month:"short",day:"numeric",year:"numeric"}).format(n),l=new Intl.DateTimeFormat(t,{month:"short",day:"numeric",year:"numeric"}).format(a);return`${s} \u2013 ${l}`}getViewLabel(t){switch(t){case"dayGridMonth":return"Month";case"timeGridWeek":return"Week";case"timeGridDay":return"Day";case"resourceTimeGridDay":return"Resource Day";case"resourceTimeGridWeek":return"Resource Week";case"resourceTimeline":return"Timeline";case"listWeek":return"List";default:return t}}getSlotCount(){let{hours:t,minutes:e}=x(this.slotMinTime),{hours:i,minutes:n}=x(this.slotMaxTime),a=b(i,n)-b(t,e);return Math.ceil(a/this.slotDuration)}getHourLabels(){let{hours:t,minutes:e}=x(this.slotMinTime),{hours:i,minutes:n}=x(this.slotMaxTime),a=b(t,e),o=b(i,n),s=[];for(let l=a;l<o;l+=this.slotDuration){let c=new Date(2e3,0,1,Math.floor(l/60),l%60);s.push({time:c,isHour:l%60===0})}return s}getNowPosition(){if(!this.nowIndicator)return null;let{hours:t,minutes:e}=x(this.slotMinTime),{hours:i,minutes:n}=x(this.slotMaxTime),a=b(t,e),o=b(i,n),s=o-a;return this.nowMinutes<a||this.nowMinutes>o?null:(this.nowMinutes-a)/s*100}getNowDayIndex(t){let e=new Date;for(let i=0;i<t.length;i++)if(j(e,t[i]))return i;return-1}handleEventClick(t,e,i){i.stopPropagation(),this.emit("mz-calendar-event-click",{detail:{event:t,el:e,jsEvent:i}})}handleEventKeydown(t,e,i){(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),this.emit("mz-calendar-event-click",{detail:{event:t,el:e,jsEvent:i}}))}updated(){(this.selectable||this.editable)&&this.setupGridDrag()}setupGridDrag(){this.dragCleanup&&(this.dragCleanup(),this.dragCleanup=null);let t=this.shadowRoot?.querySelector(".calendar__grid");if(!t||!this.selectable)return;let e=this.getSlotCount(),i=this.getVisibleDays(),n=i.length,{hours:a,minutes:o}=x(this.slotMinTime),s=b(a,o);this.dragCleanup=nt({target:t,onStart:l=>{if(l.target.closest(".calendar__event"))return!1;let r=t.getBoundingClientRect(),h=r.height/e,u=r.width/n,v=l.clientX-r.left,p=l.clientY-r.top,T=Math.max(0,Math.min(n-1,Math.floor(v/u))),D=Math.max(0,Math.min(e-1,Math.floor(p/h)));this.dragSelection={startSlot:D,endSlot:D,dayIndex:T}},onMove:l=>{if(!this.dragSelection)return;let c=t.getBoundingClientRect(),r=c.height/e,h=l.clientY-c.top,u=Math.max(0,Math.min(e-1,Math.floor(h/r)));this.dragSelection={...this.dragSelection,endSlot:u}},onEnd:()=>{if(!this.dragSelection)return;let{startSlot:l,endSlot:c,dayIndex:r}=this.dragSelection,h=Math.min(l,c),u=Math.max(l,c)+1,v=i[r],p=s+h*this.slotDuration,T=s+u*this.slotDuration,D=new Date(v);D.setHours(Math.floor(p/60),p%60,0,0);let $=new Date(v);$.setHours(Math.floor(T/60),T%60,0,0),this.emit("mz-calendar-select",{detail:{start:D,end:$,startStr:D.toISOString(),endStr:$.toISOString(),allDay:!1}}),this.dragSelection=null}})}setupEventDrag(t,e){if(!this.editable||e.editable===!1)return;let i=this.getVisibleDays(),n=this.getSlotCount(),{hours:a,minutes:o}=x(this.slotMinTime),s=b(a,o),l=i.length,c=!1,r,h=null;nt({target:t,onStart:u=>{if(h=this.shadowRoot?.querySelector(".calendar__grid")??null,!h)return!1;let v=t.getBoundingClientRect();c=u.clientY>v.bottom-8,r={...e},t.style.zIndex="10",t.style.opacity="0.8"},onMove:u=>{if(!h)return;let v=h.getBoundingClientRect(),p=v.height/n,T=v.width/l,D=u.clientY-v.top,$=u.clientX-v.left;if(c){let G=Math.max(0,Math.min(n,Math.ceil(D/p))),k=s+G*this.slotDuration,f=new Date(y(e.start));if(f.setHours(Math.floor(k/60),k%60,0,0),f.getTime()>y(e.start).getTime()){let R=I(X(y(e.start))-s,this.slotDuration),w=I(k-s,this.slotDuration);t.style.top=`${(R-1)/n*100}%`,t.style.height=`${(w-R)/n*100}%`}}else{let G=Math.max(0,Math.min(l-1,Math.floor($/T))),k=Math.max(0,Math.min(n-1,Math.floor(D/p))),f=y(e.end).getTime()-y(e.start).getTime(),R=Math.ceil(f/6e4/this.slotDuration);t.style.top=`${k/n*100}%`,t.style.height=`${R/n*100}%`;let w=100/l;t.style.left=`${G*w}%`,t.style.width=`${w}%`}},onEnd:u=>{if(t.style.zIndex="",t.style.opacity="",!h)return;let v=h.getBoundingClientRect(),p=v.height/n,T=v.width/l,D=u.clientY-v.top,$=u.clientX-v.left;if(c){let G=Math.max(0,Math.min(n,Math.ceil(D/p))),k=s+G*this.slotDuration,f=new Date(y(e.start));if(f.setHours(Math.floor(k/60),k%60,0,0),f.getTime()<=y(e.start).getTime())return;let R=y(r.end),w=f.getTime()-R.getTime(),N=Math.floor(w/864e5),V=w%864e5,Y={...e,end:f.toISOString()};this.emit("mz-calendar-event-resize",{detail:{event:Y,oldEvent:r,endDelta:{days:N,milliseconds:V},revert:()=>{this.updateEvent(r)}}})}else{let G=Math.max(0,Math.min(l-1,Math.floor($/T))),k=Math.max(0,Math.min(n-1,Math.floor(D/p))),f=s+k*this.slotDuration,R=i[G],w=new Date(R);w.setHours(Math.floor(f/60),f%60,0,0);let N=y(r.start),V=w.getTime()-N.getTime(),Y=Math.floor(V/864e5),it=V%864e5,at=y(e.end).getTime()-y(e.start).getTime(),rt=new Date(w.getTime()+at),st={...e,start:w.toISOString(),end:rt.toISOString()};this.emit("mz-calendar-event-drop",{detail:{event:st,oldEvent:r,delta:{days:Y,milliseconds:it},revert:()=>{this.updateEvent(r)}}})}}})}render(){return d`
|
|
2
|
+
<div part="calendar" class="calendar" role="application" aria-label="Calendar">
|
|
3
|
+
${this.renderToolbar()}
|
|
4
|
+
<div class="calendar__live" aria-live="polite" role="status">${this.liveText}</div>
|
|
5
|
+
${this.renderView()}
|
|
6
|
+
</div>
|
|
7
|
+
`}renderToolbar(){return d`
|
|
8
|
+
<div part="toolbar" class="calendar__toolbar" role="toolbar" aria-label="Calendar controls">
|
|
9
|
+
<div class="calendar__toolbar-nav" role="group" aria-label="Navigation">
|
|
10
|
+
<button
|
|
11
|
+
class="calendar__btn"
|
|
12
|
+
@click=${this.prev}
|
|
13
|
+
aria-label="Previous period"
|
|
14
|
+
>‹</button>
|
|
15
|
+
<button
|
|
16
|
+
class="calendar__btn"
|
|
17
|
+
@click=${this.next}
|
|
18
|
+
aria-label="Next period"
|
|
19
|
+
>›</button>
|
|
20
|
+
<button
|
|
21
|
+
class="calendar__btn"
|
|
22
|
+
@click=${this.today}
|
|
23
|
+
>Today</button>
|
|
24
|
+
</div>
|
|
25
|
+
<span part="title" class="calendar__toolbar-title" aria-live="polite" role="heading" aria-level="2">${this.getTitle()}</span>
|
|
26
|
+
<div class="calendar__toolbar-views" role="group" aria-label="View options">
|
|
27
|
+
${this.renderViewButton("dayGridMonth","Month")}
|
|
28
|
+
${this.renderViewButton("timeGridWeek","Week")}
|
|
29
|
+
${this.renderViewButton("timeGridDay","Day")}
|
|
30
|
+
${this.renderViewButton("listWeek","List")}
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
`}renderViewButton(t,e){return d`
|
|
34
|
+
<button
|
|
35
|
+
class=${H({calendar__btn:!0,"calendar__btn--active":this.view===t})}
|
|
36
|
+
@click=${()=>this.changeView(t)}
|
|
37
|
+
aria-pressed=${this.view===t?"true":"false"}
|
|
38
|
+
>${e}</button>
|
|
39
|
+
`}renderView(){switch(this.view){case"dayGridMonth":return this.renderMonthGrid();case"timeGridWeek":case"timeGridDay":return this.renderTimeGrid(this.getVisibleDays());case"resourceTimeGridDay":case"resourceTimeGridWeek":return this.renderResourceTimeGrid(this.getVisibleDays());case"resourceTimeline":return this.renderResourceTimeline();case"listWeek":return this.renderListView();default:return this.renderTimeGrid(this.getVisibleDays())}}renderTimeGrid(t){let e=this.getSlotCount(),i=this.getHourLabels(),n=this.getResolvedLocale(),a=K(this.events,t,this.slotDuration,this.slotMinTime,this.slotMaxTime),o=this.allDaySlot?tt(this.events,t):[],s=this.getNowPosition(),l=this.getNowDayIndex(t),c=t.length;return d`
|
|
40
|
+
<div class="calendar__scroll-container">
|
|
41
|
+
<div class="calendar__sticky-header">
|
|
42
|
+
<!-- Day headers -->
|
|
43
|
+
<div part="header" class="calendar__header" role="row" style="--_day-count: ${c}">
|
|
44
|
+
<div class="calendar__gutter-header" role="presentation"></div>
|
|
45
|
+
${t.map(r=>d`
|
|
46
|
+
<div
|
|
47
|
+
class=${H({calendar__day_header:!0,"calendar__day-header":!0,"calendar__day-header--today":P(r)})}
|
|
48
|
+
role="columnheader"
|
|
49
|
+
aria-label=${new Intl.DateTimeFormat(n,{weekday:"long",month:"long",day:"numeric"}).format(r)}
|
|
50
|
+
>
|
|
51
|
+
<span>${new Intl.DateTimeFormat(n,{weekday:"short"}).format(r)}</span>
|
|
52
|
+
<span class=${H({calendar__day_number:!0,"calendar__day-number":!0,"calendar__day-number--today":P(r)})}>${r.getDate()}</span>
|
|
53
|
+
</div>
|
|
54
|
+
`)}
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<!-- All-day row -->
|
|
58
|
+
${this.allDaySlot?d`
|
|
59
|
+
<div part="allday" class="calendar__allday" style="--_day-count: ${c}">
|
|
60
|
+
<div class="calendar__allday-label">all-day</div>
|
|
61
|
+
${t.map((r,h)=>d`
|
|
62
|
+
<div class="calendar__allday-cell">
|
|
63
|
+
${o.filter(u=>h>=u.startCol-1&&h<u.endCol-1).filter(u=>u.startCol-1===h).map(u=>d`
|
|
64
|
+
<div
|
|
65
|
+
class="calendar__allday-event"
|
|
66
|
+
part="event"
|
|
67
|
+
role="button"
|
|
68
|
+
tabindex="0"
|
|
69
|
+
data-event-id=${u.event.id}
|
|
70
|
+
aria-label="${u.event.title}"
|
|
71
|
+
style=${W({...u.event.backgroundColor?{"--_event-bg":u.event.backgroundColor}:{},...u.event.textColor?{"--_event-color":u.event.textColor}:{}})}
|
|
72
|
+
@click=${v=>this.handleEventClick(u.event,v.currentTarget,v)}
|
|
73
|
+
@keydown=${v=>this.handleEventKeydown(u.event,v.currentTarget,v)}
|
|
74
|
+
>${u.event.title}</div>
|
|
75
|
+
`)}
|
|
76
|
+
</div>
|
|
77
|
+
`)}
|
|
78
|
+
</div>
|
|
79
|
+
`:C}
|
|
80
|
+
</div>
|
|
81
|
+
|
|
82
|
+
<!-- Time grid body -->
|
|
83
|
+
<div class="calendar__body">
|
|
84
|
+
<!-- Gutter with hour labels -->
|
|
85
|
+
<div class="calendar__gutter">
|
|
86
|
+
${i.map(r=>r.isHour?d`<div class="calendar__hour-label"><span class="calendar__hour-full">${S(r.time,n)}</span><span class="calendar__hour-short">${B(r.time,n)}</span></div>`:d`<div class="calendar__hour-label"></div>`)}
|
|
87
|
+
</div>
|
|
88
|
+
|
|
89
|
+
<!-- Grid area -->
|
|
90
|
+
<div
|
|
91
|
+
part="grid"
|
|
92
|
+
class="calendar__grid"
|
|
93
|
+
role="grid"
|
|
94
|
+
style="--_slot-count: ${e}; --_day-count: ${c}"
|
|
95
|
+
>
|
|
96
|
+
<!-- Slot lines -->
|
|
97
|
+
${i.map((r,h)=>d`
|
|
98
|
+
<div
|
|
99
|
+
class=${H({"calendar__slot-line":!0,"calendar__slot-line--hour":r.isHour,"calendar__slot-line--half":!r.isHour})}
|
|
100
|
+
style="grid-row: ${h+1}; grid-column: 1 / -1"
|
|
101
|
+
></div>
|
|
102
|
+
`)}
|
|
103
|
+
|
|
104
|
+
<!-- Day dividers -->
|
|
105
|
+
${t.map((r,h)=>h>0?d`<div
|
|
106
|
+
class="calendar__day-divider"
|
|
107
|
+
style="left: ${h/c*100}%"
|
|
108
|
+
></div>`:C)}
|
|
109
|
+
|
|
110
|
+
<!-- Today column highlight -->
|
|
111
|
+
${l>=0?d`<div
|
|
112
|
+
class="calendar__today-col"
|
|
113
|
+
style="left: ${l/c*100}%; width: ${100/c}%"
|
|
114
|
+
></div>`:C}
|
|
115
|
+
|
|
116
|
+
<!-- Positioned events -->
|
|
117
|
+
${a.map(r=>this.renderTimeGridEvent(r,c))}
|
|
118
|
+
|
|
119
|
+
<!-- Now indicator -->
|
|
120
|
+
${s!==null&&l>=0?d`<div
|
|
121
|
+
class="calendar__now-indicator"
|
|
122
|
+
style="top: ${s}%; left: ${l/c*100}%; width: ${100/c}%"
|
|
123
|
+
></div>`:C}
|
|
124
|
+
|
|
125
|
+
<!-- Drag selection -->
|
|
126
|
+
${this.dragSelection?(()=>{let r=Math.min(this.dragSelection.startSlot,this.dragSelection.endSlot),h=Math.max(this.dragSelection.startSlot,this.dragSelection.endSlot),u=this.dragSelection.dayIndex,v=this.getSlotCount(),p=100/c;return d`<div
|
|
127
|
+
class="calendar__drag-selection"
|
|
128
|
+
style="
|
|
129
|
+
top: ${r/v*100}%;
|
|
130
|
+
height: ${(h-r+1)/v*100}%;
|
|
131
|
+
left: ${u*p}%;
|
|
132
|
+
width: ${p}%;
|
|
133
|
+
"
|
|
134
|
+
></div>`})():C}
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
|
+
`}renderTimeGridEvent(t,e){let i=this.getResolvedLocale(),n=y(t.event.start),a=y(t.event.end),o=`${S(n,i)} \u2013 ${S(a,i)}`,s=100/e,l=s/t.totalColumns,c=l*(t.colSpan??1),r=t.dayIndex*s+t.column*l,h=t.totalColumns>1?1:0;return d`
|
|
139
|
+
<div
|
|
140
|
+
class="calendar__event ${t.event.classNames?.join(" ")??""}"
|
|
141
|
+
part="event"
|
|
142
|
+
role="button"
|
|
143
|
+
tabindex="0"
|
|
144
|
+
data-event-id=${t.event.id}
|
|
145
|
+
aria-label="${t.event.title}, ${o}"
|
|
146
|
+
style=${W({position:"absolute",top:`${(t.startRow-1)/this.getSlotCount()*100}%`,height:`${(t.endRow-t.startRow)/this.getSlotCount()*100}%`,left:`calc(${r}% + ${h}px)`,width:`calc(${c}% - ${h*2}px)`,...t.event.backgroundColor?{"--_event-bg":t.event.backgroundColor}:{},...t.event.textColor?{"--_event-color":t.event.textColor}:{}})}
|
|
147
|
+
@click=${u=>this.handleEventClick(t.event,u.currentTarget,u)}
|
|
148
|
+
@keydown=${u=>this.handleEventKeydown(t.event,u.currentTarget,u)}
|
|
149
|
+
${this.editable?this.refEventDrag(t.event):C}
|
|
150
|
+
>
|
|
151
|
+
${this.eventContent?this.eventContent(t.event):d`<div class="calendar__event-title">${t.event.title}</div>
|
|
152
|
+
<div class="calendar__event-time">${o}</div>`}
|
|
153
|
+
${this.editable&&t.event.editable!==!1?d`<div class="calendar__event-resize" aria-hidden="true"></div>`:C}
|
|
154
|
+
</div>
|
|
155
|
+
`}refEventDrag(t){return queueMicrotask(()=>{let e=this.shadowRoot?.querySelector(`.calendar__event[data-event-id="${t.id}"]`);e&&this.setupEventDrag(e,t)}),C}renderMonthGrid(){let t=z(this.currentDate.getFullYear(),this.currentDate.getMonth(),this.firstDay),e=Z(this.firstDay,this.getResolvedLocale());return d`
|
|
156
|
+
<div class="calendar__month-grid">
|
|
157
|
+
${e.map(i=>d`<div class="calendar__month-weekday">${i}</div>`)}
|
|
158
|
+
${t.map(i=>i.map(n=>this.renderMonthCell(n)))}
|
|
159
|
+
</div>
|
|
160
|
+
`}renderMonthCell(t){let{visible:e,overflow:i}=et(this.events,t.date,this.dayMaxEvents),n=this.getResolvedLocale();return d`
|
|
161
|
+
<div
|
|
162
|
+
class=${H({"calendar__month-cell":!0,"calendar__month-cell--outside":!t.isCurrentMonth,"calendar__month-cell--today":t.isToday})}
|
|
163
|
+
role="gridcell"
|
|
164
|
+
aria-label=${new Intl.DateTimeFormat(n,{month:"long",day:"numeric",year:"numeric"}).format(t.date)}
|
|
165
|
+
>
|
|
166
|
+
<div class=${H({"calendar__month-date":!0,"calendar__month-date--today":t.isToday,"calendar__month-date--outside":!t.isCurrentMonth})}>${t.date.getDate()}</div>
|
|
167
|
+
${e.map(a=>d`
|
|
168
|
+
<div
|
|
169
|
+
class="calendar__month-event"
|
|
170
|
+
part="event"
|
|
171
|
+
role="button"
|
|
172
|
+
tabindex="0"
|
|
173
|
+
data-event-id=${a.event.id}
|
|
174
|
+
aria-label="${a.event.title}"
|
|
175
|
+
style=${W({...a.event.backgroundColor?{"--_event-bg":a.event.backgroundColor}:{},...a.event.textColor?{"--_event-color":a.event.textColor}:{}})}
|
|
176
|
+
@click=${o=>this.handleEventClick(a.event,o.currentTarget,o)}
|
|
177
|
+
@keydown=${o=>this.handleEventKeydown(a.event,o.currentTarget,o)}
|
|
178
|
+
>${a.event.allDay?a.event.title:`${S(y(a.event.start),n)} ${a.event.title}`}</div>
|
|
179
|
+
`)}
|
|
180
|
+
${i>0?d`<div class="calendar__month-overflow">+${i} more</div>`:C}
|
|
181
|
+
</div>
|
|
182
|
+
`}renderResourceTimeGrid(t){let e=this.getSlotCount(),i=this.getHourLabels(),n=this.getResolvedLocale(),a=this.resources;return a.length===0?d`<div class="calendar__empty">No resources defined</div>`:d`
|
|
183
|
+
<div class="calendar__scroll-container">
|
|
184
|
+
<div class="calendar__sticky-header">
|
|
185
|
+
<!-- Resource headers -->
|
|
186
|
+
<div class="calendar__header" role="row" style="--_day-count: ${a.length*t.length}">
|
|
187
|
+
<div class="calendar__gutter-header" role="presentation"></div>
|
|
188
|
+
${a.map(o=>d`
|
|
189
|
+
${t.map(s=>d`
|
|
190
|
+
<div class="calendar__resource-header" role="columnheader">
|
|
191
|
+
<div>${o.title}</div>
|
|
192
|
+
${t.length>1?d`<div style="font-size: var(--mz-font-size-2xs)">${J(s,n)}</div>`:C}
|
|
193
|
+
</div>
|
|
194
|
+
`)}
|
|
195
|
+
`)}
|
|
196
|
+
</div>
|
|
197
|
+
</div>
|
|
198
|
+
|
|
199
|
+
<div class="calendar__body">
|
|
200
|
+
<div class="calendar__gutter">
|
|
201
|
+
${i.map(o=>o.isHour?d`<div class="calendar__hour-label"><span class="calendar__hour-full">${S(o.time,n)}</span><span class="calendar__hour-short">${B(o.time,n)}</span></div>`:d`<div class="calendar__hour-label"></div>`)}
|
|
202
|
+
</div>
|
|
203
|
+
<div
|
|
204
|
+
class="calendar__grid"
|
|
205
|
+
role="grid"
|
|
206
|
+
style="--_slot-count: ${e}; --_day-count: ${a.length*t.length}"
|
|
207
|
+
>
|
|
208
|
+
<!-- Slot lines -->
|
|
209
|
+
${i.map((o,s)=>d`
|
|
210
|
+
<div
|
|
211
|
+
class=${H({"calendar__slot-line":!0,"calendar__slot-line--hour":o.isHour,"calendar__slot-line--half":!o.isHour})}
|
|
212
|
+
style="grid-row: ${s+1}; grid-column: 1 / -1"
|
|
213
|
+
></div>
|
|
214
|
+
`)}
|
|
215
|
+
|
|
216
|
+
<!-- Events per resource -->
|
|
217
|
+
${a.flatMap((o,s)=>{let l=this.events.filter(r=>r.resourceId===o.id);return K(l,t,this.slotDuration,this.slotMinTime,this.slotMaxTime).map(r=>{let h=a.length*t.length,u=s*t.length+r.dayIndex;return this.renderResourceTimeGridEvent(r,u,h)})})}
|
|
218
|
+
</div>
|
|
219
|
+
</div>
|
|
220
|
+
</div>
|
|
221
|
+
`}renderResourceTimeGridEvent(t,e,i){let n=this.getResolvedLocale(),a=y(t.event.start),o=y(t.event.end),s=`${S(a,n)} \u2013 ${S(o,n)}`,l=100/i,c=e*l;return d`
|
|
222
|
+
<div
|
|
223
|
+
class="calendar__event"
|
|
224
|
+
part="event"
|
|
225
|
+
role="button"
|
|
226
|
+
tabindex="0"
|
|
227
|
+
data-event-id=${t.event.id}
|
|
228
|
+
aria-label="${t.event.title}, ${s}"
|
|
229
|
+
style=${W({position:"absolute",top:`calc(${(t.startRow-1)/this.getSlotCount()*100}%)`,height:`calc(${(t.endRow-t.startRow)/this.getSlotCount()*100}%)`,left:`${c}%`,width:`${l}%`,...t.event.backgroundColor?{"--_event-bg":t.event.backgroundColor}:{},...t.event.textColor?{"--_event-color":t.event.textColor}:{}})}
|
|
230
|
+
@click=${r=>this.handleEventClick(t.event,r.currentTarget,r)}
|
|
231
|
+
@keydown=${r=>this.handleEventKeydown(t.event,r.currentTarget,r)}
|
|
232
|
+
>
|
|
233
|
+
${this.eventContent?this.eventContent(t.event):d`<div class="calendar__event-title">${t.event.title}</div>
|
|
234
|
+
<div class="calendar__event-time">${s}</div>`}
|
|
235
|
+
</div>
|
|
236
|
+
`}renderResourceTimeline(){let t=this.getSlotCount(),e=this.getHourLabels(),i=this.getResolvedLocale(),n=this.resources;return n.length===0?d`<div class="calendar__empty">No resources defined</div>`:d`
|
|
237
|
+
<!-- Time axis header -->
|
|
238
|
+
<div class="calendar__header" role="row" style="--_day-count: ${t}">
|
|
239
|
+
<div class="calendar__gutter-header" role="presentation" style="min-width: 8rem"></div>
|
|
240
|
+
${e.map(a=>d`
|
|
241
|
+
<div class="calendar__day-header" role="columnheader" style="font-size: var(--mz-font-size-2xs)">
|
|
242
|
+
${a.isHour?S(a.time,i):""}
|
|
243
|
+
</div>
|
|
244
|
+
`)}
|
|
245
|
+
</div>
|
|
246
|
+
|
|
247
|
+
<!-- Resource rows -->
|
|
248
|
+
${n.map(a=>{let o=this.events.filter(s=>s.resourceId===a.id);return d`
|
|
249
|
+
<div style="display: grid; grid-template-columns: 8rem 1fr">
|
|
250
|
+
<div class="calendar__timeline-resource-label">${a.title}</div>
|
|
251
|
+
<div class="calendar__timeline-row" style="--_slot-count: ${t}">
|
|
252
|
+
${e.map((s,l)=>d`
|
|
253
|
+
<div
|
|
254
|
+
class=${H({"calendar__timeline-slot":!0,"calendar__timeline-slot--hour":s.isHour,"calendar__timeline-slot--half":!s.isHour})}
|
|
255
|
+
style="grid-column: ${l+1}"
|
|
256
|
+
></div>
|
|
257
|
+
`)}
|
|
258
|
+
${o.map(s=>{if(s.allDay)return C;let l=y(s.start),c=y(s.end),{hours:r,minutes:h}=x(this.slotMinTime),u=b(r,h),v=Math.max(X(l)-u,0),p=X(c)-u,T=I(v,this.slotDuration),D=I(p,this.slotDuration);return d`
|
|
259
|
+
<div
|
|
260
|
+
class="calendar__allday-event"
|
|
261
|
+
part="event"
|
|
262
|
+
role="button"
|
|
263
|
+
tabindex="0"
|
|
264
|
+
data-event-id=${s.id}
|
|
265
|
+
aria-label="${s.title}"
|
|
266
|
+
style=${W({position:"absolute",left:`${(T-1)/t*100}%`,width:`${(D-T)/t*100}%`,top:"2px",bottom:"2px",...s.backgroundColor?{"--_event-bg":s.backgroundColor}:{},...s.textColor?{"--_event-color":s.textColor}:{}})}
|
|
267
|
+
@click=${$=>this.handleEventClick(s,$.currentTarget,$)}
|
|
268
|
+
@keydown=${$=>this.handleEventKeydown(s,$.currentTarget,$)}
|
|
269
|
+
>${s.title}</div>
|
|
270
|
+
`})}
|
|
271
|
+
</div>
|
|
272
|
+
</div>
|
|
273
|
+
`})}
|
|
274
|
+
`}renderListView(){let t=this.getVisibleDays(),e=this.getResolvedLocale(),i=t.map(n=>{let a=M(n),o=M(E(n,1)),s=this.events.filter(l=>{let c=y(l.start),r=y(l.end);return c<o&&r>a}).sort((l,c)=>l.allDay&&!c.allDay?-1:!l.allDay&&c.allDay?1:y(l.start).getTime()-y(c.start).getTime());return{day:n,events:s}}).filter(n=>n.events.length>0);return i.length===0?d`<div class="calendar__empty">No events this week</div>`:d`
|
|
275
|
+
<div class="calendar__list">
|
|
276
|
+
${i.map(({day:n,events:a})=>d`
|
|
277
|
+
<div class="calendar__list-day">
|
|
278
|
+
<div class="calendar__list-day-header">
|
|
279
|
+
<span>${new Intl.DateTimeFormat(e,{weekday:"long"}).format(n)}</span>
|
|
280
|
+
<span>${new Intl.DateTimeFormat(e,{month:"short",day:"numeric",year:"numeric"}).format(n)}</span>
|
|
281
|
+
</div>
|
|
282
|
+
${a.map(o=>d`
|
|
283
|
+
<div
|
|
284
|
+
class="calendar__list-event"
|
|
285
|
+
part="event"
|
|
286
|
+
role="button"
|
|
287
|
+
tabindex="0"
|
|
288
|
+
data-event-id=${o.id}
|
|
289
|
+
aria-label="${o.title}"
|
|
290
|
+
@click=${s=>this.handleEventClick(o,s.currentTarget,s)}
|
|
291
|
+
@keydown=${s=>this.handleEventKeydown(o,s.currentTarget,s)}
|
|
292
|
+
>
|
|
293
|
+
<div
|
|
294
|
+
class="calendar__list-event-dot"
|
|
295
|
+
style=${o.backgroundColor?`--_event-bg: ${o.backgroundColor}`:""}
|
|
296
|
+
></div>
|
|
297
|
+
<div class="calendar__list-event-time">
|
|
298
|
+
${o.allDay?"all-day":`${S(y(o.start),e)} \u2013 ${S(y(o.end),e)}`}
|
|
299
|
+
</div>
|
|
300
|
+
<div class="calendar__list-event-title">${o.title}</div>
|
|
301
|
+
</div>
|
|
302
|
+
`)}
|
|
303
|
+
</div>
|
|
304
|
+
`)}
|
|
305
|
+
</div>
|
|
306
|
+
`}};m.styles=A,g([_({reflect:!0})],m.prototype,"view",2),g([_({attribute:"date"})],m.prototype,"date",2),g([_({type:Array})],m.prototype,"events",2),g([_({type:Array})],m.prototype,"resources",2),g([_({type:Number,attribute:"slot-duration"})],m.prototype,"slotDuration",2),g([_({attribute:"slot-min-time"})],m.prototype,"slotMinTime",2),g([_({attribute:"slot-max-time"})],m.prototype,"slotMaxTime",2),g([_({type:Boolean,attribute:"all-day-slot"})],m.prototype,"allDaySlot",2),g([_({type:Boolean})],m.prototype,"selectable",2),g([_({type:Boolean})],m.prototype,"editable",2),g([_({type:Boolean,attribute:"now-indicator"})],m.prototype,"nowIndicator",2),g([_({type:Number,attribute:"first-day"})],m.prototype,"firstDay",2),g([_()],m.prototype,"locale",2),g([_({type:Number})],m.prototype,"duration",2),g([_({type:Number,attribute:"day-max-events"})],m.prototype,"dayMaxEvents",2),g([_({type:Boolean,attribute:"no-scroll",reflect:!0})],m.prototype,"noScroll",2),g([_({attribute:!1})],m.prototype,"eventContent",2),g([F()],m.prototype,"currentDate",2),g([F()],m.prototype,"nowMinutes",2),g([F()],m.prototype,"dragSelection",2),g([F()],m.prototype,"_containerWidth",2),g([q("date")],m.prototype,"handleDateChange",1),g([q("view")],m.prototype,"handleViewChange",1),g([q("nowIndicator")],m.prototype,"handleNowIndicatorChange",1);function y(L){return L instanceof Date?L:new Date(L)}function X(L){return b(L.getHours(),L.getMinutes())}export{m as a};
|
|
307
|
+
//# sourceMappingURL=chunk.PJFNXC5P.js.map
|