@xui/date-range-picker 2.0.0-alpha.20 → 2.0.0-alpha.21
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.
|
@@ -18,24 +18,34 @@ import { XuiIcon } from '@xui/icon';
|
|
|
18
18
|
class XuiDateRangePicker {
|
|
19
19
|
adapter = injectXDateAdapter();
|
|
20
20
|
host = inject(ElementRef);
|
|
21
|
+
/** Extra classes, merged into the component's own rather than replacing them. */
|
|
21
22
|
class = input('', /* @ts-ignore */
|
|
22
23
|
...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
|
|
23
24
|
/** The chosen range. Two-way bindable with `[(value)]`. */
|
|
24
25
|
value = model({ start: null, end: null }, /* @ts-ignore */
|
|
25
26
|
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
27
|
+
/** Earliest selectable date, for both ends of the range. */
|
|
26
28
|
min = input(null, /* @ts-ignore */
|
|
27
29
|
...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
|
|
30
|
+
/** Latest selectable date, for both ends of the range. */
|
|
28
31
|
max = input(null, /* @ts-ignore */
|
|
29
32
|
...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
|
|
33
|
+
/**
|
|
34
|
+
* Per-date predicate for holes that `min`/`max` cannot express — weekends, blackout days. Return `false` to disable
|
|
35
|
+
* a date.
|
|
36
|
+
*/
|
|
30
37
|
dateFilter = input(null, /* @ts-ignore */
|
|
31
38
|
...(ngDevMode ? [{ debugName: "dateFilter" }] : /* istanbul ignore next */ []));
|
|
39
|
+
/** Which weekday each grid starts on, `0` for Sunday through `6` for Saturday. */
|
|
32
40
|
firstDayOfWeek = input(0, { ...(ngDevMode ? { debugName: "firstDayOfWeek" } : /* istanbul ignore next */ {}), transform: numberAttribute });
|
|
41
|
+
/** BCP 47 tag used for the weekday and month labels. Defaults to the runtime locale. */
|
|
33
42
|
locale = input(undefined, /* @ts-ignore */
|
|
34
43
|
...(ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []));
|
|
35
44
|
/** How many contiguous months to show (1 or 2). */
|
|
36
45
|
months = input(2, { ...(ngDevMode ? { debugName: "months" } : /* istanbul ignore next */ {}), transform: numberAttribute });
|
|
37
46
|
/** Allow the start and end to be the same day. */
|
|
38
47
|
allowSingleDayRange = input(false, { ...(ngDevMode ? { debugName: "allowSingleDayRange" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
48
|
+
/** Block interaction and dim both calendars. */
|
|
39
49
|
disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
40
50
|
cva = createXValueAccessor({
|
|
41
51
|
onWrite: range => this.value.set(range ?? { start: null, end: null }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xui-date-range-picker.mjs","sources":["../../../../../../libs/ui/date-range-picker/xui/src/lib/date-range-picker.ts","../../../../../../libs/ui/date-range-picker/xui/src/index.ts","../../../../../../libs/ui/date-range-picker/xui/src/xui-date-range-picker.ts"],"sourcesContent":["import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n linkedSignal,\n model,\n numberAttribute,\n signal,\n ViewEncapsulation\n} from '@angular/core';\nimport { ControlValueAccessor } from '@angular/forms';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { matChevronLeftRound, matChevronRightRound } from '@ng-icons/material-icons/round';\nimport { xui } from '@xui/core';\nimport { buildMonthGrid, monthYearLabel, weekdayLabels, type XCalendarDay } from '@xui/core/calendar';\nimport { injectXDateAdapter, type XDateAdapter } from '@xui/core/date-time';\nimport { createXValueAccessor, provideXValueAccessor } from '@xui/core/forms';\nimport { XuiIcon } from '@xui/icon';\nimport type { ClassValue } from 'clsx';\n\n/** A `[start, end]` date range; either end may be `null` while selecting. */\nexport interface XuiDateRange<T> {\n start: T | null;\n end: T | null;\n}\n\n/**\n * A multi-month calendar for choosing a date range. The first click sets the\n * start, the second the end (hovering previews the span); clicking again starts a\n * new range. `[(value)]` two-way binding; `T` is the active `DateAdapter`'s type.\n * It is a full `ControlValueAccessor`, so `ngModel`/`formControl` bind to it\n * directly.\n */\n@Component({\n selector: 'xui-date-range-picker',\n imports: [NgIcon, XuiIcon],\n providers: [provideXValueAccessor(() => XuiDateRangePicker)],\n template: `\n <div class=\"flex gap-6\">\n @for (offset of monthOffsets(); track offset) {\n <div>\n <div class=\"mb-2 flex items-center justify-between\">\n @if (offset === 0) {\n <button\n type=\"button\"\n [class]=\"navClass()\"\n aria-label=\"Previous month\"\n [disabled]=\"isDisabled()\"\n (click)=\"shiftMonth(-1)\"\n >\n <ng-icon xui name=\"matChevronLeftRound\" size=\"sm\" />\n </button>\n } @else {\n <span class=\"size-7\"></span>\n }\n <div class=\"text-foreground text-sm font-semibold\">{{ monthLabel(offset) }}</div>\n @if (offset === monthOffsets().length - 1) {\n <button\n type=\"button\"\n [class]=\"navClass()\"\n aria-label=\"Next month\"\n [disabled]=\"isDisabled()\"\n (click)=\"shiftMonth(1)\"\n >\n <ng-icon xui name=\"matChevronRightRound\" size=\"sm\" />\n </button>\n } @else {\n <span class=\"size-7\"></span>\n }\n </div>\n\n <!-- Separated, with the spacing taken back out: the collapsed model has browsers ignore\n border-radius on a cell, which is what rounds the ends of the range band. The zero\n spacing keeps the grid laid out exactly as the collapsed model did. -->\n <table role=\"grid\" class=\"border-separate border-spacing-0\">\n <thead>\n <tr>\n @for (label of weekdays(); track $index) {\n <th class=\"text-foreground-muted pb-1 text-center text-xs font-medium\">{{ label }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (week of grids()[offset]; track $index) {\n <tr>\n @for (day of week; track $index) {\n <!-- A day belonging to a neighbouring month is left blank: with the months\n side by side it is already on screen in its own grid, and drawing it twice\n gave a selected endpoint two circles. -->\n @if (!day.inCurrentMonth) {\n <td class=\"p-0\"></td>\n } @else {\n <!-- Selection belongs on the gridcell, not the button. -->\n <td [class]=\"cellClass(day)\" [attr.aria-selected]=\"isEndpoint(day.date)\">\n <button\n type=\"button\"\n [class]=\"dayClass(day)\"\n [disabled]=\"day.disabled || isDisabled()\"\n (click)=\"onClick(day.date)\"\n (mouseenter)=\"hover.set(day.date)\"\n >\n {{ day.label }}\n </button>\n </td>\n }\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n `,\n host: {\n '[class]': 'computedClass()',\n '(focusout)': 'onFocusOut($event)'\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n viewProviders: [provideIcons({ matChevronLeftRound, matChevronRightRound })]\n})\nexport class XuiDateRangePicker<T = Date> implements ControlValueAccessor {\n private readonly adapter: XDateAdapter<T> = injectXDateAdapter<T>();\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n readonly class = input<ClassValue>('');\n\n /** The chosen range. Two-way bindable with `[(value)]`. */\n readonly value = model<XuiDateRange<T>>({ start: null, end: null });\n\n readonly min = input<T | null>(null);\n readonly max = input<T | null>(null);\n readonly dateFilter = input<((date: T) => boolean) | null>(null);\n readonly firstDayOfWeek = input<number, NumberInput>(0, { transform: numberAttribute });\n readonly locale = input<string | undefined>(undefined);\n\n /** How many contiguous months to show (1 or 2). */\n readonly months = input<number, NumberInput>(2, { transform: numberAttribute });\n\n /** Allow the start and end to be the same day. */\n readonly allowSingleDayRange = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n readonly disabled = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n protected readonly cva = createXValueAccessor<XuiDateRange<T> | null>({\n onWrite: range => this.value.set(range ?? { start: null, end: null }),\n disabled: this.disabled\n });\n protected readonly isDisabled = this.cva.disabled;\n\n protected readonly hover = signal<T | null>(null);\n\n // The left-most month on screen, seeded from the range start (or today).\n private readonly viewDate = linkedSignal<XuiDateRange<T>, T>({\n source: this.value,\n computation: (range, previous) => range.start ?? previous?.value ?? this.adapter.now()\n });\n\n protected readonly monthOffsets = computed(() => Array.from({ length: Math.max(1, this.months()) }, (_, i) => i));\n protected readonly weekdays = computed(() => weekdayLabels(this.firstDayOfWeek(), this.locale()));\n\n protected readonly grids = computed(() =>\n this.monthOffsets().map(offset =>\n buildMonthGrid(this.adapter, this.adapter.add(this.viewDate(), { months: offset }), {\n min: this.min(),\n max: this.max(),\n dateFilter: this.dateFilter(),\n firstDayOfWeek: this.firstDayOfWeek()\n })\n )\n );\n\n protected readonly computedClass = computed(() =>\n xui(\n 'bg-surface-raised border-border inline-block rounded-lg border p-3',\n this.isDisabled() && 'opacity-50',\n this.class()\n )\n );\n protected readonly navClass = computed(() =>\n xui(\n 'text-foreground-muted hover:bg-surface-inset hover:text-foreground flex size-7 items-center justify-center rounded'\n )\n );\n\n protected monthLabel(offset: number): string {\n return monthYearLabel(this.adapter, this.adapter.add(this.viewDate(), { months: offset }), this.locale());\n }\n\n protected isEndpoint(date: T): boolean {\n const { start, end } = this.value();\n return (start != null && this.adapter.isSameDay(date, start)) || (end != null && this.adapter.isSameDay(date, end));\n }\n\n /** The provisional end while only a start is chosen (uses the hovered day). */\n private effectiveEnd(): T | null {\n const { start, end } = this.value();\n if (end != null) {\n return end;\n }\n return start != null ? this.hover() : null;\n }\n\n private inRange(date: T): boolean {\n const { start } = this.value();\n const end = this.effectiveEnd();\n if (start == null || end == null) {\n return false;\n }\n\n const [lo, hi] = this.adapter.isAfter(start, end) ? [end, start] : [start, end];\n return (\n !this.adapter.isBefore(date, this.adapter.startOfDay(lo)) &&\n !this.adapter.isAfter(date, this.adapter.startOfDay(hi))\n );\n }\n\n /**\n * The band behind the days inside the range, endpoints included.\n *\n * Its ends are rounded to the day circle's own radius, so the band finishes on the same\n * silhouette the circle draws. Squaring them off left a tinted corner poking out past the curve\n * at each end — the band read as a box drawn around the selection rather than a line joining it.\n */\n protected cellClass(day: XCalendarDay<T>): string {\n const side = this.endpointSide(day.date);\n\n return xui(\n 'p-0 text-center',\n side !== null || (this.spansDays() && this.inRange(day.date)) ? 'bg-primary/10' : '',\n side === 'start' && 'rounded-s-full',\n side === 'end' && 'rounded-e-full'\n );\n }\n\n /** The range's two ends as `[earlier, later]`, or null while it is still incomplete. */\n private bounds(): [T, T] | null {\n const { start } = this.value();\n const end = this.effectiveEnd();\n\n if (start == null || end == null) {\n return null;\n }\n\n return this.adapter.isAfter(start, end) ? [end, start] : [start, end];\n }\n\n /** Whether the range covers more than a single day — a one-day range has nothing to join up. */\n private spansDays(): boolean {\n const bounds = this.bounds();\n\n return bounds != null && !this.adapter.isSameDay(bounds[0], bounds[1]);\n }\n\n /** Which end of the range a day sits at, once the range covers more than one day. */\n private endpointSide(date: T): 'start' | 'end' | null {\n const bounds = this.bounds();\n\n if (!bounds || !this.spansDays()) {\n return null;\n }\n\n if (this.adapter.isSameDay(date, bounds[0])) {\n return 'start';\n }\n\n return this.adapter.isSameDay(date, bounds[1]) ? 'end' : null;\n }\n\n protected dayClass(day: XCalendarDay<T>): string {\n return xui(\n 'flex size-8 items-center justify-center rounded-full text-sm transition-colors',\n day.inCurrentMonth ? 'text-foreground' : 'text-foreground-subtle',\n !day.disabled && 'hover:bg-surface-inset cursor-pointer',\n day.disabled && 'cursor-not-allowed opacity-40',\n day.isToday && !this.isEndpoint(day.date) && 'ring-border-strong ring-1',\n this.isEndpoint(day.date) && 'bg-primary text-primary-foreground hover:bg-primary'\n );\n }\n\n protected shiftMonth(delta: number): void {\n this.viewDate.set(this.adapter.add(this.viewDate(), { months: delta }));\n }\n\n protected onClick(date: T): void {\n if (this.isDisabled()) {\n return;\n }\n\n const { start, end } = this.value();\n\n // Start a fresh range if there's no start, both ends are set, or the click is\n // before the current start.\n if (start == null || end != null || this.adapter.isBefore(date, start)) {\n this.commit({ start: date, end: null });\n return;\n }\n\n // Second click: complete the range (guard single-day unless allowed).\n if (this.adapter.isSameDay(date, start) && !this.allowSingleDayRange()) {\n return;\n }\n\n this.commit({ start, end: date });\n }\n\n private commit(range: XuiDateRange<T>): void {\n // `model.set` emits `valueChange` for `[(value)]` / `(valueChange)` consumers.\n this.value.set(range);\n this.cva.notifyChange(range);\n }\n\n /** Touched fires when focus leaves the calendar, not while moving inside it. */\n protected onFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget as Node | null;\n if (!next || !this.host.nativeElement.contains(next)) {\n this.cva.markTouched();\n }\n }\n\n readonly writeValue = this.cva.writeValue;\n readonly registerOnChange = this.cva.registerOnChange;\n readonly registerOnTouched = this.cva.registerOnTouched;\n readonly setDisabledState = this.cva.setDisabledState;\n}\n","import { XuiDateRangePicker } from './lib/date-range-picker';\n\nexport * from './lib/date-range-picker';\n\nexport const XuiDateRangePickerImports = [XuiDateRangePicker] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"xui-date-range-picker.mjs","sources":["../../../../../../libs/ui/date-range-picker/xui/src/lib/date-range-picker.ts","../../../../../../libs/ui/date-range-picker/xui/src/index.ts","../../../../../../libs/ui/date-range-picker/xui/src/xui-date-range-picker.ts"],"sourcesContent":["import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n linkedSignal,\n model,\n numberAttribute,\n signal,\n ViewEncapsulation\n} from '@angular/core';\nimport { ControlValueAccessor } from '@angular/forms';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { matChevronLeftRound, matChevronRightRound } from '@ng-icons/material-icons/round';\nimport { xui } from '@xui/core';\nimport { buildMonthGrid, monthYearLabel, weekdayLabels, type XCalendarDay } from '@xui/core/calendar';\nimport { injectXDateAdapter, type XDateAdapter } from '@xui/core/date-time';\nimport { createXValueAccessor, provideXValueAccessor } from '@xui/core/forms';\nimport { XuiIcon } from '@xui/icon';\nimport type { ClassValue } from 'clsx';\n\n/** A `[start, end]` date range; either end may be `null` while selecting. */\nexport interface XuiDateRange<T> {\n start: T | null;\n end: T | null;\n}\n\n/**\n * A multi-month calendar for choosing a date range. The first click sets the\n * start, the second the end (hovering previews the span); clicking again starts a\n * new range. `[(value)]` two-way binding; `T` is the active `DateAdapter`'s type.\n * It is a full `ControlValueAccessor`, so `ngModel`/`formControl` bind to it\n * directly.\n */\n@Component({\n selector: 'xui-date-range-picker',\n imports: [NgIcon, XuiIcon],\n providers: [provideXValueAccessor(() => XuiDateRangePicker)],\n template: `\n <div class=\"flex gap-6\">\n @for (offset of monthOffsets(); track offset) {\n <div>\n <div class=\"mb-2 flex items-center justify-between\">\n @if (offset === 0) {\n <button\n type=\"button\"\n [class]=\"navClass()\"\n aria-label=\"Previous month\"\n [disabled]=\"isDisabled()\"\n (click)=\"shiftMonth(-1)\"\n >\n <ng-icon xui name=\"matChevronLeftRound\" size=\"sm\" />\n </button>\n } @else {\n <span class=\"size-7\"></span>\n }\n <div class=\"text-foreground text-sm font-semibold\">{{ monthLabel(offset) }}</div>\n @if (offset === monthOffsets().length - 1) {\n <button\n type=\"button\"\n [class]=\"navClass()\"\n aria-label=\"Next month\"\n [disabled]=\"isDisabled()\"\n (click)=\"shiftMonth(1)\"\n >\n <ng-icon xui name=\"matChevronRightRound\" size=\"sm\" />\n </button>\n } @else {\n <span class=\"size-7\"></span>\n }\n </div>\n\n <!-- Separated, with the spacing taken back out: the collapsed model has browsers ignore\n border-radius on a cell, which is what rounds the ends of the range band. The zero\n spacing keeps the grid laid out exactly as the collapsed model did. -->\n <table role=\"grid\" class=\"border-separate border-spacing-0\">\n <thead>\n <tr>\n @for (label of weekdays(); track $index) {\n <th class=\"text-foreground-muted pb-1 text-center text-xs font-medium\">{{ label }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (week of grids()[offset]; track $index) {\n <tr>\n @for (day of week; track $index) {\n <!-- A day belonging to a neighbouring month is left blank: with the months\n side by side it is already on screen in its own grid, and drawing it twice\n gave a selected endpoint two circles. -->\n @if (!day.inCurrentMonth) {\n <td class=\"p-0\"></td>\n } @else {\n <!-- Selection belongs on the gridcell, not the button. -->\n <td [class]=\"cellClass(day)\" [attr.aria-selected]=\"isEndpoint(day.date)\">\n <button\n type=\"button\"\n [class]=\"dayClass(day)\"\n [disabled]=\"day.disabled || isDisabled()\"\n (click)=\"onClick(day.date)\"\n (mouseenter)=\"hover.set(day.date)\"\n >\n {{ day.label }}\n </button>\n </td>\n }\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n `,\n host: {\n '[class]': 'computedClass()',\n '(focusout)': 'onFocusOut($event)'\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n viewProviders: [provideIcons({ matChevronLeftRound, matChevronRightRound })]\n})\nexport class XuiDateRangePicker<T = Date> implements ControlValueAccessor {\n private readonly adapter: XDateAdapter<T> = injectXDateAdapter<T>();\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** Extra classes, merged into the component's own rather than replacing them. */\n readonly class = input<ClassValue>('');\n\n /** The chosen range. Two-way bindable with `[(value)]`. */\n readonly value = model<XuiDateRange<T>>({ start: null, end: null });\n\n /** Earliest selectable date, for both ends of the range. */\n readonly min = input<T | null>(null);\n /** Latest selectable date, for both ends of the range. */\n readonly max = input<T | null>(null);\n /**\n * Per-date predicate for holes that `min`/`max` cannot express — weekends, blackout days. Return `false` to disable\n * a date.\n */\n readonly dateFilter = input<((date: T) => boolean) | null>(null);\n /** Which weekday each grid starts on, `0` for Sunday through `6` for Saturday. */\n readonly firstDayOfWeek = input<number, NumberInput>(0, { transform: numberAttribute });\n /** BCP 47 tag used for the weekday and month labels. Defaults to the runtime locale. */\n readonly locale = input<string | undefined>(undefined);\n\n /** How many contiguous months to show (1 or 2). */\n readonly months = input<number, NumberInput>(2, { transform: numberAttribute });\n\n /** Allow the start and end to be the same day. */\n readonly allowSingleDayRange = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n /** Block interaction and dim both calendars. */\n readonly disabled = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n protected readonly cva = createXValueAccessor<XuiDateRange<T> | null>({\n onWrite: range => this.value.set(range ?? { start: null, end: null }),\n disabled: this.disabled\n });\n protected readonly isDisabled = this.cva.disabled;\n\n protected readonly hover = signal<T | null>(null);\n\n // The left-most month on screen, seeded from the range start (or today).\n private readonly viewDate = linkedSignal<XuiDateRange<T>, T>({\n source: this.value,\n computation: (range, previous) => range.start ?? previous?.value ?? this.adapter.now()\n });\n\n protected readonly monthOffsets = computed(() => Array.from({ length: Math.max(1, this.months()) }, (_, i) => i));\n protected readonly weekdays = computed(() => weekdayLabels(this.firstDayOfWeek(), this.locale()));\n\n protected readonly grids = computed(() =>\n this.monthOffsets().map(offset =>\n buildMonthGrid(this.adapter, this.adapter.add(this.viewDate(), { months: offset }), {\n min: this.min(),\n max: this.max(),\n dateFilter: this.dateFilter(),\n firstDayOfWeek: this.firstDayOfWeek()\n })\n )\n );\n\n protected readonly computedClass = computed(() =>\n xui(\n 'bg-surface-raised border-border inline-block rounded-lg border p-3',\n this.isDisabled() && 'opacity-50',\n this.class()\n )\n );\n protected readonly navClass = computed(() =>\n xui(\n 'text-foreground-muted hover:bg-surface-inset hover:text-foreground flex size-7 items-center justify-center rounded'\n )\n );\n\n protected monthLabel(offset: number): string {\n return monthYearLabel(this.adapter, this.adapter.add(this.viewDate(), { months: offset }), this.locale());\n }\n\n protected isEndpoint(date: T): boolean {\n const { start, end } = this.value();\n return (start != null && this.adapter.isSameDay(date, start)) || (end != null && this.adapter.isSameDay(date, end));\n }\n\n /** The provisional end while only a start is chosen (uses the hovered day). */\n private effectiveEnd(): T | null {\n const { start, end } = this.value();\n if (end != null) {\n return end;\n }\n return start != null ? this.hover() : null;\n }\n\n private inRange(date: T): boolean {\n const { start } = this.value();\n const end = this.effectiveEnd();\n if (start == null || end == null) {\n return false;\n }\n\n const [lo, hi] = this.adapter.isAfter(start, end) ? [end, start] : [start, end];\n return (\n !this.adapter.isBefore(date, this.adapter.startOfDay(lo)) &&\n !this.adapter.isAfter(date, this.adapter.startOfDay(hi))\n );\n }\n\n /**\n * The band behind the days inside the range, endpoints included.\n *\n * Its ends are rounded to the day circle's own radius, so the band finishes on the same\n * silhouette the circle draws. Squaring them off left a tinted corner poking out past the curve\n * at each end — the band read as a box drawn around the selection rather than a line joining it.\n */\n protected cellClass(day: XCalendarDay<T>): string {\n const side = this.endpointSide(day.date);\n\n return xui(\n 'p-0 text-center',\n side !== null || (this.spansDays() && this.inRange(day.date)) ? 'bg-primary/10' : '',\n side === 'start' && 'rounded-s-full',\n side === 'end' && 'rounded-e-full'\n );\n }\n\n /** The range's two ends as `[earlier, later]`, or null while it is still incomplete. */\n private bounds(): [T, T] | null {\n const { start } = this.value();\n const end = this.effectiveEnd();\n\n if (start == null || end == null) {\n return null;\n }\n\n return this.adapter.isAfter(start, end) ? [end, start] : [start, end];\n }\n\n /** Whether the range covers more than a single day — a one-day range has nothing to join up. */\n private spansDays(): boolean {\n const bounds = this.bounds();\n\n return bounds != null && !this.adapter.isSameDay(bounds[0], bounds[1]);\n }\n\n /** Which end of the range a day sits at, once the range covers more than one day. */\n private endpointSide(date: T): 'start' | 'end' | null {\n const bounds = this.bounds();\n\n if (!bounds || !this.spansDays()) {\n return null;\n }\n\n if (this.adapter.isSameDay(date, bounds[0])) {\n return 'start';\n }\n\n return this.adapter.isSameDay(date, bounds[1]) ? 'end' : null;\n }\n\n protected dayClass(day: XCalendarDay<T>): string {\n return xui(\n 'flex size-8 items-center justify-center rounded-full text-sm transition-colors',\n day.inCurrentMonth ? 'text-foreground' : 'text-foreground-subtle',\n !day.disabled && 'hover:bg-surface-inset cursor-pointer',\n day.disabled && 'cursor-not-allowed opacity-40',\n day.isToday && !this.isEndpoint(day.date) && 'ring-border-strong ring-1',\n this.isEndpoint(day.date) && 'bg-primary text-primary-foreground hover:bg-primary'\n );\n }\n\n protected shiftMonth(delta: number): void {\n this.viewDate.set(this.adapter.add(this.viewDate(), { months: delta }));\n }\n\n protected onClick(date: T): void {\n if (this.isDisabled()) {\n return;\n }\n\n const { start, end } = this.value();\n\n // Start a fresh range if there's no start, both ends are set, or the click is\n // before the current start.\n if (start == null || end != null || this.adapter.isBefore(date, start)) {\n this.commit({ start: date, end: null });\n return;\n }\n\n // Second click: complete the range (guard single-day unless allowed).\n if (this.adapter.isSameDay(date, start) && !this.allowSingleDayRange()) {\n return;\n }\n\n this.commit({ start, end: date });\n }\n\n private commit(range: XuiDateRange<T>): void {\n // `model.set` emits `valueChange` for `[(value)]` / `(valueChange)` consumers.\n this.value.set(range);\n this.cva.notifyChange(range);\n }\n\n /** Touched fires when focus leaves the calendar, not while moving inside it. */\n protected onFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget as Node | null;\n if (!next || !this.host.nativeElement.contains(next)) {\n this.cva.markTouched();\n }\n }\n\n readonly writeValue = this.cva.writeValue;\n readonly registerOnChange = this.cva.registerOnChange;\n readonly registerOnTouched = this.cva.registerOnTouched;\n readonly setDisabledState = this.cva.setDisabledState;\n}\n","import { XuiDateRangePicker } from './lib/date-range-picker';\n\nexport * from './lib/date-range-picker';\n\nexport const XuiDateRangePickerImports = [XuiDateRangePicker] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;AA+BA;;;;;;AAMG;MA0FU,kBAAkB,CAAA;IACZ,OAAO,GAAoB,kBAAkB,EAAK;AAClD,IAAA,IAAI,GAAG,MAAM,CAA0B,UAAU,CAAC;;IAG1D,KAAK,GAAG,KAAK,CAAa,EAAE;8EAAC;;IAG7B,KAAK,GAAG,KAAK,CAAkB,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE;8EAAC;;IAG1D,GAAG,GAAG,KAAK,CAAW,IAAI;4EAAC;;IAE3B,GAAG,GAAG,KAAK,CAAW,IAAI;4EAAC;AACpC;;;AAGG;IACM,UAAU,GAAG,KAAK,CAAgC,IAAI;mFAAC;;IAEvD,cAAc,GAAG,KAAK,CAAsB,CAAC,sFAAI,SAAS,EAAE,eAAe,EAAA,CAAG;;IAE9E,MAAM,GAAG,KAAK,CAAqB,SAAS;+EAAC;;IAG7C,MAAM,GAAG,KAAK,CAAsB,CAAC,8EAAI,SAAS,EAAE,eAAe,EAAA,CAAG;;IAGtE,mBAAmB,GAAG,KAAK,CAAwB,KAAK,2FAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAG1F,QAAQ,GAAG,KAAK,CAAwB,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAErE,GAAG,GAAG,oBAAoB,CAAyB;QACpE,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QACrE,QAAQ,EAAE,IAAI,CAAC;AAChB,KAAA,CAAC;AACiB,IAAA,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ;IAE9B,KAAK,GAAG,MAAM,CAAW,IAAI;8EAAC;;AAGhC,IAAA,QAAQ,GAAG,YAAY,CAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,CAAA,EACtC,MAAM,EAAE,IAAI,CAAC,KAAK;QAClB,WAAW,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,KAAK,CAAC,KAAK,IAAI,QAAQ,EAAE,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAA,CACtF;AAEiB,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;qFAAC;AAC9F,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;iFAAC;AAE9E,IAAA,KAAK,GAAG,QAAQ,CAAC,MAClC,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,MAAM,IAC5B,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE;AAClF,QAAA,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;AACf,QAAA,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;AACf,QAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,QAAA,cAAc,EAAE,IAAI,CAAC,cAAc;AACpC,KAAA,CAAC,CACH;8EACF;IAEkB,aAAa,GAAG,QAAQ,CAAC,MAC1C,GAAG,CACD,oEAAoE,EACpE,IAAI,CAAC,UAAU,EAAE,IAAI,YAAY,EACjC,IAAI,CAAC,KAAK,EAAE,CACb;sFACF;IACkB,QAAQ,GAAG,QAAQ,CAAC,MACrC,GAAG,CACD,oHAAoH,CACrH;iFACF;AAES,IAAA,UAAU,CAAC,MAAc,EAAA;AACjC,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAC3G;AAEU,IAAA,UAAU,CAAC,IAAO,EAAA;QAC1B,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE;AACnC,QAAA,OAAO,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACrH;;IAGQ,YAAY,GAAA;QAClB,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE;AACnC,QAAA,IAAI,GAAG,IAAI,IAAI,EAAE;AACf,YAAA,OAAO,GAAG;QACZ;AACA,QAAA,OAAO,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI;IAC5C;AAEQ,IAAA,OAAO,CAAC,IAAO,EAAA;QACrB,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;QAC/B,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE;AAChC,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;AAC/E,QAAA,QACE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;AACzD,YAAA,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAE5D;AAEA;;;;;;AAMG;AACO,IAAA,SAAS,CAAC,GAAoB,EAAA;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QAExC,OAAO,GAAG,CACR,iBAAiB,EACjB,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,eAAe,GAAG,EAAE,EACpF,IAAI,KAAK,OAAO,IAAI,gBAAgB,EACpC,IAAI,KAAK,KAAK,IAAI,gBAAgB,CACnC;IACH;;IAGQ,MAAM,GAAA;QACZ,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;QAE/B,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE;AAChC,YAAA,OAAO,IAAI;QACb;QAEA,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;IACvE;;IAGQ,SAAS,GAAA;AACf,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;QAE5B,OAAO,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACxE;;AAGQ,IAAA,YAAY,CAAC,IAAO,EAAA;AAC1B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;QAE5B,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;AAChC,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;AAC3C,YAAA,OAAO,OAAO;QAChB;QAEA,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI;IAC/D;AAEU,IAAA,QAAQ,CAAC,GAAoB,EAAA;QACrC,OAAO,GAAG,CACR,gFAAgF,EAChF,GAAG,CAAC,cAAc,GAAG,iBAAiB,GAAG,wBAAwB,EACjE,CAAC,GAAG,CAAC,QAAQ,IAAI,uCAAuC,EACxD,GAAG,CAAC,QAAQ,IAAI,+BAA+B,EAC/C,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,2BAA2B,EACxE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,qDAAqD,CACnF;IACH;AAEU,IAAA,UAAU,CAAC,KAAa,EAAA;QAChC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACzE;AAEU,IAAA,OAAO,CAAC,IAAO,EAAA;AACvB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACrB;QACF;QAEA,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE;;;AAInC,QAAA,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;AACtE,YAAA,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;YACvC;QACF;;AAGA,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE;YACtE;QACF;QAEA,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACnC;AAEQ,IAAA,MAAM,CAAC,KAAsB,EAAA;;AAEnC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC;IAC9B;;AAGU,IAAA,UAAU,CAAC,KAAiB,EAAA;AACpC,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,aAA4B;AAC/C,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACpD,YAAA,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE;QACxB;IACF;AAES,IAAA,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU;AAChC,IAAA,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB;AAC5C,IAAA,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB;AAC9C,IAAA,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB;0HApN1C,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;8GAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,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,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,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,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,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,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,KAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,SAAA,EAtFlB,CAAC,qBAAqB,EAAC,MAAM,kBAAkB,EAAC,CAAC,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAClD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4ET,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA9ES,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,KAAA,EAAA,MAAA,EAAA,aAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAqFV,CAAC,YAAY,CAAC,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,CAAC,CAAC,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAEjE,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAzF9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,uBAAuB;AACjC,oBAAA,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;oBAC1B,SAAS,EAAE,CAAC,qBAAqB,EAAC,MAAK,kBAAmB,EAAC,CAAC;AAC5D,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4ET,EAAA,CAAA;AACD,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,iBAAiB;AAC5B,wBAAA,YAAY,EAAE;AACf,qBAAA;oBACD,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,aAAa,EAAE,iBAAiB,CAAC,IAAI;oBACrC,aAAa,EAAE,CAAC,YAAY,CAAC,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,CAAC;AAC5E,iBAAA;;;AC1HM,MAAM,yBAAyB,GAAG,CAAC,kBAAkB;;ACJ5D;;AAEG;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xui/date-range-picker",
|
|
3
|
-
"version": "2.0.0-alpha.
|
|
3
|
+
"version": "2.0.0-alpha.21",
|
|
4
4
|
"description": "Modern Angular 22 UI Library based on TailwindCSS",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"angular",
|
|
@@ -41,8 +41,8 @@
|
|
|
41
41
|
"@angular/forms": "22",
|
|
42
42
|
"@ng-icons/core": "34",
|
|
43
43
|
"@ng-icons/material-icons": "34",
|
|
44
|
-
"@xui/core": "2.0.0-alpha.
|
|
45
|
-
"@xui/icon": "2.0.0-alpha.
|
|
44
|
+
"@xui/core": "2.0.0-alpha.21",
|
|
45
|
+
"@xui/icon": "2.0.0-alpha.21",
|
|
46
46
|
"clsx": "^2.1.1"
|
|
47
47
|
},
|
|
48
48
|
"publishConfig": {
|
|
@@ -20,18 +20,28 @@ interface XuiDateRange<T> {
|
|
|
20
20
|
declare class XuiDateRangePicker<T = Date> implements ControlValueAccessor {
|
|
21
21
|
private readonly adapter;
|
|
22
22
|
private readonly host;
|
|
23
|
+
/** Extra classes, merged into the component's own rather than replacing them. */
|
|
23
24
|
readonly class: _angular_core.InputSignal<ClassValue>;
|
|
24
25
|
/** The chosen range. Two-way bindable with `[(value)]`. */
|
|
25
26
|
readonly value: _angular_core.ModelSignal<XuiDateRange<T>>;
|
|
27
|
+
/** Earliest selectable date, for both ends of the range. */
|
|
26
28
|
readonly min: _angular_core.InputSignal<T | null>;
|
|
29
|
+
/** Latest selectable date, for both ends of the range. */
|
|
27
30
|
readonly max: _angular_core.InputSignal<T | null>;
|
|
31
|
+
/**
|
|
32
|
+
* Per-date predicate for holes that `min`/`max` cannot express — weekends, blackout days. Return `false` to disable
|
|
33
|
+
* a date.
|
|
34
|
+
*/
|
|
28
35
|
readonly dateFilter: _angular_core.InputSignal<((date: T) => boolean) | null>;
|
|
36
|
+
/** Which weekday each grid starts on, `0` for Sunday through `6` for Saturday. */
|
|
29
37
|
readonly firstDayOfWeek: _angular_core.InputSignalWithTransform<number, NumberInput>;
|
|
38
|
+
/** BCP 47 tag used for the weekday and month labels. Defaults to the runtime locale. */
|
|
30
39
|
readonly locale: _angular_core.InputSignal<string | undefined>;
|
|
31
40
|
/** How many contiguous months to show (1 or 2). */
|
|
32
41
|
readonly months: _angular_core.InputSignalWithTransform<number, NumberInput>;
|
|
33
42
|
/** Allow the start and end to be the same day. */
|
|
34
43
|
readonly allowSingleDayRange: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
|
|
44
|
+
/** Block interaction and dim both calendars. */
|
|
35
45
|
readonly disabled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
|
|
36
46
|
protected readonly cva: _xui_core_forms.XValueAccessor<XuiDateRange<T> | null>;
|
|
37
47
|
protected readonly isDisabled: _angular_core.Signal<boolean>;
|