@masmarino/gabarit 2.1.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/fesm2022/masmarino-gabarit-app-shell.mjs +2 -2
  2. package/fesm2022/masmarino-gabarit-app-shell.mjs.map +1 -1
  3. package/fesm2022/masmarino-gabarit-autocomplete.mjs +7 -9
  4. package/fesm2022/masmarino-gabarit-autocomplete.mjs.map +1 -1
  5. package/fesm2022/masmarino-gabarit-avatar-group.mjs +5 -2
  6. package/fesm2022/masmarino-gabarit-avatar-group.mjs.map +1 -1
  7. package/fesm2022/masmarino-gabarit-date-picker.mjs +9 -5
  8. package/fesm2022/masmarino-gabarit-date-picker.mjs.map +1 -1
  9. package/fesm2022/masmarino-gabarit-docs.mjs +5 -1
  10. package/fesm2022/masmarino-gabarit-docs.mjs.map +1 -1
  11. package/fesm2022/masmarino-gabarit-floating-panel.mjs +12 -1
  12. package/fesm2022/masmarino-gabarit-floating-panel.mjs.map +1 -1
  13. package/fesm2022/masmarino-gabarit-menu.mjs +5 -2
  14. package/fesm2022/masmarino-gabarit-menu.mjs.map +1 -1
  15. package/fesm2022/masmarino-gabarit-popover.mjs +5 -2
  16. package/fesm2022/masmarino-gabarit-popover.mjs.map +1 -1
  17. package/fesm2022/masmarino-gabarit-select.mjs +5 -3
  18. package/fesm2022/masmarino-gabarit-select.mjs.map +1 -1
  19. package/fesm2022/masmarino-gabarit-tooltip.mjs +5 -2
  20. package/fesm2022/masmarino-gabarit-tooltip.mjs.map +1 -1
  21. package/fesm2022/masmarino-gabarit.mjs +1 -1
  22. package/fesm2022/masmarino-gabarit.mjs.map +1 -1
  23. package/package.json +1 -1
  24. package/types/masmarino-gabarit-autocomplete.d.ts +1 -0
  25. package/types/masmarino-gabarit-avatar-group.d.ts +1 -0
  26. package/types/masmarino-gabarit-date-picker.d.ts +2 -0
  27. package/types/masmarino-gabarit-floating-panel.d.ts +8 -1
  28. package/types/masmarino-gabarit-menu.d.ts +1 -0
  29. package/types/masmarino-gabarit-popover.d.ts +1 -0
  30. package/types/masmarino-gabarit-select.d.ts +1 -0
  31. package/types/masmarino-gabarit-tooltip.d.ts +1 -0
  32. package/types/masmarino-gabarit.d.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"masmarino-gabarit-date-picker.mjs","names":[],"sources":["../../../projects/gabarit/date-picker/date-picker-calendar.ts","../../../projects/gabarit/date-picker/calendar-panel.ts","../../../projects/gabarit/date-picker/date-picker.ts","../../../projects/gabarit/date-picker/date-picker.html","../../../projects/gabarit/date-picker/date-range-picker/date-range-picker.ts","../../../projects/gabarit/date-picker/date-range-picker/date-range-picker.html"],"sourcesContent":["export type WeekStartsOn = 0 | 1\n\nexport interface CalendarDay {\n date: Date\n inCurrentMonth: boolean\n isToday: boolean\n}\n\nexport function isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n )\n}\n\nexport function addMonths(date: Date, delta: number): Date {\n const day = date.getDate()\n const firstOfTarget = new Date(date.getFullYear(), date.getMonth() + delta, 1)\n const daysInTarget = new Date(\n firstOfTarget.getFullYear(),\n firstOfTarget.getMonth() + 1,\n 0,\n ).getDate()\n return new Date(\n firstOfTarget.getFullYear(),\n firstOfTarget.getMonth(),\n Math.min(day, daysInTarget),\n )\n}\n\nexport function addYears(date: Date, delta: number): Date {\n return addMonths(date, delta * 12)\n}\n\nexport function shiftDays(date: Date, delta: number): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + delta)\n}\n\nexport function startOfWeek(date: Date, weekStartsOn: WeekStartsOn): Date {\n const weekday = date.getDay()\n const diff = (weekday - weekStartsOn + 7) % 7\n const result = new Date(date.getFullYear(), date.getMonth(), date.getDate())\n result.setDate(result.getDate() - diff)\n return result\n}\n\nexport function endOfWeek(date: Date, weekStartsOn: WeekStartsOn): Date {\n const start = startOfWeek(date, weekStartsOn)\n start.setDate(start.getDate() + 6)\n return start\n}\n\nexport function buildCalendarGrid(\n year: number,\n month: number,\n weekStartsOn: WeekStartsOn,\n): CalendarDay[] {\n const firstOfMonth = new Date(year, month, 1)\n const gridStart = startOfWeek(firstOfMonth, weekStartsOn)\n const today = new Date()\n\n const days: CalendarDay[] = []\n for (let i = 0; i < 42; i++) {\n const date = new Date(gridStart.getFullYear(), gridStart.getMonth(), gridStart.getDate() + i)\n days.push({\n date,\n inCurrentMonth: date.getMonth() === month,\n isToday: isSameDay(date, today),\n })\n }\n return days\n}\n\nexport function weekdayLabels(locale: string, weekStartsOn: WeekStartsOn): string[] {\n const formatter = new Intl.DateTimeFormat(locale, { weekday: 'short' })\n const reference = new Date(2024, 0, 7 + weekStartsOn)\n return Array.from({ length: 7 }, (_, i) => {\n const date = new Date(reference.getFullYear(), reference.getMonth(), reference.getDate() + i)\n return formatter.format(date)\n })\n}\n","import { ElementRef, Injector, afterNextRender, computed, signal } from '@angular/core'\nimport { floatingPanelAnchor } from '@masmarino/gabarit/floating-panel'\nimport {\n CalendarDay,\n WeekStartsOn,\n addMonths,\n addYears,\n buildCalendarGrid,\n endOfWeek,\n isSameDay,\n shiftDays,\n startOfWeek,\n weekdayLabels as computeWeekdayLabels,\n} from './date-picker-calendar'\n\nexport interface CalendarPanelView {\n year: number\n month: number\n label: string\n weeks: CalendarDay[][]\n}\n\nexport interface CalendarPanelDeps {\n elementRef: ElementRef<HTMLElement>\n injector: Injector\n triggerSelector: string\n locale: () => string\n weekStartsOn: () => WeekStartsOn\n visibleMonths: () => number\n minYear: () => number\n maxYear: () => number\n onTouched: () => void\n}\n\nexport type NavigationResult = 'month-changed' | 'day-changed' | 'unhandled'\n\n/** Panel and calendar-grid mechanics shared by `DatePicker` and `DateRangePicker`; one instance per component. */\nexport class CalendarPanel {\n readonly open = signal(false)\n readonly anchorDate = signal<Date>(new Date())\n readonly focusedDate = signal<Date>(new Date())\n readonly panelStyle = signal<{ top: string; left: string } | null>(null)\n\n readonly monthViews = computed<CalendarPanelView[]>(() => {\n const anchor = this.anchorDate()\n const count = this.deps.visibleMonths()\n const formatter = new Intl.DateTimeFormat(this.deps.locale(), {\n month: 'long',\n year: 'numeric',\n })\n const views = Array.from({ length: count }, (_, i) => {\n const monthDate = new Date(anchor.getFullYear(), anchor.getMonth() + i, 1)\n const year = monthDate.getFullYear()\n const month = monthDate.getMonth()\n const days = buildCalendarGrid(year, month, this.deps.weekStartsOn())\n const weeks: CalendarDay[][] = []\n for (let d = 0; d < days.length; d += 7) {\n weeks.push(days.slice(d, d + 7))\n }\n return { year, month, label: formatter.format(monthDate), weeks }\n })\n const neededWeeks = views.map((view) => {\n let last = view.weeks.length\n while (last > 1 && view.weeks[last - 1].every((day) => !day.inCurrentMonth)) {\n last--\n }\n return last\n })\n const sharedWeeks = Math.max(...neededWeeks)\n return views.map((view) => ({ ...view, weeks: view.weeks.slice(0, sharedWeeks) }))\n })\n\n readonly panelLabel = computed(() => {\n const views = this.monthViews()\n return views.length === 1\n ? views[0].label\n : `${views[0].label} – ${views[views.length - 1].label}`\n })\n\n readonly weekdayLabels = computed(() =>\n computeWeekdayLabels(this.deps.locale(), this.deps.weekStartsOn()),\n )\n\n readonly monthOptions = computed(() => {\n const formatter = new Intl.DateTimeFormat(this.deps.locale(), { month: 'long' })\n return Array.from({ length: 12 }, (_, i) => ({\n value: i,\n label: formatter.format(new Date(2024, i, 1)),\n }))\n })\n\n readonly yearOptions = computed(() => {\n const min = this.deps.minYear()\n const max = this.deps.maxYear()\n return Array.from({ length: max - min + 1 }, (_, i) => min + i)\n })\n\n constructor(private readonly deps: CalendarPanelDeps) {}\n\n cellId(date: Date): string {\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(\n date.getDate(),\n ).padStart(2, '0')}`\n }\n\n isFocused(date: Date): boolean {\n return isSameDay(this.focusedDate(), date)\n }\n\n toggle(onOpen: () => Date): void {\n this.open.update((value) => !value)\n if (this.open()) {\n const target = onOpen()\n this.focusedDate.set(target)\n this.anchorDate.set(new Date(target.getFullYear(), target.getMonth(), 1))\n this.updatePanelPosition()\n this.focusCellAfterRender()\n } else {\n this.deps.onTouched()\n }\n }\n\n close(returnFocus: boolean): void {\n if (!this.open()) {\n return\n }\n this.open.set(false)\n this.deps.onTouched()\n if (returnFocus) {\n this.trigger()?.focus()\n }\n }\n\n shiftMonth(delta: number): void {\n this.anchorDate.set(addMonths(this.anchorDate(), delta))\n this.focusedDate.set(addMonths(this.focusedDate(), delta))\n this.updatePanelPosition()\n this.focusCellAfterRender()\n }\n\n onMonthSelect(value: string): void {\n this.setAnchorMonth(this.anchorDate().getFullYear(), Number(value))\n }\n\n onYearSelect(value: string): void {\n this.setAnchorMonth(Number(value), this.anchorDate().getMonth())\n }\n\n private setAnchorMonth(year: number, month: number): void {\n const dayOfMonth = this.focusedDate().getDate()\n const daysInTarget = new Date(year, month + 1, 0).getDate()\n this.anchorDate.set(new Date(year, month, 1))\n this.focusedDate.set(new Date(year, month, Math.min(dayOfMonth, daysInTarget)))\n this.updatePanelPosition()\n this.focusCellAfterRender()\n }\n\n handleNavigationKeydown(event: KeyboardEvent): NavigationResult {\n const current = this.focusedDate()\n if (event.key === 'PageDown' || event.key === 'PageUp') {\n event.preventDefault()\n const delta = event.key === 'PageDown' ? 1 : -1\n if (event.shiftKey) {\n this.anchorDate.set(addYears(this.anchorDate(), delta))\n this.focusedDate.set(addYears(current, delta))\n } else {\n this.anchorDate.set(addMonths(this.anchorDate(), delta))\n this.focusedDate.set(addMonths(current, delta))\n }\n this.updatePanelPosition()\n this.focusCellAfterRender()\n return 'month-changed'\n }\n const next = this.nextFocusedDate(current, event)\n if (next === null) {\n return 'unhandled'\n }\n event.preventDefault()\n this.ensureVisible(next)\n this.focusedDate.set(next)\n this.focusCellAfterRender()\n return 'day-changed'\n }\n\n private nextFocusedDate(current: Date, event: KeyboardEvent): Date | null {\n switch (event.key) {\n case 'ArrowRight':\n return shiftDays(current, 1)\n case 'ArrowLeft':\n return shiftDays(current, -1)\n case 'ArrowDown':\n return shiftDays(current, 7)\n case 'ArrowUp':\n return shiftDays(current, -7)\n case 'Home':\n return startOfWeek(current, this.deps.weekStartsOn())\n case 'End':\n return endOfWeek(current, this.deps.weekStartsOn())\n default:\n return null\n }\n }\n\n ensureVisible(date: Date): void {\n const anchor = this.anchorDate()\n const visibleMonths = this.deps.visibleMonths()\n const monthsDiff =\n (date.getFullYear() - anchor.getFullYear()) * 12 + (date.getMonth() - anchor.getMonth())\n if (monthsDiff < 0) {\n this.anchorDate.set(new Date(date.getFullYear(), date.getMonth(), 1))\n } else if (monthsDiff >= visibleMonths) {\n this.anchorDate.set(addMonths(anchor, monthsDiff - visibleMonths + 1))\n }\n }\n\n onEscape(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.open()) {\n event.preventDefault()\n event.stopPropagation()\n this.close(true)\n }\n }\n\n handleClickOutside(event: MouseEvent): void {\n if (this.open() && !this.deps.elementRef.nativeElement.contains(event.target as Node)) {\n this.close(false)\n }\n }\n\n updatePanelPosition(): void {\n const anchor = floatingPanelAnchor(this.open(), this.trigger())\n if (anchor) {\n this.panelStyle.set({ top: `${anchor.bottom}px`, left: `${anchor.left}px` })\n }\n }\n\n private trigger(): HTMLButtonElement | null {\n return this.deps.elementRef.nativeElement.querySelector(this.deps.triggerSelector)\n }\n\n focusCellAfterRender(): void {\n afterNextRender(\n () => {\n const id = this.cellId(this.focusedDate())\n const host = this.deps.elementRef.nativeElement\n host.querySelector<HTMLElement>(`[data-date=\"${id}\"]`)?.focus()\n },\n { injector: this.deps.injector },\n )\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n input,\n signal,\n} from '@angular/core'\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'\nimport { Icon } from '@masmarino/gabarit/icon'\nimport { CalendarPanel, type CalendarPanelView } from './calendar-panel'\nimport { CalendarDay, WeekStartsOn, isSameDay } from './date-picker-calendar'\n\nexport type DatePickerVisibleMonths = 1 | 2\n\nexport type DatePickerMonthView = CalendarPanelView\n\nlet nextDatePickerId = 0\n\nconst CURRENT_YEAR = new Date().getFullYear()\n\n@Component({\n selector: 'gbt-date-picker',\n standalone: true,\n imports: [Icon],\n templateUrl: './date-picker.html',\n styleUrl: './date-picker.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(document:click)': 'handleClickOutside($event)',\n '(keydown)': 'onEscape($event)',\n '(window:scroll)': 'updatePanelPosition()',\n '(window:resize)': 'updatePanelPosition()',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DatePicker),\n multi: true,\n },\n ],\n})\nexport class DatePicker implements ControlValueAccessor {\n private readonly elementRef = inject(ElementRef)\n private readonly injector = inject(Injector)\n\n id = input<string>(`gbt-date-picker-${++nextDatePickerId}`)\n label = input<string>('')\n placeholder = input<string>('Select a date…')\n locale = input<string>('en-US')\n weekStartsOn = input<WeekStartsOn>(1)\n disabled = input(false, { transform: booleanAttribute })\n required = input(false, { transform: booleanAttribute })\n errorMessage = input<string | null>(null)\n previousMonthLabel = input<string>('Previous month')\n nextMonthLabel = input<string>('Next month')\n clearable = input(false, { transform: booleanAttribute })\n clearLabel = input<string>('Clear date')\n visibleMonths = input<DatePickerVisibleMonths>(1)\n monthSelectLabel = input<string>('Month')\n yearSelectLabel = input<string>('Year')\n minYear = input<number>(CURRENT_YEAR - 100)\n maxYear = input<number>(CURRENT_YEAR + 10)\n\n private readonly panel = new CalendarPanel({\n elementRef: this.elementRef,\n injector: this.injector,\n triggerSelector: '.gbt-date-picker__trigger',\n locale: () => this.locale(),\n weekStartsOn: () => this.weekStartsOn(),\n visibleMonths: () => this.visibleMonths(),\n minYear: () => this.minYear(),\n maxYear: () => this.maxYear(),\n onTouched: () => this.onTouched(),\n })\n\n protected readonly open = this.panel.open\n protected readonly selected = signal<Date | null>(null)\n protected readonly focusedDate = this.panel.focusedDate\n protected readonly anchorDate = this.panel.anchorDate\n protected readonly panelStyle = this.panel.panelStyle\n\n private readonly formDisabled = signal(false)\n private onChange: (value: Date | null) => void = () => {}\n private onTouched: () => void = () => {}\n\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled())\n protected readonly showClear = computed(\n () => this.clearable() && this.selected() !== null && !this.isDisabled(),\n )\n\n protected readonly monthViews = this.panel.monthViews\n protected readonly panelLabel = this.panel.panelLabel\n protected readonly weekdayLabels = this.panel.weekdayLabels\n protected readonly monthOptions = this.panel.monthOptions\n protected readonly yearOptions = this.panel.yearOptions\n\n protected readonly triggerLabel = computed(() => {\n const value = this.selected()\n return value\n ? new Intl.DateTimeFormat(this.locale(), { dateStyle: 'medium' }).format(value)\n : ''\n })\n\n writeValue(value: Date | null): void {\n this.selected.set(value)\n if (value) {\n this.focusedDate.set(value)\n this.anchorDate.set(new Date(value.getFullYear(), value.getMonth(), 1))\n }\n }\n\n registerOnChange(fn: (value: Date | null) => void): void {\n this.onChange = fn\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.formDisabled.set(isDisabled)\n }\n\n protected isSelected(date: Date): boolean {\n const value = this.selected()\n return value !== null && isSameDay(value, date)\n }\n\n protected isFocused(date: Date): boolean {\n return this.panel.isFocused(date)\n }\n\n protected cellId(date: Date): string {\n return this.panel.cellId(date)\n }\n\n protected toggleOpen(): void {\n if (this.isDisabled()) {\n return\n }\n this.panel.toggle(() => this.selected() ?? new Date())\n }\n\n protected close(returnFocus: boolean): void {\n this.panel.close(returnFocus)\n }\n\n protected clear(event: Event): void {\n event.stopPropagation()\n if (this.isDisabled()) {\n return\n }\n this.selected.set(null)\n this.onChange(null)\n this.onTouched()\n this.panel.close(false)\n }\n\n protected selectDay(day: CalendarDay): void {\n if (this.isDisabled()) {\n return\n }\n this.selected.set(day.date)\n this.focusedDate.set(day.date)\n this.panel.ensureVisible(day.date)\n this.onChange(day.date)\n this.panel.close(true)\n }\n\n protected shiftMonth(delta: number): void {\n this.panel.shiftMonth(delta)\n }\n\n protected onMonthSelect(value: string): void {\n this.panel.onMonthSelect(value)\n }\n\n protected onYearSelect(value: string): void {\n this.panel.onYearSelect(value)\n }\n\n protected onGridKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n const current = this.focusedDate()\n this.selectDay({\n date: current,\n inCurrentMonth: true,\n isToday: isSameDay(current, new Date()),\n })\n return\n }\n this.panel.handleNavigationKeydown(event)\n }\n\n protected onEscape(event: KeyboardEvent): void {\n this.panel.onEscape(event)\n }\n\n protected handleClickOutside(event: MouseEvent): void {\n this.panel.handleClickOutside(event)\n }\n\n protected updatePanelPosition(): void {\n this.panel.updatePanelPosition()\n }\n}\n","<div class=\"gbt-date-picker\">\n @if (label()) {\n <label [for]=\"id()\" class=\"gbt-date-picker__label\"\n >{{ label() }}{{ required() ? ' *' : '' }}</label\n >\n }\n <div class=\"gbt-date-picker__field\">\n <button\n type=\"button\"\n [id]=\"id()\"\n class=\"gbt-date-picker__trigger\"\n [class.gbt-date-picker__trigger--open]=\"open()\"\n [disabled]=\"isDisabled()\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-invalid]=\"errorMessage() ? true : null\"\n [attr.aria-describedby]=\"errorMessage() ? id() + '-error' : null\"\n (click)=\"toggleOpen()\"\n >\n <span\n class=\"gbt-date-picker__trigger-label\"\n [class.gbt-date-picker__trigger-label--placeholder]=\"!triggerLabel()\"\n >\n {{ triggerLabel() || placeholder() }}\n </span>\n </button>\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"gbt-date-picker__clear\"\n [attr.aria-label]=\"clearLabel()\"\n (click)=\"clear($event)\"\n >\n <gbt-icon name=\"x\" aria-hidden=\"true\" />\n </button>\n } @else {\n <gbt-icon name=\"calendar\" class=\"gbt-date-picker__icon\" aria-hidden=\"true\" />\n }\n </div>\n @if (open() && panelStyle(); as pos) {\n <div\n class=\"gbt-date-picker__panel\"\n role=\"dialog\"\n aria-modal=\"false\"\n [attr.aria-label]=\"panelLabel()\"\n [style.top]=\"pos.top\"\n [style.left]=\"pos.left\"\n >\n <div class=\"gbt-date-picker__nav\">\n <button\n type=\"button\"\n class=\"gbt-date-picker__nav-button\"\n [attr.aria-label]=\"previousMonthLabel()\"\n (click)=\"shiftMonth(-1)\"\n >\n <gbt-icon name=\"chevron-left\" aria-hidden=\"true\" />\n </button>\n <div class=\"gbt-date-picker__headings\">\n @for (view of monthViews(); track view.year + '-' + view.month; let i = $index) {\n <div class=\"gbt-date-picker__month-heading\">\n @if (i === 0) {\n <select\n #monthSelect\n class=\"gbt-date-picker__select\"\n [attr.aria-label]=\"monthSelectLabel()\"\n (change)=\"onMonthSelect(monthSelect.value)\"\n >\n @for (opt of monthOptions(); track opt.value) {\n <option [value]=\"opt.value\" [selected]=\"opt.value === anchorDate().getMonth()\">\n {{ opt.label }}\n </option>\n }\n </select>\n <select\n #yearSelect\n class=\"gbt-date-picker__select\"\n [attr.aria-label]=\"yearSelectLabel()\"\n (change)=\"onYearSelect(yearSelect.value)\"\n >\n @for (year of yearOptions(); track year) {\n <option [value]=\"year\" [selected]=\"year === anchorDate().getFullYear()\">\n {{ year }}\n </option>\n }\n </select>\n } @else {\n <span class=\"gbt-date-picker__month-label\">{{ view.label }}</span>\n }\n </div>\n }\n </div>\n <button\n type=\"button\"\n class=\"gbt-date-picker__nav-button\"\n [attr.aria-label]=\"nextMonthLabel()\"\n (click)=\"shiftMonth(1)\"\n >\n <gbt-icon name=\"chevron-right\" aria-hidden=\"true\" />\n </button>\n </div>\n <div class=\"gbt-date-picker__months\">\n @for (view of monthViews(); track view.year + '-' + view.month) {\n <div class=\"gbt-date-picker__month\">\n <div\n class=\"gbt-date-picker__grid\"\n role=\"grid\"\n tabindex=\"-1\"\n [attr.aria-label]=\"view.label\"\n (keydown)=\"onGridKeydown($event)\"\n >\n <div class=\"gbt-date-picker__row gbt-date-picker__row--head\" role=\"row\">\n @for (wd of weekdayLabels(); track $index) {\n <span role=\"columnheader\" class=\"gbt-date-picker__weekday\">{{ wd }}</span>\n }\n </div>\n @for (week of view.weeks; track $index) {\n <div class=\"gbt-date-picker__row\" role=\"row\">\n @for (day of week; track day.date.getTime()) {\n @if (day.inCurrentMonth) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"gbt-date-picker__day\"\n [class.gbt-date-picker__day--today]=\"day.isToday\"\n [class.gbt-date-picker__day--selected]=\"isSelected(day.date)\"\n [attr.data-date]=\"cellId(day.date)\"\n [attr.aria-selected]=\"isSelected(day.date)\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [tabIndex]=\"isFocused(day.date) ? 0 : -1\"\n (click)=\"selectDay(day)\"\n >\n {{ day.date.getDate() }}\n </button>\n } @else {\n <span\n role=\"gridcell\"\n class=\"gbt-date-picker__day gbt-date-picker__day--empty\"\n ></span>\n }\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n @if (errorMessage()) {\n <p [id]=\"id() + '-error'\" class=\"gbt-date-picker__error\" role=\"alert\">{{ errorMessage() }}</p>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n input,\n signal,\n} from '@angular/core'\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'\nimport { Icon } from '@masmarino/gabarit/icon'\nimport { CalendarPanel, type CalendarPanelView } from '../calendar-panel'\nimport { WeekStartsOn, isSameDay } from '../date-picker-calendar'\n\nexport type DateRangeVisibleMonths = 1 | 2\n\nexport interface DateRangeValue {\n start: Date\n end: Date | null\n}\n\nexport type DateRangePickerMonthView = CalendarPanelView\n\nlet nextId = 0\n\nconst CURRENT_YEAR = new Date().getFullYear()\n\n@Component({\n selector: 'gbt-date-range-picker',\n standalone: true,\n imports: [Icon],\n templateUrl: './date-range-picker.html',\n styleUrl: './date-range-picker.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(document:click)': 'handleClickOutside($event)',\n '(keydown)': 'onEscape($event)',\n '(window:scroll)': 'updatePanelPosition()',\n '(window:resize)': 'updatePanelPosition()',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DateRangePicker),\n multi: true,\n },\n ],\n})\nexport class DateRangePicker implements ControlValueAccessor {\n private readonly elementRef = inject(ElementRef)\n private readonly injector = inject(Injector)\n\n id = input<string>(`gbt-date-range-picker-${++nextId}`)\n label = input<string>('')\n placeholder = input<string>('Select a date range…')\n locale = input<string>('en-US')\n weekStartsOn = input<WeekStartsOn>(1)\n disabled = input(false, { transform: booleanAttribute })\n required = input(false, { transform: booleanAttribute })\n errorMessage = input<string | null>(null)\n previousMonthLabel = input<string>('Previous month')\n nextMonthLabel = input<string>('Next month')\n clearable = input(false, { transform: booleanAttribute })\n clearLabel = input<string>('Clear date range')\n visibleMonths = input<DateRangeVisibleMonths>(2)\n monthSelectLabel = input<string>('Month')\n yearSelectLabel = input<string>('Year')\n minYear = input<number>(CURRENT_YEAR - 100)\n maxYear = input<number>(CURRENT_YEAR + 10)\n rangeStatus = input<(start: string | null, end: string | null) => string>((start, end) => {\n if (!start) return ''\n if (!end) return `${start} selected as the start date. Choose an end date.`\n return `Date range: ${start} to ${end}.`\n })\n\n private readonly panel = new CalendarPanel({\n elementRef: this.elementRef,\n injector: this.injector,\n triggerSelector: '.gbt-date-range-picker__trigger',\n locale: () => this.locale(),\n weekStartsOn: () => this.weekStartsOn(),\n visibleMonths: () => this.visibleMonths(),\n minYear: () => this.minYear(),\n maxYear: () => this.maxYear(),\n onTouched: () => this.onTouched(),\n })\n\n protected readonly open = this.panel.open\n protected readonly value = signal<DateRangeValue | null>(null)\n protected readonly draftStart = signal<Date | null>(null)\n protected readonly draftEnd = signal<Date | null>(null)\n protected readonly hoveredDate = signal<Date | null>(null)\n protected readonly focusedDate = this.panel.focusedDate\n protected readonly anchorDate = this.panel.anchorDate\n protected readonly panelStyle = this.panel.panelStyle\n\n private readonly formDisabled = signal(false)\n private onChange: (value: DateRangeValue | null) => void = () => {}\n private onTouched: () => void = () => {}\n\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled())\n protected readonly showClear = computed(\n () => this.clearable() && this.value() !== null && !this.isDisabled(),\n )\n\n protected readonly monthViews = this.panel.monthViews\n protected readonly panelLabel = this.panel.panelLabel\n protected readonly weekdayLabels = this.panel.weekdayLabels\n protected readonly monthOptions = this.panel.monthOptions\n protected readonly yearOptions = this.panel.yearOptions\n\n private readonly dateFormatter = computed(\n () => new Intl.DateTimeFormat(this.locale(), { dateStyle: 'medium' }),\n )\n\n protected readonly triggerLabel = computed(() => {\n const v = this.value()\n if (!v) return ''\n const formatter = this.dateFormatter()\n if (!v.end) return formatter.format(v.start)\n return `${formatter.format(v.start)} – ${formatter.format(v.end)}`\n })\n\n private readonly previewBounds = computed<{ lower: Date; upper: Date } | null>(() => {\n const start = this.draftStart()\n if (!start) return null\n const other = this.draftEnd() ?? this.hoveredDate()\n if (!other) return null\n return start.getTime() <= other.getTime()\n ? { lower: start, upper: other }\n : { lower: other, upper: start }\n })\n\n protected readonly isPreviewing = computed(\n () => this.draftStart() !== null && this.draftEnd() === null,\n )\n\n protected readonly statusMessage = computed(() => {\n const start = this.draftStart()\n if (!start) return ''\n const formatter = this.dateFormatter()\n const end = this.draftEnd()\n return this.rangeStatus()(formatter.format(start), end ? formatter.format(end) : null)\n })\n\n writeValue(value: DateRangeValue | null): void {\n this.value.set(value)\n if (value) {\n this.focusedDate.set(value.start)\n this.anchorDate.set(new Date(value.start.getFullYear(), value.start.getMonth(), 1))\n }\n }\n\n registerOnChange(fn: (value: DateRangeValue | null) => void): void {\n this.onChange = fn\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.formDisabled.set(isDisabled)\n }\n\n protected isRangeStartCap(date: Date): boolean {\n const bounds = this.previewBounds()\n return bounds !== null && isSameDay(date, bounds.lower)\n }\n\n protected isRangeEndCap(date: Date): boolean {\n const bounds = this.previewBounds()\n return bounds !== null && isSameDay(date, bounds.upper)\n }\n\n protected isInRange(date: Date): boolean {\n const bounds = this.previewBounds()\n return (\n bounds !== null &&\n date.getTime() > bounds.lower.getTime() &&\n date.getTime() < bounds.upper.getTime()\n )\n }\n\n protected isFocused(date: Date): boolean {\n return this.panel.isFocused(date)\n }\n\n protected cellId(date: Date): string {\n return this.panel.cellId(date)\n }\n\n protected toggleOpen(): void {\n if (this.isDisabled()) {\n return\n }\n this.panel.toggle(() => {\n const value = this.value()\n this.draftStart.set(value?.start ?? null)\n this.draftEnd.set(value?.end ?? null)\n this.hoveredDate.set(null)\n return value?.start ?? new Date()\n })\n }\n\n protected close(returnFocus: boolean): void {\n this.panel.close(returnFocus)\n }\n\n protected clear(event: Event): void {\n event.stopPropagation()\n if (this.isDisabled()) {\n return\n }\n this.value.set(null)\n this.draftStart.set(null)\n this.draftEnd.set(null)\n this.onChange(null)\n this.onTouched()\n this.panel.close(false)\n }\n\n protected selectDay(date: Date): void {\n if (this.isDisabled()) {\n return\n }\n const start = this.draftStart()\n const complete = start !== null && this.draftEnd() !== null\n if (!start || complete) {\n this.draftStart.set(date)\n this.draftEnd.set(null)\n this.focusedDate.set(date)\n this.panel.ensureVisible(date)\n this.panel.focusCellAfterRender()\n return\n }\n const [rangeStart, rangeEnd] = start.getTime() <= date.getTime() ? [start, date] : [date, start]\n this.draftStart.set(rangeStart)\n this.draftEnd.set(rangeEnd)\n this.focusedDate.set(date)\n this.panel.ensureVisible(date)\n const next: DateRangeValue = { start: rangeStart, end: rangeEnd }\n this.value.set(next)\n this.onChange(next)\n this.onTouched()\n this.panel.close(true)\n }\n\n protected onDayMouseEnter(date: Date): void {\n this.hoveredDate.set(date)\n }\n\n protected onDayMouseLeave(): void {\n this.hoveredDate.set(null)\n }\n\n protected shiftMonth(delta: number): void {\n this.panel.shiftMonth(delta)\n }\n\n protected onMonthSelect(value: string): void {\n this.panel.onMonthSelect(value)\n }\n\n protected onYearSelect(value: string): void {\n this.panel.onYearSelect(value)\n }\n\n protected onGridKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n this.selectDay(this.focusedDate())\n return\n }\n this.panel.handleNavigationKeydown(event)\n }\n\n protected onEscape(event: KeyboardEvent): void {\n this.panel.onEscape(event)\n }\n\n protected handleClickOutside(event: MouseEvent): void {\n this.panel.handleClickOutside(event)\n }\n\n protected updatePanelPosition(): void {\n this.panel.updatePanelPosition()\n }\n}\n","<div class=\"gbt-date-range-picker\">\n @if (label()) {\n <label [for]=\"id()\" class=\"gbt-date-range-picker__label\"\n >{{ label() }}{{ required() ? ' *' : '' }}</label\n >\n }\n <div class=\"gbt-date-range-picker__field\">\n <button\n type=\"button\"\n [id]=\"id()\"\n class=\"gbt-date-range-picker__trigger\"\n [class.gbt-date-range-picker__trigger--open]=\"open()\"\n [disabled]=\"isDisabled()\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-invalid]=\"errorMessage() ? true : null\"\n [attr.aria-describedby]=\"errorMessage() ? id() + '-error' : null\"\n (click)=\"toggleOpen()\"\n >\n <span\n class=\"gbt-date-range-picker__trigger-label\"\n [class.gbt-date-range-picker__trigger-label--placeholder]=\"!triggerLabel()\"\n >\n {{ triggerLabel() || placeholder() }}\n </span>\n </button>\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"gbt-date-range-picker__clear\"\n [attr.aria-label]=\"clearLabel()\"\n (click)=\"clear($event)\"\n >\n <gbt-icon name=\"x\" aria-hidden=\"true\" />\n </button>\n } @else {\n <gbt-icon name=\"calendar\" class=\"gbt-date-range-picker__icon\" aria-hidden=\"true\" />\n }\n </div>\n @if (open() && panelStyle(); as pos) {\n <div\n class=\"gbt-date-range-picker__panel\"\n role=\"dialog\"\n aria-modal=\"false\"\n [attr.aria-label]=\"panelLabel()\"\n [style.top]=\"pos.top\"\n [style.left]=\"pos.left\"\n >\n <div class=\"gbt-date-range-picker__nav\">\n <button\n type=\"button\"\n class=\"gbt-date-range-picker__nav-button\"\n [attr.aria-label]=\"previousMonthLabel()\"\n (click)=\"shiftMonth(-1)\"\n >\n <gbt-icon name=\"chevron-left\" aria-hidden=\"true\" />\n </button>\n <div class=\"gbt-date-range-picker__headings\">\n @for (view of monthViews(); track view.year + '-' + view.month; let i = $index) {\n <div class=\"gbt-date-range-picker__month-heading\">\n @if (i === 0) {\n <select\n #monthSelect\n class=\"gbt-date-range-picker__select\"\n [attr.aria-label]=\"monthSelectLabel()\"\n (change)=\"onMonthSelect(monthSelect.value)\"\n >\n @for (opt of monthOptions(); track opt.value) {\n <option [value]=\"opt.value\" [selected]=\"opt.value === anchorDate().getMonth()\">\n {{ opt.label }}\n </option>\n }\n </select>\n <select\n #yearSelect\n class=\"gbt-date-range-picker__select\"\n [attr.aria-label]=\"yearSelectLabel()\"\n (change)=\"onYearSelect(yearSelect.value)\"\n >\n @for (year of yearOptions(); track year) {\n <option [value]=\"year\" [selected]=\"year === anchorDate().getFullYear()\">\n {{ year }}\n </option>\n }\n </select>\n } @else {\n <span class=\"gbt-date-range-picker__month-label\">{{ view.label }}</span>\n }\n </div>\n }\n </div>\n <button\n type=\"button\"\n class=\"gbt-date-range-picker__nav-button\"\n [attr.aria-label]=\"nextMonthLabel()\"\n (click)=\"shiftMonth(1)\"\n >\n <gbt-icon name=\"chevron-right\" aria-hidden=\"true\" />\n </button>\n </div>\n <div class=\"gbt-date-range-picker__months\">\n @for (view of monthViews(); track view.year + '-' + view.month) {\n <div class=\"gbt-date-range-picker__month\">\n <div\n class=\"gbt-date-range-picker__grid\"\n role=\"grid\"\n tabindex=\"-1\"\n [attr.aria-label]=\"view.label\"\n (keydown)=\"onGridKeydown($event)\"\n >\n <div class=\"gbt-date-range-picker__row gbt-date-range-picker__row--head\" role=\"row\">\n @for (wd of weekdayLabels(); track $index) {\n <span role=\"columnheader\" class=\"gbt-date-range-picker__weekday\">{{ wd }}</span>\n }\n </div>\n @for (week of view.weeks; track $index) {\n <div class=\"gbt-date-range-picker__row\" role=\"row\">\n @for (day of week; track day.date.getTime()) {\n @if (day.inCurrentMonth) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"gbt-date-range-picker__day\"\n [class.gbt-date-range-picker__day--today]=\"day.isToday\"\n [class.gbt-date-range-picker__day--start-cap]=\"isRangeStartCap(day.date)\"\n [class.gbt-date-range-picker__day--end-cap]=\"isRangeEndCap(day.date)\"\n [class.gbt-date-range-picker__day--in-range]=\"isInRange(day.date)\"\n [class.gbt-date-range-picker__day--preview]=\"isPreviewing()\"\n [attr.data-date]=\"cellId(day.date)\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [tabIndex]=\"isFocused(day.date) ? 0 : -1\"\n (click)=\"selectDay(day.date)\"\n (mouseenter)=\"onDayMouseEnter(day.date)\"\n (mouseleave)=\"onDayMouseLeave()\"\n >\n {{ day.date.getDate() }}\n </button>\n } @else {\n <span\n role=\"gridcell\"\n class=\"gbt-date-range-picker__day gbt-date-range-picker__day--empty\"\n ></span>\n }\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n <div class=\"gbt-sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ statusMessage() }}\n </div>\n </div>\n }\n @if (errorMessage()) {\n <p [id]=\"id() + '-error'\" class=\"gbt-date-range-picker__error\" role=\"alert\">\n {{ errorMessage() }}\n </p>\n }\n</div>\n"],"mappings":"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"}
