@frame-ui-ng/components 0.5.0-beta.0 → 0.6.0-beta.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.
Files changed (106) hide show
  1. package/accordion/src/styles/_vars.css +2 -5
  2. package/accordion/src/styles/accordion.css +44 -30
  3. package/breadcrumb/src/styles/breadcrumb.css +12 -2
  4. package/button/src/styles/button.css +20 -66
  5. package/button-group/src/styles/button-group.css +0 -38
  6. package/calendar/src/styles/_vars.css +4 -0
  7. package/calendar/src/styles/calendar.css +26 -18
  8. package/carousel/src/styles/carousel.css +103 -89
  9. package/checkbox/src/styles/checkbox.css +14 -5
  10. package/collapsible/src/styles/_vars.css +1 -0
  11. package/collapsible/src/styles/collapsible.css +15 -11
  12. package/combobox/src/styles/combobox.css +11 -2
  13. package/confirm-popover/src/styles/confirm-popover.css +0 -1
  14. package/date-picker/src/styles/date-picker.css +15 -10
  15. package/dropdown-menu/src/styles/dropdown-menu-item.css +6 -2
  16. package/fesm2022/frame-ui-ng-components-accordion.mjs +201 -147
  17. package/fesm2022/frame-ui-ng-components-accordion.mjs.map +1 -1
  18. package/fesm2022/frame-ui-ng-components-alert.mjs +2 -2
  19. package/fesm2022/frame-ui-ng-components-alert.mjs.map +1 -1
  20. package/fesm2022/frame-ui-ng-components-breadcrumb.mjs +10 -2
  21. package/fesm2022/frame-ui-ng-components-breadcrumb.mjs.map +1 -1
  22. package/fesm2022/frame-ui-ng-components-button-group.mjs +2 -2
  23. package/fesm2022/frame-ui-ng-components-button-group.mjs.map +1 -1
  24. package/fesm2022/frame-ui-ng-components-button.mjs +2 -2
  25. package/fesm2022/frame-ui-ng-components-button.mjs.map +1 -1
  26. package/fesm2022/frame-ui-ng-components-calendar.mjs +202 -50
  27. package/fesm2022/frame-ui-ng-components-calendar.mjs.map +1 -1
  28. package/fesm2022/frame-ui-ng-components-card.mjs +2 -2
  29. package/fesm2022/frame-ui-ng-components-card.mjs.map +1 -1
  30. package/fesm2022/frame-ui-ng-components-carousel.mjs +2 -2
  31. package/fesm2022/frame-ui-ng-components-carousel.mjs.map +1 -1
  32. package/fesm2022/frame-ui-ng-components-collapsible.mjs +80 -22
  33. package/fesm2022/frame-ui-ng-components-collapsible.mjs.map +1 -1
  34. package/fesm2022/frame-ui-ng-components-combobox.mjs +61 -6
  35. package/fesm2022/frame-ui-ng-components-combobox.mjs.map +1 -1
  36. package/fesm2022/frame-ui-ng-components-command.mjs +2 -2
  37. package/fesm2022/frame-ui-ng-components-command.mjs.map +1 -1
  38. package/fesm2022/frame-ui-ng-components-confirm-popover.mjs +6 -6
  39. package/fesm2022/frame-ui-ng-components-confirm-popover.mjs.map +1 -1
  40. package/fesm2022/frame-ui-ng-components-date-picker.mjs +75 -37
  41. package/fesm2022/frame-ui-ng-components-date-picker.mjs.map +1 -1
  42. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs +2 -2
  43. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs.map +1 -1
  44. package/fesm2022/frame-ui-ng-components-empty.mjs +2 -2
  45. package/fesm2022/frame-ui-ng-components-empty.mjs.map +1 -1
  46. package/fesm2022/frame-ui-ng-components-hover-card.mjs +2 -2
  47. package/fesm2022/frame-ui-ng-components-hover-card.mjs.map +1 -1
  48. package/fesm2022/frame-ui-ng-components-input-otp.mjs +2 -2
  49. package/fesm2022/frame-ui-ng-components-input-otp.mjs.map +1 -1
  50. package/fesm2022/frame-ui-ng-components-input.mjs +2 -2
  51. package/fesm2022/frame-ui-ng-components-input.mjs.map +1 -1
  52. package/fesm2022/frame-ui-ng-components-item.mjs +2 -2
  53. package/fesm2022/frame-ui-ng-components-item.mjs.map +1 -1
  54. package/fesm2022/frame-ui-ng-components-menubar.mjs +2 -2
  55. package/fesm2022/frame-ui-ng-components-menubar.mjs.map +1 -1
  56. package/fesm2022/frame-ui-ng-components-modal.mjs +10 -4
  57. package/fesm2022/frame-ui-ng-components-modal.mjs.map +1 -1
  58. package/fesm2022/frame-ui-ng-components-navigation-menu.mjs +4 -4
  59. package/fesm2022/frame-ui-ng-components-navigation-menu.mjs.map +1 -1
  60. package/fesm2022/frame-ui-ng-components-pagination.mjs +20 -4
  61. package/fesm2022/frame-ui-ng-components-pagination.mjs.map +1 -1
  62. package/fesm2022/frame-ui-ng-components-popover.mjs +2 -2
  63. package/fesm2022/frame-ui-ng-components-popover.mjs.map +1 -1
  64. package/fesm2022/frame-ui-ng-components-radio-group.mjs +2 -2
  65. package/fesm2022/frame-ui-ng-components-radio-group.mjs.map +1 -1
  66. package/fesm2022/frame-ui-ng-components-resizable.mjs +2 -2
  67. package/fesm2022/frame-ui-ng-components-resizable.mjs.map +1 -1
  68. package/fesm2022/frame-ui-ng-components-sheet.mjs +90 -65
  69. package/fesm2022/frame-ui-ng-components-sheet.mjs.map +1 -1
  70. package/fesm2022/frame-ui-ng-components-table.mjs +6 -5
  71. package/fesm2022/frame-ui-ng-components-table.mjs.map +1 -1
  72. package/fesm2022/frame-ui-ng-components-tabs.mjs +2 -2
  73. package/fesm2022/frame-ui-ng-components-tabs.mjs.map +1 -1
  74. package/fesm2022/frame-ui-ng-components-toast.mjs +6 -6
  75. package/fesm2022/frame-ui-ng-components-toast.mjs.map +1 -1
  76. package/fesm2022/frame-ui-ng-components-tooltip.mjs +6 -6
  77. package/fesm2022/frame-ui-ng-components-tooltip.mjs.map +1 -1
  78. package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs +4 -4
  79. package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs.map +1 -1
  80. package/fesm2022/frame-ui-ng-components.mjs +850 -420
  81. package/fesm2022/frame-ui-ng-components.mjs.map +1 -1
  82. package/input/src/styles/input-group.css +0 -7
  83. package/input/src/styles/input.css +0 -23
  84. package/modal/src/styles/modal.css +5 -19
  85. package/package.json +6 -6
  86. package/pagination/src/styles/pagination.css +6 -2
  87. package/popover/src/styles/popover.css +3 -3
  88. package/select/src/styles/select-item.css +67 -68
  89. package/sheet/src/styles/sheet.css +32 -19
  90. package/src/styles/components.css +2 -2
  91. package/src/styles/corner-handles.css +217 -0
  92. package/styles/components.css +2 -2
  93. package/styles/corner-handles.css +217 -0
  94. package/styles.css +2 -2
  95. package/toggle/src/styles/toggle.css +6 -1
  96. package/tooltip/src/styles/_vars.css +1 -1
  97. package/tooltip/src/styles/tooltip.css +13 -14
  98. package/types/frame-ui-ng-components-accordion.d.ts +69 -61
  99. package/types/frame-ui-ng-components-calendar.d.ts +7 -7
  100. package/types/frame-ui-ng-components-collapsible.d.ts +12 -4
  101. package/types/frame-ui-ng-components-combobox.d.ts +8 -0
  102. package/types/frame-ui-ng-components-date-picker.d.ts +2 -4
  103. package/types/frame-ui-ng-components-sheet.d.ts +6 -2
  104. package/types/frame-ui-ng-components.d.ts +172 -135
  105. package/src/styles/blueprint.css +0 -707
  106. package/styles/blueprint.css +0 -707
