@frame-ui-ng/components 0.4.1 → 0.4.2-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.
@@ -3,9 +3,13 @@
3
3
  --frame-calendar-color: var(--frame-surface-foreground);
4
4
  --frame-calendar-border: var(--frame-border);
5
5
  --frame-calendar-radius: var(--frame-radius-lg);
6
+ --frame-calendar-width: fit-content;
6
7
  --frame-calendar-padding: 0.875rem;
7
8
  --frame-calendar-gap: 1rem;
8
9
  --frame-calendar-cell-size: 2.25rem;
10
+ --frame-calendar-effective-cell-size: var(--frame-calendar-cell-size);
11
+ --frame-calendar-column-count: 7;
12
+ --frame-calendar-month-flex: 0 0 calc(var(--frame-calendar-effective-cell-size) * var(--frame-calendar-column-count));
9
13
  --frame-calendar-cell-radius: var(--frame-radius-md);
10
14
  --frame-calendar-muted-color: var(--frame-muted-foreground);
11
15
  --frame-calendar-day-hover-bg: var(--frame-muted);
@@ -1,9 +1,9 @@
1
1
  @import './_vars.css';
2
2
 
3
- .frame-calendar {
3
+ :where(.frame-calendar) {
4
4
  display: inline-grid;
5
5
  gap: var(--frame-calendar-gap);
6
- width: fit-content;
6
+ width: var(--frame-calendar-width);
7
7
  max-width: 100%;
8
8
  padding: var(--frame-calendar-padding);
9
9
  border: 1px solid var(--frame-calendar-border);
@@ -14,6 +14,14 @@
14
14
  font-size: 0.875rem;
15
15
  }
16
16
 
17
+ .frame-calendar[data-week-number] {
18
+ --frame-calendar-column-count: 8;
19
+ }
20
+
21
+ .frame-calendar[data-date-labels] {
22
+ --frame-calendar-effective-cell-size: max(2.75rem, var(--frame-calendar-cell-size));
23
+ }
24
+
17
25
  .frame-calendar__header {
18
26
  display: flex;
19
27
  align-items: center;
@@ -107,22 +115,33 @@
107
115
  display: flex;
108
116
  flex-wrap: wrap;
109
117
  gap: var(--frame-calendar-gap);
118
+ inline-size: 100%;
110
119
  }
111
120
 
112
121
  .frame-calendar__month {
122
+ flex: var(--frame-calendar-month-flex);
123
+ inline-size: calc(var(--frame-calendar-effective-cell-size) * var(--frame-calendar-column-count));
113
124
  min-width: 0;
114
125
  }
115
126
 
116
127
  .frame-calendar__table {
128
+ inline-size: calc(var(--frame-calendar-effective-cell-size) * var(--frame-calendar-column-count));
117
129
  border-collapse: collapse;
118
130
  border-spacing: 0;
119
131
  margin-block-start: 0.25rem;
132
+ table-layout: fixed;
133
+ }
134
+
135
+ .frame-calendar__day-column,
136
+ .frame-calendar__week-number-column {
137
+ inline-size: var(--frame-calendar-effective-cell-size);
120
138
  }
121
139
 
122
140
  .frame-calendar__weekday,
123
141
  .frame-calendar__week-number-header,
124
142
  .frame-calendar__week-number {
125
- inline-size: var(--frame-calendar-cell-size);
143
+ box-sizing: border-box;
144
+ min-inline-size: var(--frame-calendar-effective-cell-size);
126
145
  block-size: 1.75rem;
127
146
  color: var(--frame-calendar-muted-color);
128
147
  font-size: 0.75rem;
@@ -136,6 +155,8 @@
136
155
 
137
156
  .frame-calendar__cell {
138
157
  position: relative;
158
+ box-sizing: border-box;
159
+ inline-size: var(--frame-calendar-effective-cell-size);
139
160
  padding-block: 0.125rem;
140
161
  padding-inline: 0;
141
162
  text-align: center;
@@ -144,9 +165,12 @@
144
165
  .frame-calendar__day {
145
166
  position: relative;
146
167
  z-index: 1;
168
+ box-sizing: border-box;
147
169
  display: inline-flex;
148
- inline-size: var(--frame-calendar-cell-size);
149
- block-size: var(--frame-calendar-cell-size);
170
+ inline-size: 100%;
171
+ min-inline-size: var(--frame-calendar-effective-cell-size);
172
+ min-block-size: var(--frame-calendar-effective-cell-size);
173
+ aspect-ratio: 1;
150
174
  flex-direction: column;
151
175
  align-items: center;
152
176
  justify-content: center;
@@ -111,7 +111,9 @@
111
111
 
112
112
  .frame-date-picker__content {
113
113
  box-sizing: border-box;
114
- overflow: hidden;
114
+ inline-size: auto;
115
+ max-inline-size: calc(100vw - 1.5rem);
116
+ overflow: auto;
115
117
  border: 1px solid var(--frame-date-picker-content-border);
116
118
  border-radius: var(--frame-date-picker-content-radius);
117
119
  background: var(--frame-date-picker-content-bg);
@@ -122,10 +124,34 @@
122
124
  }
123
125
 
124
126
  .frame-date-picker__content .frame-calendar {
127
+ --frame-calendar-width: auto;
125
128
  border: 0;
129
+ inline-size: auto;
130
+ max-inline-size: calc(100vw - 2rem);
126
131
  box-shadow: none;
127
132
  }
128
133
 
134
+ .frame-date-picker__content .frame-calendar__months {
135
+ inline-size: auto;
136
+ flex-wrap: nowrap;
137
+ align-items: flex-start;
138
+ }
139
+
140
+ .frame-date-picker__content .frame-calendar__month {
141
+ flex: 0 0 auto;
142
+ inline-size: calc(var(--frame-calendar-cell-size) * 7);
143
+ min-inline-size: calc(var(--frame-calendar-cell-size) * 7);
144
+ }
145
+
146
+ .frame-date-picker__content .frame-calendar__table {
147
+ inline-size: calc(var(--frame-calendar-cell-size) * 7);
148
+ }
149
+
150
+ .frame-date-picker__content .frame-calendar__day {
151
+ inline-size: var(--frame-calendar-cell-size);
152
+ block-size: var(--frame-calendar-cell-size);
153
+ }
154
+
129
155
  .frame-date-picker__presets {
130
156
  display: grid;
131
157
  gap: 0.125rem;
@@ -58,6 +58,7 @@ class FrCalendar {
58
58
  yearOptions = computed(() => Array.from({ length: Math.max(0, this.toYear() - this.fromYear() + 1) }, (_, index) => this.fromYear() + index), ...(ngDevMode ? [{ debugName: "yearOptions" }] : /* istanbul ignore next */ []));
59
59
  months = computed(() => Array.from({ length: Math.max(1, this.numberOfMonths()) }, (_, index) => this.buildMonth(addMonths(this.currentMonth(), index))), ...(ngDevMode ? [{ debugName: "months" }] : /* istanbul ignore next */ []));
60
60
  activeDate = computed(() => this.resolveActiveDate(), ...(ngDevMode ? [{ debugName: "activeDate" }] : /* istanbul ignore next */ []));
61
+ hasDateLabels = computed(() => Object.keys(this.dateLabels()).length > 0, ...(ngDevMode ? [{ debugName: "hasDateLabels" }] : /* istanbul ignore next */ []));
61
62
  onTouched = () => undefined;
62
63
  onChange = () => undefined;
63
64
  writeValue(value) {
@@ -254,7 +255,7 @@ class FrCalendar {
254
255
  };
255
256
  }
256
257
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCalendar, deps: [], target: i0.ɵɵFactoryTarget.Component });
257
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrCalendar, isStandalone: true, selector: "frame-calendar", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, captionLayout: { classPropertyName: "captionLayout", publicName: "captionLayout", isSignal: true, isRequired: false, transformFunction: null }, numberOfMonths: { classPropertyName: "numberOfMonths", publicName: "numberOfMonths", isSignal: true, isRequired: false, transformFunction: null }, firstDayOfWeek: { classPropertyName: "firstDayOfWeek", publicName: "firstDayOfWeek", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, timeZone: { classPropertyName: "timeZone", publicName: "timeZone", isSignal: true, isRequired: false, transformFunction: null }, dir: { classPropertyName: "dir", publicName: "dir", isSignal: true, isRequired: false, transformFunction: null }, fromYear: { classPropertyName: "fromYear", publicName: "fromYear", isSignal: true, isRequired: false, transformFunction: null }, toYear: { classPropertyName: "toYear", publicName: "toYear", isSignal: true, isRequired: false, transformFunction: null }, showOutsideDays: { classPropertyName: "showOutsideDays", publicName: "showOutsideDays", isSignal: true, isRequired: false, transformFunction: null }, showWeekNumber: { classPropertyName: "showWeekNumber", publicName: "showWeekNumber", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, disabledDates: { classPropertyName: "disabledDates", publicName: "disabledDates", isSignal: true, isRequired: false, transformFunction: null }, dateLabels: { classPropertyName: "dateLabels", publicName: "dateLabels", isSignal: true, isRequired: false, transformFunction: null }, disabledMatcher: { classPropertyName: "disabledMatcher", publicName: "disabledMatcher", isSignal: true, isRequired: false, transformFunction: null }, cellTemplate: { classPropertyName: "cellTemplate", publicName: "cellTemplate", isSignal: true, isRequired: false, transformFunction: null }, previousMonthTemplate: { classPropertyName: "previousMonthTemplate", publicName: "previousMonthTemplate", isSignal: true, isRequired: false, transformFunction: null }, nextMonthTemplate: { classPropertyName: "nextMonthTemplate", publicName: "nextMonthTemplate", isSignal: true, isRequired: false, transformFunction: null }, previousMonthIcon: { classPropertyName: "previousMonthIcon", publicName: "previousMonthIcon", isSignal: true, isRequired: false, transformFunction: null }, nextMonthIcon: { classPropertyName: "nextMonthIcon", publicName: "nextMonthIcon", isSignal: true, isRequired: false, transformFunction: null }, previousMonthLabel: { classPropertyName: "previousMonthLabel", publicName: "previousMonthLabel", isSignal: true, isRequired: false, transformFunction: null }, nextMonthLabel: { classPropertyName: "nextMonthLabel", publicName: "nextMonthLabel", isSignal: true, isRequired: false, transformFunction: null }, month: { classPropertyName: "month", publicName: "month", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedChange: "selectedChange", monthChange: "monthChange" }, host: { properties: { "attr.data-mode": "mode()", "attr.data-caption-layout": "captionLayout()", "attr.data-disabled": "isDisabled() ? \"\" : null", "attr.dir": "dir()" }, classAttribute: "frame-calendar" }, providers: [VALUE_ACCESSOR], ngImport: i0, template: `
258
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrCalendar, isStandalone: true, selector: "frame-calendar", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, captionLayout: { classPropertyName: "captionLayout", publicName: "captionLayout", isSignal: true, isRequired: false, transformFunction: null }, numberOfMonths: { classPropertyName: "numberOfMonths", publicName: "numberOfMonths", isSignal: true, isRequired: false, transformFunction: null }, firstDayOfWeek: { classPropertyName: "firstDayOfWeek", publicName: "firstDayOfWeek", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, timeZone: { classPropertyName: "timeZone", publicName: "timeZone", isSignal: true, isRequired: false, transformFunction: null }, dir: { classPropertyName: "dir", publicName: "dir", isSignal: true, isRequired: false, transformFunction: null }, fromYear: { classPropertyName: "fromYear", publicName: "fromYear", isSignal: true, isRequired: false, transformFunction: null }, toYear: { classPropertyName: "toYear", publicName: "toYear", isSignal: true, isRequired: false, transformFunction: null }, showOutsideDays: { classPropertyName: "showOutsideDays", publicName: "showOutsideDays", isSignal: true, isRequired: false, transformFunction: null }, showWeekNumber: { classPropertyName: "showWeekNumber", publicName: "showWeekNumber", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, disabledDates: { classPropertyName: "disabledDates", publicName: "disabledDates", isSignal: true, isRequired: false, transformFunction: null }, dateLabels: { classPropertyName: "dateLabels", publicName: "dateLabels", isSignal: true, isRequired: false, transformFunction: null }, disabledMatcher: { classPropertyName: "disabledMatcher", publicName: "disabledMatcher", isSignal: true, isRequired: false, transformFunction: null }, cellTemplate: { classPropertyName: "cellTemplate", publicName: "cellTemplate", isSignal: true, isRequired: false, transformFunction: null }, previousMonthTemplate: { classPropertyName: "previousMonthTemplate", publicName: "previousMonthTemplate", isSignal: true, isRequired: false, transformFunction: null }, nextMonthTemplate: { classPropertyName: "nextMonthTemplate", publicName: "nextMonthTemplate", isSignal: true, isRequired: false, transformFunction: null }, previousMonthIcon: { classPropertyName: "previousMonthIcon", publicName: "previousMonthIcon", isSignal: true, isRequired: false, transformFunction: null }, nextMonthIcon: { classPropertyName: "nextMonthIcon", publicName: "nextMonthIcon", isSignal: true, isRequired: false, transformFunction: null }, previousMonthLabel: { classPropertyName: "previousMonthLabel", publicName: "previousMonthLabel", isSignal: true, isRequired: false, transformFunction: null }, nextMonthLabel: { classPropertyName: "nextMonthLabel", publicName: "nextMonthLabel", isSignal: true, isRequired: false, transformFunction: null }, month: { classPropertyName: "month", publicName: "month", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedChange: "selectedChange", monthChange: "monthChange" }, host: { properties: { "attr.data-mode": "mode()", "attr.data-caption-layout": "captionLayout()", "attr.data-disabled": "isDisabled() ? \"\" : null", "attr.data-week-number": "showWeekNumber() ? \"\" : null", "attr.data-date-labels": "hasDateLabels() ? \"\" : null", "attr.dir": "dir()" }, classAttribute: "frame-calendar" }, providers: [VALUE_ACCESSOR], ngImport: i0, template: `
258
259
  <div class="frame-calendar__header">
259
260
  <button
260
261
  class="frame-calendar__nav-button"
@@ -329,6 +330,14 @@ class FrCalendar {
329
330
  }
330
331
 
331
332
  <table class="frame-calendar__table" role="grid" [attr.aria-readonly]="true">
333
+ <colgroup>
334
+ @if (showWeekNumber()) {
335
+ <col class="frame-calendar__week-number-column" />
336
+ }
337
+ @for (weekday of weekdayLabels(); track weekday) {
338
+ <col class="frame-calendar__day-column" />
339
+ }
340
+ </colgroup>
332
341
  <thead>
333
342
  <tr>
334
343
  @if (showWeekNumber()) {
@@ -405,6 +414,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
405
414
  '[attr.data-mode]': 'mode()',
406
415
  '[attr.data-caption-layout]': 'captionLayout()',
407
416
  '[attr.data-disabled]': 'isDisabled() ? "" : null',
417
+ '[attr.data-week-number]': 'showWeekNumber() ? "" : null',
418
+ '[attr.data-date-labels]': 'hasDateLabels() ? "" : null',
408
419
  '[attr.dir]': 'dir()',
409
420
  },
410
421
  template: `
@@ -482,6 +493,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
482
493
  }
483
494
 
484
495
  <table class="frame-calendar__table" role="grid" [attr.aria-readonly]="true">
496
+ <colgroup>
497
+ @if (showWeekNumber()) {
498
+ <col class="frame-calendar__week-number-column" />
499
+ }
500
+ @for (weekday of weekdayLabels(); track weekday) {
501
+ <col class="frame-calendar__day-column" />
502
+ }
503
+ </colgroup>
485
504
  <thead>
486
505
  <tr>
487
506
  @if (showWeekNumber()) {
@@ -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.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 <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\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\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 +1 @@
1
- {"version":3,"file":"frame-ui-ng-components-forms.mjs","sources":["../../../projects/components/forms/src/control-value-accessor.ts","../../../projects/components/forms/forms.module.ts","../../../projects/components/forms/frame-ui-ng-components-forms.ts"],"sourcesContent":["import {\r\n DestroyRef,\r\n Directive,\r\n Injector,\r\n OnInit,\r\n Type,\r\n computed,\r\n forwardRef,\r\n inject,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, NgControl } from '@angular/forms';\r\n\r\nexport function provideDsValueAccessor(type: Type<ControlValueAccessor>) {\r\n return {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => type),\r\n multi: true,\r\n };\r\n}\r\n\r\n/** Base ControlValueAccessor implementation for FrameUI form controls. */\r\n@Directive()\r\nexport abstract class FrControlValueAccessor<T> implements ControlValueAccessor, OnInit {\r\n private readonly injector = inject(Injector);\r\n private readonly FrControlDestroyRef = inject(DestroyRef);\r\n private readonly disabledFromForms = signal(false);\r\n private readonly controlStateVersion = signal(0);\r\n protected ngControl: NgControl | null = null;\r\n private onChange: (value: T) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n protected readonly formDisabled = computed(() => this.disabledFromForms());\r\n protected readonly formInvalid = computed(() => {\r\n this.controlStateVersion();\r\n\r\n if (!this.ngControl) {\r\n return false;\r\n }\r\n\r\n return this.ngControl.invalid && (this.ngControl.touched || this.ngControl.dirty);\r\n });\r\n\r\n ngOnInit(): void {\r\n this.ngControl = this.injector.get(NgControl, null);\r\n\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n this.ngControl.statusChanges?.pipe(takeUntilDestroyed(this.FrControlDestroyRef)).subscribe(() => {\r\n this.refreshControlState();\r\n });\r\n this.ngControl.valueChanges?.pipe(takeUntilDestroyed(this.FrControlDestroyRef)).subscribe(() => {\r\n this.refreshControlState();\r\n });\r\n this.refreshControlState();\r\n }\r\n }\r\n\r\n writeValue(value: T): void {\r\n this.setViewValue(value);\r\n }\r\n\r\n registerOnChange(fn: (value: T) => 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.disabledFromForms.set(isDisabled);\r\n }\r\n\r\n protected notifyValueChange(value: T): void {\r\n this.onChange(value);\r\n }\r\n\r\n protected markAsTouched(): void {\r\n this.onTouched();\r\n this.refreshControlState();\r\n }\r\n\r\n protected abstract setViewValue(value: T): void;\r\n\r\n private refreshControlState(): void {\r\n this.controlStateVersion.update((version) => version + 1);\r\n }\r\n}\r\n\r\n","import { NgModule } from '@angular/core';\nimport {\n\n} from './src/forms';\n\n@NgModule({\n imports: [\n\n ],\n exports: [\n\n ],\n})\nexport class FrFormsModule {}\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-forms.mjs","sources":["../../../projects/components/forms/src/control-value-accessor.ts","../../../projects/components/forms/forms.module.ts","../../../projects/components/forms/frame-ui-ng-components-forms.ts"],"sourcesContent":["import {\r\n DestroyRef,\r\n Directive,\r\n Injector,\r\n OnInit,\r\n Type,\r\n computed,\r\n forwardRef,\r\n inject,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, NgControl } from '@angular/forms';\r\n\r\nexport function provideDsValueAccessor(type: Type<ControlValueAccessor>) {\r\n return {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => type),\r\n multi: true,\r\n };\r\n}\r\n\r\n/** Base ControlValueAccessor implementation for FrameUI form controls. */\r\n@Directive()\r\nexport abstract class FrControlValueAccessor<T> implements ControlValueAccessor, OnInit {\r\n private readonly injector = inject(Injector);\r\n private readonly FrControlDestroyRef = inject(DestroyRef);\r\n private readonly disabledFromForms = signal(false);\r\n private readonly controlStateVersion = signal(0);\r\n protected ngControl: NgControl | null = null;\r\n private onChange: (value: T) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n protected readonly formDisabled = computed(() => this.disabledFromForms());\r\n protected readonly formInvalid = computed(() => {\r\n this.controlStateVersion();\r\n\r\n if (!this.ngControl) {\r\n return false;\r\n }\r\n\r\n return this.ngControl.invalid && (this.ngControl.touched || this.ngControl.dirty);\r\n });\r\n\r\n ngOnInit(): void {\r\n this.ngControl = this.injector.get(NgControl, null);\r\n\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n this.ngControl.statusChanges?.pipe(takeUntilDestroyed(this.FrControlDestroyRef)).subscribe(() => {\r\n this.refreshControlState();\r\n });\r\n this.ngControl.valueChanges?.pipe(takeUntilDestroyed(this.FrControlDestroyRef)).subscribe(() => {\r\n this.refreshControlState();\r\n });\r\n this.refreshControlState();\r\n }\r\n }\r\n\r\n writeValue(value: T): void {\r\n this.setViewValue(value);\r\n }\r\n\r\n registerOnChange(fn: (value: T) => 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.disabledFromForms.set(isDisabled);\r\n }\r\n\r\n protected notifyValueChange(value: T): void {\r\n this.onChange(value);\r\n }\r\n\r\n protected markAsTouched(): void {\r\n this.onTouched();\r\n this.refreshControlState();\r\n }\r\n\r\n protected abstract setViewValue(value: T): void;\r\n\r\n private refreshControlState(): void {\r\n this.controlStateVersion.update((version) => version + 1);\r\n }\r\n}\r\n\r\n","import { NgModule } from '@angular/core';\r\nimport {\r\n\r\n} from './src/forms';\r\n\r\n@NgModule({\r\n imports: [\r\n\r\n ],\r\n exports: [\r\n\r\n ],\r\n})\r\nexport class FrFormsModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, TemplateRef, input, booleanAttribute, Directive, Component, Injector, Injectable, DestroyRef, ElementRef, ViewContainerRef, output, signal, NgModule } from '@angular/core';
2
+ import { inject, TemplateRef, input, booleanAttribute, Directive, InjectionToken, Component, Injector, Injectable, DestroyRef, ElementRef, ViewContainerRef, output, signal, NgModule } from '@angular/core';
3
3
  import { DialogRef, DIALOG_DATA, Dialog } from '@angular/cdk/dialog';
4
+ import { valueToCssSize } from '@frame-ui-ng/components/utils';
4
5
  import { NgComponentOutlet } from '@angular/common';
5
6
  import { FrButton, FrButtonLabel } from '@frame-ui-ng/components/button';
6
7
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
@@ -58,6 +59,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
58
59
  }]
59
60
  }], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], ariaDescribedBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-describedby", required: false }] }], backdropClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "backdropClass", required: false }] }], closeOnDestroy: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnDestroy", required: false }] }], closeOnNavigation: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnNavigation", required: false }] }], direction: [{ type: i0.Input, args: [{ isSignal: true, alias: "direction", required: false }] }], disableClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableClose", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], maxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxHeight", required: false }] }], maxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxWidth", required: false }] }], minHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "minHeight", required: false }] }], minWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "minWidth", required: false }] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], role: [{ type: i0.Input, args: [{ isSignal: true, alias: "role", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }] } });
60
61
 
62
+ /** Reference handle for an opened modal. */
63
+ class FrModalRef extends DialogRef {
64
+ }
65
+
66
+ const FR_MODAL_DATA = DIALOG_DATA;
67
+ const FR_MODAL_PANEL_LAYOUT = new InjectionToken('FrModalPanelLayout');
68
+ const FR_MODAL_REF = FrModalRef;
69
+
61
70
  /** Close control for modal. */
62
71
  class FrModalClose {
63
72
  dialogRef = inject(DialogRef, { optional: true });
@@ -80,12 +89,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
80
89
  }], propDecorators: { result: [{ type: i0.Input, args: [{ isSignal: true, alias: "frModalClose", required: false }] }] } });
81
90
  /** Panel slot for modal. */
82
91
  class FrModalPanel {
92
+ panelLayout = inject(FR_MODAL_PANEL_LAYOUT, { optional: true });
83
93
  scrollable = input(false, { ...(ngDevMode ? { debugName: "scrollable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
84
94
  showCloseButton = input(true, { ...(ngDevMode ? { debugName: "showCloseButton" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
85
95
  size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
86
96
  stickyFooter = input(false, { ...(ngDevMode ? { debugName: "stickyFooter" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
87
97
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrModalPanel, deps: [], target: i0.ɵɵFactoryTarget.Component });
88
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrModalPanel, isStandalone: true, selector: "[frModalPanel], frame-modal-panel", inputs: { scrollable: { classPropertyName: "scrollable", publicName: "scrollable", isSignal: true, isRequired: false, transformFunction: null }, showCloseButton: { classPropertyName: "showCloseButton", publicName: "showCloseButton", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, stickyFooter: { classPropertyName: "stickyFooter", publicName: "stickyFooter", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-scrollable": "scrollable() ? \"\" : null", "attr.data-sticky-footer": "stickyFooter() ? \"\" : null", "attr.data-size": "size()" }, classAttribute: "frame-modal__panel" }, ngImport: i0, template: `
98
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrModalPanel, isStandalone: true, selector: "[frModalPanel], frame-modal-panel", inputs: { scrollable: { classPropertyName: "scrollable", publicName: "scrollable", isSignal: true, isRequired: false, transformFunction: null }, showCloseButton: { classPropertyName: "showCloseButton", publicName: "showCloseButton", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, stickyFooter: { classPropertyName: "stickyFooter", publicName: "stickyFooter", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-scrollable": "scrollable() ? \"\" : null", "attr.data-sticky-footer": "stickyFooter() ? \"\" : null", "attr.data-size": "size()", "style.height": "panelLayout?.height ?? null", "style.max-height": "panelLayout?.maxHeight ?? null", "style.max-width": "panelLayout?.maxWidth ?? null", "style.min-height": "panelLayout?.minHeight ?? null", "style.min-width": "panelLayout?.minWidth ?? null", "style.width": "panelLayout?.width ?? null" }, classAttribute: "frame-modal__panel" }, ngImport: i0, template: `
89
99
  <ng-content />
90
100
  @if (showCloseButton()) {
91
101
  <button
@@ -108,6 +118,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
108
118
  '[attr.data-scrollable]': 'scrollable() ? "" : null',
109
119
  '[attr.data-sticky-footer]': 'stickyFooter() ? "" : null',
110
120
  '[attr.data-size]': 'size()',
121
+ '[style.height]': 'panelLayout?.height ?? null',
122
+ '[style.max-height]': 'panelLayout?.maxHeight ?? null',
123
+ '[style.max-width]': 'panelLayout?.maxWidth ?? null',
124
+ '[style.min-height]': 'panelLayout?.minHeight ?? null',
125
+ '[style.min-width]': 'panelLayout?.minWidth ?? null',
126
+ '[style.width]': 'panelLayout?.width ?? null',
111
127
  },
112
128
  template: `
113
129
  <ng-content />
@@ -196,13 +212,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
196
212
  }]
197
213
  }] });
198
214
 
199
- /** Reference handle for an opened modal. */
200
- class FrModalRef extends DialogRef {
201
- }
202
-
203
- const FR_MODAL_DATA = DIALOG_DATA;
204
- const FR_MODAL_REF = FrModalRef;
205
-
206
215
  /** Default shell for modal content, title, and footer actions. */
207
216
  class FrModalShell {
208
217
  dialogRef = inject((DialogRef));
@@ -336,6 +345,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
336
345
 
337
346
  const DEFAULT_PANEL_CLASS = 'frame-modal__overlay-pane';
338
347
  const DEFAULT_BACKDROP_CLASS = 'frame-modal__backdrop';
348
+ const DEFAULT_MAX_WIDTH = 'calc(100vw - 2rem)';
339
349
  /** Service for opening modal dialogs. */
340
350
  class FrModalService {
341
351
  dialog = inject(Dialog);
@@ -369,11 +379,11 @@ class FrModalService {
369
379
  ariaModal: true,
370
380
  autoFocus: 'first-tabbable',
371
381
  restoreFocus: true,
372
- maxWidth: 'calc(100vw - 2rem)',
382
+ maxWidth: DEFAULT_MAX_WIDTH,
373
383
  ...config,
374
384
  panelClass: mergeClassList(config.panelClass, DEFAULT_PANEL_CLASS),
375
385
  backdropClass: mergeClassList(config.backdropClass, DEFAULT_BACKDROP_CLASS),
376
- providers: withModalRefProvider(config.providers),
386
+ providers: withModalProviders(config.providers, modalPanelLayoutFromConfig(config)),
377
387
  };
378
388
  }
379
389
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrModalService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
@@ -475,15 +485,30 @@ function mergeClassList(classList, defaultClass) {
475
485
  : [];
476
486
  return Array.from(new Set([defaultClass, ...classes].filter(Boolean)));
477
487
  }
478
- function withModalRefProvider(providers) {
479
- const modalRefProvider = { provide: FrModalRef, useExisting: DialogRef };
488
+ function modalPanelLayoutFromConfig(config) {
489
+ const layout = {
490
+ height: valueToCssSize(config.height),
491
+ maxHeight: valueToCssSize(config.maxHeight),
492
+ maxWidth: valueToCssSize(config.maxWidth ?? (config.width ? DEFAULT_MAX_WIDTH : undefined)),
493
+ minHeight: valueToCssSize(config.minHeight),
494
+ minWidth: valueToCssSize(config.minWidth),
495
+ width: valueToCssSize(config.width),
496
+ };
497
+ const hasLayout = Object.values(layout).some((value) => value !== undefined);
498
+ return hasLayout ? layout : null;
499
+ }
500
+ function withModalProviders(providers, panelLayout) {
501
+ const defaultProviders = [
502
+ { provide: FrModalRef, useExisting: DialogRef },
503
+ ...(panelLayout ? [{ provide: FR_MODAL_PANEL_LAYOUT, useValue: panelLayout }] : []),
504
+ ];
480
505
  if (typeof providers === 'function') {
481
506
  return (dialogRef, config, container) => [
482
- modalRefProvider,
507
+ ...defaultProviders,
483
508
  ...providers(dialogRef, config, container),
484
509
  ];
485
510
  }
486
- return [modalRefProvider, ...(providers ?? [])];
511
+ return [...defaultProviders, ...(providers ?? [])];
487
512
  }
488
513
 
489
514
  /** Trigger control for modal. */
@@ -613,5 +638,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
613
638
  * Generated bundle index. Do not edit.
614
639
  */
615
640
 
616
- export { FR_MODAL_DATA, FR_MODAL_REF, FrModalBody, FrModalClose, FrModalContent, FrModalDescription, FrModalFooter, FrModalHeader, FrModalModule, FrModalPanel, FrModalRef, FrModalService, FrModalShell, FrModalTitle, FrModalTrigger };
641
+ export { FR_MODAL_DATA, FR_MODAL_PANEL_LAYOUT, FR_MODAL_REF, FrModalBody, FrModalClose, FrModalContent, FrModalDescription, FrModalFooter, FrModalHeader, FrModalModule, FrModalPanel, FrModalRef, FrModalService, FrModalShell, FrModalTitle, FrModalTrigger };
617
642
  //# sourceMappingURL=frame-ui-ng-components-modal.mjs.map