1
+ {"version":3,"file":"masmarino-gabarit-date-picker.mjs","names":[],"sources":["../../../projects/gabarit/date-picker/date-picker-calendar.ts","../../../projects/gabarit/date-picker/calendar-panel.ts","../../../projects/gabarit/date-picker/date-picker.ts","../../../projects/gabarit/date-picker/date-picker.html","../../../projects/gabarit/date-picker/date-range-picker/date-range-picker.ts","../../../projects/gabarit/date-picker/date-range-picker/date-range-picker.html"],"sourcesContent":["export type WeekStartsOn = 0 | 1\n\nexport interface CalendarDay {\n date: Date\n inCurrentMonth: boolean\n isToday: boolean\n}\n\nexport function isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n )\n}\n\nexport function addMonths(date: Date, delta: number): Date {\n const day = date.getDate()\n const firstOfTarget = new Date(date.getFullYear(), date.getMonth() + delta, 1)\n const daysInTarget = new Date(\n firstOfTarget.getFullYear(),\n firstOfTarget.getMonth() + 1,\n 0,\n ).getDate()\n return new Date(\n firstOfTarget.getFullYear(),\n firstOfTarget.getMonth(),\n Math.min(day, daysInTarget),\n )\n}\n\nexport function addYears(date: Date, delta: number): Date {\n return addMonths(date, delta * 12)\n}\n\nexport function shiftDays(date: Date, delta: number): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + delta)\n}\n\nexport function startOfWeek(date: Date, weekStartsOn: WeekStartsOn): Date {\n const weekday = date.getDay()\n const diff = (weekday - weekStartsOn + 7) % 7\n const result = new Date(date.getFullYear(), date.getMonth(), date.getDate())\n result.setDate(result.getDate() - diff)\n return result\n}\n\nexport function endOfWeek(date: Date, weekStartsOn: WeekStartsOn): Date {\n const start = startOfWeek(date, weekStartsOn)\n start.setDate(start.getDate() + 6)\n return start\n}\n\nexport function buildCalendarGrid(\n year: number,\n month: number,\n weekStartsOn: WeekStartsOn,\n): CalendarDay[] {\n const firstOfMonth = new Date(year, month, 1)\n const gridStart = startOfWeek(firstOfMonth, weekStartsOn)\n const today = new Date()\n\n const days: CalendarDay[] = []\n for (let i = 0; i < 42; i++) {\n const date = new Date(gridStart.getFullYear(), gridStart.getMonth(), gridStart.getDate() + i)\n days.push({\n date,\n inCurrentMonth: date.getMonth() === month,\n isToday: isSameDay(date, today),\n })\n }\n return days\n}\n\nexport function weekdayLabels(locale: string, weekStartsOn: WeekStartsOn): string[] {\n const formatter = new Intl.DateTimeFormat(locale, { weekday: 'short' })\n const reference = new Date(2024, 0, 7 + weekStartsOn)\n return Array.from({ length: 7 }, (_, i) => {\n const date = new Date(reference.getFullYear(), reference.getMonth(), reference.getDate() + i)\n return formatter.format(date)\n })\n}\n","import { ElementRef, Injector, afterNextRender, computed, signal } from '@angular/core'\nimport { floatingPanelAnchor } from '@masmarino/gabarit/floating-panel'\nimport {\n CalendarDay,\n WeekStartsOn,\n addMonths,\n addYears,\n buildCalendarGrid,\n endOfWeek,\n isSameDay,\n shiftDays,\n startOfWeek,\n weekdayLabels as computeWeekdayLabels,\n} from './date-picker-calendar'\n\nexport interface CalendarPanelView {\n year: number\n month: number\n label: string\n weeks: CalendarDay[][]\n}\n\nexport interface CalendarPanelDeps {\n elementRef: ElementRef<HTMLElement>\n injector: Injector\n triggerSelector: string\n locale: () => string\n weekStartsOn: () => WeekStartsOn\n visibleMonths: () => number\n minYear: () => number\n maxYear: () => number\n onTouched: () => void\n}\n\nexport type NavigationResult = 'month-changed' | 'day-changed' | 'unhandled'\n\n/** Panel and calendar-grid mechanics shared by `DatePicker` and `DateRangePicker`; one instance per component. */\nexport class CalendarPanel {\n readonly open = signal(false)\n readonly anchorDate = signal<Date>(new Date())\n readonly focusedDate = signal<Date>(new Date())\n readonly panelStyle = signal<{ top: string; left: string } | null>(null)\n\n readonly monthViews = computed<CalendarPanelView[]>(() => {\n const anchor = this.anchorDate()\n const count = this.deps.visibleMonths()\n const formatter = new Intl.DateTimeFormat(this.deps.locale(), {\n month: 'long',\n year: 'numeric',\n })\n const views = Array.from({ length: count }, (_, i) => {\n const monthDate = new Date(anchor.getFullYear(), anchor.getMonth() + i, 1)\n const year = monthDate.getFullYear()\n const month = monthDate.getMonth()\n const days = buildCalendarGrid(year, month, this.deps.weekStartsOn())\n const weeks: CalendarDay[][] = []\n for (let d = 0; d < days.length; d += 7) {\n weeks.push(days.slice(d, d + 7))\n }\n return { year, month, label: formatter.format(monthDate), weeks }\n })\n const neededWeeks = views.map((view) => {\n let last = view.weeks.length\n while (last > 1 && view.weeks[last - 1].every((day) => !day.inCurrentMonth)) {\n last--\n }\n return last\n })\n const sharedWeeks = Math.max(...neededWeeks)\n return views.map((view) => ({ ...view, weeks: view.weeks.slice(0, sharedWeeks) }))\n })\n\n readonly panelLabel = computed(() => {\n const views = this.monthViews()\n return views.length === 1\n ? views[0].label\n : `${views[0].label} – ${views[views.length - 1].label}`\n })\n\n readonly weekdayLabels = computed(() =>\n computeWeekdayLabels(this.deps.locale(), this.deps.weekStartsOn()),\n )\n\n readonly monthOptions = computed(() => {\n const formatter = new Intl.DateTimeFormat(this.deps.locale(), { month: 'long' })\n return Array.from({ length: 12 }, (_, i) => ({\n value: i,\n label: formatter.format(new Date(2024, i, 1)),\n }))\n })\n\n readonly yearOptions = computed(() => {\n const min = this.deps.minYear()\n const max = this.deps.maxYear()\n return Array.from({ length: max - min + 1 }, (_, i) => min + i)\n })\n\n constructor(private readonly deps: CalendarPanelDeps) {}\n\n cellId(date: Date): string {\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(\n date.getDate(),\n ).padStart(2, '0')}`\n }\n\n isFocused(date: Date): boolean {\n return isSameDay(this.focusedDate(), date)\n }\n\n toggle(onOpen: () => Date): void {\n this.open.update((value) => !value)\n if (this.open()) {\n const target = onOpen()\n this.focusedDate.set(target)\n this.anchorDate.set(new Date(target.getFullYear(), target.getMonth(), 1))\n this.updatePanelPosition()\n this.focusCellAfterRender()\n } else {\n this.deps.onTouched()\n }\n }\n\n close(returnFocus: boolean): void {\n if (!this.open()) {\n return\n }\n this.open.set(false)\n this.deps.onTouched()\n if (returnFocus) {\n this.trigger()?.focus()\n }\n }\n\n shiftMonth(delta: number): void {\n this.anchorDate.set(addMonths(this.anchorDate(), delta))\n this.focusedDate.set(addMonths(this.focusedDate(), delta))\n this.updatePanelPosition()\n this.focusCellAfterRender()\n }\n\n onMonthSelect(value: string): void {\n this.setAnchorMonth(this.anchorDate().getFullYear(), Number(value))\n }\n\n onYearSelect(value: string): void {\n this.setAnchorMonth(Number(value), this.anchorDate().getMonth())\n }\n\n private setAnchorMonth(year: number, month: number): void {\n const dayOfMonth = this.focusedDate().getDate()\n const daysInTarget = new Date(year, month + 1, 0).getDate()\n this.anchorDate.set(new Date(year, month, 1))\n this.focusedDate.set(new Date(year, month, Math.min(dayOfMonth, daysInTarget)))\n this.updatePanelPosition()\n this.focusCellAfterRender()\n }\n\n handleNavigationKeydown(event: KeyboardEvent): NavigationResult {\n const current = this.focusedDate()\n if (event.key === 'PageDown' || event.key === 'PageUp') {\n event.preventDefault()\n const delta = event.key === 'PageDown' ? 1 : -1\n if (event.shiftKey) {\n this.anchorDate.set(addYears(this.anchorDate(), delta))\n this.focusedDate.set(addYears(current, delta))\n } else {\n this.anchorDate.set(addMonths(this.anchorDate(), delta))\n this.focusedDate.set(addMonths(current, delta))\n }\n this.updatePanelPosition()\n this.focusCellAfterRender()\n return 'month-changed'\n }\n const next = this.nextFocusedDate(current, event)\n if (next === null) {\n return 'unhandled'\n }\n event.preventDefault()\n this.ensureVisible(next)\n this.focusedDate.set(next)\n this.focusCellAfterRender()\n return 'day-changed'\n }\n\n private nextFocusedDate(current: Date, event: KeyboardEvent): Date | null {\n switch (event.key) {\n case 'ArrowRight':\n return shiftDays(current, 1)\n case 'ArrowLeft':\n return shiftDays(current, -1)\n case 'ArrowDown':\n return shiftDays(current, 7)\n case 'ArrowUp':\n return shiftDays(current, -7)\n case 'Home':\n return startOfWeek(current, this.deps.weekStartsOn())\n case 'End':\n return endOfWeek(current, this.deps.weekStartsOn())\n default:\n return null\n }\n }\n\n ensureVisible(date: Date): void {\n const anchor = this.anchorDate()\n const visibleMonths = this.deps.visibleMonths()\n const monthsDiff =\n (date.getFullYear() - anchor.getFullYear()) * 12 + (date.getMonth() - anchor.getMonth())\n if (monthsDiff < 0) {\n this.anchorDate.set(new Date(date.getFullYear(), date.getMonth(), 1))\n } else if (monthsDiff >= visibleMonths) {\n this.anchorDate.set(addMonths(anchor, monthsDiff - visibleMonths + 1))\n }\n }\n\n onEscape(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.open()) {\n event.preventDefault()\n event.stopPropagation()\n this.close(true)\n }\n }\n\n handleClickOutside(event: MouseEvent): void {\n if (this.open() && !this.deps.elementRef.nativeElement.contains(event.target as Node)) {\n this.close(false)\n }\n }\n\n updatePanelPosition(): void {\n const anchor = floatingPanelAnchor(this.open(), this.trigger())\n if (anchor) {\n this.panelStyle.set({ top: `${anchor.bottom}px`, left: `${anchor.left}px` })\n }\n }\n\n private trigger(): HTMLButtonElement | null {\n return this.deps.elementRef.nativeElement.querySelector(this.deps.triggerSelector)\n }\n\n focusCellAfterRender(): void {\n afterNextRender(\n () => {\n const id = this.cellId(this.focusedDate())\n const host = this.deps.elementRef.nativeElement\n host.querySelector<HTMLElement>(`[data-date=\"${id}\"]`)?.focus()\n },\n { injector: this.deps.injector },\n )\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n input,\n signal,\n} from '@angular/core'\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'\nimport { Icon } from '@masmarino/gabarit/icon'\nimport { CalendarPanel, type CalendarPanelView } from './calendar-panel'\nimport { CalendarDay, WeekStartsOn, isSameDay } from './date-picker-calendar'\nimport { followPageScroll } from '@masmarino/gabarit/floating-panel'\n\nexport type DatePickerVisibleMonths = 1 | 2\n\nexport type DatePickerMonthView = CalendarPanelView\n\nlet nextDatePickerId = 0\n\nconst CURRENT_YEAR = new Date().getFullYear()\n\n@Component({\n selector: 'gbt-date-picker',\n standalone: true,\n imports: [Icon],\n templateUrl: './date-picker.html',\n styleUrl: './date-picker.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(document:click)': 'handleClickOutside($event)',\n '(keydown)': 'onEscape($event)',\n '(window:resize)': 'updatePanelPosition()',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DatePicker),\n multi: true,\n },\n ],\n})\nexport class DatePicker implements ControlValueAccessor {\n private readonly elementRef = inject(ElementRef)\n private readonly injector = inject(Injector)\n\n id = input<string>(`gbt-date-picker-${++nextDatePickerId}`)\n label = input<string>('')\n placeholder = input<string>('Select a date…')\n locale = input<string>('en-US')\n weekStartsOn = input<WeekStartsOn>(1)\n disabled = input(false, { transform: booleanAttribute })\n required = input(false, { transform: booleanAttribute })\n errorMessage = input<string | null>(null)\n previousMonthLabel = input<string>('Previous month')\n nextMonthLabel = input<string>('Next month')\n clearable = input(false, { transform: booleanAttribute })\n clearLabel = input<string>('Clear date')\n visibleMonths = input<DatePickerVisibleMonths>(1)\n monthSelectLabel = input<string>('Month')\n yearSelectLabel = input<string>('Year')\n minYear = input<number>(CURRENT_YEAR - 100)\n maxYear = input<number>(CURRENT_YEAR + 10)\n\n private readonly panel = new CalendarPanel({\n elementRef: this.elementRef,\n injector: this.injector,\n triggerSelector: '.gbt-date-picker__trigger',\n locale: () => this.locale(),\n weekStartsOn: () => this.weekStartsOn(),\n visibleMonths: () => this.visibleMonths(),\n minYear: () => this.minYear(),\n maxYear: () => this.maxYear(),\n onTouched: () => this.onTouched(),\n })\n\n protected readonly open = this.panel.open\n protected readonly selected = signal<Date | null>(null)\n protected readonly focusedDate = this.panel.focusedDate\n protected readonly anchorDate = this.panel.anchorDate\n protected readonly panelStyle = this.panel.panelStyle\n\n private readonly formDisabled = signal(false)\n private onChange: (value: Date | null) => void = () => {}\n private onTouched: () => void = () => {}\n\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled())\n protected readonly showClear = computed(\n () => this.clearable() && this.selected() !== null && !this.isDisabled(),\n )\n\n protected readonly monthViews = this.panel.monthViews\n protected readonly panelLabel = this.panel.panelLabel\n protected readonly weekdayLabels = this.panel.weekdayLabels\n protected readonly monthOptions = this.panel.monthOptions\n protected readonly yearOptions = this.panel.yearOptions\n\n protected readonly triggerLabel = computed(() => {\n const value = this.selected()\n return value\n ? new Intl.DateTimeFormat(this.locale(), { dateStyle: 'medium' }).format(value)\n : ''\n })\n\n writeValue(value: Date | null): void {\n this.selected.set(value)\n if (value) {\n this.focusedDate.set(value)\n this.anchorDate.set(new Date(value.getFullYear(), value.getMonth(), 1))\n }\n }\n\n registerOnChange(fn: (value: Date | null) => void): void {\n this.onChange = fn\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.formDisabled.set(isDisabled)\n }\n\n protected isSelected(date: Date): boolean {\n const value = this.selected()\n return value !== null && isSameDay(value, date)\n }\n\n protected isFocused(date: Date): boolean {\n return this.panel.isFocused(date)\n }\n\n protected cellId(date: Date): string {\n return this.panel.cellId(date)\n }\n\n protected toggleOpen(): void {\n if (this.isDisabled()) {\n return\n }\n this.panel.toggle(() => this.selected() ?? new Date())\n }\n\n protected close(returnFocus: boolean): void {\n this.panel.close(returnFocus)\n }\n\n protected clear(event: Event): void {\n event.stopPropagation()\n if (this.isDisabled()) {\n return\n }\n this.selected.set(null)\n this.onChange(null)\n this.onTouched()\n this.panel.close(false)\n }\n\n protected selectDay(day: CalendarDay): void {\n if (this.isDisabled()) {\n return\n }\n this.selected.set(day.date)\n this.focusedDate.set(day.date)\n this.panel.ensureVisible(day.date)\n this.onChange(day.date)\n this.panel.close(true)\n }\n\n protected shiftMonth(delta: number): void {\n this.panel.shiftMonth(delta)\n }\n\n protected onMonthSelect(value: string): void {\n this.panel.onMonthSelect(value)\n }\n\n protected onYearSelect(value: string): void {\n this.panel.onYearSelect(value)\n }\n\n protected onGridKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n const current = this.focusedDate()\n this.selectDay({\n date: current,\n inCurrentMonth: true,\n isToday: isSameDay(current, new Date()),\n })\n return\n }\n this.panel.handleNavigationKeydown(event)\n }\n\n protected onEscape(event: KeyboardEvent): void {\n this.panel.onEscape(event)\n }\n\n protected handleClickOutside(event: MouseEvent): void {\n this.panel.handleClickOutside(event)\n }\n\n constructor() {\n followPageScroll(() => this.updatePanelPosition())\n }\n\n protected updatePanelPosition(): void {\n this.panel.updatePanelPosition()\n }\n}\n","<div class=\"gbt-date-picker\">\n @if (label()) {\n <label [for]=\"id()\" class=\"gbt-date-picker__label\"\n >{{ label() }}{{ required() ? ' *' : '' }}</label\n >\n }\n <div class=\"gbt-date-picker__field\">\n <button\n type=\"button\"\n [id]=\"id()\"\n class=\"gbt-date-picker__trigger\"\n [class.gbt-date-picker__trigger--open]=\"open()\"\n [disabled]=\"isDisabled()\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-invalid]=\"errorMessage() ? true : null\"\n [attr.aria-describedby]=\"errorMessage() ? id() + '-error' : null\"\n (click)=\"toggleOpen()\"\n >\n <span\n class=\"gbt-date-picker__trigger-label\"\n [class.gbt-date-picker__trigger-label--placeholder]=\"!triggerLabel()\"\n >\n {{ triggerLabel() || placeholder() }}\n </span>\n </button>\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"gbt-date-picker__clear\"\n [attr.aria-label]=\"clearLabel()\"\n (click)=\"clear($event)\"\n >\n <gbt-icon name=\"x\" aria-hidden=\"true\" />\n </button>\n } @else {\n <gbt-icon name=\"calendar\" class=\"gbt-date-picker__icon\" aria-hidden=\"true\" />\n }\n </div>\n @if (open() && panelStyle(); as pos) {\n <div\n class=\"gbt-date-picker__panel\"\n role=\"dialog\"\n aria-modal=\"false\"\n [attr.aria-label]=\"panelLabel()\"\n [style.top]=\"pos.top\"\n [style.left]=\"pos.left\"\n >\n <div class=\"gbt-date-picker__nav\">\n <button\n type=\"button\"\n class=\"gbt-date-picker__nav-button\"\n [attr.aria-label]=\"previousMonthLabel()\"\n (click)=\"shiftMonth(-1)\"\n >\n <gbt-icon name=\"chevron-left\" aria-hidden=\"true\" />\n </button>\n <div class=\"gbt-date-picker__headings\">\n @for (view of monthViews(); track view.year + '-' + view.month; let i = $index) {\n <div class=\"gbt-date-picker__month-heading\">\n @if (i === 0) {\n <select\n #monthSelect\n class=\"gbt-date-picker__select\"\n [attr.aria-label]=\"monthSelectLabel()\"\n (change)=\"onMonthSelect(monthSelect.value)\"\n >\n @for (opt of monthOptions(); track opt.value) {\n <option [value]=\"opt.value\" [selected]=\"opt.value === anchorDate().getMonth()\">\n {{ opt.label }}\n </option>\n }\n </select>\n <select\n #yearSelect\n class=\"gbt-date-picker__select\"\n [attr.aria-label]=\"yearSelectLabel()\"\n (change)=\"onYearSelect(yearSelect.value)\"\n >\n @for (year of yearOptions(); track year) {\n <option [value]=\"year\" [selected]=\"year === anchorDate().getFullYear()\">\n {{ year }}\n </option>\n }\n </select>\n } @else {\n <span class=\"gbt-date-picker__month-label\">{{ view.label }}</span>\n }\n </div>\n }\n </div>\n <button\n type=\"button\"\n class=\"gbt-date-picker__nav-button\"\n [attr.aria-label]=\"nextMonthLabel()\"\n (click)=\"shiftMonth(1)\"\n >\n <gbt-icon name=\"chevron-right\" aria-hidden=\"true\" />\n </button>\n </div>\n <div class=\"gbt-date-picker__months\">\n @for (view of monthViews(); track view.year + '-' + view.month) {\n <div class=\"gbt-date-picker__month\">\n <div\n class=\"gbt-date-picker__grid\"\n role=\"grid\"\n tabindex=\"-1\"\n [attr.aria-label]=\"view.label\"\n (keydown)=\"onGridKeydown($event)\"\n >\n <div class=\"gbt-date-picker__row gbt-date-picker__row--head\" role=\"row\">\n @for (wd of weekdayLabels(); track $index) {\n <span role=\"columnheader\" class=\"gbt-date-picker__weekday\">{{ wd }}</span>\n }\n </div>\n @for (week of view.weeks; track $index) {\n <div class=\"gbt-date-picker__row\" role=\"row\">\n @for (day of week; track day.date.getTime()) {\n @if (day.inCurrentMonth) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"gbt-date-picker__day\"\n [class.gbt-date-picker__day--today]=\"day.isToday\"\n [class.gbt-date-picker__day--selected]=\"isSelected(day.date)\"\n [attr.data-date]=\"cellId(day.date)\"\n [attr.aria-selected]=\"isSelected(day.date)\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [tabIndex]=\"isFocused(day.date) ? 0 : -1\"\n (click)=\"selectDay(day)\"\n >\n {{ day.date.getDate() }}\n </button>\n } @else {\n <span\n role=\"gridcell\"\n class=\"gbt-date-picker__day gbt-date-picker__day--empty\"\n ></span>\n }\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n @if (errorMessage()) {\n <p [id]=\"id() + '-error'\" class=\"gbt-date-picker__error\" role=\"alert\">{{ errorMessage() }}</p>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n input,\n signal,\n} from '@angular/core'\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'\nimport { Icon } from '@masmarino/gabarit/icon'\nimport { CalendarPanel, type CalendarPanelView } from '../calendar-panel'\nimport { WeekStartsOn, isSameDay } from '../date-picker-calendar'\nimport { followPageScroll } from '@masmarino/gabarit/floating-panel'\n\nexport type DateRangeVisibleMonths = 1 | 2\n\nexport interface DateRangeValue {\n start: Date\n end: Date | null\n}\n\nexport type DateRangePickerMonthView = CalendarPanelView\n\nlet nextId = 0\n\nconst CURRENT_YEAR = new Date().getFullYear()\n\n@Component({\n selector: 'gbt-date-range-picker',\n standalone: true,\n imports: [Icon],\n templateUrl: './date-range-picker.html',\n styleUrl: './date-range-picker.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(document:click)': 'handleClickOutside($event)',\n '(keydown)': 'onEscape($event)',\n '(window:resize)': 'updatePanelPosition()',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DateRangePicker),\n multi: true,\n },\n ],\n})\nexport class DateRangePicker implements ControlValueAccessor {\n private readonly elementRef = inject(ElementRef)\n private readonly injector = inject(Injector)\n\n id = input<string>(`gbt-date-range-picker-${++nextId}`)\n label = input<string>('')\n placeholder = input<string>('Select a date range…')\n locale = input<string>('en-US')\n weekStartsOn = input<WeekStartsOn>(1)\n disabled = input(false, { transform: booleanAttribute })\n required = input(false, { transform: booleanAttribute })\n errorMessage = input<string | null>(null)\n previousMonthLabel = input<string>('Previous month')\n nextMonthLabel = input<string>('Next month')\n clearable = input(false, { transform: booleanAttribute })\n clearLabel = input<string>('Clear date range')\n visibleMonths = input<DateRangeVisibleMonths>(2)\n monthSelectLabel = input<string>('Month')\n yearSelectLabel = input<string>('Year')\n minYear = input<number>(CURRENT_YEAR - 100)\n maxYear = input<number>(CURRENT_YEAR + 10)\n rangeStatus = input<(start: string | null, end: string | null) => string>((start, end) => {\n if (!start) return ''\n if (!end) return `${start} selected as the start date. Choose an end date.`\n return `Date range: ${start} to ${end}.`\n })\n\n private readonly panel = new CalendarPanel({\n elementRef: this.elementRef,\n injector: this.injector,\n triggerSelector: '.gbt-date-range-picker__trigger',\n locale: () => this.locale(),\n weekStartsOn: () => this.weekStartsOn(),\n visibleMonths: () => this.visibleMonths(),\n minYear: () => this.minYear(),\n maxYear: () => this.maxYear(),\n onTouched: () => this.onTouched(),\n })\n\n protected readonly open = this.panel.open\n protected readonly value = signal<DateRangeValue | null>(null)\n protected readonly draftStart = signal<Date | null>(null)\n protected readonly draftEnd = signal<Date | null>(null)\n protected readonly hoveredDate = signal<Date | null>(null)\n protected readonly focusedDate = this.panel.focusedDate\n protected readonly anchorDate = this.panel.anchorDate\n protected readonly panelStyle = this.panel.panelStyle\n\n private readonly formDisabled = signal(false)\n private onChange: (value: DateRangeValue | null) => void = () => {}\n private onTouched: () => void = () => {}\n\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled())\n protected readonly showClear = computed(\n () => this.clearable() && this.value() !== null && !this.isDisabled(),\n )\n\n protected readonly monthViews = this.panel.monthViews\n protected readonly panelLabel = this.panel.panelLabel\n protected readonly weekdayLabels = this.panel.weekdayLabels\n protected readonly monthOptions = this.panel.monthOptions\n protected readonly yearOptions = this.panel.yearOptions\n\n private readonly dateFormatter = computed(\n () => new Intl.DateTimeFormat(this.locale(), { dateStyle: 'medium' }),\n )\n\n protected readonly triggerLabel = computed(() => {\n const v = this.value()\n if (!v) return ''\n const formatter = this.dateFormatter()\n if (!v.end) return formatter.format(v.start)\n return `${formatter.format(v.start)} – ${formatter.format(v.end)}`\n })\n\n private readonly previewBounds = computed<{ lower: Date; upper: Date } | null>(() => {\n const start = this.draftStart()\n if (!start) return null\n const other = this.draftEnd() ?? this.hoveredDate()\n if (!other) return null\n return start.getTime() <= other.getTime()\n ? { lower: start, upper: other }\n : { lower: other, upper: start }\n })\n\n protected readonly isPreviewing = computed(\n () => this.draftStart() !== null && this.draftEnd() === null,\n )\n\n protected readonly statusMessage = computed(() => {\n const start = this.draftStart()\n if (!start) return ''\n const formatter = this.dateFormatter()\n const end = this.draftEnd()\n return this.rangeStatus()(formatter.format(start), end ? formatter.format(end) : null)\n })\n\n writeValue(value: DateRangeValue | null): void {\n this.value.set(value)\n if (value) {\n this.focusedDate.set(value.start)\n this.anchorDate.set(new Date(value.start.getFullYear(), value.start.getMonth(), 1))\n }\n }\n\n registerOnChange(fn: (value: DateRangeValue | null) => void): void {\n this.onChange = fn\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.formDisabled.set(isDisabled)\n }\n\n protected isRangeStartCap(date: Date): boolean {\n const bounds = this.previewBounds()\n return bounds !== null && isSameDay(date, bounds.lower)\n }\n\n protected isRangeEndCap(date: Date): boolean {\n const bounds = this.previewBounds()\n return bounds !== null && isSameDay(date, bounds.upper)\n }\n\n protected isInRange(date: Date): boolean {\n const bounds = this.previewBounds()\n return (\n bounds !== null &&\n date.getTime() > bounds.lower.getTime() &&\n date.getTime() < bounds.upper.getTime()\n )\n }\n\n protected isFocused(date: Date): boolean {\n return this.panel.isFocused(date)\n }\n\n protected cellId(date: Date): string {\n return this.panel.cellId(date)\n }\n\n protected toggleOpen(): void {\n if (this.isDisabled()) {\n return\n }\n this.panel.toggle(() => {\n const value = this.value()\n this.draftStart.set(value?.start ?? null)\n this.draftEnd.set(value?.end ?? null)\n this.hoveredDate.set(null)\n return value?.start ?? new Date()\n })\n }\n\n protected close(returnFocus: boolean): void {\n this.panel.close(returnFocus)\n }\n\n protected clear(event: Event): void {\n event.stopPropagation()\n if (this.isDisabled()) {\n return\n }\n this.value.set(null)\n this.draftStart.set(null)\n this.draftEnd.set(null)\n this.onChange(null)\n this.onTouched()\n this.panel.close(false)\n }\n\n protected selectDay(date: Date): void {\n if (this.isDisabled()) {\n return\n }\n const start = this.draftStart()\n const complete = start !== null && this.draftEnd() !== null\n if (!start || complete) {\n this.draftStart.set(date)\n this.draftEnd.set(null)\n this.focusedDate.set(date)\n this.panel.ensureVisible(date)\n this.panel.focusCellAfterRender()\n return\n }\n const [rangeStart, rangeEnd] = start.getTime() <= date.getTime() ? [start, date] : [date, start]\n this.draftStart.set(rangeStart)\n this.draftEnd.set(rangeEnd)\n this.focusedDate.set(date)\n this.panel.ensureVisible(date)\n const next: DateRangeValue = { start: rangeStart, end: rangeEnd }\n this.value.set(next)\n this.onChange(next)\n this.onTouched()\n this.panel.close(true)\n }\n\n protected onDayMouseEnter(date: Date): void {\n this.hoveredDate.set(date)\n }\n\n protected onDayMouseLeave(): void {\n this.hoveredDate.set(null)\n }\n\n protected shiftMonth(delta: number): void {\n this.panel.shiftMonth(delta)\n }\n\n protected onMonthSelect(value: string): void {\n this.panel.onMonthSelect(value)\n }\n\n protected onYearSelect(value: string): void {\n this.panel.onYearSelect(value)\n }\n\n protected onGridKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n this.selectDay(this.focusedDate())\n return\n }\n this.panel.handleNavigationKeydown(event)\n }\n\n protected onEscape(event: KeyboardEvent): void {\n this.panel.onEscape(event)\n }\n\n protected handleClickOutside(event: MouseEvent): void {\n this.panel.handleClickOutside(event)\n }\n\n constructor() {\n followPageScroll(() => this.updatePanelPosition())\n }\n\n protected updatePanelPosition(): void {\n this.panel.updatePanelPosition()\n }\n}\n","<div class=\"gbt-date-range-picker\">\n @if (label()) {\n <label [for]=\"id()\" class=\"gbt-date-range-picker__label\"\n >{{ label() }}{{ required() ? ' *' : '' }}</label\n >\n }\n <div class=\"gbt-date-range-picker__field\">\n <button\n type=\"button\"\n [id]=\"id()\"\n class=\"gbt-date-range-picker__trigger\"\n [class.gbt-date-range-picker__trigger--open]=\"open()\"\n [disabled]=\"isDisabled()\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-invalid]=\"errorMessage() ? true : null\"\n [attr.aria-describedby]=\"errorMessage() ? id() + '-error' : null\"\n (click)=\"toggleOpen()\"\n >\n <span\n class=\"gbt-date-range-picker__trigger-label\"\n [class.gbt-date-range-picker__trigger-label--placeholder]=\"!triggerLabel()\"\n >\n {{ triggerLabel() || placeholder() }}\n </span>\n </button>\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"gbt-date-range-picker__clear\"\n [attr.aria-label]=\"clearLabel()\"\n (click)=\"clear($event)\"\n >\n <gbt-icon name=\"x\" aria-hidden=\"true\" />\n </button>\n } @else {\n <gbt-icon name=\"calendar\" class=\"gbt-date-range-picker__icon\" aria-hidden=\"true\" />\n }\n </div>\n @if (open() && panelStyle(); as pos) {\n <div\n class=\"gbt-date-range-picker__panel\"\n role=\"dialog\"\n aria-modal=\"false\"\n [attr.aria-label]=\"panelLabel()\"\n [style.top]=\"pos.top\"\n [style.left]=\"pos.left\"\n >\n <div class=\"gbt-date-range-picker__nav\">\n <button\n type=\"button\"\n class=\"gbt-date-range-picker__nav-button\"\n [attr.aria-label]=\"previousMonthLabel()\"\n (click)=\"shiftMonth(-1)\"\n >\n <gbt-icon name=\"chevron-left\" aria-hidden=\"true\" />\n </button>\n <div class=\"gbt-date-range-picker__headings\">\n @for (view of monthViews(); track view.year + '-' + view.month; let i = $index) {\n <div class=\"gbt-date-range-picker__month-heading\">\n @if (i === 0) {\n <select\n #monthSelect\n class=\"gbt-date-range-picker__select\"\n [attr.aria-label]=\"monthSelectLabel()\"\n (change)=\"onMonthSelect(monthSelect.value)\"\n >\n @for (opt of monthOptions(); track opt.value) {\n <option [value]=\"opt.value\" [selected]=\"opt.value === anchorDate().getMonth()\">\n {{ opt.label }}\n </option>\n }\n </select>\n <select\n #yearSelect\n class=\"gbt-date-range-picker__select\"\n [attr.aria-label]=\"yearSelectLabel()\"\n (change)=\"onYearSelect(yearSelect.value)\"\n >\n @for (year of yearOptions(); track year) {\n <option [value]=\"year\" [selected]=\"year === anchorDate().getFullYear()\">\n {{ year }}\n </option>\n }\n </select>\n } @else {\n <span class=\"gbt-date-range-picker__month-label\">{{ view.label }}</span>\n }\n </div>\n }\n </div>\n <button\n type=\"button\"\n class=\"gbt-date-range-picker__nav-button\"\n [attr.aria-label]=\"nextMonthLabel()\"\n (click)=\"shiftMonth(1)\"\n >\n <gbt-icon name=\"chevron-right\" aria-hidden=\"true\" />\n </button>\n </div>\n <div class=\"gbt-date-range-picker__months\">\n @for (view of monthViews(); track view.year + '-' + view.month) {\n <div class=\"gbt-date-range-picker__month\">\n <div\n class=\"gbt-date-range-picker__grid\"\n role=\"grid\"\n tabindex=\"-1\"\n [attr.aria-label]=\"view.label\"\n (keydown)=\"onGridKeydown($event)\"\n >\n <div class=\"gbt-date-range-picker__row gbt-date-range-picker__row--head\" role=\"row\">\n @for (wd of weekdayLabels(); track $index) {\n <span role=\"columnheader\" class=\"gbt-date-range-picker__weekday\">{{ wd }}</span>\n }\n </div>\n @for (week of view.weeks; track $index) {\n <div class=\"gbt-date-range-picker__row\" role=\"row\">\n @for (day of week; track day.date.getTime()) {\n @if (day.inCurrentMonth) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"gbt-date-range-picker__day\"\n [class.gbt-date-range-picker__day--today]=\"day.isToday\"\n [class.gbt-date-range-picker__day--start-cap]=\"isRangeStartCap(day.date)\"\n [class.gbt-date-range-picker__day--end-cap]=\"isRangeEndCap(day.date)\"\n [class.gbt-date-range-picker__day--in-range]=\"isInRange(day.date)\"\n [class.gbt-date-range-picker__day--preview]=\"isPreviewing()\"\n [attr.data-date]=\"cellId(day.date)\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [tabIndex]=\"isFocused(day.date) ? 0 : -1\"\n (click)=\"selectDay(day.date)\"\n (mouseenter)=\"onDayMouseEnter(day.date)\"\n (mouseleave)=\"onDayMouseLeave()\"\n >\n {{ day.date.getDate() }}\n </button>\n } @else {\n <span\n role=\"gridcell\"\n class=\"gbt-date-range-picker__day gbt-date-range-picker__day--empty\"\n ></span>\n }\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n <div class=\"gbt-sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ statusMessage() }}\n </div>\n </div>\n }\n @if (errorMessage()) {\n <p [id]=\"id() + '-error'\" class=\"gbt-date-range-picker__error\" role=\"alert\">\n {{ errorMessage() }}\n </p>\n }\n</div>\n"],"mappings":"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"}
@@ -1204,7 +1204,7 @@ var DocsPage = class DocsPage {
1204
1204
  if (wanted.moveFocus) {
1205
1205
  const heading = content.querySelector("h1");
1206
1206
  if (heading) this.focus(heading);
1207
- this.host.nativeElement.ownerDocument.defaultView?.scrollTo?.({ top: 0 });
1207
+ scrollToTop(this.host.nativeElement);
1208
1208
  }
1209
1209
  }