@@ -1 +1 @@
1
- {"version":3,"file":"frame-ui-ng-components-calendar.mjs","sources":["../../../projects/components/calendar/src/calendar.ts","../../../projects/components/calendar/calendar.module.ts","../../../projects/components/calendar/frame-ui-ng-components-calendar.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n TemplateRef,\r\n booleanAttribute,\r\n computed,\r\n forwardRef,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\nexport type FrCalendarMode = 'single' | 'range';\r\nexport type FrCalendarCaptionLayout = 'label' | 'dropdown';\r\n\r\nexport type FrCalendarDateRange = {\r\n from: Date | null;\r\n to: Date | null;\r\n};\r\n\r\nexport type FrCalendarCellContext = {\r\n date: Date;\r\n day: number;\r\n dateLabel?: string;\r\n disabled: boolean;\r\n disabledDate: boolean;\r\n outside: boolean;\r\n selected: boolean;\r\n today: boolean;\r\n};\r\n\r\nexport type FrCalendarDisabledMatcher = (date: Date) => boolean;\r\n\r\ntype CalendarDay = FrCalendarCellContext & {\r\n key: string;\r\n rangeEnd: boolean;\r\n rangeMiddle: boolean;\r\n rangeStart: boolean;\r\n};\r\n\r\ntype CalendarMonth = {\r\n date: Date;\r\n key: string;\r\n label: string;\r\n weeks: CalendarDay[][];\r\n};\r\n\r\nconst VALUE_ACCESSOR = {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => FrCalendar),\r\n multi: true,\r\n};\r\n\r\n/** Calendar control for single-date and range selection. */\r\n@Component({\r\n selector: 'frame-calendar',\r\n imports: [NgTemplateOutlet],\r\n providers: [VALUE_ACCESSOR],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'frame-calendar',\r\n '[attr.data-mode]': 'mode()',\r\n '[attr.data-caption-layout]': 'captionLayout()',\r\n '[attr.data-disabled]': 'isDisabled() ? \"\" : null',\r\n '[attr.data-week-number]': 'showWeekNumber() ? \"\" : null',\r\n '[attr.data-date-labels]': 'hasDateLabels() ? \"\" : null',\r\n '[attr.dir]': 'dir()',\r\n },\r\n template: `\r\n <div class=\"frame-calendar__header\">\r\n <button\r\n class=\"frame-calendar__nav-button\"\r\n type=\"button\"\r\n [disabled]=\"isDisabled()\"\r\n (click)=\"previousMonth()\"\r\n [attr.aria-label]=\"previousMonthLabel()\"\r\n >\r\n @if (previousMonthTemplate(); as template) {\r\n <ng-container [ngTemplateOutlet]=\"template\" />\r\n } @else {\r\n {{ previousMonthIcon() }}\r\n }\r\n </button>\r\n\r\n @if (captionLayout() === 'dropdown') {\r\n <div class=\"frame-calendar__caption-controls\">\r\n <select\r\n class=\"frame-calendar__select\"\r\n [disabled]=\"isDisabled()\"\r\n [value]=\"currentMonth().getMonth()\"\r\n aria-label=\"Month\"\r\n (change)=\"setMonth($any($event.target).value)\"\r\n >\r\n @for (month of monthOptions(); track month.value) {\r\n <option [value]=\"month.value\" [selected]=\"month.value === currentMonth().getMonth()\">\r\n {{ month.label }}\r\n </option>\r\n }\r\n </select>\r\n\r\n <select\r\n class=\"frame-calendar__select\"\r\n [disabled]=\"isDisabled()\"\r\n [value]=\"currentMonth().getFullYear()\"\r\n aria-label=\"Year\"\r\n (change)=\"setYear($any($event.target).value)\"\r\n >\r\n @for (year of yearOptions(); track year) {\r\n <option [value]=\"year\" [selected]=\"year === currentMonth().getFullYear()\">\r\n {{ year }}\r\n </option>\r\n }\r\n </select>\r\n </div>\r\n } @else {\r\n <div class=\"frame-calendar__caption\" aria-live=\"polite\">\r\n {{ monthLabel(currentMonth()) }}\r\n </div>\r\n }\r\n\r\n <button\r\n class=\"frame-calendar__nav-button\"\r\n type=\"button\"\r\n [disabled]=\"isDisabled()\"\r\n (click)=\"nextMonth()\"\r\n [attr.aria-label]=\"nextMonthLabel()\"\r\n >\r\n @if (nextMonthTemplate(); as template) {\r\n <ng-container [ngTemplateOutlet]=\"template\" />\r\n } @else {\r\n {{ nextMonthIcon() }}\r\n }\r\n </button>\r\n </div>\r\n\r\n <div class=\"frame-calendar__months\">\r\n @for (month of months(); track month.key) {\r\n <section class=\"frame-calendar__month\" [attr.aria-label]=\"month.label\">\r\n @if (numberOfMonths() > 1 || captionLayout() === 'dropdown') {\r\n <h3 class=\"frame-calendar__month-caption\">{{ month.label }}</h3>\r\n }\r\n\r\n <table class=\"frame-calendar__table\" role=\"grid\" [attr.aria-readonly]=\"true\">\r\n <colgroup>\r\n @if (showWeekNumber()) {\r\n <col class=\"frame-calendar__week-number-column\" />\r\n }\r\n @for (weekday of weekdayLabels(); track weekday) {\r\n <col class=\"frame-calendar__day-column\" />\r\n }\r\n </colgroup>\r\n <thead>\r\n <tr>\r\n @if (showWeekNumber()) {\r\n <th class=\"frame-calendar__week-number-header\" scope=\"col\">Wk</th>\r\n }\r\n @for (weekday of weekdayLabels(); track weekday) {\r\n <th class=\"frame-calendar__weekday\" scope=\"col\">{{ weekday }}</th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (week of month.weeks; track week[0].key) {\r\n <tr>\r\n @if (showWeekNumber()) {\r\n <td class=\"frame-calendar__week-number\">{{ weekNumber(week[0].date) }}</td>\r\n }\r\n @for (day of week; track day.key) {\r\n <td\r\n class=\"frame-calendar__cell\"\r\n [attr.data-outside]=\"day.outside ? '' : null\"\r\n [attr.data-selected]=\"day.selected ? '' : null\"\r\n [attr.data-range-start]=\"day.rangeStart ? '' : null\"\r\n [attr.data-range-middle]=\"day.rangeMiddle ? '' : null\"\r\n [attr.data-range-end]=\"day.rangeEnd ? '' : null\"\r\n [attr.data-today]=\"day.today ? '' : null\"\r\n [attr.data-disabled-date]=\"day.disabledDate ? '' : null\"\r\n >\r\n <button\r\n class=\"frame-calendar__day\"\r\n type=\"button\"\r\n [disabled]=\"isDisabled() || day.disabled\"\r\n [attr.data-date]=\"day.key\"\r\n [attr.tabindex]=\"dayTabIndex(day)\"\r\n [attr.aria-label]=\"dayLabel(day.date)\"\r\n [attr.aria-pressed]=\"day.selected ? 'true' : 'false'\"\r\n [attr.aria-selected]=\"day.selected ? 'true' : 'false'\"\r\n [attr.aria-current]=\"day.today ? 'date' : null\"\r\n (click)=\"selectDay(day)\"\r\n (focus)=\"focusedDate.set(day.date)\"\r\n (keydown)=\"handleDayKeydown($event, day)\"\r\n >\r\n @if (cellTemplate(); as template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"day\"\r\n />\r\n } @else {\r\n <span class=\"frame-calendar__day-number\">{{ day.day }}</span>\r\n @if (day.dateLabel) {\r\n <span class=\"frame-calendar__day-meta\">{{ day.dateLabel }}</span>\r\n }\r\n }\r\n </button>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n </section>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class FrCalendar implements ControlValueAccessor {\r\n readonly mode = input<FrCalendarMode>('single');\r\n readonly captionLayout = input<FrCalendarCaptionLayout>('label');\r\n readonly numberOfMonths = input(1);\r\n readonly firstDayOfWeek = input(0);\r\n readonly locale = input('en-US');\r\n readonly timeZone = input<string | undefined>(undefined);\r\n readonly dir = input<'ltr' | 'rtl'>('ltr');\r\n readonly fromYear = input(new Date().getFullYear() - 100);\r\n readonly toYear = input(new Date().getFullYear() + 20);\r\n readonly showOutsideDays = input(true, { transform: booleanAttribute });\r\n readonly showWeekNumber = input(false, { transform: booleanAttribute });\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n readonly disabledDates = input<Date[]>([]);\r\n readonly dateLabels = input<Record<string, string>>({});\r\n readonly disabledMatcher = input<FrCalendarDisabledMatcher | null>(null);\r\n readonly cellTemplate = input<TemplateRef<FrCalendarCellContext> | null>(null);\r\n readonly previousMonthTemplate = input<TemplateRef<unknown> | null>(null);\r\n readonly nextMonthTemplate = input<TemplateRef<unknown> | null>(null);\r\n readonly previousMonthIcon = input('‹');\r\n readonly nextMonthIcon = input('›');\r\n readonly previousMonthLabel = input('Previous month');\r\n readonly nextMonthLabel = input('Next month');\r\n readonly month = input<Date | null | undefined>(undefined);\r\n readonly selected = input<Date | FrCalendarDateRange | null | undefined>(undefined);\r\n\r\n readonly selectedChange = output<Date | FrCalendarDateRange | null>();\r\n readonly monthChange = output<Date>();\r\n\r\n readonly focusedDate = signal<Date | null>(null);\r\n private readonly navigatedMonth = signal<Date | null>(null);\r\n private readonly internalValue = signal<Date | FrCalendarDateRange | null>(null);\r\n private readonly cvaDisabled = signal(false);\r\n private readonly host = inject(ElementRef<HTMLElement>);\r\n\r\n readonly currentMonth = computed(() =>\r\n startOfMonth(this.navigatedMonth() ?? this.month() ?? new Date()),\r\n );\r\n readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\r\n readonly value = computed(() => {\r\n const selected = this.selected();\r\n return normalizeValue(selected !== undefined ? selected : this.internalValue(), this.mode());\r\n });\r\n readonly weekdayLabels = computed(() =>\r\n buildWeekdayLabels(this.locale(), this.firstDayOfWeek(), this.timeZone()),\r\n );\r\n readonly monthOptions = computed(() =>\r\n Array.from({ length: 12 }, (_, value) => ({\r\n value,\r\n label: new Intl.DateTimeFormat(this.locale(), {\r\n month: 'short',\r\n timeZone: this.timeZone(),\r\n }).format(new Date(2026, value, 1)),\r\n })),\r\n );\r\n readonly yearOptions = computed(() =>\r\n Array.from(\r\n { length: Math.max(0, this.toYear() - this.fromYear() + 1) },\r\n (_, index) => this.fromYear() + index,\r\n ),\r\n );\r\n readonly months = computed(() =>\r\n Array.from({ length: Math.max(1, this.numberOfMonths()) }, (_, index) =>\r\n this.buildMonth(addMonths(this.currentMonth(), index)),\r\n ),\r\n );\r\n readonly activeDate = computed(() => this.resolveActiveDate());\r\n readonly hasDateLabels = computed(() => Object.keys(this.dateLabels()).length > 0);\r\n\r\n private onTouched: () => void = () => undefined;\r\n private onChange: (value: Date | FrCalendarDateRange | null) => void = () => undefined;\r\n\r\n writeValue(value: Date | FrCalendarDateRange | null): void {\r\n this.internalValue.set(normalizeValue(value, this.mode()));\r\n\r\n if (value instanceof Date) {\r\n this.navigatedMonth.set(startOfMonth(value));\r\n } else if (isRange(value) && value.from) {\r\n this.navigatedMonth.set(startOfMonth(value.from));\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: Date | FrCalendarDateRange | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.cvaDisabled.set(isDisabled);\r\n }\r\n\r\n previousMonth(): void {\r\n this.updateMonth(addMonths(this.currentMonth(), -1));\r\n }\r\n\r\n nextMonth(): void {\r\n this.updateMonth(addMonths(this.currentMonth(), 1));\r\n }\r\n\r\n setMonth(value: string): void {\r\n const month = new Date(this.currentMonth().getFullYear(), Number(value), 1);\r\n this.updateMonth(month);\r\n }\r\n\r\n setYear(value: string): void {\r\n const month = new Date(Number(value), this.currentMonth().getMonth(), 1);\r\n this.updateMonth(month);\r\n }\r\n\r\n selectDay(day: CalendarDay): void {\r\n if (this.isDisabled() || day.disabled) {\r\n return;\r\n }\r\n\r\n this.onTouched();\r\n\r\n const nextValue =\r\n this.mode() === 'range' ? nextRangeValue(this.value(), day.date) : cloneDate(day.date);\r\n\r\n this.internalValue.set(nextValue);\r\n this.onChange(nextValue);\r\n this.selectedChange.emit(nextValue);\r\n }\r\n\r\n handleDayKeydown(event: KeyboardEvent, day: CalendarDay): void {\r\n const offset = this.navigationOffset(event.key);\r\n\r\n if (offset === null || this.isDisabled()) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n\r\n const next = addDays(day.date, offset);\r\n this.focusedDate.set(next);\r\n\r\n if (!this.isDateVisible(next)) {\r\n this.updateMonth(startOfMonth(next));\r\n }\r\n\r\n this.focusDay(next);\r\n }\r\n\r\n dayTabIndex(day: CalendarDay): number {\r\n return sameDate(day.date, this.activeDate()) ? 0 : -1;\r\n }\r\n\r\n focusActiveDate(): void {\r\n this.focusDay(this.activeDate());\r\n }\r\n\r\n monthLabel(date: Date): string {\r\n return new Intl.DateTimeFormat(this.locale(), {\r\n month: 'long',\r\n year: 'numeric',\r\n timeZone: this.timeZone(),\r\n }).format(date);\r\n }\r\n\r\n dayLabel(date: Date): string {\r\n return new Intl.DateTimeFormat(this.locale(), {\r\n dateStyle: 'full',\r\n timeZone: this.timeZone(),\r\n }).format(date);\r\n }\r\n\r\n weekNumber(date: Date): string {\r\n return isoWeekNumber(date).toString().padStart(2, '0');\r\n }\r\n\r\n private navigationOffset(key: string): number | null {\r\n switch (key) {\r\n case 'ArrowLeft':\r\n return this.dir() === 'rtl' ? 1 : -1;\r\n case 'ArrowRight':\r\n return this.dir() === 'rtl' ? -1 : 1;\r\n case 'ArrowUp':\r\n return -7;\r\n case 'ArrowDown':\r\n return 7;\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n private resolveActiveDate(): Date {\r\n const focused = this.focusedDate();\r\n\r\n // Prefer the roving-focus target, then selection, then today, then first enabled day.\r\n if (focused && this.findDay(focused) && !this.isDayDisabled(focused)) {\r\n return cloneDate(focused);\r\n }\r\n\r\n const selected = this.selectedDate();\r\n\r\n if (selected && this.findDay(selected) && !this.isDayDisabled(selected)) {\r\n return cloneDate(selected);\r\n }\r\n\r\n const today = new Date();\r\n\r\n if (this.findDay(today) && !this.isDayDisabled(today)) {\r\n return cloneDate(today);\r\n }\r\n\r\n const firstEnabled = this.months()\r\n .flatMap((month) => month.weeks.flat())\r\n .find((day) => !day.disabled);\r\n\r\n return firstEnabled ? cloneDate(firstEnabled.date) : cloneDate(this.currentMonth());\r\n }\r\n\r\n private selectedDate(): Date | null {\r\n const value = this.value();\r\n\r\n if (value instanceof Date) {\r\n return value;\r\n }\r\n\r\n if (isRange(value)) {\r\n return value.from ?? value.to;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private isDateVisible(date: Date): boolean {\r\n return this.months().some((month) =>\r\n month.weeks.some((week) => week.some((day) => sameDate(day.date, date))),\r\n );\r\n }\r\n\r\n private findDay(date: Date): CalendarDay | null {\r\n for (const month of this.months()) {\r\n for (const week of month.weeks) {\r\n const day = week.find((item) => sameDate(item.date, date));\r\n\r\n if (day) {\r\n return day;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private isDayDisabled(date: Date): boolean {\r\n return this.findDay(date)?.disabled ?? true;\r\n }\r\n\r\n private focusDay(date: Date): void {\r\n if (this.focusDayElement(date)) {\r\n return;\r\n }\r\n\r\n // Month navigation may render the target button one tick later.\r\n setTimeout(() => {\r\n this.focusDayElement(date);\r\n });\r\n }\r\n\r\n private focusDayElement(date: Date): boolean {\r\n const button = this.host.nativeElement.querySelector(\r\n `.frame-calendar__day[data-date=\"${dateKey(date)}\"]`,\r\n ) as HTMLButtonElement | null;\r\n\r\n button?.focus();\r\n\r\n return !!button;\r\n }\r\n\r\n private updateMonth(month: Date): void {\r\n const next = startOfMonth(month);\r\n this.navigatedMonth.set(next);\r\n this.monthChange.emit(cloneDate(next));\r\n }\r\n\r\n private buildMonth(monthDate: Date): CalendarMonth {\r\n const start = startOfMonth(monthDate);\r\n const gridStart = startOfWeek(start, this.firstDayOfWeek());\r\n const weeks: CalendarDay[][] = [];\r\n\r\n // Always build a six-week grid so layout height stays stable across months.\r\n for (let week = 0; week < 6; week++) {\r\n const days: CalendarDay[] = [];\r\n\r\n for (let dayIndex = 0; dayIndex < 7; dayIndex++) {\r\n const date = addDays(gridStart, week * 7 + dayIndex);\r\n const outside = date.getMonth() !== start.getMonth();\r\n const key = dateKey(date);\r\n const disabledDate = hasDate(this.disabledDates(), date);\r\n const disabled =\r\n (!this.showOutsideDays() && outside) ||\r\n disabledDate ||\r\n (this.disabledMatcher()?.(cloneDate(date)) ?? false);\r\n const selection = selectionState(this.value(), date, this.mode());\r\n\r\n days.push({\r\n date,\r\n day: date.getDate(),\r\n key,\r\n dateLabel: this.dateLabels()[key],\r\n disabled,\r\n disabledDate,\r\n outside,\r\n today: sameDate(date, new Date()),\r\n ...selection,\r\n });\r\n }\r\n\r\n weeks.push(days);\r\n }\r\n\r\n return {\r\n date: start,\r\n key: `${start.getFullYear()}-${start.getMonth()}`,\r\n label: this.monthLabel(start),\r\n weeks,\r\n };\r\n }\r\n}\r\n\r\nfunction buildWeekdayLabels(locale: string, firstDayOfWeek: number, timeZone?: string): string[] {\r\n const baseSunday = new Date(2026, 5, 7);\r\n\r\n return Array.from({ length: 7 }, (_, index) => {\r\n const day = addDays(baseSunday, (firstDayOfWeek + index) % 7);\r\n return new Intl.DateTimeFormat(locale, {\r\n weekday: 'short',\r\n timeZone,\r\n }).format(day);\r\n });\r\n}\r\n\r\nfunction normalizeValue(\r\n value: Date | FrCalendarDateRange | null | undefined,\r\n mode: FrCalendarMode,\r\n): Date | FrCalendarDateRange | null {\r\n if (!value) {\r\n return mode === 'range' ? { from: null, to: null } : null;\r\n }\r\n\r\n if (mode === 'range') {\r\n if (isRange(value)) {\r\n return {\r\n from: value.from ? cloneDate(value.from) : null,\r\n to: value.to ? cloneDate(value.to) : null,\r\n };\r\n }\r\n\r\n return { from: cloneDate(value), to: null };\r\n }\r\n\r\n return value instanceof Date ? cloneDate(value) : value.from ? cloneDate(value.from) : null;\r\n}\r\n\r\nfunction nextRangeValue(value: Date | FrCalendarDateRange | null, selected: Date): FrCalendarDateRange {\r\n const range = isRange(value) ? value : { from: null, to: null };\r\n\r\n if (!range.from || range.to) {\r\n return { from: cloneDate(selected), to: null };\r\n }\r\n\r\n if (selected < range.from) {\r\n return { from: cloneDate(selected), to: cloneDate(range.from) };\r\n }\r\n\r\n return { from: cloneDate(range.from), to: cloneDate(selected) };\r\n}\r\n\r\nfunction selectionState(value: Date | FrCalendarDateRange | null, date: Date, mode: FrCalendarMode) {\r\n if (mode === 'range' && isRange(value)) {\r\n const from = value.from;\r\n const to = value.to;\r\n const rangeStart = !!from && sameDate(date, from);\r\n const rangeEnd = !!to && sameDate(date, to);\r\n const rangeMiddle = !!from && !!to && date > from && date < to;\r\n\r\n return {\r\n selected: rangeStart || rangeEnd || rangeMiddle,\r\n rangeStart,\r\n rangeMiddle,\r\n rangeEnd,\r\n };\r\n }\r\n\r\n const selected = value instanceof Date && sameDate(date, value);\r\n\r\n return {\r\n selected,\r\n rangeStart: selected,\r\n rangeMiddle: false,\r\n rangeEnd: selected,\r\n };\r\n}\r\n\r\nfunction isRange(value: unknown): value is FrCalendarDateRange {\r\n return !!value && typeof value === 'object' && ('from' in value || 'to' in value);\r\n}\r\n\r\nfunction hasDate(dates: Date[], date: Date): boolean {\r\n return dates.some((item) => sameDate(item, date));\r\n}\r\n\r\nfunction sameDate(a: Date, b: Date): boolean {\r\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\r\n}\r\n\r\nfunction dateKey(date: Date): string {\r\n const year = date.getFullYear();\r\n const month = `${date.getMonth() + 1}`.padStart(2, '0');\r\n const day = `${date.getDate()}`.padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n}\r\n\r\nfunction cloneDate(date: Date): Date {\r\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\r\n}\r\n\r\nfunction startOfMonth(date: Date): Date {\r\n return new Date(date.getFullYear(), date.getMonth(), 1);\r\n}\r\n\r\nfunction addMonths(date: Date, amount: number): Date {\r\n return new Date(date.getFullYear(), date.getMonth() + amount, 1);\r\n}\r\n\r\nfunction addDays(date: Date, amount: number): Date {\r\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + amount);\r\n}\r\n\r\nfunction startOfWeek(date: Date, firstDayOfWeek: number): Date {\r\n const normalized = ((firstDayOfWeek % 7) + 7) % 7;\r\n const diff = (date.getDay() - normalized + 7) % 7;\r\n return addDays(date, -diff);\r\n}\r\n\r\nfunction isoWeekNumber(date: Date): number {\r\n const target = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNumber = target.getUTCDay() || 7;\r\n target.setUTCDate(target.getUTCDate() + 4 - dayNumber);\r\n const yearStart = new Date(Date.UTC(target.getUTCFullYear(), 0, 1));\r\n return Math.ceil(((target.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\r\n}\r\n\r\n","import { NgModule } from '@angular/core';\nimport {\n FrCalendar,\n} from './src/calendar';\n\n@NgModule({\n imports: [\n FrCalendar,\n ],\n exports: [\n FrCalendar,\n ],\n})\nexport class FrCalendarModule {}\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":"frame-ui-ng-components-calendar.mjs","sources":["../../../projects/components/calendar/src/calendar.ts","../../../projects/components/calendar/calendar.module.ts","../../../projects/components/calendar/frame-ui-ng-components-calendar.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n TemplateRef,\r\n booleanAttribute,\r\n computed,\r\n forwardRef,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { FrSelectModule } from '@frame-ui-ng/components/select';\r\n\r\nexport type FrCalendarMode = 'single' | 'range';\r\nexport type FrCalendarCaptionLayout = 'label' | 'dropdown';\r\n\r\nexport type FrCalendarDateRange = {\r\n from: Date | null;\r\n to: Date | null;\r\n};\r\n\r\nexport type FrCalendarCellContext = {\r\n date: Date;\r\n day: number;\r\n dateLabel?: string;\r\n disabled: boolean;\r\n disabledDate: boolean;\r\n outside: boolean;\r\n selected: boolean;\r\n today: boolean;\r\n};\r\n\r\nexport type FrCalendarDisabledMatcher = (date: Date) => boolean;\r\n\r\ntype CalendarDay = FrCalendarCellContext & {\r\n key: string;\r\n rangeEnd: boolean;\r\n rangeMiddle: boolean;\r\n rangeStart: boolean;\r\n};\r\n\r\ntype CalendarMonth = {\r\n date: Date;\r\n key: string;\r\n label: string;\r\n weeks: CalendarDay[][];\r\n};\r\n\r\nconst VALUE_ACCESSOR = {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => FrCalendar),\r\n multi: true,\r\n};\r\n\r\n/** Calendar control for single-date and range selection. */\r\n@Component({\r\n selector: 'frame-calendar',\r\n imports: [NgTemplateOutlet, FrSelectModule],\r\n providers: [VALUE_ACCESSOR],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'frame-calendar frame-corner-handles',\r\n '[attr.data-mode]': 'mode()',\r\n '[attr.data-caption-layout]': 'captionLayout()',\r\n '[attr.data-disabled]': 'isDisabled() ? \"\" : null',\r\n '[attr.data-week-number]': 'showWeekNumber() ? \"\" : null',\r\n '[attr.data-date-labels]': 'hasDateLabels() ? \"\" : null',\r\n '[attr.dir]': 'dir()',\r\n },\r\n template: `\r\n <div class=\"frame-calendar__header\">\r\n <button\r\n class=\"frame-calendar__nav-button\"\r\n type=\"button\"\r\n [disabled]=\"isDisabled()\"\r\n (click)=\"previousMonth()\"\r\n [attr.aria-label]=\"previousMonthLabel()\"\r\n >\r\n @if (previousMonthTemplate(); as template) {\r\n <ng-container [ngTemplateOutlet]=\"template\" />\r\n } @else {\r\n <svg\r\n class=\"frame-calendar__nav-icon\"\r\n aria-hidden=\"true\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path d=\"m15 18-6-6 6-6\"></path>\r\n </svg>\r\n }\r\n </button>\r\n\r\n @if (captionLayout() === 'dropdown') {\r\n <div class=\"frame-calendar__caption-controls\">\r\n <button\r\n class=\"frame-calendar__select\"\r\n [frSelect]=\"monthMenu\"\r\n [disabled]=\"isDisabled()\"\r\n [value]=\"currentMonthValue()\"\r\n (valueChange)=\"setMonth($event)\"\r\n indicatorPosition=\"end\"\r\n aria-label=\"Month\"\r\n type=\"button\"\r\n >\r\n <frame-select-value></frame-select-value>\r\n <span frSelectIcon>\r\n <svg\r\n class=\"frame-calendar__select-icon\"\r\n aria-hidden=\"true\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path d=\"m6 9 6 6 6-6\"></path>\r\n </svg>\r\n </span>\r\n </button>\r\n\r\n <ng-template #monthMenu=\"frSelectContent\" frSelectContent>\r\n <frame-select-panel>\r\n <frame-select-group>\r\n @for (month of monthOptions(); track month.value) {\r\n <button frSelectItem [value]=\"month.value\" [label]=\"month.label\" type=\"button\">\r\n {{ month.label }}\r\n </button>\r\n }\r\n </frame-select-group>\r\n </frame-select-panel>\r\n </ng-template>\r\n\r\n <button\r\n class=\"frame-calendar__select\"\r\n [frSelect]=\"yearMenu\"\r\n [disabled]=\"isDisabled()\"\r\n [value]=\"currentYearValue()\"\r\n (valueChange)=\"setYear($event)\"\r\n indicatorPosition=\"end\"\r\n aria-label=\"Year\"\r\n type=\"button\"\r\n >\r\n <frame-select-value></frame-select-value>\r\n <span frSelectIcon>\r\n <svg\r\n class=\"frame-calendar__select-icon\"\r\n aria-hidden=\"true\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path d=\"m6 9 6 6 6-6\"></path>\r\n </svg>\r\n </span>\r\n </button>\r\n\r\n <ng-template #yearMenu=\"frSelectContent\" frSelectContent>\r\n <frame-select-panel>\r\n <frame-select-group>\r\n @for (year of yearOptions(); track year) {\r\n <button frSelectItem [value]=\"year\" [label]=\"year\" type=\"button\">\r\n {{ year }}\r\n </button>\r\n }\r\n </frame-select-group>\r\n </frame-select-panel>\r\n </ng-template>\r\n </div>\r\n } @else {\r\n <div class=\"frame-calendar__caption\" aria-live=\"polite\">\r\n {{ monthLabel(currentMonth()) }}\r\n </div>\r\n }\r\n\r\n <button\r\n class=\"frame-calendar__nav-button\"\r\n type=\"button\"\r\n [disabled]=\"isDisabled()\"\r\n (click)=\"nextMonth()\"\r\n [attr.aria-label]=\"nextMonthLabel()\"\r\n >\r\n @if (nextMonthTemplate(); as template) {\r\n <ng-container [ngTemplateOutlet]=\"template\" />\r\n } @else {\r\n <svg\r\n class=\"frame-calendar__nav-icon\"\r\n aria-hidden=\"true\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path d=\"m9 18 6-6-6-6\"></path>\r\n </svg>\r\n }\r\n </button>\r\n </div>\r\n\r\n <div class=\"frame-calendar__months\">\r\n @for (month of months(); track month.key) {\r\n <section class=\"frame-calendar__month\" [attr.aria-label]=\"month.label\">\r\n @if (numberOfMonths() > 1 || captionLayout() === 'dropdown') {\r\n <h3 class=\"frame-calendar__month-caption\">{{ month.label }}</h3>\r\n }\r\n\r\n <table class=\"frame-calendar__table\" role=\"grid\" [attr.aria-readonly]=\"true\">\r\n <colgroup>\r\n @if (showWeekNumber()) {\r\n <col class=\"frame-calendar__week-number-column\" />\r\n }\r\n @for (weekday of weekdayLabels(); track weekday) {\r\n <col class=\"frame-calendar__day-column\" />\r\n }\r\n </colgroup>\r\n <thead>\r\n <tr>\r\n @if (showWeekNumber()) {\r\n <th class=\"frame-calendar__week-number-header\" scope=\"col\">Wk</th>\r\n }\r\n @for (weekday of weekdayLabels(); track weekday) {\r\n <th class=\"frame-calendar__weekday\" scope=\"col\">{{ weekday }}</th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (week of month.weeks; track week[0].key) {\r\n <tr>\r\n @if (showWeekNumber()) {\r\n <td class=\"frame-calendar__week-number\">{{ weekNumber(week[0].date) }}</td>\r\n }\r\n @for (day of week; track day.key) {\r\n <td\r\n class=\"frame-calendar__cell\"\r\n [attr.data-outside]=\"day.outside ? '' : null\"\r\n [attr.data-selected]=\"day.selected ? '' : null\"\r\n [attr.data-range-start]=\"day.rangeStart ? '' : null\"\r\n [attr.data-range-middle]=\"day.rangeMiddle ? '' : null\"\r\n [attr.data-range-end]=\"day.rangeEnd ? '' : null\"\r\n [attr.data-today]=\"day.today ? '' : null\"\r\n [attr.data-disabled-date]=\"day.disabledDate ? '' : null\"\r\n >\r\n <button\r\n class=\"frame-calendar__day\"\r\n type=\"button\"\r\n [disabled]=\"isDisabled() || day.disabled\"\r\n [attr.data-date]=\"day.key\"\r\n [attr.tabindex]=\"dayTabIndex(day)\"\r\n [attr.aria-label]=\"dayLabel(day.date)\"\r\n [attr.aria-pressed]=\"day.selected ? 'true' : 'false'\"\r\n [attr.aria-selected]=\"day.selected ? 'true' : 'false'\"\r\n [attr.aria-current]=\"day.today ? 'date' : null\"\r\n (click)=\"selectDay(day)\"\r\n (focus)=\"focusedDate.set(day.date)\"\r\n (keydown)=\"handleDayKeydown($event, day)\"\r\n >\r\n @if (cellTemplate(); as template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"day\"\r\n />\r\n } @else {\r\n <span class=\"frame-calendar__day-number\">{{ day.day }}</span>\r\n @if (day.dateLabel) {\r\n <span class=\"frame-calendar__day-meta\">{{ day.dateLabel }}</span>\r\n }\r\n }\r\n </button>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n </section>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class FrCalendar implements ControlValueAccessor {\r\n readonly mode = input<FrCalendarMode>('single');\r\n readonly captionLayout = input<FrCalendarCaptionLayout>('label');\r\n readonly numberOfMonths = input(1);\r\n readonly firstDayOfWeek = input(0);\r\n readonly locale = input('en-US');\r\n readonly timeZone = input<string | undefined>(undefined);\r\n readonly dir = input<'ltr' | 'rtl'>('ltr');\r\n readonly fromYear = input(new Date().getFullYear() - 100);\r\n readonly toYear = input(new Date().getFullYear() + 20);\r\n readonly showOutsideDays = input(true, { transform: booleanAttribute });\r\n readonly showWeekNumber = input(false, { transform: booleanAttribute });\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n readonly disabledDates = input<Date[]>([]);\r\n readonly dateLabels = input<Record<string, string>>({});\r\n readonly disabledMatcher = input<FrCalendarDisabledMatcher | null>(null);\r\n readonly cellTemplate = input<TemplateRef<FrCalendarCellContext> | null>(null);\r\n readonly previousMonthTemplate = input<TemplateRef<unknown> | null>(null);\r\n readonly nextMonthTemplate = input<TemplateRef<unknown> | null>(null);\r\n readonly previousMonthLabel = input('Previous month');\r\n readonly nextMonthLabel = input('Next month');\r\n readonly month = input<Date | null | undefined>(undefined);\r\n readonly selected = input<Date | FrCalendarDateRange | null | undefined>(undefined);\r\n\r\n readonly selectedChange = output<Date | FrCalendarDateRange | null>();\r\n readonly monthChange = output<Date>();\r\n\r\n readonly focusedDate = signal<Date | null>(null);\r\n private readonly navigatedMonth = signal<Date | null>(null);\r\n private readonly internalValue = signal<Date | FrCalendarDateRange | null>(null);\r\n private readonly cvaDisabled = signal(false);\r\n private readonly host = inject(ElementRef<HTMLElement>);\r\n\r\n readonly currentMonth = computed(() =>\r\n startOfMonth(this.navigatedMonth() ?? this.month() ?? new Date()),\r\n );\r\n readonly currentMonthValue = computed(() => String(this.currentMonth().getMonth()));\r\n readonly currentYearValue = computed(() => String(this.currentMonth().getFullYear()));\r\n readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\r\n readonly value = computed(() => {\r\n const selected = this.selected();\r\n return normalizeValue(selected !== undefined ? selected : this.internalValue(), this.mode());\r\n });\r\n readonly weekdayLabels = computed(() =>\r\n buildWeekdayLabels(this.locale(), this.firstDayOfWeek(), this.timeZone()),\r\n );\r\n readonly monthOptions = computed(() =>\r\n Array.from({ length: 12 }, (_, value) => ({\r\n value: String(value),\r\n label: new Intl.DateTimeFormat(this.locale(), {\r\n month: 'short',\r\n timeZone: this.timeZone(),\r\n }).format(new Date(2026, value, 1)),\r\n })),\r\n );\r\n readonly yearOptions = computed(() =>\r\n Array.from(\r\n { length: Math.max(0, this.toYear() - this.fromYear() + 1) },\r\n (_, index) => String(this.fromYear() + index),\r\n ),\r\n );\r\n readonly months = computed(() =>\r\n Array.from({ length: Math.max(1, this.numberOfMonths()) }, (_, index) =>\r\n this.buildMonth(addMonths(this.currentMonth(), index)),\r\n ),\r\n );\r\n readonly activeDate = computed(() => this.resolveActiveDate());\r\n readonly hasDateLabels = computed(() => Object.keys(this.dateLabels()).length > 0);\r\n\r\n private onTouched: () => void = () => undefined;\r\n private onChange: (value: Date | FrCalendarDateRange | null) => void = () => undefined;\r\n\r\n writeValue(value: Date | FrCalendarDateRange | null): void {\r\n this.internalValue.set(normalizeValue(value, this.mode()));\r\n\r\n if (value instanceof Date) {\r\n this.navigatedMonth.set(startOfMonth(value));\r\n } else if (isRange(value) && value.from) {\r\n this.navigatedMonth.set(startOfMonth(value.from));\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: Date | FrCalendarDateRange | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.cvaDisabled.set(isDisabled);\r\n }\r\n\r\n previousMonth(): void {\r\n this.updateMonth(addMonths(this.currentMonth(), -1));\r\n }\r\n\r\n nextMonth(): void {\r\n this.updateMonth(addMonths(this.currentMonth(), 1));\r\n }\r\n\r\n setMonth(value: string | null): void {\r\n if (value === null) {\r\n return;\r\n }\r\n\r\n const month = new Date(this.currentMonth().getFullYear(), Number(value), 1);\r\n this.updateMonth(month);\r\n }\r\n\r\n setYear(value: string | null): void {\r\n if (value === null) {\r\n return;\r\n }\r\n\r\n const month = new Date(Number(value), this.currentMonth().getMonth(), 1);\r\n this.updateMonth(month);\r\n }\r\n\r\n selectDay(day: CalendarDay): void {\r\n if (this.isDisabled() || day.disabled) {\r\n return;\r\n }\r\n\r\n this.onTouched();\r\n\r\n const nextValue =\r\n this.mode() === 'range' ? nextRangeValue(this.value(), day.date) : cloneDate(day.date);\r\n\r\n this.internalValue.set(nextValue);\r\n this.onChange(nextValue);\r\n this.selectedChange.emit(nextValue);\r\n }\r\n\r\n handleDayKeydown(event: KeyboardEvent, day: CalendarDay): void {\r\n const offset = this.navigationOffset(event.key);\r\n\r\n if (offset === null || this.isDisabled()) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n\r\n const next = addDays(day.date, offset);\r\n this.focusedDate.set(next);\r\n\r\n if (!this.isDateVisible(next)) {\r\n this.updateMonth(startOfMonth(next));\r\n }\r\n\r\n this.focusDay(next);\r\n }\r\n\r\n dayTabIndex(day: CalendarDay): number {\r\n return sameDate(day.date, this.activeDate()) ? 0 : -1;\r\n }\r\n\r\n focusActiveDate(): void {\r\n this.focusDay(this.activeDate());\r\n }\r\n\r\n monthLabel(date: Date): string {\r\n return new Intl.DateTimeFormat(this.locale(), {\r\n month: 'long',\r\n year: 'numeric',\r\n timeZone: this.timeZone(),\r\n }).format(date);\r\n }\r\n\r\n dayLabel(date: Date): string {\r\n return new Intl.DateTimeFormat(this.locale(), {\r\n dateStyle: 'full',\r\n timeZone: this.timeZone(),\r\n }).format(date);\r\n }\r\n\r\n weekNumber(date: Date): string {\r\n return isoWeekNumber(date).toString().padStart(2, '0');\r\n }\r\n\r\n private navigationOffset(key: string): number | null {\r\n switch (key) {\r\n case 'ArrowLeft':\r\n return this.dir() === 'rtl' ? 1 : -1;\r\n case 'ArrowRight':\r\n return this.dir() === 'rtl' ? -1 : 1;\r\n case 'ArrowUp':\r\n return -7;\r\n case 'ArrowDown':\r\n return 7;\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n private resolveActiveDate(): Date {\r\n const focused = this.focusedDate();\r\n\r\n // Prefer the roving-focus target, then selection, then today, then first enabled day.\r\n if (focused && this.findDay(focused) && !this.isDayDisabled(focused)) {\r\n return cloneDate(focused);\r\n }\r\n\r\n const selected = this.selectedDate();\r\n\r\n if (selected && this.findDay(selected) && !this.isDayDisabled(selected)) {\r\n return cloneDate(selected);\r\n }\r\n\r\n const today = new Date();\r\n\r\n if (this.findDay(today) && !this.isDayDisabled(today)) {\r\n return cloneDate(today);\r\n }\r\n\r\n const firstEnabled = this.months()\r\n .flatMap((month) => month.weeks.flat())\r\n .find((day) => !day.disabled);\r\n\r\n return firstEnabled ? cloneDate(firstEnabled.date) : cloneDate(this.currentMonth());\r\n }\r\n\r\n private selectedDate(): Date | null {\r\n const value = this.value();\r\n\r\n if (value instanceof Date) {\r\n return value;\r\n }\r\n\r\n if (isRange(value)) {\r\n return value.from ?? value.to;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private isDateVisible(date: Date): boolean {\r\n return this.months().some((month) =>\r\n month.weeks.some((week) => week.some((day) => sameDate(day.date, date))),\r\n );\r\n }\r\n\r\n private findDay(date: Date): CalendarDay | null {\r\n for (const month of this.months()) {\r\n for (const week of month.weeks) {\r\n const day = week.find((item) => sameDate(item.date, date));\r\n\r\n if (day) {\r\n return day;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private isDayDisabled(date: Date): boolean {\r\n return this.findDay(date)?.disabled ?? true;\r\n }\r\n\r\n private focusDay(date: Date): void {\r\n if (this.focusDayElement(date)) {\r\n return;\r\n }\r\n\r\n // Month navigation may render the target button one tick later.\r\n setTimeout(() => {\r\n this.focusDayElement(date);\r\n });\r\n }\r\n\r\n private focusDayElement(date: Date): boolean {\r\n const button = this.host.nativeElement.querySelector(\r\n `.frame-calendar__day[data-date=\"${dateKey(date)}\"]`,\r\n ) as HTMLButtonElement | null;\r\n\r\n button?.focus();\r\n\r\n return !!button;\r\n }\r\n\r\n private updateMonth(month: Date): void {\r\n const next = startOfMonth(month);\r\n this.navigatedMonth.set(next);\r\n this.monthChange.emit(cloneDate(next));\r\n }\r\n\r\n private buildMonth(monthDate: Date): CalendarMonth {\r\n const start = startOfMonth(monthDate);\r\n const gridStart = startOfWeek(start, this.firstDayOfWeek());\r\n const weeks: CalendarDay[][] = [];\r\n\r\n // Always build a six-week grid so layout height stays stable across months.\r\n for (let week = 0; week < 6; week++) {\r\n const days: CalendarDay[] = [];\r\n\r\n for (let dayIndex = 0; dayIndex < 7; dayIndex++) {\r\n const date = addDays(gridStart, week * 7 + dayIndex);\r\n const outside = date.getMonth() !== start.getMonth();\r\n const key = dateKey(date);\r\n const disabledDate = hasDate(this.disabledDates(), date);\r\n const disabled =\r\n (!this.showOutsideDays() && outside) ||\r\n disabledDate ||\r\n (this.disabledMatcher()?.(cloneDate(date)) ?? false);\r\n const selection = selectionState(this.value(), date, this.mode());\r\n\r\n days.push({\r\n date,\r\n day: date.getDate(),\r\n key,\r\n dateLabel: this.dateLabels()[key],\r\n disabled,\r\n disabledDate,\r\n outside,\r\n today: sameDate(date, new Date()),\r\n ...selection,\r\n });\r\n }\r\n\r\n weeks.push(days);\r\n }\r\n\r\n return {\r\n date: start,\r\n key: `${start.getFullYear()}-${start.getMonth()}`,\r\n label: this.monthLabel(start),\r\n weeks,\r\n };\r\n }\r\n}\r\n\r\nfunction buildWeekdayLabels(locale: string, firstDayOfWeek: number, timeZone?: string): string[] {\r\n const baseSunday = new Date(2026, 5, 7);\r\n\r\n return Array.from({ length: 7 }, (_, index) => {\r\n const day = addDays(baseSunday, (firstDayOfWeek + index) % 7);\r\n return new Intl.DateTimeFormat(locale, {\r\n weekday: 'short',\r\n timeZone,\r\n }).format(day);\r\n });\r\n}\r\n\r\nfunction normalizeValue(\r\n value: Date | FrCalendarDateRange | null | undefined,\r\n mode: FrCalendarMode,\r\n): Date | FrCalendarDateRange | null {\r\n if (!value) {\r\n return mode === 'range' ? { from: null, to: null } : null;\r\n }\r\n\r\n if (mode === 'range') {\r\n if (isRange(value)) {\r\n return {\r\n from: value.from ? cloneDate(value.from) : null,\r\n to: value.to ? cloneDate(value.to) : null,\r\n };\r\n }\r\n\r\n return { from: cloneDate(value), to: null };\r\n }\r\n\r\n return value instanceof Date ? cloneDate(value) : value.from ? cloneDate(value.from) : null;\r\n}\r\n\r\nfunction nextRangeValue(value: Date | FrCalendarDateRange | null, selected: Date): FrCalendarDateRange {\r\n const range = isRange(value) ? value : { from: null, to: null };\r\n\r\n if (!range.from || range.to) {\r\n return { from: cloneDate(selected), to: null };\r\n }\r\n\r\n if (selected < range.from) {\r\n return { from: cloneDate(selected), to: cloneDate(range.from) };\r\n }\r\n\r\n return { from: cloneDate(range.from), to: cloneDate(selected) };\r\n}\r\n\r\nfunction selectionState(value: Date | FrCalendarDateRange | null, date: Date, mode: FrCalendarMode) {\r\n if (mode === 'range' && isRange(value)) {\r\n const from = value.from;\r\n const to = value.to;\r\n const rangeStart = !!from && sameDate(date, from);\r\n const rangeEnd = !!to && sameDate(date, to);\r\n const rangeMiddle = !!from && !!to && date > from && date < to;\r\n\r\n return {\r\n selected: rangeStart || rangeEnd || rangeMiddle,\r\n rangeStart,\r\n rangeMiddle,\r\n rangeEnd,\r\n };\r\n }\r\n\r\n const selected = value instanceof Date && sameDate(date, value);\r\n\r\n return {\r\n selected,\r\n rangeStart: selected,\r\n rangeMiddle: false,\r\n rangeEnd: selected,\r\n };\r\n}\r\n\r\nfunction isRange(value: unknown): value is FrCalendarDateRange {\r\n return !!value && typeof value === 'object' && ('from' in value || 'to' in value);\r\n}\r\n\r\nfunction hasDate(dates: Date[], date: Date): boolean {\r\n return dates.some((item) => sameDate(item, date));\r\n}\r\n\r\nfunction sameDate(a: Date, b: Date): boolean {\r\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\r\n}\r\n\r\nfunction dateKey(date: Date): string {\r\n const year = date.getFullYear();\r\n const month = `${date.getMonth() + 1}`.padStart(2, '0');\r\n const day = `${date.getDate()}`.padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n}\r\n\r\nfunction cloneDate(date: Date): Date {\r\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\r\n}\r\n\r\nfunction startOfMonth(date: Date): Date {\r\n return new Date(date.getFullYear(), date.getMonth(), 1);\r\n}\r\n\r\nfunction addMonths(date: Date, amount: number): Date {\r\n return new Date(date.getFullYear(), date.getMonth() + amount, 1);\r\n}\r\n\r\nfunction addDays(date: Date, amount: number): Date {\r\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + amount);\r\n}\r\n\r\nfunction startOfWeek(date: Date, firstDayOfWeek: number): Date {\r\n const normalized = ((firstDayOfWeek % 7) + 7) % 7;\r\n const diff = (date.getDay() - normalized + 7) % 7;\r\n return addDays(date, -diff);\r\n}\r\n\r\nfunction isoWeekNumber(date: Date): number {\r\n const target = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNumber = target.getUTCDay() || 7;\r\n target.setUTCDate(target.getUTCDate() + 4 - dayNumber);\r\n const yearStart = new Date(Date.UTC(target.getUTCFullYear(), 0, 1));\r\n return Math.ceil(((target.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\r\n}\r\n\r\n","import { NgModule } from '@angular/core';\nimport {\n FrCalendar,\n} from './src/calendar';\n\n@NgModule({\n imports: [\n FrCalendar,\n ],\n exports: [\n FrCalendar,\n ],\n})\nexport class FrCalendarModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;AAoDA,MAAM,cAAc,GAAG;AACrB,IAAA,OAAO,EAAE,iBAAiB;AAC1B,IAAA,WAAW,EAAE,UAAU,CAAC,MAAM,UAAU,CAAC;AACzC,IAAA,KAAK,EAAE,IAAI;CACZ;AAED;MA0Oa,UAAU,CAAA;AACZ,IAAA,IAAI,GAAG,KAAK,CAAiB,QAAQ,2EAAC;AACtC,IAAA,aAAa,GAAG,KAAK,CAA0B,OAAO,oFAAC;AACvD,IAAA,cAAc,GAAG,KAAK,CAAC,CAAC,qFAAC;AACzB,IAAA,cAAc,GAAG,KAAK,CAAC,CAAC,qFAAC;AACzB,IAAA,MAAM,GAAG,KAAK,CAAC,OAAO,6EAAC;AACvB,IAAA,QAAQ,GAAG,KAAK,CAAqB,SAAS,+EAAC;AAC/C,IAAA,GAAG,GAAG,KAAK,CAAgB,KAAK,0EAAC;AACjC,IAAA,QAAQ,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG,GAAG,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAChD,IAAA,MAAM,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;IAC7C,eAAe,GAAG,KAAK,CAAC,IAAI,uFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAC9D,cAAc,GAAG,KAAK,CAAC,KAAK,sFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAC9D,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AACxD,IAAA,aAAa,GAAG,KAAK,CAAS,EAAE,oFAAC;AACjC,IAAA,UAAU,GAAG,KAAK,CAAyB,EAAE,iFAAC;AAC9C,IAAA,eAAe,GAAG,KAAK,CAAmC,IAAI,sFAAC;AAC/D,IAAA,YAAY,GAAG,KAAK,CAA4C,IAAI,mFAAC;AACrE,IAAA,qBAAqB,GAAG,KAAK,CAA8B,IAAI,4FAAC;AAChE,IAAA,iBAAiB,GAAG,KAAK,CAA8B,IAAI,wFAAC;AAC5D,IAAA,kBAAkB,GAAG,KAAK,CAAC,gBAAgB,yFAAC;AAC5C,IAAA,cAAc,GAAG,KAAK,CAAC,YAAY,qFAAC;AACpC,IAAA,KAAK,GAAG,KAAK,CAA0B,SAAS,4EAAC;AACjD,IAAA,QAAQ,GAAG,KAAK,CAAgD,SAAS,+EAAC;IAE1E,cAAc,GAAG,MAAM,EAAqC;IAC5D,WAAW,GAAG,MAAM,EAAQ;AAE5B,IAAA,WAAW,GAAG,MAAM,CAAc,IAAI,kFAAC;AAC/B,IAAA,cAAc,GAAG,MAAM,CAAc,IAAI,qFAAC;AAC1C,IAAA,aAAa,GAAG,MAAM,CAAoC,IAAI,oFAAC;AAC/D,IAAA,WAAW,GAAG,MAAM,CAAC,KAAK,kFAAC;AAC3B,IAAA,IAAI,GAAG,MAAM,EAAC,UAAuB,EAAC;IAE9C,YAAY,GAAG,QAAQ,CAAC,MAC/B,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAClE;AACQ,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,QAAQ,EAAE,CAAC,wFAAC;AAC1E,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,WAAW,EAAE,CAAC,uFAAC;AAC5E,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,iFAAC;AAClE,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAK;AAC7B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;QAChC,OAAO,cAAc,CAAC,QAAQ,KAAK,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AAC9F,IAAA,CAAC,4EAAC;IACO,aAAa,GAAG,QAAQ,CAAC,MAChC,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC1E;IACQ,YAAY,GAAG,QAAQ,CAAC,MAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,MAAM;AACxC,QAAA,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;QACpB,KAAK,EAAE,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;AAC5C,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AAC1B,SAAA,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;KACpC,CAAC,CAAC,mFACJ;IACQ,WAAW,GAAG,QAAQ,CAAC,MAC9B,KAAK,CAAC,IAAI,CACR,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,EAAE,EAC5D,CAAC,CAAC,EAAE,KAAK,KAAK,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,CAC9C,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACF;IACQ,MAAM,GAAG,QAAQ,CAAC,MACzB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,KAClE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC,CACvD,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACF;IACQ,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;IACrD,aAAa,GAAG,QAAQ,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,oFAAC;AAE1E,IAAA,SAAS,GAAe,MAAM,SAAS;AACvC,IAAA,QAAQ,GAAuD,MAAM,SAAS;AAEtF,IAAA,UAAU,CAAC,KAAwC,EAAA;AACjD,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAE1D,QAAA,IAAI,KAAK,YAAY,IAAI,EAAE;YACzB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC9C;aAAO,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE;AACvC,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD;IACF;AAEA,IAAA,gBAAgB,CAAC,EAAsD,EAAA;AACrE,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;IAClC;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACtD;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC;IACrD;AAEA,IAAA,QAAQ,CAAC,KAAoB,EAAA;AAC3B,QAAA,IAAI,KAAK,KAAK,IAAI,EAAE;YAClB;QACF;QAEA,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC3E,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;IACzB;AAEA,IAAA,OAAO,CAAC,KAAoB,EAAA;AAC1B,QAAA,IAAI,KAAK,KAAK,IAAI,EAAE;YAClB;QACF;QAEA,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACxE,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;IACzB;AAEA,IAAA,SAAS,CAAC,GAAgB,EAAA;QACxB,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,CAAC,QAAQ,EAAE;YACrC;QACF;QAEA,IAAI,CAAC,SAAS,EAAE;AAEhB,QAAA,MAAM,SAAS,GACb,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AAExF,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;AACjC,QAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;AACxB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;IACrC;IAEA,gBAAgB,CAAC,KAAoB,EAAE,GAAgB,EAAA;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC;QAE/C,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACxC;QACF;QAEA,KAAK,CAAC,cAAc,EAAE;QAEtB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC;AACtC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAE1B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE;YAC7B,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACtC;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IACrB;AAEA,IAAA,WAAW,CAAC,GAAgB,EAAA;QAC1B,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvD;IAEA,eAAe,GAAA;QACb,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IAClC;AAEA,IAAA,UAAU,CAAC,IAAU,EAAA;QACnB,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;AAC5C,YAAA,KAAK,EAAE,MAAM;AACb,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AAC1B,SAAA,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;IACjB;AAEA,IAAA,QAAQ,CAAC,IAAU,EAAA;QACjB,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;AAC5C,YAAA,SAAS,EAAE,MAAM;AACjB,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AAC1B,SAAA,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;IACjB;AAEA,IAAA,UAAU,CAAC,IAAU,EAAA;AACnB,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;IACxD;AAEQ,IAAA,gBAAgB,CAAC,GAAW,EAAA;QAClC,QAAQ,GAAG;AACT,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;AACtC,YAAA,KAAK,YAAY;AACf,gBAAA,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;AACtC,YAAA,KAAK,SAAS;gBACZ,OAAO,CAAC,CAAC;AACX,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,CAAC;AACV,YAAA;AACE,gBAAA,OAAO,IAAI;;IAEjB;IAEQ,iBAAiB,GAAA;AACvB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE;;AAGlC,QAAA,IAAI,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE;AACpE,YAAA,OAAO,SAAS,CAAC,OAAO,CAAC;QAC3B;AAEA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE;AAEpC,QAAA,IAAI,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE;AACvE,YAAA,OAAO,SAAS,CAAC,QAAQ,CAAC;QAC5B;AAEA,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;AAExB,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;AACrD,YAAA,OAAO,SAAS,CAAC,KAAK,CAAC;QACzB;AAEA,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM;AAC7B,aAAA,OAAO,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;aACrC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;QAE/B,OAAO,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;IACrF;IAEQ,YAAY,GAAA;AAClB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAE1B,QAAA,IAAI,KAAK,YAAY,IAAI,EAAE;AACzB,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;AAClB,YAAA,OAAO,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE;QAC/B;AAEA,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,aAAa,CAAC,IAAU,EAAA;AAC9B,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,KAC9B,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CACzE;IACH;AAEQ,IAAA,OAAO,CAAC,IAAU,EAAA;QACxB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;AACjC,YAAA,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;gBAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAE1D,IAAI,GAAG,EAAE;AACP,oBAAA,OAAO,GAAG;gBACZ;YACF;QACF;AAEA,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,aAAa,CAAC,IAAU,EAAA;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,IAAI,IAAI;IAC7C;AAEQ,IAAA,QAAQ,CAAC,IAAU,EAAA;AACzB,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE;YAC9B;QACF;;QAGA,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAC5B,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,eAAe,CAAC,IAAU,EAAA;AAChC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAClD,mCAAmC,OAAO,CAAC,IAAI,CAAC,CAAA,EAAA,CAAI,CACzB;QAE7B,MAAM,EAAE,KAAK,EAAE;QAEf,OAAO,CAAC,CAAC,MAAM;IACjB;AAEQ,IAAA,WAAW,CAAC,KAAW,EAAA;AAC7B,QAAA,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC;AAChC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACxC;AAEQ,IAAA,UAAU,CAAC,SAAe,EAAA;AAChC,QAAA,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC;QACrC,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAoB,EAAE;;AAGjC,QAAA,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE;YACnC,MAAM,IAAI,GAAkB,EAAE;AAE9B,YAAA,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,EAAE,QAAQ,EAAE,EAAE;AAC/C,gBAAA,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC;gBACpD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,KAAK,CAAC,QAAQ,EAAE;AACpD,gBAAA,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;gBACzB,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC;gBACxD,MAAM,QAAQ,GACZ,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,OAAO;oBACnC,YAAY;AACZ,qBAAC,IAAI,CAAC,eAAe,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;AACtD,gBAAA,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;gBAEjE,IAAI,CAAC,IAAI,CAAC;oBACR,IAAI;AACJ,oBAAA,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE;oBACnB,GAAG;AACH,oBAAA,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC;oBACjC,QAAQ;oBACR,YAAY;oBACZ,OAAO;oBACP,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;AACjC,oBAAA,GAAG,SAAS;AACb,iBAAA,CAAC;YACJ;AAEA,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAClB;QAEA,OAAO;AACL,YAAA,IAAI,EAAE,KAAK;YACX,GAAG,EAAE,CAAA,EAAG,KAAK,CAAC,WAAW,EAAE,CAAA,CAAA,EAAI,KAAK,CAAC,QAAQ,EAAE,CAAA,CAAE;AACjD,YAAA,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAC7B,KAAK;SACN;IACH;wGA1UW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,4BAAA,EAAA,uBAAA,EAAA,gCAAA,EAAA,uBAAA,EAAA,+BAAA,EAAA,UAAA,EAAA,OAAA,EAAA,EAAA,cAAA,EAAA,qCAAA,EAAA,EAAA,SAAA,EAtOV,CAAC,cAAc,CAAC,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAWjB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyNT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EArOS,gBAAgB,mJAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,cAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,qCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,qCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,qCAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAuO/B,UAAU,EAAA,UAAA,EAAA,CAAA;kBAzOtB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,OAAO,EAAE,CAAC,gBAAgB,EAAE,cAAc,CAAC;oBAC3C,SAAS,EAAE,CAAC,cAAc,CAAC;oBAC3B,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,qCAAqC;AAC5C,wBAAA,kBAAkB,EAAE,QAAQ;AAC5B,wBAAA,4BAA4B,EAAE,iBAAiB;AAC/C,wBAAA,sBAAsB,EAAE,0BAA0B;AAClD,wBAAA,yBAAyB,EAAE,8BAA8B;AACzD,wBAAA,yBAAyB,EAAE,6BAA6B;AACxD,wBAAA,YAAY,EAAE,OAAO;AACtB,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyNT,EAAA,CAAA;AACF,iBAAA;;AA8UD,SAAS,kBAAkB,CAAC,MAAc,EAAE,cAAsB,EAAE,QAAiB,EAAA;IACnF,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;AAEvC,IAAA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,KAAI;AAC5C,QAAA,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,cAAc,GAAG,KAAK,IAAI,CAAC,CAAC;AAC7D,QAAA,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;AACrC,YAAA,OAAO,EAAE,OAAO;YAChB,QAAQ;AACT,SAAA,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;AAChB,IAAA,CAAC,CAAC;AACJ;AAEA,SAAS,cAAc,CACrB,KAAoD,EACpD,IAAoB,EAAA;IAEpB,IAAI,CAAC,KAAK,EAAE;AACV,QAAA,OAAO,IAAI,KAAK,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI;IAC3D;AAEA,IAAA,IAAI,IAAI,KAAK,OAAO,EAAE;AACpB,QAAA,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;YAClB,OAAO;AACL,gBAAA,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI;AAC/C,gBAAA,EAAE,EAAE,KAAK,CAAC,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI;aAC1C;QACH;AAEA,QAAA,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE;IAC7C;AAEA,IAAA,OAAO,KAAK,YAAY,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI;AAC7F;AAEA,SAAS,cAAc,CAAC,KAAwC,EAAE,QAAc,EAAA;IAC9E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE;IAE/D,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,EAAE;AAC3B,QAAA,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE;IAChD;AAEA,IAAA,IAAI,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE;AACzB,QAAA,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;IACjE;AAEA,IAAA,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;AACjE;AAEA,SAAS,cAAc,CAAC,KAAwC,EAAE,IAAU,EAAE,IAAoB,EAAA;IAChG,IAAI,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;AACtC,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI;AACvB,QAAA,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE;AACnB,QAAA,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;AACjD,QAAA,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;AAC3C,QAAA,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,EAAE;QAE9D,OAAO;AACL,YAAA,QAAQ,EAAE,UAAU,IAAI,QAAQ,IAAI,WAAW;YAC/C,UAAU;YACV,WAAW;YACX,QAAQ;SACT;IACH;AAEA,IAAA,MAAM,QAAQ,GAAG,KAAK,YAAY,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAE/D,OAAO;QACL,QAAQ;AACR,QAAA,UAAU,EAAE,QAAQ;AACpB,QAAA,WAAW,EAAE,KAAK;AAClB,QAAA,QAAQ,EAAE,QAAQ;KACnB;AACH;AAEA,SAAS,OAAO,CAAC,KAAc,EAAA;AAC7B,IAAA,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,KAAK,MAAM,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC;AACnF;AAEA,SAAS,OAAO,CAAC,KAAa,EAAE,IAAU,EAAA;AACxC,IAAA,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACnD;AAEA,SAAS,QAAQ,CAAC,CAAO,EAAE,CAAO,EAAA;AAChC,IAAA,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE;AAC5G;AAEA,SAAS,OAAO,CAAC,IAAU,EAAA;AACzB,IAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC/B,IAAA,MAAM,KAAK,GAAG,CAAA,EAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA,CAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACvD,IAAA,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,OAAO,EAAE,CAAA,CAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AAChD,IAAA,OAAO,GAAG,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,GAAG,EAAE;AAClC;AAEA,SAAS,SAAS,CAAC,IAAU,EAAA;AAC3B,IAAA,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AACtE;AAEA,SAAS,YAAY,CAAC,IAAU,EAAA;AAC9B,IAAA,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACzD;AAEA,SAAS,SAAS,CAAC,IAAU,EAAE,MAAc,EAAA;AAC3C,IAAA,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;AAClE;AAEA,SAAS,OAAO,CAAC,IAAU,EAAE,MAAc,EAAA;IACzC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC;AAC/E;AAEA,SAAS,WAAW,CAAC,IAAU,EAAE,cAAsB,EAAA;AACrD,IAAA,MAAM,UAAU,GAAG,CAAC,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AACjD,IAAA,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,UAAU,GAAG,CAAC,IAAI,CAAC;AACjD,IAAA,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC;AAC7B;AAEA,SAAS,aAAa,CAAC,IAAU,EAAA;IAC/B,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACtF,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC;AACzC,IAAA,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC;AACtD,IAAA,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACnE,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC;AACjF;;MC7tBa,gBAAgB,CAAA;wGAAhB,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;yGAAhB,gBAAgB,EAAA,OAAA,EAAA,CANzB,UAAU,CAAA,EAAA,OAAA,EAAA,CAGV,UAAU,CAAA,EAAA,CAAA;AAGD,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,YANzB,UAAU,CAAA,EAAA,CAAA;;4FAMD,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAR5B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,UAAU;AACX,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,UAAU;AACX,qBAAA;AACF,iBAAA;;;ACZD;;AAEG;;;;"}
@@ -19,14 +19,14 @@ class FrCard {
19
19
  return spacing ? FR_CARD_SPACING_VALUES[spacing] : null;
20
20
  }, ...(ngDevMode ? [{ debugName: "spacingValue" }] : /* istanbul ignore next */ []));
21
21
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCard, deps: [], target: i0.ɵɵFactoryTarget.Directive });
22
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrCard, isStandalone: true, selector: "[frCard], frame-card", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, spacing: { classPropertyName: "spacing", publicName: "spacing", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-size": "size()", "attr.data-spacing": "spacing()", "style.--frame-card-spacing": "spacingValue()" }, classAttribute: "frame-card" }, ngImport: i0 });
22
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrCard, isStandalone: true, selector: "[frCard], frame-card", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, spacing: { classPropertyName: "spacing", publicName: "spacing", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-size": "size()", "attr.data-spacing": "spacing()", "style.--frame-card-spacing": "spacingValue()" }, classAttribute: "frame-card frame-corner-handles" }, ngImport: i0 });
23
23
  }
24
24
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCard, decorators: [{
25
25
  type: Directive,
26
26
  args: [{
27
27
  selector: '[frCard], frame-card',
28
28
  host: {
29
- class: 'frame-card',
29
+ class: 'frame-card frame-corner-handles',
30
30
  '[attr.data-size]': 'size()',
31
31
  '[attr.data-spacing]': 'spacing()',
32
32
  '[style.--frame-card-spacing]': 'spacingValue()',
@@ -1 +1 @@
1
- {"version":3,"file":"frame-ui-ng-components-card.mjs","sources":["../../../projects/components/card/src/card.ts","../../../projects/components/card/card.module.ts","../../../projects/components/card/frame-ui-ng-components-card.ts"],"sourcesContent":["import { Directive, computed, input } from '@angular/core';\r\n\r\nexport const FR_CARD_SIZES = ['default', 'sm'] as const;\r\nexport const FR_CARD_SPACINGS = ['sm', 'md', 'lg', 'xl'] as const;\r\nexport const FR_CARD_FOOTER_ALIGNS = ['start', 'end', 'between'] as const;\r\n\r\nexport type FrCardSize = (typeof FR_CARD_SIZES)[number];\r\nexport type FrCardSpacing = (typeof FR_CARD_SPACINGS)[number];\r\nexport type FrCardFooterAlign = (typeof FR_CARD_FOOTER_ALIGNS)[number];\r\n\r\nconst FR_CARD_SPACING_VALUES: Record<FrCardSpacing, string> = {\r\n sm: '0.75rem',\r\n md: '1rem',\r\n lg: '1.25rem',\r\n xl: '2rem',\r\n};\r\n\r\n/** Card container with size and spacing controls. */\r\n@Directive({\r\n selector: '[frCard], frame-card',\r\n host: {\r\n class: 'frame-card',\r\n '[attr.data-size]': 'size()',\r\n '[attr.data-spacing]': 'spacing()',\r\n '[style.--frame-card-spacing]': 'spacingValue()',\r\n },\r\n})\r\nexport class FrCard {\r\n readonly size = input<FrCardSize>('default');\r\n readonly spacing = input<FrCardSpacing | null>(null);\r\n protected readonly spacingValue = computed(() => {\r\n const spacing = this.spacing();\r\n return spacing ? FR_CARD_SPACING_VALUES[spacing] : null;\r\n });\r\n}\r\n\r\n/** Header slot for card. */\r\n@Directive({\r\n selector: '[frCardHeader]',\r\n host: {\r\n class: 'frame-card__header',\r\n },\r\n})\r\nexport class FrCardHeader {}\r\n\r\n/** Title slot for card. */\r\n@Directive({\r\n selector: '[frCardTitle]',\r\n host: {\r\n class: 'frame-card__title',\r\n },\r\n})\r\nexport class FrCardTitle {}\r\n\r\n/** Description slot for card. */\r\n@Directive({\r\n selector: '[frCardDescription]',\r\n host: {\r\n class: 'frame-card__description',\r\n },\r\n})\r\nexport class FrCardDescription {}\r\n\r\n/** Action slot for card. */\r\n@Directive({\r\n selector: '[frCardAction]',\r\n host: {\r\n class: 'frame-card__action',\r\n },\r\n})\r\nexport class FrCardAction {}\r\n\r\n/** Content slot for card. */\r\n@Directive({\r\n selector: '[frCardContent]',\r\n host: {\r\n class: 'frame-card__content',\r\n },\r\n})\r\nexport class FrCardContent {}\r\n\r\n/** Footer slot for card. */\r\n@Directive({\r\n selector: '[frCardFooter]',\r\n host: {\r\n class: 'frame-card__footer',\r\n '[attr.data-align]': 'align()',\r\n },\r\n})\r\nexport class FrCardFooter {\r\n readonly align = input<FrCardFooterAlign>('start');\r\n}\r\n\r\n","import { NgModule } from '@angular/core';\nimport {\n FrCard,\n FrCardAction,\n FrCardContent,\n FrCardDescription,\n FrCardFooter,\n FrCardHeader,\n FrCardTitle,\n} from './src/card';\n\n@NgModule({\n imports: [\n FrCard,\n FrCardAction,\n FrCardContent,\n FrCardDescription,\n FrCardFooter,\n FrCardHeader,\n FrCardTitle,\n ],\n exports: [\n FrCard,\n FrCardAction,\n FrCardContent,\n FrCardDescription,\n FrCardFooter,\n FrCardHeader,\n FrCardTitle,\n ],\n})\nexport class FrCardModule {}\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":"frame-ui-ng-components-card.mjs","sources":["../../../projects/components/card/src/card.ts","../../../projects/components/card/card.module.ts","../../../projects/components/card/frame-ui-ng-components-card.ts"],"sourcesContent":["import { Directive, computed, input } from '@angular/core';\r\n\r\nexport const FR_CARD_SIZES = ['default', 'sm'] as const;\r\nexport const FR_CARD_SPACINGS = ['sm', 'md', 'lg', 'xl'] as const;\r\nexport const FR_CARD_FOOTER_ALIGNS = ['start', 'end', 'between'] as const;\r\n\r\nexport type FrCardSize = (typeof FR_CARD_SIZES)[number];\r\nexport type FrCardSpacing = (typeof FR_CARD_SPACINGS)[number];\r\nexport type FrCardFooterAlign = (typeof FR_CARD_FOOTER_ALIGNS)[number];\r\n\r\nconst FR_CARD_SPACING_VALUES: Record<FrCardSpacing, string> = {\r\n sm: '0.75rem',\r\n md: '1rem',\r\n lg: '1.25rem',\r\n xl: '2rem',\r\n};\r\n\r\n/** Card container with size and spacing controls. */\r\n@Directive({\r\n selector: '[frCard], frame-card',\r\n host: {\r\n class: 'frame-card frame-corner-handles',\r\n '[attr.data-size]': 'size()',\r\n '[attr.data-spacing]': 'spacing()',\r\n '[style.--frame-card-spacing]': 'spacingValue()',\r\n },\r\n})\r\nexport class FrCard {\r\n readonly size = input<FrCardSize>('default');\r\n readonly spacing = input<FrCardSpacing | null>(null);\r\n protected readonly spacingValue = computed(() => {\r\n const spacing = this.spacing();\r\n return spacing ? FR_CARD_SPACING_VALUES[spacing] : null;\r\n });\r\n}\r\n\r\n/** Header slot for card. */\r\n@Directive({\r\n selector: '[frCardHeader]',\r\n host: {\r\n class: 'frame-card__header',\r\n },\r\n})\r\nexport class FrCardHeader {}\r\n\r\n/** Title slot for card. */\r\n@Directive({\r\n selector: '[frCardTitle]',\r\n host: {\r\n class: 'frame-card__title',\r\n },\r\n})\r\nexport class FrCardTitle {}\r\n\r\n/** Description slot for card. */\r\n@Directive({\r\n selector: '[frCardDescription]',\r\n host: {\r\n class: 'frame-card__description',\r\n },\r\n})\r\nexport class FrCardDescription {}\r\n\r\n/** Action slot for card. */\r\n@Directive({\r\n selector: '[frCardAction]',\r\n host: {\r\n class: 'frame-card__action',\r\n },\r\n})\r\nexport class FrCardAction {}\r\n\r\n/** Content slot for card. */\r\n@Directive({\r\n selector: '[frCardContent]',\r\n host: {\r\n class: 'frame-card__content',\r\n },\r\n})\r\nexport class FrCardContent {}\r\n\r\n/** Footer slot for card. */\r\n@Directive({\r\n selector: '[frCardFooter]',\r\n host: {\r\n class: 'frame-card__footer',\r\n '[attr.data-align]': 'align()',\r\n },\r\n})\r\nexport class FrCardFooter {\r\n readonly align = input<FrCardFooterAlign>('start');\r\n}\r\n\r\n","import { NgModule } from '@angular/core';\nimport {\n FrCard,\n FrCardAction,\n FrCardContent,\n FrCardDescription,\n FrCardFooter,\n FrCardHeader,\n FrCardTitle,\n} from './src/card';\n\n@NgModule({\n imports: [\n FrCard,\n FrCardAction,\n FrCardContent,\n FrCardDescription,\n FrCardFooter,\n FrCardHeader,\n FrCardTitle,\n ],\n exports: [\n FrCard,\n FrCardAction,\n FrCardContent,\n FrCardDescription,\n FrCardFooter,\n FrCardHeader,\n FrCardTitle,\n ],\n})\nexport class FrCardModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -314,7 +314,7 @@ class FrCarousel {
314
314
  this.emit('select');
315
315
  }
316
316
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCarousel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
317
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrCarousel, isStandalone: true, selector: "[frCarousel], frame-carousel", inputs: { align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, loop: { classPropertyName: "loop", publicName: "loop", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, opts: { classPropertyName: "opts", publicName: "opts", isSignal: true, isRequired: false, transformFunction: null }, plugins: { classPropertyName: "plugins", publicName: "plugins", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { apiReady: "apiReady", selectedChange: "selectedChange" }, host: { attributes: { "role": "region", "tabindex": "0" }, listeners: { "keydown": "handleKeydown($event)" }, properties: { "attr.aria-roledescription": "\"carousel\"", "attr.data-align": "effectiveAlign()", "attr.data-orientation": "orientation()", "attr.dir": "effectiveDirection()" }, classAttribute: "frame-carousel" }, providers: [{ provide: FR_CAROUSEL, useExisting: FrCarousel }], exportAs: ["frCarousel"], ngImport: i0 });
317
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrCarousel, isStandalone: true, selector: "[frCarousel], frame-carousel", inputs: { align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, loop: { classPropertyName: "loop", publicName: "loop", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, opts: { classPropertyName: "opts", publicName: "opts", isSignal: true, isRequired: false, transformFunction: null }, plugins: { classPropertyName: "plugins", publicName: "plugins", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { apiReady: "apiReady", selectedChange: "selectedChange" }, host: { attributes: { "role": "region", "tabindex": "0" }, listeners: { "keydown": "handleKeydown($event)" }, properties: { "attr.aria-roledescription": "\"carousel\"", "attr.data-align": "effectiveAlign()", "attr.data-orientation": "orientation()", "attr.dir": "effectiveDirection()" }, classAttribute: "frame-carousel frame-corner-handles" }, providers: [{ provide: FR_CAROUSEL, useExisting: FrCarousel }], exportAs: ["frCarousel"], ngImport: i0 });
318
318
  }
319
319
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCarousel, decorators: [{
320
320
  type: Directive,
@@ -322,7 +322,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
322
322
  selector: '[frCarousel], frame-carousel',
323
323
  exportAs: 'frCarousel',
324
324
  host: {
325
- class: 'frame-carousel',
325
+ class: 'frame-carousel frame-corner-handles',
326
326
  role: 'region',
327
327
  tabindex: '0',
328
328
  '[attr.aria-roledescription]': '"carousel"',
@@ -1 +1 @@
1
- {"version":3,"file":"frame-ui-ng-components-carousel.mjs","sources":["../../../projects/components/carousel/src/carousel.ts","../../../projects/components/carousel/carousel.module.ts","../../../projects/components/carousel/frame-ui-ng-components-carousel.ts"],"sourcesContent":["import {\r\n AfterViewInit,\r\n DestroyRef,\r\n Directive,\r\n DoCheck,\r\n ElementRef,\r\n InjectionToken,\r\n Renderer2,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { fromEvent } from 'rxjs';\r\nimport { FrButton } from '@frame-ui-ng/components/button';\r\n\r\nexport const FR_CAROUSEL_ORIENTATIONS = ['horizontal', 'vertical'] as const;\r\nexport const FR_CAROUSEL_ALIGNS = ['start', 'center', 'end'] as const;\r\nexport const FR_CAROUSEL_DIRECTIONS = ['ltr', 'rtl'] as const;\r\n\r\nexport type FrCarouselOrientation = (typeof FR_CAROUSEL_ORIENTATIONS)[number];\r\nexport type FrCarouselAlign = (typeof FR_CAROUSEL_ALIGNS)[number];\r\nexport type FrCarouselDirection = (typeof FR_CAROUSEL_DIRECTIONS)[number];\r\nexport type FrCarouselEvent = 'init' | 'select' | 'reInit';\r\nexport type FrCarouselPlugin = (api: FrCarouselApi) => void | (() => void);\r\n\r\nexport type FrCarouselOptions = {\r\n align?: FrCarouselAlign;\r\n direction?: FrCarouselDirection;\r\n loop?: boolean;\r\n};\r\n\r\nexport type FrCarouselApi = {\r\n canScrollNext: () => boolean;\r\n canScrollPrev: () => boolean;\r\n scrollNext: () => void;\r\n scrollPrev: () => void;\r\n scrollTo: (index: number) => void;\r\n scrollSnapList: () => number[];\r\n selectedScrollSnap: () => number;\r\n on: (event: FrCarouselEvent, callback: () => void) => () => void;\r\n};\r\n\r\nconst FR_CAROUSEL = new InjectionToken<FrCarousel>('FrCarousel');\r\n\r\n/** Carousel root that coordinates scroll state and navigation. */\r\n@Directive({\r\n selector: '[frCarousel], frame-carousel',\r\n exportAs: 'frCarousel',\r\n host: {\r\n class: 'frame-carousel',\r\n role: 'region',\r\n tabindex: '0',\r\n '[attr.aria-roledescription]': '\"carousel\"',\r\n '[attr.data-align]': 'effectiveAlign()',\r\n '[attr.data-orientation]': 'orientation()',\r\n '[attr.dir]': 'effectiveDirection()',\r\n '(keydown)': 'handleKeydown($event)',\r\n },\r\n providers: [{ provide: FR_CAROUSEL, useExisting: FrCarousel }],\r\n})\r\nexport class FrCarousel implements AfterViewInit, DoCheck {\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly listeners = new Map<FrCarouselEvent, Set<() => void>>();\r\n private readonly pluginCleanups: Array<() => void> = [];\r\n private loopResetTimer: number | null = null;\r\n private loopResetScrollEndCleanup: (() => void) | null = null;\r\n private scrollSyncTimer: number | null = null;\r\n private isProgrammaticScroll = false;\r\n private loopBoundaryClone: HTMLElement | null = null;\r\n private contentElement: HTMLElement | null = null;\r\n private itemElements: HTMLElement[] = [];\r\n private lastLoop = false;\r\n private lastPlugins: readonly FrCarouselPlugin[] | null = null;\r\n\r\n readonly align = input<FrCarouselAlign>('start');\r\n readonly loop = input(false, { transform: booleanAttribute });\r\n readonly orientation = input<FrCarouselOrientation>('horizontal');\r\n readonly opts = input<FrCarouselOptions | null>(null);\r\n readonly plugins = input<readonly FrCarouselPlugin[]>([]);\r\n\r\n readonly apiReady = output<FrCarouselApi>();\r\n readonly selectedChange = output<number>();\r\n\r\n readonly selectedIndex = signal(0);\r\n readonly snapCount = signal(0);\r\n\r\n protected readonly effectiveAlign = computed(() => this.opts()?.align ?? this.align());\r\n protected readonly effectiveDirection = computed<FrCarouselDirection>(() => this.opts()?.direction ?? 'ltr');\r\n private readonly effectiveLoop = computed(() => this.opts()?.loop ?? this.loop());\r\n\r\n readonly api: FrCarouselApi = {\r\n canScrollNext: () => this.canScrollNext(),\r\n canScrollPrev: () => this.canScrollPrev(),\r\n scrollNext: () => this.scrollNext(),\r\n scrollPrev: () => this.scrollPrev(),\r\n scrollTo: (index: number) => this.scrollTo(index),\r\n scrollSnapList: () => this.itemElements.map((_, index) => index),\r\n selectedScrollSnap: () => this.selectedIndex(),\r\n on: (event: FrCarouselEvent, callback: () => void) => this.on(event, callback),\r\n };\r\n\r\n constructor() {\r\n this.destroyRef.onDestroy(() => {\r\n this.pluginCleanups.splice(0).forEach((cleanup) => cleanup());\r\n this.clearLoopResetTimer();\r\n this.clearScrollSyncTimer();\r\n });\r\n }\r\n\r\n ngDoCheck(): void {\r\n this.syncPlugins();\r\n\r\n const loop = this.effectiveLoop();\r\n if (!loop && loop !== this.lastLoop) {\r\n this.removeLoopClone();\r\n }\r\n this.lastLoop = loop;\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n queueMicrotask(() => {\r\n this.recalculate();\r\n this.emit('init');\r\n this.apiReady.emit(this.api);\r\n });\r\n }\r\n\r\n registerContent(element: HTMLElement): void {\r\n this.contentElement = element;\r\n fromEvent(element, 'scroll')\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => this.syncSelectedFromScroll());\r\n }\r\n\r\n registerItem(element: HTMLElement): void {\r\n this.itemElements.push(element);\r\n this.recalculate();\r\n }\r\n\r\n unregisterItem(element: HTMLElement): void {\r\n this.itemElements = this.itemElements.filter((item) => item !== element);\r\n this.recalculate();\r\n }\r\n\r\n canScrollPrev(): boolean {\r\n return this.effectiveLoop() || this.selectedIndex() > 0;\r\n }\r\n\r\n canScrollNext(): boolean {\r\n return this.effectiveLoop() || this.selectedIndex() < this.snapCount() - 1;\r\n }\r\n\r\n scrollPrev(): void {\r\n const nextIndex = this.selectedIndex() - 1;\r\n if (this.effectiveLoop() && nextIndex < 0) {\r\n this.scrollLoopBoundary('previous');\r\n return;\r\n }\r\n\r\n this.scrollTo(nextIndex < 0 ? this.snapCount() - 1 : nextIndex);\r\n }\r\n\r\n scrollNext(): void {\r\n const nextIndex = this.selectedIndex() + 1;\r\n if (this.effectiveLoop() && nextIndex >= this.snapCount()) {\r\n this.scrollLoopBoundary('next');\r\n return;\r\n }\r\n\r\n this.scrollTo(nextIndex >= this.snapCount() ? 0 : nextIndex);\r\n }\r\n\r\n scrollTo(index: number): void {\r\n const target = this.itemElements[index];\r\n if (!target || (!this.effectiveLoop() && (index < 0 || index >= this.snapCount()))) {\r\n return;\r\n }\r\n\r\n this.pauseScrollSync();\r\n this.scrollItemIntoView(target);\r\n this.setSelectedIndex(index);\r\n }\r\n\r\n handleKeydown(event: KeyboardEvent): void {\r\n const nextKey = this.orientation() === 'vertical' ? 'ArrowDown' : 'ArrowRight';\r\n const prevKey = this.orientation() === 'vertical' ? 'ArrowUp' : 'ArrowLeft';\r\n\r\n if (event.key === nextKey) {\r\n event.preventDefault();\r\n this.scrollNext();\r\n }\r\n\r\n if (event.key === prevKey) {\r\n event.preventDefault();\r\n this.scrollPrev();\r\n }\r\n }\r\n\r\n private on(event: FrCarouselEvent, callback: () => void): () => void {\r\n const callbacks = this.listeners.get(event) ?? new Set<() => void>();\r\n callbacks.add(callback);\r\n this.listeners.set(event, callbacks);\r\n\r\n return () => callbacks.delete(callback);\r\n }\r\n\r\n private emit(event: FrCarouselEvent): void {\r\n this.listeners.get(event)?.forEach((callback) => callback());\r\n }\r\n\r\n private syncPlugins(): void {\r\n const plugins = this.plugins();\r\n\r\n if (plugins === this.lastPlugins) {\r\n return;\r\n }\r\n\r\n this.pluginCleanups.splice(0).forEach((cleanup) => cleanup());\r\n\r\n for (const plugin of plugins) {\r\n const cleanup = plugin(this.api);\r\n if (typeof cleanup === 'function') {\r\n this.pluginCleanups.push(cleanup);\r\n }\r\n }\r\n\r\n this.lastPlugins = plugins;\r\n }\r\n\r\n private recalculate(): void {\r\n this.snapCount.set(this.itemElements.length);\r\n this.emit('reInit');\r\n }\r\n\r\n private syncSelectedFromScroll(): void {\r\n if (this.isProgrammaticScroll || !this.contentElement || !this.itemElements.length) {\r\n return;\r\n }\r\n\r\n // Derive the active item from the nearest snap point during user-driven scrolling.\r\n const current = this.getCurrentScrollOffset();\r\n const closest = this.itemElements.reduce(\r\n (best, item, index) => {\r\n const targetOffset = this.getItemScrollOffset(item);\r\n const distance = Math.abs(targetOffset - current);\r\n return distance < best.distance ? { distance, index } : best;\r\n },\r\n { distance: Number.POSITIVE_INFINITY, index: this.selectedIndex() },\r\n );\r\n\r\n this.setSelectedIndex(closest.index);\r\n }\r\n\r\n private scrollItemIntoView(target: HTMLElement, behavior: ScrollBehavior = 'smooth'): void {\r\n if (\r\n !this.contentElement ||\r\n typeof this.contentElement.getBoundingClientRect !== 'function' ||\r\n typeof target.getBoundingClientRect !== 'function'\r\n ) {\r\n return;\r\n }\r\n\r\n const next = this.getItemScrollOffset(target);\r\n const isVertical = this.orientation() === 'vertical';\r\n\r\n if (typeof this.contentElement.scrollTo === 'function') {\r\n this.contentElement.scrollTo({\r\n [isVertical ? 'top' : 'left']: next,\r\n behavior,\r\n });\r\n return;\r\n }\r\n\r\n if (isVertical) {\r\n this.contentElement.scrollTop = next;\r\n return;\r\n }\r\n\r\n this.contentElement.scrollLeft = next;\r\n }\r\n\r\n private getItemScrollOffset(target: HTMLElement): number {\r\n if (!this.contentElement) {\r\n return 0;\r\n }\r\n\r\n const contentRect = this.contentElement.getBoundingClientRect();\r\n const targetRect = target.getBoundingClientRect();\r\n const isVertical = this.orientation() === 'vertical';\r\n const current = this.getCurrentScrollOffset();\r\n const contentSize = isVertical ? this.contentElement.clientHeight : this.contentElement.clientWidth;\r\n const targetSize = isVertical ? target.offsetHeight : target.offsetWidth;\r\n const targetStart = isVertical\r\n ? targetRect.top - contentRect.top\r\n : targetRect.left - contentRect.left;\r\n\r\n let next = current + targetStart;\r\n if (this.effectiveAlign() === 'center') {\r\n next -= (contentSize - targetSize) / 2;\r\n }\r\n\r\n if (this.effectiveAlign() === 'end') {\r\n next -= contentSize - targetSize;\r\n }\r\n\r\n return Math.max(0, Math.min(next, this.getMaxScrollOffset()));\r\n }\r\n\r\n private getCurrentScrollOffset(): number {\r\n if (!this.contentElement) {\r\n return 0;\r\n }\r\n\r\n return this.orientation() === 'vertical'\r\n ? this.contentElement.scrollTop\r\n : this.contentElement.scrollLeft;\r\n }\r\n\r\n private getMaxScrollOffset(): number {\r\n if (!this.contentElement) {\r\n return 0;\r\n }\r\n\r\n return this.orientation() === 'vertical'\r\n ? Math.max(0, this.contentElement.scrollHeight - this.contentElement.clientHeight)\r\n : Math.max(0, this.contentElement.scrollWidth - this.contentElement.clientWidth);\r\n }\r\n\r\n private scrollLoopBoundary(direction: 'previous' | 'next'): void {\r\n if (!this.contentElement || !this.effectiveLoop() || this.snapCount() < 2) {\r\n return;\r\n }\r\n\r\n // Scroll to a temporary clone first, then jump back to the real edge item invisibly.\r\n const finalIndex = direction === 'next' ? 0 : this.snapCount() - 1;\r\n const cloneSource = direction === 'next' ? this.itemElements[0] : this.itemElements[this.snapCount() - 1];\r\n const resetTarget = this.itemElements[finalIndex];\r\n\r\n if (!cloneSource || !resetTarget) {\r\n this.scrollTo(finalIndex);\r\n return;\r\n }\r\n\r\n this.clearLoopResetTimer();\r\n this.removeLoopClone();\r\n this.loopBoundaryClone = this.createLoopClone(cloneSource);\r\n this.pauseScrollSync();\r\n\r\n if (direction === 'next') {\r\n this.contentElement.appendChild(this.loopBoundaryClone);\r\n } else {\r\n this.contentElement.insertBefore(this.loopBoundaryClone, this.contentElement.firstChild);\r\n this.scrollItemIntoView(this.itemElements[0], 'auto');\r\n }\r\n\r\n this.scrollItemIntoView(this.loopBoundaryClone);\r\n this.setSelectedIndex(finalIndex);\r\n\r\n this.scheduleLoopReset(resetTarget);\r\n }\r\n\r\n private createLoopClone(item: HTMLElement): HTMLElement {\r\n const clone = item.cloneNode(true) as HTMLElement;\r\n clone.setAttribute('aria-hidden', 'true');\r\n clone.setAttribute('data-frame-carousel-clone', 'true');\r\n clone.removeAttribute('FrCarouselItem');\r\n clone.inert = true;\r\n return clone;\r\n }\r\n\r\n private removeLoopClone(): void {\r\n this.loopBoundaryClone?.remove();\r\n this.loopBoundaryClone = null;\r\n }\r\n\r\n private clearLoopResetTimer(): void {\r\n this.loopResetScrollEndCleanup?.();\r\n this.loopResetScrollEndCleanup = null;\r\n\r\n if (this.loopResetTimer === null) {\r\n return;\r\n }\r\n\r\n window.clearTimeout(this.loopResetTimer);\r\n this.loopResetTimer = null;\r\n }\r\n\r\n private scheduleLoopReset(resetTarget: HTMLElement): void {\r\n if (!this.contentElement) {\r\n return;\r\n }\r\n\r\n // `scrollend` is not universal, so keep a timeout fallback for the loop reset.\r\n let didReset = false;\r\n const reset = () => {\r\n if (didReset) {\r\n return;\r\n }\r\n\r\n didReset = true;\r\n this.clearLoopResetTimer();\r\n this.scrollItemIntoView(resetTarget, 'auto');\r\n this.removeLoopClone();\r\n };\r\n\r\n this.contentElement.addEventListener('scrollend', reset, { once: true });\r\n this.loopResetScrollEndCleanup = () => this.contentElement?.removeEventListener('scrollend', reset);\r\n\r\n this.loopResetTimer = window.setTimeout(reset, 1200);\r\n }\r\n\r\n private pauseScrollSync(duration = 1300): void {\r\n this.isProgrammaticScroll = true;\r\n this.clearScrollSyncTimer();\r\n\r\n this.scrollSyncTimer = window.setTimeout(() => {\r\n this.isProgrammaticScroll = false;\r\n this.scrollSyncTimer = null;\r\n }, duration);\r\n }\r\n\r\n private clearScrollSyncTimer(): void {\r\n if (this.scrollSyncTimer === null) {\r\n return;\r\n }\r\n\r\n window.clearTimeout(this.scrollSyncTimer);\r\n this.scrollSyncTimer = null;\r\n }\r\n\r\n private setSelectedIndex(index: number): void {\r\n if (index === this.selectedIndex()) {\r\n return;\r\n }\r\n\r\n this.selectedIndex.set(index);\r\n this.selectedChange.emit(index);\r\n this.emit('select');\r\n }\r\n}\r\n\r\n/** Content slot for carousel. */\r\n@Directive({\r\n selector: '[frCarouselContent]',\r\n host: {\r\n class: 'frame-carousel__content',\r\n '[attr.data-orientation]': 'carousel.orientation()',\r\n },\r\n})\r\nexport class FrCarouselContent implements AfterViewInit {\r\n protected readonly carousel = inject(FR_CAROUSEL);\r\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n ngAfterViewInit(): void {\r\n this.carousel.registerContent(this.elementRef.nativeElement);\r\n }\r\n}\r\n\r\n/** Item slot for carousel. */\r\n@Directive({\r\n selector: '[frCarouselItem]',\r\n host: {\r\n class: 'frame-carousel__item',\r\n role: 'group',\r\n '[attr.aria-roledescription]': '\"slide\"',\r\n },\r\n})\r\nexport class FrCarouselItem implements AfterViewInit {\r\n private readonly carousel = inject(FR_CAROUSEL);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n ngAfterViewInit(): void {\r\n this.carousel.registerItem(this.elementRef.nativeElement);\r\n this.destroyRef.onDestroy(() => this.carousel.unregisterItem(this.elementRef.nativeElement));\r\n }\r\n}\r\n\r\n/** Previous-slide control for carousel. */\r\n@Directive({\r\n selector: 'button[frCarouselPrevious]',\r\n hostDirectives: [\r\n {\r\n directive: FrButton,\r\n inputs: ['appearance', 'disabled', 'size'],\r\n },\r\n ],\r\n host: {\r\n class: 'frame-carousel__control frame-carousel__control--previous',\r\n '[attr.type]': '\"button\"',\r\n '[attr.aria-label]': 'label()',\r\n '[attr.disabled]': 'carousel.canScrollPrev() ? null : \"\"',\r\n '(click)': 'carousel.scrollPrev()',\r\n },\r\n})\r\nexport class FrCarouselPrevious {\r\n protected readonly carousel = inject(FR_CAROUSEL);\r\n readonly label = input('Previous slide');\r\n}\r\n\r\n/** Next-slide control for carousel. */\r\n@Directive({\r\n selector: 'button[frCarouselNext]',\r\n hostDirectives: [\r\n {\r\n directive: FrButton,\r\n inputs: ['appearance', 'disabled', 'size'],\r\n },\r\n ],\r\n host: {\r\n class: 'frame-carousel__control frame-carousel__control--next',\r\n '[attr.type]': '\"button\"',\r\n '[attr.aria-label]': 'label()',\r\n '[attr.disabled]': 'carousel.canScrollNext() ? null : \"\"',\r\n '(click)': 'carousel.scrollNext()',\r\n },\r\n})\r\nexport class FrCarouselNext {\r\n protected readonly carousel = inject(FR_CAROUSEL);\r\n readonly label = input('Next slide');\r\n}\r\n\r\n\r\n","import { NgModule } from '@angular/core';\nimport {\n FrCarousel,\n FrCarouselContent,\n FrCarouselItem,\n FrCarouselNext,\n FrCarouselPrevious,\n} from './src/carousel';\n\n@NgModule({\n imports: [\n FrCarousel,\n FrCarouselContent,\n FrCarouselItem,\n FrCarouselNext,\n FrCarouselPrevious,\n ],\n exports: [\n FrCarousel,\n FrCarouselContent,\n FrCarouselItem,\n FrCarouselNext,\n FrCarouselPrevious,\n ],\n})\nexport class FrCarouselModule {}\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":"frame-ui-ng-components-carousel.mjs","sources":["../../../projects/components/carousel/src/carousel.ts","../../../projects/components/carousel/carousel.module.ts","../../../projects/components/carousel/frame-ui-ng-components-carousel.ts"],"sourcesContent":["import {\r\n AfterViewInit,\r\n DestroyRef,\r\n Directive,\r\n DoCheck,\r\n ElementRef,\r\n InjectionToken,\r\n Renderer2,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { fromEvent } from 'rxjs';\r\nimport { FrButton } from '@frame-ui-ng/components/button';\r\n\r\nexport const FR_CAROUSEL_ORIENTATIONS = ['horizontal', 'vertical'] as const;\r\nexport const FR_CAROUSEL_ALIGNS = ['start', 'center', 'end'] as const;\r\nexport const FR_CAROUSEL_DIRECTIONS = ['ltr', 'rtl'] as const;\r\n\r\nexport type FrCarouselOrientation = (typeof FR_CAROUSEL_ORIENTATIONS)[number];\r\nexport type FrCarouselAlign = (typeof FR_CAROUSEL_ALIGNS)[number];\r\nexport type FrCarouselDirection = (typeof FR_CAROUSEL_DIRECTIONS)[number];\r\nexport type FrCarouselEvent = 'init' | 'select' | 'reInit';\r\nexport type FrCarouselPlugin = (api: FrCarouselApi) => void | (() => void);\r\n\r\nexport type FrCarouselOptions = {\r\n align?: FrCarouselAlign;\r\n direction?: FrCarouselDirection;\r\n loop?: boolean;\r\n};\r\n\r\nexport type FrCarouselApi = {\r\n canScrollNext: () => boolean;\r\n canScrollPrev: () => boolean;\r\n scrollNext: () => void;\r\n scrollPrev: () => void;\r\n scrollTo: (index: number) => void;\r\n scrollSnapList: () => number[];\r\n selectedScrollSnap: () => number;\r\n on: (event: FrCarouselEvent, callback: () => void) => () => void;\r\n};\r\n\r\nconst FR_CAROUSEL = new InjectionToken<FrCarousel>('FrCarousel');\r\n\r\n/** Carousel root that coordinates scroll state and navigation. */\r\n@Directive({\r\n selector: '[frCarousel], frame-carousel',\r\n exportAs: 'frCarousel',\r\n host: {\r\n class: 'frame-carousel frame-corner-handles',\r\n role: 'region',\r\n tabindex: '0',\r\n '[attr.aria-roledescription]': '\"carousel\"',\r\n '[attr.data-align]': 'effectiveAlign()',\r\n '[attr.data-orientation]': 'orientation()',\r\n '[attr.dir]': 'effectiveDirection()',\r\n '(keydown)': 'handleKeydown($event)',\r\n },\r\n providers: [{ provide: FR_CAROUSEL, useExisting: FrCarousel }],\r\n})\r\nexport class FrCarousel implements AfterViewInit, DoCheck {\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly listeners = new Map<FrCarouselEvent, Set<() => void>>();\r\n private readonly pluginCleanups: Array<() => void> = [];\r\n private loopResetTimer: number | null = null;\r\n private loopResetScrollEndCleanup: (() => void) | null = null;\r\n private scrollSyncTimer: number | null = null;\r\n private isProgrammaticScroll = false;\r\n private loopBoundaryClone: HTMLElement | null = null;\r\n private contentElement: HTMLElement | null = null;\r\n private itemElements: HTMLElement[] = [];\r\n private lastLoop = false;\r\n private lastPlugins: readonly FrCarouselPlugin[] | null = null;\r\n\r\n readonly align = input<FrCarouselAlign>('start');\r\n readonly loop = input(false, { transform: booleanAttribute });\r\n readonly orientation = input<FrCarouselOrientation>('horizontal');\r\n readonly opts = input<FrCarouselOptions | null>(null);\r\n readonly plugins = input<readonly FrCarouselPlugin[]>([]);\r\n\r\n readonly apiReady = output<FrCarouselApi>();\r\n readonly selectedChange = output<number>();\r\n\r\n readonly selectedIndex = signal(0);\r\n readonly snapCount = signal(0);\r\n\r\n protected readonly effectiveAlign = computed(() => this.opts()?.align ?? this.align());\r\n protected readonly effectiveDirection = computed<FrCarouselDirection>(() => this.opts()?.direction ?? 'ltr');\r\n private readonly effectiveLoop = computed(() => this.opts()?.loop ?? this.loop());\r\n\r\n readonly api: FrCarouselApi = {\r\n canScrollNext: () => this.canScrollNext(),\r\n canScrollPrev: () => this.canScrollPrev(),\r\n scrollNext: () => this.scrollNext(),\r\n scrollPrev: () => this.scrollPrev(),\r\n scrollTo: (index: number) => this.scrollTo(index),\r\n scrollSnapList: () => this.itemElements.map((_, index) => index),\r\n selectedScrollSnap: () => this.selectedIndex(),\r\n on: (event: FrCarouselEvent, callback: () => void) => this.on(event, callback),\r\n };\r\n\r\n constructor() {\r\n this.destroyRef.onDestroy(() => {\r\n this.pluginCleanups.splice(0).forEach((cleanup) => cleanup());\r\n this.clearLoopResetTimer();\r\n this.clearScrollSyncTimer();\r\n });\r\n }\r\n\r\n ngDoCheck(): void {\r\n this.syncPlugins();\r\n\r\n const loop = this.effectiveLoop();\r\n if (!loop && loop !== this.lastLoop) {\r\n this.removeLoopClone();\r\n }\r\n this.lastLoop = loop;\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n queueMicrotask(() => {\r\n this.recalculate();\r\n this.emit('init');\r\n this.apiReady.emit(this.api);\r\n });\r\n }\r\n\r\n registerContent(element: HTMLElement): void {\r\n this.contentElement = element;\r\n fromEvent(element, 'scroll')\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => this.syncSelectedFromScroll());\r\n }\r\n\r\n registerItem(element: HTMLElement): void {\r\n this.itemElements.push(element);\r\n this.recalculate();\r\n }\r\n\r\n unregisterItem(element: HTMLElement): void {\r\n this.itemElements = this.itemElements.filter((item) => item !== element);\r\n this.recalculate();\r\n }\r\n\r\n canScrollPrev(): boolean {\r\n return this.effectiveLoop() || this.selectedIndex() > 0;\r\n }\r\n\r\n canScrollNext(): boolean {\r\n return this.effectiveLoop() || this.selectedIndex() < this.snapCount() - 1;\r\n }\r\n\r\n scrollPrev(): void {\r\n const nextIndex = this.selectedIndex() - 1;\r\n if (this.effectiveLoop() && nextIndex < 0) {\r\n this.scrollLoopBoundary('previous');\r\n return;\r\n }\r\n\r\n this.scrollTo(nextIndex < 0 ? this.snapCount() - 1 : nextIndex);\r\n }\r\n\r\n scrollNext(): void {\r\n const nextIndex = this.selectedIndex() + 1;\r\n if (this.effectiveLoop() && nextIndex >= this.snapCount()) {\r\n this.scrollLoopBoundary('next');\r\n return;\r\n }\r\n\r\n this.scrollTo(nextIndex >= this.snapCount() ? 0 : nextIndex);\r\n }\r\n\r\n scrollTo(index: number): void {\r\n const target = this.itemElements[index];\r\n if (!target || (!this.effectiveLoop() && (index < 0 || index >= this.snapCount()))) {\r\n return;\r\n }\r\n\r\n this.pauseScrollSync();\r\n this.scrollItemIntoView(target);\r\n this.setSelectedIndex(index);\r\n }\r\n\r\n handleKeydown(event: KeyboardEvent): void {\r\n const nextKey = this.orientation() === 'vertical' ? 'ArrowDown' : 'ArrowRight';\r\n const prevKey = this.orientation() === 'vertical' ? 'ArrowUp' : 'ArrowLeft';\r\n\r\n if (event.key === nextKey) {\r\n event.preventDefault();\r\n this.scrollNext();\r\n }\r\n\r\n if (event.key === prevKey) {\r\n event.preventDefault();\r\n this.scrollPrev();\r\n }\r\n }\r\n\r\n private on(event: FrCarouselEvent, callback: () => void): () => void {\r\n const callbacks = this.listeners.get(event) ?? new Set<() => void>();\r\n callbacks.add(callback);\r\n this.listeners.set(event, callbacks);\r\n\r\n return () => callbacks.delete(callback);\r\n }\r\n\r\n private emit(event: FrCarouselEvent): void {\r\n this.listeners.get(event)?.forEach((callback) => callback());\r\n }\r\n\r\n private syncPlugins(): void {\r\n const plugins = this.plugins();\r\n\r\n if (plugins === this.lastPlugins) {\r\n return;\r\n }\r\n\r\n this.pluginCleanups.splice(0).forEach((cleanup) => cleanup());\r\n\r\n for (const plugin of plugins) {\r\n const cleanup = plugin(this.api);\r\n if (typeof cleanup === 'function') {\r\n this.pluginCleanups.push(cleanup);\r\n }\r\n }\r\n\r\n this.lastPlugins = plugins;\r\n }\r\n\r\n private recalculate(): void {\r\n this.snapCount.set(this.itemElements.length);\r\n this.emit('reInit');\r\n }\r\n\r\n private syncSelectedFromScroll(): void {\r\n if (this.isProgrammaticScroll || !this.contentElement || !this.itemElements.length) {\r\n return;\r\n }\r\n\r\n // Derive the active item from the nearest snap point during user-driven scrolling.\r\n const current = this.getCurrentScrollOffset();\r\n const closest = this.itemElements.reduce(\r\n (best, item, index) => {\r\n const targetOffset = this.getItemScrollOffset(item);\r\n const distance = Math.abs(targetOffset - current);\r\n return distance < best.distance ? { distance, index } : best;\r\n },\r\n { distance: Number.POSITIVE_INFINITY, index: this.selectedIndex() },\r\n );\r\n\r\n this.setSelectedIndex(closest.index);\r\n }\r\n\r\n private scrollItemIntoView(target: HTMLElement, behavior: ScrollBehavior = 'smooth'): void {\r\n if (\r\n !this.contentElement ||\r\n typeof this.contentElement.getBoundingClientRect !== 'function' ||\r\n typeof target.getBoundingClientRect !== 'function'\r\n ) {\r\n return;\r\n }\r\n\r\n const next = this.getItemScrollOffset(target);\r\n const isVertical = this.orientation() === 'vertical';\r\n\r\n if (typeof this.contentElement.scrollTo === 'function') {\r\n this.contentElement.scrollTo({\r\n [isVertical ? 'top' : 'left']: next,\r\n behavior,\r\n });\r\n return;\r\n }\r\n\r\n if (isVertical) {\r\n this.contentElement.scrollTop = next;\r\n return;\r\n }\r\n\r\n this.contentElement.scrollLeft = next;\r\n }\r\n\r\n private getItemScrollOffset(target: HTMLElement): number {\r\n if (!this.contentElement) {\r\n return 0;\r\n }\r\n\r\n const contentRect = this.contentElement.getBoundingClientRect();\r\n const targetRect = target.getBoundingClientRect();\r\n const isVertical = this.orientation() === 'vertical';\r\n const current = this.getCurrentScrollOffset();\r\n const contentSize = isVertical ? this.contentElement.clientHeight : this.contentElement.clientWidth;\r\n const targetSize = isVertical ? target.offsetHeight : target.offsetWidth;\r\n const targetStart = isVertical\r\n ? targetRect.top - contentRect.top\r\n : targetRect.left - contentRect.left;\r\n\r\n let next = current + targetStart;\r\n if (this.effectiveAlign() === 'center') {\r\n next -= (contentSize - targetSize) / 2;\r\n }\r\n\r\n if (this.effectiveAlign() === 'end') {\r\n next -= contentSize - targetSize;\r\n }\r\n\r\n return Math.max(0, Math.min(next, this.getMaxScrollOffset()));\r\n }\r\n\r\n private getCurrentScrollOffset(): number {\r\n if (!this.contentElement) {\r\n return 0;\r\n }\r\n\r\n return this.orientation() === 'vertical'\r\n ? this.contentElement.scrollTop\r\n : this.contentElement.scrollLeft;\r\n }\r\n\r\n private getMaxScrollOffset(): number {\r\n if (!this.contentElement) {\r\n return 0;\r\n }\r\n\r\n return this.orientation() === 'vertical'\r\n ? Math.max(0, this.contentElement.scrollHeight - this.contentElement.clientHeight)\r\n : Math.max(0, this.contentElement.scrollWidth - this.contentElement.clientWidth);\r\n }\r\n\r\n private scrollLoopBoundary(direction: 'previous' | 'next'): void {\r\n if (!this.contentElement || !this.effectiveLoop() || this.snapCount() < 2) {\r\n return;\r\n }\r\n\r\n // Scroll to a temporary clone first, then jump back to the real edge item invisibly.\r\n const finalIndex = direction === 'next' ? 0 : this.snapCount() - 1;\r\n const cloneSource = direction === 'next' ? this.itemElements[0] : this.itemElements[this.snapCount() - 1];\r\n const resetTarget = this.itemElements[finalIndex];\r\n\r\n if (!cloneSource || !resetTarget) {\r\n this.scrollTo(finalIndex);\r\n return;\r\n }\r\n\r\n this.clearLoopResetTimer();\r\n this.removeLoopClone();\r\n this.loopBoundaryClone = this.createLoopClone(cloneSource);\r\n this.pauseScrollSync();\r\n\r\n if (direction === 'next') {\r\n this.contentElement.appendChild(this.loopBoundaryClone);\r\n } else {\r\n this.contentElement.insertBefore(this.loopBoundaryClone, this.contentElement.firstChild);\r\n this.scrollItemIntoView(this.itemElements[0], 'auto');\r\n }\r\n\r\n this.scrollItemIntoView(this.loopBoundaryClone);\r\n this.setSelectedIndex(finalIndex);\r\n\r\n this.scheduleLoopReset(resetTarget);\r\n }\r\n\r\n private createLoopClone(item: HTMLElement): HTMLElement {\r\n const clone = item.cloneNode(true) as HTMLElement;\r\n clone.setAttribute('aria-hidden', 'true');\r\n clone.setAttribute('data-frame-carousel-clone', 'true');\r\n clone.removeAttribute('FrCarouselItem');\r\n clone.inert = true;\r\n return clone;\r\n }\r\n\r\n private removeLoopClone(): void {\r\n this.loopBoundaryClone?.remove();\r\n this.loopBoundaryClone = null;\r\n }\r\n\r\n private clearLoopResetTimer(): void {\r\n this.loopResetScrollEndCleanup?.();\r\n this.loopResetScrollEndCleanup = null;\r\n\r\n if (this.loopResetTimer === null) {\r\n return;\r\n }\r\n\r\n window.clearTimeout(this.loopResetTimer);\r\n this.loopResetTimer = null;\r\n }\r\n\r\n private scheduleLoopReset(resetTarget: HTMLElement): void {\r\n if (!this.contentElement) {\r\n return;\r\n }\r\n\r\n // `scrollend` is not universal, so keep a timeout fallback for the loop reset.\r\n let didReset = false;\r\n const reset = () => {\r\n if (didReset) {\r\n return;\r\n }\r\n\r\n didReset = true;\r\n this.clearLoopResetTimer();\r\n this.scrollItemIntoView(resetTarget, 'auto');\r\n this.removeLoopClone();\r\n };\r\n\r\n this.contentElement.addEventListener('scrollend', reset, { once: true });\r\n this.loopResetScrollEndCleanup = () => this.contentElement?.removeEventListener('scrollend', reset);\r\n\r\n this.loopResetTimer = window.setTimeout(reset, 1200);\r\n }\r\n\r\n private pauseScrollSync(duration = 1300): void {\r\n this.isProgrammaticScroll = true;\r\n this.clearScrollSyncTimer();\r\n\r\n this.scrollSyncTimer = window.setTimeout(() => {\r\n this.isProgrammaticScroll = false;\r\n this.scrollSyncTimer = null;\r\n }, duration);\r\n }\r\n\r\n private clearScrollSyncTimer(): void {\r\n if (this.scrollSyncTimer === null) {\r\n return;\r\n }\r\n\r\n window.clearTimeout(this.scrollSyncTimer);\r\n this.scrollSyncTimer = null;\r\n }\r\n\r\n private setSelectedIndex(index: number): void {\r\n if (index === this.selectedIndex()) {\r\n return;\r\n }\r\n\r\n this.selectedIndex.set(index);\r\n this.selectedChange.emit(index);\r\n this.emit('select');\r\n }\r\n}\r\n\r\n/** Content slot for carousel. */\r\n@Directive({\r\n selector: '[frCarouselContent]',\r\n host: {\r\n class: 'frame-carousel__content',\r\n '[attr.data-orientation]': 'carousel.orientation()',\r\n },\r\n})\r\nexport class FrCarouselContent implements AfterViewInit {\r\n protected readonly carousel = inject(FR_CAROUSEL);\r\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n ngAfterViewInit(): void {\r\n this.carousel.registerContent(this.elementRef.nativeElement);\r\n }\r\n}\r\n\r\n/** Item slot for carousel. */\r\n@Directive({\r\n selector: '[frCarouselItem]',\r\n host: {\r\n class: 'frame-carousel__item',\r\n role: 'group',\r\n '[attr.aria-roledescription]': '\"slide\"',\r\n },\r\n})\r\nexport class FrCarouselItem implements AfterViewInit {\r\n private readonly carousel = inject(FR_CAROUSEL);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n ngAfterViewInit(): void {\r\n this.carousel.registerItem(this.elementRef.nativeElement);\r\n this.destroyRef.onDestroy(() => this.carousel.unregisterItem(this.elementRef.nativeElement));\r\n }\r\n}\r\n\r\n/** Previous-slide control for carousel. */\r\n@Directive({\r\n selector: 'button[frCarouselPrevious]',\r\n hostDirectives: [\r\n {\r\n directive: FrButton,\r\n inputs: ['appearance', 'disabled', 'size'],\r\n },\r\n ],\r\n host: {\r\n class: 'frame-carousel__control frame-carousel__control--previous',\r\n '[attr.type]': '\"button\"',\r\n '[attr.aria-label]': 'label()',\r\n '[attr.disabled]': 'carousel.canScrollPrev() ? null : \"\"',\r\n '(click)': 'carousel.scrollPrev()',\r\n },\r\n})\r\nexport class FrCarouselPrevious {\r\n protected readonly carousel = inject(FR_CAROUSEL);\r\n readonly label = input('Previous slide');\r\n}\r\n\r\n/** Next-slide control for carousel. */\r\n@Directive({\r\n selector: 'button[frCarouselNext]',\r\n hostDirectives: [\r\n {\r\n directive: FrButton,\r\n inputs: ['appearance', 'disabled', 'size'],\r\n },\r\n ],\r\n host: {\r\n class: 'frame-carousel__control frame-carousel__control--next',\r\n '[attr.type]': '\"button\"',\r\n '[attr.aria-label]': 'label()',\r\n '[attr.disabled]': 'carousel.canScrollNext() ? null : \"\"',\r\n '(click)': 'carousel.scrollNext()',\r\n },\r\n})\r\nexport class FrCarouselNext {\r\n protected readonly carousel = inject(FR_CAROUSEL);\r\n readonly label = input('Next slide');\r\n}\r\n\r\n\r\n","import { NgModule } from '@angular/core';\nimport {\n FrCarousel,\n FrCarouselContent,\n FrCarouselItem,\n FrCarouselNext,\n FrCarouselPrevious,\n} from './src/carousel';\n\n@NgModule({\n imports: [\n FrCarousel,\n FrCarouselContent,\n FrCarouselItem,\n FrCarouselNext,\n FrCarouselPrevious,\n ],\n exports: [\n FrCarousel,\n FrCarouselContent,\n FrCarouselItem,\n FrCarouselNext,\n FrCarouselPrevious,\n ],\n})\nexport class FrCarouselModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}