@spartan-ng/brain 0.0.1-alpha.505 → 0.0.1-alpha.507

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/calendar/lib/brn-calendar-next-button.d.ts +1 -1
  2. package/calendar/lib/brn-calendar-previous-button.d.ts +1 -1
  3. package/calendar/lib/brn-calendar.d.ts +4 -2
  4. package/calendar/lib/i18n/calendar-i18n.d.ts +16 -5
  5. package/calendar/lib/mode/brn-calendar-multiple.d.ts +4 -2
  6. package/calendar/lib/mode/brn-calendar-range.d.ts +4 -2
  7. package/fesm2022/spartan-ng-brain-accordion.mjs +1 -1
  8. package/fesm2022/spartan-ng-brain-accordion.mjs.map +1 -1
  9. package/fesm2022/spartan-ng-brain-calendar.mjs +75 -48
  10. package/fesm2022/spartan-ng-brain-calendar.mjs.map +1 -1
  11. package/fesm2022/spartan-ng-brain-checkbox.mjs +1 -1
  12. package/fesm2022/spartan-ng-brain-checkbox.mjs.map +1 -1
  13. package/fesm2022/spartan-ng-brain-collapsible.mjs +1 -1
  14. package/fesm2022/spartan-ng-brain-collapsible.mjs.map +1 -1
  15. package/fesm2022/spartan-ng-brain-command.mjs +4 -4
  16. package/fesm2022/spartan-ng-brain-command.mjs.map +1 -1
  17. package/fesm2022/spartan-ng-brain-dialog.mjs +3 -3
  18. package/fesm2022/spartan-ng-brain-dialog.mjs.map +1 -1
  19. package/fesm2022/spartan-ng-brain-label.mjs +1 -1
  20. package/fesm2022/spartan-ng-brain-label.mjs.map +1 -1
  21. package/fesm2022/spartan-ng-brain-radio-group.mjs +1 -1
  22. package/fesm2022/spartan-ng-brain-radio-group.mjs.map +1 -1
  23. package/fesm2022/spartan-ng-brain-select.mjs +23 -25
  24. package/fesm2022/spartan-ng-brain-select.mjs.map +1 -1
  25. package/fesm2022/spartan-ng-brain-switch.mjs +1 -1
  26. package/fesm2022/spartan-ng-brain-switch.mjs.map +1 -1
  27. package/fesm2022/spartan-ng-brain-toggle-group.mjs +1 -1
  28. package/fesm2022/spartan-ng-brain-toggle-group.mjs.map +1 -1
  29. package/fesm2022/spartan-ng-brain-toggle.mjs +1 -1
  30. package/fesm2022/spartan-ng-brain-toggle.mjs.map +1 -1
  31. package/package.json +1 -1
  32. package/select/lib/brn-select-content.d.ts +2 -2
  33. package/select/lib/brn-select-option.d.ts +3 -3
