@dcsl/flex-ui 0.0.24 → 0.0.26

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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, Renderer2, HostListener, ViewChild, Component, input, EventEmitter, effect, Output, ContentChild, Input, ContentChildren, output, model, signal, Injectable } from '@angular/core';
2
+ import { inject, Renderer2, HostListener, ViewChild, Component, input, EventEmitter, effect, Output, ContentChild, Input, ContentChildren, output, model, signal, Injectable, createComponent } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
5
  import * as i2 from '@angular/forms';
@@ -9,7 +9,7 @@ import calendarSystems from '@calidy/dayjs-calendarsystems';
9
9
  import PersianCalendarSystem from '@calidy/dayjs-calendarsystems/calendarSystems/PersianCalendarSystem';
10
10
  import HijriCalendarSystem from '@calidy/dayjs-calendarsystems/calendarSystems/HijriCalendarSystem';
11
11
  import customParseFormat from 'dayjs/plugin/customParseFormat';
12
- import { computePosition, offset, flip, autoPlacement, shift } from '@floating-ui/dom';
12
+ import { autoUpdate, computePosition, offset, flip, shift, hide } from '@floating-ui/dom';
13
13
 
14
14
  class FlexPanelComponent {
15
15
  resizeObserver;
@@ -845,11 +845,11 @@ class HijriDatepickerComponent {
845
845
  this.showCalendar = false;
846
846
  }
847
847
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: HijriDatepickerComponent, deps: [{ token: DateServiceService }], target: i0.ɵɵFactoryTarget.Component });
848
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.1", type: HijriDatepickerComponent, isStandalone: true, selector: "app-hijri-datepicker", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, calender: { classPropertyName: "calender", publicName: "calender", isSignal: true, isRequired: false, transformFunction: null }, enabled: { classPropertyName: "enabled", publicName: "enabled", isSignal: true, isRequired: false, transformFunction: null }, cssClass: { classPropertyName: "cssClass", publicName: "cssClass", isSignal: true, isRequired: false, transformFunction: null }, format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "inputDiv", first: true, predicate: ["inputDiv"], descendants: true }, { propertyName: "modalDiv", first: true, predicate: ["modalDiv"], descendants: true }, { propertyName: "popupDiv", first: true, predicate: ["popupDiv"], descendants: true }], ngImport: i0, template: "<div class=\"input-group flex-nowrap\" #inputDiv>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"inputDate\" (blur)=\"onManualDateEntered()\"\r\n [disabled]=\"!enabled()\" [placeholder]=\"format()?.toUpperCase()\" (keyup.enter)=\"onManualDateEntered()\">\r\n\r\n <button class=\"btn btn-outline-secondary\" type=\"button\" (click)=\"toggleCalendar()\" [disabled]=\"!enabled()\">\r\n <i class=\"bi bi-calendar3\"></i>\r\n </button>\r\n</div>\r\n\r\n@if(showCalendar){\r\n@if(isMobile){\r\n<div class=\"modal modal-backdrop\" tabindex=\"-1\" role=\"dialog\" style=\"display: block;\" #modalDiv>\r\n <div class=\"modal-dialog modal-dialog-scrollable\" role=\"document\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"btn btn-danger close ms-auto btn-sm\" (click)=\"showCalendar = false\">\r\n <i class=\"bi bi-x\"></i>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n@else{\r\n<div class=\"dropdown-menu show\" #popupDiv>\r\n <app-hijri-calendar (valueChange)=\"onDateSelectedFromCalender($event)\"></app-hijri-calendar>\r\n</div>\r\n}\r\n}", styles: [".dropdown-menu{--bs-dropdown-padding-y: 0}.card-body{padding:0!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: HijriCalendarComponent, selector: "app-hijri-calendar", inputs: ["value", "minDate", "maxDate", "monthLang"], outputs: ["valueChange"] }] });
848
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.1", type: HijriDatepickerComponent, isStandalone: true, selector: "app-hijri-datepicker", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, calender: { classPropertyName: "calender", publicName: "calender", isSignal: true, isRequired: false, transformFunction: null }, enabled: { classPropertyName: "enabled", publicName: "enabled", isSignal: true, isRequired: false, transformFunction: null }, cssClass: { classPropertyName: "cssClass", publicName: "cssClass", isSignal: true, isRequired: false, transformFunction: null }, format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "inputDiv", first: true, predicate: ["inputDiv"], descendants: true }, { propertyName: "modalDiv", first: true, predicate: ["modalDiv"], descendants: true }, { propertyName: "popupDiv", first: true, predicate: ["popupDiv"], descendants: true }], ngImport: i0, template: "<div class=\"input-group flex-nowrap\" #inputDiv>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"inputDate\" (blur)=\"onManualDateEntered()\"\r\n [disabled]=\"!enabled()\" [placeholder]=\"format()\" (keyup.enter)=\"onManualDateEntered()\">\r\n\r\n <button class=\"btn btn-outline-secondary\" type=\"button\" (click)=\"toggleCalendar()\" [disabled]=\"!enabled()\">\r\n <i class=\"bi bi-calendar3\"></i>\r\n </button>\r\n</div>\r\n\r\n@if(showCalendar){\r\n@if(isMobile){\r\n<div class=\"modal modal-backdrop\" tabindex=\"-1\" role=\"dialog\" style=\"display: block;\" #modalDiv>\r\n <div class=\"modal-dialog modal-dialog-scrollable\" role=\"document\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"btn btn-danger close ms-auto btn-sm\" (click)=\"showCalendar = false\">\r\n <i class=\"bi bi-x\"></i>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n@else{\r\n<div class=\"dropdown-menu show\" #popupDiv>\r\n <app-hijri-calendar (valueChange)=\"onDateSelectedFromCalender($event)\"></app-hijri-calendar>\r\n</div>\r\n}\r\n}", styles: [".dropdown-menu{--bs-dropdown-padding-y: 0}.card-body{padding:0!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: HijriCalendarComponent, selector: "app-hijri-calendar", inputs: ["value", "minDate", "maxDate", "monthLang"], outputs: ["valueChange"] }] });
849
849
  }
850
850
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: HijriDatepickerComponent, decorators: [{
851
851
  type: Component,
852
- args: [{ selector: 'app-hijri-datepicker', imports: [CommonModule, FormsModule, HijriCalendarComponent], template: "<div class=\"input-group flex-nowrap\" #inputDiv>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"inputDate\" (blur)=\"onManualDateEntered()\"\r\n [disabled]=\"!enabled()\" [placeholder]=\"format()?.toUpperCase()\" (keyup.enter)=\"onManualDateEntered()\">\r\n\r\n <button class=\"btn btn-outline-secondary\" type=\"button\" (click)=\"toggleCalendar()\" [disabled]=\"!enabled()\">\r\n <i class=\"bi bi-calendar3\"></i>\r\n </button>\r\n</div>\r\n\r\n@if(showCalendar){\r\n@if(isMobile){\r\n<div class=\"modal modal-backdrop\" tabindex=\"-1\" role=\"dialog\" style=\"display: block;\" #modalDiv>\r\n <div class=\"modal-dialog modal-dialog-scrollable\" role=\"document\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"btn btn-danger close ms-auto btn-sm\" (click)=\"showCalendar = false\">\r\n <i class=\"bi bi-x\"></i>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n@else{\r\n<div class=\"dropdown-menu show\" #popupDiv>\r\n <app-hijri-calendar (valueChange)=\"onDateSelectedFromCalender($event)\"></app-hijri-calendar>\r\n</div>\r\n}\r\n}", styles: [".dropdown-menu{--bs-dropdown-padding-y: 0}.card-body{padding:0!important}\n"] }]
852
+ args: [{ selector: 'app-hijri-datepicker', imports: [CommonModule, FormsModule, HijriCalendarComponent], template: "<div class=\"input-group flex-nowrap\" #inputDiv>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"inputDate\" (blur)=\"onManualDateEntered()\"\r\n [disabled]=\"!enabled()\" [placeholder]=\"format()\" (keyup.enter)=\"onManualDateEntered()\">\r\n\r\n <button class=\"btn btn-outline-secondary\" type=\"button\" (click)=\"toggleCalendar()\" [disabled]=\"!enabled()\">\r\n <i class=\"bi bi-calendar3\"></i>\r\n </button>\r\n</div>\r\n\r\n@if(showCalendar){\r\n@if(isMobile){\r\n<div class=\"modal modal-backdrop\" tabindex=\"-1\" role=\"dialog\" style=\"display: block;\" #modalDiv>\r\n <div class=\"modal-dialog modal-dialog-scrollable\" role=\"document\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"btn btn-danger close ms-auto btn-sm\" (click)=\"showCalendar = false\">\r\n <i class=\"bi bi-x\"></i>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n@else{\r\n<div class=\"dropdown-menu show\" #popupDiv>\r\n <app-hijri-calendar (valueChange)=\"onDateSelectedFromCalender($event)\"></app-hijri-calendar>\r\n</div>\r\n}\r\n}", styles: [".dropdown-menu{--bs-dropdown-padding-y: 0}.card-body{padding:0!important}\n"] }]
853
853
  }], ctorParameters: () => [{ type: DateServiceService }], propDecorators: { inputDiv: [{
854
854
  type: ViewChild,
855
855
  args: ["inputDiv"]
@@ -997,6 +997,8 @@ class FlexDualCalendarComponent {
997
997
  monthLang = 'en';
998
998
  /** Start mode, default Hijri */
999
999
  startMode = 'gregory';
1000
+ // This will be injected by FloatingUiService
1001
+ close;
1000
1002
  /** Current mode (hijri | gregory) */
1001
1003
  mode = signal('gregory', ...(ngDevMode ? [{ debugName: "mode" }] : []));
1002
1004
  /** Hijri view state */
@@ -1253,13 +1255,14 @@ class FlexDualCalendarComponent {
1253
1255
  this.selectedYear = this.gy();
1254
1256
  this.selectedMonth = this.gm();
1255
1257
  }
1258
+ this.close(this.value);
1256
1259
  }
1257
1260
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: FlexDualCalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1258
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.1", type: FlexDualCalendarComponent, isStandalone: true, selector: "flex-dual-calendar", inputs: { value: "value", minDate: "minDate", maxDate: "maxDate", monthLang: "monthLang", startMode: "startMode" }, outputs: { valueChange: "valueChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"card\">\r\n <div class=\"card-header p-1\">\r\n <div class=\"row g-1\">\r\n <div class=\"col-1\">\r\n <button class=\"btn btn-sm w-100 btn-info\" (click)=\"prevMonth()\" [disabled]=\"!canPrev()\">&laquo;</button>\r\n </div>\r\n <div class=\"col-6\">\r\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedMonth\" (change)=\"onMonthYearChange()\">\r\n @if (mode() === 'islamic') {\r\n @for (m of hijriMonths; track $index) {\r\n <option [value]=\"$index + 1\">{{ hijriMonths[$index] }}-{{$index + 1}}</option>\r\n }\r\n } @else {\r\n @for (m of gregMonths; track $index) {\r\n <option [value]=\"$index + 1\">{{$index + 1}}-{{ gregMonths[$index] }}</option>\r\n }\r\n }\r\n </select>\r\n </div>\r\n <div class=\"col-4\">\r\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedYear\" (change)=\"onMonthYearChange()\">\r\n @for (y of yearRange; track y) {\r\n <option [value]=\"y\">{{ y }}</option>\r\n }\r\n </select>\r\n </div>\r\n <div class=\"col-1 \">\r\n <button class=\"btn btn-sm w-100 btn-info\" (click)=\"nextMonth()\" [disabled]=\"!canNext()\">&raquo;</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card-body p-0\">\r\n <!-- Weekday labels -->\r\n <div class=\"grid\">\r\n @for (w of weekDays; track $index) {\r\n <div class=\"col fw-bold border pb-1\">{{ w }}</div>\r\n }\r\n </div>\r\n\r\n <!-- Calendar cells -->\r\n <div class=\"grid\">\r\n @for (c of cells(); track $index) {\r\n <div class=\"cell\">\r\n <button class=\"btn w-100\" [class.muted]=\"!c.inCurrentMonth\" [class.today]=\"isToday(c.g)\"\r\n [class.selected]=\"isSelected(c.g)\" [disabled]=\"c.disabled\" (click)=\"select(c)\">\r\n <!-- show Hijri day in Hijri mode, otherwise Gregorian -->\r\n @if(mode() === 'islamic'){\r\n {{ c.h.hd }}\r\n }\r\n @else{\r\n {{ c.g.getDate() }}\r\n }\r\n </button>\r\n </div>\r\n }\r\n\r\n </div>\r\n </div>\r\n <div class=\"card-footer px-0 py-1\">\r\n <div class=\"d-flex justify-content-center\">\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Basic example\">\r\n <button class=\"btn btn-sm btn-outline-secondary\" type=\"button\" (click)=\"switchMode('gregory')\">\r\n Gregorian\r\n </button>\r\n <button class=\"btn btn-sm btn-outline-secondary\" type=\"button\" (click)=\"switchMode('islamic')\">\r\n \u0647\u062C\u0631\u064A\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".grid{display:grid;grid-template-columns:repeat(7,1fr)}.cell{border:1px solid #ddd}.cell.muted{opacity:.5}.cell.today{outline:2px solid #0d6efd}.cell.selected{background-color:#0d6efd;color:#fff}.cell:disabled{background-color:#f8f9fa;color:#aaa;cursor:not-allowed}.col{text-align:center}.btn{font-size:90%;--bs-btn-padding-x: .5rem;--bs-btn-padding-y: .25rem}.btn:hover{background-color:azure}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
1261
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.1", type: FlexDualCalendarComponent, isStandalone: true, selector: "flex-dual-calendar", inputs: { value: "value", minDate: "minDate", maxDate: "maxDate", monthLang: "monthLang", startMode: "startMode" }, outputs: { valueChange: "valueChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"card\">\r\n <div class=\"card-header p-1\">\r\n <div class=\"d-flex gap-1\">\r\n\r\n <div>\r\n <button class=\"btn btn-sm w-100 \" (click)=\"prevMonth()\" [disabled]=\"!canPrev()\"><i\r\n class=\"bi bi-caret-left-fill\"></i></button>\r\n </div>\r\n <div class=\"flex-grow-1\">\r\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedMonth\" (change)=\"onMonthYearChange()\">\r\n @if (mode() === 'islamic') {\r\n @for (m of hijriMonths; track $index) {\r\n <option [value]=\"$index + 1\">{{ hijriMonths[$index] }}-{{$index + 1}}</option>\r\n }\r\n } @else {\r\n @for (m of gregMonths; track $index) {\r\n <option [value]=\"$index + 1\">{{$index + 1}}-{{ gregMonths[$index] }}</option>\r\n }\r\n }\r\n </select>\r\n </div>\r\n <div> <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedYear\" (change)=\"onMonthYearChange()\">\r\n @for (y of yearRange; track y) {\r\n <option [value]=\"y\">{{ y }}</option>\r\n }\r\n </select></div>\r\n <div>\r\n <button class=\"btn btn-sm w-100 \" (click)=\"nextMonth()\" [disabled]=\"!canNext()\"><i\r\n class=\"bi bi-caret-right-fill\"></i></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card-body p-0\">\r\n <!-- Weekday labels -->\r\n <div class=\"grid\">\r\n @for (w of weekDays; track $index) {\r\n <div class=\"col fw-bold border pb-1\">{{ w }}</div>\r\n }\r\n </div>\r\n\r\n <!-- Calendar cells -->\r\n <div class=\"grid\">\r\n @for (c of cells(); track $index) {\r\n <div class=\"cell\">\r\n <button class=\"btn w-100\" [class.muted]=\"!c.inCurrentMonth\" [class.today]=\"isToday(c.g)\"\r\n [class.selected]=\"isSelected(c.g)\" [disabled]=\"c.disabled\" (click)=\"select(c)\">\r\n <!-- show Hijri day in Hijri mode, otherwise Gregorian -->\r\n @if(mode() === 'islamic'){\r\n {{ c.h.hd }}\r\n }\r\n @else{\r\n {{ c.g.getDate() }}\r\n }\r\n </button>\r\n </div>\r\n }\r\n\r\n </div>\r\n </div>\r\n <div class=\"card-footer px-0 py-1\">\r\n <div class=\"d-flex justify-content-center\">\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Basic example\">\r\n <button class=\"btn btn-sm btn-outline-secondary\" type=\"button\" (click)=\"switchMode('gregory')\">\r\n Gregorian\r\n </button>\r\n <button class=\"btn btn-sm btn-outline-secondary\" type=\"button\" (click)=\"switchMode('islamic')\">\r\n \u0647\u062C\u0631\u064A\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".grid{display:grid;grid-template-columns:repeat(7,1fr)}.cell{border:1px solid #ddd}.cell.muted{opacity:.5}.cell.today{outline:2px solid #0d6efd}.cell.selected{background-color:#0d6efd;color:#fff}.cell:disabled{background-color:#f8f9fa;color:#aaa;cursor:not-allowed}.col{text-align:center}.btn{font-size:90%;--bs-btn-padding-x: .5rem;--bs-btn-padding-y: .25rem}.btn:hover{background-color:azure}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
1259
1262
  }
1260
1263
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: FlexDualCalendarComponent, decorators: [{
1261
1264
  type: Component,
1262
- args: [{ selector: 'flex-dual-calendar', standalone: true, imports: [CommonModule, FormsModule], template: "<div class=\"card\">\r\n <div class=\"card-header p-1\">\r\n <div class=\"row g-1\">\r\n <div class=\"col-1\">\r\n <button class=\"btn btn-sm w-100 btn-info\" (click)=\"prevMonth()\" [disabled]=\"!canPrev()\">&laquo;</button>\r\n </div>\r\n <div class=\"col-6\">\r\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedMonth\" (change)=\"onMonthYearChange()\">\r\n @if (mode() === 'islamic') {\r\n @for (m of hijriMonths; track $index) {\r\n <option [value]=\"$index + 1\">{{ hijriMonths[$index] }}-{{$index + 1}}</option>\r\n }\r\n } @else {\r\n @for (m of gregMonths; track $index) {\r\n <option [value]=\"$index + 1\">{{$index + 1}}-{{ gregMonths[$index] }}</option>\r\n }\r\n }\r\n </select>\r\n </div>\r\n <div class=\"col-4\">\r\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedYear\" (change)=\"onMonthYearChange()\">\r\n @for (y of yearRange; track y) {\r\n <option [value]=\"y\">{{ y }}</option>\r\n }\r\n </select>\r\n </div>\r\n <div class=\"col-1 \">\r\n <button class=\"btn btn-sm w-100 btn-info\" (click)=\"nextMonth()\" [disabled]=\"!canNext()\">&raquo;</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card-body p-0\">\r\n <!-- Weekday labels -->\r\n <div class=\"grid\">\r\n @for (w of weekDays; track $index) {\r\n <div class=\"col fw-bold border pb-1\">{{ w }}</div>\r\n }\r\n </div>\r\n\r\n <!-- Calendar cells -->\r\n <div class=\"grid\">\r\n @for (c of cells(); track $index) {\r\n <div class=\"cell\">\r\n <button class=\"btn w-100\" [class.muted]=\"!c.inCurrentMonth\" [class.today]=\"isToday(c.g)\"\r\n [class.selected]=\"isSelected(c.g)\" [disabled]=\"c.disabled\" (click)=\"select(c)\">\r\n <!-- show Hijri day in Hijri mode, otherwise Gregorian -->\r\n @if(mode() === 'islamic'){\r\n {{ c.h.hd }}\r\n }\r\n @else{\r\n {{ c.g.getDate() }}\r\n }\r\n </button>\r\n </div>\r\n }\r\n\r\n </div>\r\n </div>\r\n <div class=\"card-footer px-0 py-1\">\r\n <div class=\"d-flex justify-content-center\">\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Basic example\">\r\n <button class=\"btn btn-sm btn-outline-secondary\" type=\"button\" (click)=\"switchMode('gregory')\">\r\n Gregorian\r\n </button>\r\n <button class=\"btn btn-sm btn-outline-secondary\" type=\"button\" (click)=\"switchMode('islamic')\">\r\n \u0647\u062C\u0631\u064A\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".grid{display:grid;grid-template-columns:repeat(7,1fr)}.cell{border:1px solid #ddd}.cell.muted{opacity:.5}.cell.today{outline:2px solid #0d6efd}.cell.selected{background-color:#0d6efd;color:#fff}.cell:disabled{background-color:#f8f9fa;color:#aaa;cursor:not-allowed}.col{text-align:center}.btn{font-size:90%;--bs-btn-padding-x: .5rem;--bs-btn-padding-y: .25rem}.btn:hover{background-color:azure}\n"] }]
1265
+ args: [{ selector: 'flex-dual-calendar', standalone: true, imports: [CommonModule, FormsModule], template: "<div class=\"card\">\r\n <div class=\"card-header p-1\">\r\n <div class=\"d-flex gap-1\">\r\n\r\n <div>\r\n <button class=\"btn btn-sm w-100 \" (click)=\"prevMonth()\" [disabled]=\"!canPrev()\"><i\r\n class=\"bi bi-caret-left-fill\"></i></button>\r\n </div>\r\n <div class=\"flex-grow-1\">\r\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedMonth\" (change)=\"onMonthYearChange()\">\r\n @if (mode() === 'islamic') {\r\n @for (m of hijriMonths; track $index) {\r\n <option [value]=\"$index + 1\">{{ hijriMonths[$index] }}-{{$index + 1}}</option>\r\n }\r\n } @else {\r\n @for (m of gregMonths; track $index) {\r\n <option [value]=\"$index + 1\">{{$index + 1}}-{{ gregMonths[$index] }}</option>\r\n }\r\n }\r\n </select>\r\n </div>\r\n <div> <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedYear\" (change)=\"onMonthYearChange()\">\r\n @for (y of yearRange; track y) {\r\n <option [value]=\"y\">{{ y }}</option>\r\n }\r\n </select></div>\r\n <div>\r\n <button class=\"btn btn-sm w-100 \" (click)=\"nextMonth()\" [disabled]=\"!canNext()\"><i\r\n class=\"bi bi-caret-right-fill\"></i></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card-body p-0\">\r\n <!-- Weekday labels -->\r\n <div class=\"grid\">\r\n @for (w of weekDays; track $index) {\r\n <div class=\"col fw-bold border pb-1\">{{ w }}</div>\r\n }\r\n </div>\r\n\r\n <!-- Calendar cells -->\r\n <div class=\"grid\">\r\n @for (c of cells(); track $index) {\r\n <div class=\"cell\">\r\n <button class=\"btn w-100\" [class.muted]=\"!c.inCurrentMonth\" [class.today]=\"isToday(c.g)\"\r\n [class.selected]=\"isSelected(c.g)\" [disabled]=\"c.disabled\" (click)=\"select(c)\">\r\n <!-- show Hijri day in Hijri mode, otherwise Gregorian -->\r\n @if(mode() === 'islamic'){\r\n {{ c.h.hd }}\r\n }\r\n @else{\r\n {{ c.g.getDate() }}\r\n }\r\n </button>\r\n </div>\r\n }\r\n\r\n </div>\r\n </div>\r\n <div class=\"card-footer px-0 py-1\">\r\n <div class=\"d-flex justify-content-center\">\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Basic example\">\r\n <button class=\"btn btn-sm btn-outline-secondary\" type=\"button\" (click)=\"switchMode('gregory')\">\r\n Gregorian\r\n </button>\r\n <button class=\"btn btn-sm btn-outline-secondary\" type=\"button\" (click)=\"switchMode('islamic')\">\r\n \u0647\u062C\u0631\u064A\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".grid{display:grid;grid-template-columns:repeat(7,1fr)}.cell{border:1px solid #ddd}.cell.muted{opacity:.5}.cell.today{outline:2px solid #0d6efd}.cell.selected{background-color:#0d6efd;color:#fff}.cell:disabled{background-color:#f8f9fa;color:#aaa;cursor:not-allowed}.col{text-align:center}.btn{font-size:90%;--bs-btn-padding-x: .5rem;--bs-btn-padding-y: .25rem}.btn:hover{background-color:azure}\n"] }]
1263
1266
  }], ctorParameters: () => [], propDecorators: { value: [{
1264
1267
  type: Input
1265
1268
  }], valueChange: [{
@@ -1274,8 +1277,149 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImpor
1274
1277
  type: Input
1275
1278
  }] } });
1276
1279
 
1280
+ class DeviceDetectorService {
1281
+ getDeviceType() {
1282
+ const ua = navigator.userAgent;
1283
+ if (/Mobi|Android/i.test(ua))
1284
+ return 'mobile';
1285
+ if (/iPad|Tablet/i.test(ua))
1286
+ return 'tablet';
1287
+ return 'desktop';
1288
+ }
1289
+ getOS() {
1290
+ const ua = navigator.userAgent;
1291
+ if (/iPhone|iPad|iPod/i.test(ua))
1292
+ return 'iOS';
1293
+ if (/Android/i.test(ua))
1294
+ return 'Android';
1295
+ if (/Win/i.test(ua))
1296
+ return 'Windows';
1297
+ if (/Mac/i.test(ua))
1298
+ return 'MacOS';
1299
+ if (/Linux/i.test(ua))
1300
+ return 'Linux';
1301
+ return 'Other';
1302
+ }
1303
+ isMobile() { return this.getDeviceType() === 'mobile'; }
1304
+ isTablet() { return this.getDeviceType() === 'tablet'; }
1305
+ isDesktop() { return this.getDeviceType() === 'desktop'; }
1306
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: DeviceDetectorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1307
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: DeviceDetectorService, providedIn: 'root' });
1308
+ }
1309
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: DeviceDetectorService, decorators: [{
1310
+ type: Injectable,
1311
+ args: [{ providedIn: 'root' }]
1312
+ }] });
1313
+
1314
+ class FloatingUiService {
1315
+ appRef;
1316
+ injector;
1317
+ activePopup;
1318
+ constructor(appRef, injector) {
1319
+ this.appRef = appRef;
1320
+ this.injector = injector;
1321
+ }
1322
+ /**
1323
+ * Opens a floating Angular component near a reference element.
1324
+ * Ensures only one popup is visible at a time.
1325
+ */
1326
+ async open(reference, component, options) {
1327
+ // 🔹 If one is already open, close it first
1328
+ if (this.activePopup) {
1329
+ this.activePopup.cleanup(null);
1330
+ this.activePopup.resolve(null);
1331
+ this.activePopup = undefined;
1332
+ }
1333
+ return new Promise((resolve) => {
1334
+ // 1️⃣ Create component
1335
+ const compRef = createComponent(component, {
1336
+ environmentInjector: this.injector,
1337
+ });
1338
+ // 2️⃣ Pass close() callback
1339
+ compRef.instance.close = (result) => cleanup(result ?? null);
1340
+ // 3️⃣ Apply input bindings
1341
+ if (options?.inputs) {
1342
+ Object.entries(options.inputs).forEach(([k, v]) => {
1343
+ compRef.instance[k] = v;
1344
+ });
1345
+ }
1346
+ // 4️⃣ Attach to DOM
1347
+ document.body.appendChild(compRef.location.nativeElement);
1348
+ this.appRef.attachView(compRef.hostView);
1349
+ // 5️⃣ Floating-UI position logic
1350
+ const cleanupAutoUpdate = autoUpdate(reference, compRef.location.nativeElement, () => {
1351
+ computePosition(reference, compRef.location.nativeElement, {
1352
+ placement: 'bottom-start',
1353
+ middleware: [offset(2), flip(), shift()],
1354
+ }).then(({ x, y }) => {
1355
+ Object.assign(compRef.location.nativeElement.style, {
1356
+ position: 'absolute',
1357
+ left: `${x}px`,
1358
+ top: `${y}px`,
1359
+ zIndex: '1080',
1360
+ });
1361
+ });
1362
+ });
1363
+ // 6️⃣ Close on outside click / ESC
1364
+ const handleClickOutside = (e) => {
1365
+ const el = compRef.location.nativeElement;
1366
+ const target = e.target;
1367
+ if (!el.contains(target) && !reference.contains(target)) {
1368
+ cleanup(null);
1369
+ }
1370
+ };
1371
+ const handleEscape = (e) => {
1372
+ if (e.key === 'Escape')
1373
+ cleanup(null);
1374
+ };
1375
+ if (options?.closeOnOutsideClick !== false) {
1376
+ setTimeout(() => document.addEventListener('mousedown', handleClickOutside));
1377
+ }
1378
+ if (options?.closeOnEscape !== false) {
1379
+ document.addEventListener('keydown', handleEscape);
1380
+ }
1381
+ // 7️⃣ Cleanup logic
1382
+ const cleanup = (result) => {
1383
+ cleanupAutoUpdate();
1384
+ document.removeEventListener('mousedown', handleClickOutside);
1385
+ document.removeEventListener('keydown', handleEscape);
1386
+ this.appRef.detachView(compRef.hostView);
1387
+ compRef.destroy();
1388
+ // release singleton lock
1389
+ this.activePopup = undefined;
1390
+ resolve(result);
1391
+ };
1392
+ // 🔸 Track current popup
1393
+ this.activePopup = { compRef, cleanup, resolve };
1394
+ });
1395
+ }
1396
+ /**
1397
+ * Closes the currently active floating popup, if any.
1398
+ */
1399
+ closeActive(result) {
1400
+ if (this.activePopup) {
1401
+ this.activePopup.cleanup(null);
1402
+ this.activePopup.resolve(result ?? null);
1403
+ this.activePopup = undefined;
1404
+ }
1405
+ }
1406
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: FloatingUiService, deps: [{ token: i0.ApplicationRef }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Injectable });
1407
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: FloatingUiService, providedIn: 'root' });
1408
+ }
1409
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: FloatingUiService, decorators: [{
1410
+ type: Injectable,
1411
+ args: [{ providedIn: 'root' }]
1412
+ }], ctorParameters: () => [{ type: i0.ApplicationRef }, { type: i0.EnvironmentInjector }] });
1413
+
1277
1414
  class FlexDualDatepickerComponent {
1278
1415
  dateService;
1416
+ deviceDetector;
1417
+ floating;
1418
+ calendarButton;
1419
+ calendarDropdown;
1420
+ inputDiv;
1421
+ modalDiv;
1422
+ // @ViewChild("menu") popupDiv?: ElementRef;
1279
1423
  value = model(...(ngDevMode ? [undefined, { debugName: "value" }] : []));
1280
1424
  enabled = input(true, ...(ngDevMode ? [{ debugName: "enabled" }] : []));
1281
1425
  cssClass = input(...(ngDevMode ? [undefined, { debugName: "cssClass" }] : []));
@@ -1284,12 +1428,14 @@ class FlexDualDatepickerComponent {
1284
1428
  calendarSwitchPosition = input("title", ...(ngDevMode ? [{ debugName: "calendarSwitchPosition" }] : []));
1285
1429
  //selectedDate is needed to keep the current data for process
1286
1430
  selectedDate;
1287
- showCalendar = false;
1288
1431
  calendar = "gregory";
1289
1432
  inputDate = "";
1290
1433
  isMobile = false;
1291
- constructor(dateService) {
1434
+ constructor(dateService, deviceDetector, floating) {
1292
1435
  this.dateService = dateService;
1436
+ this.deviceDetector = deviceDetector;
1437
+ this.floating = floating;
1438
+ this.isMobile = deviceDetector.isMobile();
1293
1439
  effect(() => {
1294
1440
  const iso = this.value();
1295
1441
  if (iso) {
@@ -1313,14 +1459,11 @@ class FlexDualDatepickerComponent {
1313
1459
  }
1314
1460
  this.inputDate = this.formatDate(this.selectedDate);
1315
1461
  }
1316
- toggleCalendar() {
1317
- this.showCalendar = !this.showCalendar;
1318
- }
1319
1462
  onDateSelectedFromCalender(e) {
1320
1463
  this.inputDate = this.formatDate(e);
1321
1464
  this.updateDate(e);
1322
- this.showCalendar = false;
1323
1465
  this.isOpen = false;
1466
+ this.updateCalendar();
1324
1467
  }
1325
1468
  /** Triggered on blur OR Enter key */
1326
1469
  onManualDateEntered() {
@@ -1366,66 +1509,74 @@ class FlexDualDatepickerComponent {
1366
1509
  //if last selected date is also null then we will return current date.
1367
1510
  return new Date();
1368
1511
  }
1369
- inputDiv;
1370
- modalDiv;
1371
- popupDiv;
1372
1512
  onDocumentClick(event) {
1373
1513
  if (this.inputDiv?.nativeElement.contains(event.target)
1374
1514
  || this.modalDiv?.nativeElement.contains(event.target)
1375
- || this.popupDiv?.nativeElement.contains(event.target)) {
1515
+ || this.calendarDropdown?.nativeElement.contains(event.target)) {
1376
1516
  return;
1377
1517
  }
1378
- this.showCalendar = false;
1379
1518
  this.isOpen = false;
1519
+ this.updateCalendar();
1520
+ }
1521
+ async openCalendar() {
1522
+ const button = this.calendarButton?.nativeElement;
1523
+ const result = await this.floating.open(button, FlexDualCalendarComponent, {
1524
+ placement: 'bottom-start',
1525
+ inputs: {
1526
+ // You can pass any props here
1527
+ initialDate: this.selectedDate,
1528
+ },
1529
+ });
1530
+ if (result) {
1531
+ //this.selectedDate = result;
1532
+ this.updateDate(result);
1533
+ }
1380
1534
  }
1381
- btnRef;
1382
- menuRef;
1383
1535
  isOpen = false;
1384
- async toggleMenu() {
1536
+ toggleMenu() {
1385
1537
  this.isOpen = !this.isOpen;
1386
- if (this.isOpen) {
1387
- const button = this.btnRef.nativeElement;
1388
- const menu = this.menuRef.nativeElement;
1389
- const { x, y } = await computePosition(button, menu, {
1390
- // placement: 'bottom-start',
1391
- strategy: 'fixed',
1392
- middleware: [
1393
- offset(4),
1394
- flip(),
1395
- autoPlacement(), // <--- AUTO PLACEMENT
1396
- shift()
1397
- ]
1398
- });
1399
- Object.assign(menu.style, {
1538
+ if (this.isMobile)
1539
+ return;
1540
+ this.updateCalendar();
1541
+ }
1542
+ updateCalendar() {
1543
+ const button = this.calendarButton?.nativeElement;
1544
+ const calendar = this.calendarDropdown?.nativeElement;
1545
+ computePosition(button, calendar, {
1546
+ placement: "bottom",
1547
+ strategy: 'fixed',
1548
+ middleware: [flip(), shift(), hide()]
1549
+ }).then(({ x, y }) => {
1550
+ Object.assign(calendar.style, {
1400
1551
  left: `${x}px`,
1401
- top: `${y}px`
1552
+ top: `${y}px`,
1553
+ visibility: !this.isOpen
1554
+ ? 'hidden'
1555
+ : 'visible',
1402
1556
  });
1403
- }
1557
+ });
1404
1558
  }
1405
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: FlexDualDatepickerComponent, deps: [{ token: DateServiceService }], target: i0.ɵɵFactoryTarget.Component });
1406
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.1", type: FlexDualDatepickerComponent, isStandalone: true, selector: "flex-dual-datepicker", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, enabled: { classPropertyName: "enabled", publicName: "enabled", isSignal: true, isRequired: false, transformFunction: null }, cssClass: { classPropertyName: "cssClass", publicName: "cssClass", isSignal: true, isRequired: false, transformFunction: null }, format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, calendarSwitchPosition: { classPropertyName: "calendarSwitchPosition", publicName: "calendarSwitchPosition", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "inputDiv", first: true, predicate: ["inputDiv"], descendants: true }, { propertyName: "modalDiv", first: true, predicate: ["modalDiv"], descendants: true }, { propertyName: "popupDiv", first: true, predicate: ["menu"], descendants: true }, { propertyName: "btnRef", first: true, predicate: ["btn"], descendants: true }, { propertyName: "menuRef", first: true, predicate: ["menu"], descendants: true }], ngImport: i0, template: "@if(calendarSwitchPosition() == 'title'){\r\n<div class=\"d-flex align-items-center gap-1\">\r\n <label>{{ title() }}</label>\r\n <button type=\"button\" class=\"btn btn-sm btn-info\" style=\"cursor: pointer; padding-bottom: 1px; padding-top: 1px;\"\r\n (click)=\"switchCalendar()\">\r\n @if(calendar == 'gregory') {G}\r\n @else{H}\r\n </button>\r\n</div>\r\n\r\n}\r\n<div class=\"input-group flex-nowrap\" #inputDiv>\r\n @if(calendarSwitchPosition() == 'inline'){\r\n <span class=\"input-group-text\" style=\"cursor: pointer;\" (click)=\"switchCalendar()\"> @if(calendar == 'gregory') {G}\r\n @else{H}</span>\r\n }\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"inputDate\" (blur)=\"onManualDateEntered()\"\r\n [disabled]=\"!enabled()\" [placeholder]=\"format()\" (keyup.enter)=\"onManualDateEntered()\">\r\n\r\n\r\n <!-- <button class=\"btn btn-outline-secondary\" type=\"button\" (click)=\"toggleCalendar()\" [disabled]=\"!enabled()\">\r\n <i class=\"bi bi-calendar3\"></i>\r\n </button> -->\r\n <button #btn class=\"btn btn-outline-secondary\" (click)=\"toggleMenu()\" [disabled]=\"!enabled()\">\r\n <i class=\"bi bi-calendar3\"></i>\r\n </button>\r\n\r\n</div>\r\n\r\n@if(isOpen){\r\n@if(isMobile){\r\n<div class=\"modal modal-backdrop\" tabindex=\"-1\" role=\"dialog\" style=\"display: block;\" #modalDiv>\r\n <div class=\"modal-dialog modal-dialog-scrollable\" role=\"document\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"btn btn-danger close ms-auto btn-sm\" (click)=\"showCalendar = false\">\r\n <i class=\"bi bi-x\"></i>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n@else{\r\n<div #menu class=\"dropdown-panel\">\r\n <flex-dual-calendar (valueChange)=\"onDateSelectedFromCalender($event)\"\r\n [(value)]=\"selectedDate\"></flex-dual-calendar>\r\n</div>\r\n}\r\n}", styles: [".dropdown-menu{--bs-dropdown-padding-y: 0}.card-body{padding:0!important}.dropdown-panel{position:fixed;border-radius:4px;z-index:9999}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: FlexDualCalendarComponent, selector: "flex-dual-calendar", inputs: ["value", "minDate", "maxDate", "monthLang", "startMode"], outputs: ["valueChange"] }] });
1559
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: FlexDualDatepickerComponent, deps: [{ token: DateServiceService }, { token: DeviceDetectorService }, { token: FloatingUiService }], target: i0.ɵɵFactoryTarget.Component });
1560
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.1", type: FlexDualDatepickerComponent, isStandalone: true, selector: "flex-dual-datepicker", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, enabled: { classPropertyName: "enabled", publicName: "enabled", isSignal: true, isRequired: false, transformFunction: null }, cssClass: { classPropertyName: "cssClass", publicName: "cssClass", isSignal: true, isRequired: false, transformFunction: null }, format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, calendarSwitchPosition: { classPropertyName: "calendarSwitchPosition", publicName: "calendarSwitchPosition", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "calendarButton", first: true, predicate: ["calendarButton"], descendants: true }, { propertyName: "calendarDropdown", first: true, predicate: ["calendarDropdown"], descendants: true }, { propertyName: "inputDiv", first: true, predicate: ["inputDiv"], descendants: true }, { propertyName: "modalDiv", first: true, predicate: ["modalDiv"], descendants: true }], ngImport: i0, template: "@if(calendarSwitchPosition() == 'title'){\r\n<div class=\"d-flex align-items-center gap-1\">\r\n <label>{{ title() }}</label>\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" style=\"cursor: pointer; padding-bottom: 1px; padding-top: 1px;\"\r\n (click)=\"switchCalendar()\">\r\n @if(calendar == 'gregory') {G}\r\n @else{H}\r\n </button>\r\n</div>\r\n\r\n}\r\n<div class=\"input-group flex-nowrap\" #inputDiv>\r\n @if(calendarSwitchPosition() == 'inline'){\r\n <span class=\"input-group-text\" style=\"cursor: pointer;\" (click)=\"switchCalendar()\"> @if(calendar == 'gregory') {G}\r\n @else{H}</span>\r\n }\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"inputDate\" (blur)=\"onManualDateEntered()\"\r\n [disabled]=\"!enabled()\" [placeholder]=\"format()\" (keyup.enter)=\"onManualDateEntered()\">\r\n\r\n\r\n <!-- <button class=\"btn btn-outline-secondary\" type=\"button\" (click)=\"toggleCalendar()\" [disabled]=\"!enabled()\">\r\n <i class=\"bi bi-calendar3\"></i>\r\n </button> -->\r\n <button #calendarButton class=\"btn btn-outline-secondary\" (click)=\"openCalendar()\" [disabled]=\"!enabled()\">\r\n <i class=\"bi bi-calendar3\"></i>\r\n </button>\r\n\r\n</div>\r\n\r\n\r\n@if(isMobile && isOpen){\r\n<div class=\"modal modal-backdrop\" tabindex=\"-1\" role=\"dialog\" style=\"display: block;\" #modalDiv>\r\n <div class=\"modal-dialog modal-dialog-scrollable\" role=\"document\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"btn btn-danger close ms-auto btn-sm\" (click)=\"isOpen = false\">\r\n <i class=\"bi bi-x\"></i>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <flex-dual-calendar (valueChange)=\"onDateSelectedFromCalender($event)\"\r\n [(value)]=\"selectedDate\"></flex-dual-calendar>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n\r\n\r\n<div #calendarDropdown class=\"calendar-dropdown\">\r\n <flex-dual-calendar (valueChange)=\"onDateSelectedFromCalender($event)\"\r\n [(value)]=\"selectedDate\"></flex-dual-calendar>\r\n</div>", styles: [".dropdown-menu{--bs-dropdown-padding-y: 0}.card-body{padding:0!important}.dropdown-panel{position:fixed;border-radius:4px;z-index:9999}.calendar-dropdown{width:max-content;position:absolute;top:0;left:0;visibility:hidden;z-index:\"1080\",}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: FlexDualCalendarComponent, selector: "flex-dual-calendar", inputs: ["value", "minDate", "maxDate", "monthLang", "startMode"], outputs: ["valueChange"] }] });
1407
1561
  }
1408
1562
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: FlexDualDatepickerComponent, decorators: [{
1409
1563
  type: Component,
1410
- args: [{ selector: 'flex-dual-datepicker', imports: [CommonModule, FormsModule, FlexDualCalendarComponent], template: "@if(calendarSwitchPosition() == 'title'){\r\n<div class=\"d-flex align-items-center gap-1\">\r\n <label>{{ title() }}</label>\r\n <button type=\"button\" class=\"btn btn-sm btn-info\" style=\"cursor: pointer; padding-bottom: 1px; padding-top: 1px;\"\r\n (click)=\"switchCalendar()\">\r\n @if(calendar == 'gregory') {G}\r\n @else{H}\r\n </button>\r\n</div>\r\n\r\n}\r\n<div class=\"input-group flex-nowrap\" #inputDiv>\r\n @if(calendarSwitchPosition() == 'inline'){\r\n <span class=\"input-group-text\" style=\"cursor: pointer;\" (click)=\"switchCalendar()\"> @if(calendar == 'gregory') {G}\r\n @else{H}</span>\r\n }\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"inputDate\" (blur)=\"onManualDateEntered()\"\r\n [disabled]=\"!enabled()\" [placeholder]=\"format()\" (keyup.enter)=\"onManualDateEntered()\">\r\n\r\n\r\n <!-- <button class=\"btn btn-outline-secondary\" type=\"button\" (click)=\"toggleCalendar()\" [disabled]=\"!enabled()\">\r\n <i class=\"bi bi-calendar3\"></i>\r\n </button> -->\r\n <button #btn class=\"btn btn-outline-secondary\" (click)=\"toggleMenu()\" [disabled]=\"!enabled()\">\r\n <i class=\"bi bi-calendar3\"></i>\r\n </button>\r\n\r\n</div>\r\n\r\n@if(isOpen){\r\n@if(isMobile){\r\n<div class=\"modal modal-backdrop\" tabindex=\"-1\" role=\"dialog\" style=\"display: block;\" #modalDiv>\r\n <div class=\"modal-dialog modal-dialog-scrollable\" role=\"document\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"btn btn-danger close ms-auto btn-sm\" (click)=\"showCalendar = false\">\r\n <i class=\"bi bi-x\"></i>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n@else{\r\n<div #menu class=\"dropdown-panel\">\r\n <flex-dual-calendar (valueChange)=\"onDateSelectedFromCalender($event)\"\r\n [(value)]=\"selectedDate\"></flex-dual-calendar>\r\n</div>\r\n}\r\n}", styles: [".dropdown-menu{--bs-dropdown-padding-y: 0}.card-body{padding:0!important}.dropdown-panel{position:fixed;border-radius:4px;z-index:9999}\n"] }]
1411
- }], ctorParameters: () => [{ type: DateServiceService }], propDecorators: { inputDiv: [{
1564
+ args: [{ selector: 'flex-dual-datepicker', imports: [CommonModule, FormsModule, FlexDualCalendarComponent], template: "@if(calendarSwitchPosition() == 'title'){\r\n<div class=\"d-flex align-items-center gap-1\">\r\n <label>{{ title() }}</label>\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" style=\"cursor: pointer; padding-bottom: 1px; padding-top: 1px;\"\r\n (click)=\"switchCalendar()\">\r\n @if(calendar == 'gregory') {G}\r\n @else{H}\r\n </button>\r\n</div>\r\n\r\n}\r\n<div class=\"input-group flex-nowrap\" #inputDiv>\r\n @if(calendarSwitchPosition() == 'inline'){\r\n <span class=\"input-group-text\" style=\"cursor: pointer;\" (click)=\"switchCalendar()\"> @if(calendar == 'gregory') {G}\r\n @else{H}</span>\r\n }\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"inputDate\" (blur)=\"onManualDateEntered()\"\r\n [disabled]=\"!enabled()\" [placeholder]=\"format()\" (keyup.enter)=\"onManualDateEntered()\">\r\n\r\n\r\n <!-- <button class=\"btn btn-outline-secondary\" type=\"button\" (click)=\"toggleCalendar()\" [disabled]=\"!enabled()\">\r\n <i class=\"bi bi-calendar3\"></i>\r\n </button> -->\r\n <button #calendarButton class=\"btn btn-outline-secondary\" (click)=\"openCalendar()\" [disabled]=\"!enabled()\">\r\n <i class=\"bi bi-calendar3\"></i>\r\n </button>\r\n\r\n</div>\r\n\r\n\r\n@if(isMobile && isOpen){\r\n<div class=\"modal modal-backdrop\" tabindex=\"-1\" role=\"dialog\" style=\"display: block;\" #modalDiv>\r\n <div class=\"modal-dialog modal-dialog-scrollable\" role=\"document\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"btn btn-danger close ms-auto btn-sm\" (click)=\"isOpen = false\">\r\n <i class=\"bi bi-x\"></i>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <flex-dual-calendar (valueChange)=\"onDateSelectedFromCalender($event)\"\r\n [(value)]=\"selectedDate\"></flex-dual-calendar>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n\r\n\r\n<div #calendarDropdown class=\"calendar-dropdown\">\r\n <flex-dual-calendar (valueChange)=\"onDateSelectedFromCalender($event)\"\r\n [(value)]=\"selectedDate\"></flex-dual-calendar>\r\n</div>", styles: [".dropdown-menu{--bs-dropdown-padding-y: 0}.card-body{padding:0!important}.dropdown-panel{position:fixed;border-radius:4px;z-index:9999}.calendar-dropdown{width:max-content;position:absolute;top:0;left:0;visibility:hidden;z-index:\"1080\",}\n"] }]
1565
+ }], ctorParameters: () => [{ type: DateServiceService }, { type: DeviceDetectorService }, { type: FloatingUiService }], propDecorators: { calendarButton: [{
1566
+ type: ViewChild,
1567
+ args: ['calendarButton']
1568
+ }], calendarDropdown: [{
1569
+ type: ViewChild,
1570
+ args: ['calendarDropdown']
1571
+ }], inputDiv: [{
1412
1572
  type: ViewChild,
1413
1573
  args: ["inputDiv"]
1414
1574
  }], modalDiv: [{
1415
1575
  type: ViewChild,
1416
1576
  args: ["modalDiv"]
1417
- }], popupDiv: [{
1418
- type: ViewChild,
1419
- args: ["menu"]
1420
1577
  }], onDocumentClick: [{
1421
1578
  type: HostListener,
1422
1579
  args: ['document:click', ['$event']]
1423
- }], btnRef: [{
1424
- type: ViewChild,
1425
- args: ['btn']
1426
- }], menuRef: [{
1427
- type: ViewChild,
1428
- args: ['menu']
1429
1580
  }] } });
1430
1581
 
1431
1582
  /*
@@ -1 +1 @@
1
- {"version":3,"file":"dcsl-flex-ui.mjs","sources":["../../../projects/flex-ui-controls/src/lib/flex-panel/flex-panel.component.ts","../../../projects/flex-ui-controls/src/lib/flex-panel/flex-panel.component.html","../../../projects/flex-ui-controls/src/lib/flex-pagination/flex-pagination.component.ts","../../../projects/flex-ui-controls/src/lib/flex-pagination/flex-pagination.component.html","../../../projects/flex-ui-controls/src/lib/flex-grid/flex-grid-column.ts","../../../projects/flex-ui-controls/src/lib/flex-grid/flex-grid-columns.ts","../../../projects/flex-ui-controls/src/lib/flex-grid/flex-grid.component.ts","../../../projects/flex-ui-controls/src/lib/flex-grid/flex-grid.component.html","../../../projects/flex-ui-controls/src/lib/flex-combo-datepicker/flex-combo-datepicker.component.ts","../../../projects/flex-ui-controls/src/lib/flex-combo-datepicker/flex-combo-datepicker.component.html","../../../projects/flex-ui-controls/src/lib/flex-hijri/flex-hijri-calendar/hijri-calendar.component.ts","../../../projects/flex-ui-controls/src/lib/flex-hijri/flex-hijri-calendar/hijri-calendar.component.html","../../../projects/flex-ui-controls/src/lib/services/date-service.service.ts","../../../projects/flex-ui-controls/src/lib/flex-hijri/flex-hijri-datepicker/hijri-datepicker.component.ts","../../../projects/flex-ui-controls/src/lib/flex-hijri/flex-hijri-datepicker/hijri-datepicker.component.html","../../../projects/flex-ui-controls/src/lib/flex-container/flex-container.component.ts","../../../projects/flex-ui-controls/src/lib/flex-container/flex-container.component.html","../../../projects/flex-ui-controls/src/lib/flex-dual-calendar/flex-dual-calendar.component.ts","../../../projects/flex-ui-controls/src/lib/flex-dual-calendar/flex-dual-calendar.component.html","../../../projects/flex-ui-controls/src/lib/flex-dual-datepicker/flex-dual-datepicker.component.ts","../../../projects/flex-ui-controls/src/lib/flex-dual-datepicker/flex-dual-datepicker.component.html","../../../projects/flex-ui-controls/src/public-api.ts","../../../projects/flex-ui-controls/src/dcsl-flex-ui.ts"],"sourcesContent":["import { Component, ElementRef, HostListener, inject, Renderer2, ViewChild } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'flex-panel',\r\n imports: [],\r\n templateUrl: './flex-panel.component.html',\r\n styleUrl: './flex-panel.component.css'\r\n})\r\n\r\nexport class FlexPanelComponent {\r\n private resizeObserver?: ResizeObserver;\r\n private mutationObserver?: MutationObserver;\r\n\r\n @ViewChild(\"abc\") comp?: ElementRef<HTMLDivElement>;\r\n\r\n private renderer = inject(Renderer2);\r\n\r\n constructor() { }\r\n\r\n ngAfterViewInit() {\r\n this.adjustHeight();\r\n\r\n // ✅ Recalculate on window resize\r\n if ('ResizeObserver' in window) {\r\n this.resizeObserver = new ResizeObserver(() => this.adjustHeight());\r\n this.resizeObserver.observe(document.body);\r\n }\r\n\r\n // ✅ Also observe DOM changes that may shift this element\r\n this.mutationObserver = new MutationObserver(() => this.adjustHeight());\r\n this.mutationObserver.observe(document.body, {\r\n attributes: true,\r\n childList: true,\r\n subtree: true\r\n });\r\n\r\n\r\n }\r\n\r\n @HostListener('window:resize')\r\n onWindowResize() {\r\n this.adjustHeight();\r\n }\r\n\r\n private adjustHeight() {\r\n // const host: HTMLElement = this.el.nativeElement;\r\n const top = this.comp!.nativeElement.getBoundingClientRect().top;\r\n const viewportHeight = window.innerHeight;\r\n const newHeight = viewportHeight - top;\r\n\r\n this.renderer.setStyle(this.comp?.nativeElement, 'height', `${newHeight}px`);\r\n this.renderer.setStyle(this.comp?.nativeElement, 'width', '100%');\r\n\r\n // console.log(host);\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n }\r\n if (this.mutationObserver) {\r\n this.mutationObserver.disconnect();\r\n }\r\n }\r\n}\r\n","<div class=\"stretch-container\" #abc>\r\n <ng-content></ng-content>\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, Output, EventEmitter, HostListener, OnInit, input, effect } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FlexPaging } from './flex_page';\r\n\r\n@Component({\r\n selector: 'flex-pagination',\r\n templateUrl: './flex-pagination.component.html',\r\n styleUrls: ['./flex-pagination.component.css'],\r\n imports: [CommonModule, FormsModule]\r\n})\r\nexport class FlexPaginationComponent implements OnInit {\r\n rowCount = input<number>(0);\r\n\r\n protected _totalItems: number = 0;\r\n pageSize = 50;\r\n currentPage = 1;\r\n @Output() pageChange = new EventEmitter<FlexPaging>();\r\n\r\n maxPagesToShow = 5;\r\n pageSizes = [50, 100, 200, 500];\r\n\r\n constructor() {\r\n effect(() => {\r\n this.currentPage = 1;\r\n this._totalItems = this.rowCount();\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.updateMaxPages();\r\n }\r\n\r\n // Update maxPagesToShow based on screen size\r\n @HostListener('window:resize')\r\n updateMaxPages() {\r\n const width = window.innerWidth;\r\n if (width < 576) {\r\n this.maxPagesToShow = 1; // only current page\r\n } else if (width < 768) {\r\n this.maxPagesToShow = 3;\r\n } else {\r\n this.maxPagesToShow = 5;\r\n }\r\n }\r\n\r\n\r\n get totalPages(): number {\r\n return Math.ceil(this._totalItems / this.pageSize) || 1;\r\n }\r\n\r\n get pages(): (number | string)[] {\r\n const total = this.totalPages;\r\n const max = this.maxPagesToShow;\r\n\r\n if (max === 1) {\r\n return [this.currentPage]; // mobile: only current page\r\n }\r\n\r\n const pages: (number | string)[] = [];\r\n\r\n if (total <= max) {\r\n for (let i = 1; i <= total; i++) pages.push(i);\r\n } else {\r\n let start = Math.max(this.currentPage - Math.floor(max / 2), 1);\r\n let end = start + max - 1;\r\n\r\n if (end > total) {\r\n end = total;\r\n start = end - max + 1;\r\n }\r\n\r\n if (start > 1) pages.push(1, '...');\r\n for (let i = start; i <= end; i++) pages.push(i);\r\n if (end < total) pages.push('...', total);\r\n }\r\n\r\n return pages;\r\n }\r\n\r\n changePage(page: number | string) {\r\n if (typeof page !== 'number') return;\r\n if (page < 1) page = 1;\r\n if (page > this.totalPages) page = this.totalPages;\r\n if (page === this.currentPage) return;\r\n\r\n this.currentPage = page;\r\n this.pageChange.emit({\r\n skip: (this.currentPage - 1) * this.pageSize,\r\n take: this.pageSize,\r\n pageSize: this.pageSize,\r\n currentPage: this.currentPage,\r\n });\r\n }\r\n\r\n onPageSizeChange(pageSize: any) {\r\n var value = Number(pageSize.target.value);\r\n if (isNaN(value) || value <= 0) return;\r\n\r\n this.pageSize = value;\r\n this.pageChange.emit({\r\n skip: (this.currentPage - 1) * this.pageSize,\r\n take: this.pageSize,\r\n pageSize: this.pageSize,\r\n currentPage: this.currentPage\r\n });\r\n }\r\n\r\n firstPage() { this.changePage(1); }\r\n lastPage() { this.changePage(this.totalPages); }\r\n prevPage() { this.changePage(this.currentPage - 1); }\r\n nextPage() { this.changePage(this.currentPage + 1); }\r\n}\r\n","<div class=\"d-flex justify-content-start align-items-center\">\r\n <!-- Pagination -->\r\n <div class=\"overflow-auto\">\r\n <ul class=\"pagination justify-content-center flex-nowrap mb-0\">\r\n <!-- First / Prev (hide First on xs) -->\r\n <li class=\"page-item d-none d-sm-block\" [class.disabled]=\"currentPage === 1\">\r\n <button class=\"page-link\" (click)=\"firstPage()\"><i class=\"bi bi-chevron-double-left\"></i></button>\r\n </li>\r\n <li class=\"page-item\" [class.disabled]=\"currentPage === 1\">\r\n <button class=\"page-link\" (click)=\"prevPage()\"><i class=\"bi bi-chevron-left\"></i></button>\r\n </li>\r\n\r\n <!-- Page numbers -->\r\n <li class=\"page-item\" *ngFor=\"let page of pages\" [class.active]=\"page === currentPage\"\r\n [class.disabled]=\"page === '...'\">\r\n <button class=\"page-link\" [disabled]=\"page === '...'\" (click)=\"changePage(page)\">\r\n {{ page }}\r\n </button>\r\n </li>\r\n\r\n <!-- Next / Last (hide Last on xs) -->\r\n <li class=\"page-item\" [class.disabled]=\"currentPage === totalPages\">\r\n <button class=\"page-link\" (click)=\"nextPage()\"><i class=\"bi bi-chevron-right\"></i></button>\r\n </li>\r\n <li class=\"page-item d-none d-sm-block\" [class.disabled]=\"currentPage === totalPages\">\r\n <button class=\"page-link\" (click)=\"lastPage()\"><i class=\"bi bi-chevron-double-right\"></i></button>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <!-- Page Size Dropdown -->\r\n <div class=\"ms-2\">\r\n <label class=\"me-2\">{{ \"page-size\" }}</label>\r\n <select class=\"form-select d-inline-block w-auto\" [(ngModel)]=\"pageSize\" (change)=\"onPageSizeChange($event)\">\r\n <option *ngFor=\"let size of pageSizes\" [value]=\"size\">{{ size }}</option>\r\n </select>\r\n </div>\r\n <div class=\"total-count ms-2\">\r\n {{ \"total-count\" }}: {{ _totalItems }}\r\n </div>\r\n</div>","// grid-column.component.ts\r\nimport { Component, ContentChild, TemplateRef, Input, input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'flex-grid-column',\r\n template: ''\r\n})\r\n\r\nexport class FlexColumnComponent {\r\n headerText = input<string>('');\r\n\r\n @Input() field!: string;\r\n @Input() width: any = 120;\r\n\r\n @ContentChild('headerTemplate') headerTemplate!: TemplateRef<any>;\r\n @ContentChild('cellTemplate') cellTemplate!: TemplateRef<any>;\r\n\r\n\r\n}\r\n","// grid-columns.component.ts\r\nimport { Component, ContentChildren, QueryList } from '@angular/core';\r\nimport { FlexColumnComponent } from './flex-grid-column';\r\n\r\n@Component({\r\n selector: 'flex-grid-columns',\r\n template: ''\r\n})\r\nexport class FlexColumnsComponent {\r\n @ContentChildren(FlexColumnComponent) columns!: QueryList<FlexColumnComponent>;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { AfterViewInit, Component, ContentChild, effect, ElementRef, Input, input, output, TemplateRef, ViewChild } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FlexPaginationComponent } from \"../flex-pagination/flex-pagination.component\";\r\nimport { FlexColumnsComponent } from './flex-grid-columns';\r\nimport { FlexPaging } from '../flex-pagination/flex_page';\r\n\r\n@Component({\r\n selector: 'flex-grid',\r\n imports: [CommonModule, FormsModule, FlexPaginationComponent],\r\n templateUrl: './flex-grid.component.html',\r\n styleUrl: './flex-grid.component.css'\r\n})\r\n\r\nexport class FlexGridComponent implements AfterViewInit {\r\n\r\n\r\n enablePaging = input<boolean>(false);\r\n totalDataCount = input<number>(0);\r\n\r\n tableClass = input<string>('');\r\n\r\n @Input() dataSource: any[] = [];\r\n\r\n // @ContentChildren(GridColumnComponent) columns!: QueryList<GridColumnComponent>;\r\n @ContentChild(FlexColumnsComponent) gridColumns?: FlexColumnsComponent;\r\n\r\n rowClicked = output<{ index: number, data: any }>();\r\n rowDblClicked = output<{ index: number, data: any }>();\r\n\r\n // Optional: custom template when no data\r\n @Input() emptyRecordTemplate?: TemplateRef<any>;\r\n\r\n isPagingEnabled: boolean = false;\r\n\r\n @ViewChild('gridHeader') gridHeader!: ElementRef;\r\n\r\n @ViewChild('gridBody') gridBody!: ElementRef;\r\n\r\n selectedIndex: number = -1;\r\n protected _totalDataCount: number = 0;\r\n protected _tableClass: string = \"\";\r\n\r\n pageChange = output<{ skip: number, take: number }>();\r\n currentPage: number = 1;\r\n pageSize: number = 50;\r\n\r\n constructor() {\r\n effect(() => {\r\n this.isPagingEnabled = this.enablePaging();\r\n });\r\n\r\n effect(() => {\r\n this._totalDataCount = this.totalDataCount();\r\n });\r\n\r\n effect(() => {\r\n this._tableClass = this.tableClass();\r\n });\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.syncColumnWidths();\r\n }\r\n\r\n check() {\r\n console.log(this.gridColumns);\r\n console.log(this.dataSource);\r\n }\r\n\r\n syncScroll(e: Event) {\r\n const body = e.target as HTMLElement;\r\n const header = this.gridHeader?.nativeElement; //document.querySelector('.grid-header');\r\n if (header) (header as HTMLElement).scrollLeft = body.scrollLeft;\r\n }\r\n\r\n syncColumnWidths() {\r\n // const headerCols = this.gridHeader.nativeElement.querySelectorAll('th');\r\n // const bodyCols = this.gridBody.nativeElement.querySelectorAll('tr:first-child td');\r\n\r\n // bodyCols.forEach((td: HTMLElement, i: number) => {\r\n // const width = td.getBoundingClientRect().width;\r\n // (headerCols[i] as HTMLElement).style.width = width + 'px';\r\n // });\r\n }\r\n\r\n // syncColumnWidths() {\r\n // const headerCols = document.querySelectorAll('.grid-header th');\r\n // const bodyCols = this.gridBody.nativeElement.querySelectorAll('tbody tr:first-child td');\r\n\r\n // bodyCols.forEach((col: HTMLElement, i: number) => {\r\n // const width = col.getBoundingClientRect().width;\r\n // (headerCols[i] as HTMLElement).style.width = width + 'px';\r\n // });\r\n // }\r\n\r\n onRowDblClick(index: number, data: any) {\r\n this.selectedIndex = index;\r\n // console.log(index);\r\n\r\n this.rowDblClicked.emit({ index: index, data: data });\r\n }\r\n\r\n onRowClick(index: number, data: any) {\r\n this.selectedIndex = index;\r\n // console.log(index);\r\n\r\n this.rowClicked.emit({ index: index, data: data });\r\n }\r\n\r\n onPageChanged(event: FlexPaging) {\r\n console.log(event);\r\n this.currentPage = event.currentPage;\r\n this.pageSize = event.pageSize;\r\n\r\n this.pageChange.emit(event);\r\n\r\n\r\n }\r\n\r\n}\r\n","<div class=\"grid-container\">\r\n <!-- Header row in its own div -->\r\n <div class=\"grid-scroll\">\r\n <div class=\"grid-container-sub\">\r\n <div class=\"grid-header\" #gridHeader>\r\n <table class=\"grid-table table table-bordered table-sm mb-0 header-table\">\r\n <colgroup>\r\n @for (col of gridColumns?.columns; track $index) {\r\n <col [style.width.px]=\"col.width\" [style.maxWidth.px]=\"col.width\">\r\n }\r\n </colgroup>\r\n <thead>\r\n <tr>\r\n @for (col of gridColumns?.columns; track $index) {\r\n <th class=\"text-truncate\">\r\n @if (col.headerTemplate) {\r\n <ng-container [ngTemplateOutlet]=\"col.headerTemplate\"></ng-container>\r\n }\r\n @else {\r\n <!-- <ng-template #defaultHeader><span [textContent]=\"col.field\"></span></ng-template> -->\r\n <!-- <span [textContent]=\"col.field\"></span> -->\r\n {{ col.headerText() }}\r\n }\r\n </th>\r\n }\r\n\r\n <!-- <th style=\"width: 20px;\"></th> -->\r\n </tr>\r\n </thead>\r\n\r\n </table>\r\n </div>\r\n <!-- Scrollable body in another div -->\r\n <div #gridBody class=\"grid-body\" (scroll)=\"syncScroll($event)\">\r\n @if(dataSource.length > 0){\r\n <table class=\"grid-table table table-bordered table-sm table-hover mb-0\" [ngClass]=\"_tableClass\">\r\n\r\n <colgroup>\r\n @for (col of gridColumns?.columns; track $index) {\r\n <col [style.width.px]=\"col.width\" [style.maxWidth.px]=\"col.width\">\r\n }\r\n </colgroup>\r\n <tbody>\r\n @for (row of dataSource; track $index; let i = $index) {\r\n <tr [class.table-active]=\"$index === selectedIndex\" (click)=\"onRowClick($index, row)\"\r\n (dblclick)=\"onRowDblClick($index, row)\">\r\n @for (col of gridColumns?.columns; track $index) {\r\n <td>\r\n @if (col.cellTemplate) {\r\n <ng-container [ngTemplateOutlet]=\"col.cellTemplate\" [ngTemplateOutletContext]=\"{ $implicit: row,\r\n rowIndex: (currentPage - 1) * pageSize + i,\r\n localIndex: i }\">\r\n </ng-container>\r\n } @else {\r\n <!-- {{ row[col.field] }} -->\r\n <span [textContent]=\"row[col.field]\"></span>\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n @else {\r\n No records found\r\n }\r\n\r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n @if(isPagingEnabled){\r\n <!-- Footer -->\r\n <div class=\"grid-footer\">\r\n <flex-pagination [rowCount]=\"_totalDataCount\" (pageChange)=\"onPageChanged($event)\"></flex-pagination>\r\n </div>\r\n }\r\n\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, Output, EventEmitter, OnInit, model, effect, input, output } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\ninterface DateOption {\r\n value: number | '';\r\n name: string;\r\n disabled?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'flex-combo-datepicker',\r\n imports: [FormsModule, CommonModule],\r\n templateUrl: './flex-combo-datepicker.component.html',\r\n styleUrls: ['./flex-combo-datepicker.component.css']\r\n})\r\n\r\nexport class ComboDatePickerComponent implements OnInit {\r\n // @Input() value: any = null; // ISO string\r\n @Input() ngMinDate?: string; // ISO string\r\n @Input() ngMaxDate?: string;\r\n @Input() ngMonths?: string[]; // optional month names\r\n @Input() ngOrder: 'dmy' | 'mdy' | 'ymd' = 'dmy';\r\n @Input() ngDisabled: boolean = false;\r\n @Input() ngPlaceholder: string | string[] = 'Day,Month,Year';\r\n\r\n dateChanged = output<any>();\r\n\r\n disabled = input<boolean>(false);\r\n\r\n value = model<any>();\r\n _value: any;\r\n\r\n day: number | '' = '';\r\n month: number | '' = '';\r\n year: number | '' = '';\r\n\r\n dates: DateOption[] = [];\r\n months: DateOption[] = [];\r\n years: DateOption[] = [];\r\n\r\n placeHolders: DateOption[] = [];\r\n\r\n cssClass = input<string>();\r\n\r\n showHeader = input<boolean>(true);\r\n dateTitle = input<string>();\r\n monthTitle = input<string>();\r\n yearTitle = input<string>();\r\n\r\n constructor() {\r\n effect(() => {\r\n this._value = this.value();\r\n this.initModel();\r\n this.updateDates();\r\n })\r\n }\r\n\r\n ngOnInit() {\r\n this.initPlaceholders();\r\n this.initMonths();\r\n this.initYears();\r\n // this.initModel();\r\n // this.updateDates();\r\n }\r\n\r\n private initPlaceholders() {\r\n let holders = Array.isArray(this.ngPlaceholder) ? this.ngPlaceholder : this.ngPlaceholder.split(',');\r\n if (holders.length === 3) {\r\n this.placeHolders = holders.map(h => ({ value: '', name: h, disabled: false }));\r\n }\r\n }\r\n\r\n private initMonths() {\r\n const monthNames = this.ngMonths && this.ngMonths.length === 12 ? this.ngMonths : ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'];\r\n this.months = monthNames.map((name, i) => ({ value: i + 1, name }));\r\n if (this.placeHolders.length) this.months.unshift(this.placeHolders[1]);\r\n }\r\n\r\n private initYears() {\r\n const currentYear = new Date().getFullYear();\r\n const minYear = this.ngMinDate ? new Date(this.ngMinDate).getFullYear() : currentYear - 100;\r\n const maxYear = this.ngMaxDate ? new Date(this.ngMaxDate).getFullYear() : currentYear;\r\n this.years = [];\r\n for (let y = minYear; y <= maxYear; y++) {\r\n this.years.push({ value: y, name: y.toString() });\r\n }\r\n if (this.placeHolders.length) this.years.unshift(this.placeHolders[2]);\r\n }\r\n\r\n private initModel() {\r\n if (this.value) {\r\n const date = new Date(this.value());\r\n this.day = date.getDate();\r\n this.month = date.getMonth() + 1;\r\n this.year = date.getFullYear();\r\n }\r\n }\r\n\r\n private updateDates() {\r\n const max = this.month && this.year ? this.getMaxDate(this.month, this.year) : 31;\r\n this.dates = [];\r\n if (this.placeHolders.length) this.dates.push(this.placeHolders[0]);\r\n for (let i = 1; i <= max; i++) {\r\n this.dates.push({ value: i, name: i.toString() });\r\n }\r\n }\r\n\r\n private getMaxDate(month: number, year: number) {\r\n if ([4, 6, 9, 11].includes(month)) return 30;\r\n if (month === 2) return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0) ? 29 : 28;\r\n return 31;\r\n }\r\n\r\n onChange() {\r\n this.updateDates();\r\n if (this.day && this.month && this.year) {\r\n const iso = this.toLocalISOString(new Date(this.year, this.month - 1, this.day));\r\n this.value.set(iso);\r\n this.dateChanged.emit(iso);\r\n }\r\n }\r\n\r\n toLocalISOString(date: Date): string {\r\n const pad = (n: number) => n.toString().padStart(2, '0');\r\n\r\n const year = date.getFullYear();\r\n const month = pad(date.getMonth() + 1);\r\n const day = pad(date.getDate());\r\n const hours = pad(date.getHours());\r\n const minutes = pad(date.getMinutes());\r\n const seconds = pad(date.getSeconds());\r\n //const ms = date.getMilliseconds().toString().padStart(3, '0');\r\n\r\n //return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}.${ms}`;\r\n return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`;\r\n }\r\n}\r\n","<div class=\"row g-1\">\r\n <div class=\"col-4\">\r\n @if(showHeader()){\r\n <label>\r\n @if (dateTitle()) {\r\n {{ dateTitle() }}\r\n }\r\n @else {\r\n Date\r\n }\r\n </label>\r\n }\r\n <select [(ngModel)]=\"day\" (ngModelChange)=\"onChange()\" [disabled]=\"ngDisabled\"\r\n [class]=\"'form-select ' + cssClass()\">\r\n <option *ngFor=\"let d of dates\" [value]=\"d.value\">{{ d.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-4\">\r\n @if(showHeader()){\r\n <label>\r\n @if (monthTitle()) {\r\n {{ monthTitle() }}\r\n }\r\n @else {\r\n Month\r\n }\r\n </label>\r\n }\r\n <select [(ngModel)]=\"month\" (ngModelChange)=\"onChange()\" [disabled]=\"ngDisabled\"\r\n [class]=\"'form-select ' + cssClass()\">\r\n <option *ngFor=\"let m of months\" [value]=\"m.value\">{{ m.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-4\">\r\n @if(showHeader()){\r\n <label>\r\n @if (yearTitle()) {\r\n {{ yearTitle() }}\r\n }\r\n @else {\r\n Year\r\n }\r\n </label>\r\n }\r\n <select [(ngModel)]=\"year\" (ngModelChange)=\"onChange()\" [disabled]=\"ngDisabled\"\r\n [class]=\"'form-select year ' + cssClass()\">\r\n <option *ngFor=\"let y of years\" [value]=\"y.value\">{{ y.name }}</option>\r\n </select>\r\n </div>\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nexport type HijriDate = { hy: number; hm: number; hd: number };\r\ntype DayCell = {\r\n g: Date;\r\n h: HijriDate;\r\n inCurrentMonth: boolean;\r\n disabled: boolean;\r\n};\r\n\r\n//\r\n// ✅ Umm al-Qura Hijri calendar with Latin digits\r\n//\r\nconst hijriFmt = new Intl.DateTimeFormat('en-u-ca-islamic-umalqura-nu-latn', {\r\n day: 'numeric',\r\n month: 'numeric',\r\n year: 'numeric'\r\n});\r\n\r\nconst hijriMonthNamesEn = [\r\n 'Muharram', 'Safar', 'Rabi I', 'Rabi II',\r\n 'Jumada I', 'Jumada II', 'Rajab', 'Sha’ban',\r\n 'Ramadan', 'Shawwal', 'Dhu al-Qi’dah', 'Dhu al-Hijjah'\r\n];\r\n\r\nconst hijriMonthNamesAr = [\r\n 'محرم', 'صفر', 'ربيع الأول', 'ربيع الآخر',\r\n 'جمادى الأولى', 'جمادى الآخرة', 'رجب', 'شعبان',\r\n 'رمضان', 'شوال', 'ذو القعدة', 'ذو الحجة'\r\n];\r\n\r\nconst weekDaysEn = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\r\nconst weekDaysAr = ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'];\r\n\r\nfunction hijriFromGregorian(g: Date): HijriDate {\r\n const parts = hijriFmt.formatToParts(g);\r\n //console.log(parts);\r\n const map: Record<string, string> = {};\r\n for (const p of parts) map[p.type] = p.value;\r\n const n = (k: string) => parseInt(map[k] ?? '0', 10);\r\n return { hy: n('year'), hm: n('month'), hd: n('day') };\r\n}\r\n\r\nfunction compareHijri(a: HijriDate, b: HijriDate) {\r\n if (a.hy !== b.hy) return a.hy - b.hy;\r\n if (a.hm !== b.hm) return a.hm - b.hm;\r\n return a.hd - b.hd;\r\n}\r\n\r\nfunction findGregorianForHijri(target: HijriDate): Date {\r\n let lo = new Date(1937, 0, 1).getTime();\r\n let hi = new Date(2076, 11, 31).getTime();\r\n const dayMs = 86400000;\r\n\r\n while (lo <= hi) {\r\n const mid = Math.floor((lo + hi) / 2);\r\n const h = hijriFromGregorian(new Date(mid));\r\n compareHijri(h, target) < 0 ? (lo = mid + dayMs) : (hi = mid - dayMs);\r\n }\r\n\r\n let d = new Date(lo);\r\n while (true) {\r\n const h = hijriFromGregorian(d);\r\n const cmp = compareHijri(h, target);\r\n if (cmp === 0) return d;\r\n if (cmp > 0) throw new Error('Hijri date out of supported range');\r\n d = new Date(d.getTime() + dayMs);\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'app-hijri-calendar',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: \"./hijri-calendar.component.html\",\r\n styleUrl: \"./hijri-calendar.component.css\"\r\n})\r\n\r\nexport class HijriCalendarComponent {\r\n /** Two-way bound selected date (Gregorian Date) */\r\n @Input() value: Date | null = null;\r\n @Output() valueChange = new EventEmitter<Date>();\r\n\r\n /** Optional min/max restrictions (Gregorian dates) */\r\n @Input() minDate: Date | null = null;\r\n @Input() maxDate: Date | null = null;\r\n\r\n /** Month + weekday language: 'en' or 'ar' */\r\n @Input() monthLang: 'en' | 'ar' = 'ar';\r\n\r\n hy = signal<number>(0);\r\n hm = signal<number>(0);\r\n\r\n selectedMonth = 1;\r\n selectedYear = 1447;\r\n yearRange: number[] = [];\r\n\r\n get hijriMonthsEn() {\r\n return hijriMonthNamesEn;\r\n }\r\n\r\n get hijriMonthsAr() {\r\n return hijriMonthNamesAr;\r\n }\r\n\r\n get hijriMonths() {\r\n return this.monthLang === 'ar' ? hijriMonthNamesAr : hijriMonthNamesEn;\r\n }\r\n\r\n get weekDays() {\r\n return this.monthLang === 'ar' ? weekDaysAr : weekDaysEn;\r\n }\r\n\r\n get weekDaysEn() {\r\n return weekDaysEn;\r\n }\r\n\r\n get weekDaysAr() {\r\n return weekDaysAr;\r\n }\r\n\r\n get currentMonthName() {\r\n return this.hijriMonths[this.selectedMonth - 1];\r\n }\r\n\r\n constructor() {\r\n const h = hijriFromGregorian(new Date());\r\n this.hy.set(h.hy);\r\n this.hm.set(h.hm);\r\n this.selectedYear = h.hy;\r\n this.selectedMonth = h.hm;\r\n }\r\n\r\n ngOnInit() {\r\n this.buildYearRange();\r\n }\r\n\r\n ngOnChanges() {\r\n if (this.value) {\r\n const h = hijriFromGregorian(this.value);\r\n this.hy.set(h.hy);\r\n this.hm.set(h.hm);\r\n this.selectedYear = h.hy;\r\n this.selectedMonth = h.hm;\r\n }\r\n this.buildYearRange();\r\n }\r\n\r\n buildYearRange() {\r\n const minH = this.minDate ? hijriFromGregorian(this.minDate) : { hy: 1356, hm: 1, hd: 1 };\r\n const maxH = this.maxDate ? hijriFromGregorian(this.maxDate) : { hy: 1499, hm: 12, hd: 30 };\r\n this.yearRange = [];\r\n for (let y = minH.hy; y <= maxH.hy; y++) {\r\n this.yearRange.push(y);\r\n }\r\n }\r\n\r\n onMonthYearChange() {\r\n this.hy.set(this.selectedYear);\r\n this.hm.set(this.selectedMonth);\r\n }\r\n\r\n firstOfMonth() {\r\n return findGregorianForHijri({ hy: this.hy(), hm: this.hm(), hd: 1 });\r\n }\r\n\r\n cells(): DayCell[] {\r\n const firstG = this.firstOfMonth();\r\n const firstH = hijriFromGregorian(firstG);\r\n\r\n const start = new Date(firstG);\r\n start.setDate(firstG.getDate() - firstG.getDay());\r\n\r\n const result: DayCell[] = [];\r\n for (let i = 0; i < 42; i++) {\r\n const g = new Date(start);\r\n g.setDate(start.getDate() + i);\r\n const h = hijriFromGregorian(g);\r\n\r\n let disabled = false;\r\n if (this.minDate && g < this.stripTime(this.minDate)) disabled = true;\r\n if (this.maxDate && g > this.stripTime(this.maxDate)) disabled = true;\r\n\r\n result.push({\r\n g,\r\n h,\r\n inCurrentMonth: h.hy === firstH.hy && h.hm === firstH.hm,\r\n disabled\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n prevMonth() {\r\n if (!this.canPrev()) return;\r\n let m = this.hm(), y = this.hy();\r\n if (--m < 1) { m = 12; y--; }\r\n this.hm.set(m); this.hy.set(y);\r\n this.selectedYear = y;\r\n this.selectedMonth = m;\r\n }\r\n\r\n nextMonth() {\r\n if (!this.canNext()) return;\r\n let m = this.hm(), y = this.hy();\r\n if (++m > 12) { m = 1; y++; }\r\n this.hm.set(m); this.hy.set(y);\r\n this.selectedYear = y;\r\n this.selectedMonth = m;\r\n }\r\n\r\n canPrev(): boolean {\r\n if (!this.minDate) return true;\r\n const minH = hijriFromGregorian(this.stripTime(this.minDate));\r\n return this.hy() > minH.hy || (this.hy() === minH.hy && this.hm() > minH.hm);\r\n }\r\n\r\n canNext(): boolean {\r\n if (!this.maxDate) return true;\r\n const maxH = hijriFromGregorian(this.stripTime(this.maxDate));\r\n return this.hy() < maxH.hy || (this.hy() === maxH.hy && this.hm() < maxH.hm);\r\n }\r\n\r\n isToday(g: Date) {\r\n const t = new Date();\r\n return g.getFullYear() === t.getFullYear()\r\n && g.getMonth() === t.getMonth()\r\n && g.getDate() === t.getDate();\r\n }\r\n\r\n isSelected(g: Date) {\r\n return !!this.value &&\r\n g.getFullYear() === this.value.getFullYear() &&\r\n g.getMonth() === this.value.getMonth() &&\r\n g.getDate() === this.value.getDate();\r\n }\r\n\r\n select(c: DayCell) {\r\n if (c.disabled) return;\r\n\r\n //console.log(c);\r\n\r\n this.value = c.g;\r\n this.valueChange.emit(this.value);\r\n }\r\n\r\n private stripTime(d: Date): Date {\r\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\r\n }\r\n}\r\n","<div class=\"card border-0 p-0\">\r\n <div class=\"card-header p-1\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <button class=\"btn btn-sm\" (click)=\"prevMonth()\" [disabled]=\"!canPrev()\">&laquo;</button>\r\n <div class=\"d-flex justify-content-center gap-1\">\r\n <select class=\"form-select form-select-sm w-auto\" [(ngModel)]=\"selectedMonth\"\r\n (change)=\"onMonthYearChange()\">\r\n @for (m of hijriMonths; track $index) {\r\n <option [value]=\"$index + 1\">{{ hijriMonthsAr[$index] }} ({{ hijriMonthsEn[$index] }})</option>\r\n }\r\n </select>\r\n <select class=\"form-select form-select-sm w-auto\" [(ngModel)]=\"selectedYear\"\r\n (change)=\"onMonthYearChange()\">\r\n @for (y of yearRange; track y) {\r\n <option [value]=\"y\">{{ y }}</option>\r\n }\r\n </select>\r\n </div>\r\n <button class=\"btn btn-sm\" (click)=\"nextMonth()\" [disabled]=\"!canNext()\">&raquo;</button>\r\n </div>\r\n </div>\r\n <div class=\"card-body p-1\">\r\n\r\n\r\n <!-- month/year pickers -->\r\n\r\n\r\n <!-- weekday labels -->\r\n <div class=\"grid\">\r\n @for (w of weekDays; track $index) {\r\n <div class=\"col fw-bold border pb-1\">{{ w }}</div>\r\n }\r\n\r\n </div>\r\n\r\n <!-- calendar cells -->\r\n <div class=\"grid\">\r\n <button *ngFor=\"let c of cells()\" class=\"cell btn rounded-0\" [class.muted]=\"!c.inCurrentMonth\"\r\n [class.today]=\"isToday(c.g)\" [class.selected]=\"isSelected(c.g)\" [disabled]=\"c.disabled\"\r\n (click)=\"select(c)\">\r\n {{ c.h.hd }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>","import { Injectable } from '@angular/core';\r\nimport dayjs from 'dayjs';\r\nimport calendarSystems, { CalendarSystem } from '@calidy/dayjs-calendarsystems';\r\nimport PersianCalendarSystem from '@calidy/dayjs-calendarsystems/calendarSystems/PersianCalendarSystem';\r\nimport HijriCalendarSystem from '@calidy/dayjs-calendarsystems/calendarSystems/HijriCalendarSystem';\r\nimport customParseFormat from 'dayjs/plugin/customParseFormat';\r\nimport { FlexCalendarSystem } from '../core/types/flex-calendar-system.type';\r\n\r\n// Extend Day.js with calendar systems support\r\ndayjs.extend(calendarSystems);\r\ndayjs.extend(customParseFormat);\r\n\r\n// Register the Persian calendar\r\ndayjs.registerCalendarSystem('persian', new PersianCalendarSystem());\r\n\r\ndayjs.registerCalendarSystem('islamic', new HijriCalendarSystem());\r\n\r\n\r\n\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DateServiceService {\r\n\r\n\r\n\r\n\r\n log(date: Date) {\r\n //var dj = dayjs(date);\r\n // // Convert current date to Persian calendar\r\n // const persianDate = dj.toCalendarSystem('persian');\r\n // console.log(persianDate.format('YYYY-MM-DD')); // Example: \"1403-08-15\"\r\n\r\n // // Create a date from Persian calendar\r\n // const nowruz = dayjs.fromCalendarSystem('persian', 1403, 1, 1);\r\n // console.log(nowruz.format('YYYY-MM-DD')); // \"2024-03-20\"\r\n\r\n\r\n\r\n // const hijriDate = dj.toCalendarSystem('islamic');\r\n // console.log(hijriDate.format('YYYY-MM-DD')); // e.g., \"1446-03-15\"\r\n\r\n //Step 1: User will input gregorian or islamic(hijri) date. for this we will use customParseFormat\r\n //in the control we will specify the format using binding.\r\n const d = dayjs(\"18-05-1447\", \"DD-MM-YYYY\");\r\n //we are writing this to parse the date , month, year only.\r\n //then based on the calender type we will decide.\r\n //but by default system will take gregorian\r\n const customDate = dayjs.fromCalendarSystem('islamic', d.year(), d.month() + 1, d.date() as number);\r\n //here we are assuming the control want to handle islamic calender date, we will take it dynmically.\r\n console.log(\"Prased Date in Gregorian String as per format ['DD-MM-YYYY']:\", customDate.format('DD-MM-YYYY'));\r\n //here it will show gregorian calender, because even if we parse using islamic calender, it will convert the date\r\n //and keep it to gregorian\r\n //to show islamic date, we have to tell the dayjs to use islamic calender\r\n console.log(\"Hijri Date String: \", customDate.toCalendarSystem('islamic').format('YYYY-MM-DD'));\r\n\r\n // console.log(d.format(\"DD/MM/YYYY\"));\r\n // console.log(d.date());\r\n // console.log(d.month() + 1);\r\n // console.log(d.year());\r\n // console.log(d.toDate());\r\n\r\n // const d2 = dayjs(\"09-11-2025\", \"DD-MM-YYYY\");\r\n // console.log(d2.format(\"DD/MM/YYYY\"));\r\n // console.log(d2.date());\r\n // console.log(d2.month() + 1);\r\n // console.log(d2.year());\r\n // console.log(d2.toDate());\r\n\r\n // // Create a Day.js instance from a specific calendar system\r\n // const hijriCustomDate = dayjs.fromCalendarSystem('islamic', 1447, 5, 18);\r\n // console.log(hijriCustomDate.toString());\r\n\r\n // // The result is a standard Day.js instance in that calendar system\r\n // console.log(hijriCustomDate.toCalendarSystem('islamic').format('YYYY-MM-DD')); // In Persian: \"1403-01-01\"\r\n\r\n // // Convert to Gregorian to see the equivalent date\r\n // const gregorian = hijriCustomDate.toCalendarSystem('gregory');\r\n // console.log(gregorian.format('YYYY-MM-DD')); // \"2024-03-20\"\r\n\r\n }\r\n\r\n parse(dateString: string, calendar: FlexCalendarSystem, format: string): Date | null | undefined {\r\n //Step 1: User will input gregorian or islamic(hijri) date. for this we will use customParseFormat\r\n //in the control we will specify the format using binding.\r\n const d = dayjs(dateString, format);\r\n if (!d.isValid()) {\r\n\r\n console.log(dateString, calendar, format, \"is invalid\");\r\n return null;\r\n }\r\n //we are writing this to parse the date , month, year only.\r\n //then based on the calender type we will decide.\r\n //but by default system will take gregorian\r\n const customDate = dayjs.fromCalendarSystem(calendar, d.year(), d.month() + 1, d.date() as number);\r\n //here we are assuming the control want to handle islamic calender date, we will take it dynmically.\r\n console.log(\"Prased Date in Gregorian String as per format ['DD-MM-YYYY']:\", customDate.format('DD-MM-YYYY'));\r\n //here it will show gregorian calender, because even if we parse using islamic calender, it will convert the date\r\n //and keep it to gregorian\r\n //to show islamic date, we have to tell the dayjs to use islamic calender\r\n console.log(\"Hijri Date String: \", customDate.toCalendarSystem('islamic').format('YYYY-MM-DD'));\r\n return customDate.toDate();\r\n }\r\n\r\n format(date: Date, calendar: FlexCalendarSystem, format: string): string {\r\n const d = dayjs(date);\r\n return d.toCalendarSystem(calendar).format(format);\r\n }\r\n}\r\n\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, effect, ElementRef, HostListener, input, model, OnInit, output, ViewChild } from '@angular/core';\r\nimport { HijriCalendarComponent } from \"../flex-hijri-calendar/hijri-calendar.component\";\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nimport dayjs from \"dayjs\";\r\nimport { FlexCalendarSystem } from '../../core/types/flex-calendar-system.type';\r\nimport { DateServiceService } from '../../services/date-service.service';\r\n\r\n\r\n@Component({\r\n selector: 'app-hijri-datepicker',\r\n imports: [CommonModule, FormsModule, HijriCalendarComponent],\r\n templateUrl: './hijri-datepicker.component.html',\r\n styleUrl: './hijri-datepicker.component.css'\r\n})\r\n\r\nexport class HijriDatepickerComponent {\r\n value = model<any>();\r\n\r\n selectedDate?: Date;\r\n showCalendar: boolean = false;\r\n\r\n calender = input<FlexCalendarSystem>(\"gregory\");\r\n enabled = input<boolean>(true);\r\n cssClass = input<string>();\r\n format = input<string>(\"DD/MM/YYYY\");\r\n\r\n inputDate: string = \"\";\r\n isMobile = false;\r\n\r\n\r\n constructor(private dateService: DateServiceService) {\r\n\r\n\r\n\r\n effect(() => {\r\n const iso = this.value();\r\n if (iso) {\r\n const date = dayjs(iso);\r\n if (date.isValid()) {\r\n this.selectedDate = date.toDate();\r\n this.inputDate = this.formatDate(this.selectedDate, this.calender(), this.format());\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.selectedDate = undefined;\r\n this.inputDate = \"\";\r\n });\r\n }\r\n\r\n toggleCalendar() {\r\n this.showCalendar = !this.showCalendar;\r\n }\r\n\r\n onDateSelectedFromCalender(e: Date) {\r\n // console.log(\"onDateSelectedFromCalender: \", e);\r\n this.dateService.log(e);\r\n //var time = this.selectedDate ?? new Date();\r\n\r\n // e.setHours(time.getHours());\r\n // e.setMinutes(time.getMinutes());\r\n\r\n //this.updateDate(e);\r\n //this.showCalendar = false;\r\n\r\n // console.log(e);\r\n }\r\n\r\n /** Triggered on blur OR Enter key */\r\n onManualDateEntered() {\r\n if (!this.inputDate) return;\r\n\r\n const parsed = this.parseInputDate(this.inputDate);\r\n if (parsed) {\r\n this.updateDate(parsed);\r\n } else {\r\n console.warn(\"Invalid date entered:\", this.inputDate);\r\n }\r\n }\r\n\r\n /** Reusable update method */\r\n private updateDate(d: Date) {\r\n this.selectedDate = d;\r\n //this.inputDate = this.formatDateForInput(d);\r\n this.value.set(d);\r\n //this.valueChange.emit(d);\r\n }\r\n\r\n formatDate(date: Date, calender: FlexCalendarSystem, format: string): string {\r\n return this.dateService.format(date, calender, format);\r\n }\r\n\r\n // private formatDateForInput(date: Date): string {\r\n // const fmt = this.format()?.toUpperCase() ?? \"DD/MM/YYYY\";\r\n // //return dayjs(date).format(fmt);\r\n // return this.formatDate(date, fmt);\r\n // }\r\n\r\n private parseInputDate(str: string): Date | null {\r\n\r\n const fmt = this.format()?.toUpperCase() ?? \"DD/MM/YYYY\";\r\n\r\n console.log(str, \"-\", fmt);\r\n\r\n const d = dayjs(str, fmt); // strict parse\r\n\r\n console.log(d.toDate());\r\n\r\n if (!d.isValid()) return null;\r\n\r\n\r\n\r\n if (!this.selectedDate) {\r\n this.selectedDate = new Date();\r\n }\r\n\r\n // gd.set(\"hour\", this.selectedDate.getHours());\r\n // gd.set(\"minute\", this.selectedDate.getMinutes());\r\n // gd.set(\"second\", this.selectedDate.getSeconds());\r\n\r\n return null;\r\n }\r\n\r\n\r\n @ViewChild(\"inputDiv\") inputDiv?: ElementRef;\r\n @ViewChild(\"modalDiv\") modalDiv?: ElementRef;\r\n @ViewChild(\"popupDiv\") popupDiv?: ElementRef;\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent) {\r\n if (this.inputDiv?.nativeElement.contains(event.target)\r\n || this.modalDiv?.nativeElement.contains(event.target)\r\n || this.popupDiv?.nativeElement.contains(event.target)) {\r\n return\r\n }\r\n this.showCalendar = false;\r\n }\r\n}\r\n","<div class=\"input-group flex-nowrap\" #inputDiv>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"inputDate\" (blur)=\"onManualDateEntered()\"\r\n [disabled]=\"!enabled()\" [placeholder]=\"format()?.toUpperCase()\" (keyup.enter)=\"onManualDateEntered()\">\r\n\r\n <button class=\"btn btn-outline-secondary\" type=\"button\" (click)=\"toggleCalendar()\" [disabled]=\"!enabled()\">\r\n <i class=\"bi bi-calendar3\"></i>\r\n </button>\r\n</div>\r\n\r\n@if(showCalendar){\r\n@if(isMobile){\r\n<div class=\"modal modal-backdrop\" tabindex=\"-1\" role=\"dialog\" style=\"display: block;\" #modalDiv>\r\n <div class=\"modal-dialog modal-dialog-scrollable\" role=\"document\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"btn btn-danger close ms-auto btn-sm\" (click)=\"showCalendar = false\">\r\n <i class=\"bi bi-x\"></i>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n@else{\r\n<div class=\"dropdown-menu show\" #popupDiv>\r\n <app-hijri-calendar (valueChange)=\"onDateSelectedFromCalender($event)\"></app-hijri-calendar>\r\n</div>\r\n}\r\n}","import { CommonModule } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n Component,\r\n ContentChild,\r\n ElementRef,\r\n Renderer2,\r\n TemplateRef,\r\n ViewChild,\r\n OnDestroy,\r\n HostListener\r\n} from '@angular/core';\r\n\r\n@Component({\r\n selector: 'flex-container',\r\n templateUrl: './flex-container.component.html',\r\n styleUrls: ['./flex-container.component.css'],\r\n imports: [CommonModule]\r\n})\r\n\r\nexport class FlexContainerComponent implements AfterViewInit, OnDestroy {\r\n @ViewChild('contentHost') contentHost!: ElementRef<HTMLDivElement>;\r\n //private resizeHandler!: () => void;\r\n\r\n // Allow consumer to provide templates\r\n @ContentChild('header') headerTpl!: TemplateRef<any>;\r\n @ContentChild('footer') footerTpl!: TemplateRef<any>;\r\n @ContentChild('content') contentTpl!: TemplateRef<any>;\r\n\r\n constructor(private renderer: Renderer2) { }\r\n\r\n ngAfterViewInit(): void {\r\n this.resizeContent();\r\n //this.resizeHandler = this.resizeContent.bind(this);\r\n //window.addEventListener('resize', this.resizeHandler);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // if (this.resizeHandler) {\r\n // window.removeEventListener('resize', this.resizeHandler);\r\n // }\r\n }\r\n\r\n\r\n @HostListener('window:resize')\r\n onWindowResize() {\r\n this.resizeContent();\r\n }\r\n\r\n private resizeContent() {\r\n const parent = this.contentHost.nativeElement.parentElement;\r\n if (!parent) return;\r\n\r\n const parentHeight = parent.clientHeight;\r\n const headerHeight = this.contentHost.nativeElement.previousElementSibling?.clientHeight || 0;\r\n const footerHeight = this.contentHost.nativeElement.nextElementSibling?.clientHeight || 0;\r\n\r\n const available = parentHeight - headerHeight - footerHeight;\r\n\r\n this.renderer.setStyle(this.contentHost.nativeElement, 'height', `${available}px`);\r\n this.renderer.setStyle(this.contentHost.nativeElement, 'width', `${parent.clientWidth}px`);\r\n }\r\n}\r\n","<div class=\"flex-container\">\r\n @if(headerTpl){\r\n <div class=\"header\">\r\n <ng-container *ngTemplateOutlet=\"headerTpl\"></ng-container>\r\n </div>\r\n }\r\n\r\n\r\n <div #contentHost class=\"content\">\r\n <ng-container *ngTemplateOutlet=\"contentTpl\"></ng-container>\r\n </div>\r\n @if(footerTpl){\r\n <div class=\"footer\">\r\n <ng-container *ngTemplateOutlet=\"footerTpl\"></ng-container>\r\n </div>\r\n }\r\n\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FlexCalendarSystem } from '../core/types/flex-calendar-system.type';\r\n\r\nexport type HijriDate = { hy: number; hm: number; hd: number };\r\ntype DayCell = {\r\n g: Date; // always Gregorian Date\r\n h: HijriDate; // mapped Hijri for display\r\n inCurrentMonth: boolean;\r\n disabled: boolean;\r\n};\r\n\r\n// ✅ Intl formatters\r\nconst hijriFmt = new Intl.DateTimeFormat('en-u-ca-islamic-umalqura-nu-latn', {\r\n day: 'numeric',\r\n month: 'numeric',\r\n year: 'numeric'\r\n});\r\n\r\nconst hijriMonthNamesEn = [\r\n 'Muharram', 'Safar', 'Rabi I', 'Rabi II',\r\n 'Jumada I', 'Jumada II', 'Rajab', 'Sha’ban',\r\n 'Ramadan', 'Shawwal', 'Dhu al-Qi’dah', 'Dhu al-Hijjah'\r\n];\r\n\r\nconst hijriMonthNamesAr = [\r\n 'محرم', 'صفر', 'ربيع الأول', 'ربيع الآخر',\r\n 'جمادى الأولى', 'جمادى الآخرة', 'رجب', 'شعبان',\r\n 'رمضان', 'شوال', 'ذو القعدة', 'ذو الحجة'\r\n];\r\n\r\nconst gregMonthNamesEn = [\r\n 'January', 'February', 'March', 'April', 'May', 'June',\r\n 'July', 'August', 'September', 'October', 'November', 'December'\r\n];\r\n\r\nconst gregMonthNamesAr = [\r\n 'يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو',\r\n 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'\r\n];\r\n\r\nconst weekDaysEn = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\r\nconst weekDaysAr = ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'];\r\n\r\nfunction hijriFromGregorian(g: Date): HijriDate {\r\n const parts = hijriFmt.formatToParts(g);\r\n const map: Record<string, string> = {};\r\n for (const p of parts) map[p.type] = p.value;\r\n const n = (k: string) => parseInt(map[k] ?? '0', 10);\r\n return { hy: n('year'), hm: n('month'), hd: n('day') };\r\n}\r\nfunction compareHijri(a: HijriDate, b: HijriDate) {\r\n if (a.hy !== b.hy) return a.hy - b.hy;\r\n if (a.hm !== b.hm) return a.hm - b.hm;\r\n return a.hd - b.hd;\r\n}\r\nfunction findGregorianForHijri(target: HijriDate): Date {\r\n let lo = new Date(1937, 0, 1).getTime();\r\n let hi = new Date(2076, 11, 31).getTime();\r\n const dayMs = 86400000;\r\n while (lo <= hi) {\r\n const mid = Math.floor((lo + hi) / 2);\r\n const h = hijriFromGregorian(new Date(mid));\r\n compareHijri(h, target) < 0 ? (lo = mid + dayMs) : (hi = mid - dayMs);\r\n }\r\n let d = new Date(lo);\r\n while (true) {\r\n const h = hijriFromGregorian(d);\r\n const cmp = compareHijri(h, target);\r\n if (cmp === 0) return d;\r\n if (cmp > 0) throw new Error('Hijri date out of supported range');\r\n d = new Date(d.getTime() + dayMs);\r\n }\r\n}\r\nfunction stripTime(d: Date): Date {\r\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\r\n}\r\n\r\n\r\n@Component({\r\n selector: 'flex-dual-calendar',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './flex-dual-calendar.component.html',\r\n styleUrls: ['./flex-dual-calendar.component.css']\r\n})\r\nexport class FlexDualCalendarComponent {\r\n /** Two-way bound selected date (Gregorian) */\r\n @Input() value?: Date;\r\n @Output() valueChange = new EventEmitter<Date>();\r\n\r\n /** Optional min/max (Gregorian) */\r\n @Input() minDate?: Date;\r\n @Input() maxDate?: Date;\r\n\r\n /** Month/weekday language */\r\n @Input() monthLang: 'en' | 'ar' = 'en';\r\n\r\n /** Start mode, default Hijri */\r\n @Input() startMode: FlexCalendarSystem = 'gregory';\r\n\r\n /** Current mode (hijri | gregory) */\r\n mode = signal<FlexCalendarSystem>('gregory');\r\n\r\n /** Hijri view state */\r\n hy = signal<number>(0);\r\n hm = signal<number>(0);\r\n\r\n /** Gregorian view state */\r\n gy = signal<number>(0);\r\n gm = signal<number>(0); // 1..12\r\n\r\n /** selectors */\r\n selectedMonth = 1;\r\n selectedYear = 1447;\r\n yearRange: number[] = [];\r\n\r\n // ---- getters for UI ----\r\n get hijriMonths() {\r\n return this.monthLang === 'ar' ? hijriMonthNamesAr : hijriMonthNamesEn;\r\n }\r\n get gregMonths() {\r\n return this.monthLang === 'ar' ? gregMonthNamesAr : gregMonthNamesEn;\r\n }\r\n get weekDays() {\r\n return this.monthLang === 'ar' ? weekDaysAr : weekDaysEn;\r\n }\r\n get currentMonthName() {\r\n return this.mode() === 'islamic'\r\n ? this.hijriMonths[this.selectedMonth - 1]\r\n : this.gregMonths[this.selectedMonth - 1];\r\n }\r\n\r\n constructor() {\r\n const today = new Date();\r\n const h = hijriFromGregorian(today);\r\n this.hy.set(h.hy);\r\n this.hm.set(h.hm);\r\n this.gy.set(today.getFullYear());\r\n this.gm.set(today.getMonth() + 1);\r\n\r\n // initialize selectors with start mode\r\n this.mode.set(this.startMode);\r\n if (this.mode() === 'islamic') {\r\n this.selectedYear = this.hy();\r\n this.selectedMonth = this.hm();\r\n } else {\r\n this.selectedYear = this.gy();\r\n this.selectedMonth = this.gm();\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.buildYearRange();\r\n }\r\n\r\n ngOnChanges(changes: any) {\r\n // If value changed from outside, update both calendars\r\n if (changes['value'] && this.value instanceof Date) {\r\n const g = stripTime(this.value);\r\n const h = hijriFromGregorian(g);\r\n\r\n this.gy.set(g.getFullYear());\r\n this.gm.set(g.getMonth() + 1);\r\n\r\n this.hy.set(h.hy);\r\n this.hm.set(h.hm);\r\n\r\n // Update dropdowns based on current mode\r\n if (this.mode() === 'islamic') {\r\n this.selectedYear = this.hy();\r\n this.selectedMonth = this.hm();\r\n } else {\r\n this.selectedYear = this.gy();\r\n this.selectedMonth = this.gm();\r\n }\r\n }\r\n\r\n // Rebuild year range if min/max changed\r\n if (changes['minDate'] || changes['maxDate'] || changes['value']) {\r\n this.buildYearRange();\r\n }\r\n }\r\n\r\n\r\n // Build years based on min/max expressed in Hijri for Hijri mode, Gregorian for Gregorian mode\r\n buildYearRange() {\r\n if (this.mode() === 'islamic') {\r\n const minH = this.minDate ? hijriFromGregorian(stripTime(this.minDate)) : { hy: 1356, hm: 1, hd: 1 };\r\n const maxH = this.maxDate ? hijriFromGregorian(stripTime(this.maxDate)) : { hy: 1499, hm: 12, hd: 30 };\r\n this.yearRange = [];\r\n for (let y = minH.hy; y <= maxH.hy; y++) this.yearRange.push(y);\r\n } else {\r\n const minG = this.minDate ? stripTime(this.minDate) : new Date(1937, 0, 1);\r\n const maxG = this.maxDate ? stripTime(this.maxDate) : new Date(2076, 11, 31);\r\n this.yearRange = [];\r\n for (let y = minG.getFullYear(); y <= maxG.getFullYear(); y++) this.yearRange.push(y);\r\n }\r\n }\r\n\r\n // 🔁 Mode switch (SYNCED view — keep same instant)\r\n switchMode(value: FlexCalendarSystem) {\r\n const pivot = this.value ?? this.firstOfMonth(); // use selected date or current view start\r\n if (value === 'gregory') {\r\n // To Gregorian mode\r\n const g = stripTime(pivot);\r\n this.gy.set(g.getFullYear());\r\n this.gm.set(g.getMonth() + 1);\r\n this.mode.set('gregory');\r\n this.selectedYear = this.gy();\r\n this.selectedMonth = this.gm();\r\n } else {\r\n // To Hijri mode\r\n const h = hijriFromGregorian(stripTime(pivot));\r\n this.hy.set(h.hy);\r\n this.hm.set(h.hm);\r\n this.mode.set('islamic');\r\n this.selectedYear = this.hy();\r\n this.selectedMonth = this.hm();\r\n }\r\n this.buildYearRange();\r\n }\r\n\r\n // called when dropdowns change\r\n onMonthYearChange() {\r\n if (this.mode() === 'islamic') {\r\n this.hy.set(this.selectedYear);\r\n this.hm.set(this.selectedMonth);\r\n } else {\r\n this.gy.set(this.selectedYear);\r\n this.gm.set(this.selectedMonth);\r\n }\r\n }\r\n\r\n // Start of visible month (Gregorian date)\r\n firstOfMonth(): Date {\r\n if (this.mode() === 'islamic') {\r\n return findGregorianForHijri({ hy: this.hy(), hm: this.hm(), hd: 1 });\r\n }\r\n return new Date(this.gy(), this.gm() - 1, 1);\r\n }\r\n\r\n // Calendar cells for current view\r\n cells(): DayCell[] {\r\n const firstG = this.firstOfMonth();\r\n const firstH = hijriFromGregorian(firstG);\r\n\r\n // grid start (Sunday-first; adjust if you want Saturday-first)\r\n const start = new Date(firstG);\r\n start.setDate(firstG.getDate() - firstG.getDay());\r\n\r\n const result: DayCell[] = [];\r\n for (let i = 0; i < 42; i++) {\r\n const g = new Date(start);\r\n g.setDate(start.getDate() + i);\r\n const h = hijriFromGregorian(g);\r\n\r\n let disabled = false;\r\n if (this.minDate && g < stripTime(this.minDate)) disabled = true;\r\n if (this.maxDate && g > stripTime(this.maxDate)) disabled = true;\r\n\r\n const inCurrentMonth =\r\n this.mode() === 'islamic'\r\n ? (h.hy === firstH.hy && h.hm === firstH.hm)\r\n : (g.getFullYear() === firstG.getFullYear() && g.getMonth() === firstG.getMonth());\r\n\r\n result.push({ g, h, inCurrentMonth, disabled });\r\n }\r\n return result;\r\n }\r\n\r\n prevMonth() {\r\n if (!this.canPrev()) return;\r\n if (this.mode() === 'islamic') {\r\n let m = this.hm(), y = this.hy();\r\n if (--m < 1) { m = 12; y--; }\r\n this.hm.set(m); this.hy.set(y);\r\n this.selectedYear = y; this.selectedMonth = m;\r\n } else {\r\n let m = this.gm(), y = this.gy();\r\n if (--m < 1) { m = 12; y--; }\r\n this.gm.set(m); this.gy.set(y);\r\n this.selectedYear = y; this.selectedMonth = m;\r\n }\r\n }\r\n nextMonth() {\r\n if (!this.canNext()) return;\r\n if (this.mode() === 'islamic') {\r\n let m = this.hm(), y = this.hy();\r\n if (++m > 12) { m = 1; y++; }\r\n this.hm.set(m); this.hy.set(y);\r\n this.selectedYear = y; this.selectedMonth = m;\r\n } else {\r\n let m = this.gm(), y = this.gy();\r\n if (++m > 12) { m = 1; y++; }\r\n this.gm.set(m); this.gy.set(y);\r\n this.selectedYear = y; this.selectedMonth = m;\r\n }\r\n }\r\n\r\n canPrev(): boolean {\r\n if (!this.minDate) return true;\r\n const minG = stripTime(this.minDate);\r\n const viewFirst = this.firstOfMonth();\r\n // Can go prev if the first day of previous month is >= minG\r\n const prev = new Date(viewFirst.getFullYear(), viewFirst.getMonth() - 1, 1);\r\n return prev >= new Date(minG.getFullYear(), minG.getMonth(), 1);\r\n }\r\n canNext(): boolean {\r\n if (!this.maxDate) return true;\r\n const maxG = stripTime(this.maxDate);\r\n const viewFirst = this.firstOfMonth();\r\n const next = new Date(viewFirst.getFullYear(), viewFirst.getMonth() + 1, 1);\r\n // move to the first of the month after max\r\n const maxMonthAfter = new Date(maxG.getFullYear(), maxG.getMonth() + 1, 1);\r\n return next < maxMonthAfter;\r\n }\r\n\r\n isToday(g: Date) {\r\n const t = new Date();\r\n return g.getFullYear() === t.getFullYear()\r\n && g.getMonth() === t.getMonth()\r\n && g.getDate() === t.getDate();\r\n }\r\n isSelected(g: Date) {\r\n return !!this.value &&\r\n g.getFullYear() === this.value.getFullYear() &&\r\n g.getMonth() === this.value.getMonth() &&\r\n g.getDate() === this.value.getDate();\r\n }\r\n select(c: DayCell) {\r\n if (c.disabled) return;\r\n this.value = stripTime(c.g);\r\n this.valueChange.emit(this.value);\r\n // keep both views in sync after selection\r\n const h = hijriFromGregorian(this.value);\r\n this.hy.set(h.hy); this.hm.set(h.hm);\r\n this.gy.set(this.value.getFullYear()); this.gm.set(this.value.getMonth() + 1);\r\n if (this.mode() === 'islamic') {\r\n this.selectedYear = this.hy(); this.selectedMonth = this.hm();\r\n } else {\r\n this.selectedYear = this.gy(); this.selectedMonth = this.gm();\r\n }\r\n }\r\n}\r\n","<div class=\"card\">\r\n <div class=\"card-header p-1\">\r\n <div class=\"row g-1\">\r\n <div class=\"col-1\">\r\n <button class=\"btn btn-sm w-100 btn-info\" (click)=\"prevMonth()\" [disabled]=\"!canPrev()\">&laquo;</button>\r\n </div>\r\n <div class=\"col-6\">\r\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedMonth\" (change)=\"onMonthYearChange()\">\r\n @if (mode() === 'islamic') {\r\n @for (m of hijriMonths; track $index) {\r\n <option [value]=\"$index + 1\">{{ hijriMonths[$index] }}-{{$index + 1}}</option>\r\n }\r\n } @else {\r\n @for (m of gregMonths; track $index) {\r\n <option [value]=\"$index + 1\">{{$index + 1}}-{{ gregMonths[$index] }}</option>\r\n }\r\n }\r\n </select>\r\n </div>\r\n <div class=\"col-4\">\r\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedYear\" (change)=\"onMonthYearChange()\">\r\n @for (y of yearRange; track y) {\r\n <option [value]=\"y\">{{ y }}</option>\r\n }\r\n </select>\r\n </div>\r\n <div class=\"col-1 \">\r\n <button class=\"btn btn-sm w-100 btn-info\" (click)=\"nextMonth()\" [disabled]=\"!canNext()\">&raquo;</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card-body p-0\">\r\n <!-- Weekday labels -->\r\n <div class=\"grid\">\r\n @for (w of weekDays; track $index) {\r\n <div class=\"col fw-bold border pb-1\">{{ w }}</div>\r\n }\r\n </div>\r\n\r\n <!-- Calendar cells -->\r\n <div class=\"grid\">\r\n @for (c of cells(); track $index) {\r\n <div class=\"cell\">\r\n <button class=\"btn w-100\" [class.muted]=\"!c.inCurrentMonth\" [class.today]=\"isToday(c.g)\"\r\n [class.selected]=\"isSelected(c.g)\" [disabled]=\"c.disabled\" (click)=\"select(c)\">\r\n <!-- show Hijri day in Hijri mode, otherwise Gregorian -->\r\n @if(mode() === 'islamic'){\r\n {{ c.h.hd }}\r\n }\r\n @else{\r\n {{ c.g.getDate() }}\r\n }\r\n </button>\r\n </div>\r\n }\r\n\r\n </div>\r\n </div>\r\n <div class=\"card-footer px-0 py-1\">\r\n <div class=\"d-flex justify-content-center\">\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Basic example\">\r\n <button class=\"btn btn-sm btn-outline-secondary\" type=\"button\" (click)=\"switchMode('gregory')\">\r\n Gregorian\r\n </button>\r\n <button class=\"btn btn-sm btn-outline-secondary\" type=\"button\" (click)=\"switchMode('islamic')\">\r\n هجري\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, effect, ElementRef, HostListener, input, model, ViewChild } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { computePosition, offset, flip, shift, autoPlacement } from '@floating-ui/dom';\r\n\r\nimport dayjs from \"dayjs\";\r\nimport { FlexCalendarSystem } from '../core/types/flex-calendar-system.type';\r\nimport { DateServiceService } from '../services/date-service.service';\r\nimport { FlexDualCalendarComponent } from \"../flex-dual-calendar/flex-dual-calendar.component\";\r\nimport { FlexCalendarSystemSwitchPosition } from '../core/types/flex-calendar-system-switch-position.type';\r\n\r\n@Component({\r\n selector: 'flex-dual-datepicker',\r\n imports: [CommonModule, FormsModule, FlexDualCalendarComponent],\r\n templateUrl: './flex-dual-datepicker.component.html',\r\n styleUrl: './flex-dual-datepicker.component.css'\r\n})\r\n\r\nexport class FlexDualDatepickerComponent {\r\n\r\n value = model<any>();\r\n enabled = input<boolean>(true);\r\n cssClass = input<string>();\r\n format = input<string>(\"DD/MM/YYYY\");\r\n\r\n title = input<string>();\r\n calendarSwitchPosition = input<FlexCalendarSystemSwitchPosition>(\"title\");\r\n\r\n //selectedDate is needed to keep the current data for process\r\n selectedDate?: Date;\r\n showCalendar: boolean = false;\r\n\r\n calendar: FlexCalendarSystem = \"gregory\";\r\n\r\n inputDate: string = \"\";\r\n isMobile = false;\r\n\r\n\r\n constructor(private dateService: DateServiceService) {\r\n effect(() => {\r\n const iso = this.value();\r\n if (iso) {\r\n const date = dayjs(iso);\r\n if (date.isValid()) {\r\n this.selectedDate = date.toDate();\r\n this.inputDate = this.formatDate(this.selectedDate!);\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.selectedDate = undefined;\r\n this.inputDate = \"\";\r\n });\r\n }\r\n\r\n switchCalendar() {\r\n if (this.calendar == \"gregory\") {\r\n this.calendar = \"islamic\";\r\n }\r\n else {\r\n this.calendar = \"gregory\";\r\n }\r\n\r\n this.inputDate = this.formatDate(this.selectedDate!);\r\n }\r\n\r\n toggleCalendar() {\r\n this.showCalendar = !this.showCalendar;\r\n }\r\n\r\n onDateSelectedFromCalender(e: Date) {\r\n this.inputDate = this.formatDate(e);\r\n\r\n this.updateDate(e);\r\n this.showCalendar = false;\r\n this.isOpen = false;\r\n }\r\n\r\n /** Triggered on blur OR Enter key */\r\n onManualDateEntered() {\r\n if (!this.inputDate) return;\r\n\r\n const parsed = this.parseInputDate(this.inputDate);\r\n if (parsed) {\r\n this.updateDate(parsed);\r\n } else {\r\n console.warn(\"Invalid date entered:\", this.inputDate);\r\n }\r\n }\r\n\r\n /** Reusable update method */\r\n private updateDate(d: Date) {\r\n this.selectedDate = d;\r\n this.inputDate = this.formatDate(d);\r\n this.value.set(d);\r\n }\r\n\r\n formatDate(date: Date): string {\r\n return this.dateService.format(date, this.calendar, this.format());\r\n }\r\n\r\n private parseInputDate(str: string): Date | null | undefined {\r\n /*if the user clear the text in input box then we must accept as the user\r\n wants to remove date from the control so we will return null*/\r\n if (!str)\r\n return null;\r\n\r\n /*if any text entered in input box then we must try to parse it\r\n if parse success the date service will return the date else will return \r\n null or undefined.\r\n in this case since user entered some date may be he/she made mistake\r\n so we will should not show null or empty value, instead we will\r\n return current date or last selected date\r\n */\r\n var parsedDate = this.dateService.parse(str, this.calendar, this.format());\r\n if (parsedDate)\r\n return parsedDate;\r\n\r\n //if parseDate is null this means user entered wrong date, in this case we will return\r\n //the last selected date.\r\n if (this.selectedDate) {\r\n return this.selectedDate;\r\n }\r\n\r\n //if last selected date is also null then we will return current date.\r\n return new Date();\r\n }\r\n\r\n\r\n @ViewChild(\"inputDiv\") inputDiv?: ElementRef;\r\n @ViewChild(\"modalDiv\") modalDiv?: ElementRef;\r\n @ViewChild(\"menu\") popupDiv?: ElementRef;\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent) {\r\n if (this.inputDiv?.nativeElement.contains(event.target)\r\n || this.modalDiv?.nativeElement.contains(event.target)\r\n || this.popupDiv?.nativeElement.contains(event.target)) {\r\n return\r\n }\r\n this.showCalendar = false;\r\n this.isOpen = false;\r\n }\r\n\r\n\r\n\r\n @ViewChild('btn') btnRef!: ElementRef<HTMLElement>;\r\n @ViewChild('menu') menuRef!: ElementRef<HTMLElement>;\r\n\r\n isOpen = false;\r\n\r\n async toggleMenu() {\r\n this.isOpen = !this.isOpen;\r\n\r\n if (this.isOpen) {\r\n const button = this.btnRef.nativeElement;\r\n const menu = this.menuRef.nativeElement;\r\n\r\n const { x, y } = await computePosition(button, menu, {\r\n // placement: 'bottom-start',\r\n strategy: 'fixed',\r\n middleware: [\r\n offset(4),\r\n flip(),\r\n autoPlacement(), // <--- AUTO PLACEMENT\r\n shift()\r\n ]\r\n });\r\n\r\n\r\n Object.assign(menu.style, {\r\n left: `${x}px`,\r\n top: `${y}px`\r\n });\r\n }\r\n }\r\n}\r\n","@if(calendarSwitchPosition() == 'title'){\r\n<div class=\"d-flex align-items-center gap-1\">\r\n <label>{{ title() }}</label>\r\n <button type=\"button\" class=\"btn btn-sm btn-info\" style=\"cursor: pointer; padding-bottom: 1px; padding-top: 1px;\"\r\n (click)=\"switchCalendar()\">\r\n @if(calendar == 'gregory') {G}\r\n @else{H}\r\n </button>\r\n</div>\r\n\r\n}\r\n<div class=\"input-group flex-nowrap\" #inputDiv>\r\n @if(calendarSwitchPosition() == 'inline'){\r\n <span class=\"input-group-text\" style=\"cursor: pointer;\" (click)=\"switchCalendar()\"> @if(calendar == 'gregory') {G}\r\n @else{H}</span>\r\n }\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"inputDate\" (blur)=\"onManualDateEntered()\"\r\n [disabled]=\"!enabled()\" [placeholder]=\"format()\" (keyup.enter)=\"onManualDateEntered()\">\r\n\r\n\r\n <!-- <button class=\"btn btn-outline-secondary\" type=\"button\" (click)=\"toggleCalendar()\" [disabled]=\"!enabled()\">\r\n <i class=\"bi bi-calendar3\"></i>\r\n </button> -->\r\n <button #btn class=\"btn btn-outline-secondary\" (click)=\"toggleMenu()\" [disabled]=\"!enabled()\">\r\n <i class=\"bi bi-calendar3\"></i>\r\n </button>\r\n\r\n</div>\r\n\r\n@if(isOpen){\r\n@if(isMobile){\r\n<div class=\"modal modal-backdrop\" tabindex=\"-1\" role=\"dialog\" style=\"display: block;\" #modalDiv>\r\n <div class=\"modal-dialog modal-dialog-scrollable\" role=\"document\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"btn btn-danger close ms-auto btn-sm\" (click)=\"showCalendar = false\">\r\n <i class=\"bi bi-x\"></i>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n@else{\r\n<div #menu class=\"dropdown-panel\">\r\n <flex-dual-calendar (valueChange)=\"onDateSelectedFromCalender($event)\"\r\n [(value)]=\"selectedDate\"></flex-dual-calendar>\r\n</div>\r\n}\r\n}","/*\r\n * Public API Surface of flex-ui-controls\r\n */\r\n\r\nexport * from './lib/flex-panel/flex-panel.component';\r\nexport * from './lib/flex-pagination/flex-pagination.component';\r\nexport * from './lib/flex-grid/flex-grid.component';\r\nexport * from './lib/flex-grid/flex-grid-columns';\r\nexport * from './lib/flex-grid/flex-grid-column';\r\nexport * from './lib/flex-combo-datepicker/flex-combo-datepicker.component';\r\nexport * from './lib/flex-hijri/flex-hijri-datepicker/hijri-datepicker.component';\r\nexport * from './lib/flex-container/flex-container.component';\r\nexport * from \"./lib/flex-dual-datepicker/flex-dual-datepicker.component\";","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","hijriFmt","hijriMonthNamesEn","hijriMonthNamesAr","weekDaysEn","weekDaysAr","hijriFromGregorian","compareHijri","findGregorianForHijri","i1.DateServiceService","i1"],"mappings":"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"}
1
+ {"version":3,"file":"dcsl-flex-ui.mjs","sources":["../../../projects/flex-ui-controls/src/lib/flex-panel/flex-panel.component.ts","../../../projects/flex-ui-controls/src/lib/flex-panel/flex-panel.component.html","../../../projects/flex-ui-controls/src/lib/flex-pagination/flex-pagination.component.ts","../../../projects/flex-ui-controls/src/lib/flex-pagination/flex-pagination.component.html","../../../projects/flex-ui-controls/src/lib/flex-grid/flex-grid-column.ts","../../../projects/flex-ui-controls/src/lib/flex-grid/flex-grid-columns.ts","../../../projects/flex-ui-controls/src/lib/flex-grid/flex-grid.component.ts","../../../projects/flex-ui-controls/src/lib/flex-grid/flex-grid.component.html","../../../projects/flex-ui-controls/src/lib/flex-combo-datepicker/flex-combo-datepicker.component.ts","../../../projects/flex-ui-controls/src/lib/flex-combo-datepicker/flex-combo-datepicker.component.html","../../../projects/flex-ui-controls/src/lib/flex-hijri/flex-hijri-calendar/hijri-calendar.component.ts","../../../projects/flex-ui-controls/src/lib/flex-hijri/flex-hijri-calendar/hijri-calendar.component.html","../../../projects/flex-ui-controls/src/lib/services/date-service.service.ts","../../../projects/flex-ui-controls/src/lib/flex-hijri/flex-hijri-datepicker/hijri-datepicker.component.ts","../../../projects/flex-ui-controls/src/lib/flex-hijri/flex-hijri-datepicker/hijri-datepicker.component.html","../../../projects/flex-ui-controls/src/lib/flex-container/flex-container.component.ts","../../../projects/flex-ui-controls/src/lib/flex-container/flex-container.component.html","../../../projects/flex-ui-controls/src/lib/flex-dual-calendar/flex-dual-calendar.component.ts","../../../projects/flex-ui-controls/src/lib/flex-dual-calendar/flex-dual-calendar.component.html","../../../projects/flex-ui-controls/src/lib/services/device-detector.service.ts","../../../projects/flex-ui-controls/src/lib/services/floating-ui.service.ts","../../../projects/flex-ui-controls/src/lib/flex-dual-datepicker/flex-dual-datepicker.component.ts","../../../projects/flex-ui-controls/src/lib/flex-dual-datepicker/flex-dual-datepicker.component.html","../../../projects/flex-ui-controls/src/public-api.ts","../../../projects/flex-ui-controls/src/dcsl-flex-ui.ts"],"sourcesContent":["import { Component, ElementRef, HostListener, inject, Renderer2, ViewChild } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'flex-panel',\r\n imports: [],\r\n templateUrl: './flex-panel.component.html',\r\n styleUrl: './flex-panel.component.css'\r\n})\r\n\r\nexport class FlexPanelComponent {\r\n private resizeObserver?: ResizeObserver;\r\n private mutationObserver?: MutationObserver;\r\n\r\n @ViewChild(\"abc\") comp?: ElementRef<HTMLDivElement>;\r\n\r\n private renderer = inject(Renderer2);\r\n\r\n constructor() { }\r\n\r\n ngAfterViewInit() {\r\n this.adjustHeight();\r\n\r\n // ✅ Recalculate on window resize\r\n if ('ResizeObserver' in window) {\r\n this.resizeObserver = new ResizeObserver(() => this.adjustHeight());\r\n this.resizeObserver.observe(document.body);\r\n }\r\n\r\n // ✅ Also observe DOM changes that may shift this element\r\n this.mutationObserver = new MutationObserver(() => this.adjustHeight());\r\n this.mutationObserver.observe(document.body, {\r\n attributes: true,\r\n childList: true,\r\n subtree: true\r\n });\r\n\r\n\r\n }\r\n\r\n @HostListener('window:resize')\r\n onWindowResize() {\r\n this.adjustHeight();\r\n }\r\n\r\n private adjustHeight() {\r\n // const host: HTMLElement = this.el.nativeElement;\r\n const top = this.comp!.nativeElement.getBoundingClientRect().top;\r\n const viewportHeight = window.innerHeight;\r\n const newHeight = viewportHeight - top;\r\n\r\n this.renderer.setStyle(this.comp?.nativeElement, 'height', `${newHeight}px`);\r\n this.renderer.setStyle(this.comp?.nativeElement, 'width', '100%');\r\n\r\n // console.log(host);\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n }\r\n if (this.mutationObserver) {\r\n this.mutationObserver.disconnect();\r\n }\r\n }\r\n}\r\n","<div class=\"stretch-container\" #abc>\r\n <ng-content></ng-content>\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, Output, EventEmitter, HostListener, OnInit, input, effect } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FlexPaging } from './flex_page';\r\n\r\n@Component({\r\n selector: 'flex-pagination',\r\n templateUrl: './flex-pagination.component.html',\r\n styleUrls: ['./flex-pagination.component.css'],\r\n imports: [CommonModule, FormsModule]\r\n})\r\nexport class FlexPaginationComponent implements OnInit {\r\n rowCount = input<number>(0);\r\n\r\n protected _totalItems: number = 0;\r\n pageSize = 50;\r\n currentPage = 1;\r\n @Output() pageChange = new EventEmitter<FlexPaging>();\r\n\r\n maxPagesToShow = 5;\r\n pageSizes = [50, 100, 200, 500];\r\n\r\n constructor() {\r\n effect(() => {\r\n this.currentPage = 1;\r\n this._totalItems = this.rowCount();\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.updateMaxPages();\r\n }\r\n\r\n // Update maxPagesToShow based on screen size\r\n @HostListener('window:resize')\r\n updateMaxPages() {\r\n const width = window.innerWidth;\r\n if (width < 576) {\r\n this.maxPagesToShow = 1; // only current page\r\n } else if (width < 768) {\r\n this.maxPagesToShow = 3;\r\n } else {\r\n this.maxPagesToShow = 5;\r\n }\r\n }\r\n\r\n\r\n get totalPages(): number {\r\n return Math.ceil(this._totalItems / this.pageSize) || 1;\r\n }\r\n\r\n get pages(): (number | string)[] {\r\n const total = this.totalPages;\r\n const max = this.maxPagesToShow;\r\n\r\n if (max === 1) {\r\n return [this.currentPage]; // mobile: only current page\r\n }\r\n\r\n const pages: (number | string)[] = [];\r\n\r\n if (total <= max) {\r\n for (let i = 1; i <= total; i++) pages.push(i);\r\n } else {\r\n let start = Math.max(this.currentPage - Math.floor(max / 2), 1);\r\n let end = start + max - 1;\r\n\r\n if (end > total) {\r\n end = total;\r\n start = end - max + 1;\r\n }\r\n\r\n if (start > 1) pages.push(1, '...');\r\n for (let i = start; i <= end; i++) pages.push(i);\r\n if (end < total) pages.push('...', total);\r\n }\r\n\r\n return pages;\r\n }\r\n\r\n changePage(page: number | string) {\r\n if (typeof page !== 'number') return;\r\n if (page < 1) page = 1;\r\n if (page > this.totalPages) page = this.totalPages;\r\n if (page === this.currentPage) return;\r\n\r\n this.currentPage = page;\r\n this.pageChange.emit({\r\n skip: (this.currentPage - 1) * this.pageSize,\r\n take: this.pageSize,\r\n pageSize: this.pageSize,\r\n currentPage: this.currentPage,\r\n });\r\n }\r\n\r\n onPageSizeChange(pageSize: any) {\r\n var value = Number(pageSize.target.value);\r\n if (isNaN(value) || value <= 0) return;\r\n\r\n this.pageSize = value;\r\n this.pageChange.emit({\r\n skip: (this.currentPage - 1) * this.pageSize,\r\n take: this.pageSize,\r\n pageSize: this.pageSize,\r\n currentPage: this.currentPage\r\n });\r\n }\r\n\r\n firstPage() { this.changePage(1); }\r\n lastPage() { this.changePage(this.totalPages); }\r\n prevPage() { this.changePage(this.currentPage - 1); }\r\n nextPage() { this.changePage(this.currentPage + 1); }\r\n}\r\n","<div class=\"d-flex justify-content-start align-items-center\">\r\n <!-- Pagination -->\r\n <div class=\"overflow-auto\">\r\n <ul class=\"pagination justify-content-center flex-nowrap mb-0\">\r\n <!-- First / Prev (hide First on xs) -->\r\n <li class=\"page-item d-none d-sm-block\" [class.disabled]=\"currentPage === 1\">\r\n <button class=\"page-link\" (click)=\"firstPage()\"><i class=\"bi bi-chevron-double-left\"></i></button>\r\n </li>\r\n <li class=\"page-item\" [class.disabled]=\"currentPage === 1\">\r\n <button class=\"page-link\" (click)=\"prevPage()\"><i class=\"bi bi-chevron-left\"></i></button>\r\n </li>\r\n\r\n <!-- Page numbers -->\r\n <li class=\"page-item\" *ngFor=\"let page of pages\" [class.active]=\"page === currentPage\"\r\n [class.disabled]=\"page === '...'\">\r\n <button class=\"page-link\" [disabled]=\"page === '...'\" (click)=\"changePage(page)\">\r\n {{ page }}\r\n </button>\r\n </li>\r\n\r\n <!-- Next / Last (hide Last on xs) -->\r\n <li class=\"page-item\" [class.disabled]=\"currentPage === totalPages\">\r\n <button class=\"page-link\" (click)=\"nextPage()\"><i class=\"bi bi-chevron-right\"></i></button>\r\n </li>\r\n <li class=\"page-item d-none d-sm-block\" [class.disabled]=\"currentPage === totalPages\">\r\n <button class=\"page-link\" (click)=\"lastPage()\"><i class=\"bi bi-chevron-double-right\"></i></button>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <!-- Page Size Dropdown -->\r\n <div class=\"ms-2\">\r\n <label class=\"me-2\">{{ \"page-size\" }}</label>\r\n <select class=\"form-select d-inline-block w-auto\" [(ngModel)]=\"pageSize\" (change)=\"onPageSizeChange($event)\">\r\n <option *ngFor=\"let size of pageSizes\" [value]=\"size\">{{ size }}</option>\r\n </select>\r\n </div>\r\n <div class=\"total-count ms-2\">\r\n {{ \"total-count\" }}: {{ _totalItems }}\r\n </div>\r\n</div>","// grid-column.component.ts\r\nimport { Component, ContentChild, TemplateRef, Input, input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'flex-grid-column',\r\n template: ''\r\n})\r\n\r\nexport class FlexColumnComponent {\r\n headerText = input<string>('');\r\n\r\n @Input() field!: string;\r\n @Input() width: any = 120;\r\n\r\n @ContentChild('headerTemplate') headerTemplate!: TemplateRef<any>;\r\n @ContentChild('cellTemplate') cellTemplate!: TemplateRef<any>;\r\n\r\n\r\n}\r\n","// grid-columns.component.ts\r\nimport { Component, ContentChildren, QueryList } from '@angular/core';\r\nimport { FlexColumnComponent } from './flex-grid-column';\r\n\r\n@Component({\r\n selector: 'flex-grid-columns',\r\n template: ''\r\n})\r\nexport class FlexColumnsComponent {\r\n @ContentChildren(FlexColumnComponent) columns!: QueryList<FlexColumnComponent>;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { AfterViewInit, Component, ContentChild, effect, ElementRef, Input, input, output, TemplateRef, ViewChild } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FlexPaginationComponent } from \"../flex-pagination/flex-pagination.component\";\r\nimport { FlexColumnsComponent } from './flex-grid-columns';\r\nimport { FlexPaging } from '../flex-pagination/flex_page';\r\n\r\n@Component({\r\n selector: 'flex-grid',\r\n imports: [CommonModule, FormsModule, FlexPaginationComponent],\r\n templateUrl: './flex-grid.component.html',\r\n styleUrl: './flex-grid.component.css'\r\n})\r\n\r\nexport class FlexGridComponent implements AfterViewInit {\r\n\r\n\r\n enablePaging = input<boolean>(false);\r\n totalDataCount = input<number>(0);\r\n\r\n tableClass = input<string>('');\r\n\r\n @Input() dataSource: any[] = [];\r\n\r\n // @ContentChildren(GridColumnComponent) columns!: QueryList<GridColumnComponent>;\r\n @ContentChild(FlexColumnsComponent) gridColumns?: FlexColumnsComponent;\r\n\r\n rowClicked = output<{ index: number, data: any }>();\r\n rowDblClicked = output<{ index: number, data: any }>();\r\n\r\n // Optional: custom template when no data\r\n @Input() emptyRecordTemplate?: TemplateRef<any>;\r\n\r\n isPagingEnabled: boolean = false;\r\n\r\n @ViewChild('gridHeader') gridHeader!: ElementRef;\r\n\r\n @ViewChild('gridBody') gridBody!: ElementRef;\r\n\r\n selectedIndex: number = -1;\r\n protected _totalDataCount: number = 0;\r\n protected _tableClass: string = \"\";\r\n\r\n pageChange = output<{ skip: number, take: number }>();\r\n currentPage: number = 1;\r\n pageSize: number = 50;\r\n\r\n constructor() {\r\n effect(() => {\r\n this.isPagingEnabled = this.enablePaging();\r\n });\r\n\r\n effect(() => {\r\n this._totalDataCount = this.totalDataCount();\r\n });\r\n\r\n effect(() => {\r\n this._tableClass = this.tableClass();\r\n });\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.syncColumnWidths();\r\n }\r\n\r\n check() {\r\n console.log(this.gridColumns);\r\n console.log(this.dataSource);\r\n }\r\n\r\n syncScroll(e: Event) {\r\n const body = e.target as HTMLElement;\r\n const header = this.gridHeader?.nativeElement; //document.querySelector('.grid-header');\r\n if (header) (header as HTMLElement).scrollLeft = body.scrollLeft;\r\n }\r\n\r\n syncColumnWidths() {\r\n // const headerCols = this.gridHeader.nativeElement.querySelectorAll('th');\r\n // const bodyCols = this.gridBody.nativeElement.querySelectorAll('tr:first-child td');\r\n\r\n // bodyCols.forEach((td: HTMLElement, i: number) => {\r\n // const width = td.getBoundingClientRect().width;\r\n // (headerCols[i] as HTMLElement).style.width = width + 'px';\r\n // });\r\n }\r\n\r\n // syncColumnWidths() {\r\n // const headerCols = document.querySelectorAll('.grid-header th');\r\n // const bodyCols = this.gridBody.nativeElement.querySelectorAll('tbody tr:first-child td');\r\n\r\n // bodyCols.forEach((col: HTMLElement, i: number) => {\r\n // const width = col.getBoundingClientRect().width;\r\n // (headerCols[i] as HTMLElement).style.width = width + 'px';\r\n // });\r\n // }\r\n\r\n onRowDblClick(index: number, data: any) {\r\n this.selectedIndex = index;\r\n // console.log(index);\r\n\r\n this.rowDblClicked.emit({ index: index, data: data });\r\n }\r\n\r\n onRowClick(index: number, data: any) {\r\n this.selectedIndex = index;\r\n // console.log(index);\r\n\r\n this.rowClicked.emit({ index: index, data: data });\r\n }\r\n\r\n onPageChanged(event: FlexPaging) {\r\n console.log(event);\r\n this.currentPage = event.currentPage;\r\n this.pageSize = event.pageSize;\r\n\r\n this.pageChange.emit(event);\r\n\r\n\r\n }\r\n\r\n}\r\n","<div class=\"grid-container\">\r\n <!-- Header row in its own div -->\r\n <div class=\"grid-scroll\">\r\n <div class=\"grid-container-sub\">\r\n <div class=\"grid-header\" #gridHeader>\r\n <table class=\"grid-table table table-bordered table-sm mb-0 header-table\">\r\n <colgroup>\r\n @for (col of gridColumns?.columns; track $index) {\r\n <col [style.width.px]=\"col.width\" [style.maxWidth.px]=\"col.width\">\r\n }\r\n </colgroup>\r\n <thead>\r\n <tr>\r\n @for (col of gridColumns?.columns; track $index) {\r\n <th class=\"text-truncate\">\r\n @if (col.headerTemplate) {\r\n <ng-container [ngTemplateOutlet]=\"col.headerTemplate\"></ng-container>\r\n }\r\n @else {\r\n <!-- <ng-template #defaultHeader><span [textContent]=\"col.field\"></span></ng-template> -->\r\n <!-- <span [textContent]=\"col.field\"></span> -->\r\n {{ col.headerText() }}\r\n }\r\n </th>\r\n }\r\n\r\n <!-- <th style=\"width: 20px;\"></th> -->\r\n </tr>\r\n </thead>\r\n\r\n </table>\r\n </div>\r\n <!-- Scrollable body in another div -->\r\n <div #gridBody class=\"grid-body\" (scroll)=\"syncScroll($event)\">\r\n @if(dataSource.length > 0){\r\n <table class=\"grid-table table table-bordered table-sm table-hover mb-0\" [ngClass]=\"_tableClass\">\r\n\r\n <colgroup>\r\n @for (col of gridColumns?.columns; track $index) {\r\n <col [style.width.px]=\"col.width\" [style.maxWidth.px]=\"col.width\">\r\n }\r\n </colgroup>\r\n <tbody>\r\n @for (row of dataSource; track $index; let i = $index) {\r\n <tr [class.table-active]=\"$index === selectedIndex\" (click)=\"onRowClick($index, row)\"\r\n (dblclick)=\"onRowDblClick($index, row)\">\r\n @for (col of gridColumns?.columns; track $index) {\r\n <td>\r\n @if (col.cellTemplate) {\r\n <ng-container [ngTemplateOutlet]=\"col.cellTemplate\" [ngTemplateOutletContext]=\"{ $implicit: row,\r\n rowIndex: (currentPage - 1) * pageSize + i,\r\n localIndex: i }\">\r\n </ng-container>\r\n } @else {\r\n <!-- {{ row[col.field] }} -->\r\n <span [textContent]=\"row[col.field]\"></span>\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n @else {\r\n No records found\r\n }\r\n\r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n @if(isPagingEnabled){\r\n <!-- Footer -->\r\n <div class=\"grid-footer\">\r\n <flex-pagination [rowCount]=\"_totalDataCount\" (pageChange)=\"onPageChanged($event)\"></flex-pagination>\r\n </div>\r\n }\r\n\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, Output, EventEmitter, OnInit, model, effect, input, output } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\ninterface DateOption {\r\n value: number | '';\r\n name: string;\r\n disabled?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'flex-combo-datepicker',\r\n imports: [FormsModule, CommonModule],\r\n templateUrl: './flex-combo-datepicker.component.html',\r\n styleUrls: ['./flex-combo-datepicker.component.css']\r\n})\r\n\r\nexport class ComboDatePickerComponent implements OnInit {\r\n // @Input() value: any = null; // ISO string\r\n @Input() ngMinDate?: string; // ISO string\r\n @Input() ngMaxDate?: string;\r\n @Input() ngMonths?: string[]; // optional month names\r\n @Input() ngOrder: 'dmy' | 'mdy' | 'ymd' = 'dmy';\r\n @Input() ngDisabled: boolean = false;\r\n @Input() ngPlaceholder: string | string[] = 'Day,Month,Year';\r\n\r\n dateChanged = output<any>();\r\n\r\n disabled = input<boolean>(false);\r\n\r\n value = model<any>();\r\n _value: any;\r\n\r\n day: number | '' = '';\r\n month: number | '' = '';\r\n year: number | '' = '';\r\n\r\n dates: DateOption[] = [];\r\n months: DateOption[] = [];\r\n years: DateOption[] = [];\r\n\r\n placeHolders: DateOption[] = [];\r\n\r\n cssClass = input<string>();\r\n\r\n showHeader = input<boolean>(true);\r\n dateTitle = input<string>();\r\n monthTitle = input<string>();\r\n yearTitle = input<string>();\r\n\r\n constructor() {\r\n effect(() => {\r\n this._value = this.value();\r\n this.initModel();\r\n this.updateDates();\r\n })\r\n }\r\n\r\n ngOnInit() {\r\n this.initPlaceholders();\r\n this.initMonths();\r\n this.initYears();\r\n // this.initModel();\r\n // this.updateDates();\r\n }\r\n\r\n private initPlaceholders() {\r\n let holders = Array.isArray(this.ngPlaceholder) ? this.ngPlaceholder : this.ngPlaceholder.split(',');\r\n if (holders.length === 3) {\r\n this.placeHolders = holders.map(h => ({ value: '', name: h, disabled: false }));\r\n }\r\n }\r\n\r\n private initMonths() {\r\n const monthNames = this.ngMonths && this.ngMonths.length === 12 ? this.ngMonths : ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'];\r\n this.months = monthNames.map((name, i) => ({ value: i + 1, name }));\r\n if (this.placeHolders.length) this.months.unshift(this.placeHolders[1]);\r\n }\r\n\r\n private initYears() {\r\n const currentYear = new Date().getFullYear();\r\n const minYear = this.ngMinDate ? new Date(this.ngMinDate).getFullYear() : currentYear - 100;\r\n const maxYear = this.ngMaxDate ? new Date(this.ngMaxDate).getFullYear() : currentYear;\r\n this.years = [];\r\n for (let y = minYear; y <= maxYear; y++) {\r\n this.years.push({ value: y, name: y.toString() });\r\n }\r\n if (this.placeHolders.length) this.years.unshift(this.placeHolders[2]);\r\n }\r\n\r\n private initModel() {\r\n if (this.value) {\r\n const date = new Date(this.value());\r\n this.day = date.getDate();\r\n this.month = date.getMonth() + 1;\r\n this.year = date.getFullYear();\r\n }\r\n }\r\n\r\n private updateDates() {\r\n const max = this.month && this.year ? this.getMaxDate(this.month, this.year) : 31;\r\n this.dates = [];\r\n if (this.placeHolders.length) this.dates.push(this.placeHolders[0]);\r\n for (let i = 1; i <= max; i++) {\r\n this.dates.push({ value: i, name: i.toString() });\r\n }\r\n }\r\n\r\n private getMaxDate(month: number, year: number) {\r\n if ([4, 6, 9, 11].includes(month)) return 30;\r\n if (month === 2) return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0) ? 29 : 28;\r\n return 31;\r\n }\r\n\r\n onChange() {\r\n this.updateDates();\r\n if (this.day && this.month && this.year) {\r\n const iso = this.toLocalISOString(new Date(this.year, this.month - 1, this.day));\r\n this.value.set(iso);\r\n this.dateChanged.emit(iso);\r\n }\r\n }\r\n\r\n toLocalISOString(date: Date): string {\r\n const pad = (n: number) => n.toString().padStart(2, '0');\r\n\r\n const year = date.getFullYear();\r\n const month = pad(date.getMonth() + 1);\r\n const day = pad(date.getDate());\r\n const hours = pad(date.getHours());\r\n const minutes = pad(date.getMinutes());\r\n const seconds = pad(date.getSeconds());\r\n //const ms = date.getMilliseconds().toString().padStart(3, '0');\r\n\r\n //return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}.${ms}`;\r\n return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`;\r\n }\r\n}\r\n","<div class=\"row g-1\">\r\n <div class=\"col-4\">\r\n @if(showHeader()){\r\n <label>\r\n @if (dateTitle()) {\r\n {{ dateTitle() }}\r\n }\r\n @else {\r\n Date\r\n }\r\n </label>\r\n }\r\n <select [(ngModel)]=\"day\" (ngModelChange)=\"onChange()\" [disabled]=\"ngDisabled\"\r\n [class]=\"'form-select ' + cssClass()\">\r\n <option *ngFor=\"let d of dates\" [value]=\"d.value\">{{ d.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-4\">\r\n @if(showHeader()){\r\n <label>\r\n @if (monthTitle()) {\r\n {{ monthTitle() }}\r\n }\r\n @else {\r\n Month\r\n }\r\n </label>\r\n }\r\n <select [(ngModel)]=\"month\" (ngModelChange)=\"onChange()\" [disabled]=\"ngDisabled\"\r\n [class]=\"'form-select ' + cssClass()\">\r\n <option *ngFor=\"let m of months\" [value]=\"m.value\">{{ m.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-4\">\r\n @if(showHeader()){\r\n <label>\r\n @if (yearTitle()) {\r\n {{ yearTitle() }}\r\n }\r\n @else {\r\n Year\r\n }\r\n </label>\r\n }\r\n <select [(ngModel)]=\"year\" (ngModelChange)=\"onChange()\" [disabled]=\"ngDisabled\"\r\n [class]=\"'form-select year ' + cssClass()\">\r\n <option *ngFor=\"let y of years\" [value]=\"y.value\">{{ y.name }}</option>\r\n </select>\r\n </div>\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nexport type HijriDate = { hy: number; hm: number; hd: number };\r\ntype DayCell = {\r\n g: Date;\r\n h: HijriDate;\r\n inCurrentMonth: boolean;\r\n disabled: boolean;\r\n};\r\n\r\n//\r\n// ✅ Umm al-Qura Hijri calendar with Latin digits\r\n//\r\nconst hijriFmt = new Intl.DateTimeFormat('en-u-ca-islamic-umalqura-nu-latn', {\r\n day: 'numeric',\r\n month: 'numeric',\r\n year: 'numeric'\r\n});\r\n\r\nconst hijriMonthNamesEn = [\r\n 'Muharram', 'Safar', 'Rabi I', 'Rabi II',\r\n 'Jumada I', 'Jumada II', 'Rajab', 'Sha’ban',\r\n 'Ramadan', 'Shawwal', 'Dhu al-Qi’dah', 'Dhu al-Hijjah'\r\n];\r\n\r\nconst hijriMonthNamesAr = [\r\n 'محرم', 'صفر', 'ربيع الأول', 'ربيع الآخر',\r\n 'جمادى الأولى', 'جمادى الآخرة', 'رجب', 'شعبان',\r\n 'رمضان', 'شوال', 'ذو القعدة', 'ذو الحجة'\r\n];\r\n\r\nconst weekDaysEn = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\r\nconst weekDaysAr = ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'];\r\n\r\nfunction hijriFromGregorian(g: Date): HijriDate {\r\n const parts = hijriFmt.formatToParts(g);\r\n //console.log(parts);\r\n const map: Record<string, string> = {};\r\n for (const p of parts) map[p.type] = p.value;\r\n const n = (k: string) => parseInt(map[k] ?? '0', 10);\r\n return { hy: n('year'), hm: n('month'), hd: n('day') };\r\n}\r\n\r\nfunction compareHijri(a: HijriDate, b: HijriDate) {\r\n if (a.hy !== b.hy) return a.hy - b.hy;\r\n if (a.hm !== b.hm) return a.hm - b.hm;\r\n return a.hd - b.hd;\r\n}\r\n\r\nfunction findGregorianForHijri(target: HijriDate): Date {\r\n let lo = new Date(1937, 0, 1).getTime();\r\n let hi = new Date(2076, 11, 31).getTime();\r\n const dayMs = 86400000;\r\n\r\n while (lo <= hi) {\r\n const mid = Math.floor((lo + hi) / 2);\r\n const h = hijriFromGregorian(new Date(mid));\r\n compareHijri(h, target) < 0 ? (lo = mid + dayMs) : (hi = mid - dayMs);\r\n }\r\n\r\n let d = new Date(lo);\r\n while (true) {\r\n const h = hijriFromGregorian(d);\r\n const cmp = compareHijri(h, target);\r\n if (cmp === 0) return d;\r\n if (cmp > 0) throw new Error('Hijri date out of supported range');\r\n d = new Date(d.getTime() + dayMs);\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'app-hijri-calendar',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: \"./hijri-calendar.component.html\",\r\n styleUrl: \"./hijri-calendar.component.css\"\r\n})\r\n\r\nexport class HijriCalendarComponent {\r\n /** Two-way bound selected date (Gregorian Date) */\r\n @Input() value: Date | null = null;\r\n @Output() valueChange = new EventEmitter<Date>();\r\n\r\n /** Optional min/max restrictions (Gregorian dates) */\r\n @Input() minDate: Date | null = null;\r\n @Input() maxDate: Date | null = null;\r\n\r\n /** Month + weekday language: 'en' or 'ar' */\r\n @Input() monthLang: 'en' | 'ar' = 'ar';\r\n\r\n hy = signal<number>(0);\r\n hm = signal<number>(0);\r\n\r\n selectedMonth = 1;\r\n selectedYear = 1447;\r\n yearRange: number[] = [];\r\n\r\n get hijriMonthsEn() {\r\n return hijriMonthNamesEn;\r\n }\r\n\r\n get hijriMonthsAr() {\r\n return hijriMonthNamesAr;\r\n }\r\n\r\n get hijriMonths() {\r\n return this.monthLang === 'ar' ? hijriMonthNamesAr : hijriMonthNamesEn;\r\n }\r\n\r\n get weekDays() {\r\n return this.monthLang === 'ar' ? weekDaysAr : weekDaysEn;\r\n }\r\n\r\n get weekDaysEn() {\r\n return weekDaysEn;\r\n }\r\n\r\n get weekDaysAr() {\r\n return weekDaysAr;\r\n }\r\n\r\n get currentMonthName() {\r\n return this.hijriMonths[this.selectedMonth - 1];\r\n }\r\n\r\n constructor() {\r\n const h = hijriFromGregorian(new Date());\r\n this.hy.set(h.hy);\r\n this.hm.set(h.hm);\r\n this.selectedYear = h.hy;\r\n this.selectedMonth = h.hm;\r\n }\r\n\r\n ngOnInit() {\r\n this.buildYearRange();\r\n }\r\n\r\n ngOnChanges() {\r\n if (this.value) {\r\n const h = hijriFromGregorian(this.value);\r\n this.hy.set(h.hy);\r\n this.hm.set(h.hm);\r\n this.selectedYear = h.hy;\r\n this.selectedMonth = h.hm;\r\n }\r\n this.buildYearRange();\r\n }\r\n\r\n buildYearRange() {\r\n const minH = this.minDate ? hijriFromGregorian(this.minDate) : { hy: 1356, hm: 1, hd: 1 };\r\n const maxH = this.maxDate ? hijriFromGregorian(this.maxDate) : { hy: 1499, hm: 12, hd: 30 };\r\n this.yearRange = [];\r\n for (let y = minH.hy; y <= maxH.hy; y++) {\r\n this.yearRange.push(y);\r\n }\r\n }\r\n\r\n onMonthYearChange() {\r\n this.hy.set(this.selectedYear);\r\n this.hm.set(this.selectedMonth);\r\n }\r\n\r\n firstOfMonth() {\r\n return findGregorianForHijri({ hy: this.hy(), hm: this.hm(), hd: 1 });\r\n }\r\n\r\n cells(): DayCell[] {\r\n const firstG = this.firstOfMonth();\r\n const firstH = hijriFromGregorian(firstG);\r\n\r\n const start = new Date(firstG);\r\n start.setDate(firstG.getDate() - firstG.getDay());\r\n\r\n const result: DayCell[] = [];\r\n for (let i = 0; i < 42; i++) {\r\n const g = new Date(start);\r\n g.setDate(start.getDate() + i);\r\n const h = hijriFromGregorian(g);\r\n\r\n let disabled = false;\r\n if (this.minDate && g < this.stripTime(this.minDate)) disabled = true;\r\n if (this.maxDate && g > this.stripTime(this.maxDate)) disabled = true;\r\n\r\n result.push({\r\n g,\r\n h,\r\n inCurrentMonth: h.hy === firstH.hy && h.hm === firstH.hm,\r\n disabled\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n prevMonth() {\r\n if (!this.canPrev()) return;\r\n let m = this.hm(), y = this.hy();\r\n if (--m < 1) { m = 12; y--; }\r\n this.hm.set(m); this.hy.set(y);\r\n this.selectedYear = y;\r\n this.selectedMonth = m;\r\n }\r\n\r\n nextMonth() {\r\n if (!this.canNext()) return;\r\n let m = this.hm(), y = this.hy();\r\n if (++m > 12) { m = 1; y++; }\r\n this.hm.set(m); this.hy.set(y);\r\n this.selectedYear = y;\r\n this.selectedMonth = m;\r\n }\r\n\r\n canPrev(): boolean {\r\n if (!this.minDate) return true;\r\n const minH = hijriFromGregorian(this.stripTime(this.minDate));\r\n return this.hy() > minH.hy || (this.hy() === minH.hy && this.hm() > minH.hm);\r\n }\r\n\r\n canNext(): boolean {\r\n if (!this.maxDate) return true;\r\n const maxH = hijriFromGregorian(this.stripTime(this.maxDate));\r\n return this.hy() < maxH.hy || (this.hy() === maxH.hy && this.hm() < maxH.hm);\r\n }\r\n\r\n isToday(g: Date) {\r\n const t = new Date();\r\n return g.getFullYear() === t.getFullYear()\r\n && g.getMonth() === t.getMonth()\r\n && g.getDate() === t.getDate();\r\n }\r\n\r\n isSelected(g: Date) {\r\n return !!this.value &&\r\n g.getFullYear() === this.value.getFullYear() &&\r\n g.getMonth() === this.value.getMonth() &&\r\n g.getDate() === this.value.getDate();\r\n }\r\n\r\n select(c: DayCell) {\r\n if (c.disabled) return;\r\n\r\n //console.log(c);\r\n\r\n this.value = c.g;\r\n this.valueChange.emit(this.value);\r\n }\r\n\r\n private stripTime(d: Date): Date {\r\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\r\n }\r\n}\r\n","<div class=\"card border-0 p-0\">\r\n <div class=\"card-header p-1\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <button class=\"btn btn-sm\" (click)=\"prevMonth()\" [disabled]=\"!canPrev()\">&laquo;</button>\r\n <div class=\"d-flex justify-content-center gap-1\">\r\n <select class=\"form-select form-select-sm w-auto\" [(ngModel)]=\"selectedMonth\"\r\n (change)=\"onMonthYearChange()\">\r\n @for (m of hijriMonths; track $index) {\r\n <option [value]=\"$index + 1\">{{ hijriMonthsAr[$index] }} ({{ hijriMonthsEn[$index] }})</option>\r\n }\r\n </select>\r\n <select class=\"form-select form-select-sm w-auto\" [(ngModel)]=\"selectedYear\"\r\n (change)=\"onMonthYearChange()\">\r\n @for (y of yearRange; track y) {\r\n <option [value]=\"y\">{{ y }}</option>\r\n }\r\n </select>\r\n </div>\r\n <button class=\"btn btn-sm\" (click)=\"nextMonth()\" [disabled]=\"!canNext()\">&raquo;</button>\r\n </div>\r\n </div>\r\n <div class=\"card-body p-1\">\r\n\r\n\r\n <!-- month/year pickers -->\r\n\r\n\r\n <!-- weekday labels -->\r\n <div class=\"grid\">\r\n @for (w of weekDays; track $index) {\r\n <div class=\"col fw-bold border pb-1\">{{ w }}</div>\r\n }\r\n\r\n </div>\r\n\r\n <!-- calendar cells -->\r\n <div class=\"grid\">\r\n <button *ngFor=\"let c of cells()\" class=\"cell btn rounded-0\" [class.muted]=\"!c.inCurrentMonth\"\r\n [class.today]=\"isToday(c.g)\" [class.selected]=\"isSelected(c.g)\" [disabled]=\"c.disabled\"\r\n (click)=\"select(c)\">\r\n {{ c.h.hd }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>","import { Injectable } from '@angular/core';\r\nimport dayjs from 'dayjs';\r\nimport calendarSystems, { CalendarSystem } from '@calidy/dayjs-calendarsystems';\r\nimport PersianCalendarSystem from '@calidy/dayjs-calendarsystems/calendarSystems/PersianCalendarSystem';\r\nimport HijriCalendarSystem from '@calidy/dayjs-calendarsystems/calendarSystems/HijriCalendarSystem';\r\nimport customParseFormat from 'dayjs/plugin/customParseFormat';\r\nimport { FlexCalendarSystem } from '../core/types/flex-calendar-system.type';\r\n\r\n// Extend Day.js with calendar systems support\r\ndayjs.extend(calendarSystems);\r\ndayjs.extend(customParseFormat);\r\n\r\n// Register the Persian calendar\r\ndayjs.registerCalendarSystem('persian', new PersianCalendarSystem());\r\n\r\ndayjs.registerCalendarSystem('islamic', new HijriCalendarSystem());\r\n\r\n\r\n\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DateServiceService {\r\n\r\n\r\n\r\n\r\n log(date: Date) {\r\n //var dj = dayjs(date);\r\n // // Convert current date to Persian calendar\r\n // const persianDate = dj.toCalendarSystem('persian');\r\n // console.log(persianDate.format('YYYY-MM-DD')); // Example: \"1403-08-15\"\r\n\r\n // // Create a date from Persian calendar\r\n // const nowruz = dayjs.fromCalendarSystem('persian', 1403, 1, 1);\r\n // console.log(nowruz.format('YYYY-MM-DD')); // \"2024-03-20\"\r\n\r\n\r\n\r\n // const hijriDate = dj.toCalendarSystem('islamic');\r\n // console.log(hijriDate.format('YYYY-MM-DD')); // e.g., \"1446-03-15\"\r\n\r\n //Step 1: User will input gregorian or islamic(hijri) date. for this we will use customParseFormat\r\n //in the control we will specify the format using binding.\r\n const d = dayjs(\"18-05-1447\", \"DD-MM-YYYY\");\r\n //we are writing this to parse the date , month, year only.\r\n //then based on the calender type we will decide.\r\n //but by default system will take gregorian\r\n const customDate = dayjs.fromCalendarSystem('islamic', d.year(), d.month() + 1, d.date() as number);\r\n //here we are assuming the control want to handle islamic calender date, we will take it dynmically.\r\n console.log(\"Prased Date in Gregorian String as per format ['DD-MM-YYYY']:\", customDate.format('DD-MM-YYYY'));\r\n //here it will show gregorian calender, because even if we parse using islamic calender, it will convert the date\r\n //and keep it to gregorian\r\n //to show islamic date, we have to tell the dayjs to use islamic calender\r\n console.log(\"Hijri Date String: \", customDate.toCalendarSystem('islamic').format('YYYY-MM-DD'));\r\n\r\n // console.log(d.format(\"DD/MM/YYYY\"));\r\n // console.log(d.date());\r\n // console.log(d.month() + 1);\r\n // console.log(d.year());\r\n // console.log(d.toDate());\r\n\r\n // const d2 = dayjs(\"09-11-2025\", \"DD-MM-YYYY\");\r\n // console.log(d2.format(\"DD/MM/YYYY\"));\r\n // console.log(d2.date());\r\n // console.log(d2.month() + 1);\r\n // console.log(d2.year());\r\n // console.log(d2.toDate());\r\n\r\n // // Create a Day.js instance from a specific calendar system\r\n // const hijriCustomDate = dayjs.fromCalendarSystem('islamic', 1447, 5, 18);\r\n // console.log(hijriCustomDate.toString());\r\n\r\n // // The result is a standard Day.js instance in that calendar system\r\n // console.log(hijriCustomDate.toCalendarSystem('islamic').format('YYYY-MM-DD')); // In Persian: \"1403-01-01\"\r\n\r\n // // Convert to Gregorian to see the equivalent date\r\n // const gregorian = hijriCustomDate.toCalendarSystem('gregory');\r\n // console.log(gregorian.format('YYYY-MM-DD')); // \"2024-03-20\"\r\n\r\n }\r\n\r\n parse(dateString: string, calendar: FlexCalendarSystem, format: string): Date | null | undefined {\r\n //Step 1: User will input gregorian or islamic(hijri) date. for this we will use customParseFormat\r\n //in the control we will specify the format using binding.\r\n const d = dayjs(dateString, format);\r\n if (!d.isValid()) {\r\n\r\n console.log(dateString, calendar, format, \"is invalid\");\r\n return null;\r\n }\r\n //we are writing this to parse the date , month, year only.\r\n //then based on the calender type we will decide.\r\n //but by default system will take gregorian\r\n const customDate = dayjs.fromCalendarSystem(calendar, d.year(), d.month() + 1, d.date() as number);\r\n //here we are assuming the control want to handle islamic calender date, we will take it dynmically.\r\n console.log(\"Prased Date in Gregorian String as per format ['DD-MM-YYYY']:\", customDate.format('DD-MM-YYYY'));\r\n //here it will show gregorian calender, because even if we parse using islamic calender, it will convert the date\r\n //and keep it to gregorian\r\n //to show islamic date, we have to tell the dayjs to use islamic calender\r\n console.log(\"Hijri Date String: \", customDate.toCalendarSystem('islamic').format('YYYY-MM-DD'));\r\n return customDate.toDate();\r\n }\r\n\r\n format(date: Date, calendar: FlexCalendarSystem, format: string): string {\r\n const d = dayjs(date);\r\n return d.toCalendarSystem(calendar).format(format);\r\n }\r\n}\r\n\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, effect, ElementRef, HostListener, input, model, OnInit, output, ViewChild } from '@angular/core';\r\nimport { HijriCalendarComponent } from \"../flex-hijri-calendar/hijri-calendar.component\";\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nimport dayjs from \"dayjs\";\r\nimport { FlexCalendarSystem } from '../../core/types/flex-calendar-system.type';\r\nimport { DateServiceService } from '../../services/date-service.service';\r\n\r\n\r\n@Component({\r\n selector: 'app-hijri-datepicker',\r\n imports: [CommonModule, FormsModule, HijriCalendarComponent],\r\n templateUrl: './hijri-datepicker.component.html',\r\n styleUrl: './hijri-datepicker.component.css'\r\n})\r\n\r\nexport class HijriDatepickerComponent {\r\n value = model<any>();\r\n\r\n selectedDate?: Date;\r\n showCalendar: boolean = false;\r\n\r\n calender = input<FlexCalendarSystem>(\"gregory\");\r\n enabled = input<boolean>(true);\r\n cssClass = input<string>();\r\n format = input<string>(\"DD/MM/YYYY\");\r\n\r\n inputDate: string = \"\";\r\n isMobile = false;\r\n\r\n\r\n constructor(private dateService: DateServiceService) {\r\n\r\n\r\n\r\n effect(() => {\r\n const iso = this.value();\r\n if (iso) {\r\n const date = dayjs(iso);\r\n if (date.isValid()) {\r\n this.selectedDate = date.toDate();\r\n this.inputDate = this.formatDate(this.selectedDate, this.calender(), this.format());\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.selectedDate = undefined;\r\n this.inputDate = \"\";\r\n });\r\n }\r\n\r\n toggleCalendar() {\r\n this.showCalendar = !this.showCalendar;\r\n }\r\n\r\n onDateSelectedFromCalender(e: Date) {\r\n // console.log(\"onDateSelectedFromCalender: \", e);\r\n this.dateService.log(e);\r\n //var time = this.selectedDate ?? new Date();\r\n\r\n // e.setHours(time.getHours());\r\n // e.setMinutes(time.getMinutes());\r\n\r\n //this.updateDate(e);\r\n //this.showCalendar = false;\r\n\r\n // console.log(e);\r\n }\r\n\r\n /** Triggered on blur OR Enter key */\r\n onManualDateEntered() {\r\n if (!this.inputDate) return;\r\n\r\n const parsed = this.parseInputDate(this.inputDate);\r\n if (parsed) {\r\n this.updateDate(parsed);\r\n } else {\r\n console.warn(\"Invalid date entered:\", this.inputDate);\r\n }\r\n }\r\n\r\n /** Reusable update method */\r\n private updateDate(d: Date) {\r\n this.selectedDate = d;\r\n //this.inputDate = this.formatDateForInput(d);\r\n this.value.set(d);\r\n //this.valueChange.emit(d);\r\n }\r\n\r\n formatDate(date: Date, calender: FlexCalendarSystem, format: string): string {\r\n return this.dateService.format(date, calender, format);\r\n }\r\n\r\n // private formatDateForInput(date: Date): string {\r\n // const fmt = this.format()?.toUpperCase() ?? \"DD/MM/YYYY\";\r\n // //return dayjs(date).format(fmt);\r\n // return this.formatDate(date, fmt);\r\n // }\r\n\r\n private parseInputDate(str: string): Date | null {\r\n\r\n const fmt = this.format()?.toUpperCase() ?? \"DD/MM/YYYY\";\r\n\r\n console.log(str, \"-\", fmt);\r\n\r\n const d = dayjs(str, fmt); // strict parse\r\n\r\n console.log(d.toDate());\r\n\r\n if (!d.isValid()) return null;\r\n\r\n\r\n\r\n if (!this.selectedDate) {\r\n this.selectedDate = new Date();\r\n }\r\n\r\n // gd.set(\"hour\", this.selectedDate.getHours());\r\n // gd.set(\"minute\", this.selectedDate.getMinutes());\r\n // gd.set(\"second\", this.selectedDate.getSeconds());\r\n\r\n return null;\r\n }\r\n\r\n\r\n @ViewChild(\"inputDiv\") inputDiv?: ElementRef;\r\n @ViewChild(\"modalDiv\") modalDiv?: ElementRef;\r\n @ViewChild(\"popupDiv\") popupDiv?: ElementRef;\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent) {\r\n if (this.inputDiv?.nativeElement.contains(event.target)\r\n || this.modalDiv?.nativeElement.contains(event.target)\r\n || this.popupDiv?.nativeElement.contains(event.target)) {\r\n return\r\n }\r\n this.showCalendar = false;\r\n }\r\n}\r\n","<div class=\"input-group flex-nowrap\" #inputDiv>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"inputDate\" (blur)=\"onManualDateEntered()\"\r\n [disabled]=\"!enabled()\" [placeholder]=\"format()\" (keyup.enter)=\"onManualDateEntered()\">\r\n\r\n <button class=\"btn btn-outline-secondary\" type=\"button\" (click)=\"toggleCalendar()\" [disabled]=\"!enabled()\">\r\n <i class=\"bi bi-calendar3\"></i>\r\n </button>\r\n</div>\r\n\r\n@if(showCalendar){\r\n@if(isMobile){\r\n<div class=\"modal modal-backdrop\" tabindex=\"-1\" role=\"dialog\" style=\"display: block;\" #modalDiv>\r\n <div class=\"modal-dialog modal-dialog-scrollable\" role=\"document\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"btn btn-danger close ms-auto btn-sm\" (click)=\"showCalendar = false\">\r\n <i class=\"bi bi-x\"></i>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n@else{\r\n<div class=\"dropdown-menu show\" #popupDiv>\r\n <app-hijri-calendar (valueChange)=\"onDateSelectedFromCalender($event)\"></app-hijri-calendar>\r\n</div>\r\n}\r\n}","import { CommonModule } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n Component,\r\n ContentChild,\r\n ElementRef,\r\n Renderer2,\r\n TemplateRef,\r\n ViewChild,\r\n OnDestroy,\r\n HostListener\r\n} from '@angular/core';\r\n\r\n@Component({\r\n selector: 'flex-container',\r\n templateUrl: './flex-container.component.html',\r\n styleUrls: ['./flex-container.component.css'],\r\n imports: [CommonModule]\r\n})\r\n\r\nexport class FlexContainerComponent implements AfterViewInit, OnDestroy {\r\n @ViewChild('contentHost') contentHost!: ElementRef<HTMLDivElement>;\r\n //private resizeHandler!: () => void;\r\n\r\n // Allow consumer to provide templates\r\n @ContentChild('header') headerTpl!: TemplateRef<any>;\r\n @ContentChild('footer') footerTpl!: TemplateRef<any>;\r\n @ContentChild('content') contentTpl!: TemplateRef<any>;\r\n\r\n constructor(private renderer: Renderer2) { }\r\n\r\n ngAfterViewInit(): void {\r\n this.resizeContent();\r\n //this.resizeHandler = this.resizeContent.bind(this);\r\n //window.addEventListener('resize', this.resizeHandler);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // if (this.resizeHandler) {\r\n // window.removeEventListener('resize', this.resizeHandler);\r\n // }\r\n }\r\n\r\n\r\n @HostListener('window:resize')\r\n onWindowResize() {\r\n this.resizeContent();\r\n }\r\n\r\n private resizeContent() {\r\n const parent = this.contentHost.nativeElement.parentElement;\r\n if (!parent) return;\r\n\r\n const parentHeight = parent.clientHeight;\r\n const headerHeight = this.contentHost.nativeElement.previousElementSibling?.clientHeight || 0;\r\n const footerHeight = this.contentHost.nativeElement.nextElementSibling?.clientHeight || 0;\r\n\r\n const available = parentHeight - headerHeight - footerHeight;\r\n\r\n this.renderer.setStyle(this.contentHost.nativeElement, 'height', `${available}px`);\r\n this.renderer.setStyle(this.contentHost.nativeElement, 'width', `${parent.clientWidth}px`);\r\n }\r\n}\r\n","<div class=\"flex-container\">\r\n @if(headerTpl){\r\n <div class=\"header\">\r\n <ng-container *ngTemplateOutlet=\"headerTpl\"></ng-container>\r\n </div>\r\n }\r\n\r\n\r\n <div #contentHost class=\"content\">\r\n <ng-container *ngTemplateOutlet=\"contentTpl\"></ng-container>\r\n </div>\r\n @if(footerTpl){\r\n <div class=\"footer\">\r\n <ng-container *ngTemplateOutlet=\"footerTpl\"></ng-container>\r\n </div>\r\n }\r\n\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FlexCalendarSystem } from '../core/types/flex-calendar-system.type';\r\n\r\nexport type HijriDate = { hy: number; hm: number; hd: number };\r\ntype DayCell = {\r\n g: Date; // always Gregorian Date\r\n h: HijriDate; // mapped Hijri for display\r\n inCurrentMonth: boolean;\r\n disabled: boolean;\r\n};\r\n\r\n// ✅ Intl formatters\r\nconst hijriFmt = new Intl.DateTimeFormat('en-u-ca-islamic-umalqura-nu-latn', {\r\n day: 'numeric',\r\n month: 'numeric',\r\n year: 'numeric'\r\n});\r\n\r\nconst hijriMonthNamesEn = [\r\n 'Muharram', 'Safar', 'Rabi I', 'Rabi II',\r\n 'Jumada I', 'Jumada II', 'Rajab', 'Sha’ban',\r\n 'Ramadan', 'Shawwal', 'Dhu al-Qi’dah', 'Dhu al-Hijjah'\r\n];\r\n\r\nconst hijriMonthNamesAr = [\r\n 'محرم', 'صفر', 'ربيع الأول', 'ربيع الآخر',\r\n 'جمادى الأولى', 'جمادى الآخرة', 'رجب', 'شعبان',\r\n 'رمضان', 'شوال', 'ذو القعدة', 'ذو الحجة'\r\n];\r\n\r\nconst gregMonthNamesEn = [\r\n 'January', 'February', 'March', 'April', 'May', 'June',\r\n 'July', 'August', 'September', 'October', 'November', 'December'\r\n];\r\n\r\nconst gregMonthNamesAr = [\r\n 'يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو',\r\n 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'\r\n];\r\n\r\nconst weekDaysEn = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\r\nconst weekDaysAr = ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'];\r\n\r\nfunction hijriFromGregorian(g: Date): HijriDate {\r\n const parts = hijriFmt.formatToParts(g);\r\n const map: Record<string, string> = {};\r\n for (const p of parts) map[p.type] = p.value;\r\n const n = (k: string) => parseInt(map[k] ?? '0', 10);\r\n return { hy: n('year'), hm: n('month'), hd: n('day') };\r\n}\r\nfunction compareHijri(a: HijriDate, b: HijriDate) {\r\n if (a.hy !== b.hy) return a.hy - b.hy;\r\n if (a.hm !== b.hm) return a.hm - b.hm;\r\n return a.hd - b.hd;\r\n}\r\nfunction findGregorianForHijri(target: HijriDate): Date {\r\n let lo = new Date(1937, 0, 1).getTime();\r\n let hi = new Date(2076, 11, 31).getTime();\r\n const dayMs = 86400000;\r\n while (lo <= hi) {\r\n const mid = Math.floor((lo + hi) / 2);\r\n const h = hijriFromGregorian(new Date(mid));\r\n compareHijri(h, target) < 0 ? (lo = mid + dayMs) : (hi = mid - dayMs);\r\n }\r\n let d = new Date(lo);\r\n while (true) {\r\n const h = hijriFromGregorian(d);\r\n const cmp = compareHijri(h, target);\r\n if (cmp === 0) return d;\r\n if (cmp > 0) throw new Error('Hijri date out of supported range');\r\n d = new Date(d.getTime() + dayMs);\r\n }\r\n}\r\nfunction stripTime(d: Date): Date {\r\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\r\n}\r\n\r\n\r\n@Component({\r\n selector: 'flex-dual-calendar',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './flex-dual-calendar.component.html',\r\n styleUrls: ['./flex-dual-calendar.component.css']\r\n})\r\nexport class FlexDualCalendarComponent {\r\n /** Two-way bound selected date (Gregorian) */\r\n @Input() value?: Date;\r\n @Output() valueChange = new EventEmitter<Date>();\r\n\r\n /** Optional min/max (Gregorian) */\r\n @Input() minDate?: Date;\r\n @Input() maxDate?: Date;\r\n\r\n /** Month/weekday language */\r\n @Input() monthLang: 'en' | 'ar' = 'en';\r\n\r\n /** Start mode, default Hijri */\r\n @Input() startMode: FlexCalendarSystem = 'gregory';\r\n\r\n // This will be injected by FloatingUiService\r\n close!: (result?: any) => void;\r\n\r\n /** Current mode (hijri | gregory) */\r\n mode = signal<FlexCalendarSystem>('gregory');\r\n\r\n /** Hijri view state */\r\n hy = signal<number>(0);\r\n hm = signal<number>(0);\r\n\r\n /** Gregorian view state */\r\n gy = signal<number>(0);\r\n gm = signal<number>(0); // 1..12\r\n\r\n /** selectors */\r\n selectedMonth = 1;\r\n selectedYear = 1447;\r\n yearRange: number[] = [];\r\n\r\n // ---- getters for UI ----\r\n get hijriMonths() {\r\n return this.monthLang === 'ar' ? hijriMonthNamesAr : hijriMonthNamesEn;\r\n }\r\n get gregMonths() {\r\n return this.monthLang === 'ar' ? gregMonthNamesAr : gregMonthNamesEn;\r\n }\r\n get weekDays() {\r\n return this.monthLang === 'ar' ? weekDaysAr : weekDaysEn;\r\n }\r\n get currentMonthName() {\r\n return this.mode() === 'islamic'\r\n ? this.hijriMonths[this.selectedMonth - 1]\r\n : this.gregMonths[this.selectedMonth - 1];\r\n }\r\n\r\n constructor() {\r\n const today = new Date();\r\n const h = hijriFromGregorian(today);\r\n this.hy.set(h.hy);\r\n this.hm.set(h.hm);\r\n this.gy.set(today.getFullYear());\r\n this.gm.set(today.getMonth() + 1);\r\n\r\n // initialize selectors with start mode\r\n this.mode.set(this.startMode);\r\n if (this.mode() === 'islamic') {\r\n this.selectedYear = this.hy();\r\n this.selectedMonth = this.hm();\r\n } else {\r\n this.selectedYear = this.gy();\r\n this.selectedMonth = this.gm();\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.buildYearRange();\r\n }\r\n\r\n ngOnChanges(changes: any) {\r\n // If value changed from outside, update both calendars\r\n if (changes['value'] && this.value instanceof Date) {\r\n const g = stripTime(this.value);\r\n const h = hijriFromGregorian(g);\r\n\r\n this.gy.set(g.getFullYear());\r\n this.gm.set(g.getMonth() + 1);\r\n\r\n this.hy.set(h.hy);\r\n this.hm.set(h.hm);\r\n\r\n // Update dropdowns based on current mode\r\n if (this.mode() === 'islamic') {\r\n this.selectedYear = this.hy();\r\n this.selectedMonth = this.hm();\r\n } else {\r\n this.selectedYear = this.gy();\r\n this.selectedMonth = this.gm();\r\n }\r\n }\r\n\r\n // Rebuild year range if min/max changed\r\n if (changes['minDate'] || changes['maxDate'] || changes['value']) {\r\n this.buildYearRange();\r\n }\r\n }\r\n\r\n\r\n // Build years based on min/max expressed in Hijri for Hijri mode, Gregorian for Gregorian mode\r\n buildYearRange() {\r\n if (this.mode() === 'islamic') {\r\n const minH = this.minDate ? hijriFromGregorian(stripTime(this.minDate)) : { hy: 1356, hm: 1, hd: 1 };\r\n const maxH = this.maxDate ? hijriFromGregorian(stripTime(this.maxDate)) : { hy: 1499, hm: 12, hd: 30 };\r\n this.yearRange = [];\r\n for (let y = minH.hy; y <= maxH.hy; y++) this.yearRange.push(y);\r\n } else {\r\n const minG = this.minDate ? stripTime(this.minDate) : new Date(1937, 0, 1);\r\n const maxG = this.maxDate ? stripTime(this.maxDate) : new Date(2076, 11, 31);\r\n this.yearRange = [];\r\n for (let y = minG.getFullYear(); y <= maxG.getFullYear(); y++) this.yearRange.push(y);\r\n }\r\n }\r\n\r\n // 🔁 Mode switch (SYNCED view — keep same instant)\r\n switchMode(value: FlexCalendarSystem) {\r\n const pivot = this.value ?? this.firstOfMonth(); // use selected date or current view start\r\n if (value === 'gregory') {\r\n // To Gregorian mode\r\n const g = stripTime(pivot);\r\n this.gy.set(g.getFullYear());\r\n this.gm.set(g.getMonth() + 1);\r\n this.mode.set('gregory');\r\n this.selectedYear = this.gy();\r\n this.selectedMonth = this.gm();\r\n } else {\r\n // To Hijri mode\r\n const h = hijriFromGregorian(stripTime(pivot));\r\n this.hy.set(h.hy);\r\n this.hm.set(h.hm);\r\n this.mode.set('islamic');\r\n this.selectedYear = this.hy();\r\n this.selectedMonth = this.hm();\r\n }\r\n this.buildYearRange();\r\n }\r\n\r\n // called when dropdowns change\r\n onMonthYearChange() {\r\n if (this.mode() === 'islamic') {\r\n this.hy.set(this.selectedYear);\r\n this.hm.set(this.selectedMonth);\r\n } else {\r\n this.gy.set(this.selectedYear);\r\n this.gm.set(this.selectedMonth);\r\n }\r\n }\r\n\r\n // Start of visible month (Gregorian date)\r\n firstOfMonth(): Date {\r\n if (this.mode() === 'islamic') {\r\n return findGregorianForHijri({ hy: this.hy(), hm: this.hm(), hd: 1 });\r\n }\r\n return new Date(this.gy(), this.gm() - 1, 1);\r\n }\r\n\r\n // Calendar cells for current view\r\n cells(): DayCell[] {\r\n const firstG = this.firstOfMonth();\r\n const firstH = hijriFromGregorian(firstG);\r\n\r\n // grid start (Sunday-first; adjust if you want Saturday-first)\r\n const start = new Date(firstG);\r\n start.setDate(firstG.getDate() - firstG.getDay());\r\n\r\n const result: DayCell[] = [];\r\n for (let i = 0; i < 42; i++) {\r\n const g = new Date(start);\r\n g.setDate(start.getDate() + i);\r\n const h = hijriFromGregorian(g);\r\n\r\n let disabled = false;\r\n if (this.minDate && g < stripTime(this.minDate)) disabled = true;\r\n if (this.maxDate && g > stripTime(this.maxDate)) disabled = true;\r\n\r\n const inCurrentMonth =\r\n this.mode() === 'islamic'\r\n ? (h.hy === firstH.hy && h.hm === firstH.hm)\r\n : (g.getFullYear() === firstG.getFullYear() && g.getMonth() === firstG.getMonth());\r\n\r\n result.push({ g, h, inCurrentMonth, disabled });\r\n }\r\n return result;\r\n }\r\n\r\n prevMonth() {\r\n if (!this.canPrev()) return;\r\n if (this.mode() === 'islamic') {\r\n let m = this.hm(), y = this.hy();\r\n if (--m < 1) { m = 12; y--; }\r\n this.hm.set(m); this.hy.set(y);\r\n this.selectedYear = y; this.selectedMonth = m;\r\n } else {\r\n let m = this.gm(), y = this.gy();\r\n if (--m < 1) { m = 12; y--; }\r\n this.gm.set(m); this.gy.set(y);\r\n this.selectedYear = y; this.selectedMonth = m;\r\n }\r\n }\r\n nextMonth() {\r\n if (!this.canNext()) return;\r\n if (this.mode() === 'islamic') {\r\n let m = this.hm(), y = this.hy();\r\n if (++m > 12) { m = 1; y++; }\r\n this.hm.set(m); this.hy.set(y);\r\n this.selectedYear = y; this.selectedMonth = m;\r\n } else {\r\n let m = this.gm(), y = this.gy();\r\n if (++m > 12) { m = 1; y++; }\r\n this.gm.set(m); this.gy.set(y);\r\n this.selectedYear = y; this.selectedMonth = m;\r\n }\r\n }\r\n\r\n canPrev(): boolean {\r\n if (!this.minDate) return true;\r\n const minG = stripTime(this.minDate);\r\n const viewFirst = this.firstOfMonth();\r\n // Can go prev if the first day of previous month is >= minG\r\n const prev = new Date(viewFirst.getFullYear(), viewFirst.getMonth() - 1, 1);\r\n return prev >= new Date(minG.getFullYear(), minG.getMonth(), 1);\r\n }\r\n canNext(): boolean {\r\n if (!this.maxDate) return true;\r\n const maxG = stripTime(this.maxDate);\r\n const viewFirst = this.firstOfMonth();\r\n const next = new Date(viewFirst.getFullYear(), viewFirst.getMonth() + 1, 1);\r\n // move to the first of the month after max\r\n const maxMonthAfter = new Date(maxG.getFullYear(), maxG.getMonth() + 1, 1);\r\n return next < maxMonthAfter;\r\n }\r\n\r\n isToday(g: Date) {\r\n const t = new Date();\r\n return g.getFullYear() === t.getFullYear()\r\n && g.getMonth() === t.getMonth()\r\n && g.getDate() === t.getDate();\r\n }\r\n isSelected(g: Date) {\r\n return !!this.value &&\r\n g.getFullYear() === this.value.getFullYear() &&\r\n g.getMonth() === this.value.getMonth() &&\r\n g.getDate() === this.value.getDate();\r\n }\r\n\r\n select(c: DayCell) {\r\n if (c.disabled) return;\r\n this.value = stripTime(c.g);\r\n this.valueChange.emit(this.value);\r\n // keep both views in sync after selection\r\n const h = hijriFromGregorian(this.value);\r\n this.hy.set(h.hy); this.hm.set(h.hm);\r\n this.gy.set(this.value.getFullYear()); this.gm.set(this.value.getMonth() + 1);\r\n if (this.mode() === 'islamic') {\r\n this.selectedYear = this.hy(); this.selectedMonth = this.hm();\r\n } else {\r\n this.selectedYear = this.gy(); this.selectedMonth = this.gm();\r\n }\r\n\r\n this.close(this.value)\r\n }\r\n}\r\n","<div class=\"card\">\r\n <div class=\"card-header p-1\">\r\n <div class=\"d-flex gap-1\">\r\n\r\n <div>\r\n <button class=\"btn btn-sm w-100 \" (click)=\"prevMonth()\" [disabled]=\"!canPrev()\"><i\r\n class=\"bi bi-caret-left-fill\"></i></button>\r\n </div>\r\n <div class=\"flex-grow-1\">\r\n <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedMonth\" (change)=\"onMonthYearChange()\">\r\n @if (mode() === 'islamic') {\r\n @for (m of hijriMonths; track $index) {\r\n <option [value]=\"$index + 1\">{{ hijriMonths[$index] }}-{{$index + 1}}</option>\r\n }\r\n } @else {\r\n @for (m of gregMonths; track $index) {\r\n <option [value]=\"$index + 1\">{{$index + 1}}-{{ gregMonths[$index] }}</option>\r\n }\r\n }\r\n </select>\r\n </div>\r\n <div> <select class=\"form-select form-select-sm\" [(ngModel)]=\"selectedYear\" (change)=\"onMonthYearChange()\">\r\n @for (y of yearRange; track y) {\r\n <option [value]=\"y\">{{ y }}</option>\r\n }\r\n </select></div>\r\n <div>\r\n <button class=\"btn btn-sm w-100 \" (click)=\"nextMonth()\" [disabled]=\"!canNext()\"><i\r\n class=\"bi bi-caret-right-fill\"></i></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card-body p-0\">\r\n <!-- Weekday labels -->\r\n <div class=\"grid\">\r\n @for (w of weekDays; track $index) {\r\n <div class=\"col fw-bold border pb-1\">{{ w }}</div>\r\n }\r\n </div>\r\n\r\n <!-- Calendar cells -->\r\n <div class=\"grid\">\r\n @for (c of cells(); track $index) {\r\n <div class=\"cell\">\r\n <button class=\"btn w-100\" [class.muted]=\"!c.inCurrentMonth\" [class.today]=\"isToday(c.g)\"\r\n [class.selected]=\"isSelected(c.g)\" [disabled]=\"c.disabled\" (click)=\"select(c)\">\r\n <!-- show Hijri day in Hijri mode, otherwise Gregorian -->\r\n @if(mode() === 'islamic'){\r\n {{ c.h.hd }}\r\n }\r\n @else{\r\n {{ c.g.getDate() }}\r\n }\r\n </button>\r\n </div>\r\n }\r\n\r\n </div>\r\n </div>\r\n <div class=\"card-footer px-0 py-1\">\r\n <div class=\"d-flex justify-content-center\">\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Basic example\">\r\n <button class=\"btn btn-sm btn-outline-secondary\" type=\"button\" (click)=\"switchMode('gregory')\">\r\n Gregorian\r\n </button>\r\n <button class=\"btn btn-sm btn-outline-secondary\" type=\"button\" (click)=\"switchMode('islamic')\">\r\n هجري\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>","import { Injectable } from '@angular/core';\r\n\r\nexport type DeviceType = 'mobile' | 'tablet' | 'desktop';\r\nexport type OS = 'iOS' | 'Android' | 'Windows' | 'MacOS' | 'Linux' | 'Other';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DeviceDetectorService {\r\n\r\n getDeviceType(): DeviceType {\r\n const ua = navigator.userAgent;\r\n if (/Mobi|Android/i.test(ua)) return 'mobile';\r\n if (/iPad|Tablet/i.test(ua)) return 'tablet';\r\n return 'desktop';\r\n }\r\n\r\n getOS(): OS {\r\n const ua = navigator.userAgent;\r\n if (/iPhone|iPad|iPod/i.test(ua)) return 'iOS';\r\n if (/Android/i.test(ua)) return 'Android';\r\n if (/Win/i.test(ua)) return 'Windows';\r\n if (/Mac/i.test(ua)) return 'MacOS';\r\n if (/Linux/i.test(ua)) return 'Linux';\r\n return 'Other';\r\n }\r\n\r\n isMobile(): boolean { return this.getDeviceType() === 'mobile'; }\r\n isTablet(): boolean { return this.getDeviceType() === 'tablet'; }\r\n isDesktop(): boolean { return this.getDeviceType() === 'desktop'; }\r\n}\r\n","import {\r\n ApplicationRef,\r\n ComponentRef,\r\n createComponent,\r\n EnvironmentInjector,\r\n Injectable,\r\n Type,\r\n} from '@angular/core';\r\nimport { computePosition, offset, flip, shift, autoUpdate } from '@floating-ui/dom';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FloatingUiService {\r\n private activePopup?: {\r\n compRef: ComponentRef<any>;\r\n cleanup: (result: any | null) => void;\r\n resolve: (result: any) => void;\r\n };\r\n\r\n constructor(\r\n private appRef: ApplicationRef,\r\n private injector: EnvironmentInjector\r\n ) { }\r\n\r\n /**\r\n * Opens a floating Angular component near a reference element.\r\n * Ensures only one popup is visible at a time.\r\n */\r\n async open<T, TResult = any>(\r\n reference: HTMLElement,\r\n component: Type<T>,\r\n options?: {\r\n inputs?: Record<string, any>;\r\n placement?: string;\r\n closeOnOutsideClick?: boolean;\r\n closeOnEscape?: boolean;\r\n }\r\n ): Promise<TResult | null> {\r\n // 🔹 If one is already open, close it first\r\n if (this.activePopup) {\r\n this.activePopup.cleanup(null);\r\n this.activePopup.resolve(null);\r\n this.activePopup = undefined;\r\n }\r\n\r\n return new Promise<TResult | null>((resolve) => {\r\n // 1️⃣ Create component\r\n const compRef = createComponent(component, {\r\n environmentInjector: this.injector,\r\n });\r\n\r\n // 2️⃣ Pass close() callback\r\n (compRef.instance as any).close = (result?: TResult) => cleanup(result ?? null);\r\n\r\n // 3️⃣ Apply input bindings\r\n if (options?.inputs) {\r\n Object.entries(options.inputs).forEach(([k, v]) => {\r\n (compRef.instance as any)[k] = v;\r\n });\r\n }\r\n\r\n // 4️⃣ Attach to DOM\r\n document.body.appendChild(compRef.location.nativeElement);\r\n this.appRef.attachView(compRef.hostView);\r\n\r\n // 5️⃣ Floating-UI position logic\r\n const cleanupAutoUpdate = autoUpdate(reference, compRef.location.nativeElement, () => {\r\n computePosition(reference, compRef.location.nativeElement, {\r\n placement: 'bottom-start',\r\n middleware: [offset(2), flip(), shift()],\r\n }).then(({ x, y }) => {\r\n Object.assign(compRef.location.nativeElement.style, {\r\n position: 'absolute',\r\n left: `${x}px`,\r\n top: `${y}px`,\r\n zIndex: '1080',\r\n });\r\n });\r\n });\r\n\r\n // 6️⃣ Close on outside click / ESC\r\n const handleClickOutside = (e: MouseEvent) => {\r\n const el = compRef.location.nativeElement;\r\n const target = e.target as Node;\r\n if (!el.contains(target) && !reference.contains(target)) {\r\n cleanup(null);\r\n }\r\n };\r\n\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') cleanup(null);\r\n };\r\n\r\n if (options?.closeOnOutsideClick !== false) {\r\n setTimeout(() => document.addEventListener('mousedown', handleClickOutside));\r\n }\r\n if (options?.closeOnEscape !== false) {\r\n document.addEventListener('keydown', handleEscape);\r\n }\r\n\r\n // 7️⃣ Cleanup logic\r\n const cleanup = (result: TResult | null) => {\r\n cleanupAutoUpdate();\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n document.removeEventListener('keydown', handleEscape);\r\n this.appRef.detachView(compRef.hostView);\r\n compRef.destroy();\r\n\r\n // release singleton lock\r\n this.activePopup = undefined;\r\n resolve(result);\r\n };\r\n\r\n // 🔸 Track current popup\r\n this.activePopup = { compRef, cleanup, resolve };\r\n });\r\n }\r\n\r\n /**\r\n * Closes the currently active floating popup, if any.\r\n */\r\n closeActive(result?: any) {\r\n if (this.activePopup) {\r\n this.activePopup.cleanup(null);\r\n this.activePopup.resolve(result ?? null);\r\n this.activePopup = undefined;\r\n }\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, effect, ElementRef, HostListener, input, model, ViewChild } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { computePosition, offset, flip, shift, autoPlacement, hide } from '@floating-ui/dom';\r\n\r\nimport dayjs from \"dayjs\";\r\nimport { FlexCalendarSystem } from '../core/types/flex-calendar-system.type';\r\nimport { DateServiceService } from '../services/date-service.service';\r\nimport { FlexDualCalendarComponent } from \"../flex-dual-calendar/flex-dual-calendar.component\";\r\nimport { FlexCalendarSystemSwitchPosition } from '../core/types/flex-calendar-system-switch-position.type';\r\nimport { DeviceDetectorService } from '../services/device-detector.service';\r\nimport { FloatingUiService } from '../services/floating-ui.service';\r\n\r\n@Component({\r\n selector: 'flex-dual-datepicker',\r\n imports: [CommonModule, FormsModule, FlexDualCalendarComponent],\r\n templateUrl: './flex-dual-datepicker.component.html',\r\n styleUrl: './flex-dual-datepicker.component.css'\r\n})\r\n\r\nexport class FlexDualDatepickerComponent {\r\n\r\n @ViewChild('calendarButton') calendarButton?: ElementRef;\r\n @ViewChild('calendarDropdown') calendarDropdown?: ElementRef;\r\n\r\n @ViewChild(\"inputDiv\") inputDiv?: ElementRef;\r\n @ViewChild(\"modalDiv\") modalDiv?: ElementRef;\r\n // @ViewChild(\"menu\") popupDiv?: ElementRef;\r\n\r\n value = model<any>();\r\n enabled = input<boolean>(true);\r\n cssClass = input<string>();\r\n format = input<string>(\"DD/MM/YYYY\");\r\n\r\n title = input<string>();\r\n calendarSwitchPosition = input<FlexCalendarSystemSwitchPosition>(\"title\");\r\n\r\n //selectedDate is needed to keep the current data for process\r\n selectedDate?: Date;\r\n\r\n calendar: FlexCalendarSystem = \"gregory\";\r\n\r\n inputDate: string = \"\";\r\n isMobile = false;\r\n\r\n\r\n constructor(private dateService: DateServiceService, private deviceDetector: DeviceDetectorService,\r\n private floating: FloatingUiService\r\n ) {\r\n this.isMobile = deviceDetector.isMobile();\r\n effect(() => {\r\n const iso = this.value();\r\n if (iso) {\r\n const date = dayjs(iso);\r\n if (date.isValid()) {\r\n this.selectedDate = date.toDate();\r\n this.inputDate = this.formatDate(this.selectedDate!);\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.selectedDate = undefined;\r\n this.inputDate = \"\";\r\n });\r\n }\r\n\r\n switchCalendar() {\r\n if (this.calendar == \"gregory\") {\r\n this.calendar = \"islamic\";\r\n }\r\n else {\r\n this.calendar = \"gregory\";\r\n }\r\n\r\n this.inputDate = this.formatDate(this.selectedDate!);\r\n }\r\n\r\n onDateSelectedFromCalender(e: Date) {\r\n this.inputDate = this.formatDate(e);\r\n\r\n this.updateDate(e);\r\n this.isOpen = false;\r\n this.updateCalendar();\r\n }\r\n\r\n /** Triggered on blur OR Enter key */\r\n onManualDateEntered() {\r\n if (!this.inputDate) return;\r\n\r\n const parsed = this.parseInputDate(this.inputDate);\r\n if (parsed) {\r\n this.updateDate(parsed);\r\n } else {\r\n console.warn(\"Invalid date entered:\", this.inputDate);\r\n }\r\n }\r\n\r\n /** Reusable update method */\r\n private updateDate(d: Date) {\r\n this.selectedDate = d;\r\n this.inputDate = this.formatDate(d);\r\n this.value.set(d);\r\n }\r\n\r\n formatDate(date: Date): string {\r\n return this.dateService.format(date, this.calendar, this.format());\r\n }\r\n\r\n private parseInputDate(str: string): Date | null | undefined {\r\n /*if the user clear the text in input box then we must accept as the user\r\n wants to remove date from the control so we will return null*/\r\n if (!str)\r\n return null;\r\n\r\n /*if any text entered in input box then we must try to parse it\r\n if parse success the date service will return the date else will return \r\n null or undefined.\r\n in this case since user entered some date may be he/she made mistake\r\n so we will should not show null or empty value, instead we will\r\n return current date or last selected date\r\n */\r\n var parsedDate = this.dateService.parse(str, this.calendar, this.format());\r\n if (parsedDate)\r\n return parsedDate;\r\n\r\n //if parseDate is null this means user entered wrong date, in this case we will return\r\n //the last selected date.\r\n if (this.selectedDate) {\r\n return this.selectedDate;\r\n }\r\n\r\n //if last selected date is also null then we will return current date.\r\n return new Date();\r\n }\r\n\r\n\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent) {\r\n if (this.inputDiv?.nativeElement.contains(event.target)\r\n || this.modalDiv?.nativeElement.contains(event.target)\r\n || this.calendarDropdown?.nativeElement.contains(event.target)) {\r\n return\r\n }\r\n this.isOpen = false;\r\n this.updateCalendar();\r\n }\r\n\r\n\r\n async openCalendar() {\r\n const button = this.calendarButton?.nativeElement!;\r\n\r\n const result = await this.floating.open(\r\n button,\r\n FlexDualCalendarComponent,\r\n {\r\n placement: 'bottom-start',\r\n inputs: {\r\n // You can pass any props here\r\n initialDate: this.selectedDate,\r\n },\r\n }\r\n );\r\n\r\n if (result) {\r\n //this.selectedDate = result;\r\n this.updateDate(result);\r\n }\r\n }\r\n\r\n\r\n isOpen = false;\r\n\r\n toggleMenu() {\r\n this.isOpen = !this.isOpen;\r\n\r\n if (this.isMobile)\r\n return;\r\n\r\n this.updateCalendar();\r\n }\r\n\r\n updateCalendar() {\r\n const button = this.calendarButton?.nativeElement!;\r\n const calendar = this.calendarDropdown?.nativeElement!;\r\n\r\n computePosition(button, calendar, {\r\n placement: \"bottom\",\r\n strategy: 'fixed',\r\n middleware: [flip(), shift(), hide()]\r\n }).then(({ x, y }) => {\r\n Object.assign(calendar.style, {\r\n left: `${x}px`,\r\n top: `${y}px`,\r\n visibility: !this.isOpen\r\n ? 'hidden'\r\n : 'visible',\r\n });\r\n });\r\n }\r\n}\r\n","@if(calendarSwitchPosition() == 'title'){\r\n<div class=\"d-flex align-items-center gap-1\">\r\n <label>{{ title() }}</label>\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" style=\"cursor: pointer; padding-bottom: 1px; padding-top: 1px;\"\r\n (click)=\"switchCalendar()\">\r\n @if(calendar == 'gregory') {G}\r\n @else{H}\r\n </button>\r\n</div>\r\n\r\n}\r\n<div class=\"input-group flex-nowrap\" #inputDiv>\r\n @if(calendarSwitchPosition() == 'inline'){\r\n <span class=\"input-group-text\" style=\"cursor: pointer;\" (click)=\"switchCalendar()\"> @if(calendar == 'gregory') {G}\r\n @else{H}</span>\r\n }\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"inputDate\" (blur)=\"onManualDateEntered()\"\r\n [disabled]=\"!enabled()\" [placeholder]=\"format()\" (keyup.enter)=\"onManualDateEntered()\">\r\n\r\n\r\n <!-- <button class=\"btn btn-outline-secondary\" type=\"button\" (click)=\"toggleCalendar()\" [disabled]=\"!enabled()\">\r\n <i class=\"bi bi-calendar3\"></i>\r\n </button> -->\r\n <button #calendarButton class=\"btn btn-outline-secondary\" (click)=\"openCalendar()\" [disabled]=\"!enabled()\">\r\n <i class=\"bi bi-calendar3\"></i>\r\n </button>\r\n\r\n</div>\r\n\r\n\r\n@if(isMobile && isOpen){\r\n<div class=\"modal modal-backdrop\" tabindex=\"-1\" role=\"dialog\" style=\"display: block;\" #modalDiv>\r\n <div class=\"modal-dialog modal-dialog-scrollable\" role=\"document\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"btn btn-danger close ms-auto btn-sm\" (click)=\"isOpen = false\">\r\n <i class=\"bi bi-x\"></i>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <flex-dual-calendar (valueChange)=\"onDateSelectedFromCalender($event)\"\r\n [(value)]=\"selectedDate\"></flex-dual-calendar>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n\r\n\r\n<div #calendarDropdown class=\"calendar-dropdown\">\r\n <flex-dual-calendar (valueChange)=\"onDateSelectedFromCalender($event)\"\r\n [(value)]=\"selectedDate\"></flex-dual-calendar>\r\n</div>","/*\r\n * Public API Surface of flex-ui-controls\r\n */\r\n\r\nexport * from './lib/flex-panel/flex-panel.component';\r\nexport * from './lib/flex-pagination/flex-pagination.component';\r\nexport * from './lib/flex-grid/flex-grid.component';\r\nexport * from './lib/flex-grid/flex-grid-columns';\r\nexport * from './lib/flex-grid/flex-grid-column';\r\nexport * from './lib/flex-combo-datepicker/flex-combo-datepicker.component';\r\nexport * from './lib/flex-hijri/flex-hijri-datepicker/hijri-datepicker.component';\r\nexport * from './lib/flex-container/flex-container.component';\r\nexport * from \"./lib/flex-dual-datepicker/flex-dual-datepicker.component\";","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","hijriFmt","hijriMonthNamesEn","hijriMonthNamesAr","weekDaysEn","weekDaysAr","hijriFromGregorian","compareHijri","findGregorianForHijri","i1.DateServiceService","i1","i2.DeviceDetectorService","i3.FloatingUiService"],"mappings":";;;;;;;;;;;;;MASa,kBAAkB,CAAA;AACrB,IAAA,cAAc;AACd,IAAA,gBAAgB;AAEN,IAAA,IAAI;AAEd,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AAEpC,IAAA,WAAA,GAAA,EAAgB;IAEhB,eAAe,GAAA;QACb,IAAI,CAAC,YAAY,EAAE;;AAGnB,QAAA,IAAI,gBAAgB,IAAI,MAAM,EAAE;AAC9B,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YACnE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC5C;;AAGA,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QACvE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;AAC3C,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,OAAO,EAAE;AACV,SAAA,CAAC;IAGJ;IAGA,cAAc,GAAA;QACZ,IAAI,CAAC,YAAY,EAAE;IACrB;IAEQ,YAAY,GAAA;;AAElB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAK,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,GAAG;AAChE,QAAA,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW;AACzC,QAAA,MAAM,SAAS,GAAG,cAAc,GAAG,GAAG;AAEtC,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAA,EAAA,CAAI,CAAC;AAC5E,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC;;IAGnE;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;QAClC;AACA,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;QACpC;IACF;uGAtDW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,iOCT/B,mFAEM,EAAA,MAAA,EAAA,CAAA,8CAAA,CAAA,EAAA,CAAA;;2FDOO,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAP9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,WACb,EAAE,EAAA,QAAA,EAAA,mFAAA,EAAA,MAAA,EAAA,CAAA,8CAAA,CAAA,EAAA;wDASO,IAAI,EAAA,CAAA;sBAArB,SAAS;uBAAC,KAAK;gBA2BhB,cAAc,EAAA,CAAA;sBADb,YAAY;uBAAC,eAAe;;;ME5BlB,uBAAuB,CAAA;AAClC,IAAA,QAAQ,GAAG,KAAK,CAAS,CAAC,oDAAC;IAEjB,WAAW,GAAW,CAAC;IACjC,QAAQ,GAAG,EAAE;IACb,WAAW,GAAG,CAAC;AACL,IAAA,UAAU,GAAG,IAAI,YAAY,EAAc;IAErD,cAAc,GAAG,CAAC;IAClB,SAAS,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AAE/B,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,WAAW,GAAG,CAAC;AACpB,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE;AACpC,QAAA,CAAC,CAAC;IACJ;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,cAAc,EAAE;IACvB;;IAIA,cAAc,GAAA;AACZ,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU;AAC/B,QAAA,IAAI,KAAK,GAAG,GAAG,EAAE;AACf,YAAA,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;QAC1B;AAAO,aAAA,IAAI,KAAK,GAAG,GAAG,EAAE;AACtB,YAAA,IAAI,CAAC,cAAc,GAAG,CAAC;QACzB;aAAO;AACL,YAAA,IAAI,CAAC,cAAc,GAAG,CAAC;QACzB;IACF;AAGA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IACzD;AAEA,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU;AAC7B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc;AAE/B,QAAA,IAAI,GAAG,KAAK,CAAC,EAAE;AACb,YAAA,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5B;QAEA,MAAM,KAAK,GAAwB,EAAE;AAErC,QAAA,IAAI,KAAK,IAAI,GAAG,EAAE;YAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE;AAAE,gBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAChD;aAAO;YACL,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;AAC/D,YAAA,IAAI,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC;AAEzB,YAAA,IAAI,GAAG,GAAG,KAAK,EAAE;gBACf,GAAG,GAAG,KAAK;AACX,gBAAA,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;YACvB;YAEA,IAAI,KAAK,GAAG,CAAC;AAAE,gBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC;YACnC,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE;AAAE,gBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAChD,IAAI,GAAG,GAAG,KAAK;AAAE,gBAAA,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC;QAC3C;AAEA,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,UAAU,CAAC,IAAqB,EAAA;QAC9B,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE;QAC9B,IAAI,IAAI,GAAG,CAAC;YAAE,IAAI,GAAG,CAAC;AACtB,QAAA,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU;AAAE,YAAA,IAAI,GAAG,IAAI,CAAC,UAAU;AAClD,QAAA,IAAI,IAAI,KAAK,IAAI,CAAC,WAAW;YAAE;AAE/B,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACnB,IAAI,EAAE,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ;YAC5C,IAAI,EAAE,IAAI,CAAC,QAAQ;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;AAC9B,SAAA,CAAC;IACJ;AAEA,IAAA,gBAAgB,CAAC,QAAa,EAAA;QAC5B,IAAI,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;AACzC,QAAA,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;YAAE;AAEhC,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;AACrB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACnB,IAAI,EAAE,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ;YAC5C,IAAI,EAAE,IAAI,CAAC,QAAQ;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC;AACnB,SAAA,CAAC;IACJ;IAEA,SAAS,GAAA,EAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,QAAQ,GAAA,EAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC/C,IAAA,QAAQ,GAAA,EAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC;AACpD,IAAA,QAAQ,GAAA,EAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC;uGApGzC,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,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,UAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXpC,qoEAwCM,EAAA,MAAA,EAAA,CAAA,mEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED/BM,YAAY,2JAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAExB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBANnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,OAAA,EAGlB,CAAC,YAAY,EAAE,WAAW,CAAC,EAAA,QAAA,EAAA,qoEAAA,EAAA,MAAA,EAAA,CAAA,mEAAA,CAAA,EAAA;wDAQ1B,UAAU,EAAA,CAAA;sBAAnB;gBAkBD,cAAc,EAAA,CAAA;sBADb,YAAY;uBAAC,eAAe;;;AElC/B;MAQa,mBAAmB,CAAA;AAC5B,IAAA,UAAU,GAAG,KAAK,CAAS,EAAE,sDAAC;AAErB,IAAA,KAAK;IACL,KAAK,GAAQ,GAAG;AAEO,IAAA,cAAc;AAChB,IAAA,YAAY;uGAPjC,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,8pBAHlB,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAGH,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAL/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,QAAQ,EAAE;AACb,iBAAA;8BAKY,KAAK,EAAA,CAAA;sBAAb;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBAE+B,cAAc,EAAA,CAAA;sBAA7C,YAAY;uBAAC,gBAAgB;gBACA,YAAY,EAAA,CAAA;sBAAzC,YAAY;uBAAC,cAAc;;;ACfhC;MAQa,oBAAoB,CAAA;AACS,IAAA,OAAO;uGADpC,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,SAAA,EACZ,mBAAmB,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAH1B,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAEH,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAJhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,QAAQ,EAAE;AACb,iBAAA;8BAEyC,OAAO,EAAA,CAAA;sBAA5C,eAAe;uBAAC,mBAAmB;;;MCK3B,iBAAiB,CAAA;AAG5B,IAAA,YAAY,GAAG,KAAK,CAAU,KAAK,wDAAC;AACpC,IAAA,cAAc,GAAG,KAAK,CAAS,CAAC,0DAAC;AAEjC,IAAA,UAAU,GAAG,KAAK,CAAS,EAAE,sDAAC;IAErB,UAAU,GAAU,EAAE;;AAGK,IAAA,WAAW;IAE/C,UAAU,GAAG,MAAM,EAAgC;IACnD,aAAa,GAAG,MAAM,EAAgC;;AAG7C,IAAA,mBAAmB;IAE5B,eAAe,GAAY,KAAK;AAEP,IAAA,UAAU;AAEZ,IAAA,QAAQ;IAE/B,aAAa,GAAW,CAAC,CAAC;IAChB,eAAe,GAAW,CAAC;IAC3B,WAAW,GAAW,EAAE;IAElC,UAAU,GAAG,MAAM,EAAkC;IACrD,WAAW,GAAW,CAAC;IACvB,QAAQ,GAAW,EAAE;AAErB,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE;AAC5C,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,EAAE;AAC9C,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE;AACtC,QAAA,CAAC,CAAC;IACJ;IAEA,eAAe,GAAA;QACb,IAAI,CAAC,gBAAgB,EAAE;IACzB;IAEA,KAAK,GAAA;AACH,QAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;AAC7B,QAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;IAC9B;AAEA,IAAA,UAAU,CAAC,CAAQ,EAAA;AACjB,QAAA,MAAM,IAAI,GAAG,CAAC,CAAC,MAAqB;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC;AAC9C,QAAA,IAAI,MAAM;AAAG,YAAA,MAAsB,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;IAClE;IAEA,gBAAgB,GAAA;;;;;;;IAQhB;;;;;;;;;IAYA,aAAa,CAAC,KAAa,EAAE,IAAS,EAAA;AACpC,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;;AAG1B,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACvD;IAEA,UAAU,CAAC,KAAa,EAAE,IAAS,EAAA;AACjC,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;;AAG1B,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACpD;AAEA,IAAA,aAAa,CAAC,KAAiB,EAAA;AAC7B,QAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AAClB,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW;AACpC,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ;AAE9B,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IAG7B;uGAxGW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,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,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,aAAA,EAAA,eAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAWd,oBAAoB,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzBpC,qsHAiFM,m3BDxEM,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,uBAAuB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAKjD,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAP7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,WACZ,CAAC,YAAY,EAAE,WAAW,EAAE,uBAAuB,CAAC,EAAA,QAAA,EAAA,qsHAAA,EAAA,MAAA,EAAA,CAAA,4zBAAA,CAAA,EAAA;wDAapD,UAAU,EAAA,CAAA;sBAAlB;gBAGmC,WAAW,EAAA,CAAA;sBAA9C,YAAY;uBAAC,oBAAoB;gBAMzB,mBAAmB,EAAA,CAAA;sBAA3B;gBAIwB,UAAU,EAAA,CAAA;sBAAlC,SAAS;uBAAC,YAAY;gBAEA,QAAQ,EAAA,CAAA;sBAA9B,SAAS;uBAAC,UAAU;;;MEpBV,wBAAwB,CAAA;;IAE1B,SAAS,CAAU;AACnB,IAAA,SAAS;IACT,QAAQ,CAAY;IACpB,OAAO,GAA0B,KAAK;IACtC,UAAU,GAAY,KAAK;IAC3B,aAAa,GAAsB,gBAAgB;IAE5D,WAAW,GAAG,MAAM,EAAO;AAE3B,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,oDAAC;IAEhC,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAO;AACpB,IAAA,MAAM;IAEN,GAAG,GAAgB,EAAE;IACrB,KAAK,GAAgB,EAAE;IACvB,IAAI,GAAgB,EAAE;IAEtB,KAAK,GAAiB,EAAE;IACxB,MAAM,GAAiB,EAAE;IACzB,KAAK,GAAiB,EAAE;IAExB,YAAY,GAAiB,EAAE;IAE/B,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAE1B,IAAA,UAAU,GAAG,KAAK,CAAU,IAAI,sDAAC;IACjC,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;IAC3B,UAAU,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;IAC5B,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAE3B,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE;YAC1B,IAAI,CAAC,SAAS,EAAE;YAChB,IAAI,CAAC,WAAW,EAAE;AACpB,QAAA,CAAC,CAAC;IACJ;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,CAAC,UAAU,EAAE;QACjB,IAAI,CAAC,SAAS,EAAE;;;IAGlB;IAEQ,gBAAgB,GAAA;QACtB,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC;AACpG,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YACxB,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACjF;IACF;IAEQ,UAAU,GAAA;QAChB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QACjJ,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;AACnE,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACzE;IAEQ,SAAS,GAAA;QACf,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,GAAG,WAAW,GAAG,GAAG;QAC3F,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,GAAG,WAAW;AACrF,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE;AACf,QAAA,KAAK,IAAI,CAAC,GAAG,OAAO,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,EAAE,EAAE;AACvC,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;QACnD;AACA,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxE;IAEQ,SAAS,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AACnC,YAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;AAChC,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;QAChC;IACF;IAEQ,WAAW,GAAA;AACjB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;AACjF,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE;AACf,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AACnE,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE;AAC7B,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;QACnD;IACF;IAEQ,UAAU,CAAC,KAAa,EAAE,IAAY,EAAA;AAC5C,QAAA,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;QAC5C,IAAI,KAAK,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE;AAC5F,QAAA,OAAO,EAAE;IACX;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE;YACvC,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;AAChF,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AACnB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;QAC5B;IACF;AAEA,IAAA,gBAAgB,CAAC,IAAU,EAAA;AACzB,QAAA,MAAM,GAAG,GAAG,CAAC,CAAS,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AAExD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;QAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;;;AAItC,QAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,OAAO,EAAE;IACjE;uGAvHW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,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,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,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,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,KAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjBrC,inDAiDM,EAAA,MAAA,EAAA,CAAA,4MAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDrCM,WAAW,yvBAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAKxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAPpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,OAAA,EACxB,CAAC,WAAW,EAAE,YAAY,CAAC,EAAA,QAAA,EAAA,inDAAA,EAAA,MAAA,EAAA,CAAA,4MAAA,CAAA,EAAA;wDAO3B,SAAS,EAAA,CAAA;sBAAjB;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,aAAa,EAAA,CAAA;sBAArB;;;AEZH;AACA;AACA;AACA,MAAMC,UAAQ,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,kCAAkC,EAAE;AAC3E,IAAA,GAAG,EAAE,SAAS;AACd,IAAA,KAAK,EAAE,SAAS;AAChB,IAAA,IAAI,EAAE;AACP,CAAA,CAAC;AAEF,MAAMC,mBAAiB,GAAG;AACxB,IAAA,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS;AACxC,IAAA,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS;AAC3C,IAAA,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE;CACxC;AAED,MAAMC,mBAAiB,GAAG;AACxB,IAAA,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY;AACzC,IAAA,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO;AAC9C,IAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE;CAC/B;AAED,MAAMC,YAAU,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;AACpE,MAAMC,YAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AAEtD,SAASC,oBAAkB,CAAC,CAAO,EAAA;IACjC,MAAM,KAAK,GAAGL,UAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;;IAEvC,MAAM,GAAG,GAA2B,EAAE;IACtC,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK;AAC5C,IAAA,MAAM,CAAC,GAAG,CAAC,CAAS,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;IACpD,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE;AACxD;AAEA,SAASM,cAAY,CAAC,CAAY,EAAE,CAAY,EAAA;AAC9C,IAAA,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;AAAE,QAAA,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;AACrC,IAAA,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;AAAE,QAAA,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;AACrC,IAAA,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;AACpB;AAEA,SAASC,uBAAqB,CAAC,MAAiB,EAAA;AAC9C,IAAA,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE;AACvC,IAAA,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE;IACzC,MAAM,KAAK,GAAG,QAAQ;AAEtB,IAAA,OAAO,EAAE,IAAI,EAAE,EAAE;AACf,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,GAAGF,oBAAkB,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3CC,cAAY,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,KAAK,KAAK,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;IACvE;AAEA,IAAA,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;IACpB,OAAO,IAAI,EAAE;AACX,QAAA,MAAM,CAAC,GAAGD,oBAAkB,CAAC,CAAC,CAAC;QAC/B,MAAM,GAAG,GAAGC,cAAY,CAAC,CAAC,EAAE,MAAM,CAAC;QACnC,IAAI,GAAG,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC;QACvB,IAAI,GAAG,GAAG,CAAC;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC;QACjE,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC;IACnC;AACF;MAUa,sBAAsB,CAAA;;IAExB,KAAK,GAAgB,IAAI;AACxB,IAAA,WAAW,GAAG,IAAI,YAAY,EAAQ;;IAGvC,OAAO,GAAgB,IAAI;IAC3B,OAAO,GAAgB,IAAI;;IAG3B,SAAS,GAAgB,IAAI;AAEtC,IAAA,EAAE,GAAG,MAAM,CAAS,CAAC,8CAAC;AACtB,IAAA,EAAE,GAAG,MAAM,CAAS,CAAC,8CAAC;IAEtB,aAAa,GAAG,CAAC;IACjB,YAAY,GAAG,IAAI;IACnB,SAAS,GAAa,EAAE;AAExB,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAOL,mBAAiB;IAC1B;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAOC,mBAAiB;IAC1B;AAEA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,GAAGA,mBAAiB,GAAGD,mBAAiB;IACxE;AAEA,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,GAAGG,YAAU,GAAGD,YAAU;IAC1D;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAOA,YAAU;IACnB;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAOC,YAAU;IACnB;AAEA,IAAA,IAAI,gBAAgB,GAAA;QAClB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;IACjD;AAEA,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,GAAGC,oBAAkB,CAAC,IAAI,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACjB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACjB,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE;AACxB,QAAA,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE;IAC3B;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,cAAc,EAAE;IACvB;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,MAAM,CAAC,GAAGA,oBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC;YACxC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACjB,YAAA,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE;AACxB,YAAA,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE;QAC3B;QACA,IAAI,CAAC,cAAc,EAAE;IACvB;IAEA,cAAc,GAAA;AACZ,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,GAAGA,oBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;AACzF,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,GAAGA,oBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AAC3F,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AACnB,QAAA,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;AACvC,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACxB;IACF;IAEA,iBAAiB,GAAA;QACf,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;QAC9B,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC;IACjC;IAEA,YAAY,GAAA;QACV,OAAOE,uBAAqB,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;IACvE;IAEA,KAAK,GAAA;AACH,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;AAClC,QAAA,MAAM,MAAM,GAAGF,oBAAkB,CAAC,MAAM,CAAC;AAEzC,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC;AAC9B,QAAA,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAEjD,MAAM,MAAM,GAAc,EAAE;AAC5B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;AAC3B,YAAA,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;YACzB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC9B,YAAA,MAAM,CAAC,GAAGA,oBAAkB,CAAC,CAAC,CAAC;YAE/B,IAAI,QAAQ,GAAG,KAAK;AACpB,YAAA,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,QAAQ,GAAG,IAAI;AACrE,YAAA,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,QAAQ,GAAG,IAAI;YAErE,MAAM,CAAC,IAAI,CAAC;gBACV,CAAC;gBACD,CAAC;AACD,gBAAA,cAAc,EAAE,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE;gBACxD;AACD,aAAA,CAAC;QACJ;AACA,QAAA,OAAO,MAAM;IACf;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE;AACrB,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE;AAChC,QAAA,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE;YAAE,CAAC,GAAG,EAAE;AAAE,YAAA,CAAC,EAAE;QAAE;AAC5B,QAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AAAE,QAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9B,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC;AACrB,QAAA,IAAI,CAAC,aAAa,GAAG,CAAC;IACxB;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE;AACrB,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE;AAChC,QAAA,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;YAAE,CAAC,GAAG,CAAC;AAAE,YAAA,CAAC,EAAE;QAAE;AAC5B,QAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AAAE,QAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9B,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC;AACrB,QAAA,IAAI,CAAC,aAAa,GAAG,CAAC;IACxB;IAEA,OAAO,GAAA;QACL,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI;AAC9B,QAAA,MAAM,IAAI,GAAGA,oBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC7D,QAAA,OAAO,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;IAC9E;IAEA,OAAO,GAAA;QACL,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI;AAC9B,QAAA,MAAM,IAAI,GAAGA,oBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC7D,QAAA,OAAO,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;IAC9E;AAEA,IAAA,OAAO,CAAC,CAAO,EAAA;AACb,QAAA,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE;QACpB,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,WAAW;AACnC,eAAA,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,QAAQ;eAC3B,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE;IAClC;AAEA,IAAA,UAAU,CAAC,CAAO,EAAA;AAChB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK;YACjB,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAC5C,CAAC,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YACtC,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;IACxC;AAEA,IAAA,MAAM,CAAC,CAAU,EAAA;QACf,IAAI,CAAC,CAAC,QAAQ;YAAE;;AAIhB,QAAA,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAChB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IACnC;AAEQ,IAAA,SAAS,CAAC,CAAO,EAAA;AACvB,QAAA,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IAC7D;uGA1KW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChFnC,67DA4CM,EAAA,MAAA,EAAA,CAAA,wUAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED+BM,YAAY,2JAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAKxB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBARlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,cAClB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,WAAW,CAAC,EAAA,QAAA,EAAA,67DAAA,EAAA,MAAA,EAAA,CAAA,wUAAA,CAAA,EAAA;wDAO3B,KAAK,EAAA,CAAA;sBAAb;gBACS,WAAW,EAAA,CAAA;sBAApB;gBAGQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBAGQ,SAAS,EAAA,CAAA;sBAAjB;;;AElFH;AACA,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC;AAC7B,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC;AAE/B;AACA,KAAK,CAAC,sBAAsB,CAAC,SAAS,EAAE,IAAI,qBAAqB,EAAE,CAAC;AAEpE,KAAK,CAAC,sBAAsB,CAAC,SAAS,EAAE,IAAI,mBAAmB,EAAE,CAAC;MASrD,kBAAkB,CAAA;AAK7B,IAAA,GAAG,CAAC,IAAU,EAAA;;;;;;;;;;;;QAiBZ,MAAM,CAAC,GAAG,KAAK,CAAC,YAAY,EAAE,YAAY,CAAC;;;;QAI3C,MAAM,UAAU,GAAG,KAAK,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,EAAY,CAAC;;AAEnG,QAAA,OAAO,CAAC,GAAG,CAAC,+DAA+D,EAAE,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;;;;AAI7G,QAAA,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,UAAU,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;IA0BjG;AAEA,IAAA,KAAK,CAAC,UAAkB,EAAE,QAA4B,EAAE,MAAc,EAAA;;;QAGpE,MAAM,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC;AACnC,QAAA,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE;YAEhB,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC;AACvD,YAAA,OAAO,IAAI;QACb;;;;QAIA,MAAM,UAAU,GAAG,KAAK,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,EAAY,CAAC;;AAElG,QAAA,OAAO,CAAC,GAAG,CAAC,+DAA+D,EAAE,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;;;;AAI7G,QAAA,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,UAAU,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;AAC/F,QAAA,OAAO,UAAU,CAAC,MAAM,EAAE;IAC5B;AAEA,IAAA,MAAM,CAAC,IAAU,EAAE,QAA4B,EAAE,MAAc,EAAA;AAC7D,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;QACrB,OAAO,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IACpD;uGArFW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA;;2FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCNY,wBAAwB,CAAA;AAef,IAAA,WAAA;IAdpB,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAO;AAEpB,IAAA,YAAY;IACZ,YAAY,GAAY,KAAK;AAE7B,IAAA,QAAQ,GAAG,KAAK,CAAqB,SAAS,oDAAC;AAC/C,IAAA,OAAO,GAAG,KAAK,CAAU,IAAI,mDAAC;IAC9B,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAC1B,IAAA,MAAM,GAAG,KAAK,CAAS,YAAY,kDAAC;IAEpC,SAAS,GAAW,EAAE;IACtB,QAAQ,GAAG,KAAK;AAGhB,IAAA,WAAA,CAAoB,WAA+B,EAAA;QAA/B,IAAA,CAAA,WAAW,GAAX,WAAW;QAI7B,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE;YACxB,IAAI,GAAG,EAAE;AACP,gBAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC;AACvB,gBAAA,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;AAClB,oBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE;oBACjC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACrF;gBAEA;YACF;AAEA,YAAA,IAAI,CAAC,YAAY,GAAG,SAAS;AAC7B,YAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AACrB,QAAA,CAAC,CAAC;IACJ;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY;IACxC;AAEA,IAAA,0BAA0B,CAAC,CAAO,EAAA;;AAEhC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;;;;;;;IAUzB;;IAGA,mBAAmB,GAAA;QACjB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;QAErB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;QAClD,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QACzB;aAAO;YACL,OAAO,CAAC,IAAI,CAAC,uBAAuB,EAAE,IAAI,CAAC,SAAS,CAAC;QACvD;IACF;;AAGQ,IAAA,UAAU,CAAC,CAAO,EAAA;AACxB,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC;;AAErB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;;IAEnB;AAEA,IAAA,UAAU,CAAC,IAAU,EAAE,QAA4B,EAAE,MAAc,EAAA;AACjE,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC;IACxD;;;;;;AAQQ,IAAA,cAAc,CAAC,GAAW,EAAA;QAEhC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,YAAY;QAExD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QAE1B,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAE1B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AAEvB,QAAA,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;AAAE,YAAA,OAAO,IAAI;AAI7B,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACtB,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE;QAChC;;;;AAMA,QAAA,OAAO,IAAI;IACb;AAGuB,IAAA,QAAQ;AACR,IAAA,QAAQ;AACR,IAAA,QAAQ;AAG/B,IAAA,eAAe,CAAC,KAAiB,EAAA;QAC/B,IAAI,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM;eACjD,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM;AAClD,eAAA,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;YACxD;QACF;AACA,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;IAC3B;uGA1HW,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAG,kBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,4kCCjBrC,kxCA+BC,EAAA,MAAA,EAAA,CAAA,6EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDnBW,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,+mBAAE,sBAAsB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,SAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAKhD,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAPpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,WACvB,CAAC,YAAY,EAAE,WAAW,EAAE,sBAAsB,CAAC,EAAA,QAAA,EAAA,kxCAAA,EAAA,MAAA,EAAA,CAAA,6EAAA,CAAA,EAAA;oFAmHrC,QAAQ,EAAA,CAAA;sBAA9B,SAAS;uBAAC,UAAU;gBACE,QAAQ,EAAA,CAAA;sBAA9B,SAAS;uBAAC,UAAU;gBACE,QAAQ,EAAA,CAAA;sBAA9B,SAAS;uBAAC,UAAU;gBAGrB,eAAe,EAAA,CAAA;sBADd,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;;;ME/G/B,sBAAsB,CAAA;AASb,IAAA,QAAA;AARM,IAAA,WAAW;;;AAIb,IAAA,SAAS;AACT,IAAA,SAAS;AACR,IAAA,UAAU;AAEnC,IAAA,WAAA,CAAoB,QAAmB,EAAA;QAAnB,IAAA,CAAA,QAAQ,GAAR,QAAQ;IAAe;IAE3C,eAAe,GAAA;QACb,IAAI,CAAC,aAAa,EAAE;;;IAGtB;IAEA,WAAW,GAAA;;;;IAIX;IAIA,cAAc,GAAA;QACZ,IAAI,CAAC,aAAa,EAAE;IACtB;IAEQ,aAAa,GAAA;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,aAAa;AAC3D,QAAA,IAAI,CAAC,MAAM;YAAE;AAEb,QAAA,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY;AACxC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,sBAAsB,EAAE,YAAY,IAAI,CAAC;AAC7F,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,kBAAkB,EAAE,YAAY,IAAI,CAAC;AAEzF,QAAA,MAAM,SAAS,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY;AAE5D,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAA,EAAA,CAAI,CAAC;AAClF,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,OAAO,EAAE,CAAA,EAAG,MAAM,CAAC,WAAW,CAAA,EAAA,CAAI,CAAC;IAC5F;uGAzCW,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpBnC,oeAiBM,EAAA,MAAA,EAAA,CAAA,qJAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDAM,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAGX,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;+BACE,gBAAgB,EAAA,OAAA,EAGjB,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,oeAAA,EAAA,MAAA,EAAA,CAAA,qJAAA,CAAA,EAAA;8EAIG,WAAW,EAAA,CAAA;sBAApC,SAAS;uBAAC,aAAa;gBAIA,SAAS,EAAA,CAAA;sBAAhC,YAAY;uBAAC,QAAQ;gBACE,SAAS,EAAA,CAAA;sBAAhC,YAAY;uBAAC,QAAQ;gBACG,UAAU,EAAA,CAAA;sBAAlC,YAAY;uBAAC,SAAS;gBAkBvB,cAAc,EAAA,CAAA;sBADb,YAAY;uBAAC,eAAe;;;AE/B/B;AACA,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,kCAAkC,EAAE;AAC3E,IAAA,GAAG,EAAE,SAAS;AACd,IAAA,KAAK,EAAE,SAAS;AAChB,IAAA,IAAI,EAAE;AACP,CAAA,CAAC;AAEF,MAAM,iBAAiB,GAAG;AACxB,IAAA,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS;AACxC,IAAA,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS;AAC3C,IAAA,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE;CACxC;AAED,MAAM,iBAAiB,GAAG;AACxB,IAAA,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY;AACzC,IAAA,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO;AAC9C,IAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE;CAC/B;AAED,MAAM,gBAAgB,GAAG;IACvB,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM;IACtD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE;CACvD;AAED,MAAM,gBAAgB,GAAG;IACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO;IACnD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE;CACjD;AAED,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;AAC7D,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AAEtD,SAAS,kBAAkB,CAAC,CAAO,EAAA;IACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;IACvC,MAAM,GAAG,GAA2B,EAAE;IACtC,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK;AAC5C,IAAA,MAAM,CAAC,GAAG,CAAC,CAAS,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;IACpD,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE;AACxD;AACA,SAAS,YAAY,CAAC,CAAY,EAAE,CAAY,EAAA;AAC9C,IAAA,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;AAAE,QAAA,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;AACrC,IAAA,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;AAAE,QAAA,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;AACrC,IAAA,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;AACpB;AACA,SAAS,qBAAqB,CAAC,MAAiB,EAAA;AAC9C,IAAA,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE;AACvC,IAAA,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE;IACzC,MAAM,KAAK,GAAG,QAAQ;AACtB,IAAA,OAAO,EAAE,IAAI,EAAE,EAAE;AACf,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,GAAG,kBAAkB,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,KAAK,KAAK,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;IACvE;AACA,IAAA,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;IACpB,OAAO,IAAI,EAAE;AACX,QAAA,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC;QAC/B,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC;QACnC,IAAI,GAAG,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC;QACvB,IAAI,GAAG,GAAG,CAAC;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC;QACjE,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC;IACnC;AACF;AACA,SAAS,SAAS,CAAC,CAAO,EAAA;AACxB,IAAA,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;AAC7D;MAUa,yBAAyB,CAAA;;AAE3B,IAAA,KAAK;AACJ,IAAA,WAAW,GAAG,IAAI,YAAY,EAAQ;;AAGvC,IAAA,OAAO;AACP,IAAA,OAAO;;IAGP,SAAS,GAAgB,IAAI;;IAG7B,SAAS,GAAuB,SAAS;;AAGlD,IAAA,KAAK;;AAGL,IAAA,IAAI,GAAG,MAAM,CAAqB,SAAS,gDAAC;;AAG5C,IAAA,EAAE,GAAG,MAAM,CAAS,CAAC,8CAAC;AACtB,IAAA,EAAE,GAAG,MAAM,CAAS,CAAC,8CAAC;;AAGtB,IAAA,EAAE,GAAG,MAAM,CAAS,CAAC,8CAAC;AACtB,IAAA,EAAE,GAAG,MAAM,CAAS,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,IAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC,CAAC;;IAGvB,aAAa,GAAG,CAAC;IACjB,YAAY,GAAG,IAAI;IACnB,SAAS,GAAa,EAAE;;AAGxB,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,GAAG,iBAAiB,GAAG,iBAAiB;IACxE;AACA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,GAAG,gBAAgB,GAAG,gBAAgB;IACtE;AACA,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,GAAG,UAAU,GAAG,UAAU;IAC1D;AACA,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK;cACnB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC;cACvC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;IAC7C;AAEA,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;AACxB,QAAA,MAAM,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACjB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACjB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;AAChC,QAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;;QAGjC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;AAC7B,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS,EAAE;AAC7B,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE;AAC7B,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,EAAE;QAChC;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE;AAC7B,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,EAAE;QAChC;IACF;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,cAAc,EAAE;IACvB;AAEA,IAAA,WAAW,CAAC,OAAY,EAAA;;QAEtB,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,YAAY,IAAI,EAAE;YAClD,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;AAC/B,YAAA,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC;YAE/B,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AAC5B,YAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAE7B,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;;AAGjB,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS,EAAE;AAC7B,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE;AAC7B,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,EAAE;YAChC;iBAAO;AACL,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE;AAC7B,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,EAAE;YAChC;QACF;;AAGA,QAAA,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YAChE,IAAI,CAAC,cAAc,EAAE;QACvB;IACF;;IAIA,cAAc,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS,EAAE;AAC7B,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;AACpG,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AACtG,YAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AACnB,YAAA,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE;AAAE,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE;aAAO;YACL,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;AAC5E,YAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AACnB,YAAA,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE;AAAE,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACvF;IACF;;AAGA,IAAA,UAAU,CAAC,KAAyB,EAAA;AAClC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;AAChD,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;;AAEvB,YAAA,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC;YAC1B,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AAC5B,YAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC7B,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;AACxB,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE;AAC7B,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,EAAE;QAChC;aAAO;;YAEL,MAAM,CAAC,GAAG,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACjB,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;AACxB,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE;AAC7B,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,EAAE;QAChC;QACA,IAAI,CAAC,cAAc,EAAE;IACvB;;IAGA,iBAAiB,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS,EAAE;YAC7B,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;YAC9B,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC;QACjC;aAAO;YACL,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;YAC9B,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC;QACjC;IACF;;IAGA,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS,EAAE;YAC7B,OAAO,qBAAqB,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QACvE;AACA,QAAA,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9C;;IAGA,KAAK,GAAA;AACH,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;AAClC,QAAA,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC;;AAGzC,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC;AAC9B,QAAA,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAEjD,MAAM,MAAM,GAAc,EAAE;AAC5B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;AAC3B,YAAA,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;YACzB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC9B,YAAA,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC;YAE/B,IAAI,QAAQ,GAAG,KAAK;YACpB,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,QAAQ,GAAG,IAAI;YAChE,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,QAAQ,GAAG,IAAI;AAEhE,YAAA,MAAM,cAAc,GAClB,IAAI,CAAC,IAAI,EAAE,KAAK;AACd,mBAAG,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE;mBACxC,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC;AAEtF,YAAA,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;QACjD;AACA,QAAA,OAAO,MAAM;IACf;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE;AACrB,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS,EAAE;AAC7B,YAAA,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE;AAChC,YAAA,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE;gBAAE,CAAC,GAAG,EAAE;AAAE,gBAAA,CAAC,EAAE;YAAE;AAC5B,YAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AAAE,YAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9B,YAAA,IAAI,CAAC,YAAY,GAAG,CAAC;AAAE,YAAA,IAAI,CAAC,aAAa,GAAG,CAAC;QAC/C;aAAO;AACL,YAAA,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE;AAChC,YAAA,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE;gBAAE,CAAC,GAAG,EAAE;AAAE,gBAAA,CAAC,EAAE;YAAE;AAC5B,YAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AAAE,YAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9B,YAAA,IAAI,CAAC,YAAY,GAAG,CAAC;AAAE,YAAA,IAAI,CAAC,aAAa,GAAG,CAAC;QAC/C;IACF;IACA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE;AACrB,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS,EAAE;AAC7B,YAAA,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE;AAChC,YAAA,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;gBAAE,CAAC,GAAG,CAAC;AAAE,gBAAA,CAAC,EAAE;YAAE;AAC5B,YAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AAAE,YAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9B,YAAA,IAAI,CAAC,YAAY,GAAG,CAAC;AAAE,YAAA,IAAI,CAAC,aAAa,GAAG,CAAC;QAC/C;aAAO;AACL,YAAA,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE;AAChC,YAAA,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;gBAAE,CAAC,GAAG,CAAC;AAAE,gBAAA,CAAC,EAAE;YAAE;AAC5B,YAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AAAE,YAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9B,YAAA,IAAI,CAAC,YAAY,GAAG,CAAC;AAAE,YAAA,IAAI,CAAC,aAAa,GAAG,CAAC;QAC/C;IACF;IAEA,OAAO,GAAA;QACL,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI;QAC9B,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;AACpC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE;;AAErC,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AAC3E,QAAA,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACjE;IACA,OAAO,GAAA;QACL,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI;QAC9B,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;AACpC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE;AACrC,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;;AAE3E,QAAA,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1E,OAAO,IAAI,GAAG,aAAa;IAC7B;AAEA,IAAA,OAAO,CAAC,CAAO,EAAA;AACb,QAAA,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE;QACpB,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,WAAW;AACnC,eAAA,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,QAAQ;eAC3B,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE;IAClC;AACA,IAAA,UAAU,CAAC,CAAO,EAAA;AAChB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK;YACjB,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAC5C,CAAC,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YACtC,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;IACxC;AAEA,IAAA,MAAM,CAAC,CAAU,EAAA;QACf,IAAI,CAAC,CAAC,QAAQ;YAAE;QAChB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;;QAEjC,MAAM,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC;QACxC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAAE,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACpC,QAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;AAAE,QAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC7E,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS,EAAE;AAC7B,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE;AAAE,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,EAAE;QAC/D;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE;AAAE,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,EAAE;QAC/D;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;IACxB;uGAvQW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvFtC,+sGAwEM,EAAA,MAAA,EAAA,CAAA,8YAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDWM,YAAY,8BAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAIxB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,cAClB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,WAAW,CAAC,EAAA,QAAA,EAAA,+sGAAA,EAAA,MAAA,EAAA,CAAA,8YAAA,CAAA,EAAA;wDAM3B,KAAK,EAAA,CAAA;sBAAb;gBACS,WAAW,EAAA,CAAA;sBAApB;gBAGQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBAGQ,SAAS,EAAA,CAAA;sBAAjB;gBAGQ,SAAS,EAAA,CAAA;sBAAjB;;;ME9FU,qBAAqB,CAAA;IAEhC,aAAa,GAAA;AACX,QAAA,MAAM,EAAE,GAAG,SAAS,CAAC,SAAS;AAC9B,QAAA,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;AAAE,YAAA,OAAO,QAAQ;AAC7C,QAAA,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;AAAE,YAAA,OAAO,QAAQ;AAC5C,QAAA,OAAO,SAAS;IAClB;IAEA,KAAK,GAAA;AACH,QAAA,MAAM,EAAE,GAAG,SAAS,CAAC,SAAS;AAC9B,QAAA,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;AAAE,YAAA,OAAO,KAAK;AAC9C,QAAA,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;AAAE,YAAA,OAAO,SAAS;AACzC,QAAA,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAAE,YAAA,OAAO,SAAS;AACrC,QAAA,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAAE,YAAA,OAAO,OAAO;AACnC,QAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;AAAE,YAAA,OAAO,OAAO;AACrC,QAAA,OAAO,OAAO;IAChB;IAEA,QAAQ,GAAA,EAAc,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,QAAQ,CAAC,CAAC;IAChE,QAAQ,GAAA,EAAc,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,QAAQ,CAAC,CAAC;IAChE,SAAS,GAAA,EAAc,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,SAAS,CAAC,CAAC;uGArBvD,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAArB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cADR,MAAM,EAAA,CAAA;;2FACnB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCMrB,iBAAiB,CAAA;AAQlB,IAAA,MAAA;AACA,IAAA,QAAA;AARF,IAAA,WAAW;IAMnB,WAAA,CACU,MAAsB,EACtB,QAA6B,EAAA;QAD7B,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,QAAQ,GAAR,QAAQ;IACd;AAEJ;;;AAGG;AACH,IAAA,MAAM,IAAI,CACR,SAAsB,EACtB,SAAkB,EAClB,OAKC,EAAA;;AAGD,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;AAC9B,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;AAC9B,YAAA,IAAI,CAAC,WAAW,GAAG,SAAS;QAC9B;AAEA,QAAA,OAAO,IAAI,OAAO,CAAiB,CAAC,OAAO,KAAI;;AAE7C,YAAA,MAAM,OAAO,GAAG,eAAe,CAAC,SAAS,EAAE;gBACzC,mBAAmB,EAAE,IAAI,CAAC,QAAQ;AACnC,aAAA,CAAC;;AAGD,YAAA,OAAO,CAAC,QAAgB,CAAC,KAAK,GAAG,CAAC,MAAgB,KAAK,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;;AAG/E,YAAA,IAAI,OAAO,EAAE,MAAM,EAAE;AACnB,gBAAA,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAI;AAC/C,oBAAA,OAAO,CAAC,QAAgB,CAAC,CAAC,CAAC,GAAG,CAAC;AAClC,gBAAA,CAAC,CAAC;YACJ;;YAGA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;YACzD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC;;AAGxC,YAAA,MAAM,iBAAiB,GAAG,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAK;gBACnF,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,aAAa,EAAE;AACzD,oBAAA,SAAS,EAAE,cAAc;AACzB,oBAAA,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC;iBACzC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAI;oBACnB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE;AAClD,wBAAA,QAAQ,EAAE,UAAU;wBACpB,IAAI,EAAE,CAAA,EAAG,CAAC,CAAA,EAAA,CAAI;wBACd,GAAG,EAAE,CAAA,EAAG,CAAC,CAAA,EAAA,CAAI;AACb,wBAAA,MAAM,EAAE,MAAM;AACf,qBAAA,CAAC;AACJ,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;;AAGF,YAAA,MAAM,kBAAkB,GAAG,CAAC,CAAa,KAAI;AAC3C,gBAAA,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,aAAa;AACzC,gBAAA,MAAM,MAAM,GAAG,CAAC,CAAC,MAAc;AAC/B,gBAAA,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;oBACvD,OAAO,CAAC,IAAI,CAAC;gBACf;AACF,YAAA,CAAC;AAED,YAAA,MAAM,YAAY,GAAG,CAAC,CAAgB,KAAI;AACxC,gBAAA,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;oBAAE,OAAO,CAAC,IAAI,CAAC;AACvC,YAAA,CAAC;AAED,YAAA,IAAI,OAAO,EAAE,mBAAmB,KAAK,KAAK,EAAE;AAC1C,gBAAA,UAAU,CAAC,MAAM,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;YAC9E;AACA,YAAA,IAAI,OAAO,EAAE,aAAa,KAAK,KAAK,EAAE;AACpC,gBAAA,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,YAAY,CAAC;YACpD;;AAGA,YAAA,MAAM,OAAO,GAAG,CAAC,MAAsB,KAAI;AACzC,gBAAA,iBAAiB,EAAE;AACnB,gBAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,kBAAkB,CAAC;AAC7D,gBAAA,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,YAAY,CAAC;gBACrD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC;gBACxC,OAAO,CAAC,OAAO,EAAE;;AAGjB,gBAAA,IAAI,CAAC,WAAW,GAAG,SAAS;gBAC5B,OAAO,CAAC,MAAM,CAAC;AACjB,YAAA,CAAC;;YAGD,IAAI,CAAC,WAAW,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE;AAClD,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,MAAY,EAAA;AACtB,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;YAC9B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;AACxC,YAAA,IAAI,CAAC,WAAW,GAAG,SAAS;QAC9B;IACF;uGAnHW,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cADJ,MAAM,EAAA,CAAA;;2FACnB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCUrB,2BAA2B,CAAA;AA0BlB,IAAA,WAAA;AAAyC,IAAA,cAAA;AACnD,IAAA,QAAA;AAzBmB,IAAA,cAAc;AACZ,IAAA,gBAAgB;AAExB,IAAA,QAAQ;AACR,IAAA,QAAQ;;IAG/B,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAO;AACpB,IAAA,OAAO,GAAG,KAAK,CAAU,IAAI,mDAAC;IAC9B,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAC1B,IAAA,MAAM,GAAG,KAAK,CAAS,YAAY,kDAAC;IAEpC,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AACvB,IAAA,sBAAsB,GAAG,KAAK,CAAmC,OAAO,kEAAC;;AAGzE,IAAA,YAAY;IAEZ,QAAQ,GAAuB,SAAS;IAExC,SAAS,GAAW,EAAE;IACtB,QAAQ,GAAG,KAAK;AAGhB,IAAA,WAAA,CAAoB,WAA+B,EAAU,cAAqC,EACxF,QAA2B,EAAA;QADjB,IAAA,CAAA,WAAW,GAAX,WAAW;QAA8B,IAAA,CAAA,cAAc,GAAd,cAAc;QACjE,IAAA,CAAA,QAAQ,GAAR,QAAQ;AAEhB,QAAA,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE;QACzC,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE;YACxB,IAAI,GAAG,EAAE;AACP,gBAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC;AACvB,gBAAA,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;AAClB,oBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE;oBACjC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAa,CAAC;gBACtD;gBAEA;YACF;AAEA,YAAA,IAAI,CAAC,YAAY,GAAG,SAAS;AAC7B,YAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AACrB,QAAA,CAAC,CAAC;IACJ;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE;AAC9B,YAAA,IAAI,CAAC,QAAQ,GAAG,SAAS;QAC3B;aACK;AACH,YAAA,IAAI,CAAC,QAAQ,GAAG,SAAS;QAC3B;QAEA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAa,CAAC;IACtD;AAEA,IAAA,0BAA0B,CAAC,CAAO,EAAA;QAChC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAEnC,QAAA,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAClB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;QACnB,IAAI,CAAC,cAAc,EAAE;IACvB;;IAGA,mBAAmB,GAAA;QACjB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;QAErB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;QAClD,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QACzB;aAAO;YACL,OAAO,CAAC,IAAI,CAAC,uBAAuB,EAAE,IAAI,CAAC,SAAS,CAAC;QACvD;IACF;;AAGQ,IAAA,UAAU,CAAC,CAAO,EAAA;AACxB,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACnC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACnB;AAEA,IAAA,UAAU,CAAC,IAAU,EAAA;AACnB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACpE;AAEQ,IAAA,cAAc,CAAC,GAAW,EAAA;AAChC;AAC8D;AAC9D,QAAA,IAAI,CAAC,GAAG;AACN,YAAA,OAAO,IAAI;AAEb;;;;;;AAME;AACF,QAAA,IAAI,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AAC1E,QAAA,IAAI,UAAU;AACZ,YAAA,OAAO,UAAU;;;AAInB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,OAAO,IAAI,CAAC,YAAY;QAC1B;;QAGA,OAAO,IAAI,IAAI,EAAE;IACnB;AAKA,IAAA,eAAe,CAAC,KAAiB,EAAA;QAC/B,IAAI,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM;eACjD,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM;AAClD,eAAA,IAAI,CAAC,gBAAgB,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;YAChE;QACF;AACA,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;QACnB,IAAI,CAAC,cAAc,EAAE;IACvB;AAGA,IAAA,MAAM,YAAY,GAAA;AAChB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,aAAc;AAElD,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CACrC,MAAM,EACN,yBAAyB,EACzB;AACE,YAAA,SAAS,EAAE,cAAc;AACzB,YAAA,MAAM,EAAE;;gBAEN,WAAW,EAAE,IAAI,CAAC,YAAY;AAC/B,aAAA;AACF,SAAA,CACF;QAED,IAAI,MAAM,EAAE;;AAEV,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QACzB;IACF;IAGA,MAAM,GAAG,KAAK;IAEd,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM;QAE1B,IAAI,IAAI,CAAC,QAAQ;YACf;QAEF,IAAI,CAAC,cAAc,EAAE;IACvB;IAEA,cAAc,GAAA;AACZ,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,aAAc;AAClD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,aAAc;AAEtD,QAAA,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE;AAChC,YAAA,SAAS,EAAE,QAAQ;AACnB,YAAA,QAAQ,EAAE,OAAO;YACjB,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE;SACrC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAI;AACnB,YAAA,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE;gBAC5B,IAAI,EAAE,CAAA,EAAG,CAAC,CAAA,EAAA,CAAI;gBACd,GAAG,EAAE,CAAA,EAAG,CAAC,CAAA,EAAA,CAAI;AACb,gBAAA,UAAU,EAAE,CAAC,IAAI,CAAC;AAChB,sBAAE;AACF,sBAAE,SAAS;AACd,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;uGApLW,2BAA2B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAD,kBAAA,EAAA,EAAA,EAAA,KAAA,EAAAE,qBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA3B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,2BAA2B,i2CCpBxC,kvEAoDM,EAAA,MAAA,EAAA,CAAA,mPAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDrCM,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,+mBAAE,yBAAyB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAKnD,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAPvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,WACvB,CAAC,YAAY,EAAE,WAAW,EAAE,yBAAyB,CAAC,EAAA,QAAA,EAAA,kvEAAA,EAAA,MAAA,EAAA,CAAA,mPAAA,CAAA,EAAA;kJAOlC,cAAc,EAAA,CAAA;sBAA1C,SAAS;uBAAC,gBAAgB;gBACI,gBAAgB,EAAA,CAAA;sBAA9C,SAAS;uBAAC,kBAAkB;gBAEN,QAAQ,EAAA,CAAA;sBAA9B,SAAS;uBAAC,UAAU;gBACE,QAAQ,EAAA,CAAA;sBAA9B,SAAS;uBAAC,UAAU;gBAiHrB,eAAe,EAAA,CAAA;sBADd,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;;;AE1I5C;;AAEG;;ACFH;;AAEG;;;;"}
package/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { ElementRef, OnInit, EventEmitter, TemplateRef, QueryList, AfterViewInit, OnDestroy, Renderer2 } from '@angular/core';
2
+ import { ElementRef, OnInit, EventEmitter, TemplateRef, QueryList, AfterViewInit, OnDestroy, Renderer2, ApplicationRef, EnvironmentInjector, Type } from '@angular/core';
3
3
 
4
4
  declare class FlexPanelComponent {
5
5
  private resizeObserver?;
@@ -197,8 +197,49 @@ declare class FlexContainerComponent implements AfterViewInit, OnDestroy {
197
197
 
198
198
  type FlexCalendarSystemSwitchPosition = "none" | "inline" | "title";
199
199
 
200
+ type DeviceType = 'mobile' | 'tablet' | 'desktop';
201
+ type OS = 'iOS' | 'Android' | 'Windows' | 'MacOS' | 'Linux' | 'Other';
202
+ declare class DeviceDetectorService {
203
+ getDeviceType(): DeviceType;
204
+ getOS(): OS;
205
+ isMobile(): boolean;
206
+ isTablet(): boolean;
207
+ isDesktop(): boolean;
208
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DeviceDetectorService, never>;
209
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<DeviceDetectorService>;
210
+ }
211
+
212
+ declare class FloatingUiService {
213
+ private appRef;
214
+ private injector;
215
+ private activePopup?;
216
+ constructor(appRef: ApplicationRef, injector: EnvironmentInjector);
217
+ /**
218
+ * Opens a floating Angular component near a reference element.
219
+ * Ensures only one popup is visible at a time.
220
+ */
221
+ open<T, TResult = any>(reference: HTMLElement, component: Type<T>, options?: {
222
+ inputs?: Record<string, any>;
223
+ placement?: string;
224
+ closeOnOutsideClick?: boolean;
225
+ closeOnEscape?: boolean;
226
+ }): Promise<TResult | null>;
227
+ /**
228
+ * Closes the currently active floating popup, if any.
229
+ */
230
+ closeActive(result?: any): void;
231
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FloatingUiService, never>;
232
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<FloatingUiService>;
233
+ }
234
+
200
235
  declare class FlexDualDatepickerComponent {
201
236
  private dateService;
237
+ private deviceDetector;
238
+ private floating;
239
+ calendarButton?: ElementRef;
240
+ calendarDropdown?: ElementRef;
241
+ inputDiv?: ElementRef;
242
+ modalDiv?: ElementRef;
202
243
  value: _angular_core.ModelSignal<any>;
203
244
  enabled: _angular_core.InputSignal<boolean>;
204
245
  cssClass: _angular_core.InputSignal<string | undefined>;
@@ -206,13 +247,11 @@ declare class FlexDualDatepickerComponent {
206
247
  title: _angular_core.InputSignal<string | undefined>;
207
248
  calendarSwitchPosition: _angular_core.InputSignal<FlexCalendarSystemSwitchPosition>;
208
249
  selectedDate?: Date;
209
- showCalendar: boolean;
210
250
  calendar: FlexCalendarSystem;
211
251
  inputDate: string;
212
252
  isMobile: boolean;
213
- constructor(dateService: DateServiceService);
253
+ constructor(dateService: DateServiceService, deviceDetector: DeviceDetectorService, floating: FloatingUiService);
214
254
  switchCalendar(): void;
215
- toggleCalendar(): void;
216
255
  onDateSelectedFromCalender(e: Date): void;
217
256
  /** Triggered on blur OR Enter key */
218
257
  onManualDateEntered(): void;
@@ -220,14 +259,11 @@ declare class FlexDualDatepickerComponent {
220
259
  private updateDate;
221
260
  formatDate(date: Date): string;
222
261
  private parseInputDate;
223
- inputDiv?: ElementRef;
224
- modalDiv?: ElementRef;
225
- popupDiv?: ElementRef;
226
262
  onDocumentClick(event: MouseEvent): void;
227
- btnRef: ElementRef<HTMLElement>;
228
- menuRef: ElementRef<HTMLElement>;
263
+ openCalendar(): Promise<void>;
229
264
  isOpen: boolean;
230
- toggleMenu(): Promise<void>;
265
+ toggleMenu(): void;
266
+ updateCalendar(): void;
231
267
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlexDualDatepickerComponent, never>;
232
268
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlexDualDatepickerComponent, "flex-dual-datepicker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "enabled": { "alias": "enabled"; "required": false; "isSignal": true; }; "cssClass": { "alias": "cssClass"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "calendarSwitchPosition": { "alias": "calendarSwitchPosition"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
233
269
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dcsl/flex-ui",
3
- "version": "0.0.24",
3
+ "version": "0.0.26",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=20.0.0",
6
6
  "@angular/core": ">=20.0.0",