ngwr 11.0.0 → 11.2.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/action-sheet/styles/_index.scss +4 -1
- package/anchor/styles/_index.scss +2 -1
- package/calendar/styles/_index.scss +11 -2
- package/cascader/styles/_index.scss +3 -1
- package/circular-text/styles/_index.scss +11 -0
- package/command-palette/styles/_index.scss +14 -1
- package/context-menu/styles/_index.scss +2 -1
- package/falling-text/styles/_index.scss +2 -1
- package/fesm2022/ngwr-action-sheet-testing.mjs +313 -0
- package/fesm2022/ngwr-action-sheet-testing.mjs.map +1 -0
- package/fesm2022/ngwr-bar-chart-testing.mjs +89 -0
- package/fesm2022/ngwr-bar-chart-testing.mjs.map +1 -0
- package/fesm2022/ngwr-blur-text-testing.mjs +203 -0
- package/fesm2022/ngwr-blur-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-blur-text.mjs +15 -1
- package/fesm2022/ngwr-blur-text.mjs.map +1 -1
- package/fesm2022/ngwr-border-glow-testing.mjs +325 -0
- package/fesm2022/ngwr-border-glow-testing.mjs.map +1 -0
- package/fesm2022/ngwr-border-glow.mjs +2 -2
- package/fesm2022/ngwr-breadcrumbs.mjs +2 -2
- package/fesm2022/ngwr-calendar-heatmap-testing.mjs +95 -0
- package/fesm2022/ngwr-calendar-heatmap-testing.mjs.map +1 -0
- package/fesm2022/ngwr-calendar-testing.mjs +368 -0
- package/fesm2022/ngwr-calendar-testing.mjs.map +1 -0
- package/fesm2022/ngwr-calendar.mjs +43 -3
- package/fesm2022/ngwr-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-card.mjs +2 -2
- package/fesm2022/ngwr-cascader.mjs +14 -2
- package/fesm2022/ngwr-cascader.mjs.map +1 -1
- package/fesm2022/ngwr-checkbox.mjs +8 -0
- package/fesm2022/ngwr-checkbox.mjs.map +1 -1
- package/fesm2022/ngwr-circular-text-testing.mjs +230 -0
- package/fesm2022/ngwr-circular-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-circular-text.mjs +2 -2
- package/fesm2022/ngwr-circular-text.mjs.map +1 -1
- package/fesm2022/ngwr-color-picker-testing.mjs +432 -0
- package/fesm2022/ngwr-color-picker-testing.mjs.map +1 -0
- package/fesm2022/ngwr-color-picker.mjs +29 -3
- package/fesm2022/ngwr-color-picker.mjs.map +1 -1
- package/fesm2022/ngwr-context-menu.mjs +25 -5
- package/fesm2022/ngwr-context-menu.mjs.map +1 -1
- package/fesm2022/ngwr-date-picker-testing.mjs +10 -79
- package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -1
- package/fesm2022/ngwr-decrypt-text-testing.mjs +261 -0
- package/fesm2022/ngwr-decrypt-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-decrypt-text.mjs +6 -1
- package/fesm2022/ngwr-decrypt-text.mjs.map +1 -1
- package/fesm2022/ngwr-donut-chart-testing.mjs +93 -0
- package/fesm2022/ngwr-donut-chart-testing.mjs.map +1 -0
- package/fesm2022/ngwr-drag-drop.mjs +2 -2
- package/fesm2022/ngwr-drawer.mjs +36 -7
- package/fesm2022/ngwr-drawer.mjs.map +1 -1
- package/fesm2022/ngwr-dropdown.mjs +32 -2
- package/fesm2022/ngwr-dropdown.mjs.map +1 -1
- package/fesm2022/ngwr-event-calendar-testing.mjs +446 -0
- package/fesm2022/ngwr-event-calendar-testing.mjs.map +1 -0
- package/fesm2022/ngwr-event-calendar.mjs +43 -18
- package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-falling-text-testing.mjs +218 -0
- package/fesm2022/ngwr-falling-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-falling-text.mjs +2 -2
- package/fesm2022/ngwr-falling-text.mjs.map +1 -1
- package/fesm2022/ngwr-fuzzy-text-testing.mjs +134 -0
- package/fesm2022/ngwr-fuzzy-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-gauge-testing.mjs +86 -0
- package/fesm2022/ngwr-gauge-testing.mjs.map +1 -0
- package/fesm2022/ngwr-glitch-text-testing.mjs +181 -0
- package/fesm2022/ngwr-glitch-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-glitch-text.mjs +2 -2
- package/fesm2022/ngwr-gradient-text-testing.mjs +223 -0
- package/fesm2022/ngwr-gradient-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-gradient-text.mjs +2 -2
- package/fesm2022/ngwr-i18n-en.mjs +14 -0
- package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ru.mjs +14 -0
- package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
- package/fesm2022/ngwr-image-cropper-testing.mjs +156 -0
- package/fesm2022/ngwr-image-cropper-testing.mjs.map +1 -0
- package/fesm2022/ngwr-image-cropper.mjs +10 -3
- package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
- package/fesm2022/ngwr-input-number.mjs +73 -6
- package/fesm2022/ngwr-input-number.mjs.map +1 -1
- package/fesm2022/ngwr-knob-testing.mjs +220 -0
- package/fesm2022/ngwr-knob-testing.mjs.map +1 -0
- package/fesm2022/ngwr-lightbox-testing.mjs +223 -0
- package/fesm2022/ngwr-lightbox-testing.mjs.map +1 -0
- package/fesm2022/ngwr-lightbox.mjs +9 -2
- package/fesm2022/ngwr-lightbox.mjs.map +1 -1
- package/fesm2022/ngwr-line-chart-testing.mjs +119 -0
- package/fesm2022/ngwr-line-chart-testing.mjs.map +1 -0
- package/fesm2022/ngwr-list.mjs +2 -2
- package/fesm2022/ngwr-loading-bar.mjs +2 -2
- package/fesm2022/ngwr-marquee-testing.mjs +336 -0
- package/fesm2022/ngwr-marquee-testing.mjs.map +1 -0
- package/fesm2022/ngwr-marquee.mjs +2 -2
- package/fesm2022/ngwr-meter-group-testing.mjs +80 -0
- package/fesm2022/ngwr-meter-group-testing.mjs.map +1 -0
- package/fesm2022/ngwr-overlay.mjs +28 -1
- package/fesm2022/ngwr-overlay.mjs.map +1 -1
- package/fesm2022/ngwr-popover.mjs +14 -0
- package/fesm2022/ngwr-popover.mjs.map +1 -1
- package/fesm2022/ngwr-rotating-text-testing.mjs +220 -0
- package/fesm2022/ngwr-rotating-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-rotating-text.mjs +2 -2
- package/fesm2022/ngwr-rotating-text.mjs.map +1 -1
- package/fesm2022/ngwr-select.mjs +70 -11
- package/fesm2022/ngwr-select.mjs.map +1 -1
- package/fesm2022/ngwr-shiny-text-testing.mjs +237 -0
- package/fesm2022/ngwr-shiny-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-shiny-text.mjs +2 -2
- package/fesm2022/ngwr-slider.mjs +44 -6
- package/fesm2022/ngwr-slider.mjs.map +1 -1
- package/fesm2022/ngwr-sparkline-testing.mjs +76 -0
- package/fesm2022/ngwr-sparkline-testing.mjs.map +1 -0
- package/fesm2022/ngwr-speed-dial-testing.mjs +279 -0
- package/fesm2022/ngwr-speed-dial-testing.mjs.map +1 -0
- package/fesm2022/ngwr-splash-cursor-testing.mjs +89 -0
- package/fesm2022/ngwr-splash-cursor-testing.mjs.map +1 -0
- package/fesm2022/ngwr-split-text-testing.mjs +224 -0
- package/fesm2022/ngwr-split-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-split-text.mjs +15 -1
- package/fesm2022/ngwr-split-text.mjs.map +1 -1
- package/fesm2022/ngwr-splitter-testing.mjs +245 -0
- package/fesm2022/ngwr-splitter-testing.mjs.map +1 -0
- package/fesm2022/ngwr-spotlight-card-testing.mjs +368 -0
- package/fesm2022/ngwr-spotlight-card-testing.mjs.map +1 -0
- package/fesm2022/ngwr-spotlight-card.mjs +2 -2
- package/fesm2022/ngwr-star-border-testing.mjs +172 -0
- package/fesm2022/ngwr-star-border-testing.mjs.map +1 -0
- package/fesm2022/ngwr-star-border.mjs +2 -2
- package/fesm2022/ngwr-table.mjs +13 -3
- package/fesm2022/ngwr-table.mjs.map +1 -1
- package/fesm2022/ngwr-tabs.mjs +15 -1
- package/fesm2022/ngwr-tabs.mjs.map +1 -1
- package/fesm2022/ngwr-tilt-card-testing.mjs +190 -0
- package/fesm2022/ngwr-tilt-card-testing.mjs.map +1 -0
- package/fesm2022/ngwr-tilt-card.mjs +21 -3
- package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
- package/fesm2022/ngwr-toast.mjs +36 -7
- package/fesm2022/ngwr-toast.mjs.map +1 -1
- package/fesm2022/ngwr-tour-testing.mjs +173 -0
- package/fesm2022/ngwr-tour-testing.mjs.map +1 -0
- package/fesm2022/ngwr-tour.mjs +2 -2
- package/fesm2022/ngwr-tour.mjs.map +1 -1
- package/fesm2022/ngwr-tree.mjs +10 -3
- package/fesm2022/ngwr-tree.mjs.map +1 -1
- package/fesm2022/ngwr-typewriter-testing.mjs +228 -0
- package/fesm2022/ngwr-typewriter-testing.mjs.map +1 -0
- package/fesm2022/ngwr-typewriter.mjs +2 -2
- package/fesm2022/ngwr-version.mjs +1 -1
- package/fesm2022/ngwr-version.mjs.map +1 -1
- package/fesm2022/ngwr-virtual-scroll.mjs +2 -2
- package/fesm2022/ngwr-waves-testing.mjs +128 -0
- package/fesm2022/ngwr-waves-testing.mjs.map +1 -0
- package/fesm2022/ngwr-waves.mjs +2 -2
- package/fesm2022/ngwr-window-testing.mjs +361 -0
- package/fesm2022/ngwr-window-testing.mjs.map +1 -0
- package/fesm2022/ngwr-window.mjs +84 -10
- package/fesm2022/ngwr-window.mjs.map +1 -1
- package/file-upload/styles/_index.scss +7 -2
- package/i18n/en.json +16 -2
- package/i18n/ru.json +16 -2
- package/llms-full.txt +147 -0
- package/llms.txt +27 -8
- package/mcp/providers.js +29 -0
- package/mcp/tools.js +1 -29
- package/package.json +145 -1
- package/result/styles/_index.scss +3 -1
- package/segmented/styles/_index.scss +5 -1
- package/select/styles/_index.scss +3 -1
- package/skills/ngwr/SKILL.md +115 -0
- package/skills/ngwr/references/catalog.md +212 -0
- package/skills/ngwr/references/setup.md +73 -0
- package/stepper/styles/_index.scss +18 -2
- package/table/styles/_index.scss +3 -1
- package/theme/styles/_colors.scss +15 -2
- package/theme/styles/_dark.scss +24 -12
- package/tree/styles/_index.scss +4 -2
- package/types/ngwr-action-sheet-testing.d.ts +260 -0
- package/types/ngwr-bar-chart-testing.d.ts +77 -0
- package/types/ngwr-blur-text-testing.d.ts +180 -0
- package/types/ngwr-blur-text.d.ts +12 -0
- package/types/ngwr-border-glow-testing.d.ts +219 -0
- package/types/ngwr-calendar-heatmap-testing.d.ts +79 -0
- package/types/ngwr-calendar-testing.d.ts +277 -0
- package/types/ngwr-calendar.d.ts +10 -0
- package/types/ngwr-checkbox.d.ts +13 -0
- package/types/ngwr-circular-text-testing.d.ts +196 -0
- package/types/ngwr-color-picker-testing.d.ts +291 -0
- package/types/ngwr-color-picker.d.ts +13 -1
- package/types/ngwr-context-menu.d.ts +15 -1
- package/types/ngwr-date-picker-testing.d.ts +6 -66
- package/types/ngwr-decrypt-text-testing.d.ts +222 -0
- package/types/ngwr-donut-chart-testing.d.ts +79 -0
- package/types/ngwr-drawer.d.ts +12 -0
- package/types/ngwr-dropdown.d.ts +9 -0
- package/types/ngwr-event-calendar-testing.d.ts +301 -0
- package/types/ngwr-event-calendar.d.ts +9 -6
- package/types/ngwr-falling-text-testing.d.ts +186 -0
- package/types/ngwr-fuzzy-text-testing.d.ts +130 -0
- package/types/ngwr-gauge-testing.d.ts +71 -0
- package/types/ngwr-glitch-text-testing.d.ts +172 -0
- package/types/ngwr-gradient-text-testing.d.ts +173 -0
- package/types/ngwr-image-cropper-testing.d.ts +134 -0
- package/types/ngwr-image-cropper.d.ts +1 -0
- package/types/ngwr-input-number.d.ts +33 -1
- package/types/ngwr-knob-testing.d.ts +150 -0
- package/types/ngwr-lightbox-testing.d.ts +154 -0
- package/types/ngwr-lightbox.d.ts +6 -0
- package/types/ngwr-line-chart-testing.d.ts +93 -0
- package/types/ngwr-marquee-testing.d.ts +280 -0
- package/types/ngwr-meter-group-testing.d.ts +67 -0
- package/types/ngwr-overlay.d.ts +19 -1
- package/types/ngwr-rotating-text-testing.d.ts +191 -0
- package/types/ngwr-select.d.ts +32 -0
- package/types/ngwr-shiny-text-testing.d.ts +165 -0
- package/types/ngwr-slider.d.ts +15 -0
- package/types/ngwr-sparkline-testing.d.ts +69 -0
- package/types/ngwr-speed-dial-testing.d.ts +195 -0
- package/types/ngwr-splash-cursor-testing.d.ts +95 -0
- package/types/ngwr-split-text-testing.d.ts +209 -0
- package/types/ngwr-split-text.d.ts +12 -0
- package/types/ngwr-splitter-testing.d.ts +174 -0
- package/types/ngwr-spotlight-card-testing.d.ts +303 -0
- package/types/ngwr-star-border-testing.d.ts +135 -0
- package/types/ngwr-table.d.ts +10 -1
- package/types/ngwr-tilt-card-testing.d.ts +158 -0
- package/types/ngwr-tilt-card.d.ts +2 -0
- package/types/ngwr-toast.d.ts +14 -5
- package/types/ngwr-tour-testing.d.ts +143 -0
- package/types/ngwr-tree.d.ts +7 -0
- package/types/ngwr-typewriter-testing.d.ts +201 -0
- package/types/ngwr-version.d.ts +1 -1
- package/types/ngwr-waves-testing.d.ts +121 -0
- package/types/ngwr-window-testing.d.ts +263 -0
- package/types/ngwr-window.d.ts +27 -10
- package/window/styles/_index.scss +44 -16
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngwr-event-calendar.mjs","sources":["../../../projects/lib/event-calendar/event-calendar-event-template.ts","../../../projects/lib/event-calendar/event-calendar.ts","../../../projects/lib/event-calendar/event-calendar.html","../../../projects/lib/event-calendar/ngwr-event-calendar.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Directive, TemplateRef, inject } from '@angular/core';\n\nimport type { WrCalendarEventContext } from './interfaces';\n\n/**\n * Replace the chip's contents. The event is the implicit context; the chip\n * itself — its button, its position and its drag handling — stays with the\n * calendar, so a custom template cannot break the geometry.\n *\n * @example\n * ```html\n * <wr-event-calendar [events]=\"events\">\n * <ng-template wrCalendarEvent let-event>\n * <strong>{{ event.title }}</strong> — {{ event.data.room }}\n * </ng-template>\n * </wr-event-calendar>\n * ```\n */\n@Directive({\n selector: 'ng-template[wrCalendarEvent]',\n})\nexport class WrCalendarEventTemplate {\n readonly template = inject<TemplateRef<WrCalendarEventContext>>(TemplateRef);\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { TemplateRef } from '@angular/core';\nimport {\n Component,\n DOCUMENT,\n ViewEncapsulation,\n computed,\n contentChild,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\n\nimport { WrButton, WrButtonGroup } from 'ngwr/button';\nimport { WrDateAdapter } from 'ngwr/date-adapter';\nimport { readI18nText, useI18nFormatter, useI18nText } from 'ngwr/i18n';\nimport { numAttr } from 'ngwr/utils';\n\nimport { WrCalendarEventTemplate } from './event-calendar-event-template';\nimport type {\n WrCalendarEvent,\n WrCalendarEventChange,\n WrCalendarEventContext,\n WrCalendarSlot,\n WrCalendarView,\n} from './interfaces';\n\nconst MINUTES_PER_DAY = 24 * 60;\nconst DAYS_PER_WEEK = 7;\nconst MONTH_ROWS = 6;\n\n/**\n * A chip that spans whole days — every month-view event, and the all-day band\n * of the time views. It lives in the cell where its segment STARTS and reaches\n * right with a `calc()` width, so it stays inside one `role=\"gridcell\"` however\n * far it spans.\n */\ninterface BandChip {\n readonly key: string;\n readonly event: WrCalendarEvent;\n /** Index of the day it starts on, within the row it was laid out against. */\n readonly column: number;\n readonly span: number;\n readonly lane: number;\n readonly continuesBefore: boolean;\n readonly continuesAfter: boolean;\n}\n\n/**\n * A chip positioned against the time grid. Same rule — it belongs to the cell\n * holding its start — but sized in percentages OF THAT CELL, which works only\n * because every slot row is the same height.\n */\ninterface TimeChip {\n readonly key: string;\n readonly event: WrCalendarEvent;\n /** Offset into the start cell, 0–100. */\n readonly top: number;\n /** Height as a multiple of the cell, ×100. */\n readonly height: number;\n /** Horizontal share of the column, both 0–100. */\n readonly left: number;\n readonly width: number;\n readonly continuesBefore: boolean;\n readonly continuesAfter: boolean;\n}\n\ninterface DayCell {\n readonly date: Date;\n readonly key: string;\n readonly day: string;\n readonly label: string;\n readonly inMonth: boolean;\n readonly isToday: boolean;\n readonly bands: readonly BandChip[];\n readonly hidden: number;\n}\n\ninterface MonthWeek {\n readonly key: string;\n readonly days: readonly DayCell[];\n}\n\ninterface TimeCell {\n readonly key: string;\n readonly date: Date;\n readonly label: string;\n readonly chips: readonly TimeChip[];\n}\n\ninterface TimeRow {\n readonly key: string;\n readonly label: string;\n /** Minutes from midnight — also what the drag target reads off the cell. */\n readonly minutes: number;\n readonly major: boolean;\n readonly cells: readonly TimeCell[];\n}\n\ninterface ColumnHeader {\n readonly key: string;\n readonly date: Date;\n readonly weekday: string;\n readonly day: string;\n readonly label: string;\n readonly isToday: boolean;\n}\n\n/** Live drag state. `null` whenever the pointer is not down on a chip. */\ninterface DragState {\n readonly event: WrCalendarEvent;\n readonly kind: 'move' | 'resize';\n readonly originDate: Date;\n readonly originMinutes: number;\n readonly pointerId: number;\n}\n\n/**\n * Month / week / day event calendar with drag to move and resize.\n *\n * `events` is an INPUT, never mutated: a drag emits `eventChange` describing\n * where the event would land and stops there. Apply it to your own state and\n * the calendar re-renders — so an unhandled output is a cancelled drag, an\n * optimistic update is one `set`, and a rejected server write needs no rollback\n * path inside the component.\n *\n * Every chip lives inside the `role=\"gridcell\"` where it starts and reaches out\n * with `calc()` widths or percentage heights. That is what keeps the ARIA grid\n * valid — an events layer floating over the grid would leave rows owning\n * something other than cells — and it means no pixel measurement anywhere.\n *\n * **Keyboard.** The grid is one tab stop with a roving cursor: arrows move by\n * day (left / right) and by week or slot (up / down), `Home` / `End` jump to\n * the ends of the row, `Enter` on an empty cell emits `slotClick`, and `Enter`\n * on a cell holding events focuses the first chip (`Escape` returns). On a\n * focused chip, `Alt` + arrows move the event — the keyboard equivalent of the\n * drag, emitting the same `eventChange`.\n *\n * Date math and formatting go through {@link WrDateAdapter}; register one with\n * `provideWrDateAdapter(...)` at bootstrap.\n *\n * @example\n * ```html\n * <wr-event-calendar\n * editable\n * [events]=\"events()\"\n * [(view)]=\"view\"\n * [(date)]=\"anchor\"\n * (eventChange)=\"apply($event)\"\n * (slotClick)=\"compose($event)\"\n * />\n * ```\n *\n * @see https://ngwr.dev/reference/components/event-calendar\n */\n@Component({\n selector: 'wr-event-calendar',\n templateUrl: './event-calendar.html',\n encapsulation: ViewEncapsulation.None,\n host: {\n '[class]': 'classes()',\n // A drag has to end wherever the pointer is released, including outside the\n // chip it started on — so the host owns the release, not the chip.\n '(pointerup)': 'onPointerUp($event)',\n '(pointercancel)': 'drag.set(null)',\n },\n imports: [NgTemplateOutlet, WrButton, WrButtonGroup],\n})\nexport class WrEventCalendar {\n /** Everything to render. Never mutated — see `eventChange`. */\n readonly events = input<readonly WrCalendarEvent[]>([]);\n\n /** Which span is shown. Two-way bindable. @default 'month' */\n readonly view = model<WrCalendarView>('month');\n\n /** Any date inside the shown span. Two-way bindable. */\n readonly date = model<Date>(new Date());\n\n /** Which buttons the view switcher offers. Empty hides it. */\n readonly views = input<readonly WrCalendarView[]>(['month', 'week', 'day']);\n\n /** Allow dragging chips to move and resize them. @default false */\n readonly editable = input(false, { transform: coerceBooleanProperty });\n\n /** Minutes per row in the time views — also the drag snap. @default 30 */\n readonly slotMinutes = input(30, { transform: numAttr(30) });\n\n /** First hour the time views show. @default 0 */\n readonly dayStartHour = input(0, { transform: numAttr(0) });\n\n /** First hour they do NOT show, exclusive. @default 24 */\n readonly dayEndHour = input(24, { transform: numAttr(24) });\n\n /** Lanes a month cell shows before collapsing the rest into “+N more”. @default 3 */\n readonly maxLanes = input(3, { transform: numAttr(3) });\n\n /** Hide the built-in header — supply your own navigation instead. @default false */\n readonly hideHeader = input(false, { transform: coerceBooleanProperty });\n\n /** A chip was activated. */\n readonly eventClick = output<WrCalendarEvent>();\n\n /** Empty space was activated — the slot the user pointed at. */\n readonly slotClick = output<WrCalendarSlot>();\n\n /** A drag or an `Alt` + arrow finished. Apply it yourself; nothing moves until you do. */\n readonly eventChange = output<WrCalendarEventChange>();\n\n private readonly adapter = inject<WrDateAdapter<Date>>(WrDateAdapter);\n private readonly document = inject(DOCUMENT);\n private readonly dir = inject(Directionality, { optional: true });\n private readonly chipTpl = contentChild(WrCalendarEventTemplate);\n\n protected readonly todayLabel = readI18nText('eventCalendar.today', 'Today');\n protected readonly previousLabel = readI18nText('eventCalendar.previous', 'Previous');\n protected readonly nextLabel = readI18nText('eventCalendar.next', 'Next');\n protected readonly allDayLabel = readI18nText('eventCalendar.allDay', 'All day');\n protected readonly timeLabel = readI18nText('eventCalendar.time', 'Time');\n protected readonly moreLabel = useI18nFormatter('eventCalendar.more', '+{{count}} more');\n protected readonly viewLabels: Record<WrCalendarView, string> = {\n month: readI18nText('eventCalendar.month', 'Month'),\n week: readI18nText('eventCalendar.week', 'Week'),\n day: readI18nText('eventCalendar.day', 'Day'),\n };\n\n /** Accessible name of the grid; overridable for a page with several. */\n readonly ariaLabel = input<string | null>(null);\n protected readonly resolvedAriaLabel = useI18nText(this.ariaLabel, 'eventCalendar.label', 'Calendar');\n\n /**\n * `[day, minutes]` of the roving cursor — `minutes === -1` means a month cell\n * or the all-day band. Raw, so it survives a view switch; read\n * {@link cursorCell}, which clamps it to what the current view actually has.\n */\n private readonly cursor = signal<readonly [number, number]>([0, -1]);\n\n /**\n * The cursor as the current view can honour it. Exactly one cell may carry\n * `tabindex=\"0\"`, so a stale coordinate — the 09:30 row after switching to\n * month, day 34 after switching to week — must fall back to a real cell\n * rather than leave the grid with no tab stop at all.\n */\n protected readonly cursorCell = computed<readonly [number, number]>(() => {\n const [day, minutes] = this.cursor();\n const columns = Math.max(1, this.days().length);\n const clamped = Math.min(columns - 1, Math.max(0, day));\n\n if (this.view() === 'month') return [clamped, -1];\n if (minutes === -1 && this.hasAllDay()) return [clamped, -1];\n\n const rows = this.rows();\n const known = rows.some(row => row.minutes === minutes);\n return [clamped, known ? minutes : (rows[0]?.minutes ?? 0)];\n });\n\n /** Non-null only while a pointer is down on a chip. @internal */\n protected readonly drag = signal<DragState | null>(null);\n\n protected readonly dragging = computed(() => this.drag()?.event.id ?? null);\n\n protected readonly chipTemplate = computed<TemplateRef<WrCalendarEventContext> | null>(\n () => this.chipTpl()?.template ?? null\n );\n\n protected readonly classes = computed(() => {\n const parts = ['wr-event-calendar', `wr-event-calendar--${this.view()}`];\n if (this.editable()) parts.push('wr-event-calendar--editable');\n if (this.drag()) parts.push('wr-event-calendar--dragging');\n return parts.join(' ');\n });\n\n // ---------------------------------------------------------------- ranges\n\n /** Inclusive-exclusive window the current view covers. */\n private readonly range = computed<readonly [Date, Date]>(() => {\n const anchor = this.startOfDay(this.date());\n switch (this.view()) {\n case 'day':\n return [anchor, this.adapter.addDays(anchor, 1)];\n case 'week': {\n const start = this.startOfWeek(anchor);\n return [start, this.adapter.addDays(start, DAYS_PER_WEEK)];\n }\n default: {\n const first = this.adapter.createDate(this.adapter.getYear(anchor), this.adapter.getMonth(anchor), 1);\n const start = this.startOfWeek(first);\n return [start, this.adapter.addDays(start, MONTH_ROWS * DAYS_PER_WEEK)];\n }\n }\n });\n\n /** Every day the view shows, left to right. */\n private readonly days = computed<readonly Date[]>(() => {\n const [start, end] = this.range();\n const count = Math.round((end.getTime() - start.getTime()) / (MINUTES_PER_DAY * 60_000));\n return Array.from({ length: count }, (_, i) => this.adapter.addDays(start, i));\n });\n\n /** Only what overlaps the window — everything downstream works off this. */\n private readonly visible = computed<readonly WrCalendarEvent[]>(() => {\n const [start, end] = this.range();\n return [...this.events()]\n .filter(e => e.end.getTime() > start.getTime() && e.start.getTime() < end.getTime())\n .sort((a, b) => {\n const byStart = a.start.getTime() - b.start.getTime();\n // Ties go to the longer event, so a week-long band claims its lane\n // before the one-day events sitting alongside it.\n return byStart !== 0 ? byStart : b.end.getTime() - a.end.getTime();\n });\n });\n\n protected readonly title = computed(() => {\n const anchor = this.date();\n const months = this.adapter.getMonthNames('long');\n switch (this.view()) {\n case 'day':\n return this.adapter.format(anchor, 'longDate');\n case 'week': {\n const [start] = this.range();\n const last = this.adapter.addDays(start, DAYS_PER_WEEK - 1);\n return `${this.adapter.format(start, 'mediumDate')} – ${this.adapter.format(last, 'mediumDate')}`;\n }\n default:\n return `${months[this.adapter.getMonth(anchor)]} ${this.adapter.getYear(anchor)}`;\n }\n });\n\n /**\n * The adapter contract is \"names ordered from `getFirstDayOfWeek()` onwards\",\n * so the list is ALREADY rotated. Rotating it again here put every column one\n * day out for every locale whose week does not start on Sunday — invisible in\n * en-US, wrong everywhere else. `wr-calendar` consumes the same call directly.\n */\n protected readonly weekdayNames = computed(() => this.adapter.getDayOfWeekNames('short'));\n\n protected readonly switcher = computed(() => this.views().map(view => ({ view, label: this.viewLabels[view] })));\n\n // ----------------------------------------------------------- month model\n\n protected readonly weeks = computed<readonly MonthWeek[]>(() => {\n const days = this.days();\n const events = this.visible();\n const weeks: MonthWeek[] = [];\n const month = this.adapter.getMonth(this.date());\n\n for (let w = 0; w * DAYS_PER_WEEK < days.length; w++) {\n const row = days.slice(w * DAYS_PER_WEEK, (w + 1) * DAYS_PER_WEEK);\n const { chips, hidden } = this.bandLayout(events, row, this.maxLanes());\n\n weeks.push({\n key: this.iso(row[0]),\n days: row.map((date, col) => ({\n date,\n key: this.iso(date),\n day: String(this.adapter.getDate(date)),\n label: this.adapter.format(date, 'longDate'),\n inMonth: this.adapter.getMonth(date) === month,\n isToday: this.adapter.isSameDay(date, this.adapter.today()),\n bands: chips.filter(chip => chip.column === col),\n hidden: hidden[col],\n })),\n });\n }\n\n return weeks;\n });\n\n // ------------------------------------------------------------ time model\n\n protected readonly columns = computed<readonly ColumnHeader[]>(() => {\n const weekdays = this.adapter.getDayOfWeekNames('short');\n const first = this.adapter.getFirstDayOfWeek();\n return this.days().map(date => ({\n key: this.iso(date),\n date,\n // `weekdays` is indexed from the week's first day; `getDayOfWeek` is\n // absolute (0 = Sunday). Mixing the two spaces named Monday \"Tue\".\n weekday: weekdays[(this.adapter.getDayOfWeek(date) - first + DAYS_PER_WEEK) % DAYS_PER_WEEK],\n day: String(this.adapter.getDate(date)),\n label: this.adapter.format(date, 'longDate'),\n isToday: this.adapter.isSameDay(date, this.adapter.today()),\n }));\n });\n\n /** The all-day band above the time grid — same layout as a month week. */\n protected readonly allDayBands = computed<readonly BandChip[]>(() => {\n const days = this.days();\n const events = this.visible().filter(e => e.allDay === true || this.spansWholeDay(e));\n return this.bandLayout(events, days, Number.POSITIVE_INFINITY).chips;\n });\n\n protected readonly allDayCells = computed<\n readonly { key: string; date: Date; label: string; bands: readonly BandChip[] }[]\n >(() => {\n const days = this.days();\n const chips = this.allDayBands();\n return days.map((date, col) => ({\n key: this.iso(date),\n date,\n label: `${this.allDayLabel} — ${this.adapter.format(date, 'longDate')}`,\n bands: chips.filter(chip => chip.column === col),\n }));\n });\n\n protected readonly hasAllDay = computed(() => this.allDayBands().length > 0);\n\n protected readonly rows = computed<readonly TimeRow[]>(() => {\n const slot = Math.max(5, this.slotMinutes());\n const from = Math.max(0, Math.min(23, this.dayStartHour())) * 60;\n const to = Math.max(from + slot, Math.min(24, this.dayEndHour()) * 60);\n const days = this.days();\n const placed = this.timeLayout(days, slot);\n const rows: TimeRow[] = [];\n\n for (let minutes = from; minutes < to; minutes += slot) {\n rows.push({\n key: String(minutes),\n minutes,\n major: minutes % 60 === 0,\n label: minutes % 60 === 0 ? this.clock(minutes) : '',\n cells: days.map((date, col) => ({\n key: `${this.iso(date)}:${minutes}`,\n date,\n label: `${this.clock(minutes)} — ${this.adapter.format(date, 'longDate')}`,\n chips: placed[col].filter(chip => chip.slotMinutes === minutes).map(chip => chip.chip),\n })),\n });\n }\n\n return rows;\n });\n\n // ------------------------------------------------------------------ nav\n\n protected step(direction: -1 | 1): void {\n const anchor = this.date();\n switch (this.view()) {\n case 'day':\n this.date.set(this.adapter.addDays(anchor, direction));\n break;\n case 'week':\n this.date.set(this.adapter.addDays(anchor, direction * DAYS_PER_WEEK));\n break;\n default:\n this.date.set(this.adapter.addMonths(anchor, direction));\n }\n }\n\n protected goToday(): void {\n this.date.set(this.adapter.today());\n }\n\n protected setView(view: WrCalendarView): void {\n this.view.set(view);\n }\n\n /** “+N more” opens that day — the overflow is only ever a month-view problem. */\n protected openDay(date: Date): void {\n this.date.set(date);\n this.view.set('day');\n }\n\n // -------------------------------------------------------------- pointer\n\n protected onChipPointerDown(event: PointerEvent, chipEvent: WrCalendarEvent, kind: 'move' | 'resize'): void {\n if (!this.canDrag(chipEvent) || event.button !== 0) return;\n\n // Hide the chip from the hit test for exactly this measurement. The\n // `--dragging` rule that does it for the rest of the gesture is bound to a\n // signal that is not set yet, so `elementFromPoint` returned the chip itself\n // and `closest()` climbed to the cell the chip STARTS in — never the cell\n // under the pointer. A chip wide or tall enough to reach past its own cell\n // then jumped by the grab offset instead of moving by the drag distance.\n const chip = event.currentTarget as HTMLElement;\n const pointerEvents = chip.style.pointerEvents;\n chip.style.pointerEvents = 'none';\n const cell = this.cellUnder(event.clientX, event.clientY);\n chip.style.pointerEvents = pointerEvents;\n if (!cell) return;\n\n // The chip must stop swallowing hit-tests, or `elementFromPoint` reports\n // the chip itself for the whole drag and the target never changes.\n try {\n (event.target as HTMLElement).setPointerCapture?.(event.pointerId);\n } catch {\n // Capture is an optimisation — it keeps the release on this element even\n // when the pointer leaves it. A pointer that is already gone throws here,\n // and losing capture is not a reason to lose the drag.\n }\n event.preventDefault();\n event.stopPropagation();\n\n this.drag.set({\n event: chipEvent,\n kind,\n originDate: cell.date,\n originMinutes: cell.minutes,\n pointerId: event.pointerId,\n });\n }\n\n protected onPointerUp(event: PointerEvent): void {\n const state = this.drag();\n this.drag.set(null);\n if (state?.pointerId !== event.pointerId) return;\n\n const cell = this.cellUnder(event.clientX, event.clientY);\n if (!cell) return;\n\n const dayDelta = this.daysBetween(state.originDate, cell.date);\n const minuteDelta = cell.minutes < 0 || state.originMinutes < 0 ? 0 : cell.minutes - state.originMinutes;\n if (dayDelta === 0 && minuteDelta === 0) return;\n\n const { event: source, kind } = state;\n if (kind === 'resize') {\n const end = this.shift(source.end, dayDelta, minuteDelta);\n // A resize that would end at or before the start is a no-op, not an\n // inverted event.\n if (end.getTime() <= source.start.getTime()) return;\n this.eventChange.emit({ event: source, start: source.start, end, kind });\n return;\n }\n\n this.eventChange.emit({\n event: source,\n start: this.shift(source.start, dayDelta, minuteDelta),\n end: this.shift(source.end, dayDelta, minuteDelta),\n kind,\n });\n }\n\n protected onChipClick(event: WrCalendarEvent): void {\n this.eventClick.emit(event);\n }\n\n protected onCellClick(date: Date, minutes: number): void {\n this.slotClick.emit(this.slotAt(date, minutes));\n }\n\n // ------------------------------------------------------------- keyboard\n\n protected onChipKeyDown(event: KeyboardEvent, chipEvent: WrCalendarEvent): void {\n if (event.key === 'Escape') {\n this.focusCell(event);\n return;\n }\n\n if (!event.altKey || !this.canDrag(chipEvent)) return;\n\n const slot = Math.max(5, this.slotMinutes());\n const inTime = this.view() !== 'month';\n let days = 0;\n let minutes = 0;\n\n switch (this.inlineKey(event.key)) {\n case 'ArrowLeft':\n days = -1;\n break;\n case 'ArrowRight':\n days = 1;\n break;\n case 'ArrowUp':\n if (inTime) minutes = -slot;\n else days = -DAYS_PER_WEEK;\n break;\n case 'ArrowDown':\n if (inTime) minutes = slot;\n else days = DAYS_PER_WEEK;\n break;\n default:\n return;\n }\n\n event.preventDefault();\n this.eventChange.emit({\n event: chipEvent,\n start: this.shift(chipEvent.start, days, minutes),\n end: this.shift(chipEvent.end, days, minutes),\n kind: 'move',\n });\n }\n\n protected onGridKeyDown(event: KeyboardEvent): void {\n // Handled per cell, not on the grid: the element carrying the keyboard\n // should be the one that actually holds focus. Chips sit inside cells and\n // own their keys, so let anything originating in one bubble straight past.\n if (event.target !== event.currentTarget) return;\n\n const [day, minutes] = this.cursorCell();\n const columns = this.days().length;\n const rows = this.rows();\n const inTime = this.view() !== 'month';\n let next: readonly [number, number];\n\n switch (this.inlineKey(event.key)) {\n case 'ArrowLeft':\n next = [Math.max(0, day - 1), minutes];\n break;\n case 'ArrowRight':\n next = [Math.min(columns - 1, day + 1), minutes];\n break;\n case 'ArrowUp':\n next = inTime ? [day, this.stepRow(minutes, -1, rows)] : [Math.max(0, day - DAYS_PER_WEEK), minutes];\n break;\n case 'ArrowDown':\n next = inTime\n ? [day, this.stepRow(minutes, 1, rows)]\n : [day + DAYS_PER_WEEK < columns ? day + DAYS_PER_WEEK : day, minutes];\n break;\n case 'Home':\n next = [day - (day % DAYS_PER_WEEK), minutes];\n break;\n case 'End':\n next = [Math.min(columns - 1, day - (day % DAYS_PER_WEEK) + DAYS_PER_WEEK - 1), minutes];\n break;\n case 'Enter':\n case ' ': {\n event.preventDefault();\n const cell = event.target as HTMLElement;\n const chip = cell.querySelector<HTMLElement>('.wr-event-calendar__chip');\n if (chip) chip.focus();\n else this.onCellClick(this.days()[day], minutes);\n return;\n }\n default:\n return;\n }\n\n event.preventDefault();\n this.cursor.set(next);\n this.focusCursor(event.currentTarget as HTMLElement);\n }\n\n /**\n * Keep the roving cursor on the cell that actually has focus.\n *\n * The cursor was only ever written by an arrow key, while focus moves for three\n * other reasons — a click, a Tab onto a chip, Escape out of one — so the next\n * arrow read a coordinate nobody was standing on and threw focus back to it,\n * usually the top-left of the grid.\n */\n protected onCellFocus(day: number, minutes: number): void {\n const [d, m] = this.cursor();\n if (d !== day || m !== minutes) this.cursor.set([day, minutes]);\n }\n\n protected isCursor(day: number, minutes: number): boolean {\n const [d, m] = this.cursorCell();\n return d === day && m === minutes;\n }\n\n // --------------------------------------------------------------- layout\n\n /**\n * Greedy lane packing for day-spanning chips. Sorted by start then by length,\n * each segment takes the first lane its columns are free in — the classic\n * interval-graph colouring, and the reason a long event keeps one lane across\n * the whole week instead of stair-stepping.\n *\n * `limit` caps the visible lanes; anything past it is reported per column so\n * the cell can say how much it is hiding.\n */\n private bandLayout(\n events: readonly WrCalendarEvent[],\n days: readonly Date[],\n limit: number\n ): { chips: readonly BandChip[]; hidden: readonly number[] } {\n const first = days[0];\n const last = this.adapter.addDays(days[days.length - 1], 1);\n const lanes: number[][] = [];\n const chips: BandChip[] = [];\n const hidden = days.map(() => 0);\n\n for (const event of events) {\n if (event.end.getTime() <= first.getTime() || event.start.getTime() >= last.getTime()) continue;\n\n const from = Math.max(0, this.daysBetween(first, this.startOfDay(event.start)));\n // An exclusive end landing exactly on midnight belongs to the previous\n // day — otherwise every all-day event paints one column too wide.\n const endDay = this.startOfDay(new Date(event.end.getTime() - 1));\n const to = Math.min(days.length - 1, this.daysBetween(first, endDay));\n if (to < from) continue;\n\n let lane = lanes.findIndex(taken => taken.every(col => col < from || col > to));\n if (lane === -1) {\n lane = lanes.length;\n lanes.push([]);\n }\n for (let col = from; col <= to; col++) lanes[lane].push(col);\n\n if (lane >= limit) {\n for (let col = from; col <= to; col++) hidden[col]++;\n continue;\n }\n\n chips.push({\n key: `${String(event.id)}:${from}`,\n event,\n column: from,\n span: to - from + 1,\n lane,\n continuesBefore: event.start.getTime() < first.getTime(),\n continuesAfter: event.end.getTime() > last.getTime(),\n });\n }\n\n return { chips, hidden };\n }\n\n /**\n * Column layout inside one day: events that overlap in time share the width.\n * Clusters are built by a running high-water mark — a new cluster starts the\n * moment an event begins after everything before it has ended.\n */\n private timeLayout(days: readonly Date[], slot: number): readonly { chip: TimeChip; slotMinutes: number }[][] {\n const from = Math.max(0, Math.min(23, this.dayStartHour())) * 60;\n const to = Math.max(from + slot, Math.min(24, this.dayEndHour()) * 60);\n const timed = this.visible().filter(e => !e.allDay && !this.spansWholeDay(e));\n\n return days.map(day => {\n const dayStart = this.startOfDay(day);\n const windowStart = dayStart.getTime() + from * 60_000;\n const windowEnd = dayStart.getTime() + to * 60_000;\n\n const onDay = timed\n .filter(e => e.end.getTime() > windowStart && e.start.getTime() < windowEnd)\n .map(event => ({\n event,\n from: Math.max(windowStart, event.start.getTime()),\n to: Math.min(windowEnd, event.end.getTime()),\n }))\n .sort((a, b) => {\n const byStart = a.from - b.from;\n return byStart !== 0 ? byStart : b.to - a.to;\n });\n\n const out: { chip: TimeChip; slotMinutes: number }[] = [];\n let cluster: typeof onDay = [];\n let highWater = -1;\n\n const flush = (): void => {\n for (const [index, item] of cluster.entries()) {\n const minutes = Math.floor((item.from - dayStart.getTime()) / 60_000);\n const slotStart = from + Math.floor((minutes - from) / slot) * slot;\n const length = (item.to - item.from) / 60_000;\n\n out.push({\n slotMinutes: slotStart,\n chip: {\n key: `${String(item.event.id)}:${minutes}`,\n event: item.event,\n top: ((minutes - slotStart) / slot) * 100,\n height: (length / slot) * 100,\n left: (index / cluster.length) * 100,\n width: (1 / cluster.length) * 100,\n continuesBefore: item.event.start.getTime() < windowStart,\n continuesAfter: item.event.end.getTime() > windowEnd,\n },\n });\n }\n cluster = [];\n };\n\n for (const item of onDay) {\n if (cluster.length > 0 && item.from >= highWater) flush();\n cluster.push(item);\n highWater = Math.max(highWater, item.to);\n }\n flush();\n\n return out;\n });\n }\n\n // --------------------------------------------------------------- chrome\n\n protected chipLabel(event: WrCalendarEvent): string {\n const time = event.allDay ? this.allDayLabel : this.adapter.format(event.start, 'time');\n return `${event.title}, ${time}`;\n }\n\n protected chipTime(event: WrCalendarEvent): string {\n return event.allDay ? this.allDayLabel : this.adapter.format(event.start, 'time');\n }\n\n protected canDrag(event: WrCalendarEvent): boolean {\n return this.editable() && event.editable !== false;\n }\n\n // --------------------------------------------------------------- helpers\n\n private slotAt(date: Date, minutes: number): WrCalendarSlot {\n if (minutes < 0) {\n const start = this.startOfDay(date);\n return { start, end: this.adapter.addDays(start, 1), allDay: true };\n }\n const start = new Date(this.startOfDay(date).getTime() + minutes * 60_000);\n return { start, end: new Date(start.getTime() + Math.max(5, this.slotMinutes()) * 60_000), allDay: false };\n }\n\n /** The `[data-cell]` under the pointer, or `null` outside the grid. */\n private cellUnder(x: number, y: number): { date: Date; minutes: number } | null {\n const el = this.document.elementFromPoint(x, y)?.closest<HTMLElement>('[data-cell-date]');\n if (!el) return null;\n // Epoch millis rather than a formatted date: `new Date('2026-08-08')` is\n // parsed as UTC and lands on the previous day west of Greenwich.\n const stamp = Number(el.dataset['cellDate']);\n if (!Number.isFinite(stamp)) return null;\n return { date: new Date(stamp), minutes: Number(el.dataset['cellMinutes'] ?? -1) };\n }\n\n /** Value of a cell's `data-cell-date`. @internal */\n protected stamp(date: Date): number {\n return this.startOfDay(date).getTime();\n }\n\n private focusCursor(from: HTMLElement): void {\n const [day, minutes] = this.cursorCell();\n from.closest('[role=\"grid\"]')?.querySelector<HTMLElement>(`[data-cell-index=\"${day}:${minutes}\"]`)?.focus();\n }\n\n private focusCell(event: KeyboardEvent): void {\n event.preventDefault();\n (event.target as HTMLElement).closest<HTMLElement>('[data-cell-date]')?.focus();\n }\n\n /**\n * Move one time row, treating the all-day band as the row above the first —\n * otherwise the band is mouse-only, which is the kind of gap that makes a\n * keyboard user give up on the whole grid.\n */\n private stepRow(minutes: number, direction: -1 | 1, rows: readonly TimeRow[]): number {\n if (minutes === -1) return direction === 1 ? (rows[0]?.minutes ?? -1) : -1;\n\n const index = rows.findIndex(row => row.minutes === minutes);\n if (index === -1) return rows[0]?.minutes ?? -1;\n if (index === 0 && direction === -1) return this.hasAllDay() ? -1 : minutes;\n\n return rows[Math.min(rows.length - 1, index + direction)].minutes;\n }\n\n private shift(date: Date, days: number, minutes: number): Date {\n return new Date(this.adapter.addDays(date, days).getTime() + minutes * 60_000);\n }\n\n private startOfDay(date: Date): Date {\n return this.adapter.setTime(date, 0, 0, 0);\n }\n\n private startOfWeek(date: Date): Date {\n const first = this.adapter.getFirstDayOfWeek();\n const offset = (this.adapter.getDayOfWeek(date) - first + DAYS_PER_WEEK) % DAYS_PER_WEEK;\n return this.startOfDay(this.adapter.addDays(date, -offset));\n }\n\n /** Whole days apart — computed on the day floor, so DST cannot round it off. */\n private daysBetween(from: Date, to: Date): number {\n const a = this.startOfDay(from);\n const b = this.startOfDay(to);\n return Math.round((b.getTime() - a.getTime()) / (MINUTES_PER_DAY * 60_000));\n }\n\n private spansWholeDay(event: WrCalendarEvent): boolean {\n return event.end.getTime() - event.start.getTime() >= MINUTES_PER_DAY * 60_000;\n }\n\n private clock(minutes: number): string {\n const date = this.adapter.setTime(this.adapter.today(), Math.floor(minutes / 60), minutes % 60, 0);\n return this.adapter.format(date, 'time');\n }\n\n private iso(date: Date): string {\n return `${this.adapter.getYear(date)}-${this.adapter.getMonth(date) + 1}-${this.adapter.getDate(date)}`;\n }\n\n /**\n * The key as the grid SEES it.\n *\n * A day step follows visual order, so under `dir=\"rtl\"` ArrowRight goes back a\n * day. Up/Down move by week or by row and never flip; Home/End are semantic.\n * Both key handlers route through here — the grid nav and the `Alt`+arrow drag,\n * which moves an event and would otherwise reschedule it the wrong way.\n */\n private inlineKey(key: string): string {\n if (this.dir?.value !== 'rtl') return key;\n if (key === 'ArrowRight') return 'ArrowLeft';\n if (key === 'ArrowLeft') return 'ArrowRight';\n return key;\n }\n}\n","<!--\n Two grids, one rule: a chip always lives inside the `role=\"gridcell\"` where it\n STARTS, and reaches out from there — `calc()` widths for day-spanning bands,\n percentage heights for timed chips. A floating events layer would read better\n in the template and would leave `role=\"row\"` owning something other than\n cells, which is exactly what the axe gate rejects.\n-->\n@if (!hideHeader()) {\n <div class=\"wr-event-calendar__header\">\n <div class=\"wr-event-calendar__nav\">\n <button\n wr-btn\n type=\"button\"\n size=\"sm\"\n outlined\n class=\"wr-event-calendar__step\"\n [attr.aria-label]=\"previousLabel\"\n (click)=\"step(-1)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n </button>\n <button wr-btn type=\"button\" size=\"sm\" outlined (click)=\"goToday()\">{{ todayLabel }}</button>\n <button\n wr-btn\n type=\"button\"\n size=\"sm\"\n outlined\n class=\"wr-event-calendar__step\"\n [attr.aria-label]=\"nextLabel\"\n (click)=\"step(1)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n </button>\n </div>\n\n <h2 class=\"wr-event-calendar__title\">{{ title() }}</h2>\n\n @if (switcher().length > 1) {\n <wr-btn-group>\n @for (item of switcher(); track item.view) {\n <button\n wr-btn\n type=\"button\"\n size=\"sm\"\n [outlined]=\"view() !== item.view\"\n [color]=\"view() === item.view ? 'primary' : null\"\n [attr.aria-pressed]=\"view() === item.view\"\n (click)=\"setView(item.view)\"\n >\n {{ item.label }}\n </button>\n }\n </wr-btn-group>\n }\n </div>\n}\n\n@if (view() === 'month') {\n <div\n role=\"grid\"\n class=\"wr-event-calendar__grid wr-event-calendar__grid--month\"\n [attr.aria-label]=\"resolvedAriaLabel()\"\n >\n <div role=\"row\" class=\"wr-event-calendar__row\">\n @for (name of weekdayNames(); track $index) {\n <div role=\"columnheader\" class=\"wr-event-calendar__weekday\">{{ name }}</div>\n }\n </div>\n\n @for (week of weeks(); track week.key; let w = $index) {\n <div role=\"row\" class=\"wr-event-calendar__row\">\n @for (cell of week.days; track cell.key; let c = $index) {\n @let index = w * 7 + c;\n <div\n role=\"gridcell\"\n class=\"wr-event-calendar__cell wr-event-calendar__cell--day\"\n [class.wr-event-calendar__cell--muted]=\"!cell.inMonth\"\n [class.wr-event-calendar__cell--today]=\"cell.isToday\"\n [attr.aria-label]=\"cell.label\"\n [attr.tabindex]=\"isCursor(index, -1) ? 0 : -1\"\n [attr.data-cell-date]=\"stamp(cell.date)\"\n [attr.data-cell-minutes]=\"-1\"\n [attr.data-cell-index]=\"`${index}:-1`\"\n (focusin)=\"onCellFocus(index, -1)\"\n (click)=\"onCellClick(cell.date, -1)\"\n (keydown)=\"onGridKeyDown($event)\"\n >\n <span class=\"wr-event-calendar__daynum\" aria-hidden=\"true\">{{ cell.day }}</span>\n\n @for (chip of cell.bands; track chip.key) {\n <ng-container\n [ngTemplateOutlet]=\"band\"\n [ngTemplateOutletContext]=\"{ $implicit: chip, offset: '1.75rem' }\"\n />\n }\n\n @if (cell.hidden > 0) {\n <button\n type=\"button\"\n class=\"wr-event-calendar__more\"\n [style.--wr-event-calendar-lane]=\"maxLanes()\"\n (click)=\"openDay(cell.date); $event.stopPropagation()\"\n >\n {{ moreLabel({ count: cell.hidden }) }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n} @else {\n <div\n role=\"grid\"\n class=\"wr-event-calendar__grid wr-event-calendar__grid--time\"\n [style.--wr-event-calendar-cols]=\"columns().length\"\n [attr.aria-label]=\"resolvedAriaLabel()\"\n >\n <div role=\"row\" class=\"wr-event-calendar__row\">\n <div role=\"columnheader\" class=\"wr-event-calendar__gutter\" [attr.aria-label]=\"timeLabel\"></div>\n @for (column of columns(); track column.key) {\n <div\n role=\"columnheader\"\n class=\"wr-event-calendar__colhead\"\n [class.wr-event-calendar__colhead--today]=\"column.isToday\"\n >\n <span class=\"wr-event-calendar__colhead-weekday\">{{ column.weekday }}</span>\n <span class=\"wr-event-calendar__colhead-day\">{{ column.day }}</span>\n </div>\n }\n </div>\n\n @if (hasAllDay()) {\n <div role=\"row\" class=\"wr-event-calendar__row wr-event-calendar__row--allday\">\n <div role=\"rowheader\" class=\"wr-event-calendar__gutter\">{{ allDayLabel }}</div>\n @for (cell of allDayCells(); track cell.key; let c = $index) {\n <div\n role=\"gridcell\"\n class=\"wr-event-calendar__cell wr-event-calendar__cell--allday\"\n [attr.aria-label]=\"cell.label\"\n [attr.tabindex]=\"isCursor(c, -1) ? 0 : -1\"\n [attr.data-cell-date]=\"stamp(cell.date)\"\n [attr.data-cell-minutes]=\"-1\"\n [attr.data-cell-index]=\"`${c}:-1`\"\n (focusin)=\"onCellFocus(c, -1)\"\n (click)=\"onCellClick(cell.date, -1)\"\n (keydown)=\"onGridKeyDown($event)\"\n >\n @for (chip of cell.bands; track chip.key) {\n <ng-container [ngTemplateOutlet]=\"band\" [ngTemplateOutletContext]=\"{ $implicit: chip, offset: '0rem' }\" />\n }\n </div>\n }\n </div>\n }\n\n @for (row of rows(); track row.key) {\n <div role=\"row\" class=\"wr-event-calendar__row\" [class.wr-event-calendar__row--major]=\"row.major\">\n <div role=\"rowheader\" class=\"wr-event-calendar__gutter\">{{ row.label }}</div>\n @for (cell of row.cells; track cell.key; let c = $index) {\n <div\n role=\"gridcell\"\n class=\"wr-event-calendar__cell wr-event-calendar__cell--slot\"\n [class.wr-event-calendar__cell--major]=\"row.major\"\n [attr.aria-label]=\"cell.label\"\n [attr.tabindex]=\"isCursor(c, row.minutes) ? 0 : -1\"\n [attr.data-cell-date]=\"stamp(cell.date)\"\n [attr.data-cell-minutes]=\"row.minutes\"\n [attr.data-cell-index]=\"`${c}:${row.minutes}`\"\n (focusin)=\"onCellFocus(c, row.minutes)\"\n (click)=\"onCellClick(cell.date, row.minutes)\"\n (keydown)=\"onGridKeyDown($event)\"\n >\n @for (chip of cell.chips; track chip.key) {\n <button\n type=\"button\"\n class=\"wr-event-calendar__chip wr-event-calendar__chip--time\"\n [class.wr-event-calendar__chip--dragging]=\"dragging() === chip.event.id\"\n [class.wr-event-calendar__chip--continues-before]=\"chip.continuesBefore\"\n [class.wr-event-calendar__chip--continues-after]=\"chip.continuesAfter\"\n [style.--wr-event-calendar-color]=\"`var(--wr-color-${chip.event.color ?? 'primary'})`\"\n [style.top.%]=\"chip.top\"\n [style.height.%]=\"chip.height\"\n [style.left.%]=\"chip.left\"\n [style.width.%]=\"chip.width\"\n [attr.aria-label]=\"chipLabel(chip.event)\"\n (click)=\"onChipClick(chip.event); $event.stopPropagation()\"\n (keydown)=\"onChipKeyDown($event, chip.event)\"\n (pointerdown)=\"onChipPointerDown($event, chip.event, 'move')\"\n >\n <span class=\"wr-event-calendar__chip-time\" aria-hidden=\"true\">{{ chipTime(chip.event) }}</span>\n @if (chipTemplate(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"{ $implicit: chip.event }\" />\n } @else {\n <span class=\"wr-event-calendar__chip-title\" aria-hidden=\"true\">{{ chip.event.title }}</span>\n }\n\n @if (canDrag(chip.event) && !chip.continuesAfter) {\n <!--\n A grab area, not a control: the same resize is on the keyboard\n as `Alt` + arrows on the chip itself, so exposing a second\n focusable thing here would add a tab stop that leads nowhere.\n -->\n <span\n class=\"wr-event-calendar__resize\"\n aria-hidden=\"true\"\n (pointerdown)=\"onChipPointerDown($event, chip.event, 'resize')\"\n ></span>\n }\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n}\n\n<!-- One chip shape for both day-spanning cases: month cells and the all-day band. -->\n<ng-template #band let-chip let-offset=\"offset\">\n <button\n type=\"button\"\n class=\"wr-event-calendar__chip wr-event-calendar__chip--band\"\n [class.wr-event-calendar__chip--dragging]=\"dragging() === chip.event.id\"\n [class.wr-event-calendar__chip--continues-before]=\"chip.continuesBefore\"\n [class.wr-event-calendar__chip--continues-after]=\"chip.continuesAfter\"\n [style.--wr-event-calendar-color]=\"`var(--wr-color-${chip.event.color ?? 'primary'})`\"\n [style.--wr-event-calendar-span]=\"chip.span\"\n [style.--wr-event-calendar-lane]=\"chip.lane\"\n [style.--wr-event-calendar-offset]=\"offset\"\n [attr.aria-label]=\"chipLabel(chip.event)\"\n (click)=\"onChipClick(chip.event); $event.stopPropagation()\"\n (keydown)=\"onChipKeyDown($event, chip.event)\"\n (pointerdown)=\"onChipPointerDown($event, chip.event, 'move')\"\n >\n @if (chipTemplate(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"{ $implicit: chip.event }\" />\n } @else {\n <span class=\"wr-event-calendar__chip-title\" aria-hidden=\"true\">{{ chip.event.title }}</span>\n }\n </button>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngwr-event-calendar.mjs","sources":["../../../projects/lib/event-calendar/event-calendar-event-template.ts","../../../projects/lib/event-calendar/event-calendar.ts","../../../projects/lib/event-calendar/event-calendar.html","../../../projects/lib/event-calendar/ngwr-event-calendar.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Directive, TemplateRef, inject } from '@angular/core';\n\nimport type { WrCalendarEventContext } from './interfaces';\n\n/**\n * Replace the chip's contents. The event is the implicit context; the chip\n * itself — its button, its position and its drag handling — stays with the\n * calendar, so a custom template cannot break the geometry.\n *\n * @example\n * ```html\n * <wr-event-calendar [events]=\"events\">\n * <ng-template wrCalendarEvent let-event>\n * <strong>{{ event.title }}</strong> — {{ event.data.room }}\n * </ng-template>\n * </wr-event-calendar>\n * ```\n */\n@Directive({\n selector: 'ng-template[wrCalendarEvent]',\n})\nexport class WrCalendarEventTemplate {\n readonly template = inject<TemplateRef<WrCalendarEventContext>>(TemplateRef);\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { TemplateRef } from '@angular/core';\nimport {\n Component,\n DOCUMENT,\n ViewEncapsulation,\n computed,\n contentChild,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\n\nimport { WrButton, WrButtonGroup } from 'ngwr/button';\nimport { WrDateAdapter } from 'ngwr/date-adapter';\nimport { useI18nFormatter, useI18nText } from 'ngwr/i18n';\nimport { numAttr } from 'ngwr/utils';\n\nimport { WrCalendarEventTemplate } from './event-calendar-event-template';\nimport type {\n WrCalendarEvent,\n WrCalendarEventChange,\n WrCalendarEventContext,\n WrCalendarSlot,\n WrCalendarView,\n} from './interfaces';\n\n/**\n * Stands in for the consumer input `useI18nText` expects — the header strings take no\n * label inputs of their own.\n */\nconst NO_OVERRIDE = signal<string | null>(null).asReadonly();\n\nconst MINUTES_PER_DAY = 24 * 60;\nconst DAYS_PER_WEEK = 7;\nconst MONTH_ROWS = 6;\n\n/**\n * A chip that spans whole days — every month-view event, and the all-day band\n * of the time views. It lives in the cell where its segment STARTS and reaches\n * right with a `calc()` width, so it stays inside one `role=\"gridcell\"` however\n * far it spans.\n */\ninterface BandChip {\n readonly key: string;\n readonly event: WrCalendarEvent;\n /** Index of the day it starts on, within the row it was laid out against. */\n readonly column: number;\n readonly span: number;\n readonly lane: number;\n readonly continuesBefore: boolean;\n readonly continuesAfter: boolean;\n}\n\n/**\n * A chip positioned against the time grid. Same rule — it belongs to the cell\n * holding its start — but sized in percentages OF THAT CELL, which works only\n * because every slot row is the same height.\n */\ninterface TimeChip {\n readonly key: string;\n readonly event: WrCalendarEvent;\n /** Offset into the start cell, 0–100. */\n readonly top: number;\n /** Height as a multiple of the cell, ×100. */\n readonly height: number;\n /** Horizontal share of the column, both 0–100. */\n readonly left: number;\n readonly width: number;\n readonly continuesBefore: boolean;\n readonly continuesAfter: boolean;\n}\n\ninterface DayCell {\n readonly date: Date;\n readonly key: string;\n readonly day: string;\n readonly label: string;\n readonly inMonth: boolean;\n readonly isToday: boolean;\n readonly bands: readonly BandChip[];\n readonly hidden: number;\n}\n\ninterface MonthWeek {\n readonly key: string;\n readonly days: readonly DayCell[];\n}\n\ninterface TimeCell {\n readonly key: string;\n readonly date: Date;\n readonly label: string;\n readonly chips: readonly TimeChip[];\n}\n\ninterface TimeRow {\n readonly key: string;\n readonly label: string;\n /** Minutes from midnight — also what the drag target reads off the cell. */\n readonly minutes: number;\n readonly major: boolean;\n readonly cells: readonly TimeCell[];\n}\n\ninterface ColumnHeader {\n readonly key: string;\n readonly date: Date;\n readonly weekday: string;\n readonly day: string;\n readonly label: string;\n readonly isToday: boolean;\n}\n\n/** Live drag state. `null` whenever the pointer is not down on a chip. */\ninterface DragState {\n readonly event: WrCalendarEvent;\n readonly kind: 'move' | 'resize';\n readonly originDate: Date;\n readonly originMinutes: number;\n readonly pointerId: number;\n}\n\n/**\n * Month / week / day event calendar with drag to move and resize.\n *\n * `events` is an INPUT, never mutated: a drag emits `eventChange` describing\n * where the event would land and stops there. Apply it to your own state and\n * the calendar re-renders — so an unhandled output is a cancelled drag, an\n * optimistic update is one `set`, and a rejected server write needs no rollback\n * path inside the component.\n *\n * Every chip lives inside the `role=\"gridcell\"` where it starts and reaches out\n * with `calc()` widths or percentage heights. That is what keeps the ARIA grid\n * valid — an events layer floating over the grid would leave rows owning\n * something other than cells — and it means no pixel measurement anywhere.\n *\n * **Keyboard.** The grid is one tab stop with a roving cursor: arrows move by\n * day (left / right) and by week or slot (up / down), `Home` / `End` jump to\n * the ends of the row, `Enter` on an empty cell emits `slotClick`, and `Enter`\n * on a cell holding events focuses the first chip (`Escape` returns). On a\n * focused chip, `Alt` + arrows move the event — the keyboard equivalent of the\n * drag, emitting the same `eventChange`.\n *\n * Date math and formatting go through {@link WrDateAdapter}; register one with\n * `provideWrDateAdapter(...)` at bootstrap.\n *\n * @example\n * ```html\n * <wr-event-calendar\n * editable\n * [events]=\"events()\"\n * [(view)]=\"view\"\n * [(date)]=\"anchor\"\n * (eventChange)=\"apply($event)\"\n * (slotClick)=\"compose($event)\"\n * />\n * ```\n *\n * @see https://ngwr.dev/reference/components/event-calendar\n */\n@Component({\n selector: 'wr-event-calendar',\n templateUrl: './event-calendar.html',\n encapsulation: ViewEncapsulation.None,\n host: {\n '[class]': 'classes()',\n // A drag has to end wherever the pointer is released, including outside the\n // chip it started on — so the host owns the release, not the chip.\n '(pointerup)': 'onPointerUp($event)',\n '(pointercancel)': 'drag.set(null)',\n },\n imports: [NgTemplateOutlet, WrButton, WrButtonGroup],\n})\nexport class WrEventCalendar {\n /** Everything to render. Never mutated — see `eventChange`. */\n readonly events = input<readonly WrCalendarEvent[]>([]);\n\n /** Which span is shown. Two-way bindable. @default 'month' */\n readonly view = model<WrCalendarView>('month');\n\n /** Any date inside the shown span. Two-way bindable. */\n readonly date = model<Date>(new Date());\n\n /** Which buttons the view switcher offers. Empty hides it. */\n readonly views = input<readonly WrCalendarView[]>(['month', 'week', 'day']);\n\n /** Allow dragging chips to move and resize them. @default false */\n readonly editable = input(false, { transform: coerceBooleanProperty });\n\n /** Minutes per row in the time views — also the drag snap. @default 30 */\n readonly slotMinutes = input(30, { transform: numAttr(30) });\n\n /** First hour the time views show. @default 0 */\n readonly dayStartHour = input(0, { transform: numAttr(0) });\n\n /** First hour they do NOT show, exclusive. @default 24 */\n readonly dayEndHour = input(24, { transform: numAttr(24) });\n\n /** Lanes a month cell shows before collapsing the rest into “+N more”. @default 3 */\n readonly maxLanes = input(3, { transform: numAttr(3) });\n\n /** Hide the built-in header — supply your own navigation instead. @default false */\n readonly hideHeader = input(false, { transform: coerceBooleanProperty });\n\n /** A chip was activated. */\n readonly eventClick = output<WrCalendarEvent>();\n\n /** Empty space was activated — the slot the user pointed at. */\n readonly slotClick = output<WrCalendarSlot>();\n\n /** A drag or an `Alt` + arrow finished. Apply it yourself; nothing moves until you do. */\n readonly eventChange = output<WrCalendarEventChange>();\n\n private readonly adapter = inject<WrDateAdapter<Date>>(WrDateAdapter);\n private readonly document = inject(DOCUMENT);\n private readonly dir = inject(Directionality, { optional: true });\n private readonly chipTpl = contentChild(WrCalendarEventTemplate);\n\n // Reactive, not `readI18nText`: a calendar is as long-lived as the page it sits\n // on, so a catalog that finishes loading after construction — or a locale switch —\n // has to reach these. Resolved once, they froze the English defaults in place.\n protected readonly todayLabel = useI18nText(NO_OVERRIDE, 'eventCalendar.today', 'Today');\n protected readonly previousLabel = useI18nText(NO_OVERRIDE, 'eventCalendar.previous', 'Previous');\n protected readonly nextLabel = useI18nText(NO_OVERRIDE, 'eventCalendar.next', 'Next');\n protected readonly allDayLabel = useI18nText(NO_OVERRIDE, 'eventCalendar.allDay', 'All day');\n protected readonly timeLabel = useI18nText(NO_OVERRIDE, 'eventCalendar.time', 'Time');\n protected readonly moreLabel = useI18nFormatter('eventCalendar.more', '+{{count}} more');\n private readonly monthLabel = useI18nText(NO_OVERRIDE, 'eventCalendar.month', 'Month');\n private readonly weekLabel = useI18nText(NO_OVERRIDE, 'eventCalendar.week', 'Week');\n private readonly dayLabel = useI18nText(NO_OVERRIDE, 'eventCalendar.day', 'Day');\n\n protected readonly viewLabels = computed<Record<WrCalendarView, string>>(() => ({\n month: this.monthLabel(),\n week: this.weekLabel(),\n day: this.dayLabel(),\n }));\n\n /** Accessible name of the grid; overridable for a page with several. */\n readonly ariaLabel = input<string | null>(null);\n protected readonly resolvedAriaLabel = useI18nText(this.ariaLabel, 'eventCalendar.label', 'Calendar');\n\n /**\n * `[day, minutes]` of the roving cursor — `minutes === -1` means a month cell\n * or the all-day band. Raw, so it survives a view switch; read\n * {@link cursorCell}, which clamps it to what the current view actually has.\n */\n private readonly cursor = signal<readonly [number, number]>([0, -1]);\n\n /**\n * The cursor as the current view can honour it. Exactly one cell may carry\n * `tabindex=\"0\"`, so a stale coordinate — the 09:30 row after switching to\n * month, day 34 after switching to week — must fall back to a real cell\n * rather than leave the grid with no tab stop at all.\n */\n protected readonly cursorCell = computed<readonly [number, number]>(() => {\n const [day, minutes] = this.cursor();\n const columns = Math.max(1, this.days().length);\n const clamped = Math.min(columns - 1, Math.max(0, day));\n\n if (this.view() === 'month') return [clamped, -1];\n if (minutes === -1 && this.hasAllDay()) return [clamped, -1];\n\n const rows = this.rows();\n const known = rows.some(row => row.minutes === minutes);\n return [clamped, known ? minutes : (rows[0]?.minutes ?? 0)];\n });\n\n /** Non-null only while a pointer is down on a chip. @internal */\n protected readonly drag = signal<DragState | null>(null);\n\n protected readonly dragging = computed(() => this.drag()?.event.id ?? null);\n\n protected readonly chipTemplate = computed<TemplateRef<WrCalendarEventContext> | null>(\n () => this.chipTpl()?.template ?? null\n );\n\n protected readonly classes = computed(() => {\n const parts = ['wr-event-calendar', `wr-event-calendar--${this.view()}`];\n if (this.editable()) parts.push('wr-event-calendar--editable');\n if (this.drag()) parts.push('wr-event-calendar--dragging');\n return parts.join(' ');\n });\n\n // ---------------------------------------------------------------- ranges\n\n /** Inclusive-exclusive window the current view covers. */\n private readonly range = computed<readonly [Date, Date]>(() => {\n const anchor = this.startOfDay(this.date());\n switch (this.view()) {\n case 'day':\n return [anchor, this.adapter.addDays(anchor, 1)];\n case 'week': {\n const start = this.startOfWeek(anchor);\n return [start, this.adapter.addDays(start, DAYS_PER_WEEK)];\n }\n default: {\n const first = this.adapter.createDate(this.adapter.getYear(anchor), this.adapter.getMonth(anchor), 1);\n const start = this.startOfWeek(first);\n return [start, this.adapter.addDays(start, MONTH_ROWS * DAYS_PER_WEEK)];\n }\n }\n });\n\n /** Every day the view shows, left to right. */\n private readonly days = computed<readonly Date[]>(() => {\n const [start, end] = this.range();\n const count = Math.round((end.getTime() - start.getTime()) / (MINUTES_PER_DAY * 60_000));\n return Array.from({ length: count }, (_, i) => this.adapter.addDays(start, i));\n });\n\n /** Only what overlaps the window — everything downstream works off this. */\n private readonly visible = computed<readonly WrCalendarEvent[]>(() => {\n const [start, end] = this.range();\n return [...this.events()]\n .filter(e => e.end.getTime() > start.getTime() && e.start.getTime() < end.getTime())\n .sort((a, b) => {\n const byStart = a.start.getTime() - b.start.getTime();\n // Ties go to the longer event, so a week-long band claims its lane\n // before the one-day events sitting alongside it.\n return byStart !== 0 ? byStart : b.end.getTime() - a.end.getTime();\n });\n });\n\n protected readonly title = computed(() => {\n const anchor = this.date();\n const months = this.adapter.getMonthNames('long');\n switch (this.view()) {\n case 'day':\n return this.adapter.format(anchor, 'longDate');\n case 'week': {\n const [start] = this.range();\n const last = this.adapter.addDays(start, DAYS_PER_WEEK - 1);\n return `${this.adapter.format(start, 'mediumDate')} – ${this.adapter.format(last, 'mediumDate')}`;\n }\n default:\n return `${months[this.adapter.getMonth(anchor)]} ${this.adapter.getYear(anchor)}`;\n }\n });\n\n /**\n * The adapter contract is \"names ordered from `getFirstDayOfWeek()` onwards\",\n * so the list is ALREADY rotated. Rotating it again here put every column one\n * day out for every locale whose week does not start on Sunday — invisible in\n * en-US, wrong everywhere else. `wr-calendar` consumes the same call directly.\n */\n protected readonly weekdayNames = computed(() => this.adapter.getDayOfWeekNames('short'));\n\n protected readonly switcher = computed(() => this.views().map(view => ({ view, label: this.viewLabels()[view] })));\n\n // ----------------------------------------------------------- month model\n\n protected readonly weeks = computed<readonly MonthWeek[]>(() => {\n const days = this.days();\n const events = this.visible();\n const weeks: MonthWeek[] = [];\n const month = this.adapter.getMonth(this.date());\n\n for (let w = 0; w * DAYS_PER_WEEK < days.length; w++) {\n const row = days.slice(w * DAYS_PER_WEEK, (w + 1) * DAYS_PER_WEEK);\n const { chips, hidden } = this.bandLayout(events, row, this.maxLanes());\n\n weeks.push({\n key: this.iso(row[0]),\n days: row.map((date, col) => ({\n date,\n key: this.iso(date),\n day: String(this.adapter.getDate(date)),\n label: this.adapter.format(date, 'longDate'),\n inMonth: this.adapter.getMonth(date) === month,\n isToday: this.adapter.isSameDay(date, this.adapter.today()),\n bands: chips.filter(chip => chip.column === col),\n hidden: hidden[col],\n })),\n });\n }\n\n return weeks;\n });\n\n // ------------------------------------------------------------ time model\n\n protected readonly columns = computed<readonly ColumnHeader[]>(() => {\n const weekdays = this.adapter.getDayOfWeekNames('short');\n const first = this.adapter.getFirstDayOfWeek();\n return this.days().map(date => ({\n key: this.iso(date),\n date,\n // `weekdays` is indexed from the week's first day; `getDayOfWeek` is\n // absolute (0 = Sunday). Mixing the two spaces named Monday \"Tue\".\n weekday: weekdays[(this.adapter.getDayOfWeek(date) - first + DAYS_PER_WEEK) % DAYS_PER_WEEK],\n day: String(this.adapter.getDate(date)),\n label: this.adapter.format(date, 'longDate'),\n isToday: this.adapter.isSameDay(date, this.adapter.today()),\n }));\n });\n\n /** The all-day band above the time grid — same layout as a month week. */\n protected readonly allDayBands = computed<readonly BandChip[]>(() => {\n const days = this.days();\n const events = this.visible().filter(e => e.allDay === true || this.spansWholeDay(e));\n return this.bandLayout(events, days, Number.POSITIVE_INFINITY).chips;\n });\n\n protected readonly allDayCells = computed<\n readonly { key: string; date: Date; label: string; bands: readonly BandChip[] }[]\n >(() => {\n const days = this.days();\n const chips = this.allDayBands();\n return days.map((date, col) => ({\n key: this.iso(date),\n date,\n label: `${this.allDayLabel()} — ${this.adapter.format(date, 'longDate')}`,\n bands: chips.filter(chip => chip.column === col),\n }));\n });\n\n protected readonly hasAllDay = computed(() => this.allDayBands().length > 0);\n\n protected readonly rows = computed<readonly TimeRow[]>(() => {\n const slot = Math.max(5, this.slotMinutes());\n const from = Math.max(0, Math.min(23, this.dayStartHour())) * 60;\n const to = Math.max(from + slot, Math.min(24, this.dayEndHour()) * 60);\n const days = this.days();\n const placed = this.timeLayout(days, slot);\n const rows: TimeRow[] = [];\n\n for (let minutes = from; minutes < to; minutes += slot) {\n rows.push({\n key: String(minutes),\n minutes,\n major: minutes % 60 === 0,\n label: minutes % 60 === 0 ? this.clock(minutes) : '',\n cells: days.map((date, col) => ({\n key: `${this.iso(date)}:${minutes}`,\n date,\n label: `${this.clock(minutes)} — ${this.adapter.format(date, 'longDate')}`,\n chips: placed[col].filter(chip => chip.slotMinutes === minutes).map(chip => chip.chip),\n })),\n });\n }\n\n return rows;\n });\n\n // ------------------------------------------------------------------ nav\n\n protected step(direction: -1 | 1): void {\n const anchor = this.date();\n switch (this.view()) {\n case 'day':\n this.date.set(this.adapter.addDays(anchor, direction));\n break;\n case 'week':\n this.date.set(this.adapter.addDays(anchor, direction * DAYS_PER_WEEK));\n break;\n default:\n this.date.set(this.adapter.addMonths(anchor, direction));\n }\n }\n\n protected goToday(): void {\n this.date.set(this.adapter.today());\n }\n\n protected setView(view: WrCalendarView): void {\n this.view.set(view);\n }\n\n /** “+N more” opens that day — the overflow is only ever a month-view problem. */\n protected openDay(date: Date): void {\n this.date.set(date);\n this.view.set('day');\n }\n\n // -------------------------------------------------------------- pointer\n\n protected onChipPointerDown(event: PointerEvent, chipEvent: WrCalendarEvent, kind: 'move' | 'resize'): void {\n if (!this.canDrag(chipEvent) || event.button !== 0) return;\n\n // Hide the chip from the hit test for exactly this measurement. The\n // `--dragging` rule that does it for the rest of the gesture is bound to a\n // signal that is not set yet, so `elementFromPoint` returned the chip itself\n // and `closest()` climbed to the cell the chip STARTS in — never the cell\n // under the pointer. A chip wide or tall enough to reach past its own cell\n // then jumped by the grab offset instead of moving by the drag distance.\n const chip = event.currentTarget as HTMLElement;\n const pointerEvents = chip.style.pointerEvents;\n chip.style.pointerEvents = 'none';\n const cell = this.cellUnder(event.clientX, event.clientY);\n chip.style.pointerEvents = pointerEvents;\n if (!cell) return;\n\n // The chip must stop swallowing hit-tests, or `elementFromPoint` reports\n // the chip itself for the whole drag and the target never changes.\n try {\n (event.target as HTMLElement).setPointerCapture?.(event.pointerId);\n } catch {\n // Capture is an optimisation — it keeps the release on this element even\n // when the pointer leaves it. A pointer that is already gone throws here,\n // and losing capture is not a reason to lose the drag.\n }\n event.preventDefault();\n event.stopPropagation();\n\n this.drag.set({\n event: chipEvent,\n kind,\n originDate: cell.date,\n originMinutes: cell.minutes,\n pointerId: event.pointerId,\n });\n }\n\n protected onPointerUp(event: PointerEvent): void {\n const state = this.drag();\n this.drag.set(null);\n if (state?.pointerId !== event.pointerId) return;\n\n const cell = this.cellUnder(event.clientX, event.clientY);\n if (!cell) return;\n\n const dayDelta = this.daysBetween(state.originDate, cell.date);\n const minuteDelta = cell.minutes < 0 || state.originMinutes < 0 ? 0 : cell.minutes - state.originMinutes;\n if (dayDelta === 0 && minuteDelta === 0) return;\n\n const { event: source, kind } = state;\n if (kind === 'resize') {\n const end = this.shift(source.end, dayDelta, minuteDelta);\n // A resize that would end at or before the start is a no-op, not an\n // inverted event.\n if (end.getTime() <= source.start.getTime()) return;\n this.eventChange.emit({ event: source, start: source.start, end, kind });\n return;\n }\n\n this.eventChange.emit({\n event: source,\n start: this.shift(source.start, dayDelta, minuteDelta),\n end: this.shift(source.end, dayDelta, minuteDelta),\n kind,\n });\n }\n\n protected onChipClick(event: WrCalendarEvent): void {\n this.eventClick.emit(event);\n }\n\n protected onCellClick(date: Date, minutes: number): void {\n this.slotClick.emit(this.slotAt(date, minutes));\n }\n\n // ------------------------------------------------------------- keyboard\n\n protected onChipKeyDown(event: KeyboardEvent, chipEvent: WrCalendarEvent): void {\n if (event.key === 'Escape') {\n this.focusCell(event);\n return;\n }\n\n if (!event.altKey || !this.canDrag(chipEvent)) return;\n\n const slot = Math.max(5, this.slotMinutes());\n const inTime = this.view() !== 'month';\n let days = 0;\n let minutes = 0;\n\n switch (this.inlineKey(event.key)) {\n case 'ArrowLeft':\n days = -1;\n break;\n case 'ArrowRight':\n days = 1;\n break;\n case 'ArrowUp':\n if (inTime) minutes = -slot;\n else days = -DAYS_PER_WEEK;\n break;\n case 'ArrowDown':\n if (inTime) minutes = slot;\n else days = DAYS_PER_WEEK;\n break;\n default:\n return;\n }\n\n event.preventDefault();\n\n // `Shift` turns the same gesture into a resize, moving the END alone. Without it\n // the keyboard could move an event and never re-length one — and the resize grab\n // area is `aria-hidden` and unfocusable precisely BECAUSE this exists, so its\n // absence left the operation on the mouse only.\n if (event.shiftKey) {\n const end = this.shift(chipEvent.end, days, minutes);\n // Same rule as the pointer path: a resize that would end at or before the\n // start is a no-op rather than an inverted event.\n if (end.getTime() <= chipEvent.start.getTime()) return;\n this.eventChange.emit({ event: chipEvent, start: chipEvent.start, end, kind: 'resize' });\n return;\n }\n\n this.eventChange.emit({\n event: chipEvent,\n start: this.shift(chipEvent.start, days, minutes),\n end: this.shift(chipEvent.end, days, minutes),\n kind: 'move',\n });\n }\n\n protected onGridKeyDown(event: KeyboardEvent): void {\n // Handled per cell, not on the grid: the element carrying the keyboard\n // should be the one that actually holds focus. Chips sit inside cells and\n // own their keys, so let anything originating in one bubble straight past.\n if (event.target !== event.currentTarget) return;\n\n const [day, minutes] = this.cursorCell();\n const columns = this.days().length;\n const rows = this.rows();\n const inTime = this.view() !== 'month';\n let next: readonly [number, number];\n\n switch (this.inlineKey(event.key)) {\n case 'ArrowLeft':\n next = [Math.max(0, day - 1), minutes];\n break;\n case 'ArrowRight':\n next = [Math.min(columns - 1, day + 1), minutes];\n break;\n case 'ArrowUp':\n next = inTime ? [day, this.stepRow(minutes, -1, rows)] : [Math.max(0, day - DAYS_PER_WEEK), minutes];\n break;\n case 'ArrowDown':\n next = inTime\n ? [day, this.stepRow(minutes, 1, rows)]\n : [day + DAYS_PER_WEEK < columns ? day + DAYS_PER_WEEK : day, minutes];\n break;\n case 'Home':\n next = [day - (day % DAYS_PER_WEEK), minutes];\n break;\n case 'End':\n next = [Math.min(columns - 1, day - (day % DAYS_PER_WEEK) + DAYS_PER_WEEK - 1), minutes];\n break;\n case 'Enter':\n case ' ': {\n event.preventDefault();\n const cell = event.target as HTMLElement;\n const chip = cell.querySelector<HTMLElement>('.wr-event-calendar__chip');\n if (chip) chip.focus();\n else this.onCellClick(this.days()[day], minutes);\n return;\n }\n default:\n return;\n }\n\n event.preventDefault();\n this.cursor.set(next);\n this.focusCursor(event.currentTarget as HTMLElement);\n }\n\n /**\n * Keep the roving cursor on the cell that actually has focus.\n *\n * The cursor was only ever written by an arrow key, while focus moves for three\n * other reasons — a click, a Tab onto a chip, Escape out of one — so the next\n * arrow read a coordinate nobody was standing on and threw focus back to it,\n * usually the top-left of the grid.\n */\n protected onCellFocus(day: number, minutes: number): void {\n const [d, m] = this.cursor();\n if (d !== day || m !== minutes) this.cursor.set([day, minutes]);\n }\n\n protected isCursor(day: number, minutes: number): boolean {\n const [d, m] = this.cursorCell();\n return d === day && m === minutes;\n }\n\n // --------------------------------------------------------------- layout\n\n /**\n * Greedy lane packing for day-spanning chips. Sorted by start then by length,\n * each segment takes the first lane its columns are free in — the classic\n * interval-graph colouring, and the reason a long event keeps one lane across\n * the whole week instead of stair-stepping.\n *\n * `limit` caps the visible lanes; anything past it is reported per column so\n * the cell can say how much it is hiding.\n */\n private bandLayout(\n events: readonly WrCalendarEvent[],\n days: readonly Date[],\n limit: number\n ): { chips: readonly BandChip[]; hidden: readonly number[] } {\n const first = days[0];\n const last = this.adapter.addDays(days[days.length - 1], 1);\n const lanes: number[][] = [];\n const chips: BandChip[] = [];\n const hidden = days.map(() => 0);\n\n for (const event of events) {\n if (event.end.getTime() <= first.getTime() || event.start.getTime() >= last.getTime()) continue;\n\n const from = Math.max(0, this.daysBetween(first, this.startOfDay(event.start)));\n // An exclusive end landing exactly on midnight belongs to the previous\n // day — otherwise every all-day event paints one column too wide.\n const endDay = this.startOfDay(new Date(event.end.getTime() - 1));\n const to = Math.min(days.length - 1, this.daysBetween(first, endDay));\n if (to < from) continue;\n\n let lane = lanes.findIndex(taken => taken.every(col => col < from || col > to));\n if (lane === -1) {\n lane = lanes.length;\n lanes.push([]);\n }\n for (let col = from; col <= to; col++) lanes[lane].push(col);\n\n if (lane >= limit) {\n for (let col = from; col <= to; col++) hidden[col]++;\n continue;\n }\n\n chips.push({\n key: `${String(event.id)}:${from}`,\n event,\n column: from,\n span: to - from + 1,\n lane,\n continuesBefore: event.start.getTime() < first.getTime(),\n continuesAfter: event.end.getTime() > last.getTime(),\n });\n }\n\n return { chips, hidden };\n }\n\n /**\n * Column layout inside one day: events that overlap in time share the width.\n * Clusters are built by a running high-water mark — a new cluster starts the\n * moment an event begins after everything before it has ended.\n */\n private timeLayout(days: readonly Date[], slot: number): readonly { chip: TimeChip; slotMinutes: number }[][] {\n const from = Math.max(0, Math.min(23, this.dayStartHour())) * 60;\n const to = Math.max(from + slot, Math.min(24, this.dayEndHour()) * 60);\n const timed = this.visible().filter(e => !e.allDay && !this.spansWholeDay(e));\n\n return days.map(day => {\n const dayStart = this.startOfDay(day);\n const windowStart = dayStart.getTime() + from * 60_000;\n const windowEnd = dayStart.getTime() + to * 60_000;\n\n const onDay = timed\n .filter(e => e.end.getTime() > windowStart && e.start.getTime() < windowEnd)\n .map(event => ({\n event,\n from: Math.max(windowStart, event.start.getTime()),\n to: Math.min(windowEnd, event.end.getTime()),\n }))\n .sort((a, b) => {\n const byStart = a.from - b.from;\n return byStart !== 0 ? byStart : b.to - a.to;\n });\n\n const out: { chip: TimeChip; slotMinutes: number }[] = [];\n let cluster: typeof onDay = [];\n let highWater = -1;\n\n const flush = (): void => {\n for (const [index, item] of cluster.entries()) {\n const minutes = Math.floor((item.from - dayStart.getTime()) / 60_000);\n const slotStart = from + Math.floor((minutes - from) / slot) * slot;\n const length = (item.to - item.from) / 60_000;\n\n out.push({\n slotMinutes: slotStart,\n chip: {\n key: `${String(item.event.id)}:${minutes}`,\n event: item.event,\n top: ((minutes - slotStart) / slot) * 100,\n height: (length / slot) * 100,\n left: (index / cluster.length) * 100,\n width: (1 / cluster.length) * 100,\n continuesBefore: item.event.start.getTime() < windowStart,\n continuesAfter: item.event.end.getTime() > windowEnd,\n },\n });\n }\n cluster = [];\n };\n\n for (const item of onDay) {\n if (cluster.length > 0 && item.from >= highWater) flush();\n cluster.push(item);\n highWater = Math.max(highWater, item.to);\n }\n flush();\n\n return out;\n });\n }\n\n // --------------------------------------------------------------- chrome\n\n protected chipLabel(event: WrCalendarEvent): string {\n const time = event.allDay ? this.allDayLabel() : this.adapter.format(event.start, 'time');\n return `${event.title}, ${time}`;\n }\n\n protected chipTime(event: WrCalendarEvent): string {\n return event.allDay ? this.allDayLabel() : this.adapter.format(event.start, 'time');\n }\n\n protected canDrag(event: WrCalendarEvent): boolean {\n return this.editable() && event.editable !== false;\n }\n\n // --------------------------------------------------------------- helpers\n\n private slotAt(date: Date, minutes: number): WrCalendarSlot {\n if (minutes < 0) {\n const start = this.startOfDay(date);\n return { start, end: this.adapter.addDays(start, 1), allDay: true };\n }\n const start = new Date(this.startOfDay(date).getTime() + minutes * 60_000);\n return { start, end: new Date(start.getTime() + Math.max(5, this.slotMinutes()) * 60_000), allDay: false };\n }\n\n /** The `[data-cell]` under the pointer, or `null` outside the grid. */\n private cellUnder(x: number, y: number): { date: Date; minutes: number } | null {\n const el = this.document.elementFromPoint(x, y)?.closest<HTMLElement>('[data-cell-date]');\n if (!el) return null;\n // Epoch millis rather than a formatted date: `new Date('2026-08-08')` is\n // parsed as UTC and lands on the previous day west of Greenwich.\n const stamp = Number(el.dataset['cellDate']);\n if (!Number.isFinite(stamp)) return null;\n return { date: new Date(stamp), minutes: Number(el.dataset['cellMinutes'] ?? -1) };\n }\n\n /** Value of a cell's `data-cell-date`. @internal */\n protected stamp(date: Date): number {\n return this.startOfDay(date).getTime();\n }\n\n private focusCursor(from: HTMLElement): void {\n const [day, minutes] = this.cursorCell();\n from.closest('[role=\"grid\"]')?.querySelector<HTMLElement>(`[data-cell-index=\"${day}:${minutes}\"]`)?.focus();\n }\n\n private focusCell(event: KeyboardEvent): void {\n event.preventDefault();\n (event.target as HTMLElement).closest<HTMLElement>('[data-cell-date]')?.focus();\n }\n\n /**\n * Move one time row, treating the all-day band as the row above the first —\n * otherwise the band is mouse-only, which is the kind of gap that makes a\n * keyboard user give up on the whole grid.\n */\n private stepRow(minutes: number, direction: -1 | 1, rows: readonly TimeRow[]): number {\n if (minutes === -1) return direction === 1 ? (rows[0]?.minutes ?? -1) : -1;\n\n const index = rows.findIndex(row => row.minutes === minutes);\n if (index === -1) return rows[0]?.minutes ?? -1;\n if (index === 0 && direction === -1) return this.hasAllDay() ? -1 : minutes;\n\n return rows[Math.min(rows.length - 1, index + direction)].minutes;\n }\n\n private shift(date: Date, days: number, minutes: number): Date {\n return new Date(this.adapter.addDays(date, days).getTime() + minutes * 60_000);\n }\n\n private startOfDay(date: Date): Date {\n return this.adapter.setTime(date, 0, 0, 0);\n }\n\n private startOfWeek(date: Date): Date {\n const first = this.adapter.getFirstDayOfWeek();\n const offset = (this.adapter.getDayOfWeek(date) - first + DAYS_PER_WEEK) % DAYS_PER_WEEK;\n return this.startOfDay(this.adapter.addDays(date, -offset));\n }\n\n /** Whole days apart — computed on the day floor, so DST cannot round it off. */\n private daysBetween(from: Date, to: Date): number {\n const a = this.startOfDay(from);\n const b = this.startOfDay(to);\n return Math.round((b.getTime() - a.getTime()) / (MINUTES_PER_DAY * 60_000));\n }\n\n private spansWholeDay(event: WrCalendarEvent): boolean {\n return event.end.getTime() - event.start.getTime() >= MINUTES_PER_DAY * 60_000;\n }\n\n private clock(minutes: number): string {\n const date = this.adapter.setTime(this.adapter.today(), Math.floor(minutes / 60), minutes % 60, 0);\n return this.adapter.format(date, 'time');\n }\n\n private iso(date: Date): string {\n return `${this.adapter.getYear(date)}-${this.adapter.getMonth(date) + 1}-${this.adapter.getDate(date)}`;\n }\n\n /**\n * The key as the grid SEES it.\n *\n * A day step follows visual order, so under `dir=\"rtl\"` ArrowRight goes back a\n * day. Up/Down move by week or by row and never flip; Home/End are semantic.\n * Both key handlers route through here — the grid nav and the `Alt`+arrow drag,\n * which moves an event and would otherwise reschedule it the wrong way.\n */\n private inlineKey(key: string): string {\n if (this.dir?.value !== 'rtl') return key;\n if (key === 'ArrowRight') return 'ArrowLeft';\n if (key === 'ArrowLeft') return 'ArrowRight';\n return key;\n }\n}\n","<!--\n Two grids, one rule: a chip always lives inside the `role=\"gridcell\"` where it\n STARTS, and reaches out from there — `calc()` widths for day-spanning bands,\n percentage heights for timed chips. A floating events layer would read better\n in the template and would leave `role=\"row\"` owning something other than\n cells, which is exactly what the axe gate rejects.\n-->\n@if (!hideHeader()) {\n <div class=\"wr-event-calendar__header\">\n <div class=\"wr-event-calendar__nav\">\n <button\n wr-btn\n type=\"button\"\n size=\"sm\"\n outlined\n class=\"wr-event-calendar__step wr-event-calendar__step--prev\"\n [attr.aria-label]=\"previousLabel()\"\n (click)=\"step(-1)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n </button>\n <button wr-btn type=\"button\" size=\"sm\" outlined class=\"wr-event-calendar__today\" (click)=\"goToday()\">\n {{ todayLabel() }}\n </button>\n <button\n wr-btn\n type=\"button\"\n size=\"sm\"\n outlined\n class=\"wr-event-calendar__step wr-event-calendar__step--next\"\n [attr.aria-label]=\"nextLabel()\"\n (click)=\"step(1)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n </button>\n </div>\n\n <h2 class=\"wr-event-calendar__title\">{{ title() }}</h2>\n\n @if (switcher().length > 1) {\n <wr-btn-group>\n @for (item of switcher(); track item.view) {\n <button\n wr-btn\n type=\"button\"\n size=\"sm\"\n class=\"wr-event-calendar__view\"\n [outlined]=\"view() !== item.view\"\n [color]=\"view() === item.view ? 'primary' : null\"\n [attr.aria-pressed]=\"view() === item.view\"\n (click)=\"setView(item.view)\"\n >\n {{ item.label }}\n </button>\n }\n </wr-btn-group>\n }\n </div>\n}\n\n@if (view() === 'month') {\n <div\n role=\"grid\"\n class=\"wr-event-calendar__grid wr-event-calendar__grid--month\"\n [attr.aria-label]=\"resolvedAriaLabel()\"\n >\n <div role=\"row\" class=\"wr-event-calendar__row\">\n @for (name of weekdayNames(); track $index) {\n <div role=\"columnheader\" class=\"wr-event-calendar__weekday\">{{ name }}</div>\n }\n </div>\n\n @for (week of weeks(); track week.key; let w = $index) {\n <div role=\"row\" class=\"wr-event-calendar__row\">\n @for (cell of week.days; track cell.key; let c = $index) {\n @let index = w * 7 + c;\n <div\n role=\"gridcell\"\n class=\"wr-event-calendar__cell wr-event-calendar__cell--day\"\n [class.wr-event-calendar__cell--muted]=\"!cell.inMonth\"\n [class.wr-event-calendar__cell--today]=\"cell.isToday\"\n [attr.aria-label]=\"cell.label\"\n [attr.tabindex]=\"isCursor(index, -1) ? 0 : -1\"\n [attr.data-cell-date]=\"stamp(cell.date)\"\n [attr.data-cell-minutes]=\"-1\"\n [attr.data-cell-index]=\"`${index}:-1`\"\n (focusin)=\"onCellFocus(index, -1)\"\n (click)=\"onCellClick(cell.date, -1)\"\n (keydown)=\"onGridKeyDown($event)\"\n >\n <span class=\"wr-event-calendar__daynum\" aria-hidden=\"true\">{{ cell.day }}</span>\n\n @for (chip of cell.bands; track chip.key) {\n <ng-container\n [ngTemplateOutlet]=\"band\"\n [ngTemplateOutletContext]=\"{ $implicit: chip, offset: '1.75rem' }\"\n />\n }\n\n @if (cell.hidden > 0) {\n <button\n type=\"button\"\n class=\"wr-event-calendar__more\"\n [style.--wr-event-calendar-lane]=\"maxLanes()\"\n (click)=\"openDay(cell.date); $event.stopPropagation()\"\n >\n {{ moreLabel({ count: cell.hidden }) }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n} @else {\n <div\n role=\"grid\"\n class=\"wr-event-calendar__grid wr-event-calendar__grid--time\"\n [style.--wr-event-calendar-cols]=\"columns().length\"\n [attr.aria-label]=\"resolvedAriaLabel()\"\n >\n <div role=\"row\" class=\"wr-event-calendar__row\">\n <div role=\"columnheader\" class=\"wr-event-calendar__gutter\" [attr.aria-label]=\"timeLabel()\"></div>\n @for (column of columns(); track column.key) {\n <div\n role=\"columnheader\"\n class=\"wr-event-calendar__colhead\"\n [class.wr-event-calendar__colhead--today]=\"column.isToday\"\n >\n <span class=\"wr-event-calendar__colhead-weekday\">{{ column.weekday }}</span>\n <span class=\"wr-event-calendar__colhead-day\">{{ column.day }}</span>\n </div>\n }\n </div>\n\n @if (hasAllDay()) {\n <div role=\"row\" class=\"wr-event-calendar__row wr-event-calendar__row--allday\">\n <div role=\"rowheader\" class=\"wr-event-calendar__gutter\">{{ allDayLabel() }}</div>\n @for (cell of allDayCells(); track cell.key; let c = $index) {\n <div\n role=\"gridcell\"\n class=\"wr-event-calendar__cell wr-event-calendar__cell--allday\"\n [attr.aria-label]=\"cell.label\"\n [attr.tabindex]=\"isCursor(c, -1) ? 0 : -1\"\n [attr.data-cell-date]=\"stamp(cell.date)\"\n [attr.data-cell-minutes]=\"-1\"\n [attr.data-cell-index]=\"`${c}:-1`\"\n (focusin)=\"onCellFocus(c, -1)\"\n (click)=\"onCellClick(cell.date, -1)\"\n (keydown)=\"onGridKeyDown($event)\"\n >\n @for (chip of cell.bands; track chip.key) {\n <ng-container [ngTemplateOutlet]=\"band\" [ngTemplateOutletContext]=\"{ $implicit: chip, offset: '0rem' }\" />\n }\n </div>\n }\n </div>\n }\n\n @for (row of rows(); track row.key) {\n <div role=\"row\" class=\"wr-event-calendar__row\" [class.wr-event-calendar__row--major]=\"row.major\">\n <div role=\"rowheader\" class=\"wr-event-calendar__gutter\">{{ row.label }}</div>\n @for (cell of row.cells; track cell.key; let c = $index) {\n <div\n role=\"gridcell\"\n class=\"wr-event-calendar__cell wr-event-calendar__cell--slot\"\n [class.wr-event-calendar__cell--major]=\"row.major\"\n [attr.aria-label]=\"cell.label\"\n [attr.tabindex]=\"isCursor(c, row.minutes) ? 0 : -1\"\n [attr.data-cell-date]=\"stamp(cell.date)\"\n [attr.data-cell-minutes]=\"row.minutes\"\n [attr.data-cell-index]=\"`${c}:${row.minutes}`\"\n (focusin)=\"onCellFocus(c, row.minutes)\"\n (click)=\"onCellClick(cell.date, row.minutes)\"\n (keydown)=\"onGridKeyDown($event)\"\n >\n @for (chip of cell.chips; track chip.key) {\n <button\n type=\"button\"\n class=\"wr-event-calendar__chip wr-event-calendar__chip--time\"\n [class.wr-event-calendar__chip--dragging]=\"dragging() === chip.event.id\"\n [class.wr-event-calendar__chip--continues-before]=\"chip.continuesBefore\"\n [class.wr-event-calendar__chip--continues-after]=\"chip.continuesAfter\"\n [style.--wr-event-calendar-color]=\"`var(--wr-color-${chip.event.color ?? 'primary'})`\"\n [style.top.%]=\"chip.top\"\n [style.height.%]=\"chip.height\"\n [style.left.%]=\"chip.left\"\n [style.width.%]=\"chip.width\"\n [attr.aria-label]=\"chipLabel(chip.event)\"\n (click)=\"onChipClick(chip.event); $event.stopPropagation()\"\n (keydown)=\"onChipKeyDown($event, chip.event)\"\n (pointerdown)=\"onChipPointerDown($event, chip.event, 'move')\"\n >\n <span class=\"wr-event-calendar__chip-time\" aria-hidden=\"true\">{{ chipTime(chip.event) }}</span>\n @if (chipTemplate(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"{ $implicit: chip.event }\" />\n } @else {\n <span class=\"wr-event-calendar__chip-title\" aria-hidden=\"true\">{{ chip.event.title }}</span>\n }\n\n @if (canDrag(chip.event) && !chip.continuesAfter) {\n <!--\n A grab area, not a control: the same resize is on the keyboard as\n `Alt` + `Shift` + arrows on the chip itself, so exposing a second\n focusable thing here would add a tab stop that leads nowhere.\n -->\n <span\n class=\"wr-event-calendar__resize\"\n aria-hidden=\"true\"\n (pointerdown)=\"onChipPointerDown($event, chip.event, 'resize')\"\n ></span>\n }\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n}\n\n<!-- One chip shape for both day-spanning cases: month cells and the all-day band. -->\n<ng-template #band let-chip let-offset=\"offset\">\n <button\n type=\"button\"\n class=\"wr-event-calendar__chip wr-event-calendar__chip--band\"\n [class.wr-event-calendar__chip--dragging]=\"dragging() === chip.event.id\"\n [class.wr-event-calendar__chip--continues-before]=\"chip.continuesBefore\"\n [class.wr-event-calendar__chip--continues-after]=\"chip.continuesAfter\"\n [style.--wr-event-calendar-color]=\"`var(--wr-color-${chip.event.color ?? 'primary'})`\"\n [style.--wr-event-calendar-span]=\"chip.span\"\n [style.--wr-event-calendar-lane]=\"chip.lane\"\n [style.--wr-event-calendar-offset]=\"offset\"\n [attr.aria-label]=\"chipLabel(chip.event)\"\n (click)=\"onChipClick(chip.event); $event.stopPropagation()\"\n (keydown)=\"onChipKeyDown($event, chip.event)\"\n (pointerdown)=\"onChipPointerDown($event, chip.event, 'move')\"\n >\n @if (chipTemplate(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"{ $implicit: chip.event }\" />\n } @else {\n <span class=\"wr-event-calendar__chip-title\" aria-hidden=\"true\">{{ chip.event.title }}</span>\n }\n </button>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { ComponentHarness, HarnessPredicate } from '@angular/cdk/testing';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @license
|
|
5
|
+
*
|
|
6
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
7
|
+
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
8
|
+
*/
|
|
9
|
+
/** Read one declaration out of an inline `style` attribute, or `null` when it is not there. */
|
|
10
|
+
function inlineStyle(style, property) {
|
|
11
|
+
for (const declaration of (style ?? '').split(';')) {
|
|
12
|
+
const colon = declaration.indexOf(':');
|
|
13
|
+
if (colon === -1)
|
|
14
|
+
continue;
|
|
15
|
+
if (declaration.slice(0, colon).trim() !== property)
|
|
16
|
+
continue;
|
|
17
|
+
return declaration.slice(colon + 1).trim();
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Test harness for `<wr-falling-text>`.
|
|
23
|
+
*
|
|
24
|
+
* **The assertion that matters here is that the animation did not eat the text.** The
|
|
25
|
+
* component cuts the sentence into one span per word so a physics loop can throw them
|
|
26
|
+
* around, and {@link getText} is the check that a screen reader still gets prose out of
|
|
27
|
+
* the other end. It normalises whitespace on the way, because the separators are real
|
|
28
|
+
* ` ` characters rather than plain spaces — so `textContent` is never byte-identical
|
|
29
|
+
* to the `[text]` input, and a spec comparing the two raw would fail on a component that
|
|
30
|
+
* works perfectly.
|
|
31
|
+
*
|
|
32
|
+
* The rest of the readable surface is the split itself: {@link getWords} pins the rule
|
|
33
|
+
* (split on spaces, empty tokens dropped) and {@link getHighlightedWords} pins the
|
|
34
|
+
* prefix match, which is genuine logic — `grav` highlights `gravity`, and a whole-word
|
|
35
|
+
* implementation would satisfy every naive test but not this one.
|
|
36
|
+
*
|
|
37
|
+
* **Nothing positional is offered, and that is not a jsdom concession.** The words'
|
|
38
|
+
* `transform` values are one frame of a loop that never stops, seeded by `Math.random()`,
|
|
39
|
+
* so they are not reproducible even in a real browser; there is no rest state to call
|
|
40
|
+
* settled; the drag path needs `setPointerCapture` and AABB hit-testing over boxes that
|
|
41
|
+
* a unit test measures as 0×0 at the origin, where every word contains every point. Nor
|
|
42
|
+
* is `[gravity]` or `[trigger]` readable — neither reaches the DOM, and answering them
|
|
43
|
+
* would mean reaching into the component instance. There is no `isReducedMotion()`
|
|
44
|
+
* either: under reduced motion the component simply returns before touching anything, so
|
|
45
|
+
* the only honest proxy is {@link hasReleased}, which reports what it did rather than
|
|
46
|
+
* what it was told.
|
|
47
|
+
*
|
|
48
|
+
* **{@link hasReleased} and {@link release} have a precondition, and without it they are
|
|
49
|
+
* worthless.** The simulator measures the host and each word before it starts, and bails
|
|
50
|
+
* on a zero-sized box — which is every box in a test with no layout. So the spec has to
|
|
51
|
+
* give them one, and it has to do it BEFORE the trigger fires: the component marks itself
|
|
52
|
+
* started on the way past that guard, and the trigger listener is `{ once: true }`, so a
|
|
53
|
+
* failed first attempt is permanent.
|
|
54
|
+
*
|
|
55
|
+
* ```ts
|
|
56
|
+
* // In your spec, on a fixture mounted with trigger="click", before calling release():
|
|
57
|
+
* const box = { width: 300, height: 120, left: 0, top: 0, right: 300, bottom: 120 } as DOMRect;
|
|
58
|
+
* for (const el of fixture.nativeElement.querySelectorAll('wr-falling-text, .wr-falling-text__word')) {
|
|
59
|
+
* el.getBoundingClientRect = () => box;
|
|
60
|
+
* }
|
|
61
|
+
* ```
|
|
62
|
+
*
|
|
63
|
+
* Assert `hasReleased()` is `true` in that control case before you assert it is `false`
|
|
64
|
+
* anywhere else, or a spec proves only that the guard fired.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```ts
|
|
68
|
+
* const loader = TestbedHarnessEnvironment.loader(fixture);
|
|
69
|
+
* const text = await loader.getHarness(WrFallingTextHarness);
|
|
70
|
+
*
|
|
71
|
+
* expect(await text.getText()).toBe('gravity pulls every word down');
|
|
72
|
+
* expect(await text.getHighlightedWords()).toEqual(['gravity']);
|
|
73
|
+
* ```
|
|
74
|
+
*
|
|
75
|
+
* @see https://ngwr.dev/guides/testing
|
|
76
|
+
*/
|
|
77
|
+
class WrFallingTextHarness extends ComponentHarness {
|
|
78
|
+
static hostSelector = 'wr-falling-text';
|
|
79
|
+
/** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
|
|
80
|
+
static with(options = {}) {
|
|
81
|
+
return new HarnessPredicate(WrFallingTextHarness, options).addOption('text', options.text, (harness, text) => HarnessPredicate.stringMatches(harness.getText(), text));
|
|
82
|
+
}
|
|
83
|
+
wordEls = this.locatorForAll('.wr-falling-text__word');
|
|
84
|
+
/**
|
|
85
|
+
* The whole sentence, as a screen reader reads it: whitespace collapsed and trimmed.
|
|
86
|
+
*
|
|
87
|
+
* The one assertion worth making about a component that dismantles a paragraph. The
|
|
88
|
+
* words are separated by `.wr-falling-text__space` spans holding U+00A0, so this
|
|
89
|
+
* collapses them back to ordinary spaces — losing those spans would be invisible to
|
|
90
|
+
* every other check here while turning the announcement into one run-on word.
|
|
91
|
+
*
|
|
92
|
+
* DOM order never changes once the physics starts. The words are absolutely positioned
|
|
93
|
+
* and scattered on screen, but they are still read in the order they were typeset, so
|
|
94
|
+
* this answers the same before and after {@link release}.
|
|
95
|
+
*/
|
|
96
|
+
async getText() {
|
|
97
|
+
return (await (await this.host()).text()).replace(/\s+/g, ' ').trim();
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Each word, in DOM order.
|
|
101
|
+
*
|
|
102
|
+
* Pins the split rule: on a literal space, with empty tokens dropped. Each of these is
|
|
103
|
+
* also one body in the simulator, so the length is the body count — which is why there
|
|
104
|
+
* is no separate `getWordCount()`, a method that would invite asserting how many
|
|
105
|
+
* without asserting which.
|
|
106
|
+
*/
|
|
107
|
+
async getWords() {
|
|
108
|
+
return Promise.all((await this.wordEls()).map(word => word.text()));
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The words carrying the highlight, in DOM order.
|
|
112
|
+
*
|
|
113
|
+
* `[highlightWords]` is matched as a PREFIX and case-sensitively, so `['grav']` picks
|
|
114
|
+
* up `gravity` and `['Grav']` picks up nothing. The highlight is colour alone with no
|
|
115
|
+
* non-visual counterpart, which is acceptable only because it adds no meaning the
|
|
116
|
+
* sentence does not already carry.
|
|
117
|
+
*/
|
|
118
|
+
async getHighlightedWords() {
|
|
119
|
+
return Promise.all((await this.locatorForAll('.wr-falling-text__word--hl')()).map(word => word.text()));
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Whether one word is highlighted — for asserting a keyword without depending on the
|
|
123
|
+
* order or the completeness of the whole list.
|
|
124
|
+
*
|
|
125
|
+
* Takes the word as it is rendered, not the keyword that matched it: ask for `gravity`,
|
|
126
|
+
* not for `grav`. Throws for a word the sentence does not contain, since `false` there
|
|
127
|
+
* would read as "present and not highlighted" and quietly survive a typo. A word that
|
|
128
|
+
* appears twice is answered once, which is safe — matching is on the text alone, so
|
|
129
|
+
* both copies always agree.
|
|
130
|
+
*/
|
|
131
|
+
async isHighlighted(word) {
|
|
132
|
+
const words = await this.wordEls();
|
|
133
|
+
const texts = await Promise.all(words.map(el => el.text()));
|
|
134
|
+
const index = texts.indexOf(word);
|
|
135
|
+
if (index === -1) {
|
|
136
|
+
throw new Error(`WrFallingTextHarness.isHighlighted(): there is no word "${word}" in "${await this.getText()}". The text ` +
|
|
137
|
+
'is split on spaces, so ask for a single word rather than a phrase, and for the word as rendered ' +
|
|
138
|
+
'rather than the prefix that highlights it.');
|
|
139
|
+
}
|
|
140
|
+
return words[index].hasClass('wr-falling-text__word--hl');
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* The font size as the consumer wrote it — `'2rem'`, not `'32px'`.
|
|
144
|
+
*
|
|
145
|
+
* Read off the inline `style` attribute rather than through `getCssValue()`. The two
|
|
146
|
+
* agree here and would part company in a real browser, which resolves `font-size` to
|
|
147
|
+
* pixels; `[fontSize]` takes a CSS length and handing back a different unit than the
|
|
148
|
+
* one that went in is the sort of green unit test that hides a broken assertion.
|
|
149
|
+
*
|
|
150
|
+
* Throws when nothing is written, which takes an empty `[fontSize]` — the component
|
|
151
|
+
* writes this on every render otherwise, default included.
|
|
152
|
+
*/
|
|
153
|
+
async getFontSize() {
|
|
154
|
+
const words = await this.locatorFor('.wr-falling-text__words')();
|
|
155
|
+
const size = inlineStyle(await words.getAttribute('style'), 'font-size');
|
|
156
|
+
if (size === null) {
|
|
157
|
+
throw new Error('WrFallingTextHarness.getFontSize(): the words carry no inline font-size. The component writes one from ' +
|
|
158
|
+
'[fontSize] on every render — an empty string is the only binding that removes it, and it leaves the ' +
|
|
159
|
+
'text at whatever the page inherits.');
|
|
160
|
+
}
|
|
161
|
+
return size;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Whether the simulator has taken the words over.
|
|
165
|
+
*
|
|
166
|
+
* Reads the `position: absolute` the component writes onto every word before its first
|
|
167
|
+
* frame — a value it wrote itself, not a measurement, and the only difference in the
|
|
168
|
+
* DOM between "the physics is running" and "the words are still in normal flow". That
|
|
169
|
+
* makes it the way to observe the trigger contract and the reduced-motion escape, since
|
|
170
|
+
* neither leaves anything else behind.
|
|
171
|
+
*
|
|
172
|
+
* **It is `false` by default in a test, for a reason that has nothing to do with the
|
|
173
|
+
* component.** Without layout every box measures 0×0 and the simulator refuses to start
|
|
174
|
+
* — see this class's docs for the stub, and assert a `true` before you trust a `false`.
|
|
175
|
+
*
|
|
176
|
+
* Throws for a component rendering no words at all, where the question does not apply.
|
|
177
|
+
*/
|
|
178
|
+
async hasReleased() {
|
|
179
|
+
const words = await this.wordEls();
|
|
180
|
+
if (words.length === 0) {
|
|
181
|
+
throw new Error('WrFallingTextHarness.hasReleased(): there are no words. Empty [text] renders nothing, and the simulator ' +
|
|
182
|
+
'has nothing to take over — check getWords() instead.');
|
|
183
|
+
}
|
|
184
|
+
return inlineStyle(await words[0].getAttribute('style'), 'position') === 'absolute';
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Fire the events a `click` or `hover` trigger is waiting for.
|
|
188
|
+
*
|
|
189
|
+
* Both, because the harness cannot tell which one it is: `[trigger]` never reaches the
|
|
190
|
+
* DOM. The component consumes at most one — its listener is registered `{ once: true }`
|
|
191
|
+
* and the simulator refuses to start twice — so this is safe to call whatever the
|
|
192
|
+
* trigger is, and safe to call again.
|
|
193
|
+
*
|
|
194
|
+
* It does nothing for `auto`, which released on mount, and nothing for `scroll`, which
|
|
195
|
+
* waits on an `IntersectionObserver`: jsdom has none, so a spec has to stub the global
|
|
196
|
+
* and fire the callback itself. Same precondition as {@link hasReleased} — stub the
|
|
197
|
+
* boxes BEFORE calling this, because a start that bails on a zero-sized host still
|
|
198
|
+
* burns the trigger.
|
|
199
|
+
*
|
|
200
|
+
* Both are dispatched as bare events rather than through the harness's `click()` and
|
|
201
|
+
* `hover()` helpers, which would bring a whole pointer sequence with them. Released
|
|
202
|
+
* words listen for `pointerdown` so they can be picked up and thrown, and that handler
|
|
203
|
+
* calls `setPointerCapture` — which a unit environment does not implement, so the
|
|
204
|
+
* realistic version of this method would throw the moment the simulator was running.
|
|
205
|
+
*/
|
|
206
|
+
async release() {
|
|
207
|
+
const host = await this.host();
|
|
208
|
+
await host.dispatchEvent('click');
|
|
209
|
+
await host.dispatchEvent('mouseenter');
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Generated bundle index. Do not edit.
|
|
215
|
+
*/
|
|
216
|
+
|
|
217
|
+
export { WrFallingTextHarness };
|
|
218
|
+
//# sourceMappingURL=ngwr-falling-text-testing.mjs.map
|