@@ -5,7 +5,7 @@ export declare class BrnCalendarNextButton {
5
5
  /** Access the date adapter */
6
6
  private readonly _dateAdapter;
7
7
  /** Access the calendar i18n */
8
- protected readonly _i18n: import("./i18n/calendar-i18n").BrnCalendarI18n;
8
+ protected readonly _i18n: import("./i18n/calendar-i18n").BrnCalendarI18nService;
9
9
  /** Focus the previous month */
10
10
  protected focusPreviousMonth(): void;
11
11
  static ɵfac: i0.ɵɵFactoryDeclaration<BrnCalendarNextButton, never>;
@@ -5,7 +5,7 @@ export declare class BrnCalendarPreviousButton {
5
5
  /** Access the date adapter */
6
6
  private readonly _dateAdapter;
7
7
  /** Access the calendar i18n */
8
- protected readonly _i18n: import("./i18n/calendar-i18n").BrnCalendarI18n;
8
+ protected readonly _i18n: import("./i18n/calendar-i18n").BrnCalendarI18nService;
9
9
  /** Focus the previous month */
10
10
  protected focusPreviousMonth(): void;
11
11
  static ɵfac: i0.ɵɵFactoryDeclaration<BrnCalendarPreviousButton, never>;
@@ -2,8 +2,10 @@ import { BooleanInput, NumberInput } from '@angular/cdk/coercion';
2
2
  import { BrnCalendarCellButton } from './brn-calendar-cell-button';
3
3
  import { BrnCalendarHeader } from './brn-calendar-header';
4
4
  import { BrnCalendarBase } from './brn-calendar.token';
5
+ import { Weekday } from './i18n/calendar-i18n';
5
6
  import * as i0 from "@angular/core";
6
7
  export declare class BrnCalendar<T> implements BrnCalendarBase<T> {
8
+ private readonly _i18n;
7
9
  /** Access the date adapter */
8
10
  protected readonly _dateAdapter: import("@spartan-ng/brain/date-time").BrnDateAdapter<T>;
9
11
  /** Access the change detector */
@@ -21,7 +23,8 @@ export declare class BrnCalendar<T> implements BrnCalendarBase<T> {
21
23
  /** Whether a specific date is disabled. */
22
24
  readonly dateDisabled: import("@angular/core").InputSignal<(date: T) => boolean>;
23
25
  /** The day the week starts on */
24
- readonly weekStartsOn: import("@angular/core").InputSignalWithTransform<Weekday, NumberInput>;
26
+ readonly weekStartsOn: import("@angular/core").InputSignalWithTransform<Weekday | undefined, NumberInput>;
27
+ protected readonly _weekStartsOn: import("@angular/core").Signal<Weekday>;
25
28
  /** The default focused date. */
26
29
  readonly defaultFocusedDate: import("@angular/core").InputSignal<T | undefined>;
27
30
  /** @internal Access the header */
@@ -76,4 +79,3 @@ export declare class BrnCalendar<T> implements BrnCalendarBase<T> {
76
79
  static ɵfac: i0.ɵɵFactoryDeclaration<BrnCalendar<any>, never>;
77
80
  static ɵdir: i0.ɵɵDirectiveDeclaration<BrnCalendar<any>, "[brnCalendar]", never, { "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": false; "isSignal": true; }; "dateDisabled": { "alias": "dateDisabled"; "required": false; "isSignal": true; }; "weekStartsOn": { "alias": "weekStartsOn"; "required": false; "isSignal": true; }; "defaultFocusedDate": { "alias": "defaultFocusedDate"; "required": false; "isSignal": true; }; }, { "date": "dateChange"; }, ["header", "_cells"], never, true, never>;
78
81
  }
79
- export type Weekday = 0 | 1 | 2 | 3 | 4 | 5 | 6;
@@ -1,17 +1,28 @@
1
- import { InjectionToken, ValueProvider } from '@angular/core';
2
- export interface BrnCalendarI18n {
1
+ import { InjectionToken, Provider } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export type Weekday = 0 | 1 | 2 | 3 | 4 | 5 | 6;
4
+ interface BrnCalendarI18n {
3
5
  formatWeekdayName: (index: number) => string;
4
6
  formatHeader: (month: number, year: number) => string;
5
7
  labelPrevious: () => string;
6
8
  labelNext: () => string;
7
9
  labelWeekday: (index: number) => string;
10
+ firstDayOfWeek: () => Weekday;
8
11
  }
9
- export declare const BrnCalendarI18nToken: InjectionToken<BrnCalendarI18n>;
12
+ export declare const BrnCalendarI18nToken: InjectionToken<BrnCalendarI18nService>;
10
13
  /**
11
14
  * Provide the calendar i18n configuration.
12
15
  */
13
- export declare function provideBrnCalendarI18n(configuration: BrnCalendarI18n): ValueProvider;
16
+ export declare function provideBrnCalendarI18n(configuration?: BrnCalendarI18n): Provider;
14
17
  /**
15
18
  * Inject the calendar i18n configuration.
16
19
  */
17
- export declare function injectBrnCalendarI18n(): BrnCalendarI18n;
20
+ export declare function injectBrnCalendarI18n(): BrnCalendarI18nService;
21
+ export declare class BrnCalendarI18nService {
22
+ private readonly _config;
23
+ readonly config: import("@angular/core").Signal<BrnCalendarI18n>;
24
+ use(config: Partial<BrnCalendarI18n>): void;
25
+ static ɵfac: i0.ɵɵFactoryDeclaration<BrnCalendarI18nService, never>;
26
+ static ɵprov: i0.ɵɵInjectableDeclaration<BrnCalendarI18nService>;
27
+ }
28
+ export {};
@@ -1,10 +1,11 @@
1
1
  import { BooleanInput, NumberInput } from '@angular/cdk/coercion';
2
- import { Weekday } from '../brn-calendar';
3
2
  import { BrnCalendarCellButton } from '../brn-calendar-cell-button';
4
3
  import { BrnCalendarHeader } from '../brn-calendar-header';
5
4
  import { BrnCalendarBase } from '../brn-calendar.token';
5
+ import { Weekday } from '../i18n/calendar-i18n';
6
6
  import * as i0 from "@angular/core";
7
7
  export declare class BrnCalendarMulti<T> implements BrnCalendarBase<T> {
8
+ private readonly _i18n;
8
9
  /**
9
10
  * Determine if a date is the start of a range. In a date picker, this is always false.
10
11
  * @param date The date to check.
@@ -46,7 +47,8 @@ export declare class BrnCalendarMulti<T> implements BrnCalendarBase<T> {
46
47
  /** Whether a specific date is disabled. */
47
48
  readonly dateDisabled: import("@angular/core").InputSignal<(date: T) => boolean>;
48
49
  /** The day the week starts on */
49
- readonly weekStartsOn: import("@angular/core").InputSignalWithTransform<Weekday, NumberInput>;
50
+ readonly weekStartsOn: import("@angular/core").InputSignalWithTransform<Weekday | undefined, NumberInput>;
51
+ protected readonly _weekStartsOn: import("@angular/core").Signal<Weekday>;
50
52
  /** The default focused date. */
51
53
  readonly defaultFocusedDate: import("@angular/core").InputSignal<T | undefined>;
52
54
  /** @internal Access the header */
@@ -1,10 +1,11 @@
1
1
  import { BooleanInput, NumberInput } from '@angular/cdk/coercion';
2
- import { Weekday } from '../brn-calendar';
3
2
  import { BrnCalendarCellButton } from '../brn-calendar-cell-button';
4
3
  import { BrnCalendarHeader } from '../brn-calendar-header';
5
4
  import { BrnCalendarBase } from '../brn-calendar.token';
5
+ import { Weekday } from '../i18n/calendar-i18n';
6
6
  import * as i0 from "@angular/core";
7
7
  export declare class BrnCalendarRange<T> implements BrnCalendarBase<T> {
8
+ private readonly _i18n;
8
9
  protected readonly _dateAdapter: import("@spartan-ng/brain/date-time").BrnDateAdapter<T>;
9
10
  /** Access the change detector */
10
11
  private readonly _changeDetector;
@@ -19,7 +20,8 @@ export declare class BrnCalendarRange<T> implements BrnCalendarBase<T> {
19
20
  /** Whether a specific date is disabled. */
20
21
  readonly dateDisabled: import("@angular/core").InputSignal<(date: T) => boolean>;
21
22
  /** The day the week starts on */
22
- readonly weekStartsOn: import("@angular/core").InputSignalWithTransform<Weekday, NumberInput>;
23
+ readonly weekStartsOn: import("@angular/core").InputSignalWithTransform<Weekday | undefined, NumberInput>;
24
+ protected readonly _weekStartsOn: import("@angular/core").Signal<Weekday>;
23
25
  /** The default focused date. */
24
26
  readonly defaultFocusedDate: import("@angular/core").InputSignal<T | undefined>;
25
27
  /** @internal Access the header */
@@ -13,7 +13,7 @@ class BrnAccordionItem {
13
13
  * @default false
14
14
  */
15
15
  isOpened = input(false, { transform: coerceBooleanProperty });
16
- id = BrnAccordionItem._itemIdGenerator++;
16
+ id = ++BrnAccordionItem._itemIdGenerator;
17
17
  state = computed(() => (this._accordion.openItemIds().includes(this.id) ? 'open' : 'closed'));
18
18
  constructor() {
19
19
  if (!this._accordion) {
@@ -1 +1 @@
1
- {"version":3,"file":"spartan-ng-brain-accordion.mjs","sources":["../../../../libs/brain/accordion/src/lib/brn-accordion.ts","../../../../libs/brain/accordion/src/lib/brn-accordion-content.ts","../../../../libs/brain/accordion/src/index.ts","../../../../libs/brain/accordion/src/spartan-ng-brain-accordion.ts"],"sourcesContent":["import { FocusKeyManager, FocusMonitor } from '@angular/cdk/a11y';\nimport { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport {\n\ttype AfterContentInit,\n\tDirective,\n\tElementRef,\n\tHostListener,\n\ttype OnDestroy,\n\tcomputed,\n\tcontentChildren,\n\teffect,\n\tinject,\n\tinput,\n\tsignal,\n\tuntracked,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { fromEvent } from 'rxjs';\n\n@Directive({\n\tselector: '[brnAccordionItem]',\n\thost: {\n\t\t'[attr.data-state]': 'state()',\n\t},\n\texportAs: 'brnAccordionItem',\n})\nexport class BrnAccordionItem {\n\tprivate static _itemIdGenerator = 0;\n\tprivate readonly _accordion = inject(BrnAccordion);\n\t/**\n\t * Whether the accordion item is opened or closed.\n\t * @default false\n\t */\n\tpublic readonly isOpened = input<boolean, BooleanInput>(false, { transform: coerceBooleanProperty });\n\n\tpublic readonly id = BrnAccordionItem._itemIdGenerator++;\n\tpublic readonly state = computed(() => (this._accordion.openItemIds().includes(this.id) ? 'open' : 'closed'));\n\n\tconstructor() {\n\t\tif (!this._accordion) {\n\t\t\tthrow Error('Accordion trigger can only be used inside an Accordion. Add brnAccordion to ancestor.');\n\t\t}\n\t\teffect(() => {\n\t\t\tconst isOpened = this.isOpened();\n\t\t\tuntracked(() => {\n\t\t\t\tif (isOpened) {\n\t\t\t\t\tthis._accordion.openItem(this.id);\n\t\t\t\t} else {\n\t\t\t\t\tthis._accordion.closeItem(this.id);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n}\n\n@Directive({\n\tselector: '[brnAccordionTrigger]',\n\thost: {\n\t\t'[attr.data-state]': 'state()',\n\t\t'[attr.aria-expanded]': 'state() === \"open\"',\n\t\t'[attr.aria-controls]': 'ariaControls',\n\t\trole: 'heading',\n\t\t'aria-level': '3',\n\t\t'[id]': 'id',\n\t},\n})\nexport class BrnAccordionTrigger {\n\tprivate readonly _accordion = inject(BrnAccordion);\n\tprivate readonly _item = inject(BrnAccordionItem);\n\tprivate readonly _elementRef = inject(ElementRef);\n\n\tpublic readonly state = this._item.state;\n\tpublic readonly id = `brn-accordion-trigger-${this._item.id}`;\n\tpublic readonly ariaControls = `brn-accordion-content-${this._item.id}`;\n\n\tconstructor() {\n\t\tif (!this._accordion) {\n\t\t\tthrow Error('Accordion trigger can only be used inside an Accordion. Add brnAccordion to ancestor.');\n\t\t}\n\n\t\tif (!this._item) {\n\t\t\tthrow Error('Accordion trigger can only be used inside an AccordionItem. Add brnAccordionItem to parent.');\n\t\t}\n\n\t\tfromEvent(this._elementRef.nativeElement, 'focus')\n\t\t\t.pipe(takeUntilDestroyed())\n\t\t\t.subscribe(() => {\n\t\t\t\tthis._accordion.setActiveItem(this);\n\t\t\t});\n\t}\n\n\t@HostListener('click', ['$event'])\n\t@HostListener('keyup.space', ['$event'])\n\t@HostListener('keyup.enter', ['$event'])\n\tprotected toggle(event: Event): void {\n\t\tevent.preventDefault();\n\t\tthis._accordion.toggleItem(this._item.id);\n\t}\n\n\tpublic focus() {\n\t\tthis._elementRef.nativeElement.focus();\n\t}\n}\n\nconst HORIZONTAL_KEYS_TO_PREVENT_DEFAULT = [\n\t'ArrowLeft',\n\t'ArrowRight',\n\t'PageDown',\n\t'PageUp',\n\t'Home',\n\t'End',\n\t' ',\n\t'Enter',\n];\nconst VERTICAL_KEYS_TO_PREVENT_DEFAULT = ['ArrowUp', 'ArrowDown', 'PageDown', 'PageUp', 'Home', 'End', ' ', 'Enter'];\n\n@Directive({\n\tselector: '[brnAccordion]',\n\thost: {\n\t\t'[attr.data-state]': 'state()',\n\t\t'[attr.data-orientation]': 'orientation()',\n\t},\n\texportAs: 'brnAccordion',\n})\nexport class BrnAccordion implements AfterContentInit, OnDestroy {\n\tprivate readonly _el = inject(ElementRef);\n\tprivate _keyManager?: FocusKeyManager<BrnAccordionTrigger>;\n\tprivate readonly _focusMonitor = inject(FocusMonitor);\n\n\tprivate readonly _focused = signal<boolean>(false);\n\tprivate readonly _openItemIds = signal<number[]>([]);\n\tpublic readonly openItemIds = this._openItemIds.asReadonly();\n\tpublic readonly state = computed(() => (this._openItemIds().length > 0 ? 'open' : 'closed'));\n\n\tpublic triggers = contentChildren(BrnAccordionTrigger, { descendants: true });\n\n\t/**\n\t * Whether the accordion is in single or multiple mode.\n\t * @default 'single'\n\t */\n\tpublic readonly type = input<'single' | 'multiple'>('single');\n\t/**\n\t * The direction of the accordion, either 'ltr' (left-to-right) or 'rtl' (right-to-left).\n\t * @default null\n\t */\n\tpublic readonly dir = input<'ltr' | 'rtl' | null>(null);\n\t/**\n\t * The orientation of the accordion, either 'horizontal' or 'vertical'.\n\t * @default 'vertical'\n\t */\n\tpublic readonly orientation = input<'horizontal' | 'vertical'>('vertical');\n\n\tpublic ngAfterContentInit() {\n\t\tthis._keyManager = new FocusKeyManager<BrnAccordionTrigger>(this.triggers())\n\t\t\t.withHomeAndEnd()\n\t\t\t.withPageUpDown()\n\t\t\t.withWrap();\n\n\t\tif (this.orientation() === 'horizontal') {\n\t\t\tthis._keyManager.withHorizontalOrientation(this.dir() ?? 'ltr').withVerticalOrientation(false);\n\t\t}\n\n\t\tthis._el.nativeElement.addEventListener('keydown', (event: KeyboardEvent) => {\n\t\t\tconst target = event.target as HTMLElement;\n\n\t\t\tif (target.tagName === 'INPUT') return;\n\n\t\t\tthis._keyManager?.onKeydown(event);\n\t\t\tthis.preventDefaultEvents(event);\n\t\t});\n\t\tthis._focusMonitor.monitor(this._el, true).subscribe((origin) => this._focused.set(origin !== null));\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis._focusMonitor.stopMonitoring(this._el);\n\t}\n\n\tpublic setActiveItem(item: BrnAccordionTrigger) {\n\t\tthis._keyManager?.setActiveItem(item);\n\t}\n\n\tpublic toggleItem(id: number) {\n\t\tif (this._openItemIds().includes(id)) {\n\t\t\tthis.closeItem(id);\n\t\t\treturn;\n\t\t}\n\t\tthis.openItem(id);\n\t}\n\n\tpublic openItem(id: number) {\n\t\tif (this.type() === 'single') {\n\t\t\tthis._openItemIds.set([id]);\n\t\t\treturn;\n\t\t}\n\t\tthis._openItemIds.update((ids) => [...ids, id]);\n\t}\n\tpublic closeItem(id: number) {\n\t\tthis._openItemIds.update((ids) => ids.filter((openId) => id !== openId));\n\t}\n\n\tprivate preventDefaultEvents(event: KeyboardEvent) {\n\t\tif (!this._focused()) return;\n\t\tif (!('key' in event)) return;\n\n\t\tconst keys =\n\t\t\tthis.orientation() === 'horizontal' ? HORIZONTAL_KEYS_TO_PREVENT_DEFAULT : VERTICAL_KEYS_TO_PREVENT_DEFAULT;\n\t\tif (keys.includes(event.key) && event.code !== 'NumpadEnter') {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n}\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tViewEncapsulation,\n\tcomputed,\n\tinject,\n\tinput,\n\tlinkedSignal,\n} from '@angular/core';\nimport type { CustomElementClassSettable } from '@spartan-ng/brain/core';\nimport type { ClassValue } from 'clsx';\nimport { BrnAccordionItem } from './brn-accordion';\n\n@Component({\n\tselector: 'brn-accordion-content',\n\thost: {\n\t\t'[attr.data-state]': 'state()',\n\t\t'[attr.aria-labelledby]': 'ariaLabeledBy',\n\t\trole: 'region',\n\t\t'[id]': 'id',\n\t},\n\ttemplate: `\n\t\t<div [attr.inert]=\"_addInert()\" style=\"overflow: hidden\">\n\t\t\t<p [class]=\"_contentClass()\">\n\t\t\t\t<ng-content />\n\t\t\t</p>\n\t\t</div>\n\t`,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tencapsulation: ViewEncapsulation.None,\n})\nexport class BrnAccordionContent implements CustomElementClassSettable {\n\tprivate readonly _item = inject(BrnAccordionItem);\n\n\tpublic readonly state = this._item.state;\n\tpublic readonly id = `brn-accordion-content-${this._item.id}`;\n\tpublic readonly ariaLabeledBy = `brn-accordion-trigger-${this._item.id}`;\n\n\tprotected readonly _addInert = computed(() => (this.state() === 'closed' ? true : undefined));\n\t/**\n\t * The class to be applied to the content element.\n\t */\n\tpublic readonly contentClass = input<ClassValue>('');\n\n\tprotected readonly _contentClass = linkedSignal(() => this.contentClass());\n\n\tconstructor() {\n\t\tif (!this._item) {\n\t\t\tthrow Error('Accordion Content can only be used inside an AccordionItem. Add brnAccordionItem to parent.');\n\t\t}\n\t}\n\n\tpublic setClassToCustomElement(classes: ClassValue) {\n\t\tthis._contentClass.set(classes);\n\t}\n}\n","import { NgModule } from '@angular/core';\n\nimport { BrnAccordion, BrnAccordionItem, BrnAccordionTrigger } from './lib/brn-accordion';\nimport { BrnAccordionContent } from './lib/brn-accordion-content';\n\nexport * from './lib/brn-accordion';\nexport * from './lib/brn-accordion-content';\n\nexport const BrnAccordionImports = [BrnAccordion, BrnAccordionContent, BrnAccordionItem, BrnAccordionTrigger] as const;\n\n@NgModule({\n\timports: [...BrnAccordionImports],\n\texports: [...BrnAccordionImports],\n})\nexport class BrnAccordionModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spartan-ng-brain-accordion.mjs","sources":["../../../../libs/brain/accordion/src/lib/brn-accordion.ts","../../../../libs/brain/accordion/src/lib/brn-accordion-content.ts","../../../../libs/brain/accordion/src/index.ts","../../../../libs/brain/accordion/src/spartan-ng-brain-accordion.ts"],"sourcesContent":["import { FocusKeyManager, FocusMonitor } from '@angular/cdk/a11y';\nimport { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport {\n\ttype AfterContentInit,\n\tDirective,\n\tElementRef,\n\tHostListener,\n\ttype OnDestroy,\n\tcomputed,\n\tcontentChildren,\n\teffect,\n\tinject,\n\tinput,\n\tsignal,\n\tuntracked,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { fromEvent } from 'rxjs';\n\n@Directive({\n\tselector: '[brnAccordionItem]',\n\thost: {\n\t\t'[attr.data-state]': 'state()',\n\t},\n\texportAs: 'brnAccordionItem',\n})\nexport class BrnAccordionItem {\n\tprivate static _itemIdGenerator = 0;\n\tprivate readonly _accordion = inject(BrnAccordion);\n\t/**\n\t * Whether the accordion item is opened or closed.\n\t * @default false\n\t */\n\tpublic readonly isOpened = input<boolean, BooleanInput>(false, { transform: coerceBooleanProperty });\n\n\tpublic readonly id = ++BrnAccordionItem._itemIdGenerator;\n\tpublic readonly state = computed(() => (this._accordion.openItemIds().includes(this.id) ? 'open' : 'closed'));\n\n\tconstructor() {\n\t\tif (!this._accordion) {\n\t\t\tthrow Error('Accordion trigger can only be used inside an Accordion. Add brnAccordion to ancestor.');\n\t\t}\n\t\teffect(() => {\n\t\t\tconst isOpened = this.isOpened();\n\t\t\tuntracked(() => {\n\t\t\t\tif (isOpened) {\n\t\t\t\t\tthis._accordion.openItem(this.id);\n\t\t\t\t} else {\n\t\t\t\t\tthis._accordion.closeItem(this.id);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n}\n\n@Directive({\n\tselector: '[brnAccordionTrigger]',\n\thost: {\n\t\t'[attr.data-state]': 'state()',\n\t\t'[attr.aria-expanded]': 'state() === \"open\"',\n\t\t'[attr.aria-controls]': 'ariaControls',\n\t\trole: 'heading',\n\t\t'aria-level': '3',\n\t\t'[id]': 'id',\n\t},\n})\nexport class BrnAccordionTrigger {\n\tprivate readonly _accordion = inject(BrnAccordion);\n\tprivate readonly _item = inject(BrnAccordionItem);\n\tprivate readonly _elementRef = inject(ElementRef);\n\n\tpublic readonly state = this._item.state;\n\tpublic readonly id = `brn-accordion-trigger-${this._item.id}`;\n\tpublic readonly ariaControls = `brn-accordion-content-${this._item.id}`;\n\n\tconstructor() {\n\t\tif (!this._accordion) {\n\t\t\tthrow Error('Accordion trigger can only be used inside an Accordion. Add brnAccordion to ancestor.');\n\t\t}\n\n\t\tif (!this._item) {\n\t\t\tthrow Error('Accordion trigger can only be used inside an AccordionItem. Add brnAccordionItem to parent.');\n\t\t}\n\n\t\tfromEvent(this._elementRef.nativeElement, 'focus')\n\t\t\t.pipe(takeUntilDestroyed())\n\t\t\t.subscribe(() => {\n\t\t\t\tthis._accordion.setActiveItem(this);\n\t\t\t});\n\t}\n\n\t@HostListener('click', ['$event'])\n\t@HostListener('keyup.space', ['$event'])\n\t@HostListener('keyup.enter', ['$event'])\n\tprotected toggle(event: Event): void {\n\t\tevent.preventDefault();\n\t\tthis._accordion.toggleItem(this._item.id);\n\t}\n\n\tpublic focus() {\n\t\tthis._elementRef.nativeElement.focus();\n\t}\n}\n\nconst HORIZONTAL_KEYS_TO_PREVENT_DEFAULT = [\n\t'ArrowLeft',\n\t'ArrowRight',\n\t'PageDown',\n\t'PageUp',\n\t'Home',\n\t'End',\n\t' ',\n\t'Enter',\n];\nconst VERTICAL_KEYS_TO_PREVENT_DEFAULT = ['ArrowUp', 'ArrowDown', 'PageDown', 'PageUp', 'Home', 'End', ' ', 'Enter'];\n\n@Directive({\n\tselector: '[brnAccordion]',\n\thost: {\n\t\t'[attr.data-state]': 'state()',\n\t\t'[attr.data-orientation]': 'orientation()',\n\t},\n\texportAs: 'brnAccordion',\n})\nexport class BrnAccordion implements AfterContentInit, OnDestroy {\n\tprivate readonly _el = inject(ElementRef);\n\tprivate _keyManager?: FocusKeyManager<BrnAccordionTrigger>;\n\tprivate readonly _focusMonitor = inject(FocusMonitor);\n\n\tprivate readonly _focused = signal<boolean>(false);\n\tprivate readonly _openItemIds = signal<number[]>([]);\n\tpublic readonly openItemIds = this._openItemIds.asReadonly();\n\tpublic readonly state = computed(() => (this._openItemIds().length > 0 ? 'open' : 'closed'));\n\n\tpublic triggers = contentChildren(BrnAccordionTrigger, { descendants: true });\n\n\t/**\n\t * Whether the accordion is in single or multiple mode.\n\t * @default 'single'\n\t */\n\tpublic readonly type = input<'single' | 'multiple'>('single');\n\t/**\n\t * The direction of the accordion, either 'ltr' (left-to-right) or 'rtl' (right-to-left).\n\t * @default null\n\t */\n\tpublic readonly dir = input<'ltr' | 'rtl' | null>(null);\n\t/**\n\t * The orientation of the accordion, either 'horizontal' or 'vertical'.\n\t * @default 'vertical'\n\t */\n\tpublic readonly orientation = input<'horizontal' | 'vertical'>('vertical');\n\n\tpublic ngAfterContentInit() {\n\t\tthis._keyManager = new FocusKeyManager<BrnAccordionTrigger>(this.triggers())\n\t\t\t.withHomeAndEnd()\n\t\t\t.withPageUpDown()\n\t\t\t.withWrap();\n\n\t\tif (this.orientation() === 'horizontal') {\n\t\t\tthis._keyManager.withHorizontalOrientation(this.dir() ?? 'ltr').withVerticalOrientation(false);\n\t\t}\n\n\t\tthis._el.nativeElement.addEventListener('keydown', (event: KeyboardEvent) => {\n\t\t\tconst target = event.target as HTMLElement;\n\n\t\t\tif (target.tagName === 'INPUT') return;\n\n\t\t\tthis._keyManager?.onKeydown(event);\n\t\t\tthis.preventDefaultEvents(event);\n\t\t});\n\t\tthis._focusMonitor.monitor(this._el, true).subscribe((origin) => this._focused.set(origin !== null));\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis._focusMonitor.stopMonitoring(this._el);\n\t}\n\n\tpublic setActiveItem(item: BrnAccordionTrigger) {\n\t\tthis._keyManager?.setActiveItem(item);\n\t}\n\n\tpublic toggleItem(id: number) {\n\t\tif (this._openItemIds().includes(id)) {\n\t\t\tthis.closeItem(id);\n\t\t\treturn;\n\t\t}\n\t\tthis.openItem(id);\n\t}\n\n\tpublic openItem(id: number) {\n\t\tif (this.type() === 'single') {\n\t\t\tthis._openItemIds.set([id]);\n\t\t\treturn;\n\t\t}\n\t\tthis._openItemIds.update((ids) => [...ids, id]);\n\t}\n\n\tpublic closeItem(id: number) {\n\t\tthis._openItemIds.update((ids) => ids.filter((openId) => id !== openId));\n\t}\n\n\tprivate preventDefaultEvents(event: KeyboardEvent) {\n\t\tif (!this._focused()) return;\n\t\tif (!('key' in event)) return;\n\n\t\tconst keys =\n\t\t\tthis.orientation() === 'horizontal' ? HORIZONTAL_KEYS_TO_PREVENT_DEFAULT : VERTICAL_KEYS_TO_PREVENT_DEFAULT;\n\t\tif (keys.includes(event.key) && event.code !== 'NumpadEnter') {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n}\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tViewEncapsulation,\n\tcomputed,\n\tinject,\n\tinput,\n\tlinkedSignal,\n} from '@angular/core';\nimport type { CustomElementClassSettable } from '@spartan-ng/brain/core';\nimport type { ClassValue } from 'clsx';\nimport { BrnAccordionItem } from './brn-accordion';\n\n@Component({\n\tselector: 'brn-accordion-content',\n\thost: {\n\t\t'[attr.data-state]': 'state()',\n\t\t'[attr.aria-labelledby]': 'ariaLabeledBy',\n\t\trole: 'region',\n\t\t'[id]': 'id',\n\t},\n\ttemplate: `\n\t\t<div [attr.inert]=\"_addInert()\" style=\"overflow: hidden\">\n\t\t\t<p [class]=\"_contentClass()\">\n\t\t\t\t<ng-content />\n\t\t\t</p>\n\t\t</div>\n\t`,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tencapsulation: ViewEncapsulation.None,\n})\nexport class BrnAccordionContent implements CustomElementClassSettable {\n\tprivate readonly _item = inject(BrnAccordionItem);\n\n\tpublic readonly state = this._item.state;\n\tpublic readonly id = `brn-accordion-content-${this._item.id}`;\n\tpublic readonly ariaLabeledBy = `brn-accordion-trigger-${this._item.id}`;\n\n\tprotected readonly _addInert = computed(() => (this.state() === 'closed' ? true : undefined));\n\t/**\n\t * The class to be applied to the content element.\n\t */\n\tpublic readonly contentClass = input<ClassValue>('');\n\n\tprotected readonly _contentClass = linkedSignal(() => this.contentClass());\n\n\tconstructor() {\n\t\tif (!this._item) {\n\t\t\tthrow Error('Accordion Content can only be used inside an AccordionItem. Add brnAccordionItem to parent.');\n\t\t}\n\t}\n\n\tpublic setClassToCustomElement(classes: ClassValue) {\n\t\tthis._contentClass.set(classes);\n\t}\n}\n","import { NgModule } from '@angular/core';\n\nimport { BrnAccordion, BrnAccordionItem, BrnAccordionTrigger } from './lib/brn-accordion';\nimport { BrnAccordionContent } from './lib/brn-accordion-content';\n\nexport * from './lib/brn-accordion';\nexport * from './lib/brn-accordion-content';\n\nexport const BrnAccordionImports = [BrnAccordion, BrnAccordionContent, BrnAccordionItem, BrnAccordionTrigger] as const;\n\n@NgModule({\n\timports: [...BrnAccordionImports],\n\texports: [...BrnAccordionImports],\n})\nexport class BrnAccordionModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, ElementRef, input, computed, Directive, ChangeDetectorRef, Injector, booleanAttribute, model, numberAttribute, contentChild, contentChildren, signal, afterNextRender, HostListener, ViewContainerRef, TemplateRef, effect, untracked, NgModule } from '@angular/core';
2
+ import { InjectionToken, inject, ElementRef, input, computed, Directive, signal, Injectable, ChangeDetectorRef, Injector, booleanAttribute, model, numberAttribute, contentChild, contentChildren, afterNextRender, HostListener, ViewContainerRef, TemplateRef, effect, untracked, NgModule } from '@angular/core';
3
3
  import { injectDateAdapter } from '@spartan-ng/brain/date-time';
4
4
 
5
5
  const BrnCalendarToken = new InjectionToken('BrnCalendarToken');
@@ -174,7 +174,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
174
174
  let uniqueId = 0;
175
175
  class BrnCalendarHeader {
176
176
  /** The unique id for the header */
177
- id = input(`brn-calendar-header-${uniqueId++}`);
177
+ id = input(`brn-calendar-header-${++uniqueId}`);
178
178
  /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: BrnCalendarHeader, deps: [], target: i0.ɵɵFactoryTarget.Directive });
179
179
  /** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.8", type: BrnCalendarHeader, isStandalone: true, selector: "[brnCalendarHeader]", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "aria-live": "polite", "role": "presentation" }, properties: { "id": "id()" } }, ngImport: i0 });
180
180
  }
@@ -190,7 +190,61 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
190
190
  }]
191
191
  }] });
192
192
 
193
+ const BrnCalendarI18nToken = new InjectionToken('BrnCalendarI18nToken');
194
+ /**
195
+ * Provide the calendar i18n configuration.
196
+ */
197
+ function provideBrnCalendarI18n(configuration) {
198
+ return {
199
+ provide: BrnCalendarI18nToken,
200
+ useFactory: () => {
201
+ const service = new BrnCalendarI18nService();
202
+ service.use(configuration ?? defaultCalendarI18n);
203
+ return service;
204
+ },
205
+ };
206
+ }
207
+ const defaultCalendarI18n = {
208
+ formatWeekdayName: (index) => {
209
+ const weekdays = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];
210
+ return weekdays[index];
211
+ },
212
+ formatHeader: (month, year) => {
213
+ return new Date(year, month).toLocaleDateString(undefined, {
214
+ month: 'long',
215
+ year: 'numeric',
216
+ });
217
+ },
218
+ labelPrevious: () => 'Go to the previous month',
219
+ labelNext: () => 'Go to the next month',
220
+ labelWeekday: (index) => {
221
+ const weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
222
+ return weekdays[index];
223
+ },
224
+ firstDayOfWeek: () => 0,
225
+ };
226
+ /**
227
+ * Inject the calendar i18n configuration.
228
+ */
229
+ function injectBrnCalendarI18n() {
230
+ return inject(BrnCalendarI18nToken, { optional: true }) ?? inject(BrnCalendarI18nService); // fallback
231
+ }
232
+ class BrnCalendarI18nService {
233
+ _config = signal(defaultCalendarI18n);
234
+ config = this._config.asReadonly();
235
+ use(config) {
236
+ this._config.set({ ...this.config(), ...config });
237
+ }
238
+ /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: BrnCalendarI18nService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
239
+ /** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: BrnCalendarI18nService, providedIn: 'root' });
240
+ }
241
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: BrnCalendarI18nService, decorators: [{
242
+ type: Injectable,
243
+ args: [{ providedIn: 'root' }]
244
+ }] });
245
+
193
246
  class BrnCalendar {
247
+ _i18n = injectBrnCalendarI18n();
194
248
  /** Access the date adapter */
195
249
  _dateAdapter = injectDateAdapter();
196
250
  /** Access the change detector */
@@ -210,9 +264,10 @@ class BrnCalendar {
210
264
  /** Whether a specific date is disabled. */
211
265
  dateDisabled = input(() => false);
212
266
  /** The day the week starts on */
213
- weekStartsOn = input(0, {
214
- transform: (v) => numberAttribute(v),
267
+ weekStartsOn = input(undefined, {
268
+ transform: (v) => (v === undefined || v === null ? undefined : numberAttribute(v)),
215
269
  });
270
+ _weekStartsOn = computed(() => this.weekStartsOn() ?? this._i18n.config().firstDayOfWeek());
216
271
  /** The default focused date. */
217
272
  defaultFocusedDate = input();
218
273
  /** @internal Access the header */
@@ -237,7 +292,7 @@ class BrnCalendar {
237
292
  * and the days of the previous and next month to fill the grid.
238
293
  */
239
294
  days = computed(() => {
240
- const weekStartsOn = this.weekStartsOn();
295
+ const weekStartsOn = this._weekStartsOn();
241
296
  const month = this.state().focusedDate();
242
297
  const days = [];
243
298
  // Get the first and last day of the month.
@@ -404,38 +459,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
404
459
  }]
405
460
  }] });
406
461
 
407
- const BrnCalendarI18nToken = new InjectionToken('BrnCalendarI18nToken');
408
- /**
409
- * Provide the calendar i18n configuration.
410
- */
411
- function provideBrnCalendarI18n(configuration) {
412
- return { provide: BrnCalendarI18nToken, useValue: configuration };
413
- }
414
- const defaultCalendarI18n = {
415
- formatWeekdayName: (index) => {
416
- const weekdays = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];
417
- return weekdays[index];
418
- },
419
- formatHeader: (month, year) => {
420
- return new Date(year, month).toLocaleDateString(undefined, {
421
- month: 'long',
422
- year: 'numeric',
423
- });
424
- },
425
- labelPrevious: () => 'Go to the previous month',
426
- labelNext: () => 'Go to the next month',
427
- labelWeekday: (index) => {
428
- const weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
429
- return weekdays[index];
430
- },
431
- };
432
- /**
433
- * Inject the calendar i18n configuration.
434
- */
435
- function injectBrnCalendarI18n() {
436
- return inject(BrnCalendarI18nToken, { optional: true }) ?? defaultCalendarI18n;
437
- }
438
-
439
462
  class BrnCalendarNextButton {
440
463
  /** Access the calendar */
441
464
  _calendar = injectBrnCalendar();
@@ -456,7 +479,7 @@ class BrnCalendarNextButton {
456
479
  this._calendar.state().focusedDate.set(targetDate);
457
480
  }
458
481
  /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: BrnCalendarNextButton, deps: [], target: i0.ɵɵFactoryTarget.Directive });
459
- /** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.8", type: BrnCalendarNextButton, isStandalone: true, selector: "[brnCalendarNextButton]", host: { attributes: { "type": "button" }, listeners: { "click": "focusPreviousMonth()" }, properties: { "attr.aria-label": "_i18n.labelNext()" } }, ngImport: i0 });
482
+ /** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.8", type: BrnCalendarNextButton, isStandalone: true, selector: "[brnCalendarNextButton]", host: { attributes: { "type": "button" }, listeners: { "click": "focusPreviousMonth()" }, properties: { "attr.aria-label": "_i18n.config().labelNext()" } }, ngImport: i0 });
460
483
  }
461
484
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: BrnCalendarNextButton, decorators: [{
462
485
  type: Directive,
@@ -464,7 +487,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
464
487
  selector: '[brnCalendarNextButton]',
465
488
  host: {
466
489
  type: 'button',
467
- '[attr.aria-label]': '_i18n.labelNext()',
490
+ '[attr.aria-label]': '_i18n.config().labelNext()',
468
491
  },
469
492
  }]
470
493
  }], propDecorators: { focusPreviousMonth: [{
@@ -492,7 +515,7 @@ class BrnCalendarPreviousButton {
492
515
  this._calendar.state().focusedDate.set(targetDate);
493
516
  }
494
517
  /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: BrnCalendarPreviousButton, deps: [], target: i0.ɵɵFactoryTarget.Directive });
495
- /** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.8", type: BrnCalendarPreviousButton, isStandalone: true, selector: "[brnCalendarPreviousButton]", host: { attributes: { "type": "button" }, listeners: { "click": "focusPreviousMonth()" }, properties: { "attr.aria-label": "_i18n.labelPrevious()" } }, ngImport: i0 });
518
+ /** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.8", type: BrnCalendarPreviousButton, isStandalone: true, selector: "[brnCalendarPreviousButton]", host: { attributes: { "type": "button" }, listeners: { "click": "focusPreviousMonth()" }, properties: { "attr.aria-label": "_i18n.config().labelPrevious()" } }, ngImport: i0 });
496
519
  }
497
520
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: BrnCalendarPreviousButton, decorators: [{
498
521
  type: Directive,
@@ -500,7 +523,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
500
523
  selector: '[brnCalendarPreviousButton]',
501
524
  host: {
502
525
  type: 'button',
503
- '[attr.aria-label]': '_i18n.labelPrevious()',
526
+ '[attr.aria-label]': '_i18n.config().labelPrevious()',
504
527
  },
505
528
  }]
506
529
  }], propDecorators: { focusPreviousMonth: [{
@@ -632,6 +655,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
632
655
  }], ctorParameters: () => [] });
633
656
 
634
657
  class BrnCalendarMulti {
658
+ _i18n = injectBrnCalendarI18n();
635
659
  /**
636
660
  * Determine if a date is the start of a range. In a date picker, this is always false.
637
661
  * @param date The date to check.
@@ -686,9 +710,10 @@ class BrnCalendarMulti {
686
710
  /** Whether a specific date is disabled. */
687
711
  dateDisabled = input(() => false);
688
712
  /** The day the week starts on */
689
- weekStartsOn = input(0, {
690
- transform: (v) => numberAttribute(v),
713
+ weekStartsOn = input(undefined, {
714
+ transform: (v) => (v === undefined || v === null ? undefined : numberAttribute(v)),
691
715
  });
716
+ _weekStartsOn = computed(() => this.weekStartsOn() ?? this._i18n.config().firstDayOfWeek());
692
717
  /** The default focused date. */
693
718
  defaultFocusedDate = input();
694
719
  /** @internal Access the header */
@@ -713,7 +738,7 @@ class BrnCalendarMulti {
713
738
  * and the days of the previous and next month to fill the grid.
714
739
  */
715
740
  days = computed(() => {
716
- const weekStartsOn = this.weekStartsOn();
741
+ const weekStartsOn = this._weekStartsOn();
717
742
  const month = this.state().focusedDate();
718
743
  const days = [];
719
744
  // Get the first and last day of the month.
@@ -836,6 +861,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
836
861
  }] });
837
862
 
838
863
  class BrnCalendarRange {
864
+ _i18n = injectBrnCalendarI18n();
839
865
  // /** Access the date adapter */
840
866
  _dateAdapter = injectDateAdapter();
841
867
  /** Access the change detector */
@@ -853,9 +879,10 @@ class BrnCalendarRange {
853
879
  /** Whether a specific date is disabled. */
854
880
  dateDisabled = input(() => false);
855
881
  /** The day the week starts on */
856
- weekStartsOn = input(0, {
857
- transform: (v) => numberAttribute(v),
882
+ weekStartsOn = input(undefined, {
883
+ transform: (v) => (v === undefined || v === null ? undefined : numberAttribute(v)),
858
884
  });
885
+ _weekStartsOn = computed(() => this.weekStartsOn() ?? this._i18n.config().firstDayOfWeek());
859
886
  /** The default focused date. */
860
887
  defaultFocusedDate = input();
861
888
  /** @internal Access the header */
@@ -888,7 +915,7 @@ class BrnCalendarRange {
888
915
  * and the days of the previous and next month to fill the grid.
889
916
  */
890
917
  days = computed(() => {
891
- const weekStartsOn = this.weekStartsOn();
918
+ const weekStartsOn = this._weekStartsOn();
892
919
  const month = this.state().focusedDate();
893
920
  const days = [];
894
921
  // Get the first and last day of the month.
@@ -1103,5 +1130,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
1103
1130
  * Generated bundle index. Do not edit.
1104
1131
  */
1105
1132
 
1106
- export { BrnCalendar, BrnCalendarCell, BrnCalendarCellButton, BrnCalendarGrid, BrnCalendarHeader, BrnCalendarI18nToken, BrnCalendarImports, BrnCalendarModule, BrnCalendarMulti, BrnCalendarNextButton, BrnCalendarPreviousButton, BrnCalendarRange, BrnCalendarToken, BrnCalendarWeek, BrnCalendarWeekday, injectBrnCalendar, injectBrnCalendarI18n, provideBrnCalendar, provideBrnCalendarI18n };
1133
+ export { BrnCalendar, BrnCalendarCell, BrnCalendarCellButton, BrnCalendarGrid, BrnCalendarHeader, BrnCalendarI18nService, BrnCalendarI18nToken, BrnCalendarImports, BrnCalendarModule, BrnCalendarMulti, BrnCalendarNextButton, BrnCalendarPreviousButton, BrnCalendarRange, BrnCalendarToken, BrnCalendarWeek, BrnCalendarWeekday, injectBrnCalendar, injectBrnCalendarI18n, provideBrnCalendar, provideBrnCalendarI18n };
1107
1134
  //# sourceMappingURL=spartan-ng-brain-calendar.mjs.map