1210
1210
  focus(element) {
@@ -1419,6 +1419,10 @@ i0.ɵɵngDeclareClassMetadata({
1419
1419
  }],
1420
1420
  ctorParameters: () => []
1421
1421
  });
1422
+ function scrollToTop(from) {
1423
+ for (let box = from.parentElement; box; box = box.parentElement) if (box.scrollTop > 0) box.scrollTop = 0;
1424
+ from.ownerDocument.defaultView?.scrollTo?.({ top: 0 });
1425
+ }
1422
1426
  export { DEFAULT_DOCS_CONFIG, DEFAULT_DOCS_LABELS, DOCS_CONFIG, DOCS_LABELS, DOCS_SEARCH_LIMIT, DOCS_TITLE, DocsNav, DocsPage, DocsSearch, DocsSearchService, DocsService, MarkdownOutline, MarkdownView, decodeFragment, docsHomeGuard, docsLabels, docsPageCommands, docsReadingOrder, docsRoutes, findAnchorTarget, firstDocsPage, hasOutline, headingSlug, isNotFound, locateDocsPage, makeScrollableBlocksFocusable, nameTaskCheckboxes, parseDocsPage, provideDocs, provideDocsLabels, searchTokens };
1423
1427
 
1424
1428
  //# sourceMappingURL=masmarino-gabarit-docs.mjs.map