@dragonworks/ngx-dashboard-widgets 20.1.2 → 20.1.3

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 +1 @@
1
- {"version":3,"file":"dragonworks-ngx-dashboard-widgets.mjs","sources":["../../../projects/ngx-dashboard-widgets/src/lib/widgets/arrow-widget/arrow-widget.metadata.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/arrow-widget/arrow-state-dialog.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/arrow-widget/arrow-widget.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/arrow-widget/arrow-widget.component.html","../../../projects/ngx-dashboard-widgets/src/lib/widgets/label-widget/label-widget.metadata.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/label-widget/label-state-dialog.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/directives/responsive-text.directive.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/label-widget/label-widget.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/label-widget/label-widget.component.html","../../../projects/ngx-dashboard-widgets/src/lib/widgets/clock-widget/clock-widget.metadata.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/clock-widget/clock-state-dialog.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/clock-widget/digital-clock/digital-clock.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/clock-widget/digital-clock/digital-clock.component.html","../../../projects/ngx-dashboard-widgets/src/lib/widgets/clock-widget/analog-clock/analog-clock.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/clock-widget/analog-clock/analog-clock.component.html","../../../projects/ngx-dashboard-widgets/src/lib/widgets/clock-widget/clock-widget.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/clock-widget/clock-widget.component.html","../../../projects/ngx-dashboard-widgets/src/lib/components/radial-gauge/radial-gauge.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/components/radial-gauge/radial-gauge.component.html","../../../projects/ngx-dashboard-widgets/src/lib/widgets/radial-gauge-widget/radial-gauge-widget.metadata.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/radial-gauge-widget/radial-gauge-state-dialog.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/radial-gauge-widget/radial-gauge-widget.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/radial-gauge-widget/radial-gauge-widget.component.html","../../../projects/ngx-dashboard-widgets/src/public-api.ts","../../../projects/ngx-dashboard-widgets/src/dragonworks-ngx-dashboard-widgets.ts"],"sourcesContent":["// arrow-widget.metadata.ts\r\nexport const svgIcon =\r\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path fill=\"currentColor\" d=\"M320-120v-320H120l360-440 360 440H640v320H320Zm80-80h160v-320h111L480-754 289-520h111v320Zm80-320Z\"/></svg>';\r\n","import { Component, inject, signal, computed } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport {\r\n MAT_DIALOG_DATA,\r\n MatDialogRef,\r\n MatDialogModule,\r\n} from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { ArrowWidgetState } from './arrow-widget.component';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSliderModule } from '@angular/material/slider';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\n\r\n@Component({\r\n selector: 'lib-arrow-state-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatSelectModule,\r\n MatSliderModule,\r\n MatSlideToggleModule,\r\n ],\r\n template: `\r\n <h2 mat-dialog-title>Arrow Settings</h2>\r\n <mat-dialog-content>\r\n <!-- Direction Selection -->\r\n <mat-form-field appearance=\"outline\" class=\"direction-field\">\r\n <mat-label>Arrow Direction</mat-label>\r\n <mat-select\r\n [value]=\"direction()\"\r\n (selectionChange)=\"direction.set($any($event.value))\"\r\n >\r\n <mat-option value=\"up\">Up</mat-option>\r\n <mat-option value=\"right\">Right</mat-option>\r\n <mat-option value=\"down\">Down</mat-option>\r\n <mat-option value=\"left\">Left</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- Opacity Slider -->\r\n <div class=\"slider-field\">\r\n <div class=\"field-label\">Opacity: {{ formatOpacity(opacity()) }}%</div>\r\n <mat-slider [min]=\"0.1\" [max]=\"1\" [step]=\"0.1\">\r\n <input matSliderThumb [(ngModel)]=\"opacity\" />\r\n </mat-slider>\r\n </div>\r\n\r\n <!-- Background Toggle -->\r\n <div class=\"toggle-field\">\r\n <mat-slide-toggle \r\n [checked]=\"hasBackground()\"\r\n (change)=\"onBackgroundToggle($event.checked)\">\r\n Background\r\n </mat-slide-toggle>\r\n <span class=\"toggle-hint\">Adds a background behind the arrow</span>\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button (click)=\"onCancel()\">Cancel</button>\r\n <button mat-flat-button (click)=\"save()\" [disabled]=\"!hasChanged()\">\r\n Save\r\n </button>\r\n </mat-dialog-actions>\r\n `,\r\n styles: [\r\n `\r\n mat-dialog-content {\r\n display: block;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n }\r\n\r\n mat-form-field {\r\n width: 100%;\r\n display: block;\r\n margin-bottom: 1rem;\r\n }\r\n\r\n .direction-field {\r\n margin-top: 1rem;\r\n }\r\n\r\n /* Opacity slider section */\r\n .slider-field {\r\n margin-bottom: 1.5rem;\r\n margin-right: 1rem;\r\n }\r\n\r\n .field-label {\r\n display: block;\r\n margin-bottom: 0.5rem;\r\n }\r\n\r\n mat-slider {\r\n width: 100%;\r\n display: block;\r\n }\r\n\r\n /* Toggle section */\r\n .toggle-field {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.75rem;\r\n margin-bottom: 0.5rem;\r\n }\r\n\r\n .toggle-hint {\r\n margin: 0;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class ArrowStateDialogComponent {\r\n private readonly data = inject<ArrowWidgetState>(MAT_DIALOG_DATA);\r\n private readonly dialogRef = inject(MatDialogRef<ArrowStateDialogComponent>);\r\n\r\n // State signals\r\n readonly direction = signal<'left' | 'up' | 'right' | 'down'>(\r\n this.data.direction\r\n );\r\n readonly opacity = signal<number>(this.data.opacity ?? 1);\r\n readonly hasBackground = signal<boolean>(this.data.hasBackground ?? true);\r\n readonly transparentBackground = signal<boolean>(!(this.data.hasBackground ?? true));\r\n\r\n // Store original values for comparison\r\n private readonly originalDirection = this.data.direction;\r\n private readonly originalOpacity = this.data.opacity ?? 1;\r\n private readonly originalHasBackground = this.data.hasBackground ?? true;\r\n\r\n // Computed values\r\n readonly rotation = computed(() => {\r\n const rotationMap = {\r\n up: 0,\r\n right: 90,\r\n down: 180,\r\n left: 270,\r\n };\r\n return rotationMap[this.direction()];\r\n });\r\n\r\n readonly rotationTransform = computed(() => `rotate(${this.rotation()}deg)`);\r\n\r\n readonly directionName = computed(() => {\r\n const nameMap = {\r\n up: 'Up',\r\n right: 'Right',\r\n down: 'Down',\r\n left: 'Left',\r\n };\r\n return nameMap[this.direction()];\r\n });\r\n\r\n readonly hasChanged = computed(\r\n () =>\r\n this.direction() !== this.originalDirection ||\r\n this.opacity() !== this.originalOpacity ||\r\n this.hasBackground() !== this.originalHasBackground\r\n );\r\n\r\n formatOpacity(value: number): number {\r\n return Math.round(value * 100);\r\n }\r\n\r\n onBackgroundToggle(hasBackground: boolean): void {\r\n this.hasBackground.set(hasBackground);\r\n this.transparentBackground.set(!hasBackground);\r\n }\r\n\r\n onCancel(): void {\r\n this.dialogRef.close();\r\n }\r\n\r\n save(): void {\r\n this.dialogRef.close({\r\n direction: this.direction(),\r\n opacity: this.opacity(),\r\n hasBackground: this.hasBackground(),\r\n } as ArrowWidgetState);\r\n }\r\n}\r\n","// arrow-widget.component.ts\r\nimport { Component, inject, signal, computed } from '@angular/core';\r\nimport { Widget, WidgetMetadata } from '@dragonworks/ngx-dashboard';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { svgIcon } from './arrow-widget.metadata';\r\nimport { ArrowStateDialogComponent } from './arrow-state-dialog.component';\r\n\r\nexport interface ArrowWidgetState {\r\n direction: 'left' | 'up' | 'right' | 'down';\r\n opacity?: number;\r\n hasBackground?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-dashboard-arrow-widget',\r\n imports: [],\r\n templateUrl: './arrow-widget.component.html',\r\n styleUrl: './arrow-widget.component.scss',\r\n})\r\nexport class ArrowWidgetComponent implements Widget {\r\n static metadata: WidgetMetadata = {\r\n widgetTypeid: '@ngx-dashboard/arrow-widget',\r\n name: 'Arrow',\r\n description: 'A generic arrow',\r\n svgIcon,\r\n };\r\n\r\n readonly #sanitizer = inject(DomSanitizer);\r\n readonly #dialog = inject(MatDialog);\r\n\r\n readonly safeSvgIcon = this.#sanitizer.bypassSecurityTrustHtml(svgIcon);\r\n\r\n readonly state = signal<ArrowWidgetState>({\r\n direction: 'up',\r\n opacity: 0.3,\r\n hasBackground: true,\r\n });\r\n // Computed rotation\r\n readonly rotationAngle = computed(() => {\r\n const rotationMap = {\r\n up: 0,\r\n right: 90,\r\n down: 180,\r\n left: 270,\r\n };\r\n return rotationMap[this.state().direction];\r\n });\r\n\r\n dashboardSetState(state?: unknown): void {\r\n if (state) {\r\n this.state.update((current) => ({\r\n ...current,\r\n ...(state as ArrowWidgetState),\r\n }));\r\n }\r\n }\r\n\r\n dashboardGetState(): ArrowWidgetState {\r\n return this.state();\r\n }\r\n\r\n dashboardEditState(): void {\r\n const dialogRef = this.#dialog.open(ArrowStateDialogComponent, {\r\n data: this.state(),\r\n width: '400px',\r\n maxWidth: '90vw',\r\n disableClose: false,\r\n autoFocus: false,\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((result) => {\r\n if (result) {\r\n this.state.set(result);\r\n }\r\n });\r\n }\r\n}\r\n","<!-- arrow-widget.component.html -->\r\n<div class=\"svg-wrapper\" [class.has-background]=\"state().hasBackground\">\r\n <div\r\n class=\"svg-placeholder\"\r\n [innerHTML]=\"safeSvgIcon\"\r\n [style.transform]=\"'rotate(' + rotationAngle() + 'deg)'\"\r\n [style.opacity]=\"state().opacity\"\r\n ></div>\r\n</div>\r\n","// label-widget.metadata.ts\r\nexport const svgIcon =\r\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path fill=\"currentColor\" d=\"M280-280h280v-80H280v80Zm0-160h400v-80H280v80Zm0-160h400v-80H280v80Zm-80 480q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0-560v560-560Z\"/></svg>';\r\n","import { Component, inject, signal, computed } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport {\r\n MAT_DIALOG_DATA,\r\n MatDialogRef,\r\n MatDialogModule,\r\n} from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSliderModule } from '@angular/material/slider';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle'; // Add this import\r\nimport { LabelWidgetState } from './label-widget.component';\r\n\r\n@Component({\r\n selector: 'lib-label-state-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatSliderModule,\r\n MatSlideToggleModule, // Add this import\r\n ],\r\n template: `\r\n <h2 mat-dialog-title>Label Settings</h2>\r\n <mat-dialog-content>\r\n <mat-form-field appearance=\"outline\" class=\"label-text-field\">\r\n <mat-label>Label Text</mat-label>\r\n <input\r\n matInput\r\n type=\"text\"\r\n [value]=\"label()\"\r\n (input)=\"label.set($any($event.target).value)\"\r\n placeholder=\"Enter your label text...\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- Responsive Text Toggle -->\r\n <div class=\"toggle-section\">\r\n <mat-slide-toggle \r\n [checked]=\"responsive()\"\r\n (change)=\"responsive.set($event.checked)\">\r\n Responsive Text\r\n </mat-slide-toggle>\r\n <span class=\"toggle-description\"\r\n >Automatically adjust text size to fit the widget</span\r\n >\r\n </div>\r\n\r\n <!-- Responsive Font Size Constraints (only shown when responsive is enabled) -->\r\n @if (responsive()) {\r\n <div class=\"responsive-section\">\r\n <div class=\"section-label\">Font Size Limits</div>\r\n <div class=\"row-layout\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Min Size (px)</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [value]=\"minFontSize()\"\r\n (input)=\"validateAndCorrectMinFontSize(+$any($event.target).value)\"\r\n (blur)=\"validateAndCorrectMinFontSize(minFontSize())\"\r\n min=\"8\"\r\n max=\"24\"\r\n placeholder=\"8\"\r\n />\r\n @if (!isMinFontSizeValid() || !isFontSizeRangeValid()) {\r\n <mat-error>\r\n @if (!isMinFontSizeValid()) {\r\n Must be between 8-24px\r\n } @else {\r\n Must be less than max size\r\n }\r\n </mat-error>\r\n } @else {\r\n <mat-hint>8-24px range</mat-hint>\r\n }\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Max Size (px)</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [value]=\"maxFontSize()\"\r\n (input)=\"validateAndCorrectMaxFontSize(+$any($event.target).value)\"\r\n (blur)=\"validateAndCorrectMaxFontSize(maxFontSize())\"\r\n min=\"16\"\r\n max=\"128\"\r\n placeholder=\"64\"\r\n />\r\n @if (!isMaxFontSizeValid() || !isFontSizeRangeValid()) {\r\n <mat-error>\r\n @if (!isMaxFontSizeValid()) {\r\n Must be between 16-128px\r\n } @else {\r\n Must be greater than min size\r\n }\r\n </mat-error>\r\n } @else {\r\n <mat-hint>16-128px range</mat-hint>\r\n }\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"row-layout\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Font Size (px)</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [value]=\"fontSize()\"\r\n (input)=\"fontSize.set(+$any($event.target).value)\"\r\n [disabled]=\"responsive()\"\r\n min=\"8\"\r\n max=\"48\"\r\n placeholder=\"16\"\r\n />\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Alignment</mat-label>\r\n <mat-select\r\n [value]=\"alignment()\"\r\n (selectionChange)=\"alignment.set($any($event.value))\"\r\n >\r\n <mat-option value=\"left\">Left</mat-option>\r\n <mat-option value=\"center\">Center</mat-option>\r\n <mat-option value=\"right\">Right</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Font Weight</mat-label>\r\n <mat-select\r\n [value]=\"fontWeight()\"\r\n (selectionChange)=\"fontWeight.set($any($event.value))\"\r\n >\r\n <mat-option value=\"normal\">Normal</mat-option>\r\n <mat-option value=\"bold\">Bold</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- Opacity Slider -->\r\n <div class=\"slider-section\">\r\n <div class=\"slider-label\">Opacity: {{ formatOpacity(opacity()) }}%</div>\r\n <mat-slider [min]=\"0.1\" [max]=\"1\" [step]=\"0.1\">\r\n <input matSliderThumb [(ngModel)]=\"opacity\" />\r\n </mat-slider>\r\n </div>\r\n\r\n <!-- Background Toggle -->\r\n <div class=\"toggle-section\">\r\n <mat-slide-toggle \r\n [checked]=\"!transparentBackground()\"\r\n (change)=\"onBackgroundToggle($event.checked)\">\r\n Background\r\n </mat-slide-toggle>\r\n <span class=\"toggle-description\"\r\n >Adds a background behind the text</span\r\n >\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button (click)=\"onCancel()\">Cancel</button>\r\n <button mat-flat-button (click)=\"save()\" [disabled]=\"!hasChanged() || !isFormValid()\">\r\n Save\r\n </button>\r\n </mat-dialog-actions>\r\n `,\r\n styles: [\r\n `\r\n mat-dialog-content {\r\n display: block;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n }\r\n\r\n mat-form-field {\r\n width: 100%;\r\n display: block;\r\n margin-bottom: 1rem;\r\n }\r\n\r\n .label-text-field {\r\n margin-top: 1rem;\r\n }\r\n\r\n /* Side-by-side layout for font size and alignment */\r\n .row-layout {\r\n display: grid;\r\n grid-template-columns: 1fr 1fr;\r\n gap: 1rem;\r\n margin-bottom: 1rem;\r\n }\r\n\r\n .row-layout mat-form-field {\r\n margin-bottom: 0;\r\n }\r\n\r\n /* Opacity slider section */\r\n .slider-section {\r\n margin-bottom: 1.5rem;\r\n margin-right: 1rem;\r\n }\r\n\r\n .slider-label {\r\n display: block;\r\n margin-bottom: 0.5rem;\r\n }\r\n\r\n mat-slider {\r\n width: 100%;\r\n display: block;\r\n }\r\n\r\n /* Toggle section */\r\n .toggle-section {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.75rem;\r\n margin-bottom: 1rem;\r\n }\r\n\r\n .toggle-description {\r\n margin: 0;\r\n }\r\n\r\n /* Responsive font size section */\r\n .responsive-section {\r\n margin-bottom: 1.5rem;\r\n padding: 1rem;\r\n border-radius: 12px;\r\n background-color: var(--mat-app-surface-variant, rgba(var(--mat-app-on-surface-rgb, 0, 0, 0), 0.05));\r\n border: 1px solid var(--mat-app-outline-variant, rgba(var(--mat-app-on-surface-rgb, 0, 0, 0), 0.12));\r\n }\r\n\r\n .section-label {\r\n display: block;\r\n margin-bottom: 0.75rem;\r\n font-weight: 500;\r\n color: var(--mat-app-on-surface-variant, rgba(var(--mat-app-on-surface-rgb, 0, 0, 0), 0.6));\r\n }\r\n\r\n /* Ensure responsive section row layout has no bottom margin */\r\n .responsive-section .row-layout {\r\n margin-bottom: 0;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class LabelStateDialogComponent {\r\n private readonly data = inject<LabelWidgetState>(MAT_DIALOG_DATA);\r\n private readonly dialogRef = inject(MatDialogRef<LabelStateDialogComponent>);\r\n\r\n // State signals\r\n readonly label = signal<string>(this.data.label ?? '');\r\n readonly fontSize = signal<number>(this.data.fontSize ?? 16);\r\n readonly alignment = signal<'left' | 'center' | 'right'>(\r\n this.data.alignment ?? 'center'\r\n );\r\n readonly fontWeight = signal<'normal' | 'bold'>(\r\n this.data.fontWeight ?? 'normal'\r\n );\r\n readonly opacity = signal<number>(this.data.opacity ?? 1);\r\n readonly hasBackground = signal<boolean>(this.data.hasBackground ?? true);\r\n readonly transparentBackground = signal<boolean>(!(this.data.hasBackground ?? true));\r\n readonly responsive = signal<boolean>(this.data.responsive ?? false);\r\n // Responsive font size constraints\r\n readonly minFontSize = signal<number>(this.data.minFontSize ?? 8);\r\n readonly maxFontSize = signal<number>(this.data.maxFontSize ?? 64);\r\n\r\n // Store original values for comparison\r\n private readonly originalLabel = this.data.label ?? '';\r\n private readonly originalFontSize = this.data.fontSize ?? 16;\r\n private readonly originalAlignment = this.data.alignment ?? 'center';\r\n private readonly originalFontWeight = this.data.fontWeight ?? 'normal';\r\n private readonly originalOpacity = this.data.opacity ?? 1;\r\n private readonly originalHasBackground = this.data.hasBackground ?? true;\r\n private readonly originalResponsive = this.data.responsive ?? false;\r\n private readonly originalMinFontSize = this.data.minFontSize ?? 8;\r\n private readonly originalMaxFontSize = this.data.maxFontSize ?? 64;\r\n\r\n // Validation computed properties\r\n readonly isMinFontSizeValid = computed(() => {\r\n const min = this.minFontSize();\r\n return min >= 8 && min <= 24;\r\n });\r\n\r\n readonly isMaxFontSizeValid = computed(() => {\r\n const max = this.maxFontSize();\r\n return max >= 16 && max <= 128;\r\n });\r\n\r\n readonly isFontSizeRangeValid = computed(() =>\r\n this.minFontSize() < this.maxFontSize()\r\n );\r\n\r\n readonly isFormValid = computed(() =>\r\n this.isMinFontSizeValid() &&\r\n this.isMaxFontSizeValid() &&\r\n this.isFontSizeRangeValid()\r\n );\r\n\r\n // Computed values\r\n readonly hasChanged = computed(\r\n () =>\r\n this.label() !== this.originalLabel ||\r\n this.fontSize() !== this.originalFontSize ||\r\n this.alignment() !== this.originalAlignment ||\r\n this.fontWeight() !== this.originalFontWeight ||\r\n this.opacity() !== this.originalOpacity ||\r\n this.hasBackground() !== this.originalHasBackground ||\r\n this.responsive() !== this.originalResponsive ||\r\n this.minFontSize() !== this.originalMinFontSize ||\r\n this.maxFontSize() !== this.originalMaxFontSize\r\n );\r\n\r\n formatOpacity(value: number): number {\r\n return Math.round(value * 100);\r\n }\r\n\r\n formatOpacitySlider = (value: number): string => {\r\n return `${Math.round(value * 100)}%`;\r\n };\r\n\r\n // Validation methods with robust min < max enforcement\r\n validateAndCorrectMinFontSize(value: number): void {\r\n // Clamp to valid range\r\n const corrected = Math.max(8, Math.min(24, value));\r\n this.minFontSize.set(corrected);\r\n \r\n // Ensure min < max with adequate gap\r\n if (corrected >= this.maxFontSize()) {\r\n const newMax = Math.min(128, corrected + 8); // Ensure at least 8px gap\r\n this.maxFontSize.set(newMax);\r\n }\r\n }\r\n\r\n validateAndCorrectMaxFontSize(value: number): void {\r\n // Clamp to valid range\r\n const corrected = Math.max(16, Math.min(128, value));\r\n this.maxFontSize.set(corrected);\r\n \r\n // Ensure min < max with adequate gap\r\n if (corrected <= this.minFontSize()) {\r\n const newMin = Math.max(8, corrected - 8); // Ensure at least 8px gap\r\n this.minFontSize.set(newMin);\r\n }\r\n }\r\n\r\n onBackgroundToggle(hasWhiteBackground: boolean): void {\r\n this.hasBackground.set(hasWhiteBackground);\r\n this.transparentBackground.set(!hasWhiteBackground);\r\n }\r\n\r\n onCancel(): void {\r\n this.dialogRef.close();\r\n }\r\n\r\n save(): void {\r\n this.dialogRef.close({\r\n label: this.label(),\r\n fontSize: this.fontSize(),\r\n alignment: this.alignment(),\r\n fontWeight: this.fontWeight(),\r\n opacity: this.opacity(),\r\n hasBackground: this.hasBackground(),\r\n responsive: this.responsive(),\r\n minFontSize: this.minFontSize(),\r\n maxFontSize: this.maxFontSize(),\r\n } as LabelWidgetState);\r\n }\r\n}\r\n","import {\r\n Directive,\r\n ElementRef,\r\n inject,\r\n DestroyRef,\r\n numberAttribute,\r\n booleanAttribute,\r\n input,\r\n AfterViewInit,\r\n} from '@angular/core';\r\nimport { NgZone, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\n/**\r\n * Directive that automatically adjusts font size to fit text within its parent container.\r\n * Uses canvas-based measurement for performance and DOM verification for accuracy.\r\n *\r\n * @example\r\n * <div class=\"container\">\r\n * <span responsiveText [minFontSize]=\"12\" [maxFontSize]=\"72\">Dynamic text here</span>\r\n * </div>\r\n */\r\n@Directive({\r\n selector: '[libResponsiveText]',\r\n standalone: true,\r\n host: {\r\n '[style.display]': '\"block\"',\r\n '[style.width]': '\"100%\"',\r\n '[style.white-space]': '\"nowrap\"',\r\n '[style.overflow]': '\"visible\"',\r\n },\r\n})\r\nexport class ResponsiveTextDirective implements AfterViewInit {\r\n /* ───────────────────────── Inputs with transforms ─────────────── */\r\n /** Minimum font-size in pixels (accessibility floor) */\r\n minFontSize = input(8, { transform: numberAttribute });\r\n\r\n /** Maximum font-size in pixels (layout ceiling) */\r\n maxFontSize = input(512, { transform: numberAttribute });\r\n\r\n /**\r\n * Line-height: pass a multiplier (e.g. 1.1) or absolute px value.\r\n * For single-line text a multiplier < 10 is treated as unitless.\r\n */\r\n lineHeight = input(1.1, { transform: numberAttribute });\r\n\r\n /** Whether to observe text mutations after first render */\r\n observeMutations = input(true, { transform: booleanAttribute });\r\n\r\n /** Debounce delay in ms for resize/mutation callbacks */\r\n debounceMs = input(16, { transform: numberAttribute });\r\n\r\n /* ───────────────────────── Private state ───────────────────────── */\r\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly zone = inject(NgZone);\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n // Canvas context - lazy initialization\r\n private _ctx?: CanvasRenderingContext2D;\r\n private get ctx(): CanvasRenderingContext2D {\r\n if (!this._ctx) {\r\n const canvas = document.createElement('canvas');\r\n this._ctx = canvas.getContext('2d', {\r\n willReadFrequently: true,\r\n alpha: false,\r\n })!;\r\n }\r\n return this._ctx;\r\n }\r\n\r\n private ro?: ResizeObserver;\r\n private mo?: MutationObserver;\r\n private fitTimeout?: number;\r\n\r\n // Cache for performance\r\n private lastText = '';\r\n private lastMaxW = 0;\r\n private lastMaxH = 0;\r\n private lastFontSize = 0;\r\n\r\n constructor() {\r\n // Set up cleanup on component destruction using modern DestroyRef\r\n this.destroyRef.onDestroy(() => {\r\n this.cleanup();\r\n });\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n\r\n // Set initial styles\r\n const span = this.el.nativeElement;\r\n span.style.transition = 'font-size 0.1s ease-out';\r\n\r\n // All observer callbacks run outside Angular's zone\r\n this.zone.runOutsideAngular(() => {\r\n this.fit();\r\n this.observeResize();\r\n if (this.observeMutations()) {\r\n this.observeText();\r\n }\r\n });\r\n }\r\n\r\n /* ───────────────────── Core fitting logic ───────────────────── */\r\n /**\r\n * Debounced fit handler to prevent excessive recalculations\r\n */\r\n private requestFit = () => {\r\n if (this.fitTimeout) {\r\n cancelAnimationFrame(this.fitTimeout);\r\n }\r\n\r\n this.fitTimeout = requestAnimationFrame(() => {\r\n this.fit();\r\n });\r\n };\r\n\r\n /**\r\n * Recalculate & apply the ideal font-size\r\n */\r\n private fit = () => {\r\n const span = this.el.nativeElement;\r\n const parent = span.parentElement;\r\n\r\n if (!parent) return;\r\n\r\n const text = span.textContent?.trim() || '';\r\n if (!text) {\r\n span.style.fontSize = `${this.minFontSize()}px`;\r\n return;\r\n }\r\n\r\n const { maxW, maxH } = this.getAvailableSpace(parent);\r\n\r\n // Check cache to avoid redundant calculations\r\n if (\r\n text === this.lastText &&\r\n maxW === this.lastMaxW &&\r\n maxH === this.lastMaxH &&\r\n this.lastFontSize > 0\r\n ) {\r\n return;\r\n }\r\n\r\n // Calculate with conservative buffer for sub-pixel accuracy\r\n const ideal = this.calcFit(text, maxW * 0.98, maxH * 0.98);\r\n\r\n span.style.fontSize = `${ideal}px`;\r\n\r\n // DOM verification pass\r\n this.verifyFit(span, maxW, maxH, ideal);\r\n\r\n // Update cache\r\n this.lastText = text;\r\n this.lastMaxW = maxW;\r\n this.lastMaxH = maxH;\r\n this.lastFontSize = parseFloat(span.style.fontSize);\r\n };\r\n\r\n /**\r\n * Calculate available space accounting for padding and borders\r\n */\r\n private getAvailableSpace(parent: HTMLElement): {\r\n maxW: number;\r\n maxH: number;\r\n } {\r\n const cs = getComputedStyle(parent);\r\n const maxW =\r\n parent.clientWidth -\r\n parseFloat(cs.paddingLeft) -\r\n parseFloat(cs.paddingRight);\r\n const maxH =\r\n parent.clientHeight -\r\n parseFloat(cs.paddingTop) -\r\n parseFloat(cs.paddingBottom);\r\n\r\n return { maxW: Math.max(0, maxW), maxH: Math.max(0, maxH) };\r\n }\r\n\r\n /**\r\n * DOM-based verification to handle sub-pixel discrepancies\r\n */\r\n private verifyFit(\r\n span: HTMLElement,\r\n maxW: number,\r\n maxH: number,\r\n ideal: number\r\n ) {\r\n // Simple synchronous verification\r\n if (span.scrollWidth > maxW || span.scrollHeight > maxH) {\r\n let safe = ideal;\r\n let iterations = 0;\r\n const maxIterations = 10;\r\n\r\n while (\r\n iterations < maxIterations &&\r\n safe > this.minFontSize() &&\r\n (span.scrollWidth > maxW || span.scrollHeight > maxH)\r\n ) {\r\n safe -= 0.25;\r\n span.style.fontSize = `${safe}px`;\r\n iterations++;\r\n }\r\n\r\n // Update cache with verified size\r\n this.lastFontSize = safe;\r\n }\r\n }\r\n\r\n /* ───────────────────── Binary search algorithm ────────────────── */\r\n /**\r\n * Binary search for optimal font size using canvas measurements\r\n */\r\n private calcFit(\r\n text: string,\r\n maxW: number,\r\n maxH: number,\r\n precision = 0.1\r\n ): number {\r\n if (maxW <= 0 || maxH <= 0) return this.minFontSize();\r\n\r\n const computedStyle = getComputedStyle(this.el.nativeElement);\r\n const fontFamily = computedStyle.fontFamily || 'sans-serif';\r\n const fontWeight = computedStyle.fontWeight || '400';\r\n\r\n let lo = this.minFontSize();\r\n let hi = this.maxFontSize();\r\n let bestFit = this.minFontSize();\r\n\r\n while (hi - lo > precision) {\r\n const mid = (hi + lo) / 2;\r\n this.ctx.font = `${fontWeight} ${mid}px ${fontFamily}`;\r\n\r\n const metrics = this.ctx.measureText(text);\r\n const width = metrics.width;\r\n\r\n // Calculate height based on available metrics\r\n const height = this.calculateTextHeight(metrics, mid);\r\n\r\n if (width <= maxW && height <= maxH) {\r\n bestFit = mid;\r\n lo = mid;\r\n } else {\r\n hi = mid;\r\n }\r\n }\r\n\r\n return Math.floor(bestFit * 100) / 100;\r\n }\r\n\r\n /**\r\n * Calculate text height from metrics\r\n */\r\n private calculateTextHeight(metrics: TextMetrics, fontSize: number): number {\r\n // Use font bounding box metrics if available\r\n if (metrics.fontBoundingBoxAscent && metrics.fontBoundingBoxDescent) {\r\n return metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent;\r\n }\r\n\r\n // Fallback to actual bounding box\r\n if (metrics.actualBoundingBoxAscent && metrics.actualBoundingBoxDescent) {\r\n return metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent;\r\n }\r\n\r\n // Final fallback using line height\r\n return this.lineHeight() < 10\r\n ? fontSize * this.lineHeight()\r\n : this.lineHeight();\r\n }\r\n\r\n /* ───────────────────────── Observers ─────────────────────────── */\r\n /**\r\n * Observe parent container resizes\r\n */\r\n private observeResize() {\r\n if (!('ResizeObserver' in window)) return;\r\n\r\n this.ro = new ResizeObserver((entries) => {\r\n // Only trigger if size actually changed\r\n const entry = entries[0];\r\n if (entry?.contentRect) {\r\n this.requestFit();\r\n }\r\n });\r\n\r\n const parent = this.el.nativeElement.parentElement;\r\n if (parent) {\r\n this.ro.observe(parent);\r\n }\r\n }\r\n\r\n /**\r\n * Observe text content changes\r\n */\r\n private observeText() {\r\n if (!('MutationObserver' in window)) return;\r\n\r\n this.mo = new MutationObserver((mutations) => {\r\n // Check if text actually changed\r\n const hasTextChange = mutations.some(\r\n (m) =>\r\n m.type === 'characterData' ||\r\n (m.type === 'childList' &&\r\n (m.addedNodes.length > 0 || m.removedNodes.length > 0))\r\n );\r\n\r\n if (hasTextChange) {\r\n this.requestFit();\r\n }\r\n });\r\n\r\n this.mo.observe(this.el.nativeElement, {\r\n characterData: true,\r\n childList: true,\r\n subtree: true,\r\n });\r\n }\r\n\r\n /**\r\n * Cleanup resources\r\n */\r\n private cleanup() {\r\n this.ro?.disconnect();\r\n this.mo?.disconnect();\r\n\r\n if (this.fitTimeout) {\r\n cancelAnimationFrame(this.fitTimeout);\r\n }\r\n\r\n // Clear canvas context\r\n this._ctx = undefined;\r\n }\r\n}\r\n","// label-widget.component.ts\r\nimport { Component, inject, signal, computed } from '@angular/core';\r\nimport { Widget, WidgetMetadata } from '@dragonworks/ngx-dashboard';\r\nimport { svgIcon } from './label-widget.metadata';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { LabelStateDialogComponent } from './label-state-dialog.component';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ResponsiveTextDirective } from '../../directives/responsive-text.directive';\r\n\r\nexport interface LabelWidgetState {\r\n label: string;\r\n fontSize?: number;\r\n alignment?: 'left' | 'center' | 'right';\r\n fontWeight?: 'normal' | 'bold';\r\n opacity?: number;\r\n hasBackground?: boolean;\r\n responsive?: boolean;\r\n // Font size constraints for responsive text (px values)\r\n minFontSize?: number; // Default: 8px (accessible minimum)\r\n maxFontSize?: number; // Default: 64px (practical widget maximum)\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-dashboard-label-widget',\r\n imports: [ResponsiveTextDirective],\r\n templateUrl: './label-widget.component.html',\r\n styleUrl: './label-widget.component.scss',\r\n})\r\nexport class LabelWidgetComponent implements Widget {\r\n static metadata: WidgetMetadata = {\r\n widgetTypeid: '@ngx-dashboard/label-widget',\r\n name: 'Label',\r\n description: 'A generic text label',\r\n svgIcon,\r\n };\r\n\r\n readonly #sanitizer = inject(DomSanitizer);\r\n readonly #dialog = inject(MatDialog);\r\n\r\n safeSvgIcon = this.#sanitizer.bypassSecurityTrustHtml(svgIcon);\r\n\r\n state = signal<LabelWidgetState>({\r\n label: '',\r\n fontSize: 16,\r\n alignment: 'center',\r\n fontWeight: 'normal',\r\n opacity: 1,\r\n hasBackground: true,\r\n responsive: false,\r\n minFontSize: 8, // Accessible minimum for responsive text\r\n maxFontSize: 64, // Practical maximum for widget display\r\n });\r\n\r\n dashboardSetState(state?: unknown) {\r\n if (state) {\r\n this.state.update((current) => ({\r\n ...current,\r\n ...(state as LabelWidgetState),\r\n }));\r\n }\r\n }\r\n\r\n dashboardGetState(): LabelWidgetState {\r\n return { ...this.state() };\r\n }\r\n\r\n dashboardEditState(): void {\r\n const dialogRef = this.#dialog.open(LabelStateDialogComponent, {\r\n data: this.dashboardGetState(),\r\n width: '400px',\r\n maxWidth: '90vw',\r\n disableClose: false,\r\n autoFocus: false,\r\n });\r\n\r\n dialogRef\r\n .afterClosed()\r\n .subscribe((result: LabelWidgetState | undefined) => {\r\n if (result) {\r\n this.state.set(result);\r\n }\r\n });\r\n }\r\n\r\n get hasContent(): boolean {\r\n return !!this.state().label?.trim();\r\n }\r\n\r\n get label(): string {\r\n return this.state().label?.trim();\r\n }\r\n\r\n // Computed properties for responsive font size limits with fallbacks\r\n readonly minFontSize = computed(() => this.state().minFontSize ?? 8);\r\n readonly maxFontSize = computed(() => this.state().maxFontSize ?? 64);\r\n}\r\n","@if (hasContent) {\r\n<div\r\n class=\"label-widget\"\r\n [style.fontSize.rem]=\"state().responsive ? null : state().fontSize! / 16\"\r\n [style.--widget-opacity]=\"state().opacity\"\r\n [class.text-left]=\"state().alignment === 'left'\"\r\n [class.text-right]=\"state().alignment === 'right'\"\r\n [class.font-bold]=\"state().fontWeight === 'bold'\"\r\n [class.has-background]=\"state().hasBackground\"\r\n>\r\n @if (state().responsive) {\r\n <div class=\"label-text\" libResponsiveText [minFontSize]=\"minFontSize()\" [maxFontSize]=\"maxFontSize()\">{{ label }}</div>\r\n } @else {\r\n <div class=\"label-text\">{{ label }}</div>\r\n }\r\n</div>\r\n} @else {\r\n<div class=\"svg-wrapper\" [class.has-background]=\"state().hasBackground\">\r\n <div class=\"svg-placeholder\" [innerHTML]=\"safeSvgIcon\"></div>\r\n</div>\r\n}\r\n","export const svgIcon = `\r\n<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 800 800\" preserveAspectRatio=\"xMidYMid meet\">\r\n <use transform=\"matrix(-1,0,0,1,800,0)\" href=\"#one-half\" />\r\n <g id=\"one-half\">\r\n <g id=\"one-fourth\">\r\n <path d=\"m400 40v107\" stroke-width=\"26.7\" stroke=\"currentColor\" />\r\n <g id=\"one-twelfth\">\r\n <path\r\n d=\"m580 88.233-42.5 73.612\"\r\n stroke-width=\"26.7\"\r\n stroke=\"currentColor\"\r\n />\r\n <g id=\"one-thirtieth\">\r\n <path\r\n id=\"one-sixtieth\"\r\n d=\"m437.63 41.974-3.6585 34.808\"\r\n stroke-width=\"13.6\"\r\n stroke=\"currentColor\"\r\n />\r\n <use transform=\"rotate(6 400 400)\" href=\"#one-sixtieth\" />\r\n </g>\r\n <use transform=\"rotate(12 400 400)\" href=\"#one-thirtieth\" />\r\n </g>\r\n <use transform=\"rotate(30 400 400)\" href=\"#one-twelfth\" />\r\n <use transform=\"rotate(60 400 400)\" href=\"#one-twelfth\" />\r\n </g>\r\n <use transform=\"rotate(90 400 400)\" href=\"#one-fourth\" />\r\n </g>\r\n <path\r\n class=\"clock-hour-hand\"\r\n id=\"anim-clock-hour-hand\"\r\n fill=\"currentColor\"\r\n d=\"m 381.925,476 h 36.15 l 5e-4,-300.03008 L 400,156.25 381.9245,175.96992 Z\"\r\n transform=\"rotate(110.2650694444, 400, 400)\"\r\n />\r\n <path\r\n class=\"clock-minute-hand\"\r\n id=\"anim-clock-minute-hand\"\r\n fill=\"currentColor\"\r\n d=\"M 412.063,496.87456 H 387.937 L 385.249,65.68306 400,52.75 414.751,65.68306 Z\"\r\n transform=\"rotate(243.1808333333, 400, 400)\"\r\n />\r\n</svg>\r\n`;\r\n","import { Component, inject, signal, computed } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport {\r\n MAT_DIALOG_DATA,\r\n MatDialogRef,\r\n MatDialogModule,\r\n} from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { ClockWidgetState } from './clock-widget.component';\r\n\r\n@Component({\r\n selector: 'lib-clock-state-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatRadioModule,\r\n MatSlideToggleModule,\r\n ],\r\n template: `\r\n <h2 mat-dialog-title>Clock Settings</h2>\r\n <mat-dialog-content>\r\n <div class=\"mode-selection\">\r\n <label class=\"section-label\" for=\"mode-selection-group\">Display Mode</label>\r\n <mat-radio-group\r\n id=\"mode-selection-group\"\r\n [value]=\"mode()\"\r\n (change)=\"mode.set($any($event.value))\"\r\n >\r\n <mat-radio-button value=\"digital\">Digital</mat-radio-button>\r\n <mat-radio-button value=\"analog\">Analog</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <!-- Time Format (only for digital mode) -->\r\n @if (mode() === 'digital') {\r\n <div class=\"format-selection\">\r\n <label class=\"section-label\" for=\"time-format-group\">Time Format</label>\r\n <mat-radio-group\r\n id=\"time-format-group\"\r\n [value]=\"timeFormat()\"\r\n (change)=\"timeFormat.set($any($event.value))\"\r\n >\r\n <mat-radio-button value=\"24h\">24 Hour (14:30:45)</mat-radio-button>\r\n <mat-radio-button value=\"12h\">12 Hour (2:30:45 PM)</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n }\r\n\r\n <!-- Show Seconds Toggle (for both digital and analog modes) -->\r\n <div class=\"toggle-section\">\r\n <mat-slide-toggle \r\n [checked]=\"showSeconds()\"\r\n (change)=\"showSeconds.set($event.checked)\">\r\n Show Seconds\r\n </mat-slide-toggle>\r\n <span class=\"toggle-description\">\r\n @if (mode() === 'digital') {\r\n Display seconds in the time\r\n } @else {\r\n Show the second hand on the clock\r\n }\r\n </span>\r\n </div>\r\n\r\n <!-- Background Toggle -->\r\n <div class=\"toggle-section\">\r\n <mat-slide-toggle \r\n [checked]=\"hasBackground()\"\r\n (change)=\"hasBackground.set($event.checked)\">\r\n Background\r\n </mat-slide-toggle>\r\n <span class=\"toggle-description\"\r\n >Adds a background behind the clock</span\r\n >\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button (click)=\"onCancel()\">Cancel</button>\r\n <button mat-flat-button (click)=\"save()\" [disabled]=\"!hasChanged()\">\r\n Save\r\n </button>\r\n </mat-dialog-actions>\r\n `,\r\n styles: [\r\n `\r\n mat-dialog-content {\r\n display: block;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n }\r\n\r\n .mode-selection,\r\n .format-selection {\r\n margin-top: 1rem;\r\n margin-bottom: 2rem;\r\n }\r\n\r\n .section-label {\r\n display: block;\r\n margin-bottom: 0.75rem;\r\n font-weight: 500;\r\n }\r\n\r\n mat-radio-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0.75rem;\r\n }\r\n\r\n mat-radio-button {\r\n margin: 0;\r\n }\r\n\r\n /* Toggle section */\r\n .toggle-section {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.75rem;\r\n margin-bottom: 0.5rem;\r\n }\r\n\r\n .toggle-description {\r\n margin: 0;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class ClockStateDialogComponent {\r\n private readonly data = inject<ClockWidgetState>(MAT_DIALOG_DATA);\r\n private readonly dialogRef = inject(MatDialogRef<ClockStateDialogComponent>);\r\n\r\n // State signals\r\n readonly mode = signal<'analog' | 'digital'>(this.data.mode ?? 'digital');\r\n readonly hasBackground = signal<boolean>(this.data.hasBackground ?? true);\r\n readonly timeFormat = signal<'12h' | '24h'>(this.data.timeFormat ?? '24h');\r\n readonly showSeconds = signal<boolean>(this.data.showSeconds ?? true);\r\n\r\n // Store original values for comparison\r\n private readonly originalMode = this.data.mode ?? 'digital';\r\n private readonly originalHasBackground = this.data.hasBackground ?? true;\r\n private readonly originalTimeFormat = this.data.timeFormat ?? '24h';\r\n private readonly originalShowSeconds = this.data.showSeconds ?? true;\r\n\r\n // Computed values\r\n readonly hasChanged = computed(\r\n () =>\r\n this.mode() !== this.originalMode ||\r\n this.hasBackground() !== this.originalHasBackground ||\r\n this.timeFormat() !== this.originalTimeFormat ||\r\n this.showSeconds() !== this.originalShowSeconds\r\n );\r\n\r\n onCancel(): void {\r\n this.dialogRef.close();\r\n }\r\n\r\n save(): void {\r\n this.dialogRef.close({\r\n mode: this.mode(),\r\n hasBackground: this.hasBackground(),\r\n timeFormat: this.timeFormat(),\r\n showSeconds: this.showSeconds(),\r\n } as ClockWidgetState);\r\n }\r\n}","import {\r\n Component,\r\n inject,\r\n signal,\r\n computed,\r\n DestroyRef,\r\n input,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\n\r\nexport interface DigitalClockConfig {\r\n timeFormat: '12h' | '24h';\r\n showSeconds: boolean;\r\n hasBackground: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-digital-clock',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './digital-clock.component.html',\r\n styleUrl: './digital-clock.component.scss',\r\n host: {\r\n '[class.has-background]': 'hasBackground()',\r\n '[class.show-pm]': 'timeFormat() === \"12h\"',\r\n '[class.show-seconds]': 'showSeconds()',\r\n class: 'clock-widget digital',\r\n },\r\n})\r\nexport class DigitalClockComponent {\r\n readonly #destroyRef = inject(DestroyRef);\r\n\r\n // Inputs\r\n timeFormat = input<'12h' | '24h'>('24h');\r\n showSeconds = input<boolean>(true);\r\n hasBackground = input<boolean>(false);\r\n\r\n // Time tracking\r\n currentTime = signal(new Date());\r\n\r\n formattedTime = computed(() => {\r\n const time = this.currentTime();\r\n const format = this.timeFormat();\r\n const showSecs = this.showSeconds();\r\n return this.#formatTime(time, format, showSecs);\r\n });\r\n\r\n #intervalId: number | null = null;\r\n\r\n #formatTime(time: Date, format: '12h' | '24h', showSecs: boolean): string {\r\n let hours = time.getHours();\r\n const minutes = time.getMinutes();\r\n const seconds = time.getSeconds();\r\n\r\n // Pad with leading zeros\r\n const mm = minutes.toString().padStart(2, '0');\r\n const ss = seconds.toString().padStart(2, '0');\r\n\r\n if (format === '12h') {\r\n // 12-hour format with AM/PM\r\n const ampm = hours >= 12 ? 'PM' : 'AM';\r\n hours = hours % 12;\r\n if (hours === 0) hours = 12; // Convert 0 to 12 for 12 AM/PM\r\n\r\n const hh = hours.toString().padStart(2, '0');\r\n return showSecs ? `${hh}:${mm}:${ss} ${ampm}` : `${hh}:${mm} ${ampm}`;\r\n } else {\r\n // 24-hour format\r\n const hh = hours.toString().padStart(2, '0');\r\n return showSecs ? `${hh}:${mm}:${ss}` : `${hh}:${mm}`;\r\n }\r\n }\r\n\r\n constructor() {\r\n // Set up time update timer\r\n this.#startTimer();\r\n\r\n // Clean up timer on component destruction\r\n this.#destroyRef.onDestroy(() => {\r\n this.#stopTimer();\r\n });\r\n }\r\n\r\n #startTimer(): void {\r\n // Sync to the next second boundary for smooth start\r\n const now = new Date();\r\n const msUntilNextSecond = 1000 - now.getMilliseconds();\r\n\r\n setTimeout(() => {\r\n this.currentTime.set(new Date());\r\n\r\n // Start the regular 1-second interval\r\n this.#intervalId = window.setInterval(() => {\r\n this.currentTime.set(new Date());\r\n }, 1000);\r\n }, msUntilNextSecond);\r\n }\r\n\r\n #stopTimer(): void {\r\n if (this.#intervalId !== null) {\r\n clearInterval(this.#intervalId);\r\n this.#intervalId = null;\r\n }\r\n }\r\n}\r\n","<div responsiveText class=\"digital-time\">{{ formattedTime() }}</div>\r\n","import { Component, ChangeDetectionStrategy, input, inject, signal, computed, DestroyRef, viewChild, ElementRef, Renderer2, effect } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-analog-clock',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './analog-clock.component.html',\r\n styleUrl: './analog-clock.component.scss',\r\n host: {\r\n '[class.has-background]': 'hasBackground()',\r\n '[class.show-seconds]': 'showSeconds()',\r\n 'class': 'clock-widget analog'\r\n }\r\n})\r\nexport class AnalogClockComponent {\r\n readonly #destroyRef = inject(DestroyRef);\r\n readonly #renderer = inject(Renderer2);\r\n\r\n // Inputs\r\n hasBackground = input<boolean>(false);\r\n showSeconds = input<boolean>(true);\r\n\r\n // ViewChild references for clock hands\r\n hourHand = viewChild<ElementRef<SVGPathElement>>('hourHand');\r\n minuteHand = viewChild<ElementRef<SVGPathElement>>('minuteHand');\r\n secondHand = viewChild<ElementRef<SVGPathElement>>('secondHand');\r\n\r\n // Time tracking\r\n currentTime = signal(new Date());\r\n\r\n // Computed rotation signals\r\n secondHandRotation = computed(() => {\r\n const seconds = this.currentTime().getSeconds();\r\n return seconds * 6; // 360° / 60s = 6° per second\r\n });\r\n\r\n minuteHandRotation = computed(() => {\r\n const time = this.currentTime();\r\n const minutes = time.getMinutes();\r\n const seconds = time.getSeconds();\r\n return minutes * 6 + seconds / 10; // Smooth minute hand movement\r\n });\r\n\r\n hourHandRotation = computed(() => {\r\n const time = this.currentTime();\r\n const hours = time.getHours() % 12;\r\n const minutes = time.getMinutes();\r\n const seconds = time.getSeconds();\r\n return hours * 30 + minutes / 2 + seconds / 120; // Smooth hour hand movement\r\n });\r\n\r\n #intervalId: number | null = null;\r\n\r\n constructor() {\r\n // Set up time update timer\r\n this.#startTimer();\r\n \r\n // Clean up timer on component destruction\r\n this.#destroyRef.onDestroy(() => {\r\n this.#stopTimer();\r\n });\r\n\r\n // Update DOM when rotations change\r\n effect(() => {\r\n this.#updateClockHands();\r\n });\r\n }\r\n\r\n #startTimer(): void {\r\n // Sync to the next second boundary for smooth start\r\n const now = new Date();\r\n const msUntilNextSecond = 1000 - now.getMilliseconds();\r\n \r\n setTimeout(() => {\r\n this.currentTime.set(new Date());\r\n \r\n // Start the regular 1-second interval\r\n this.#intervalId = window.setInterval(() => {\r\n this.currentTime.set(new Date());\r\n }, 1000);\r\n }, msUntilNextSecond);\r\n }\r\n\r\n #stopTimer(): void {\r\n if (this.#intervalId !== null) {\r\n clearInterval(this.#intervalId);\r\n this.#intervalId = null;\r\n }\r\n }\r\n\r\n #updateClockHands(): void {\r\n const hourElement = this.hourHand()?.nativeElement;\r\n const minuteElement = this.minuteHand()?.nativeElement;\r\n const secondElement = this.secondHand()?.nativeElement;\r\n\r\n if (hourElement) {\r\n this.#renderer.setAttribute(\r\n hourElement,\r\n 'transform',\r\n `rotate(${this.hourHandRotation()}, 400, 400)`\r\n );\r\n }\r\n\r\n if (minuteElement) {\r\n this.#renderer.setAttribute(\r\n minuteElement,\r\n 'transform',\r\n `rotate(${this.minuteHandRotation()}, 400, 400)`\r\n );\r\n }\r\n\r\n if (secondElement && this.showSeconds()) {\r\n this.#renderer.setAttribute(\r\n secondElement,\r\n 'transform',\r\n `rotate(${this.secondHandRotation()}, 400, 400)`\r\n );\r\n }\r\n }\r\n}","<div class=\"analog-clock-container\">\r\n <div class=\"aspect-ratio-box\">\r\n <svg\r\n version=\"1.1\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 800 800\"\r\n preserveAspectRatio=\"xMidYMid meet\"\r\n >\r\n <!-- Optional face circle; uncomment if you want a visible outline by default -->\r\n <!-- <circle cx=\"400\" cy=\"400\" r=\"400\" fill=\"transparent\" stroke=\"currentColor\" stroke-width=\"2\" /> -->\r\n\r\n <use transform=\"matrix(-1,0,0,1,800,0)\" href=\"#one-half\" />\r\n <g id=\"one-half\">\r\n <g id=\"one-fourth\">\r\n <!-- 12 / 3 / 6 / 9 heavy marks -->\r\n <path d=\"m400 40v107\" stroke-width=\"26.7\" stroke=\"currentColor\" />\r\n <g id=\"one-twelfth\">\r\n <!-- 30° heavy marks -->\r\n <path\r\n d=\"m580 88.233-42.5 73.612\"\r\n stroke-width=\"26.7\"\r\n stroke=\"currentColor\"\r\n />\r\n <g id=\"one-thirtieth\">\r\n <!-- minute/second ticks -->\r\n <path\r\n id=\"one-sixtieth\"\r\n d=\"m437.63 41.974-3.6585 34.808\"\r\n stroke-width=\"13.6\"\r\n stroke=\"currentColor\"\r\n />\r\n <use transform=\"rotate(6 400 400)\" href=\"#one-sixtieth\" />\r\n </g>\r\n <use transform=\"rotate(12 400 400)\" href=\"#one-thirtieth\" />\r\n </g>\r\n <use transform=\"rotate(30 400 400)\" href=\"#one-twelfth\" />\r\n <use transform=\"rotate(60 400 400)\" href=\"#one-twelfth\" />\r\n </g>\r\n <use transform=\"rotate(90 400 400)\" href=\"#one-fourth\" />\r\n </g>\r\n\r\n <!-- Hands -->\r\n <path\r\n class=\"clock-hour-hand\"\r\n id=\"anim-clock-hour-hand\"\r\n #hourHand\r\n d=\"m 381.925,476 h 36.15 l 5e-4,-300.03008 L 400,156.25 381.9245,175.96992 Z\"\r\n transform=\"rotate(110.2650694444, 400, 400)\"\r\n />\r\n <path\r\n class=\"clock-minute-hand\"\r\n id=\"anim-clock-minute-hand\"\r\n #minuteHand\r\n d=\"M 412.063,496.87456 H 387.937 L 385.249,65.68306 400,52.75 414.751,65.68306 Z\"\r\n transform=\"rotate(243.1808333333, 400, 400)\"\r\n />\r\n <path\r\n class=\"clock-second-hand\"\r\n id=\"anim-clock-second-hand\"\r\n #secondHand\r\n d=\"M 397.317,63.51744 395.91962,168.4 C 374.575,170.5125 358.2,188.365 358.2,210 c 0,21.635 16.3,39 36.61214,41.47594 L 391.52847,498 h 16.94306 L 405.1868,251.47593 C 425.5,249 441.8,231.635 441.8,210 c 2e-5,-21.635 -16.375,-39.4875 -37.71971,-41.6 L 402.683,63.51744 400,60 Z M 400,190.534 c 10.888,0 19.466,8.866 19.466,19.466 0,10.6 -8.578,19.466 -19.466,19.466 -10.888,0 -19.466,-8.866 -19.466,-19.466 0,-10.6 8.578,-19.466 19.466,-19.466 z\"\r\n transform=\"rotate(190.85, 400, 400)\"\r\n />\r\n </svg>\r\n </div>\r\n</div>\r\n","// clock-widget.component.ts\r\nimport { Component, inject, signal } from '@angular/core';\r\nimport { Widget, WidgetMetadata } from '@dragonworks/ngx-dashboard';\r\nimport { svgIcon } from './clock-widget.metadata';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { ClockStateDialogComponent } from './clock-state-dialog.component';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { DigitalClockComponent } from './digital-clock/digital-clock.component';\r\nimport { AnalogClockComponent } from './analog-clock/analog-clock.component';\r\n\r\nexport interface ClockWidgetState {\r\n mode: 'analog' | 'digital';\r\n hasBackground?: boolean;\r\n timeFormat?: '12h' | '24h';\r\n showSeconds?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-dashboard-clock-widget',\r\n standalone: true,\r\n imports: [DigitalClockComponent, AnalogClockComponent],\r\n templateUrl: './clock-widget.component.html',\r\n styleUrl: './clock-widget.component.scss',\r\n})\r\nexport class ClockWidgetComponent implements Widget {\r\n static metadata: WidgetMetadata = {\r\n widgetTypeid: '@ngx-dashboard/clock-widget',\r\n name: 'Clock',\r\n description: 'Display time in analog or digital format',\r\n svgIcon,\r\n };\r\n\r\n readonly #sanitizer = inject(DomSanitizer);\r\n readonly #dialog = inject(MatDialog);\r\n\r\n safeSvgIcon = this.#sanitizer.bypassSecurityTrustHtml(svgIcon);\r\n\r\n state = signal<ClockWidgetState>({\r\n mode: 'analog',\r\n hasBackground: true,\r\n timeFormat: '24h',\r\n showSeconds: true,\r\n });\r\n\r\n constructor() {\r\n // No timer logic needed - DigitalClock manages its own time\r\n }\r\n\r\n dashboardSetState(state?: unknown) {\r\n if (state) {\r\n this.state.update((current) => ({\r\n ...current,\r\n ...(state as ClockWidgetState),\r\n }));\r\n }\r\n }\r\n\r\n dashboardGetState(): ClockWidgetState {\r\n return { ...this.state() };\r\n }\r\n\r\n dashboardEditState(): void {\r\n const dialogRef = this.#dialog.open(ClockStateDialogComponent, {\r\n data: this.dashboardGetState(),\r\n width: '400px',\r\n maxWidth: '90vw',\r\n disableClose: false,\r\n autoFocus: false,\r\n });\r\n\r\n dialogRef\r\n .afterClosed()\r\n .subscribe((result: ClockWidgetState | undefined) => {\r\n if (result) {\r\n this.state.set(result);\r\n }\r\n });\r\n }\r\n\r\n get isAnalog(): boolean {\r\n return this.state().mode === 'analog';\r\n }\r\n\r\n get isDigital(): boolean {\r\n return this.state().mode === 'digital';\r\n }\r\n}\r\n","@if (isDigital) {\r\n <lib-digital-clock\r\n [timeFormat]=\"state().timeFormat || '24h'\"\r\n [showSeconds]=\"state().showSeconds ?? true\"\r\n [hasBackground]=\"state().hasBackground ?? false\"\r\n />\r\n} @else if (isAnalog) {\r\n <lib-analog-clock\r\n [hasBackground]=\"state().hasBackground ?? false\"\r\n [showSeconds]=\"state().showSeconds ?? true\"\r\n />\r\n} @else {\r\n<div class=\"svg-wrapper\" [class.has-background]=\"state().hasBackground\">\r\n <div class=\"svg-placeholder\" [innerHTML]=\"safeSvgIcon\"></div>\r\n</div>\r\n}","import {\r\n afterNextRender,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n LOCALE_ID,\r\n DestroyRef,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { from, map, of } from 'rxjs';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\n\r\nexport interface RadialGaugeSegment {\r\n from: number;\r\n to: number;\r\n color: string;\r\n}\r\n\r\n/**\r\n * Responsive radial gauge component with hybrid sizing and thickness control.\r\n *\r\n * This component provides a highly flexible gauge system with three independent\r\n * control dimensions that can be mixed and matched for different use cases:\r\n *\r\n * ## Size Control:\r\n * - **Fixed Size**: Use manual `size` input (traditional behavior)\r\n * - **Container Responsive**: Enable `fitToContainer` for automatic sizing\r\n *\r\n * ## Thickness Control:\r\n * - **Manual Thickness**: Use individual thickness inputs (traditional behavior)\r\n * - **Proportional Thickness**: Enable `responsiveMode` for size-based scaling\r\n *\r\n * ## Usage Scenarios:\r\n *\r\n * ### 1. Dashboard Widgets (Recommended)\r\n * ```html\r\n * <ngx-radial-gauge\r\n * [value]=\"cpuUsage\"\r\n * [fitToContainer]=\"true\"\r\n * [responsiveMode]=\"true\"\r\n * [sizeToThicknessRatio]=\"12\" />\r\n * ```\r\n * **Best for**: Grid layouts, dashboard panels, adaptive containers\r\n * **Behavior**: Automatically resizes to fit available space while maintaining\r\n * consistent proportional appearance across all sizes.\r\n *\r\n * ### 2. Fixed Layouts (Traditional)\r\n * ```html\r\n * <ngx-radial-gauge\r\n * [value]=\"temperature\"\r\n * [size]=\"300\"\r\n * [outerThickness]=\"36\"\r\n * [innerThickness]=\"12\" />\r\n * ```\r\n * **Best for**: Static designs, precise sizing requirements, print layouts\r\n * **Behavior**: Exact pixel control over all dimensions, predictable appearance.\r\n *\r\n * ### 3. Scalable Designs\r\n * ```html\r\n * <ngx-radial-gauge\r\n * [value]=\"batteryLevel\"\r\n * [size]=\"gaugeSize\"\r\n * [responsiveMode]=\"true\"\r\n * [sizeToThicknessRatio]=\"20\" />\r\n * ```\r\n * **Best for**: User-configurable sizing, responsive breakpoints, zoom interfaces\r\n * **Behavior**: Manual size control with automatic thickness scaling. As size\r\n * increases/decreases, ring thickness scales proportionally to maintain visual balance.\r\n *\r\n * ## Mathematical Relationships:\r\n *\r\n * When `responsiveMode=true`, thickness follows this formula:\r\n * ```\r\n * baseThickness = effectiveSize / sizeToThicknessRatio\r\n * outerThickness = baseThickness × responsiveProportions.outer (default: 3)\r\n * innerThickness = baseThickness × responsiveProportions.inner (default: 1)\r\n * gap = baseThickness × responsiveProportions.gap (default: 0.5)\r\n * totalThickness = baseThickness × 4.5 (outer + inner + gap)\r\n * ```\r\n *\r\n * Example with 300px gauge and ratio=20 (ultra-thin):\r\n * - baseThickness = 15px\r\n * - outerThickness = 45px (15×3)\r\n * - innerThickness = 15px (15×1)\r\n * - gap = 7.5px (15×0.5)\r\n * - totalThickness = 67.5px (22.5% of diameter)\r\n *\r\n * ## Container Responsiveness:\r\n *\r\n * When `fitToContainer=true`, the component uses ResizeObserver to:\r\n * 1. Monitor parent container dimension changes\r\n * 2. Calculate maximum diameter maintaining 2:1 aspect ratio (width:height)\r\n * 3. Apply containerPadding for safe margins\r\n * 4. Update gauge size in real-time\r\n *\r\n * This provides true responsive behavior for dashboard widgets, grid layouts,\r\n * and adaptive interfaces.\r\n *\r\n * ## Accessibility:\r\n *\r\n * The component implements ARIA meter role with proper labeling:\r\n * - `role=\"meter\"` for semantic meaning\r\n * - `aria-valuemin/max/now` for screen readers\r\n * - `aria-label` with contextual information\r\n * - Internationalized number formatting\r\n *\r\n */\r\n@Component({\r\n selector: 'ngx-radial-gauge',\r\n standalone: true,\r\n imports: [CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './radial-gauge.component.html',\r\n styleUrl: './radial-gauge.component.scss',\r\n host: {\r\n role: 'meter',\r\n '[attr.aria-label]': 'ariaLabel()',\r\n '[attr.aria-valuemin]': 'min()',\r\n '[attr.aria-valuemax]': 'max()',\r\n '[attr.aria-valuenow]': 'clampedValue()',\r\n '[attr.aria-valuetext]': 'formattedLabel()',\r\n '[attr.aria-labelledby]': 'titleId',\r\n '[attr.aria-describedby]': 'descId',\r\n '[class.fit-container]': 'fitToContainer()',\r\n '[class.has-background]': 'hasBackground()',\r\n },\r\n})\r\nexport class RadialGaugeComponent {\r\n private readonly valueTextEl = viewChild<ElementRef<SVGTextElement>>('valueText');\r\n private readonly valueGroupEl = viewChild<ElementRef<SVGGElement>>('valueGroup');\r\n private readonly refTextEl =\r\n viewChild.required<ElementRef<SVGTextElement>>('refText');\r\n\r\n // Core Inputs - Value and Range\r\n readonly value = input(0);\r\n readonly min = input(0);\r\n readonly max = input(100);\r\n readonly segments = input<RadialGaugeSegment[]>();\r\n readonly title = input('Gauge');\r\n readonly description = input('');\r\n readonly segmentGapPx = input(4);\r\n \r\n // Widget styling inputs\r\n /**\r\n * Whether the gauge should display with a background. \r\n * Affects text color contrast and other visual elements.\r\n * @default false\r\n */\r\n readonly hasBackground = input(false);\r\n\r\n /**\r\n * Whether to display the numeric value label in the center of the gauge.\r\n * @default true\r\n */\r\n readonly showValueLabel = input(true);\r\n\r\n // Size Control Inputs\r\n /**\r\n * Base gauge diameter in pixels. Used as fallback when fitToContainer is false.\r\n * @default 300\r\n */\r\n readonly size = input(300);\r\n\r\n /**\r\n * Automatically resize gauge to fit its container dimensions.\r\n * When true, the gauge will observe container size changes and adjust accordingly.\r\n * Maintains semicircle aspect ratio (2:1 width:height).\r\n * @default false\r\n */\r\n readonly fitToContainer = input(false);\r\n\r\n /**\r\n * Padding in pixels to maintain from container edges when fitToContainer is true.\r\n * @default 10\r\n */\r\n readonly containerPadding = input(10);\r\n\r\n // Thickness Control Inputs\r\n /**\r\n * Use proportional thickness scaling based on gauge size.\r\n * When true, all thickness values are calculated as multiples of baseThickness.\r\n * Overrides manual outerThickness, innerThickness, and gap inputs.\r\n * @default false\r\n */\r\n readonly responsiveMode = input(false);\r\n\r\n /**\r\n * Ratio used to calculate base thickness from gauge size.\r\n * baseThickness = effectiveSize / sizeToThicknessRatio\r\n * Higher values create thinner gauge rings for ultra-thin appearance.\r\n * @default 20\r\n * @example\r\n * - ratio=15: thicker rings (bt = size/15)\r\n * - ratio=20: ultra-thin balanced appearance (bt = size/20)\r\n * - ratio=30: extremely thin rings (bt = size/30)\r\n */\r\n readonly sizeToThicknessRatio = input(20);\r\n\r\n /**\r\n * Proportional multipliers for responsive thickness calculations.\r\n * - outer: Multiplier for outer ring thickness (default: 3)\r\n * - inner: Multiplier for inner ring thickness (default: 1)\r\n * - gap: Multiplier for gap between rings (default: 0.5)\r\n * Total thickness = baseThickness × (outer + inner + gap) = bt × 4.5\r\n * @default { outer: 3, inner: 1, gap: 0.5 }\r\n */\r\n readonly responsiveProportions = input({ outer: 3, inner: 1, gap: 0.5 });\r\n\r\n // Manual Thickness Inputs (used when responsiveMode is false)\r\n /**\r\n * Manual outer ring thickness in pixels. Ignored when responsiveMode is true.\r\n * @default 36\r\n */\r\n readonly outerThickness = input(36);\r\n\r\n /**\r\n * Manual inner ring thickness in pixels. Ignored when responsiveMode is true.\r\n * @default 12\r\n */\r\n readonly innerThickness = input(12);\r\n\r\n /**\r\n * Manual gap between rings in pixels. Ignored when responsiveMode is true.\r\n * @default 8\r\n */\r\n readonly gap = input(8);\r\n\r\n readonly titleId = `rg-title-${Math.random().toString(36).slice(2)}`;\r\n readonly descId = `rg-desc-${Math.random().toString(36).slice(2)}`;\r\n readonly clipId = `rg-clip-${Math.random().toString(36).slice(2)}`;\r\n\r\n private readonly locale = inject(LOCALE_ID);\r\n private readonly elementRef = inject(ElementRef<HTMLElement>);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly nf = new Intl.NumberFormat(this.locale, {\r\n maximumFractionDigits: 1,\r\n });\r\n\r\n // Container Size Detection\r\n /**\r\n * Tracks the container's available size for responsive sizing.\r\n * Updated by ResizeObserver when fitToContainer is enabled.\r\n * @private\r\n */\r\n private readonly containerSize = signal<number | null>(null);\r\n\r\n /**\r\n * ResizeObserver instance for monitoring container size changes.\r\n * Created when fitToContainer is enabled, destroyed on component cleanup.\r\n * @private\r\n */\r\n private resizeObserver: ResizeObserver | null = null;\r\n\r\n readonly viewReady = toSignal(\r\n from(new Promise<void>((resolve) => afterNextRender(resolve))).pipe(\r\n map(() => true)\r\n ),\r\n { initialValue: false }\r\n );\r\n\r\n readonly fontsReady = toSignal(\r\n typeof document !== 'undefined' && 'fonts' in document\r\n ? from((document as Document & { fonts: FontFaceSet }).fonts.ready).pipe(\r\n map(() => true)\r\n )\r\n : of(true), // SSR or older browsers: treat as ready\r\n { initialValue: false }\r\n );\r\n\r\n constructor() {\r\n this.destroyRef.onDestroy(() => {\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n this.resizeObserver = null;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Effect that manages ResizeObserver lifecycle based on fitToContainer input.\r\n * Automatically connects/disconnects observer when the input changes.\r\n * @private\r\n */\r\n private readonly containerObserverEffect = effect(() => {\r\n const shouldObserve = this.fitToContainer();\r\n\r\n if (shouldObserve && !this.resizeObserver) {\r\n // Create and start observing\r\n this.resizeObserver = new ResizeObserver((entries) => {\r\n const entry = entries[0];\r\n if (!entry) return;\r\n\r\n const { width, height } = entry.contentRect;\r\n const padding = this.containerPadding();\r\n\r\n const availW = Math.max(0, width - padding * 2);\r\n const availH = Math.max(0, height - padding);\r\n\r\n let sFromW: number;\r\n let sFromH: number;\r\n\r\n if (this.responsiveMode()) {\r\n // In responsive mode: outerThickness = 3 * baseThickness = 3 * size / ratio\r\n // Total space needed = size + outerThickness = size + 3*size/ratio = size * (1 + 3/ratio)\r\n const ratio = this.sizeToThicknessRatio();\r\n const spaceFactor = 1 + 3 / ratio; // Total space factor\r\n sFromW = availW / spaceFactor;\r\n sFromH = (2 * availH) / spaceFactor;\r\n } else {\r\n // Manual thickness: outer thickness is fixed\r\n const outerT = this.outerThickness();\r\n sFromW = Math.max(0, availW - outerT);\r\n sFromH = Math.max(0, 2 * availH - outerT);\r\n }\r\n\r\n const maxDiameter = Math.min(sFromW, sFromH);\r\n this.containerSize.set(Math.max(maxDiameter, 50));\r\n });\r\n\r\n this.resizeObserver.observe(this.elementRef.nativeElement);\r\n } else if (!shouldObserve && this.resizeObserver) {\r\n // Stop observing and cleanup\r\n this.resizeObserver.disconnect();\r\n this.resizeObserver = null;\r\n this.containerSize.set(null);\r\n }\r\n });\r\n\r\n // ── Build the reference string reactively ───────────────────────────────────\r\n referenceString = computed(() => {\r\n const ref = this.labelReference();\r\n if (typeof ref === 'string') return ref;\r\n if (typeof ref === 'number' && ref > 0) {\r\n const g = this.referenceGlyph() ?? '0';\r\n return g.repeat(ref);\r\n }\r\n\r\n return this.formattedLabel(); // measure actual label\r\n });\r\n\r\n // ── Core transform: center + uniform scale to fit the reserved box ──────────\r\n valueTransform = computed(() => {\r\n if (!this.showValueLabel()) return '';\r\n \r\n // ensure we wait for first paint + font shaping\r\n this.viewReady();\r\n this.fontsReady();\r\n\r\n const cx = this.centerX();\r\n const cy = this.centerY();\r\n const r = this.legendInnerRadius();\r\n const pad = this.labelPadding();\r\n\r\n const boxWidth = Math.max(0, 2 * r - 2 * pad);\r\n const boxHeight = Math.max(0, r - pad);\r\n\r\n // If geometry is degenerate, just center.\r\n if (!boxWidth || !boxHeight) return `translate(${cx},${cy})`;\r\n\r\n // Measure the actual label (for height) and the reference (for width)\r\n const labelEl = this.valueTextEl()?.nativeElement;\r\n const refEl = this.refTextEl().nativeElement;\r\n\r\n if (!labelEl) return `translate(${cx},${cy})`;\r\n\r\n // Important: ensure text nodes are up to date before reading BBox\r\n // (Angular's computed/effect guarantees sync within the same microtask)\r\n const labelBox = this.safeBBox(labelEl);\r\n const refBox = this.safeBBox(refEl);\r\n\r\n // Use reference width and actual label height\r\n const widthForFit = refBox.width || labelBox.width || 1;\r\n const heightForFit = labelBox.height || refBox.height || 1;\r\n\r\n const s =\r\n Math.min(boxWidth / widthForFit, boxHeight / heightForFit) *\r\n this.baselineSafety();\r\n\r\n return `translate(${cx},${cy}) scale(${s})`;\r\n });\r\n\r\n /** Guarded getBBox that avoids 0/NaN on detached or invisible nodes. */\r\n safeBBox(node: SVGGraphicsElement): DOMRect {\r\n try {\r\n const box = node.getBBox();\r\n // Firefox/Safari can occasionally return 0 when text hasn’t painted yet; fall back to a rough estimate.\r\n if (box && (box.width > 0 || box.height > 0)) return box;\r\n } catch {\r\n /* ignore */\r\n }\r\n // Fallback guess to avoid divide-by-zero (tuned small; will get corrected next tick)\r\n return new DOMRect(0, 0, 1, 1);\r\n }\r\n\r\n // Responsive Size and Thickness Calculations\r\n /**\r\n * The effective gauge diameter, accounting for container sizing and manual size input.\r\n * Priority: containerSize (when fitToContainer=true) > manual size input\r\n * @returns Effective diameter in pixels\r\n *\r\n * @example\r\n * // Fixed size mode\r\n * fitToContainer=false, size=300 → effectiveSize=300\r\n *\r\n * // Container responsive mode\r\n * fitToContainer=true, container=400px wide → effectiveSize=380 (minus padding)\r\n */\r\n private readonly effectiveSize = computed(() => {\r\n const containerDiameter = this.containerSize();\r\n if (this.fitToContainer() && containerDiameter !== null) {\r\n return containerDiameter;\r\n }\r\n return this.size();\r\n });\r\n\r\n /**\r\n * Base thickness calculated from effective size for proportional scaling.\r\n * Only used when responsiveMode is enabled.\r\n * Formula: baseThickness = effectiveSize / sizeToThicknessRatio\r\n * @returns Base thickness in pixels, or 0 when responsiveMode is false\r\n *\r\n * @example\r\n * // effectiveSize=300, sizeToThicknessRatio=12\r\n * baseThickness = 300/12 = 25px\r\n * // Total ring thickness = 25 × 4.5 = 112.5px (37.5% of diameter)\r\n */\r\n private readonly baseThickness = computed(() => {\r\n if (!this.responsiveMode()) return 0;\r\n return this.effectiveSize() / this.sizeToThicknessRatio();\r\n });\r\n\r\n /**\r\n * Effective outer ring thickness, supporting both manual and responsive modes.\r\n * - Responsive mode: baseThickness × responsiveProportions.outer\r\n * - Manual mode: outerThickness input value\r\n * @returns Outer ring thickness in pixels\r\n */\r\n readonly effectiveOuterThickness = computed(() => {\r\n if (this.responsiveMode()) {\r\n return this.baseThickness() * this.responsiveProportions().outer;\r\n }\r\n return this.outerThickness();\r\n });\r\n\r\n /**\r\n * Effective inner ring thickness, supporting both manual and responsive modes.\r\n * - Responsive mode: baseThickness × responsiveProportions.inner\r\n * - Manual mode: innerThickness input value\r\n * @returns Inner ring thickness in pixels\r\n */\r\n readonly effectiveInnerThickness = computed(() => {\r\n if (this.responsiveMode()) {\r\n return this.baseThickness() * this.responsiveProportions().inner;\r\n }\r\n return this.innerThickness();\r\n });\r\n\r\n /**\r\n * Effective gap between rings, supporting both manual and responsive modes.\r\n * - Responsive mode: baseThickness × responsiveProportions.gap\r\n * - Manual mode: gap input value\r\n * @returns Gap between rings in pixels\r\n */\r\n readonly effectiveGap = computed(() => {\r\n if (this.responsiveMode()) {\r\n return this.baseThickness() * this.responsiveProportions().gap;\r\n }\r\n return this.gap();\r\n });\r\n\r\n // SVG Layout Calculations\r\n private readonly svgPadding = computed(\r\n () => this.effectiveOuterThickness() / 2\r\n );\r\n readonly svgWidth = computed(\r\n () => this.effectiveSize() + this.effectiveOuterThickness()\r\n );\r\n readonly svgHeight = computed(() =>\r\n Math.ceil(this.effectiveSize() / 2 + this.effectiveOuterThickness() / 2)\r\n );\r\n readonly centerX = computed(\r\n () => this.effectiveSize() / 2 + this.effectiveOuterThickness() / 2\r\n );\r\n readonly centerY = computed(\r\n () => this.effectiveSize() / 2 + this.effectiveOuterThickness() / 2\r\n );\r\n\r\n /**\r\n * If a string is provided, we measure it and allocate space for that width.\r\n * If a number is provided, we build a string of that many `referenceGlyph`s.\r\n * If omitted, we fall back to measuring the actual label.\r\n */\r\n labelReference = input<string | number | undefined>(undefined);\r\n\r\n /** Glyph to repeat when labelReference is a number (defaults to '0'). */\r\n referenceGlyph = input<string>('0');\r\n\r\n /** Extra breathing room inside the inner semicircle box (in px). */\r\n labelPadding = input<number>(4);\r\n\r\n /** Safety multiplier to avoid clipping ascenders/descenders. */\r\n baselineSafety = input<number>(0.95);\r\n\r\n readonly outerRadius = computed(() => this.effectiveSize() / 2);\r\n readonly innerRadius = computed(\r\n () =>\r\n this.outerRadius() -\r\n this.effectiveOuterThickness() / 2 -\r\n this.effectiveGap()\r\n );\r\n readonly legendOuterRadius = computed(\r\n () =>\r\n this.outerRadius() -\r\n this.effectiveOuterThickness() / 2 -\r\n this.effectiveGap() -\r\n this.effectiveInnerThickness() / 2\r\n );\r\n readonly legendInnerRadius = computed(\r\n () => this.legendOuterRadius() - this.effectiveInnerThickness()\r\n );\r\n\r\n private readonly startAngle = -180;\r\n private readonly endAngle = 0;\r\n\r\n readonly clampedValue = computed(() =>\r\n this.clamp(this.value(), this.min(), this.max())\r\n );\r\n\r\n readonly percentage = computed(() => {\r\n const range = this.max() - this.min();\r\n if (range === 0) return 0;\r\n return (this.clampedValue() - this.min()) / range;\r\n });\r\n\r\n readonly percent = computed(() => Math.round(this.percentage() * 100));\r\n\r\n private readonly defaultSegments = computed<RadialGaugeSegment[]>(() => {\r\n const minVal = this.min();\r\n const maxVal = this.max();\r\n const range = maxVal - minVal;\r\n return [\r\n {\r\n from: minVal,\r\n to: minVal + 0.6 * range,\r\n color: 'var(--gauge-value-critical, #dc2626)',\r\n },\r\n {\r\n from: minVal + 0.6 * range,\r\n to: minVal + 0.8 * range,\r\n color: 'var(--gauge-value-warning, #f59e0b)',\r\n },\r\n {\r\n from: minVal + 0.8 * range,\r\n to: maxVal,\r\n color: 'var(--gauge-value-good, #10b981)',\r\n },\r\n ];\r\n });\r\n\r\n readonly actualSegments = computed(\r\n () => this.segments() || this.defaultSegments()\r\n );\r\n\r\n readonly formattedLabel = computed(() => this.nf.format(this.clampedValue()));\r\n\r\n readonly valueColor = computed(() => {\r\n const v = this.clampedValue();\r\n const segs = this.actualSegments();\r\n for (const s of segs) {\r\n if (v >= s.from && v <= s.to) return s.color;\r\n }\r\n return segs.at(-1)?.color ?? 'var(--mat-sys-primary)';\r\n });\r\n\r\n readonly backgroundArcPath = computed(() =>\r\n this.createArcPath(this.outerRadius(), this.startAngle, this.endAngle)\r\n );\r\n\r\n readonly segmentPaths = computed(() => {\r\n const segs = this.actualSegments();\r\n const minVal = this.min();\r\n const maxVal = this.max();\r\n const range = maxVal - minVal;\r\n if (!range) return [];\r\n\r\n const r = this.legendOuterRadius();\r\n const gapDeg = this.gapDegreesForRadius(this.segmentGapPx(), r);\r\n\r\n return segs\r\n .map((s, i) => {\r\n const startPct = this.clamp((s.from - minVal) / range, 0, 1);\r\n const endPct = this.clamp((s.to - minVal) / range, 0, 1);\r\n let a0 = this.angleForPercentage(startPct);\r\n let a1 = this.angleForPercentage(endPct);\r\n if (i > 0) a0 += gapDeg / 2;\r\n if (i < segs.length - 1) a1 -= gapDeg / 2;\r\n if (a1 <= a0) return null;\r\n return { path: this.createArcPath(r, a0, a1), color: s.color };\r\n })\r\n .filter((x): x is { path: string; color: string } => !!x);\r\n });\r\n\r\n readonly ariaLabel = computed(\r\n () =>\r\n `${this.title()}: ${this.formattedLabel()} (range ${this.min()}–${this.max()})`\r\n );\r\n\r\n private clamp(v: number, min: number, max: number) {\r\n return Math.min(Math.max(v, min), max);\r\n }\r\n\r\n /**\r\n * Converts a percentage (0-1) to an angle position on the gauge arc.\r\n * The gauge spans from startAngle (-180°) to endAngle (0°), creating a semicircle.\r\n * @param p - Percentage value between 0 and 1\r\n * @returns Angle in degrees for the given percentage along the gauge arc\r\n * @example\r\n * angleForPercentage(0) => -180° (start of gauge)\r\n * angleForPercentage(0.5) => -90° (middle of gauge)\r\n * angleForPercentage(1) => 0° (end of gauge)\r\n */\r\n private angleForPercentage(p: number) {\r\n return this.startAngle + (this.endAngle - this.startAngle) * p;\r\n }\r\n\r\n /**\r\n * Converts polar coordinates (radius, angle) to Cartesian coordinates (x, y).\r\n * Uses standard trigonometric conversion where angle 0° points to the right (3 o'clock).\r\n * @param cx - Center X coordinate of the circle\r\n * @param cy - Center Y coordinate of the circle\r\n * @param r - Radius distance from center\r\n * @param angle - Angle in degrees (0° = right, 90° = down, 180° = left, -90° = up)\r\n * @returns Object with x and y Cartesian coordinates\r\n * @example\r\n * polarToCartesian(100, 100, 50, 0) => {x: 150, y: 100} // 3 o'clock\r\n * polarToCartesian(100, 100, 50, -90) => {x: 100, y: 50} // 12 o'clock\r\n */\r\n private polarToCartesian(cx: number, cy: number, r: number, angle: number) {\r\n const a = (angle * Math.PI) / 180;\r\n return { x: cx + r * Math.cos(a), y: cy + r * Math.sin(a) };\r\n }\r\n\r\n /**\r\n * Creates an SVG path string for a circular arc segment.\r\n * Uses SVG arc path commands to draw an arc from start angle to end angle.\r\n * @param r - Radius of the arc\r\n * @param a0 - Starting angle in degrees\r\n * @param a1 - Ending angle in degrees\r\n * @returns SVG path string defining the arc\r\n * @example\r\n * createArcPath(50, -180, 0) => \"M cx-50 cy A 50 50 0 1 1 cx+50 cy\"\r\n * This creates a semicircle from left (-180°) to right (0°)\r\n *\r\n * SVG Arc Parameters:\r\n * - rx, ry: Radii (equal for circular arc)\r\n * - x-axis-rotation: 0 (no rotation for circles)\r\n * - large-arc-flag: 1 if arc > 180°, 0 otherwise\r\n * - sweep-flag: 1 for clockwise, 0 for counter-clockwise\r\n */\r\n private createArcPath(r: number, a0: number, a1: number) {\r\n const cx = this.centerX(),\r\n cy = this.centerY();\r\n const start = this.polarToCartesian(cx, cy, r, a0);\r\n const end = this.polarToCartesian(cx, cy, r, a1);\r\n const largeArc = Math.abs(a1 - a0) > 180 ? 1 : 0;\r\n const sweep = a1 > a0 ? 1 : 0;\r\n return `M ${start.x} ${start.y} A ${r} ${r} 0 ${largeArc} ${sweep} ${end.x} ${end.y}`;\r\n }\r\n\r\n /**\r\n * Calculates the angular gap in degrees needed for a specific pixel gap at a given radius.\r\n * Used to create visual separation between legend segments.\r\n * @param px - Desired gap size in pixels\r\n * @param r - Radius at which the gap will appear\r\n * @returns Gap size in degrees, clamped between 0° and 180°\r\n * @example\r\n * For a 4px gap on a radius of 100px:\r\n * Arc length = π * 100 = 314.16px (semicircle)\r\n * Degrees = 180 * (4 / 314.16) ≈ 2.3°\r\n *\r\n * Mathematical basis:\r\n * - Semicircle arc length = π * r\r\n * - Ratio of gap to semicircle = px / (π * r)\r\n * - Convert ratio to degrees by multiplying by 180°\r\n */\r\n private gapDegreesForRadius(px: number, r: number) {\r\n const semicircumference = Math.PI * r;\r\n return 180 * this.clamp(px / semicircumference, 0, 1);\r\n }\r\n}\r\n","@let w = svgWidth(); @let h = svgHeight(); @let cy = centerY(); @let pct =\r\npercent();\r\n\r\n<svg\r\n [attr.width]=\"fitToContainer() ? null : w\"\r\n [attr.height]=\"fitToContainer() ? null : h\"\r\n [attr.viewBox]=\"'0 0 ' + w + ' ' + h\"\r\n [class.responsive]=\"fitToContainer()\"\r\n class=\"gauge-svg\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n>\r\n <title [attr.id]=\"titleId\">{{ title() }}</title>\r\n @if (description()) {\r\n <desc [attr.id]=\"descId\">{{ description() }}</desc>\r\n }\r\n\r\n <defs>\r\n <clipPath [attr.id]=\"clipId\">\r\n <!-- Give a tiny extra room equal to half of the outer stroke to avoid anti-alias cutoff at the baseline -->\r\n <rect\r\n x=\"0\"\r\n y=\"0\"\r\n [attr.width]=\"w\"\r\n [attr.height]=\"cy + effectiveOuterThickness() / 2\"\r\n />\r\n </clipPath>\r\n </defs>\r\n\r\n <g [attr.clip-path]=\"'url(#' + clipId + ')'\">\r\n <path\r\n [attr.d]=\"backgroundArcPath()\"\r\n pathLength=\"100\"\r\n fill=\"none\"\r\n class=\"gauge-background\"\r\n [attr.stroke-width]=\"effectiveOuterThickness()\"\r\n stroke-linecap=\"butt\"\r\n />\r\n\r\n <path\r\n [attr.d]=\"backgroundArcPath()\"\r\n pathLength=\"100\"\r\n fill=\"none\"\r\n class=\"gauge-value\"\r\n [attr.stroke]=\"valueColor()\"\r\n [attr.stroke-width]=\"effectiveOuterThickness()\"\r\n stroke-linecap=\"butt\"\r\n [attr.stroke-dasharray]=\"pct + ' 100'\"\r\n />\r\n\r\n @for (segment of segmentPaths(); track segment.path) {\r\n <path\r\n [attr.d]=\"segment.path\"\r\n fill=\"none\"\r\n [attr.stroke]=\"segment.color\"\r\n [attr.stroke-width]=\"effectiveInnerThickness()\"\r\n stroke-linecap=\"butt\"\r\n class=\"gauge-segment\"\r\n />\r\n }\r\n </g>\r\n\r\n @if (showValueLabel()) {\r\n <g #valueGroup [attr.transform]=\"valueTransform()\">\r\n <text\r\n #valueText\r\n class=\"gauge-value-text\"\r\n x=\"0\"\r\n y=\"0\"\r\n text-anchor=\"middle\"\r\n alignment-baseline=\"baseline\"\r\n dy=\"-0.75\"\r\n >\r\n {{ formattedLabel() }}\r\n </text>\r\n </g>\r\n }\r\n\r\n <!-- Hidden reference text used ONLY for width measurement -->\r\n <g style=\"visibility: hidden; pointer-events: none\" aria-hidden=\"true\">\r\n <text\r\n #refText\r\n x=\"0\"\r\n y=\"0\"\r\n text-anchor=\"start\"\r\n dominant-baseline=\"alphabetic\"\r\n >\r\n {{ referenceString() }}\r\n </text>\r\n </g>\r\n</svg>\r\n","// radial-gauge-widget.metadata.ts\r\nexport const svgIcon = `\r\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 55\" fill=\"currentColor\">\r\n <defs>\r\n <clipPath id=\"gauge-clip\"><rect x=\"0\" y=\"0\" width=\"100\" height=\"52\"/></clipPath>\r\n\r\n <!-- Outer arc geometry (radius 40, stroke 8) -->\r\n <path id=\"outerArc\" d=\"M 10 50 A 40 40 0 0 1 90 50\" pathLength=\"100\"/>\r\n\r\n <!-- Inner arc geometry (radius 31) -->\r\n <path id=\"innerArc\" d=\"M 19 50 A 31 31 0 0 1 81 50\" pathLength=\"100\"/>\r\n </defs>\r\n\r\n <g clip-path=\"url(#gauge-clip)\" stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"butt\">\r\n <!-- Outer background arc -->\r\n <use href=\"#outerArc\" stroke-width=\"8\" opacity=\"0.2\"/>\r\n\r\n <!-- Value arc: 65% -->\r\n <use href=\"#outerArc\" stroke-width=\"8\" stroke-dasharray=\"65 100\"/>\r\n\r\n <!-- Inner legend segments (single geometry with dash windows) -->\r\n <!-- 0–60% -->\r\n <use href=\"#innerArc\" stroke-width=\"4\" opacity=\"0.2\"\r\n stroke-dasharray=\"60 100\" stroke-dashoffset=\"0\"/>\r\n <!-- 60–80% -->\r\n <use href=\"#innerArc\" stroke-width=\"4\" opacity=\"0.4\"\r\n stroke-dasharray=\"20 100\" stroke-dashoffset=\"60\"/>\r\n <!-- 0–100% (full half-circle), same color as value arc -->\r\n <use href=\"#innerArc\" stroke-width=\"4\"\r\n stroke-dasharray=\"100 100\" stroke-dashoffset=\"0\"/>\r\n <!-- (Alternatively, you can omit dash attributes entirely on this one:\r\n <use href=\"#innerArc\" stroke-width=\"4\"/> ) -->\r\n </g>\r\n</svg>\r\n`;\r\n","import { Component, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n MAT_DIALOG_DATA,\r\n MatDialogRef,\r\n MatDialogModule,\r\n} from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { RadialGaugeWidgetState } from './radial-gauge-widget.component';\r\n\r\n@Component({\r\n selector: 'lib-radial-gauge-state-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSlideToggleModule,\r\n MatRadioModule,\r\n FormsModule,\r\n ],\r\n template: `\r\n <h2 mat-dialog-title>Radial Gauge Settings</h2>\r\n <mat-dialog-content>\r\n <mat-form-field>\r\n <mat-label>Value (0-100)</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [(ngModel)]=\"localState.value\"\r\n min=\"0\"\r\n max=\"100\"\r\n />\r\n </mat-form-field>\r\n\r\n <div class=\"section\">\r\n <h4>Color Profile</h4>\r\n <mat-radio-group [(ngModel)]=\"localState.colorProfile\">\r\n <mat-radio-button value=\"dynamic\">Dynamic (Theme Colors)</mat-radio-button>\r\n <mat-radio-button value=\"static\">Static (Performance Colors)</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <div class=\"toggle-section\">\r\n <mat-slide-toggle [(ngModel)]=\"localState.active\">\r\n Active Display\r\n </mat-slide-toggle>\r\n <p class=\"toggle-description\">Display live gauge instead of passive icon</p>\r\n </div>\r\n\r\n <div class=\"toggle-section\">\r\n <mat-slide-toggle [(ngModel)]=\"localState.hasBackground\">\r\n Background\r\n </mat-slide-toggle>\r\n <p class=\"toggle-description\">Add a background color to the widget</p>\r\n </div>\r\n\r\n <div class=\"toggle-section\">\r\n <mat-slide-toggle [(ngModel)]=\"localState.showValueLabel\">\r\n Show Value Label\r\n </mat-slide-toggle>\r\n <p class=\"toggle-description\">Display numeric value in gauge center</p>\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button (click)=\"onCancel()\">Cancel</button>\r\n <button mat-flat-button (click)=\"onSave()\">Save</button>\r\n </mat-dialog-actions>\r\n `,\r\n styles: [\r\n `\r\n mat-dialog-content {\r\n display: block;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n }\r\n\r\n mat-form-field {\r\n width: 100%;\r\n display: block;\r\n margin-bottom: 1rem;\r\n }\r\n\r\n .section {\r\n margin-bottom: 1.5rem;\r\n }\r\n\r\n .section h4 {\r\n margin: 0 0 0.5rem 0;\r\n font-size: 0.875rem;\r\n font-weight: 500;\r\n color: var(--mat-sys-on-surface, #1f1f1f);\r\n }\r\n\r\n mat-radio-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0.5rem;\r\n }\r\n\r\n .toggle-section {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.75rem;\r\n margin-bottom: 0.5rem;\r\n }\r\n\r\n .toggle-description {\r\n margin: 0;\r\n flex: 1;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class RadialGaugeStateDialogComponent {\r\n private readonly data = inject<RadialGaugeWidgetState>(MAT_DIALOG_DATA);\r\n private readonly dialogRef = inject(MatDialogRef<RadialGaugeStateDialogComponent>);\r\n\r\n localState: RadialGaugeWidgetState = {\r\n value: this.data.value ?? 50,\r\n colorProfile: this.data.colorProfile ?? 'dynamic',\r\n active: this.data.active ?? false,\r\n hasBackground: this.data.hasBackground ?? true,\r\n showValueLabel: this.data.showValueLabel ?? true,\r\n };\r\n\r\n onCancel(): void {\r\n this.dialogRef.close();\r\n }\r\n\r\n onSave(): void {\r\n this.dialogRef.close(this.localState);\r\n }\r\n}","// radial-gauge-widget.component.ts\r\nimport { Component, inject, signal, computed } from '@angular/core';\r\nimport { Widget, WidgetMetadata } from '@dragonworks/ngx-dashboard';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { RadialGaugeComponent } from '../../components/radial-gauge/radial-gauge.component';\r\nimport { svgIcon } from './radial-gauge-widget.metadata';\r\nimport { RadialGaugeStateDialogComponent } from './radial-gauge-state-dialog.component';\r\n\r\nexport interface RadialGaugeWidgetState {\r\n value?: number;\r\n colorProfile?: 'dynamic' | 'static';\r\n active?: boolean;\r\n hasBackground?: boolean;\r\n showValueLabel?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-dashboard-radial-gauge-widget',\r\n imports: [RadialGaugeComponent],\r\n templateUrl: './radial-gauge-widget.component.html',\r\n styleUrl: './radial-gauge-widget.component.scss',\r\n})\r\nexport class RadialGaugeWidgetComponent implements Widget {\r\n static metadata: WidgetMetadata = {\r\n widgetTypeid: '@ngx-dashboard/radial-gauge-widget',\r\n name: 'Radial Gauge',\r\n description: 'A semi-circular gauge indicator',\r\n svgIcon,\r\n };\r\n\r\n readonly #dialog = inject(MatDialog);\r\n readonly #sanitizer = inject(DomSanitizer);\r\n\r\n readonly safeSvgIcon = this.#sanitizer.bypassSecurityTrustHtml(svgIcon);\r\n\r\n readonly state = signal<RadialGaugeWidgetState>({\r\n value: 50,\r\n colorProfile: 'dynamic',\r\n active: false,\r\n hasBackground: true,\r\n showValueLabel: true,\r\n });\r\n\r\n readonly segments = computed(() => {\r\n const profile = this.state().colorProfile || 'dynamic';\r\n\r\n if (profile === 'static') {\r\n // Static performance segments (like CPU usage example)\r\n return [\r\n { from: 0, to: 25, color: '#dc2626' }, // Poor - red\r\n { from: 25, to: 50, color: '#f59e0b' }, // Fair - orange\r\n { from: 50, to: 75, color: '#3b82f6' }, // Good - blue\r\n { from: 75, to: 100, color: '#10b981' }, // Excellent - green\r\n ];\r\n } else {\r\n // Dynamic theme-aware segments (like demo gauge preview)\r\n return [\r\n { from: 0, to: 60, color: 'var(--mat-sys-error)' },\r\n { from: 60, to: 80, color: 'var(--mat-sys-secondary)' },\r\n { from: 80, to: 100, color: 'var(--mat-sys-tertiary)' },\r\n ];\r\n }\r\n });\r\n\r\n dashboardSetState(state?: unknown): void {\r\n if (state) {\r\n this.state.update((current) => ({\r\n ...current,\r\n ...(state as RadialGaugeWidgetState),\r\n }));\r\n }\r\n }\r\n\r\n dashboardGetState(): RadialGaugeWidgetState {\r\n return this.state();\r\n }\r\n\r\n dashboardEditState(): void {\r\n const dialogRef = this.#dialog.open(RadialGaugeStateDialogComponent, {\r\n data: this.state(),\r\n width: '400px',\r\n maxWidth: '90vw',\r\n disableClose: false,\r\n autoFocus: false,\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((result) => {\r\n if (result) {\r\n this.state.set(result);\r\n }\r\n });\r\n }\r\n}\r\n","<!-- radial-gauge-widget.component.html -->\r\n<div class=\"widget-container\" [class.has-background]=\"state().hasBackground\">\r\n @if (state().active) {\r\n <!-- Active mode: Show live gauge -->\r\n <div class=\"gauge-container\">\r\n <ngx-radial-gauge\r\n [value]=\"state().value || 0\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n [fitToContainer]=\"true\"\r\n [responsiveMode]=\"true\"\r\n [segments]=\"segments()\"\r\n [outerThickness]=\"24\"\r\n [innerThickness]=\"8\"\r\n [gap]=\"4\"\r\n [segmentGapPx]=\"2\"\r\n [labelReference]=\"'00000'\"\r\n [referenceGlyph]=\"'0'\"\r\n [hasBackground]=\"state().hasBackground || false\"\r\n [showValueLabel]=\"state().showValueLabel ?? true\"\r\n />\r\n </div>\r\n } @else {\r\n <!-- Passive mode: Show static icon -->\r\n <div class=\"icon-container\">\r\n <div class=\"svg-placeholder\" [innerHTML]=\"safeSvgIcon\"></div>\r\n </div>\r\n }\r\n</div>\r\n","/*\r\n * Public API Surface of ngx-dashboard-widgets\r\n */\r\nexport * from './lib/widgets/arrow-widget/arrow-widget.component';\r\nexport * from './lib/widgets/label-widget/label-widget.component';\r\nexport * from './lib/widgets/clock-widget/clock-widget.component';\r\nexport * from './lib/widgets/radial-gauge-widget/radial-gauge-widget.component';\r\nexport * from './lib/directives/responsive-text.directive';\r\nexport * from './lib/components/radial-gauge/radial-gauge.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["svgIcon","i5","i6","i8","i2","i3","i4","i1","i7"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACO,MAAMA,SAAO,GAClB,2MAA2M;;MCqHhM,yBAAyB,CAAA;AACnB,IAAA,IAAI,GAAG,MAAM,CAAmB,eAAe,CAAC;AAChD,IAAA,SAAS,GAAG,MAAM,EAAC,YAAuC,EAAC;;IAGnE,SAAS,GAAG,MAAM,CACzB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACpB;IACQ,OAAO,GAAG,MAAM,CAAS,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;IAChD,aAAa,GAAG,MAAM,CAAU,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAChE,IAAA,qBAAqB,GAAG,MAAM,CAAU,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,iEAAC;;AAGnE,IAAA,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS;IACvC,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC;IACxC,qBAAqB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI;;AAG/D,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,MAAM,WAAW,GAAG;AAClB,YAAA,EAAE,EAAE,CAAC;AACL,YAAA,KAAK,EAAE,EAAE;AACT,YAAA,IAAI,EAAE,GAAG;AACT,YAAA,IAAI,EAAE,GAAG;SACV;AACD,QAAA,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;AACtC,IAAA,CAAC,oDAAC;AAEO,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAA,OAAA,EAAU,IAAI,CAAC,QAAQ,EAAE,CAAA,IAAA,CAAM,6DAAC;AAEnE,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,EAAE,EAAE,IAAI;AACR,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,IAAI,EAAE,MAAM;SACb;AACD,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;AAClC,IAAA,CAAC,yDAAC;AAEO,IAAA,UAAU,GAAG,QAAQ,CAC5B,MACE,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,CAAC,iBAAiB;AAC3C,QAAA,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,eAAe;QACvC,IAAI,CAAC,aAAa,EAAE,KAAK,IAAI,CAAC,qBAAqB,sDACtD;AAED,IAAA,aAAa,CAAC,KAAa,EAAA;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC;IAChC;AAEA,IAAA,kBAAkB,CAAC,aAAsB,EAAA;AACvC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC;QACrC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC;IAChD;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;IACxB;IAEA,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AACnB,YAAA,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;AAC3B,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACvB,YAAA,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE;AAChB,SAAA,CAAC;IACxB;uGAlEW,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,wBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA3F1B,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,8YAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAnDC,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,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,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,EAAA,0BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,eAAe,kaACf,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FA6FX,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAxGrC,SAAS;+BACE,wBAAwB,EAAA,UAAA,EACtB,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,WAAW;wBACX,eAAe;wBACf,eAAe;wBACf,kBAAkB;wBAClB,eAAe;wBACf,eAAe;wBACf,oBAAoB;qBACrB,EAAA,QAAA,EACS,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,8YAAA,CAAA,EAAA;;;ACtEH;MAoBa,oBAAoB,CAAA;IAC/B,OAAO,QAAQ,GAAmB;AAChC,QAAA,YAAY,EAAE,6BAA6B;AAC3C,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,WAAW,EAAE,iBAAiB;iBAC9BA,SAAO;KACR;AAEQ,IAAA,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC;AACjC,IAAA,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;IAE3B,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAACA,SAAO,CAAC;IAE9D,KAAK,GAAG,MAAM,CAAmB;AACxC,QAAA,SAAS,EAAE,IAAI;AACf,QAAA,OAAO,EAAE,GAAG;AACZ,QAAA,aAAa,EAAE,IAAI;AACpB,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;AAEO,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,MAAM,WAAW,GAAG;AAClB,YAAA,EAAE,EAAE,CAAC;AACL,YAAA,KAAK,EAAE,EAAE;AACT,YAAA,IAAI,EAAE,GAAG;AACT,YAAA,IAAI,EAAE,GAAG;SACV;QACD,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC;AAC5C,IAAA,CAAC,yDAAC;AAEF,IAAA,iBAAiB,CAAC,KAAe,EAAA;QAC/B,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM;AAC9B,gBAAA,GAAG,OAAO;AACV,gBAAA,GAAI,KAA0B;AAC/B,aAAA,CAAC,CAAC;QACL;IACF;IAEA,iBAAiB,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE;IACrB;IAEA,kBAAkB,GAAA;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE;AAC7D,YAAA,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE;AAClB,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,YAAY,EAAE,KAAK;AACnB,YAAA,SAAS,EAAE,KAAK;AACjB,SAAA,CAAC;QAEF,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;YAC3C,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;YACxB;AACF,QAAA,CAAC,CAAC;IACJ;uGAxDW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,sFCpBjC,4UASA,EAAA,MAAA,EAAA,CAAA,m0BAAA,CAAA,EAAA,CAAA;;2FDWa,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBANhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4BAA4B,WAC7B,EAAE,EAAA,QAAA,EAAA,4UAAA,EAAA,MAAA,EAAA,CAAA,m0BAAA,CAAA,EAAA;;;AEhBb;AACO,MAAMA,SAAO,GAClB,0UAA0U;;MCoQ/T,yBAAyB,CAAA;AACnB,IAAA,IAAI,GAAG,MAAM,CAAmB,eAAe,CAAC;AAChD,IAAA,SAAS,GAAG,MAAM,EAAC,YAAuC,EAAC;;IAGnE,KAAK,GAAG,MAAM,CAAS,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;IAC7C,QAAQ,GAAG,MAAM,CAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;IACnD,SAAS,GAAG,MAAM,CACzB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,QAAQ,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAChC;IACQ,UAAU,GAAG,MAAM,CAC1B,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,QAAQ,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACjC;IACQ,OAAO,GAAG,MAAM,CAAS,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;IAChD,aAAa,GAAG,MAAM,CAAU,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAChE,IAAA,qBAAqB,GAAG,MAAM,CAAU,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,iEAAC;IAC3E,UAAU,GAAG,MAAM,CAAU,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;IAE3D,WAAW,GAAG,MAAM,CAAS,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;IACxD,WAAW,GAAG,MAAM,CAAS,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;IAGjD,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;IACrC,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE;IAC3C,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,QAAQ;IACnD,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,QAAQ;IACrD,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC;IACxC,qBAAqB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI;IACvD,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK;IAClD,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC;IAChD,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE;;AAGzD,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;AAC1C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,QAAA,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE;AAC9B,IAAA,CAAC,8DAAC;AAEO,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;AAC1C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,QAAA,OAAO,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG;AAChC,IAAA,CAAC,8DAAC;AAEO,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MACvC,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,gEACxC;IAEQ,WAAW,GAAG,QAAQ,CAAC,MAC9B,IAAI,CAAC,kBAAkB,EAAE;QACzB,IAAI,CAAC,kBAAkB,EAAE;AACzB,QAAA,IAAI,CAAC,oBAAoB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAC5B;;AAGQ,IAAA,UAAU,GAAG,QAAQ,CAC5B,MACE,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,aAAa;AACnC,QAAA,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,gBAAgB;AACzC,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,CAAC,iBAAiB;AAC3C,QAAA,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC,kBAAkB;AAC7C,QAAA,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,eAAe;AACvC,QAAA,IAAI,CAAC,aAAa,EAAE,KAAK,IAAI,CAAC,qBAAqB;AACnD,QAAA,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC,kBAAkB;AAC7C,QAAA,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,mBAAmB;QAC/C,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,mBAAmB,sDAClD;AAED,IAAA,aAAa,CAAC,KAAa,EAAA;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC;IAChC;AAEA,IAAA,mBAAmB,GAAG,CAAC,KAAa,KAAY;QAC9C,OAAO,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,CAAA,CAAA,CAAG;AACtC,IAAA,CAAC;;AAGD,IAAA,6BAA6B,CAAC,KAAa,EAAA;;AAEzC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AAClD,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;;AAG/B,QAAA,IAAI,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;AACnC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;AAC5C,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;QAC9B;IACF;AAEA,IAAA,6BAA6B,CAAC,KAAa,EAAA;;AAEzC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACpD,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;;AAG/B,QAAA,IAAI,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;AACnC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;AAC1C,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;QAC9B;IACF;AAEA,IAAA,kBAAkB,CAAC,kBAA2B,EAAA;AAC5C,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAC1C,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC;IACrD;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;IACxB;IAEA,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AACnB,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;AACnB,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzB,YAAA,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;AAC3B,YAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACvB,YAAA,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE;AACnC,YAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,YAAA,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE;AAC/B,YAAA,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE;AACZ,SAAA,CAAC;IACxB;uGAzHW,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,wBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxO1B,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsJT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,m/BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAhKC,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,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,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,eAAe,ybACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,EAAA,0BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,eAAe,kaACf,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FA0OX,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAtPrC,SAAS;+BACE,wBAAwB,EAAA,UAAA,EACtB,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,WAAW;wBACX,eAAe;wBACf,eAAe;wBACf,kBAAkB;wBAClB,cAAc;wBACd,eAAe;wBACf,eAAe;AACf,wBAAA,oBAAoB;qBACrB,EAAA,QAAA,EACS,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsJT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,m/BAAA,CAAA,EAAA;;;ACvKH;;;;;;;;AAQG;MAWU,uBAAuB,CAAA;;;AAGlC,IAAA,WAAW,GAAG,KAAK,CAAC,CAAC,+CAAI,SAAS,EAAE,eAAe,EAAA,CAAA,GAAA,CAA5B,EAAE,SAAS,EAAE,eAAe,EAAE,GAAC;;AAGtD,IAAA,WAAW,GAAG,KAAK,CAAC,GAAG,+CAAI,SAAS,EAAE,eAAe,EAAA,CAAA,GAAA,CAA5B,EAAE,SAAS,EAAE,eAAe,EAAE,GAAC;AAExD;;;AAGG;AACH,IAAA,UAAU,GAAG,KAAK,CAAC,GAAG,8CAAI,SAAS,EAAE,eAAe,EAAA,CAAA,GAAA,CAA5B,EAAE,SAAS,EAAE,eAAe,EAAE,GAAC;;AAGvD,IAAA,gBAAgB,GAAG,KAAK,CAAC,IAAI,oDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA7B,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAC;;AAG/D,IAAA,UAAU,GAAG,KAAK,CAAC,EAAE,8CAAI,SAAS,EAAE,eAAe,EAAA,CAAA,GAAA,CAA5B,EAAE,SAAS,EAAE,eAAe,EAAE,GAAC;;AAGrC,IAAA,EAAE,GAAG,MAAM,CAA0B,UAAU,CAAC;AAChD,IAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;AACrB,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;AAGxC,IAAA,IAAI;AACZ,IAAA,IAAY,GAAG,GAAA;AACb,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;YAC/C,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE;AAClC,gBAAA,kBAAkB,EAAE,IAAI;AACxB,gBAAA,KAAK,EAAE,KAAK;AACb,aAAA,CAAE;QACL;QACA,OAAO,IAAI,CAAC,IAAI;IAClB;AAEQ,IAAA,EAAE;AACF,IAAA,EAAE;AACF,IAAA,UAAU;;IAGV,QAAQ,GAAG,EAAE;IACb,QAAQ,GAAG,CAAC;IACZ,QAAQ,GAAG,CAAC;IACZ,YAAY,GAAG,CAAC;AAExB,IAAA,WAAA,GAAA;;AAEE,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;YAC7B,IAAI,CAAC,OAAO,EAAE;AAChB,QAAA,CAAC,CAAC;IACJ;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE;;AAGzC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa;AAClC,QAAA,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,yBAAyB;;AAGjD,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAK;YAC/B,IAAI,CAAC,GAAG,EAAE;YACV,IAAI,CAAC,aAAa,EAAE;AACpB,YAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;gBAC3B,IAAI,CAAC,WAAW,EAAE;YACpB;AACF,QAAA,CAAC,CAAC;IACJ;;AAGA;;AAEG;IACK,UAAU,GAAG,MAAK;AACxB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC;QACvC;AAEA,QAAA,IAAI,CAAC,UAAU,GAAG,qBAAqB,CAAC,MAAK;YAC3C,IAAI,CAAC,GAAG,EAAE;AACZ,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;AAED;;AAEG;IACK,GAAG,GAAG,MAAK;AACjB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa;AAClC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa;AAEjC,QAAA,IAAI,CAAC,MAAM;YAAE;QAEb,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE;QAC3C,IAAI,CAAC,IAAI,EAAE;YACT,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAA,EAAG,IAAI,CAAC,WAAW,EAAE,CAAA,EAAA,CAAI;YAC/C;QACF;AAEA,QAAA,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;;AAGrD,QAAA,IACE,IAAI,KAAK,IAAI,CAAC,QAAQ;YACtB,IAAI,KAAK,IAAI,CAAC,QAAQ;YACtB,IAAI,KAAK,IAAI,CAAC,QAAQ;AACtB,YAAA,IAAI,CAAC,YAAY,GAAG,CAAC,EACrB;YACA;QACF;;AAGA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;QAE1D,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAA,EAAG,KAAK,IAAI;;QAGlC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC;;AAGvC,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;QACpB,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;AACrD,IAAA,CAAC;AAED;;AAEG;AACK,IAAA,iBAAiB,CAAC,MAAmB,EAAA;AAI3C,QAAA,MAAM,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC;AACnC,QAAA,MAAM,IAAI,GACR,MAAM,CAAC,WAAW;AAClB,YAAA,UAAU,CAAC,EAAE,CAAC,WAAW,CAAC;AAC1B,YAAA,UAAU,CAAC,EAAE,CAAC,YAAY,CAAC;AAC7B,QAAA,MAAM,IAAI,GACR,MAAM,CAAC,YAAY;AACnB,YAAA,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC;AACzB,YAAA,UAAU,CAAC,EAAE,CAAC,aAAa,CAAC;QAE9B,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE;IAC7D;AAEA;;AAEG;AACK,IAAA,SAAS,CACf,IAAiB,EACjB,IAAY,EACZ,IAAY,EACZ,KAAa,EAAA;;AAGb,QAAA,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,EAAE;YACvD,IAAI,IAAI,GAAG,KAAK;YAChB,IAAI,UAAU,GAAG,CAAC;YAClB,MAAM,aAAa,GAAG,EAAE;YAExB,OACE,UAAU,GAAG,aAAa;AAC1B,gBAAA,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AACzB,iBAAC,IAAI,CAAC,WAAW,GAAG,IAAI,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EACrD;gBACA,IAAI,IAAI,IAAI;gBACZ,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAA,EAAG,IAAI,IAAI;AACjC,gBAAA,UAAU,EAAE;YACd;;AAGA,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;QAC1B;IACF;;AAGA;;AAEG;IACK,OAAO,CACb,IAAY,EACZ,IAAY,EACZ,IAAY,EACZ,SAAS,GAAG,GAAG,EAAA;AAEf,QAAA,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,WAAW,EAAE;QAErD,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC;AAC7D,QAAA,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,IAAI,YAAY;AAC3D,QAAA,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,IAAI,KAAK;AAEpD,QAAA,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE;AAC3B,QAAA,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE;AAC3B,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE;AAEhC,QAAA,OAAO,EAAE,GAAG,EAAE,GAAG,SAAS,EAAE;YAC1B,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC;AACzB,YAAA,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,GAAG,CAAA,GAAA,EAAM,UAAU,CAAA,CAAE;YAEtD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC;AAC1C,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK;;YAG3B,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC;YAErD,IAAI,KAAK,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,EAAE;gBACnC,OAAO,GAAG,GAAG;gBACb,EAAE,GAAG,GAAG;YACV;iBAAO;gBACL,EAAE,GAAG,GAAG;YACV;QACF;QAEA,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG;IACxC;AAEA;;AAEG;IACK,mBAAmB,CAAC,OAAoB,EAAE,QAAgB,EAAA;;QAEhE,IAAI,OAAO,CAAC,qBAAqB,IAAI,OAAO,CAAC,sBAAsB,EAAE;AACnE,YAAA,OAAO,OAAO,CAAC,qBAAqB,GAAG,OAAO,CAAC,sBAAsB;QACvE;;QAGA,IAAI,OAAO,CAAC,uBAAuB,IAAI,OAAO,CAAC,wBAAwB,EAAE;AACvE,YAAA,OAAO,OAAO,CAAC,uBAAuB,GAAG,OAAO,CAAC,wBAAwB;QAC3E;;AAGA,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,GAAG;AACzB,cAAE,QAAQ,GAAG,IAAI,CAAC,UAAU;AAC5B,cAAE,IAAI,CAAC,UAAU,EAAE;IACvB;;AAGA;;AAEG;IACK,aAAa,GAAA;AACnB,QAAA,IAAI,EAAE,gBAAgB,IAAI,MAAM,CAAC;YAAE;QAEnC,IAAI,CAAC,EAAE,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,KAAI;;AAEvC,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC;AACxB,YAAA,IAAI,KAAK,EAAE,WAAW,EAAE;gBACtB,IAAI,CAAC,UAAU,EAAE;YACnB;AACF,QAAA,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,aAAa;QAClD,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;QACzB;IACF;AAEA;;AAEG;IACK,WAAW,GAAA;AACjB,QAAA,IAAI,EAAE,kBAAkB,IAAI,MAAM,CAAC;YAAE;QAErC,IAAI,CAAC,EAAE,GAAG,IAAI,gBAAgB,CAAC,CAAC,SAAS,KAAI;;AAE3C,YAAA,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAClC,CAAC,CAAC,KACA,CAAC,CAAC,IAAI,KAAK,eAAe;AAC1B,iBAAC,CAAC,CAAC,IAAI,KAAK,WAAW;AACrB,qBAAC,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAC5D;YAED,IAAI,aAAa,EAAE;gBACjB,IAAI,CAAC,UAAU,EAAE;YACnB;AACF,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;AACrC,YAAA,aAAa,EAAE,IAAI;AACnB,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,OAAO,EAAE,IAAI;AACd,SAAA,CAAC;IACJ;AAEA;;AAEG;IACK,OAAO,GAAA;AACb,QAAA,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE;AACrB,QAAA,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE;AAErB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC;QACvC;;AAGA,QAAA,IAAI,CAAC,IAAI,GAAG,SAAS;IACvB;uGA7SW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,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,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,eAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAVnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qBAAqB;AAC/B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE;AACJ,wBAAA,iBAAiB,EAAE,SAAS;AAC5B,wBAAA,eAAe,EAAE,QAAQ;AACzB,wBAAA,qBAAqB,EAAE,UAAU;AACjC,wBAAA,kBAAkB,EAAE,WAAW;AAChC,qBAAA;AACF,iBAAA;;;AC/BD;MA4Ba,oBAAoB,CAAA;IAC/B,OAAO,QAAQ,GAAmB;AAChC,QAAA,YAAY,EAAE,6BAA6B;AAC3C,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,WAAW,EAAE,sBAAsB;iBACnCH,SAAO;KACR;AAEQ,IAAA,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC;AACjC,IAAA,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;IAEpC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAACA,SAAO,CAAC;IAE9D,KAAK,GAAG,MAAM,CAAmB;AAC/B,QAAA,KAAK,EAAE,EAAE;AACT,QAAA,QAAQ,EAAE,EAAE;AACZ,QAAA,SAAS,EAAE,QAAQ;AACnB,QAAA,UAAU,EAAE,QAAQ;AACpB,QAAA,OAAO,EAAE,CAAC;AACV,QAAA,aAAa,EAAE,IAAI;AACnB,QAAA,UAAU,EAAE,KAAK;QACjB,WAAW,EAAE,CAAC;QACd,WAAW,EAAE,EAAE;AAChB,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAEF,IAAA,iBAAiB,CAAC,KAAe,EAAA;QAC/B,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM;AAC9B,gBAAA,GAAG,OAAO;AACV,gBAAA,GAAI,KAA0B;AAC/B,aAAA,CAAC,CAAC;QACL;IACF;IAEA,iBAAiB,GAAA;AACf,QAAA,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE;IAC5B;IAEA,kBAAkB,GAAA;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE;AAC7D,YAAA,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE;AAC9B,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,YAAY,EAAE,KAAK;AACnB,YAAA,SAAS,EAAE,KAAK;AACjB,SAAA,CAAC;QAEF;AACG,aAAA,WAAW;AACX,aAAA,SAAS,CAAC,CAAC,MAAoC,KAAI;YAClD,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;YACxB;AACF,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,IAAI,UAAU,GAAA;QACZ,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE;IACrC;AAEA,IAAA,IAAI,KAAK,GAAA;QACP,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE;IACnC;;AAGS,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,WAAW,IAAI,CAAC,uDAAC;AAC3D,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,WAAW,IAAI,EAAE,uDAAC;uGAlE1D,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5BjC,g1BAqBA,EAAA,MAAA,EAAA,CAAA,oiDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDGY,uBAAuB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,aAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAItB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBANhC,SAAS;+BACE,4BAA4B,EAAA,OAAA,EAC7B,CAAC,uBAAuB,CAAC,EAAA,QAAA,EAAA,g1BAAA,EAAA,MAAA,EAAA,CAAA,oiDAAA,CAAA,EAAA;;;AExB7B,MAAMA,SAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2CtB;;MC2FY,yBAAyB,CAAA;AACnB,IAAA,IAAI,GAAG,MAAM,CAAmB,eAAe,CAAC;AAChD,IAAA,SAAS,GAAG,MAAM,EAAC,YAAuC,EAAC;;IAGnE,IAAI,GAAG,MAAM,CAAuB,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;IAChE,aAAa,GAAG,MAAM,CAAU,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;IAChE,UAAU,GAAG,MAAM,CAAgB,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;IACjE,WAAW,GAAG,MAAM,CAAU,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;IAGpD,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS;IAC1C,qBAAqB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI;IACvD,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK;IAClD,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI;;AAG3D,IAAA,UAAU,GAAG,QAAQ,CAC5B,MACE,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,YAAY;AACjC,QAAA,IAAI,CAAC,aAAa,EAAE,KAAK,IAAI,CAAC,qBAAqB;AACnD,QAAA,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC,kBAAkB;QAC7C,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,mBAAmB,sDAClD;IAED,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;IACxB;IAEA,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AACnB,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AACjB,YAAA,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE;AACnC,YAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,YAAA,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE;AACZ,SAAA,CAAC;IACxB;uGApCW,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,wBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA9G1B,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiET,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,kZAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAxEC,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,eAAe,ybACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,eAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,SAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAgHX,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAzHrC,SAAS;+BACE,wBAAwB,EAAA,UAAA,EACtB,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,WAAW;wBACX,eAAe;wBACf,eAAe;wBACf,cAAc;wBACd,oBAAoB;qBACrB,EAAA,QAAA,EACS,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiET,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,kZAAA,CAAA,EAAA;;;MC5DU,qBAAqB,CAAA;AACvB,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;;AAGzC,IAAA,UAAU,GAAG,KAAK,CAAgB,KAAK,sDAAC;AACxC,IAAA,WAAW,GAAG,KAAK,CAAU,IAAI,uDAAC;AAClC,IAAA,aAAa,GAAG,KAAK,CAAU,KAAK,yDAAC;;AAGrC,IAAA,WAAW,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,uDAAC;AAEhC,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AAC5B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC/B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;AAChC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE;QACnC,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC;AACjD,IAAA,CAAC,yDAAC;IAEF,WAAW,GAAkB,IAAI;AAEjC,IAAA,WAAW,CAAC,IAAU,EAAE,MAAqB,EAAE,QAAiB,EAAA;AAC9D,QAAA,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC3B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;AACjC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;;AAGjC,QAAA,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AAC9C,QAAA,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AAE9C,QAAA,IAAI,MAAM,KAAK,KAAK,EAAE;;AAEpB,YAAA,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI;AACtC,YAAA,KAAK,GAAG,KAAK,GAAG,EAAE;YAClB,IAAI,KAAK,KAAK,CAAC;AAAE,gBAAA,KAAK,GAAG,EAAE,CAAC;AAE5B,YAAA,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;YAC5C,OAAO,QAAQ,GAAG,GAAG,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,GAAG,CAAA,EAAG,EAAE,IAAI,EAAE,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE;QACvE;aAAO;;AAEL,YAAA,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AAC5C,YAAA,OAAO,QAAQ,GAAG,CAAA,EAAG,EAAE,IAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,GAAG,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,EAAE,EAAE;QACvD;IACF;AAEA,IAAA,WAAA,GAAA;;QAEE,IAAI,CAAC,WAAW,EAAE;;AAGlB,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAK;YAC9B,IAAI,CAAC,UAAU,EAAE;AACnB,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;;AAET,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;QACtB,MAAM,iBAAiB,GAAG,IAAI,GAAG,GAAG,CAAC,eAAe,EAAE;QAEtD,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;;YAGhC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,MAAK;gBACzC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;YAClC,CAAC,EAAE,IAAI,CAAC;QACV,CAAC,EAAE,iBAAiB,CAAC;IACvB;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE;AAC7B,YAAA,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC;AAC/B,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QACzB;IACF;uGA1EW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,2rBC7BlC,4EACA,EAAA,MAAA,EAAA,CAAA,itBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FD4Ba,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAbjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,cACjB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,IAAA,EAGzC;AACJ,wBAAA,wBAAwB,EAAE,iBAAiB;AAC3C,wBAAA,iBAAiB,EAAE,wBAAwB;AAC3C,wBAAA,sBAAsB,EAAE,eAAe;AACvC,wBAAA,KAAK,EAAE,sBAAsB;AAC9B,qBAAA,EAAA,QAAA,EAAA,4EAAA,EAAA,MAAA,EAAA,CAAA,itBAAA,CAAA,EAAA;;;MEbU,oBAAoB,CAAA;AACtB,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;;AAGtC,IAAA,aAAa,GAAG,KAAK,CAAU,KAAK,yDAAC;AACrC,IAAA,WAAW,GAAG,KAAK,CAAU,IAAI,uDAAC;;AAGlC,IAAA,QAAQ,GAAG,SAAS,CAA6B,UAAU,oDAAC;AAC5D,IAAA,UAAU,GAAG,SAAS,CAA6B,YAAY,sDAAC;AAChE,IAAA,UAAU,GAAG,SAAS,CAA6B,YAAY,sDAAC;;AAGhE,IAAA,WAAW,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,uDAAC;;AAGhC,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,EAAE;AAC/C,QAAA,OAAO,OAAO,GAAG,CAAC,CAAC;AACrB,IAAA,CAAC,8DAAC;AAEF,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC/B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;AACjC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;QACjC,OAAO,OAAO,GAAG,CAAC,GAAG,OAAO,GAAG,EAAE,CAAC;AACpC,IAAA,CAAC,8DAAC;AAEF,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;AAClC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;AACjC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;AACjC,QAAA,OAAO,KAAK,GAAG,EAAE,GAAG,OAAO,GAAG,CAAC,GAAG,OAAO,GAAG,GAAG,CAAC;AAClD,IAAA,CAAC,4DAAC;IAEF,WAAW,GAAkB,IAAI;AAEjC,IAAA,WAAA,GAAA;;QAEE,IAAI,CAAC,WAAW,EAAE;;AAGlB,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAK;YAC9B,IAAI,CAAC,UAAU,EAAE;AACnB,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,iBAAiB,EAAE;AAC1B,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;;AAET,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;QACtB,MAAM,iBAAiB,GAAG,IAAI,GAAG,GAAG,CAAC,eAAe,EAAE;QAEtD,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;;YAGhC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,MAAK;gBACzC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;YAClC,CAAC,EAAE,IAAI,CAAC;QACV,CAAC,EAAE,iBAAiB,CAAC;IACvB;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE;AAC7B,YAAA,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC;AAC/B,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QACzB;IACF;IAEA,iBAAiB,GAAA;QACf,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa;QAClD,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa;QACtD,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa;QAEtD,IAAI,WAAW,EAAE;AACf,YAAA,IAAI,CAAC,SAAS,CAAC,YAAY,CACzB,WAAW,EACX,WAAW,EACX,CAAA,OAAA,EAAU,IAAI,CAAC,gBAAgB,EAAE,CAAA,WAAA,CAAa,CAC/C;QACH;QAEA,IAAI,aAAa,EAAE;AACjB,YAAA,IAAI,CAAC,SAAS,CAAC,YAAY,CACzB,aAAa,EACb,WAAW,EACX,CAAA,OAAA,EAAU,IAAI,CAAC,kBAAkB,EAAE,CAAA,WAAA,CAAa,CACjD;QACH;AAEA,QAAA,IAAI,aAAa,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;AACvC,YAAA,IAAI,CAAC,SAAS,CAAC,YAAY,CACzB,aAAa,EACb,WAAW,EACX,CAAA,OAAA,EAAU,IAAI,CAAC,kBAAkB,EAAE,CAAA,WAAA,CAAa,CACjD;QACH;IACF;uGAxGW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,i1BCdjC,k8FAkEA,EAAA,MAAA,EAAA,CAAA,u2CAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDpDa,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAZhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,cAChB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,IAAA,EAGzC;AACJ,wBAAA,wBAAwB,EAAE,iBAAiB;AAC3C,wBAAA,sBAAsB,EAAE,eAAe;AACvC,wBAAA,OAAO,EAAE;AACV,qBAAA,EAAA,QAAA,EAAA,k8FAAA,EAAA,MAAA,EAAA,CAAA,u2CAAA,CAAA,EAAA;;;AEZH;MAwBa,oBAAoB,CAAA;IAC/B,OAAO,QAAQ,GAAmB;AAChC,QAAA,YAAY,EAAE,6BAA6B;AAC3C,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,WAAW,EAAE,0CAA0C;iBACvDN,SAAO;KACR;AAEQ,IAAA,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC;AACjC,IAAA,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;IAEpC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAACA,SAAO,CAAC;IAE9D,KAAK,GAAG,MAAM,CAAmB;AAC/B,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,aAAa,EAAE,IAAI;AACnB,QAAA,UAAU,EAAE,KAAK;AACjB,QAAA,WAAW,EAAE,IAAI;AAClB,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAEF,IAAA,WAAA,GAAA;;IAEA;AAEA,IAAA,iBAAiB,CAAC,KAAe,EAAA;QAC/B,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM;AAC9B,gBAAA,GAAG,OAAO;AACV,gBAAA,GAAI,KAA0B;AAC/B,aAAA,CAAC,CAAC;QACL;IACF;IAEA,iBAAiB,GAAA;AACf,QAAA,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE;IAC5B;IAEA,kBAAkB,GAAA;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE;AAC7D,YAAA,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE;AAC9B,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,YAAY,EAAE,KAAK;AACnB,YAAA,SAAS,EAAE,KAAK;AACjB,SAAA,CAAC;QAEF;AACG,aAAA,WAAW;AACX,aAAA,SAAS,CAAC,CAAC,MAAoC,KAAI;YAClD,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;YACxB;AACF,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,KAAK,QAAQ;IACvC;AAEA,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,KAAK,SAAS;IACxC;uGA7DW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxBjC,kjBAeC,EAAA,MAAA,EAAA,CAAA,wpEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDKW,qBAAqB,sHAAE,oBAAoB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAI1C,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4BAA4B,cAC1B,IAAI,EAAA,OAAA,EACP,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,EAAA,QAAA,EAAA,kjBAAA,EAAA,MAAA,EAAA,CAAA,wpEAAA,CAAA,EAAA;;;AEIxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwFG;MAqBU,oBAAoB,CAAA;AACd,IAAA,WAAW,GAAG,SAAS,CAA6B,WAAW,uDAAC;AAChE,IAAA,YAAY,GAAG,SAAS,CAA0B,YAAY,wDAAC;AAC/D,IAAA,SAAS,GACxB,SAAS,CAAC,QAAQ,CAA6B,SAAS,CAAC;;AAGlD,IAAA,KAAK,GAAG,KAAK,CAAC,CAAC,iDAAC;AAChB,IAAA,GAAG,GAAG,KAAK,CAAC,CAAC,+CAAC;AACd,IAAA,GAAG,GAAG,KAAK,CAAC,GAAG,+CAAC;IAChB,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAwB;AACxC,IAAA,KAAK,GAAG,KAAK,CAAC,OAAO,iDAAC;AACtB,IAAA,WAAW,GAAG,KAAK,CAAC,EAAE,uDAAC;AACvB,IAAA,YAAY,GAAG,KAAK,CAAC,CAAC,wDAAC;;AAGhC;;;;AAIG;AACM,IAAA,aAAa,GAAG,KAAK,CAAC,KAAK,yDAAC;AAErC;;;AAGG;AACM,IAAA,cAAc,GAAG,KAAK,CAAC,IAAI,0DAAC;;AAGrC;;;AAGG;AACM,IAAA,IAAI,GAAG,KAAK,CAAC,GAAG,gDAAC;AAE1B;;;;;AAKG;AACM,IAAA,cAAc,GAAG,KAAK,CAAC,KAAK,0DAAC;AAEtC;;;AAGG;AACM,IAAA,gBAAgB,GAAG,KAAK,CAAC,EAAE,4DAAC;;AAGrC;;;;;AAKG;AACM,IAAA,cAAc,GAAG,KAAK,CAAC,KAAK,0DAAC;AAEtC;;;;;;;;;AASG;AACM,IAAA,oBAAoB,GAAG,KAAK,CAAC,EAAE,gEAAC;AAEzC;;;;;;;AAOG;AACM,IAAA,qBAAqB,GAAG,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,iEAAC;;AAGxE;;;AAGG;AACM,IAAA,cAAc,GAAG,KAAK,CAAC,EAAE,0DAAC;AAEnC;;;AAGG;AACM,IAAA,cAAc,GAAG,KAAK,CAAC,EAAE,0DAAC;AAEnC;;;AAGG;AACM,IAAA,GAAG,GAAG,KAAK,CAAC,CAAC,+CAAC;AAEd,IAAA,OAAO,GAAG,CAAA,SAAA,EAAY,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;AAC3D,IAAA,MAAM,GAAG,CAAA,QAAA,EAAW,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;AACzD,IAAA,MAAM,GAAG,CAAA,QAAA,EAAW,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;AAEjD,IAAA,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;AAC1B,IAAA,UAAU,GAAG,MAAM,EAAC,UAAuB,EAAC;AAC5C,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAC/B,EAAE,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE;AACvD,QAAA,qBAAqB,EAAE,CAAC;AACzB,KAAA,CAAC;;AAGF;;;;AAIG;AACc,IAAA,aAAa,GAAG,MAAM,CAAgB,IAAI,yDAAC;AAE5D;;;;AAIG;IACK,cAAc,GAA0B,IAAI;AAE3C,IAAA,SAAS,GAAG,QAAQ,CAC3B,IAAI,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,KAAK,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CACjE,GAAG,CAAC,MAAM,IAAI,CAAC,CAChB,EACD,EAAE,YAAY,EAAE,KAAK,EAAE,CACxB;IAEQ,UAAU,GAAG,QAAQ,CAC5B,OAAO,QAAQ,KAAK,WAAW,IAAI,OAAO,IAAI;AAC5C,UAAE,IAAI,CAAE,QAA8C,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CACpE,GAAG,CAAC,MAAM,IAAI,CAAC;AAEnB,UAAE,EAAE,CAAC,IAAI,CAAC;AACZ,IAAA,EAAE,YAAY,EAAE,KAAK,EAAE,CACxB;AAED,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;AAC7B,YAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,gBAAA,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;AAChC,gBAAA,IAAI,CAAC,cAAc,GAAG,IAAI;YAC5B;AACF,QAAA,CAAC,CAAC;IACJ;AAEA;;;;AAIG;AACc,IAAA,uBAAuB,GAAG,MAAM,CAAC,MAAK;AACrD,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE;AAE3C,QAAA,IAAI,aAAa,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;;YAEzC,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,KAAI;AACnD,gBAAA,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC;AACxB,gBAAA,IAAI,CAAC,KAAK;oBAAE;gBAEZ,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW;AAC3C,gBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAEvC,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,CAAC,CAAC;AAC/C,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;AAE5C,gBAAA,IAAI,MAAc;AAClB,gBAAA,IAAI,MAAc;AAElB,gBAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;;;AAGzB,oBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,EAAE;oBACzC,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAClC,oBAAA,MAAM,GAAG,MAAM,GAAG,WAAW;oBAC7B,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,IAAI,WAAW;gBACrC;qBAAO;;AAEL,oBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE;oBACpC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;AACrC,oBAAA,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC;gBAC3C;gBAEA,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;AAC5C,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AACnD,YAAA,CAAC,CAAC;YAEF,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAC5D;AAAO,aAAA,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,cAAc,EAAE;;AAEhD,YAAA,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;AAChC,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;QAC9B;AACF,IAAA,CAAC,mEAAC;;AAGF,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,EAAE;QACjC,IAAI,OAAO,GAAG,KAAK,QAAQ;AAAE,YAAA,OAAO,GAAG;QACvC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,GAAG,CAAC,EAAE;YACtC,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG;AACtC,YAAA,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QACtB;AAEA,QAAA,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;AAC/B,IAAA,CAAC,2DAAC;;AAGF,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AAAE,YAAA,OAAO,EAAE;;QAGrC,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,UAAU,EAAE;AAEjB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;AACzB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;AACzB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAClC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;AAE/B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAC7C,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;;AAGtC,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,CAAA,UAAA,EAAa,EAAE,CAAA,CAAA,EAAI,EAAE,GAAG;;QAG5D,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa;AAE5C,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,CAAA,UAAA,EAAa,EAAE,CAAA,CAAA,EAAI,EAAE,GAAG;;;QAI7C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;;QAGnC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,IAAI,CAAC;QACvD,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC;AAE1D,QAAA,MAAM,CAAC,GACL,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,WAAW,EAAE,SAAS,GAAG,YAAY,CAAC;YAC1D,IAAI,CAAC,cAAc,EAAE;AAEvB,QAAA,OAAO,aAAa,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,QAAA,EAAW,CAAC,GAAG;AAC7C,IAAA,CAAC,0DAAC;;AAGF,IAAA,QAAQ,CAAC,IAAwB,EAAA;AAC/B,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE;;AAE1B,YAAA,IAAI,GAAG,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;AAAE,gBAAA,OAAO,GAAG;QAC1D;AAAE,QAAA,MAAM;;QAER;;QAEA,OAAO,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAChC;;AAGA;;;;;;;;;;;AAWG;AACc,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AAC7C,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,aAAa,EAAE;QAC9C,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,iBAAiB,KAAK,IAAI,EAAE;AACvD,YAAA,OAAO,iBAAiB;QAC1B;AACA,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE;AACpB,IAAA,CAAC,yDAAC;AAEF;;;;;;;;;;AAUG;AACc,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AAC7C,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AAAE,YAAA,OAAO,CAAC;QACpC,OAAO,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,oBAAoB,EAAE;AAC3D,IAAA,CAAC,yDAAC;AAEF;;;;;AAKG;AACM,IAAA,uBAAuB,GAAG,QAAQ,CAAC,MAAK;AAC/C,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;YACzB,OAAO,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC,KAAK;QAClE;AACA,QAAA,OAAO,IAAI,CAAC,cAAc,EAAE;AAC9B,IAAA,CAAC,mEAAC;AAEF;;;;;AAKG;AACM,IAAA,uBAAuB,GAAG,QAAQ,CAAC,MAAK;AAC/C,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;YACzB,OAAO,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC,KAAK;QAClE;AACA,QAAA,OAAO,IAAI,CAAC,cAAc,EAAE;AAC9B,IAAA,CAAC,mEAAC;AAEF;;;;;AAKG;AACM,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;YACzB,OAAO,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC,GAAG;QAChE;AACA,QAAA,OAAO,IAAI,CAAC,GAAG,EAAE;AACnB,IAAA,CAAC,wDAAC;;AAGe,IAAA,UAAU,GAAG,QAAQ,CACpC,MAAM,IAAI,CAAC,uBAAuB,EAAE,GAAG,CAAC,sDACzC;AACQ,IAAA,QAAQ,GAAG,QAAQ,CAC1B,MAAM,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,uBAAuB,EAAE,oDAC5D;IACQ,SAAS,GAAG,QAAQ,CAAC,MAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACzE;IACQ,OAAO,GAAG,QAAQ,CACzB,MAAM,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,uBAAuB,EAAE,GAAG,CAAC,mDACpE;IACQ,OAAO,GAAG,QAAQ,CACzB,MAAM,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,uBAAuB,EAAE,GAAG,CAAC,mDACpE;AAED;;;;AAIG;AACH,IAAA,cAAc,GAAG,KAAK,CAA8B,SAAS,0DAAC;;AAG9D,IAAA,cAAc,GAAG,KAAK,CAAS,GAAG,0DAAC;;AAGnC,IAAA,YAAY,GAAG,KAAK,CAAS,CAAC,wDAAC;;AAG/B,IAAA,cAAc,GAAG,KAAK,CAAS,IAAI,0DAAC;AAE3B,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,uDAAC;IACtD,WAAW,GAAG,QAAQ,CAC7B,MACE,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,CAAC,uBAAuB,EAAE,GAAG,CAAC;AAClC,QAAA,IAAI,CAAC,YAAY,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACtB;IACQ,iBAAiB,GAAG,QAAQ,CACnC,MACE,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,CAAC,uBAAuB,EAAE,GAAG,CAAC;QAClC,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,uBAAuB,EAAE,GAAG,CAAC,6DACrC;AACQ,IAAA,iBAAiB,GAAG,QAAQ,CACnC,MAAM,IAAI,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,uBAAuB,EAAE,6DAChE;IAEgB,UAAU,GAAG,CAAC,GAAG;IACjB,QAAQ,GAAG,CAAC;IAEpB,YAAY,GAAG,QAAQ,CAAC,MAC/B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACjD;AAEQ,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;QACrC,IAAI,KAAK,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC;AACzB,QAAA,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK;AACnD,IAAA,CAAC,sDAAC;AAEO,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,GAAG,CAAC,mDAAC;AAErD,IAAA,eAAe,GAAG,QAAQ,CAAuB,MAAK;AACrE,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE;AACzB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE;AACzB,QAAA,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM;QAC7B,OAAO;AACL,YAAA;AACE,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,EAAE,EAAE,MAAM,GAAG,GAAG,GAAG,KAAK;AACxB,gBAAA,KAAK,EAAE,sCAAsC;AAC9C,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,MAAM,GAAG,GAAG,GAAG,KAAK;AAC1B,gBAAA,EAAE,EAAE,MAAM,GAAG,GAAG,GAAG,KAAK;AACxB,gBAAA,KAAK,EAAE,qCAAqC;AAC7C,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,MAAM,GAAG,GAAG,GAAG,KAAK;AAC1B,gBAAA,EAAE,EAAE,MAAM;AACV,gBAAA,KAAK,EAAE,kCAAkC;AAC1C,aAAA;SACF;AACH,IAAA,CAAC,2DAAC;AAEO,IAAA,cAAc,GAAG,QAAQ,CAChC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE,0DAChD;AAEQ,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,0DAAC;AAEpE,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAClC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE;AAC7B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;AAClC,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;YACpB,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE;gBAAE,OAAO,CAAC,CAAC,KAAK;QAC9C;QACA,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,wBAAwB;AACvD,IAAA,CAAC,sDAAC;IAEO,iBAAiB,GAAG,QAAQ,CAAC,MACpC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACvE;AAEQ,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;AAClC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE;AACzB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE;AACzB,QAAA,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM;AAC7B,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;AAErB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAClC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AAE/D,QAAA,OAAO;AACJ,aAAA,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;YACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACxD,IAAI,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC;YAC1C,IAAI,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;YACxC,IAAI,CAAC,GAAG,CAAC;AAAE,gBAAA,EAAE,IAAI,MAAM,GAAG,CAAC;AAC3B,YAAA,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;AAAE,gBAAA,EAAE,IAAI,MAAM,GAAG,CAAC;YACzC,IAAI,EAAE,IAAI,EAAE;AAAE,gBAAA,OAAO,IAAI;YACzB,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE;AAChE,QAAA,CAAC;aACA,MAAM,CAAC,CAAC,CAAC,KAA2C,CAAC,CAAC,CAAC,CAAC;AAC7D,IAAA,CAAC,wDAAC;AAEO,IAAA,SAAS,GAAG,QAAQ,CAC3B,MACE,CAAA,EAAG,IAAI,CAAC,KAAK,EAAE,CAAA,EAAA,EAAK,IAAI,CAAC,cAAc,EAAE,CAAA,QAAA,EAAW,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,CAAG,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAClF;AAEO,IAAA,KAAK,CAAC,CAAS,EAAE,GAAW,EAAE,GAAW,EAAA;AAC/C,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC;IACxC;AAEA;;;;;;;;;AASG;AACK,IAAA,kBAAkB,CAAC,CAAS,EAAA;AAClC,QAAA,OAAO,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC;IAChE;AAEA;;;;;;;;;;;AAWG;AACK,IAAA,gBAAgB,CAAC,EAAU,EAAE,EAAU,EAAE,CAAS,EAAE,KAAa,EAAA;QACvE,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG;QACjC,OAAO,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;IAC7D;AAEA;;;;;;;;;;;;;;;;AAgBG;AACK,IAAA,aAAa,CAAC,CAAS,EAAE,EAAU,EAAE,EAAU,EAAA;AACrD,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,EACvB,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;AACrB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;AAClD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;AAChD,QAAA,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;QAC7B,OAAO,CAAA,EAAA,EAAK,KAAK,CAAC,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAC,CAAA,GAAA,EAAM,CAAC,CAAA,CAAA,EAAI,CAAC,MAAM,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,GAAG,CAAC,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,CAAC,CAAA,CAAE;IACvF;AAEA;;;;;;;;;;;;;;;AAeG;IACK,mBAAmB,CAAC,EAAU,EAAE,CAAS,EAAA;AAC/C,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;AACrC,QAAA,OAAO,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAC;IACvD;uGAjjBW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,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,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,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,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,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,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,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,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,sBAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,sBAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrIjC,ohFA0FA,EAAA,MAAA,EAAA,CAAA,88CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED0BY,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAiBX,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBApBhC,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EACN,uBAAuB,CAAC,MAAM,EAAA,IAAA,EAGzC;AACJ,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,mBAAmB,EAAE,aAAa;AAClC,wBAAA,sBAAsB,EAAE,OAAO;AAC/B,wBAAA,sBAAsB,EAAE,OAAO;AAC/B,wBAAA,sBAAsB,EAAE,gBAAgB;AACxC,wBAAA,uBAAuB,EAAE,kBAAkB;AAC3C,wBAAA,wBAAwB,EAAE,SAAS;AACnC,wBAAA,yBAAyB,EAAE,QAAQ;AACnC,wBAAA,uBAAuB,EAAE,kBAAkB;AAC3C,wBAAA,wBAAwB,EAAE,iBAAiB;AAC5C,qBAAA,EAAA,QAAA,EAAA,ohFAAA,EAAA,MAAA,EAAA,CAAA,88CAAA,CAAA,EAAA;;;AEnIH;AACO,MAAM,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCtB;;MCwFY,+BAA+B,CAAA;AACzB,IAAA,IAAI,GAAG,MAAM,CAAyB,eAAe,CAAC;AACtD,IAAA,SAAS,GAAG,MAAM,EAAC,YAA6C,EAAC;AAElF,IAAA,UAAU,GAA2B;AACnC,QAAA,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;AAC5B,QAAA,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,SAAS;AACjD,QAAA,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK;AACjC,QAAA,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI;AAC9C,QAAA,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI;KACjD;IAED,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;IACxB;IAEA,MAAM,GAAA;QACJ,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;IACvC;uGAlBW,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA/B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,+BAA+B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA9FhC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wbAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAzDC,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpB,cAAc,wlBACd,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,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,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,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;;2FAgGF,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBA3G3C,SAAS;+BACE,+BAA+B,EAAA,UAAA,EAC7B,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,eAAe;wBACf,eAAe;wBACf,kBAAkB;wBAClB,cAAc;wBACd,oBAAoB;wBACpB,cAAc;wBACd,WAAW;qBACZ,EAAA,QAAA,EACS,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,wbAAA,CAAA,EAAA;;;AC5EH;MAuBa,0BAA0B,CAAA;IACrC,OAAO,QAAQ,GAAmB;AAChC,QAAA,YAAY,EAAE,oCAAoC;AAClD,QAAA,IAAI,EAAE,cAAc;AACpB,QAAA,WAAW,EAAE,iCAAiC;QAC9C,OAAO;KACR;AAEQ,IAAA,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;AAC3B,IAAA,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC;IAEjC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,OAAO,CAAC;IAE9D,KAAK,GAAG,MAAM,CAAyB;AAC9C,QAAA,KAAK,EAAE,EAAE;AACT,QAAA,YAAY,EAAE,SAAS;AACvB,QAAA,MAAM,EAAE,KAAK;AACb,QAAA,aAAa,EAAE,IAAI;AACnB,QAAA,cAAc,EAAE,IAAI;AACrB,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAEO,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,YAAY,IAAI,SAAS;AAEtD,QAAA,IAAI,OAAO,KAAK,QAAQ,EAAE;;YAExB,OAAO;AACL,gBAAA,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;AACrC,gBAAA,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;AACtC,gBAAA,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;AACtC,gBAAA,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;aACxC;QACH;aAAO;;YAEL,OAAO;gBACL,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE;gBAClD,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE;gBACvD,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,yBAAyB,EAAE;aACxD;QACH;AACF,IAAA,CAAC,oDAAC;AAEF,IAAA,iBAAiB,CAAC,KAAe,EAAA;QAC/B,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM;AAC9B,gBAAA,GAAG,OAAO;AACV,gBAAA,GAAI,KAAgC;AACrC,aAAA,CAAC,CAAC;QACL;IACF;IAEA,iBAAiB,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE;IACrB;IAEA,kBAAkB,GAAA;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE;AACnE,YAAA,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE;AAClB,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,YAAY,EAAE,KAAK;AACnB,YAAA,SAAS,EAAE,KAAK;AACjB,SAAA,CAAC;QAEF,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;YAC3C,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;YACxB;AACF,QAAA,CAAC,CAAC;IACJ;uGArEW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvBvC,y9BA6BA,EAAA,MAAA,EAAA,CAAA,8pCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDVY,oBAAoB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,KAAA,EAAA,KAAA,EAAA,UAAA,EAAA,OAAA,EAAA,aAAA,EAAA,cAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAInB,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBANtC,SAAS;+BACE,mCAAmC,EAAA,OAAA,EACpC,CAAC,oBAAoB,CAAC,EAAA,QAAA,EAAA,y9BAAA,EAAA,MAAA,EAAA,CAAA,8pCAAA,CAAA,EAAA;;;AEnBjC;;AAEG;;ACFH;;AAEG;;;;"}
1
+ {"version":3,"file":"dragonworks-ngx-dashboard-widgets.mjs","sources":["../../../projects/ngx-dashboard-widgets/src/lib/widgets/arrow-widget/arrow-widget.metadata.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/arrow-widget/arrow-state-dialog.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/arrow-widget/arrow-widget.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/arrow-widget/arrow-widget.component.html","../../../projects/ngx-dashboard-widgets/src/lib/widgets/label-widget/label-widget.metadata.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/label-widget/label-state-dialog.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/directives/responsive-text.directive.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/label-widget/label-widget.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/label-widget/label-widget.component.html","../../../projects/ngx-dashboard-widgets/src/lib/widgets/clock-widget/clock-widget.metadata.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/clock-widget/clock-state-dialog.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/clock-widget/digital-clock/digital-clock.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/clock-widget/digital-clock/digital-clock.component.html","../../../projects/ngx-dashboard-widgets/src/lib/widgets/clock-widget/analog-clock/analog-clock.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/clock-widget/analog-clock/analog-clock.component.html","../../../projects/ngx-dashboard-widgets/src/lib/widgets/clock-widget/clock-widget.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/clock-widget/clock-widget.component.html","../../../projects/ngx-dashboard-widgets/src/lib/components/radial-gauge/radial-gauge.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/components/radial-gauge/radial-gauge.component.html","../../../projects/ngx-dashboard-widgets/src/lib/widgets/radial-gauge-widget/radial-gauge-widget.metadata.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/radial-gauge-widget/radial-gauge-state-dialog.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/radial-gauge-widget/radial-gauge-widget.component.ts","../../../projects/ngx-dashboard-widgets/src/lib/widgets/radial-gauge-widget/radial-gauge-widget.component.html","../../../projects/ngx-dashboard-widgets/src/public-api.ts","../../../projects/ngx-dashboard-widgets/src/dragonworks-ngx-dashboard-widgets.ts"],"sourcesContent":["// arrow-widget.metadata.ts\r\nexport const svgIcon =\r\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path fill=\"currentColor\" d=\"M320-120v-320H120l360-440 360 440H640v320H320Zm80-80h160v-320h111L480-754 289-520h111v320Zm80-320Z\"/></svg>';\r\n","import { Component, inject, signal, computed } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport {\r\n MAT_DIALOG_DATA,\r\n MatDialogRef,\r\n MatDialogModule,\r\n} from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { ArrowWidgetState } from './arrow-widget.component';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSliderModule } from '@angular/material/slider';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\n\r\n@Component({\r\n selector: 'lib-arrow-state-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatSelectModule,\r\n MatSliderModule,\r\n MatSlideToggleModule,\r\n ],\r\n template: `\r\n <h2 mat-dialog-title>Arrow Settings</h2>\r\n <mat-dialog-content>\r\n <!-- Direction Selection -->\r\n <mat-form-field appearance=\"outline\" class=\"direction-field\">\r\n <mat-label>Arrow Direction</mat-label>\r\n <mat-select\r\n [value]=\"direction()\"\r\n (selectionChange)=\"direction.set($any($event.value))\"\r\n >\r\n <mat-option value=\"up\">Up</mat-option>\r\n <mat-option value=\"right\">Right</mat-option>\r\n <mat-option value=\"down\">Down</mat-option>\r\n <mat-option value=\"left\">Left</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- Opacity Slider -->\r\n <div class=\"slider-field\">\r\n <div class=\"field-label\">Opacity: {{ formatOpacity(opacity()) }}%</div>\r\n <mat-slider [min]=\"0.1\" [max]=\"1\" [step]=\"0.1\">\r\n <input matSliderThumb [(ngModel)]=\"opacity\" />\r\n </mat-slider>\r\n </div>\r\n\r\n <!-- Background Toggle -->\r\n <div class=\"toggle-field\">\r\n <mat-slide-toggle \r\n [checked]=\"hasBackground()\"\r\n (change)=\"onBackgroundToggle($event.checked)\">\r\n Background\r\n </mat-slide-toggle>\r\n <span class=\"toggle-hint\">Adds a background behind the arrow</span>\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button (click)=\"onCancel()\">Cancel</button>\r\n <button mat-flat-button (click)=\"save()\" [disabled]=\"!hasChanged()\">\r\n Save\r\n </button>\r\n </mat-dialog-actions>\r\n `,\r\n styles: [\r\n `\r\n mat-dialog-content {\r\n display: block;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n }\r\n\r\n mat-form-field {\r\n width: 100%;\r\n display: block;\r\n margin-bottom: 1rem;\r\n }\r\n\r\n .direction-field {\r\n margin-top: 1rem;\r\n }\r\n\r\n /* Opacity slider section */\r\n .slider-field {\r\n margin-bottom: 1.5rem;\r\n margin-right: 1rem;\r\n }\r\n\r\n .field-label {\r\n display: block;\r\n margin-bottom: 0.5rem;\r\n }\r\n\r\n mat-slider {\r\n width: 100%;\r\n display: block;\r\n }\r\n\r\n /* Toggle section */\r\n .toggle-field {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.75rem;\r\n margin-bottom: 0.5rem;\r\n }\r\n\r\n .toggle-hint {\r\n margin: 0;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class ArrowStateDialogComponent {\r\n private readonly data = inject<ArrowWidgetState>(MAT_DIALOG_DATA);\r\n private readonly dialogRef = inject(MatDialogRef<ArrowStateDialogComponent>);\r\n\r\n // State signals\r\n readonly direction = signal<'left' | 'up' | 'right' | 'down'>(\r\n this.data.direction\r\n );\r\n readonly opacity = signal<number>(this.data.opacity ?? 1);\r\n readonly hasBackground = signal<boolean>(this.data.hasBackground ?? true);\r\n readonly transparentBackground = signal<boolean>(!(this.data.hasBackground ?? true));\r\n\r\n // Store original values for comparison\r\n private readonly originalDirection = this.data.direction;\r\n private readonly originalOpacity = this.data.opacity ?? 1;\r\n private readonly originalHasBackground = this.data.hasBackground ?? true;\r\n\r\n // Computed values\r\n readonly rotation = computed(() => {\r\n const rotationMap = {\r\n up: 0,\r\n right: 90,\r\n down: 180,\r\n left: 270,\r\n };\r\n return rotationMap[this.direction()];\r\n });\r\n\r\n readonly rotationTransform = computed(() => `rotate(${this.rotation()}deg)`);\r\n\r\n readonly directionName = computed(() => {\r\n const nameMap = {\r\n up: 'Up',\r\n right: 'Right',\r\n down: 'Down',\r\n left: 'Left',\r\n };\r\n return nameMap[this.direction()];\r\n });\r\n\r\n readonly hasChanged = computed(\r\n () =>\r\n this.direction() !== this.originalDirection ||\r\n this.opacity() !== this.originalOpacity ||\r\n this.hasBackground() !== this.originalHasBackground\r\n );\r\n\r\n formatOpacity(value: number): number {\r\n return Math.round(value * 100);\r\n }\r\n\r\n onBackgroundToggle(hasBackground: boolean): void {\r\n this.hasBackground.set(hasBackground);\r\n this.transparentBackground.set(!hasBackground);\r\n }\r\n\r\n onCancel(): void {\r\n this.dialogRef.close();\r\n }\r\n\r\n save(): void {\r\n this.dialogRef.close({\r\n direction: this.direction(),\r\n opacity: this.opacity(),\r\n hasBackground: this.hasBackground(),\r\n } as ArrowWidgetState);\r\n }\r\n}\r\n","// arrow-widget.component.ts\r\nimport { Component, inject, signal, computed } from '@angular/core';\r\nimport { Widget, WidgetMetadata } from '@dragonworks/ngx-dashboard';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { svgIcon } from './arrow-widget.metadata';\r\nimport { ArrowStateDialogComponent } from './arrow-state-dialog.component';\r\n\r\nexport interface ArrowWidgetState {\r\n direction: 'left' | 'up' | 'right' | 'down';\r\n opacity?: number;\r\n hasBackground?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-dashboard-arrow-widget',\r\n imports: [],\r\n templateUrl: './arrow-widget.component.html',\r\n styleUrl: './arrow-widget.component.scss',\r\n})\r\nexport class ArrowWidgetComponent implements Widget {\r\n static metadata: WidgetMetadata = {\r\n widgetTypeid: '@ngx-dashboard/arrow-widget',\r\n name: 'Arrow',\r\n description: 'A generic arrow',\r\n svgIcon,\r\n };\r\n\r\n readonly #sanitizer = inject(DomSanitizer);\r\n readonly #dialog = inject(MatDialog);\r\n\r\n readonly safeSvgIcon = this.#sanitizer.bypassSecurityTrustHtml(svgIcon);\r\n\r\n readonly state = signal<ArrowWidgetState>({\r\n direction: 'up',\r\n opacity: 0.3,\r\n hasBackground: true,\r\n });\r\n // Computed rotation\r\n readonly rotationAngle = computed(() => {\r\n const rotationMap = {\r\n up: 0,\r\n right: 90,\r\n down: 180,\r\n left: 270,\r\n };\r\n return rotationMap[this.state().direction];\r\n });\r\n\r\n dashboardSetState(state?: unknown): void {\r\n if (state) {\r\n this.state.update((current) => ({\r\n ...current,\r\n ...(state as ArrowWidgetState),\r\n }));\r\n }\r\n }\r\n\r\n dashboardGetState(): ArrowWidgetState {\r\n return this.state();\r\n }\r\n\r\n dashboardEditState(): void {\r\n const dialogRef = this.#dialog.open(ArrowStateDialogComponent, {\r\n data: this.state(),\r\n width: '400px',\r\n maxWidth: '90vw',\r\n disableClose: false,\r\n autoFocus: false,\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((result) => {\r\n if (result) {\r\n this.state.set(result);\r\n }\r\n });\r\n }\r\n}\r\n","<!-- arrow-widget.component.html -->\r\n<div class=\"svg-wrapper\" [class.has-background]=\"state().hasBackground\">\r\n <div\r\n class=\"svg-placeholder\"\r\n [innerHTML]=\"safeSvgIcon\"\r\n [style.transform]=\"'rotate(' + rotationAngle() + 'deg)'\"\r\n [style.opacity]=\"state().opacity\"\r\n ></div>\r\n</div>\r\n","// label-widget.metadata.ts\r\nexport const svgIcon =\r\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path fill=\"currentColor\" d=\"M280-280h280v-80H280v80Zm0-160h400v-80H280v80Zm0-160h400v-80H280v80Zm-80 480q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0-560v560-560Z\"/></svg>';\r\n","import { Component, inject, signal, computed } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport {\r\n MAT_DIALOG_DATA,\r\n MatDialogRef,\r\n MatDialogModule,\r\n} from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSliderModule } from '@angular/material/slider';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle'; // Add this import\r\nimport { LabelWidgetState } from './label-widget.component';\r\n\r\n@Component({\r\n selector: 'lib-label-state-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatSliderModule,\r\n MatSlideToggleModule, // Add this import\r\n ],\r\n template: `\r\n <h2 mat-dialog-title>Label Settings</h2>\r\n <mat-dialog-content>\r\n <mat-form-field appearance=\"outline\" class=\"label-text-field\">\r\n <mat-label>Label Text</mat-label>\r\n <input\r\n matInput\r\n type=\"text\"\r\n [value]=\"label()\"\r\n (input)=\"label.set($any($event.target).value)\"\r\n placeholder=\"Enter your label text...\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- Responsive Text Toggle -->\r\n <div class=\"toggle-section\">\r\n <mat-slide-toggle \r\n [checked]=\"responsive()\"\r\n (change)=\"responsive.set($event.checked)\">\r\n Responsive Text\r\n </mat-slide-toggle>\r\n <span class=\"toggle-description\"\r\n >Automatically adjust text size to fit the widget</span\r\n >\r\n </div>\r\n\r\n <!-- Responsive Font Size Constraints (only shown when responsive is enabled) -->\r\n @if (responsive()) {\r\n <div class=\"responsive-section\">\r\n <div class=\"section-label\">Font Size Limits</div>\r\n <div class=\"row-layout\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Min Size (px)</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [value]=\"minFontSize()\"\r\n (input)=\"validateAndCorrectMinFontSize(+$any($event.target).value)\"\r\n (blur)=\"validateAndCorrectMinFontSize(minFontSize())\"\r\n min=\"8\"\r\n max=\"24\"\r\n placeholder=\"8\"\r\n />\r\n @if (!isMinFontSizeValid() || !isFontSizeRangeValid()) {\r\n <mat-error>\r\n @if (!isMinFontSizeValid()) {\r\n Must be between 8-24px\r\n } @else {\r\n Must be less than max size\r\n }\r\n </mat-error>\r\n } @else {\r\n <mat-hint>8-24px range</mat-hint>\r\n }\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Max Size (px)</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [value]=\"maxFontSize()\"\r\n (input)=\"validateAndCorrectMaxFontSize(+$any($event.target).value)\"\r\n (blur)=\"validateAndCorrectMaxFontSize(maxFontSize())\"\r\n min=\"16\"\r\n max=\"128\"\r\n placeholder=\"64\"\r\n />\r\n @if (!isMaxFontSizeValid() || !isFontSizeRangeValid()) {\r\n <mat-error>\r\n @if (!isMaxFontSizeValid()) {\r\n Must be between 16-128px\r\n } @else {\r\n Must be greater than min size\r\n }\r\n </mat-error>\r\n } @else {\r\n <mat-hint>16-128px range</mat-hint>\r\n }\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"row-layout\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Font Size (px)</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [value]=\"fontSize()\"\r\n (input)=\"fontSize.set(+$any($event.target).value)\"\r\n [disabled]=\"responsive()\"\r\n min=\"8\"\r\n max=\"48\"\r\n placeholder=\"16\"\r\n />\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Alignment</mat-label>\r\n <mat-select\r\n [value]=\"alignment()\"\r\n (selectionChange)=\"alignment.set($any($event.value))\"\r\n >\r\n <mat-option value=\"left\">Left</mat-option>\r\n <mat-option value=\"center\">Center</mat-option>\r\n <mat-option value=\"right\">Right</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Font Weight</mat-label>\r\n <mat-select\r\n [value]=\"fontWeight()\"\r\n (selectionChange)=\"fontWeight.set($any($event.value))\"\r\n >\r\n <mat-option value=\"normal\">Normal</mat-option>\r\n <mat-option value=\"bold\">Bold</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- Opacity Slider -->\r\n <div class=\"slider-section\">\r\n <div class=\"slider-label\">Opacity: {{ formatOpacity(opacity()) }}%</div>\r\n <mat-slider [min]=\"0.1\" [max]=\"1\" [step]=\"0.1\">\r\n <input matSliderThumb [(ngModel)]=\"opacity\" />\r\n </mat-slider>\r\n </div>\r\n\r\n <!-- Background Toggle -->\r\n <div class=\"toggle-section\">\r\n <mat-slide-toggle \r\n [checked]=\"!transparentBackground()\"\r\n (change)=\"onBackgroundToggle($event.checked)\">\r\n Background\r\n </mat-slide-toggle>\r\n <span class=\"toggle-description\"\r\n >Adds a background behind the text</span\r\n >\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button (click)=\"onCancel()\">Cancel</button>\r\n <button mat-flat-button (click)=\"save()\" [disabled]=\"!hasChanged() || !isFormValid()\">\r\n Save\r\n </button>\r\n </mat-dialog-actions>\r\n `,\r\n styles: [\r\n `\r\n mat-dialog-content {\r\n display: block;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n }\r\n\r\n mat-form-field {\r\n width: 100%;\r\n display: block;\r\n margin-bottom: 1rem;\r\n }\r\n\r\n .label-text-field {\r\n margin-top: 1rem;\r\n }\r\n\r\n /* Side-by-side layout for font size and alignment */\r\n .row-layout {\r\n display: grid;\r\n grid-template-columns: 1fr 1fr;\r\n gap: 1rem;\r\n margin-bottom: 1rem;\r\n }\r\n\r\n .row-layout mat-form-field {\r\n margin-bottom: 0;\r\n }\r\n\r\n /* Opacity slider section */\r\n .slider-section {\r\n margin-bottom: 1.5rem;\r\n margin-right: 1rem;\r\n }\r\n\r\n .slider-label {\r\n display: block;\r\n margin-bottom: 0.5rem;\r\n }\r\n\r\n mat-slider {\r\n width: 100%;\r\n display: block;\r\n }\r\n\r\n /* Toggle section */\r\n .toggle-section {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.75rem;\r\n margin-bottom: 1rem;\r\n }\r\n\r\n .toggle-description {\r\n margin: 0;\r\n }\r\n\r\n /* Responsive font size section */\r\n .responsive-section {\r\n margin-bottom: 1.5rem;\r\n padding: 1rem;\r\n border-radius: 12px;\r\n background-color: var(--mat-app-surface-variant, rgba(var(--mat-app-on-surface-rgb, 0, 0, 0), 0.05));\r\n border: 1px solid var(--mat-app-outline-variant, rgba(var(--mat-app-on-surface-rgb, 0, 0, 0), 0.12));\r\n }\r\n\r\n .section-label {\r\n display: block;\r\n margin-bottom: 0.75rem;\r\n font-weight: 500;\r\n color: var(--mat-app-on-surface-variant, rgba(var(--mat-app-on-surface-rgb, 0, 0, 0), 0.6));\r\n }\r\n\r\n /* Ensure responsive section row layout has no bottom margin */\r\n .responsive-section .row-layout {\r\n margin-bottom: 0;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class LabelStateDialogComponent {\r\n private readonly data = inject<LabelWidgetState>(MAT_DIALOG_DATA);\r\n private readonly dialogRef = inject(MatDialogRef<LabelStateDialogComponent>);\r\n\r\n // State signals\r\n readonly label = signal<string>(this.data.label ?? '');\r\n readonly fontSize = signal<number>(this.data.fontSize ?? 16);\r\n readonly alignment = signal<'left' | 'center' | 'right'>(\r\n this.data.alignment ?? 'center'\r\n );\r\n readonly fontWeight = signal<'normal' | 'bold'>(\r\n this.data.fontWeight ?? 'normal'\r\n );\r\n readonly opacity = signal<number>(this.data.opacity ?? 1);\r\n readonly hasBackground = signal<boolean>(this.data.hasBackground ?? true);\r\n readonly transparentBackground = signal<boolean>(!(this.data.hasBackground ?? true));\r\n readonly responsive = signal<boolean>(this.data.responsive ?? false);\r\n // Responsive font size constraints\r\n readonly minFontSize = signal<number>(this.data.minFontSize ?? 8);\r\n readonly maxFontSize = signal<number>(this.data.maxFontSize ?? 64);\r\n\r\n // Store original values for comparison\r\n private readonly originalLabel = this.data.label ?? '';\r\n private readonly originalFontSize = this.data.fontSize ?? 16;\r\n private readonly originalAlignment = this.data.alignment ?? 'center';\r\n private readonly originalFontWeight = this.data.fontWeight ?? 'normal';\r\n private readonly originalOpacity = this.data.opacity ?? 1;\r\n private readonly originalHasBackground = this.data.hasBackground ?? true;\r\n private readonly originalResponsive = this.data.responsive ?? false;\r\n private readonly originalMinFontSize = this.data.minFontSize ?? 8;\r\n private readonly originalMaxFontSize = this.data.maxFontSize ?? 64;\r\n\r\n // Validation computed properties\r\n readonly isMinFontSizeValid = computed(() => {\r\n const min = this.minFontSize();\r\n return min >= 8 && min <= 24;\r\n });\r\n\r\n readonly isMaxFontSizeValid = computed(() => {\r\n const max = this.maxFontSize();\r\n return max >= 16 && max <= 128;\r\n });\r\n\r\n readonly isFontSizeRangeValid = computed(() =>\r\n this.minFontSize() < this.maxFontSize()\r\n );\r\n\r\n readonly isFormValid = computed(() =>\r\n this.isMinFontSizeValid() &&\r\n this.isMaxFontSizeValid() &&\r\n this.isFontSizeRangeValid()\r\n );\r\n\r\n // Computed values\r\n readonly hasChanged = computed(\r\n () =>\r\n this.label() !== this.originalLabel ||\r\n this.fontSize() !== this.originalFontSize ||\r\n this.alignment() !== this.originalAlignment ||\r\n this.fontWeight() !== this.originalFontWeight ||\r\n this.opacity() !== this.originalOpacity ||\r\n this.hasBackground() !== this.originalHasBackground ||\r\n this.responsive() !== this.originalResponsive ||\r\n this.minFontSize() !== this.originalMinFontSize ||\r\n this.maxFontSize() !== this.originalMaxFontSize\r\n );\r\n\r\n formatOpacity(value: number): number {\r\n return Math.round(value * 100);\r\n }\r\n\r\n formatOpacitySlider = (value: number): string => {\r\n return `${Math.round(value * 100)}%`;\r\n };\r\n\r\n // Validation methods with robust min < max enforcement\r\n validateAndCorrectMinFontSize(value: number): void {\r\n // Clamp to valid range\r\n const corrected = Math.max(8, Math.min(24, value));\r\n this.minFontSize.set(corrected);\r\n \r\n // Ensure min < max with adequate gap\r\n if (corrected >= this.maxFontSize()) {\r\n const newMax = Math.min(128, corrected + 8); // Ensure at least 8px gap\r\n this.maxFontSize.set(newMax);\r\n }\r\n }\r\n\r\n validateAndCorrectMaxFontSize(value: number): void {\r\n // Clamp to valid range\r\n const corrected = Math.max(16, Math.min(128, value));\r\n this.maxFontSize.set(corrected);\r\n \r\n // Ensure min < max with adequate gap\r\n if (corrected <= this.minFontSize()) {\r\n const newMin = Math.max(8, corrected - 8); // Ensure at least 8px gap\r\n this.minFontSize.set(newMin);\r\n }\r\n }\r\n\r\n onBackgroundToggle(hasWhiteBackground: boolean): void {\r\n this.hasBackground.set(hasWhiteBackground);\r\n this.transparentBackground.set(!hasWhiteBackground);\r\n }\r\n\r\n onCancel(): void {\r\n this.dialogRef.close();\r\n }\r\n\r\n save(): void {\r\n this.dialogRef.close({\r\n label: this.label(),\r\n fontSize: this.fontSize(),\r\n alignment: this.alignment(),\r\n fontWeight: this.fontWeight(),\r\n opacity: this.opacity(),\r\n hasBackground: this.hasBackground(),\r\n responsive: this.responsive(),\r\n minFontSize: this.minFontSize(),\r\n maxFontSize: this.maxFontSize(),\r\n } as LabelWidgetState);\r\n }\r\n}\r\n","import {\r\n Directive,\r\n ElementRef,\r\n inject,\r\n DestroyRef,\r\n numberAttribute,\r\n booleanAttribute,\r\n input,\r\n AfterViewInit,\r\n} from '@angular/core';\r\nimport { NgZone, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\n/**\r\n * Directive that automatically adjusts font size to fit text within its parent container.\r\n * Uses canvas-based measurement for performance and DOM verification for accuracy.\r\n *\r\n * @example\r\n * <div class=\"container\">\r\n * <span responsiveText [minFontSize]=\"12\" [maxFontSize]=\"72\">Dynamic text here</span>\r\n * </div>\r\n */\r\n@Directive({\r\n selector: '[libResponsiveText]',\r\n standalone: true,\r\n host: {\r\n '[style.display]': '\"block\"',\r\n '[style.width]': '\"100%\"',\r\n '[style.white-space]': '\"nowrap\"',\r\n '[style.overflow]': '\"visible\"',\r\n },\r\n})\r\nexport class ResponsiveTextDirective implements AfterViewInit {\r\n /* ───────────────────────── Inputs with transforms ─────────────── */\r\n /** Minimum font-size in pixels (accessibility floor) */\r\n minFontSize = input(8, { transform: numberAttribute });\r\n\r\n /** Maximum font-size in pixels (layout ceiling) */\r\n maxFontSize = input(512, { transform: numberAttribute });\r\n\r\n /**\r\n * Line-height: pass a multiplier (e.g. 1.1) or absolute px value.\r\n * For single-line text a multiplier < 10 is treated as unitless.\r\n */\r\n lineHeight = input(1.1, { transform: numberAttribute });\r\n\r\n /** Whether to observe text mutations after first render */\r\n observeMutations = input(true, { transform: booleanAttribute });\r\n\r\n /** Debounce delay in ms for resize/mutation callbacks */\r\n debounceMs = input(16, { transform: numberAttribute });\r\n\r\n /* ───────────────────────── Private state ───────────────────────── */\r\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly zone = inject(NgZone);\r\n private readonly platformId = inject(PLATFORM_ID);\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n // Canvas context - lazy initialization\r\n private _ctx?: CanvasRenderingContext2D;\r\n private get ctx(): CanvasRenderingContext2D {\r\n if (!this._ctx) {\r\n const canvas = document.createElement('canvas');\r\n this._ctx = canvas.getContext('2d', {\r\n willReadFrequently: true,\r\n alpha: false,\r\n })!;\r\n }\r\n return this._ctx;\r\n }\r\n\r\n private ro?: ResizeObserver;\r\n private mo?: MutationObserver;\r\n private fitTimeout?: number;\r\n\r\n // Cache for performance\r\n private lastText = '';\r\n private lastMaxW = 0;\r\n private lastMaxH = 0;\r\n private lastFontSize = 0;\r\n\r\n constructor() {\r\n // Set up cleanup on component destruction using modern DestroyRef\r\n this.destroyRef.onDestroy(() => {\r\n this.cleanup();\r\n });\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n\r\n // Set initial styles\r\n const span = this.el.nativeElement;\r\n span.style.transition = 'font-size 0.1s ease-out';\r\n\r\n // All observer callbacks run outside Angular's zone\r\n this.zone.runOutsideAngular(() => {\r\n this.fit();\r\n this.observeResize();\r\n if (this.observeMutations()) {\r\n this.observeText();\r\n }\r\n });\r\n }\r\n\r\n /* ───────────────────── Core fitting logic ───────────────────── */\r\n /**\r\n * Debounced fit handler to prevent excessive recalculations\r\n */\r\n private requestFit = () => {\r\n if (this.fitTimeout) {\r\n cancelAnimationFrame(this.fitTimeout);\r\n }\r\n\r\n this.fitTimeout = requestAnimationFrame(() => {\r\n this.fit();\r\n });\r\n };\r\n\r\n /**\r\n * Recalculate & apply the ideal font-size\r\n */\r\n private fit = () => {\r\n const span = this.el.nativeElement;\r\n const parent = span.parentElement;\r\n\r\n if (!parent) return;\r\n\r\n const text = span.textContent?.trim() || '';\r\n if (!text) {\r\n span.style.fontSize = `${this.minFontSize()}px`;\r\n return;\r\n }\r\n\r\n const { maxW, maxH } = this.getAvailableSpace(parent);\r\n\r\n // Check cache to avoid redundant calculations\r\n if (\r\n text === this.lastText &&\r\n maxW === this.lastMaxW &&\r\n maxH === this.lastMaxH &&\r\n this.lastFontSize > 0\r\n ) {\r\n return;\r\n }\r\n\r\n // Calculate with conservative buffer for sub-pixel accuracy\r\n const ideal = this.calcFit(text, maxW * 0.98, maxH * 0.98);\r\n\r\n span.style.fontSize = `${ideal}px`;\r\n\r\n // DOM verification pass\r\n this.verifyFit(span, maxW, maxH, ideal);\r\n\r\n // Update cache\r\n this.lastText = text;\r\n this.lastMaxW = maxW;\r\n this.lastMaxH = maxH;\r\n this.lastFontSize = parseFloat(span.style.fontSize);\r\n };\r\n\r\n /**\r\n * Calculate available space accounting for padding and borders\r\n */\r\n private getAvailableSpace(parent: HTMLElement): {\r\n maxW: number;\r\n maxH: number;\r\n } {\r\n const cs = getComputedStyle(parent);\r\n const maxW =\r\n parent.clientWidth -\r\n parseFloat(cs.paddingLeft) -\r\n parseFloat(cs.paddingRight);\r\n const maxH =\r\n parent.clientHeight -\r\n parseFloat(cs.paddingTop) -\r\n parseFloat(cs.paddingBottom);\r\n\r\n return { maxW: Math.max(0, maxW), maxH: Math.max(0, maxH) };\r\n }\r\n\r\n /**\r\n * DOM-based verification to handle sub-pixel discrepancies\r\n */\r\n private verifyFit(\r\n span: HTMLElement,\r\n maxW: number,\r\n maxH: number,\r\n ideal: number\r\n ) {\r\n // Simple synchronous verification\r\n if (span.scrollWidth > maxW || span.scrollHeight > maxH) {\r\n let safe = ideal;\r\n let iterations = 0;\r\n const maxIterations = 10;\r\n\r\n while (\r\n iterations < maxIterations &&\r\n safe > this.minFontSize() &&\r\n (span.scrollWidth > maxW || span.scrollHeight > maxH)\r\n ) {\r\n safe -= 0.25;\r\n span.style.fontSize = `${safe}px`;\r\n iterations++;\r\n }\r\n\r\n // Update cache with verified size\r\n this.lastFontSize = safe;\r\n }\r\n }\r\n\r\n /* ───────────────────── Binary search algorithm ────────────────── */\r\n /**\r\n * Binary search for optimal font size using canvas measurements\r\n */\r\n private calcFit(\r\n text: string,\r\n maxW: number,\r\n maxH: number,\r\n precision = 0.1\r\n ): number {\r\n if (maxW <= 0 || maxH <= 0) return this.minFontSize();\r\n\r\n const computedStyle = getComputedStyle(this.el.nativeElement);\r\n const fontFamily = computedStyle.fontFamily || 'sans-serif';\r\n const fontWeight = computedStyle.fontWeight || '400';\r\n\r\n let lo = this.minFontSize();\r\n let hi = this.maxFontSize();\r\n let bestFit = this.minFontSize();\r\n\r\n while (hi - lo > precision) {\r\n const mid = (hi + lo) / 2;\r\n this.ctx.font = `${fontWeight} ${mid}px ${fontFamily}`;\r\n\r\n const metrics = this.ctx.measureText(text);\r\n const width = metrics.width;\r\n\r\n // Calculate height based on available metrics\r\n const height = this.calculateTextHeight(metrics, mid);\r\n\r\n if (width <= maxW && height <= maxH) {\r\n bestFit = mid;\r\n lo = mid;\r\n } else {\r\n hi = mid;\r\n }\r\n }\r\n\r\n return Math.floor(bestFit * 100) / 100;\r\n }\r\n\r\n /**\r\n * Calculate text height from metrics\r\n */\r\n private calculateTextHeight(metrics: TextMetrics, fontSize: number): number {\r\n // Use font bounding box metrics if available\r\n if (metrics.fontBoundingBoxAscent && metrics.fontBoundingBoxDescent) {\r\n return metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent;\r\n }\r\n\r\n // Fallback to actual bounding box\r\n if (metrics.actualBoundingBoxAscent && metrics.actualBoundingBoxDescent) {\r\n return metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent;\r\n }\r\n\r\n // Final fallback using line height\r\n return this.lineHeight() < 10\r\n ? fontSize * this.lineHeight()\r\n : this.lineHeight();\r\n }\r\n\r\n /* ───────────────────────── Observers ─────────────────────────── */\r\n /**\r\n * Observe parent container resizes\r\n */\r\n private observeResize() {\r\n if (!('ResizeObserver' in window)) return;\r\n\r\n this.ro = new ResizeObserver((entries) => {\r\n // Only trigger if size actually changed\r\n const entry = entries[0];\r\n if (entry?.contentRect) {\r\n this.requestFit();\r\n }\r\n });\r\n\r\n const parent = this.el.nativeElement.parentElement;\r\n if (parent) {\r\n this.ro.observe(parent);\r\n }\r\n }\r\n\r\n /**\r\n * Observe text content changes\r\n */\r\n private observeText() {\r\n if (!('MutationObserver' in window)) return;\r\n\r\n this.mo = new MutationObserver((mutations) => {\r\n // Check if text actually changed\r\n const hasTextChange = mutations.some(\r\n (m) =>\r\n m.type === 'characterData' ||\r\n (m.type === 'childList' &&\r\n (m.addedNodes.length > 0 || m.removedNodes.length > 0))\r\n );\r\n\r\n if (hasTextChange) {\r\n this.requestFit();\r\n }\r\n });\r\n\r\n this.mo.observe(this.el.nativeElement, {\r\n characterData: true,\r\n childList: true,\r\n subtree: true,\r\n });\r\n }\r\n\r\n /**\r\n * Cleanup resources\r\n */\r\n private cleanup() {\r\n this.ro?.disconnect();\r\n this.mo?.disconnect();\r\n\r\n if (this.fitTimeout) {\r\n cancelAnimationFrame(this.fitTimeout);\r\n }\r\n\r\n // Clear canvas context\r\n this._ctx = undefined;\r\n }\r\n}\r\n","// label-widget.component.ts\r\nimport { Component, inject, signal, computed } from '@angular/core';\r\nimport { Widget, WidgetMetadata } from '@dragonworks/ngx-dashboard';\r\nimport { svgIcon } from './label-widget.metadata';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { LabelStateDialogComponent } from './label-state-dialog.component';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ResponsiveTextDirective } from '../../directives/responsive-text.directive';\r\n\r\nexport interface LabelWidgetState {\r\n label: string;\r\n fontSize?: number;\r\n alignment?: 'left' | 'center' | 'right';\r\n fontWeight?: 'normal' | 'bold';\r\n opacity?: number;\r\n hasBackground?: boolean;\r\n responsive?: boolean;\r\n // Font size constraints for responsive text (px values)\r\n minFontSize?: number; // Default: 8px (accessible minimum)\r\n maxFontSize?: number; // Default: 64px (practical widget maximum)\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-dashboard-label-widget',\r\n imports: [ResponsiveTextDirective],\r\n templateUrl: './label-widget.component.html',\r\n styleUrl: './label-widget.component.scss',\r\n})\r\nexport class LabelWidgetComponent implements Widget {\r\n static metadata: WidgetMetadata = {\r\n widgetTypeid: '@ngx-dashboard/label-widget',\r\n name: 'Label',\r\n description: 'A generic text label',\r\n svgIcon,\r\n };\r\n\r\n readonly #sanitizer = inject(DomSanitizer);\r\n readonly #dialog = inject(MatDialog);\r\n\r\n safeSvgIcon = this.#sanitizer.bypassSecurityTrustHtml(svgIcon);\r\n\r\n state = signal<LabelWidgetState>({\r\n label: '',\r\n fontSize: 16,\r\n alignment: 'center',\r\n fontWeight: 'normal',\r\n opacity: 1,\r\n hasBackground: true,\r\n responsive: false,\r\n minFontSize: 8, // Accessible minimum for responsive text\r\n maxFontSize: 64, // Practical maximum for widget display\r\n });\r\n\r\n dashboardSetState(state?: unknown) {\r\n if (state) {\r\n this.state.update((current) => ({\r\n ...current,\r\n ...(state as LabelWidgetState),\r\n }));\r\n }\r\n }\r\n\r\n dashboardGetState(): LabelWidgetState {\r\n return { ...this.state() };\r\n }\r\n\r\n dashboardEditState(): void {\r\n const dialogRef = this.#dialog.open(LabelStateDialogComponent, {\r\n data: this.dashboardGetState(),\r\n width: '400px',\r\n maxWidth: '90vw',\r\n disableClose: false,\r\n autoFocus: false,\r\n });\r\n\r\n dialogRef\r\n .afterClosed()\r\n .subscribe((result: LabelWidgetState | undefined) => {\r\n if (result) {\r\n this.state.set(result);\r\n }\r\n });\r\n }\r\n\r\n get hasContent(): boolean {\r\n return !!this.state().label?.trim();\r\n }\r\n\r\n get label(): string {\r\n return this.state().label?.trim();\r\n }\r\n\r\n // Computed properties for responsive font size limits with fallbacks\r\n readonly minFontSize = computed(() => this.state().minFontSize ?? 8);\r\n readonly maxFontSize = computed(() => this.state().maxFontSize ?? 64);\r\n}\r\n","@if (hasContent) {\r\n<div\r\n class=\"label-widget\"\r\n [style.fontSize.rem]=\"state().responsive ? null : state().fontSize! / 16\"\r\n [style.--widget-opacity]=\"state().opacity\"\r\n [class.text-left]=\"state().alignment === 'left'\"\r\n [class.text-right]=\"state().alignment === 'right'\"\r\n [class.font-bold]=\"state().fontWeight === 'bold'\"\r\n [class.has-background]=\"state().hasBackground\"\r\n>\r\n @if (state().responsive) {\r\n <div class=\"label-text\" libResponsiveText [minFontSize]=\"minFontSize()\" [maxFontSize]=\"maxFontSize()\">{{ label }}</div>\r\n } @else {\r\n <div class=\"label-text\">{{ label }}</div>\r\n }\r\n</div>\r\n} @else {\r\n<div class=\"svg-wrapper\" [class.has-background]=\"state().hasBackground\">\r\n <div class=\"svg-placeholder\" [innerHTML]=\"safeSvgIcon\"></div>\r\n</div>\r\n}\r\n","export const svgIcon = `\r\n<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 800 800\" preserveAspectRatio=\"xMidYMid meet\">\r\n <use transform=\"matrix(-1,0,0,1,800,0)\" href=\"#one-half\" />\r\n <g id=\"one-half\">\r\n <g id=\"one-fourth\">\r\n <path d=\"m400 40v107\" stroke-width=\"26.7\" stroke=\"currentColor\" />\r\n <g id=\"one-twelfth\">\r\n <path\r\n d=\"m580 88.233-42.5 73.612\"\r\n stroke-width=\"26.7\"\r\n stroke=\"currentColor\"\r\n />\r\n <g id=\"one-thirtieth\">\r\n <path\r\n id=\"one-sixtieth\"\r\n d=\"m437.63 41.974-3.6585 34.808\"\r\n stroke-width=\"13.6\"\r\n stroke=\"currentColor\"\r\n />\r\n <use transform=\"rotate(6 400 400)\" href=\"#one-sixtieth\" />\r\n </g>\r\n <use transform=\"rotate(12 400 400)\" href=\"#one-thirtieth\" />\r\n </g>\r\n <use transform=\"rotate(30 400 400)\" href=\"#one-twelfth\" />\r\n <use transform=\"rotate(60 400 400)\" href=\"#one-twelfth\" />\r\n </g>\r\n <use transform=\"rotate(90 400 400)\" href=\"#one-fourth\" />\r\n </g>\r\n <path\r\n class=\"clock-hour-hand\"\r\n id=\"anim-clock-hour-hand\"\r\n fill=\"currentColor\"\r\n d=\"m 381.925,476 h 36.15 l 5e-4,-300.03008 L 400,156.25 381.9245,175.96992 Z\"\r\n transform=\"rotate(110.2650694444, 400, 400)\"\r\n />\r\n <path\r\n class=\"clock-minute-hand\"\r\n id=\"anim-clock-minute-hand\"\r\n fill=\"currentColor\"\r\n d=\"M 412.063,496.87456 H 387.937 L 385.249,65.68306 400,52.75 414.751,65.68306 Z\"\r\n transform=\"rotate(243.1808333333, 400, 400)\"\r\n />\r\n</svg>\r\n`;\r\n","import { Component, inject, signal, computed } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport {\r\n MAT_DIALOG_DATA,\r\n MatDialogRef,\r\n MatDialogModule,\r\n} from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { ClockWidgetState } from './clock-widget.component';\r\n\r\n@Component({\r\n selector: 'lib-clock-state-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatRadioModule,\r\n MatSlideToggleModule,\r\n ],\r\n template: `\r\n <h2 mat-dialog-title>Clock Settings</h2>\r\n <mat-dialog-content>\r\n <div class=\"mode-selection\">\r\n <label class=\"section-label\" for=\"mode-selection-group\">Display Mode</label>\r\n <mat-radio-group\r\n id=\"mode-selection-group\"\r\n [value]=\"mode()\"\r\n (change)=\"mode.set($any($event.value))\"\r\n >\r\n <mat-radio-button value=\"digital\">Digital</mat-radio-button>\r\n <mat-radio-button value=\"analog\">Analog</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <!-- Time Format (only for digital mode) -->\r\n @if (mode() === 'digital') {\r\n <div class=\"format-selection\">\r\n <label class=\"section-label\" for=\"time-format-group\">Time Format</label>\r\n <mat-radio-group\r\n id=\"time-format-group\"\r\n [value]=\"timeFormat()\"\r\n (change)=\"timeFormat.set($any($event.value))\"\r\n >\r\n <mat-radio-button value=\"24h\">24 Hour (14:30:45)</mat-radio-button>\r\n <mat-radio-button value=\"12h\">12 Hour (2:30:45 PM)</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n }\r\n\r\n <!-- Show Seconds Toggle (for both digital and analog modes) -->\r\n <div class=\"toggle-section\">\r\n <mat-slide-toggle \r\n [checked]=\"showSeconds()\"\r\n (change)=\"showSeconds.set($event.checked)\">\r\n Show Seconds\r\n </mat-slide-toggle>\r\n <span class=\"toggle-description\">\r\n @if (mode() === 'digital') {\r\n Display seconds in the time\r\n } @else {\r\n Show the second hand on the clock\r\n }\r\n </span>\r\n </div>\r\n\r\n <!-- Background Toggle -->\r\n <div class=\"toggle-section\">\r\n <mat-slide-toggle \r\n [checked]=\"hasBackground()\"\r\n (change)=\"hasBackground.set($event.checked)\">\r\n Background\r\n </mat-slide-toggle>\r\n <span class=\"toggle-description\"\r\n >Adds a background behind the clock</span\r\n >\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button (click)=\"onCancel()\">Cancel</button>\r\n <button mat-flat-button (click)=\"save()\" [disabled]=\"!hasChanged()\">\r\n Save\r\n </button>\r\n </mat-dialog-actions>\r\n `,\r\n styles: [\r\n `\r\n mat-dialog-content {\r\n display: block;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n }\r\n\r\n .mode-selection,\r\n .format-selection {\r\n margin-top: 1rem;\r\n margin-bottom: 2rem;\r\n }\r\n\r\n .section-label {\r\n display: block;\r\n margin-bottom: 0.75rem;\r\n font-weight: 500;\r\n }\r\n\r\n mat-radio-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0.75rem;\r\n }\r\n\r\n mat-radio-button {\r\n margin: 0;\r\n }\r\n\r\n /* Toggle section */\r\n .toggle-section {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.75rem;\r\n margin-bottom: 0.5rem;\r\n }\r\n\r\n .toggle-description {\r\n margin: 0;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class ClockStateDialogComponent {\r\n private readonly data = inject<ClockWidgetState>(MAT_DIALOG_DATA);\r\n private readonly dialogRef = inject(MatDialogRef<ClockStateDialogComponent>);\r\n\r\n // State signals\r\n readonly mode = signal<'analog' | 'digital'>(this.data.mode ?? 'digital');\r\n readonly hasBackground = signal<boolean>(this.data.hasBackground ?? true);\r\n readonly timeFormat = signal<'12h' | '24h'>(this.data.timeFormat ?? '24h');\r\n readonly showSeconds = signal<boolean>(this.data.showSeconds ?? true);\r\n\r\n // Store original values for comparison\r\n private readonly originalMode = this.data.mode ?? 'digital';\r\n private readonly originalHasBackground = this.data.hasBackground ?? true;\r\n private readonly originalTimeFormat = this.data.timeFormat ?? '24h';\r\n private readonly originalShowSeconds = this.data.showSeconds ?? true;\r\n\r\n // Computed values\r\n readonly hasChanged = computed(\r\n () =>\r\n this.mode() !== this.originalMode ||\r\n this.hasBackground() !== this.originalHasBackground ||\r\n this.timeFormat() !== this.originalTimeFormat ||\r\n this.showSeconds() !== this.originalShowSeconds\r\n );\r\n\r\n onCancel(): void {\r\n this.dialogRef.close();\r\n }\r\n\r\n save(): void {\r\n this.dialogRef.close({\r\n mode: this.mode(),\r\n hasBackground: this.hasBackground(),\r\n timeFormat: this.timeFormat(),\r\n showSeconds: this.showSeconds(),\r\n } as ClockWidgetState);\r\n }\r\n}","import {\r\n Component,\r\n inject,\r\n signal,\r\n computed,\r\n DestroyRef,\r\n input,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\n\r\nexport interface DigitalClockConfig {\r\n timeFormat: '12h' | '24h';\r\n showSeconds: boolean;\r\n hasBackground: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-digital-clock',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './digital-clock.component.html',\r\n styleUrl: './digital-clock.component.scss',\r\n host: {\r\n '[class.has-background]': 'hasBackground()',\r\n '[class.show-pm]': 'timeFormat() === \"12h\"',\r\n '[class.show-seconds]': 'showSeconds()',\r\n class: 'clock-widget digital',\r\n },\r\n})\r\nexport class DigitalClockComponent {\r\n readonly #destroyRef = inject(DestroyRef);\r\n\r\n // Inputs\r\n timeFormat = input<'12h' | '24h'>('24h');\r\n showSeconds = input<boolean>(true);\r\n hasBackground = input<boolean>(false);\r\n\r\n // Time tracking\r\n currentTime = signal(new Date());\r\n\r\n formattedTime = computed(() => {\r\n const time = this.currentTime();\r\n const format = this.timeFormat();\r\n const showSecs = this.showSeconds();\r\n return this.#formatTime(time, format, showSecs);\r\n });\r\n\r\n #intervalId: number | null = null;\r\n\r\n #formatTime(time: Date, format: '12h' | '24h', showSecs: boolean): string {\r\n let hours = time.getHours();\r\n const minutes = time.getMinutes();\r\n const seconds = time.getSeconds();\r\n\r\n // Pad with leading zeros\r\n const mm = minutes.toString().padStart(2, '0');\r\n const ss = seconds.toString().padStart(2, '0');\r\n\r\n if (format === '12h') {\r\n // 12-hour format with AM/PM\r\n const ampm = hours >= 12 ? 'PM' : 'AM';\r\n hours = hours % 12;\r\n if (hours === 0) hours = 12; // Convert 0 to 12 for 12 AM/PM\r\n\r\n const hh = hours.toString().padStart(2, '0');\r\n return showSecs ? `${hh}:${mm}:${ss} ${ampm}` : `${hh}:${mm} ${ampm}`;\r\n } else {\r\n // 24-hour format\r\n const hh = hours.toString().padStart(2, '0');\r\n return showSecs ? `${hh}:${mm}:${ss}` : `${hh}:${mm}`;\r\n }\r\n }\r\n\r\n constructor() {\r\n // Set up time update timer\r\n this.#startTimer();\r\n\r\n // Clean up timer on component destruction\r\n this.#destroyRef.onDestroy(() => {\r\n this.#stopTimer();\r\n });\r\n }\r\n\r\n #startTimer(): void {\r\n // Sync to the next second boundary for smooth start\r\n const now = new Date();\r\n const msUntilNextSecond = 1000 - now.getMilliseconds();\r\n\r\n setTimeout(() => {\r\n this.currentTime.set(new Date());\r\n\r\n // Start the regular 1-second interval\r\n this.#intervalId = window.setInterval(() => {\r\n this.currentTime.set(new Date());\r\n }, 1000);\r\n }, msUntilNextSecond);\r\n }\r\n\r\n #stopTimer(): void {\r\n if (this.#intervalId !== null) {\r\n clearInterval(this.#intervalId);\r\n this.#intervalId = null;\r\n }\r\n }\r\n}\r\n","<div responsiveText class=\"digital-time\">{{ formattedTime() }}</div>\r\n","import { Component, ChangeDetectionStrategy, input, inject, signal, computed, DestroyRef, viewChild, ElementRef, Renderer2, effect } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-analog-clock',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './analog-clock.component.html',\r\n styleUrl: './analog-clock.component.scss',\r\n host: {\r\n '[class.has-background]': 'hasBackground()',\r\n '[class.show-seconds]': 'showSeconds()',\r\n 'class': 'clock-widget analog'\r\n }\r\n})\r\nexport class AnalogClockComponent {\r\n readonly #destroyRef = inject(DestroyRef);\r\n readonly #renderer = inject(Renderer2);\r\n\r\n // Inputs\r\n hasBackground = input<boolean>(false);\r\n showSeconds = input<boolean>(true);\r\n\r\n // ViewChild references for clock hands\r\n hourHand = viewChild<ElementRef<SVGPathElement>>('hourHand');\r\n minuteHand = viewChild<ElementRef<SVGPathElement>>('minuteHand');\r\n secondHand = viewChild<ElementRef<SVGPathElement>>('secondHand');\r\n\r\n // Time tracking\r\n currentTime = signal(new Date());\r\n\r\n // Computed rotation signals\r\n secondHandRotation = computed(() => {\r\n const seconds = this.currentTime().getSeconds();\r\n return seconds * 6; // 360° / 60s = 6° per second\r\n });\r\n\r\n minuteHandRotation = computed(() => {\r\n const time = this.currentTime();\r\n const minutes = time.getMinutes();\r\n const seconds = time.getSeconds();\r\n return minutes * 6 + seconds / 10; // Smooth minute hand movement\r\n });\r\n\r\n hourHandRotation = computed(() => {\r\n const time = this.currentTime();\r\n const hours = time.getHours() % 12;\r\n const minutes = time.getMinutes();\r\n const seconds = time.getSeconds();\r\n return hours * 30 + minutes / 2 + seconds / 120; // Smooth hour hand movement\r\n });\r\n\r\n #intervalId: number | null = null;\r\n\r\n constructor() {\r\n // Set up time update timer\r\n this.#startTimer();\r\n \r\n // Clean up timer on component destruction\r\n this.#destroyRef.onDestroy(() => {\r\n this.#stopTimer();\r\n });\r\n\r\n // Update DOM when rotations change\r\n effect(() => {\r\n this.#updateClockHands();\r\n });\r\n }\r\n\r\n #startTimer(): void {\r\n // Sync to the next second boundary for smooth start\r\n const now = new Date();\r\n const msUntilNextSecond = 1000 - now.getMilliseconds();\r\n \r\n setTimeout(() => {\r\n this.currentTime.set(new Date());\r\n \r\n // Start the regular 1-second interval\r\n this.#intervalId = window.setInterval(() => {\r\n this.currentTime.set(new Date());\r\n }, 1000);\r\n }, msUntilNextSecond);\r\n }\r\n\r\n #stopTimer(): void {\r\n if (this.#intervalId !== null) {\r\n clearInterval(this.#intervalId);\r\n this.#intervalId = null;\r\n }\r\n }\r\n\r\n #updateClockHands(): void {\r\n const hourElement = this.hourHand()?.nativeElement;\r\n const minuteElement = this.minuteHand()?.nativeElement;\r\n const secondElement = this.secondHand()?.nativeElement;\r\n\r\n if (hourElement) {\r\n this.#renderer.setAttribute(\r\n hourElement,\r\n 'transform',\r\n `rotate(${this.hourHandRotation()}, 400, 400)`\r\n );\r\n }\r\n\r\n if (minuteElement) {\r\n this.#renderer.setAttribute(\r\n minuteElement,\r\n 'transform',\r\n `rotate(${this.minuteHandRotation()}, 400, 400)`\r\n );\r\n }\r\n\r\n if (secondElement && this.showSeconds()) {\r\n this.#renderer.setAttribute(\r\n secondElement,\r\n 'transform',\r\n `rotate(${this.secondHandRotation()}, 400, 400)`\r\n );\r\n }\r\n }\r\n}","<div class=\"analog-clock-container\">\r\n <div class=\"aspect-ratio-box\">\r\n <svg\r\n version=\"1.1\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 800 800\"\r\n preserveAspectRatio=\"xMidYMid meet\"\r\n >\r\n <!-- Optional face circle; uncomment if you want a visible outline by default -->\r\n <!-- <circle cx=\"400\" cy=\"400\" r=\"400\" fill=\"transparent\" stroke=\"currentColor\" stroke-width=\"2\" /> -->\r\n\r\n <use transform=\"matrix(-1,0,0,1,800,0)\" href=\"#one-half\" />\r\n <g id=\"one-half\">\r\n <g id=\"one-fourth\">\r\n <!-- 12 / 3 / 6 / 9 heavy marks -->\r\n <path d=\"m400 40v107\" stroke-width=\"26.7\" stroke=\"currentColor\" />\r\n <g id=\"one-twelfth\">\r\n <!-- 30° heavy marks -->\r\n <path\r\n d=\"m580 88.233-42.5 73.612\"\r\n stroke-width=\"26.7\"\r\n stroke=\"currentColor\"\r\n />\r\n <g id=\"one-thirtieth\">\r\n <!-- minute/second ticks -->\r\n <path\r\n id=\"one-sixtieth\"\r\n d=\"m437.63 41.974-3.6585 34.808\"\r\n stroke-width=\"13.6\"\r\n stroke=\"currentColor\"\r\n />\r\n <use transform=\"rotate(6 400 400)\" href=\"#one-sixtieth\" />\r\n </g>\r\n <use transform=\"rotate(12 400 400)\" href=\"#one-thirtieth\" />\r\n </g>\r\n <use transform=\"rotate(30 400 400)\" href=\"#one-twelfth\" />\r\n <use transform=\"rotate(60 400 400)\" href=\"#one-twelfth\" />\r\n </g>\r\n <use transform=\"rotate(90 400 400)\" href=\"#one-fourth\" />\r\n </g>\r\n\r\n <!-- Hands -->\r\n <path\r\n class=\"clock-hour-hand\"\r\n id=\"anim-clock-hour-hand\"\r\n #hourHand\r\n d=\"m 381.925,476 h 36.15 l 5e-4,-300.03008 L 400,156.25 381.9245,175.96992 Z\"\r\n transform=\"rotate(110.2650694444, 400, 400)\"\r\n />\r\n <path\r\n class=\"clock-minute-hand\"\r\n id=\"anim-clock-minute-hand\"\r\n #minuteHand\r\n d=\"M 412.063,496.87456 H 387.937 L 385.249,65.68306 400,52.75 414.751,65.68306 Z\"\r\n transform=\"rotate(243.1808333333, 400, 400)\"\r\n />\r\n <path\r\n class=\"clock-second-hand\"\r\n id=\"anim-clock-second-hand\"\r\n #secondHand\r\n d=\"M 397.317,63.51744 395.91962,168.4 C 374.575,170.5125 358.2,188.365 358.2,210 c 0,21.635 16.3,39 36.61214,41.47594 L 391.52847,498 h 16.94306 L 405.1868,251.47593 C 425.5,249 441.8,231.635 441.8,210 c 2e-5,-21.635 -16.375,-39.4875 -37.71971,-41.6 L 402.683,63.51744 400,60 Z M 400,190.534 c 10.888,0 19.466,8.866 19.466,19.466 0,10.6 -8.578,19.466 -19.466,19.466 -10.888,0 -19.466,-8.866 -19.466,-19.466 0,-10.6 8.578,-19.466 19.466,-19.466 z\"\r\n transform=\"rotate(190.85, 400, 400)\"\r\n />\r\n </svg>\r\n </div>\r\n</div>\r\n","// clock-widget.component.ts\r\nimport { Component, inject, signal } from '@angular/core';\r\nimport { Widget, WidgetMetadata } from '@dragonworks/ngx-dashboard';\r\nimport { svgIcon } from './clock-widget.metadata';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { ClockStateDialogComponent } from './clock-state-dialog.component';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { DigitalClockComponent } from './digital-clock/digital-clock.component';\r\nimport { AnalogClockComponent } from './analog-clock/analog-clock.component';\r\n\r\nexport interface ClockWidgetState {\r\n mode: 'analog' | 'digital';\r\n hasBackground?: boolean;\r\n timeFormat?: '12h' | '24h';\r\n showSeconds?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-dashboard-clock-widget',\r\n standalone: true,\r\n imports: [DigitalClockComponent, AnalogClockComponent],\r\n templateUrl: './clock-widget.component.html',\r\n styleUrl: './clock-widget.component.scss',\r\n})\r\nexport class ClockWidgetComponent implements Widget {\r\n static metadata: WidgetMetadata = {\r\n widgetTypeid: '@ngx-dashboard/clock-widget',\r\n name: 'Clock',\r\n description: 'Display time in analog or digital format',\r\n svgIcon,\r\n };\r\n\r\n readonly #sanitizer = inject(DomSanitizer);\r\n readonly #dialog = inject(MatDialog);\r\n\r\n safeSvgIcon = this.#sanitizer.bypassSecurityTrustHtml(svgIcon);\r\n\r\n state = signal<ClockWidgetState>({\r\n mode: 'analog',\r\n hasBackground: true,\r\n timeFormat: '24h',\r\n showSeconds: true,\r\n });\r\n\r\n constructor() {\r\n // No timer logic needed - DigitalClock manages its own time\r\n }\r\n\r\n dashboardSetState(state?: unknown) {\r\n if (state) {\r\n this.state.update((current) => ({\r\n ...current,\r\n ...(state as ClockWidgetState),\r\n }));\r\n }\r\n }\r\n\r\n dashboardGetState(): ClockWidgetState {\r\n return { ...this.state() };\r\n }\r\n\r\n dashboardEditState(): void {\r\n const dialogRef = this.#dialog.open(ClockStateDialogComponent, {\r\n data: this.dashboardGetState(),\r\n width: '400px',\r\n maxWidth: '90vw',\r\n disableClose: false,\r\n autoFocus: false,\r\n });\r\n\r\n dialogRef\r\n .afterClosed()\r\n .subscribe((result: ClockWidgetState | undefined) => {\r\n if (result) {\r\n this.state.set(result);\r\n }\r\n });\r\n }\r\n\r\n get isAnalog(): boolean {\r\n return this.state().mode === 'analog';\r\n }\r\n\r\n get isDigital(): boolean {\r\n return this.state().mode === 'digital';\r\n }\r\n}\r\n","@if (isDigital) {\r\n <lib-digital-clock\r\n [timeFormat]=\"state().timeFormat || '24h'\"\r\n [showSeconds]=\"state().showSeconds ?? true\"\r\n [hasBackground]=\"state().hasBackground ?? false\"\r\n />\r\n} @else if (isAnalog) {\r\n <lib-analog-clock\r\n [hasBackground]=\"state().hasBackground ?? false\"\r\n [showSeconds]=\"state().showSeconds ?? true\"\r\n />\r\n} @else {\r\n<div class=\"svg-wrapper\" [class.has-background]=\"state().hasBackground\">\r\n <div class=\"svg-placeholder\" [innerHTML]=\"safeSvgIcon\"></div>\r\n</div>\r\n}","import {\r\n afterNextRender,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n LOCALE_ID,\r\n DestroyRef,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { from, map, of } from 'rxjs';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\n\r\nexport interface RadialGaugeSegment {\r\n from: number;\r\n to: number;\r\n color: string;\r\n}\r\n\r\n/**\r\n * Responsive radial gauge component with hybrid sizing and thickness control.\r\n *\r\n * This component provides a highly flexible gauge system with three independent\r\n * control dimensions that can be mixed and matched for different use cases:\r\n *\r\n * ## Size Control:\r\n * - **Fixed Size**: Use manual `size` input (traditional behavior)\r\n * - **Container Responsive**: Enable `fitToContainer` for automatic sizing\r\n *\r\n * ## Thickness Control:\r\n * - **Manual Thickness**: Use individual thickness inputs (traditional behavior)\r\n * - **Proportional Thickness**: Enable `responsiveMode` for size-based scaling\r\n *\r\n * ## Usage Scenarios:\r\n *\r\n * ### 1. Dashboard Widgets (Recommended)\r\n * ```html\r\n * <ngx-radial-gauge\r\n * [value]=\"cpuUsage\"\r\n * [fitToContainer]=\"true\"\r\n * [responsiveMode]=\"true\"\r\n * [sizeToThicknessRatio]=\"12\" />\r\n * ```\r\n * **Best for**: Grid layouts, dashboard panels, adaptive containers\r\n * **Behavior**: Automatically resizes to fit available space while maintaining\r\n * consistent proportional appearance across all sizes.\r\n *\r\n * ### 2. Fixed Layouts (Traditional)\r\n * ```html\r\n * <ngx-radial-gauge\r\n * [value]=\"temperature\"\r\n * [size]=\"300\"\r\n * [outerThickness]=\"36\"\r\n * [innerThickness]=\"12\" />\r\n * ```\r\n * **Best for**: Static designs, precise sizing requirements, print layouts\r\n * **Behavior**: Exact pixel control over all dimensions, predictable appearance.\r\n *\r\n * ### 3. Scalable Designs\r\n * ```html\r\n * <ngx-radial-gauge\r\n * [value]=\"batteryLevel\"\r\n * [size]=\"gaugeSize\"\r\n * [responsiveMode]=\"true\"\r\n * [sizeToThicknessRatio]=\"20\" />\r\n * ```\r\n * **Best for**: User-configurable sizing, responsive breakpoints, zoom interfaces\r\n * **Behavior**: Manual size control with automatic thickness scaling. As size\r\n * increases/decreases, ring thickness scales proportionally to maintain visual balance.\r\n *\r\n * ## Mathematical Relationships:\r\n *\r\n * When `responsiveMode=true`, thickness follows this formula:\r\n * ```\r\n * baseThickness = effectiveSize / sizeToThicknessRatio\r\n * outerThickness = baseThickness × responsiveProportions.outer (default: 3)\r\n * innerThickness = baseThickness × responsiveProportions.inner (default: 1)\r\n * gap = baseThickness × responsiveProportions.gap (default: 0.5)\r\n * totalThickness = baseThickness × 4.5 (outer + inner + gap)\r\n * ```\r\n *\r\n * Example with 300px gauge and ratio=20 (ultra-thin):\r\n * - baseThickness = 15px\r\n * - outerThickness = 45px (15×3)\r\n * - innerThickness = 15px (15×1)\r\n * - gap = 7.5px (15×0.5)\r\n * - totalThickness = 67.5px (22.5% of diameter)\r\n *\r\n * ## Container Responsiveness:\r\n *\r\n * When `fitToContainer=true`, the component uses ResizeObserver to:\r\n * 1. Monitor parent container dimension changes\r\n * 2. Calculate maximum diameter maintaining 2:1 aspect ratio (width:height)\r\n * 3. Apply containerPadding for safe margins\r\n * 4. Update gauge size in real-time\r\n *\r\n * This provides true responsive behavior for dashboard widgets, grid layouts,\r\n * and adaptive interfaces.\r\n *\r\n * ## Accessibility:\r\n *\r\n * The component implements ARIA meter role with proper labeling:\r\n * - `role=\"meter\"` for semantic meaning\r\n * - `aria-valuemin/max/now` for screen readers\r\n * - `aria-label` with contextual information\r\n * - Internationalized number formatting\r\n *\r\n */\r\n@Component({\r\n selector: 'ngx-radial-gauge',\r\n standalone: true,\r\n imports: [CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './radial-gauge.component.html',\r\n styleUrl: './radial-gauge.component.scss',\r\n host: {\r\n role: 'meter',\r\n '[attr.aria-label]': 'ariaLabel()',\r\n '[attr.aria-valuemin]': 'min()',\r\n '[attr.aria-valuemax]': 'max()',\r\n '[attr.aria-valuenow]': 'clampedValue()',\r\n '[attr.aria-valuetext]': 'formattedLabel()',\r\n '[attr.aria-labelledby]': 'titleId',\r\n '[attr.aria-describedby]': 'descId',\r\n '[class.fit-container]': 'fitToContainer()',\r\n '[class.has-background]': 'hasBackground()',\r\n },\r\n})\r\nexport class RadialGaugeComponent {\r\n private readonly valueTextEl = viewChild<ElementRef<SVGTextElement>>('valueText');\r\n private readonly valueGroupEl = viewChild<ElementRef<SVGGElement>>('valueGroup');\r\n private readonly refTextEl =\r\n viewChild.required<ElementRef<SVGTextElement>>('refText');\r\n\r\n // Core Inputs - Value and Range\r\n readonly value = input(0);\r\n readonly min = input(0);\r\n readonly max = input(100);\r\n readonly segments = input<RadialGaugeSegment[]>();\r\n readonly title = input('Gauge');\r\n readonly description = input('');\r\n readonly segmentGapPx = input(4);\r\n \r\n // Widget styling inputs\r\n /**\r\n * Whether the gauge should display with a background. \r\n * Affects text color contrast and other visual elements.\r\n * @default false\r\n */\r\n readonly hasBackground = input(false);\r\n\r\n /**\r\n * Whether to display the numeric value label in the center of the gauge.\r\n * @default true\r\n */\r\n readonly showValueLabel = input(true);\r\n\r\n // Size Control Inputs\r\n /**\r\n * Base gauge diameter in pixels. Used as fallback when fitToContainer is false.\r\n * @default 300\r\n */\r\n readonly size = input(300);\r\n\r\n /**\r\n * Automatically resize gauge to fit its container dimensions.\r\n * When true, the gauge will observe container size changes and adjust accordingly.\r\n * Maintains semicircle aspect ratio (2:1 width:height).\r\n * @default false\r\n */\r\n readonly fitToContainer = input(false);\r\n\r\n /**\r\n * Padding in pixels to maintain from container edges when fitToContainer is true.\r\n * @default 10\r\n */\r\n readonly containerPadding = input(10);\r\n\r\n // Thickness Control Inputs\r\n /**\r\n * Use proportional thickness scaling based on gauge size.\r\n * When true, all thickness values are calculated as multiples of baseThickness.\r\n * Overrides manual outerThickness, innerThickness, and gap inputs.\r\n * @default false\r\n */\r\n readonly responsiveMode = input(false);\r\n\r\n /**\r\n * Ratio used to calculate base thickness from gauge size.\r\n * baseThickness = effectiveSize / sizeToThicknessRatio\r\n * Higher values create thinner gauge rings for ultra-thin appearance.\r\n * @default 20\r\n * @example\r\n * - ratio=15: thicker rings (bt = size/15)\r\n * - ratio=20: ultra-thin balanced appearance (bt = size/20)\r\n * - ratio=30: extremely thin rings (bt = size/30)\r\n */\r\n readonly sizeToThicknessRatio = input(20);\r\n\r\n /**\r\n * Proportional multipliers for responsive thickness calculations.\r\n * - outer: Multiplier for outer ring thickness (default: 3)\r\n * - inner: Multiplier for inner ring thickness (default: 1)\r\n * - gap: Multiplier for gap between rings (default: 0.5)\r\n * Total thickness = baseThickness × (outer + inner + gap) = bt × 4.5\r\n * @default { outer: 3, inner: 1, gap: 0.5 }\r\n */\r\n readonly responsiveProportions = input({ outer: 3, inner: 1, gap: 0.5 });\r\n\r\n // Manual Thickness Inputs (used when responsiveMode is false)\r\n /**\r\n * Manual outer ring thickness in pixels. Ignored when responsiveMode is true.\r\n * @default 36\r\n */\r\n readonly outerThickness = input(36);\r\n\r\n /**\r\n * Manual inner ring thickness in pixels. Ignored when responsiveMode is true.\r\n * @default 12\r\n */\r\n readonly innerThickness = input(12);\r\n\r\n /**\r\n * Manual gap between rings in pixels. Ignored when responsiveMode is true.\r\n * @default 8\r\n */\r\n readonly gap = input(8);\r\n\r\n readonly titleId = `rg-title-${Math.random().toString(36).slice(2)}`;\r\n readonly descId = `rg-desc-${Math.random().toString(36).slice(2)}`;\r\n readonly clipId = `rg-clip-${Math.random().toString(36).slice(2)}`;\r\n\r\n private readonly locale = inject(LOCALE_ID);\r\n private readonly elementRef = inject(ElementRef<HTMLElement>);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly nf = new Intl.NumberFormat(this.locale, {\r\n maximumFractionDigits: 1,\r\n });\r\n\r\n // Container Size Detection\r\n /**\r\n * Tracks the container's available size for responsive sizing.\r\n * Updated by ResizeObserver when fitToContainer is enabled.\r\n * @private\r\n */\r\n private readonly containerSize = signal<number | null>(null);\r\n\r\n /**\r\n * ResizeObserver instance for monitoring container size changes.\r\n * Created when fitToContainer is enabled, destroyed on component cleanup.\r\n * @private\r\n */\r\n private resizeObserver: ResizeObserver | null = null;\r\n\r\n readonly viewReady = toSignal(\r\n from(new Promise<void>((resolve) => afterNextRender(resolve))).pipe(\r\n map(() => true)\r\n ),\r\n { initialValue: false }\r\n );\r\n\r\n readonly fontsReady = toSignal(\r\n typeof document !== 'undefined' && 'fonts' in document\r\n ? from((document as Document & { fonts: FontFaceSet }).fonts.ready).pipe(\r\n map(() => true)\r\n )\r\n : of(true), // SSR or older browsers: treat as ready\r\n { initialValue: false }\r\n );\r\n\r\n constructor() {\r\n this.destroyRef.onDestroy(() => {\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n this.resizeObserver = null;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Effect that manages ResizeObserver lifecycle based on fitToContainer input.\r\n * Automatically connects/disconnects observer when the input changes.\r\n * @private\r\n */\r\n private readonly containerObserverEffect = effect(() => {\r\n const shouldObserve = this.fitToContainer();\r\n\r\n if (shouldObserve && !this.resizeObserver) {\r\n // Create and start observing\r\n this.resizeObserver = new ResizeObserver((entries) => {\r\n const entry = entries[0];\r\n if (!entry) return;\r\n\r\n const { width, height } = entry.contentRect;\r\n const padding = this.containerPadding();\r\n\r\n const availW = Math.max(0, width - padding * 2);\r\n const availH = Math.max(0, height - padding);\r\n\r\n let sFromW: number;\r\n let sFromH: number;\r\n\r\n if (this.responsiveMode()) {\r\n // In responsive mode: outerThickness = 3 * baseThickness = 3 * size / ratio\r\n // Total space needed = size + outerThickness = size + 3*size/ratio = size * (1 + 3/ratio)\r\n const ratio = this.sizeToThicknessRatio();\r\n const spaceFactor = 1 + 3 / ratio; // Total space factor\r\n sFromW = availW / spaceFactor;\r\n sFromH = (2 * availH) / spaceFactor;\r\n } else {\r\n // Manual thickness: outer thickness is fixed\r\n const outerT = this.outerThickness();\r\n sFromW = Math.max(0, availW - outerT);\r\n sFromH = Math.max(0, 2 * availH - outerT);\r\n }\r\n\r\n const maxDiameter = Math.min(sFromW, sFromH);\r\n this.containerSize.set(Math.max(maxDiameter, 50));\r\n });\r\n\r\n this.resizeObserver.observe(this.elementRef.nativeElement);\r\n } else if (!shouldObserve && this.resizeObserver) {\r\n // Stop observing and cleanup\r\n this.resizeObserver.disconnect();\r\n this.resizeObserver = null;\r\n this.containerSize.set(null);\r\n }\r\n });\r\n\r\n // ── Build the reference string reactively ───────────────────────────────────\r\n referenceString = computed(() => {\r\n const ref = this.labelReference();\r\n if (typeof ref === 'string') return ref;\r\n if (typeof ref === 'number' && ref > 0) {\r\n const g = this.referenceGlyph() ?? '0';\r\n return g.repeat(ref);\r\n }\r\n\r\n return this.formattedLabel(); // measure actual label\r\n });\r\n\r\n // ── Core transform: center + uniform scale to fit the reserved box ──────────\r\n valueTransform = computed(() => {\r\n if (!this.showValueLabel()) return '';\r\n \r\n // ensure we wait for first paint + font shaping\r\n this.viewReady();\r\n this.fontsReady();\r\n\r\n const cx = this.centerX();\r\n const cy = this.centerY();\r\n const r = this.legendInnerRadius();\r\n const pad = this.labelPadding();\r\n\r\n const boxWidth = Math.max(0, 2 * r - 2 * pad);\r\n const boxHeight = Math.max(0, r - pad);\r\n\r\n // If geometry is degenerate, just center.\r\n if (!boxWidth || !boxHeight) return `translate(${cx},${cy})`;\r\n\r\n // Measure the actual label (for height) and the reference (for width)\r\n const labelEl = this.valueTextEl()?.nativeElement;\r\n const refEl = this.refTextEl().nativeElement;\r\n\r\n if (!labelEl) return `translate(${cx},${cy})`;\r\n\r\n // Important: ensure text nodes are up to date before reading BBox\r\n // (Angular's computed/effect guarantees sync within the same microtask)\r\n const labelBox = this.safeBBox(labelEl);\r\n const refBox = this.safeBBox(refEl);\r\n\r\n // Use reference width and actual label height\r\n const widthForFit = refBox.width || labelBox.width || 1;\r\n const heightForFit = labelBox.height || refBox.height || 1;\r\n\r\n const s =\r\n Math.min(boxWidth / widthForFit, boxHeight / heightForFit) *\r\n this.baselineSafety();\r\n\r\n return `translate(${cx},${cy}) scale(${s})`;\r\n });\r\n\r\n /** Guarded getBBox that avoids 0/NaN on detached or invisible nodes. */\r\n safeBBox(node: SVGGraphicsElement): DOMRect {\r\n try {\r\n const box = node.getBBox();\r\n // Firefox/Safari can occasionally return 0 when text hasn’t painted yet; fall back to a rough estimate.\r\n if (box && (box.width > 0 || box.height > 0)) return box;\r\n } catch {\r\n /* ignore */\r\n }\r\n // Fallback guess to avoid divide-by-zero (tuned small; will get corrected next tick)\r\n return new DOMRect(0, 0, 1, 1);\r\n }\r\n\r\n // Responsive Size and Thickness Calculations\r\n /**\r\n * The effective gauge diameter, accounting for container sizing and manual size input.\r\n * Priority: containerSize (when fitToContainer=true) > manual size input\r\n * @returns Effective diameter in pixels\r\n *\r\n * @example\r\n * // Fixed size mode\r\n * fitToContainer=false, size=300 → effectiveSize=300\r\n *\r\n * // Container responsive mode\r\n * fitToContainer=true, container=400px wide → effectiveSize=380 (minus padding)\r\n */\r\n private readonly effectiveSize = computed(() => {\r\n const containerDiameter = this.containerSize();\r\n if (this.fitToContainer() && containerDiameter !== null) {\r\n return containerDiameter;\r\n }\r\n return this.size();\r\n });\r\n\r\n /**\r\n * Base thickness calculated from effective size for proportional scaling.\r\n * Only used when responsiveMode is enabled.\r\n * Formula: baseThickness = effectiveSize / sizeToThicknessRatio\r\n * @returns Base thickness in pixels, or 0 when responsiveMode is false\r\n *\r\n * @example\r\n * // effectiveSize=300, sizeToThicknessRatio=12\r\n * baseThickness = 300/12 = 25px\r\n * // Total ring thickness = 25 × 4.5 = 112.5px (37.5% of diameter)\r\n */\r\n private readonly baseThickness = computed(() => {\r\n if (!this.responsiveMode()) return 0;\r\n return this.effectiveSize() / this.sizeToThicknessRatio();\r\n });\r\n\r\n /**\r\n * Effective outer ring thickness, supporting both manual and responsive modes.\r\n * - Responsive mode: baseThickness × responsiveProportions.outer\r\n * - Manual mode: outerThickness input value\r\n * @returns Outer ring thickness in pixels\r\n */\r\n readonly effectiveOuterThickness = computed(() => {\r\n if (this.responsiveMode()) {\r\n return this.baseThickness() * this.responsiveProportions().outer;\r\n }\r\n return this.outerThickness();\r\n });\r\n\r\n /**\r\n * Effective inner ring thickness, supporting both manual and responsive modes.\r\n * - Responsive mode: baseThickness × responsiveProportions.inner\r\n * - Manual mode: innerThickness input value\r\n * @returns Inner ring thickness in pixels\r\n */\r\n readonly effectiveInnerThickness = computed(() => {\r\n if (this.responsiveMode()) {\r\n return this.baseThickness() * this.responsiveProportions().inner;\r\n }\r\n return this.innerThickness();\r\n });\r\n\r\n /**\r\n * Effective gap between rings, supporting both manual and responsive modes.\r\n * - Responsive mode: baseThickness × responsiveProportions.gap\r\n * - Manual mode: gap input value\r\n * @returns Gap between rings in pixels\r\n */\r\n readonly effectiveGap = computed(() => {\r\n if (this.responsiveMode()) {\r\n return this.baseThickness() * this.responsiveProportions().gap;\r\n }\r\n return this.gap();\r\n });\r\n\r\n // SVG Layout Calculations\r\n private readonly svgPadding = computed(\r\n () => this.effectiveOuterThickness() / 2\r\n );\r\n readonly svgWidth = computed(\r\n () => this.effectiveSize() + this.effectiveOuterThickness()\r\n );\r\n readonly svgHeight = computed(() =>\r\n Math.ceil(this.effectiveSize() / 2 + this.effectiveOuterThickness() / 2)\r\n );\r\n readonly centerX = computed(\r\n () => this.effectiveSize() / 2 + this.effectiveOuterThickness() / 2\r\n );\r\n readonly centerY = computed(\r\n () => this.effectiveSize() / 2 + this.effectiveOuterThickness() / 2\r\n );\r\n\r\n /**\r\n * If a string is provided, we measure it and allocate space for that width.\r\n * If a number is provided, we build a string of that many `referenceGlyph`s.\r\n * If omitted, we fall back to measuring the actual label.\r\n */\r\n labelReference = input<string | number | undefined>(undefined);\r\n\r\n /** Glyph to repeat when labelReference is a number (defaults to '0'). */\r\n referenceGlyph = input<string>('0');\r\n\r\n /** Extra breathing room inside the inner semicircle box (in px). */\r\n labelPadding = input<number>(4);\r\n\r\n /** Safety multiplier to avoid clipping ascenders/descenders. */\r\n baselineSafety = input<number>(0.95);\r\n\r\n readonly outerRadius = computed(() => this.effectiveSize() / 2);\r\n readonly innerRadius = computed(\r\n () =>\r\n this.outerRadius() -\r\n this.effectiveOuterThickness() / 2 -\r\n this.effectiveGap()\r\n );\r\n readonly legendOuterRadius = computed(\r\n () =>\r\n this.outerRadius() -\r\n this.effectiveOuterThickness() / 2 -\r\n this.effectiveGap() -\r\n this.effectiveInnerThickness() / 2\r\n );\r\n readonly legendInnerRadius = computed(\r\n () => this.legendOuterRadius() - this.effectiveInnerThickness()\r\n );\r\n\r\n private readonly startAngle = -180;\r\n private readonly endAngle = 0;\r\n\r\n readonly clampedValue = computed(() =>\r\n this.clamp(this.value(), this.min(), this.max())\r\n );\r\n\r\n readonly percentage = computed(() => {\r\n const range = this.max() - this.min();\r\n if (range === 0) return 0;\r\n return (this.clampedValue() - this.min()) / range;\r\n });\r\n\r\n readonly percent = computed(() => Math.round(this.percentage() * 100));\r\n\r\n private readonly defaultSegments = computed<RadialGaugeSegment[]>(() => {\r\n const minVal = this.min();\r\n const maxVal = this.max();\r\n const range = maxVal - minVal;\r\n return [\r\n {\r\n from: minVal,\r\n to: minVal + 0.6 * range,\r\n color: 'var(--gauge-value-critical, #dc2626)',\r\n },\r\n {\r\n from: minVal + 0.6 * range,\r\n to: minVal + 0.8 * range,\r\n color: 'var(--gauge-value-warning, #f59e0b)',\r\n },\r\n {\r\n from: minVal + 0.8 * range,\r\n to: maxVal,\r\n color: 'var(--gauge-value-good, #10b981)',\r\n },\r\n ];\r\n });\r\n\r\n readonly actualSegments = computed(\r\n () => this.segments() || this.defaultSegments()\r\n );\r\n\r\n readonly formattedLabel = computed(() => this.nf.format(this.clampedValue()));\r\n\r\n readonly valueColor = computed(() => {\r\n const v = this.clampedValue();\r\n const segs = this.actualSegments();\r\n for (const s of segs) {\r\n if (v >= s.from && v <= s.to) return s.color;\r\n }\r\n return segs.at(-1)?.color ?? 'var(--mat-sys-primary)';\r\n });\r\n\r\n readonly backgroundArcPath = computed(() =>\r\n this.createArcPath(this.outerRadius(), this.startAngle, this.endAngle)\r\n );\r\n\r\n readonly segmentPaths = computed(() => {\r\n const segs = this.actualSegments();\r\n const minVal = this.min();\r\n const maxVal = this.max();\r\n const range = maxVal - minVal;\r\n if (!range) return [];\r\n\r\n const r = this.legendOuterRadius();\r\n const gapDeg = this.gapDegreesForRadius(this.segmentGapPx(), r);\r\n\r\n return segs\r\n .map((s, i) => {\r\n const startPct = this.clamp((s.from - minVal) / range, 0, 1);\r\n const endPct = this.clamp((s.to - minVal) / range, 0, 1);\r\n let a0 = this.angleForPercentage(startPct);\r\n let a1 = this.angleForPercentage(endPct);\r\n if (i > 0) a0 += gapDeg / 2;\r\n if (i < segs.length - 1) a1 -= gapDeg / 2;\r\n if (a1 <= a0) return null;\r\n return { path: this.createArcPath(r, a0, a1), color: s.color };\r\n })\r\n .filter((x): x is { path: string; color: string } => !!x);\r\n });\r\n\r\n readonly ariaLabel = computed(\r\n () =>\r\n `${this.title()}: ${this.formattedLabel()} (range ${this.min()}–${this.max()})`\r\n );\r\n\r\n private clamp(v: number, min: number, max: number) {\r\n return Math.min(Math.max(v, min), max);\r\n }\r\n\r\n /**\r\n * Converts a percentage (0-1) to an angle position on the gauge arc.\r\n * The gauge spans from startAngle (-180°) to endAngle (0°), creating a semicircle.\r\n * @param p - Percentage value between 0 and 1\r\n * @returns Angle in degrees for the given percentage along the gauge arc\r\n * @example\r\n * angleForPercentage(0) => -180° (start of gauge)\r\n * angleForPercentage(0.5) => -90° (middle of gauge)\r\n * angleForPercentage(1) => 0° (end of gauge)\r\n */\r\n private angleForPercentage(p: number) {\r\n return this.startAngle + (this.endAngle - this.startAngle) * p;\r\n }\r\n\r\n /**\r\n * Converts polar coordinates (radius, angle) to Cartesian coordinates (x, y).\r\n * Uses standard trigonometric conversion where angle 0° points to the right (3 o'clock).\r\n * @param cx - Center X coordinate of the circle\r\n * @param cy - Center Y coordinate of the circle\r\n * @param r - Radius distance from center\r\n * @param angle - Angle in degrees (0° = right, 90° = down, 180° = left, -90° = up)\r\n * @returns Object with x and y Cartesian coordinates\r\n * @example\r\n * polarToCartesian(100, 100, 50, 0) => {x: 150, y: 100} // 3 o'clock\r\n * polarToCartesian(100, 100, 50, -90) => {x: 100, y: 50} // 12 o'clock\r\n */\r\n private polarToCartesian(cx: number, cy: number, r: number, angle: number) {\r\n const a = (angle * Math.PI) / 180;\r\n return { x: cx + r * Math.cos(a), y: cy + r * Math.sin(a) };\r\n }\r\n\r\n /**\r\n * Creates an SVG path string for a circular arc segment.\r\n * Uses SVG arc path commands to draw an arc from start angle to end angle.\r\n * @param r - Radius of the arc\r\n * @param a0 - Starting angle in degrees\r\n * @param a1 - Ending angle in degrees\r\n * @returns SVG path string defining the arc\r\n * @example\r\n * createArcPath(50, -180, 0) => \"M cx-50 cy A 50 50 0 1 1 cx+50 cy\"\r\n * This creates a semicircle from left (-180°) to right (0°)\r\n *\r\n * SVG Arc Parameters:\r\n * - rx, ry: Radii (equal for circular arc)\r\n * - x-axis-rotation: 0 (no rotation for circles)\r\n * - large-arc-flag: 1 if arc > 180°, 0 otherwise\r\n * - sweep-flag: 1 for clockwise, 0 for counter-clockwise\r\n */\r\n private createArcPath(r: number, a0: number, a1: number) {\r\n const cx = this.centerX(),\r\n cy = this.centerY();\r\n const start = this.polarToCartesian(cx, cy, r, a0);\r\n const end = this.polarToCartesian(cx, cy, r, a1);\r\n const largeArc = Math.abs(a1 - a0) > 180 ? 1 : 0;\r\n const sweep = a1 > a0 ? 1 : 0;\r\n return `M ${start.x} ${start.y} A ${r} ${r} 0 ${largeArc} ${sweep} ${end.x} ${end.y}`;\r\n }\r\n\r\n /**\r\n * Calculates the angular gap in degrees needed for a specific pixel gap at a given radius.\r\n * Used to create visual separation between legend segments.\r\n * @param px - Desired gap size in pixels\r\n * @param r - Radius at which the gap will appear\r\n * @returns Gap size in degrees, clamped between 0° and 180°\r\n * @example\r\n * For a 4px gap on a radius of 100px:\r\n * Arc length = π * 100 = 314.16px (semicircle)\r\n * Degrees = 180 * (4 / 314.16) ≈ 2.3°\r\n *\r\n * Mathematical basis:\r\n * - Semicircle arc length = π * r\r\n * - Ratio of gap to semicircle = px / (π * r)\r\n * - Convert ratio to degrees by multiplying by 180°\r\n */\r\n private gapDegreesForRadius(px: number, r: number) {\r\n const semicircumference = Math.PI * r;\r\n return 180 * this.clamp(px / semicircumference, 0, 1);\r\n }\r\n}\r\n","@let w = svgWidth(); @let h = svgHeight(); @let cy = centerY(); @let pct =\r\npercent();\r\n\r\n<svg\r\n [attr.width]=\"fitToContainer() ? null : w\"\r\n [attr.height]=\"fitToContainer() ? null : h\"\r\n [attr.viewBox]=\"'0 0 ' + w + ' ' + h\"\r\n [class.responsive]=\"fitToContainer()\"\r\n class=\"gauge-svg\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n>\r\n <title [attr.id]=\"titleId\">{{ title() }}</title>\r\n @if (description()) {\r\n <desc [attr.id]=\"descId\">{{ description() }}</desc>\r\n }\r\n\r\n <defs>\r\n <clipPath [attr.id]=\"clipId\">\r\n <!-- Give a tiny extra room equal to half of the outer stroke to avoid anti-alias cutoff at the baseline -->\r\n <rect\r\n x=\"0\"\r\n y=\"0\"\r\n [attr.width]=\"w\"\r\n [attr.height]=\"cy + effectiveOuterThickness() / 2\"\r\n />\r\n </clipPath>\r\n </defs>\r\n\r\n <g [attr.clip-path]=\"'url(#' + clipId + ')'\">\r\n <path\r\n [attr.d]=\"backgroundArcPath()\"\r\n pathLength=\"100\"\r\n fill=\"none\"\r\n class=\"gauge-background\"\r\n [attr.stroke-width]=\"effectiveOuterThickness()\"\r\n stroke-linecap=\"butt\"\r\n />\r\n\r\n <path\r\n [attr.d]=\"backgroundArcPath()\"\r\n pathLength=\"100\"\r\n fill=\"none\"\r\n class=\"gauge-value\"\r\n [attr.stroke]=\"valueColor()\"\r\n [attr.stroke-width]=\"effectiveOuterThickness()\"\r\n stroke-linecap=\"butt\"\r\n [attr.stroke-dasharray]=\"pct + ' 100'\"\r\n />\r\n\r\n @for (segment of segmentPaths(); track segment.path) {\r\n <path\r\n [attr.d]=\"segment.path\"\r\n fill=\"none\"\r\n [attr.stroke]=\"segment.color\"\r\n [attr.stroke-width]=\"effectiveInnerThickness()\"\r\n stroke-linecap=\"butt\"\r\n class=\"gauge-segment\"\r\n />\r\n }\r\n </g>\r\n\r\n @if (showValueLabel()) {\r\n <g #valueGroup [attr.transform]=\"valueTransform()\">\r\n <text\r\n #valueText\r\n class=\"gauge-value-text\"\r\n x=\"0\"\r\n y=\"0\"\r\n text-anchor=\"middle\"\r\n alignment-baseline=\"baseline\"\r\n dy=\"-0.75\"\r\n >\r\n {{ formattedLabel() }}\r\n </text>\r\n </g>\r\n }\r\n\r\n <!-- Hidden reference text used ONLY for width measurement -->\r\n <g style=\"visibility: hidden; pointer-events: none\" aria-hidden=\"true\">\r\n <text\r\n #refText\r\n x=\"0\"\r\n y=\"0\"\r\n text-anchor=\"start\"\r\n dominant-baseline=\"alphabetic\"\r\n >\r\n {{ referenceString() }}\r\n </text>\r\n </g>\r\n</svg>\r\n","// radial-gauge-widget.metadata.ts\r\nexport const svgIcon = `\r\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 55\" fill=\"currentColor\">\r\n <defs>\r\n <clipPath id=\"gauge-clip\"><rect x=\"0\" y=\"0\" width=\"100\" height=\"52\"/></clipPath>\r\n\r\n <!-- Outer arc geometry (radius 40, stroke 8) -->\r\n <path id=\"outerArc\" d=\"M 10 50 A 40 40 0 0 1 90 50\" pathLength=\"100\"/>\r\n\r\n <!-- Inner arc geometry (radius 31) -->\r\n <path id=\"innerArc\" d=\"M 19 50 A 31 31 0 0 1 81 50\" pathLength=\"100\"/>\r\n </defs>\r\n\r\n <g clip-path=\"url(#gauge-clip)\" stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"butt\">\r\n <!-- Outer background arc -->\r\n <use href=\"#outerArc\" stroke-width=\"8\" opacity=\"0.2\"/>\r\n\r\n <!-- Value arc: 65% -->\r\n <use href=\"#outerArc\" stroke-width=\"8\" stroke-dasharray=\"65 100\"/>\r\n\r\n <!-- Inner legend segments (single geometry with dash windows) -->\r\n <!-- 0–60% -->\r\n <use href=\"#innerArc\" stroke-width=\"4\" opacity=\"0.2\"\r\n stroke-dasharray=\"60 100\" stroke-dashoffset=\"0\"/>\r\n <!-- 60–80% -->\r\n <use href=\"#innerArc\" stroke-width=\"4\" opacity=\"0.4\"\r\n stroke-dasharray=\"20 100\" stroke-dashoffset=\"60\"/>\r\n <!-- 0–100% (full half-circle), same color as value arc -->\r\n <use href=\"#innerArc\" stroke-width=\"4\"\r\n stroke-dasharray=\"100 100\" stroke-dashoffset=\"0\"/>\r\n <!-- (Alternatively, you can omit dash attributes entirely on this one:\r\n <use href=\"#innerArc\" stroke-width=\"4\"/> ) -->\r\n </g>\r\n</svg>\r\n`;\r\n","import { Component, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n MAT_DIALOG_DATA,\r\n MatDialogRef,\r\n MatDialogModule,\r\n} from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { RadialGaugeWidgetState } from './radial-gauge-widget.component';\r\n\r\n@Component({\r\n selector: 'lib-radial-gauge-state-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSlideToggleModule,\r\n MatRadioModule,\r\n FormsModule,\r\n ],\r\n template: `\r\n <h2 mat-dialog-title>Radial Gauge Settings</h2>\r\n <mat-dialog-content>\r\n <mat-form-field>\r\n <mat-label>Value (0-100)</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [(ngModel)]=\"localState.value\"\r\n min=\"0\"\r\n max=\"100\"\r\n />\r\n </mat-form-field>\r\n\r\n <div class=\"section\">\r\n <h4>Color Profile</h4>\r\n <mat-radio-group [(ngModel)]=\"localState.colorProfile\">\r\n <mat-radio-button value=\"dynamic\">Dynamic (Theme Colors)</mat-radio-button>\r\n <mat-radio-button value=\"static\">Static (Performance Colors)</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <div class=\"toggle-section\">\r\n <mat-slide-toggle [(ngModel)]=\"localState.active\">\r\n Active Display\r\n </mat-slide-toggle>\r\n <p class=\"toggle-description\">Display live gauge instead of passive icon</p>\r\n </div>\r\n\r\n <div class=\"toggle-section\">\r\n <mat-slide-toggle [(ngModel)]=\"localState.hasBackground\">\r\n Background\r\n </mat-slide-toggle>\r\n <p class=\"toggle-description\">Add a background color to the widget</p>\r\n </div>\r\n\r\n <div class=\"toggle-section\">\r\n <mat-slide-toggle [(ngModel)]=\"localState.showValueLabel\">\r\n Show Value Label\r\n </mat-slide-toggle>\r\n <p class=\"toggle-description\">Display numeric value in gauge center</p>\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button (click)=\"onCancel()\">Cancel</button>\r\n <button mat-flat-button (click)=\"onSave()\">Save</button>\r\n </mat-dialog-actions>\r\n `,\r\n styles: [\r\n `\r\n mat-dialog-content {\r\n display: block;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n }\r\n\r\n mat-form-field {\r\n width: 100%;\r\n display: block;\r\n margin-bottom: 1rem;\r\n }\r\n\r\n .section {\r\n margin-bottom: 1.5rem;\r\n }\r\n\r\n .section h4 {\r\n margin: 0 0 0.5rem 0;\r\n font-size: 0.875rem;\r\n font-weight: 500;\r\n color: var(--mat-sys-on-surface, #1f1f1f);\r\n }\r\n\r\n mat-radio-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0.5rem;\r\n }\r\n\r\n .toggle-section {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.75rem;\r\n margin-bottom: 0.5rem;\r\n }\r\n\r\n .toggle-description {\r\n margin: 0;\r\n flex: 1;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class RadialGaugeStateDialogComponent {\r\n private readonly data = inject<RadialGaugeWidgetState>(MAT_DIALOG_DATA);\r\n private readonly dialogRef = inject(MatDialogRef<RadialGaugeStateDialogComponent>);\r\n\r\n localState: RadialGaugeWidgetState = {\r\n value: this.data.value ?? 50,\r\n colorProfile: this.data.colorProfile ?? 'dynamic',\r\n active: this.data.active ?? false,\r\n hasBackground: this.data.hasBackground ?? true,\r\n showValueLabel: this.data.showValueLabel ?? true,\r\n };\r\n\r\n onCancel(): void {\r\n this.dialogRef.close();\r\n }\r\n\r\n onSave(): void {\r\n this.dialogRef.close(this.localState);\r\n }\r\n}","// radial-gauge-widget.component.ts\r\nimport { Component, inject, signal, computed } from '@angular/core';\r\nimport { Widget, WidgetMetadata } from '@dragonworks/ngx-dashboard';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { RadialGaugeComponent } from '../../components/radial-gauge/radial-gauge.component';\r\nimport { svgIcon } from './radial-gauge-widget.metadata';\r\nimport { RadialGaugeStateDialogComponent } from './radial-gauge-state-dialog.component';\r\n\r\nexport interface RadialGaugeWidgetState {\r\n value?: number;\r\n colorProfile?: 'dynamic' | 'static';\r\n active?: boolean;\r\n hasBackground?: boolean;\r\n showValueLabel?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-dashboard-radial-gauge-widget',\r\n imports: [RadialGaugeComponent],\r\n templateUrl: './radial-gauge-widget.component.html',\r\n styleUrl: './radial-gauge-widget.component.scss',\r\n})\r\nexport class RadialGaugeWidgetComponent implements Widget {\r\n static metadata: WidgetMetadata = {\r\n widgetTypeid: '@ngx-dashboard/radial-gauge-widget',\r\n name: 'Radial Gauge',\r\n description: 'A semi-circular gauge indicator',\r\n svgIcon,\r\n };\r\n\r\n readonly #dialog = inject(MatDialog);\r\n readonly #sanitizer = inject(DomSanitizer);\r\n\r\n readonly safeSvgIcon = this.#sanitizer.bypassSecurityTrustHtml(svgIcon);\r\n\r\n readonly state = signal<RadialGaugeWidgetState>({\r\n value: 50,\r\n colorProfile: 'dynamic',\r\n active: false,\r\n hasBackground: true,\r\n showValueLabel: true,\r\n });\r\n\r\n readonly segments = computed(() => {\r\n const profile = this.state().colorProfile || 'dynamic';\r\n\r\n if (profile === 'static') {\r\n // Static performance segments (like CPU usage example)\r\n return [\r\n { from: 0, to: 25, color: '#dc2626' }, // Poor - red\r\n { from: 25, to: 50, color: '#f59e0b' }, // Fair - orange\r\n { from: 50, to: 75, color: '#3b82f6' }, // Good - blue\r\n { from: 75, to: 100, color: '#10b981' }, // Excellent - green\r\n ];\r\n } else {\r\n // Dynamic theme-aware segments (like demo gauge preview)\r\n return [\r\n { from: 0, to: 60, color: 'var(--mat-sys-error)' },\r\n { from: 60, to: 80, color: 'var(--mat-sys-secondary)' },\r\n { from: 80, to: 100, color: 'var(--mat-sys-tertiary)' },\r\n ];\r\n }\r\n });\r\n\r\n dashboardSetState(state?: unknown): void {\r\n if (state) {\r\n this.state.update((current) => ({\r\n ...current,\r\n ...(state as RadialGaugeWidgetState),\r\n }));\r\n }\r\n }\r\n\r\n dashboardGetState(): RadialGaugeWidgetState {\r\n return this.state();\r\n }\r\n\r\n dashboardEditState(): void {\r\n const dialogRef = this.#dialog.open(RadialGaugeStateDialogComponent, {\r\n data: this.state(),\r\n width: '400px',\r\n maxWidth: '90vw',\r\n disableClose: false,\r\n autoFocus: false,\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((result) => {\r\n if (result) {\r\n this.state.set(result);\r\n }\r\n });\r\n }\r\n}\r\n","<!-- radial-gauge-widget.component.html -->\r\n<div class=\"widget-container\" [class.has-background]=\"state().hasBackground\">\r\n @if (state().active) {\r\n <!-- Active mode: Show live gauge -->\r\n <div class=\"gauge-container\">\r\n <ngx-radial-gauge\r\n [value]=\"state().value || 0\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n [fitToContainer]=\"true\"\r\n [responsiveMode]=\"true\"\r\n [segments]=\"segments()\"\r\n [outerThickness]=\"24\"\r\n [innerThickness]=\"8\"\r\n [gap]=\"4\"\r\n [segmentGapPx]=\"2\"\r\n [labelReference]=\"'00000'\"\r\n [referenceGlyph]=\"'0'\"\r\n [hasBackground]=\"state().hasBackground || false\"\r\n [showValueLabel]=\"state().showValueLabel ?? true\"\r\n />\r\n </div>\r\n } @else {\r\n <!-- Passive mode: Show static icon -->\r\n <div class=\"icon-container\">\r\n <div class=\"svg-placeholder\" [innerHTML]=\"safeSvgIcon\"></div>\r\n </div>\r\n }\r\n</div>\r\n","/*\r\n * Public API Surface of ngx-dashboard-widgets\r\n */\r\n\r\n// Widget Components\r\nexport { ArrowWidgetComponent } from './lib/widgets/arrow-widget/arrow-widget.component';\r\nexport { LabelWidgetComponent } from './lib/widgets/label-widget/label-widget.component';\r\nexport { ClockWidgetComponent } from './lib/widgets/clock-widget/clock-widget.component';\r\nexport { RadialGaugeWidgetComponent } from './lib/widgets/radial-gauge-widget/radial-gauge-widget.component';\r\n\r\n// Shared Components and Directives\r\nexport { RadialGaugeComponent } from './lib/components/radial-gauge/radial-gauge.component';\r\nexport { ResponsiveTextDirective } from './lib/directives/responsive-text.directive';\r\n\r\n// Types and Interfaces\r\nexport type { RadialGaugeSegment } from './lib/components/radial-gauge/radial-gauge.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["svgIcon","i5","i6","i8","i2","i3","i4","i1","i7"],"mappings":"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"}