{"version":3,"file":"dragonworks-ngx-dashboard-widgets.mjs","sources":["../../../projects/ngx-dashboard-widgets/src/lib/version.ts","../../../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":["// Auto-generated by scripts/generate-versions.js\n// Do not edit manually\nexport const NGX_DASHBOARD_WIDGETS_VERSION = '20.3.2';\n","// 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 i18n=\"@@ngx.dashboard.widgets.arrow.dialog.title\">\r\n      Arrow Settings\r\n    </h2>\r\n    <mat-dialog-content>\r\n      <!-- Direction Selection -->\r\n      <mat-form-field appearance=\"outline\" class=\"direction-field\">\r\n        <mat-label i18n=\"@@ngx.dashboard.widgets.arrow.dialog.direction\"\r\n          >Arrow Direction</mat-label\r\n        >\r\n        <mat-select\r\n          [value]=\"direction()\"\r\n          (selectionChange)=\"direction.set($any($event.value))\"\r\n        >\r\n          <mat-option\r\n            value=\"up\"\r\n            i18n=\"@@ngx.dashboard.widgets.arrow.dialog.direction.up\"\r\n            >Up</mat-option\r\n          >\r\n          <mat-option\r\n            value=\"right\"\r\n            i18n=\"@@ngx.dashboard.widgets.arrow.dialog.direction.right\"\r\n            >Right</mat-option\r\n          >\r\n          <mat-option\r\n            value=\"down\"\r\n            i18n=\"@@ngx.dashboard.widgets.arrow.dialog.direction.down\"\r\n            >Down</mat-option\r\n          >\r\n          <mat-option\r\n            value=\"left\"\r\n            i18n=\"@@ngx.dashboard.widgets.arrow.dialog.direction.left\"\r\n            >Left</mat-option\r\n          >\r\n        </mat-select>\r\n      </mat-form-field>\r\n\r\n      <!-- Opacity Slider -->\r\n      <div class=\"slider-field\">\r\n        <div\r\n          class=\"field-label\"\r\n          i18n=\"@@ngx.dashboard.widgets.arrow.dialog.opacity\"\r\n        >\r\n          Opacity: {{ formatOpacity(opacity()) }}%\r\n        </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          i18n=\"@@ngx.dashboard.widgets.arrow.dialog.background\"\r\n        >\r\n          Background\r\n        </mat-slide-toggle>\r\n        <span\r\n          class=\"toggle-hint\"\r\n          i18n=\"@@ngx.dashboard.widgets.arrow.dialog.backgroundHint\"\r\n          >Adds a background behind the arrow</span\r\n        >\r\n      </div>\r\n    </mat-dialog-content>\r\n\r\n    <mat-dialog-actions align=\"end\">\r\n      <button\r\n        mat-button\r\n        (click)=\"onCancel()\"\r\n        i18n=\"@@ngx.dashboard.common.cancel\"\r\n      >\r\n        Cancel\r\n      </button>\r\n      <button\r\n        mat-flat-button\r\n        (click)=\"save()\"\r\n        [disabled]=\"!hasChanged()\"\r\n        i18n=\"@@ngx.dashboard.common.save\"\r\n      >\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>(\r\n    !(this.data.hasBackground ?? true)\r\n  );\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: $localize`:@@ngx.dashboard.widgets.arrow.name:Arrow`,\r\n    description: $localize`:@@ngx.dashboard.widgets.arrow.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 i18n=\"@@ngx.dashboard.widgets.label.dialog.title\">\r\n      Label Settings\r\n    </h2>\r\n    <mat-dialog-content>\r\n      <mat-form-field appearance=\"outline\" class=\"label-text-field\">\r\n        <mat-label i18n=\"@@ngx.dashboard.widgets.label.dialog.labelText\"\r\n          >Label Text</mat-label\r\n        >\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          i18n-placeholder=\"@@ngx.dashboard.widgets.label.dialog.placeholder\"\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          i18n=\"@@ngx.dashboard.widgets.label.dialog.responsive\"\r\n        >\r\n          Responsive Text\r\n        </mat-slide-toggle>\r\n        <span\r\n          class=\"toggle-description\"\r\n          i18n=\"@@ngx.dashboard.widgets.label.dialog.responsiveDescription\"\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\r\n          class=\"section-label\"\r\n          i18n=\"@@ngx.dashboard.widgets.label.dialog.fontSizeLimits\"\r\n        >\r\n          Font Size Limits\r\n        </div>\r\n        <div class=\"row-layout\">\r\n          <mat-form-field appearance=\"outline\">\r\n            <mat-label i18n=\"@@ngx.dashboard.widgets.label.dialog.minSize\"\r\n              >Min Size (px)</mat-label\r\n            >\r\n            <input\r\n              matInput\r\n              type=\"number\"\r\n              [value]=\"minFontSize()\"\r\n              (input)=\"\r\n                validateAndCorrectMinFontSize(+$any($event.target).value)\r\n              \"\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              <span i18n=\"@@ngx.dashboard.widgets.label.dialog.minSizeError\"\r\n                >Must be between 8-24px</span\r\n              >\r\n              } @else {\r\n              <span\r\n                i18n=\"@@ngx.dashboard.widgets.label.dialog.minSizeRangeError\"\r\n                >Must be less than max size</span\r\n              >\r\n              }\r\n            </mat-error>\r\n            } @else {\r\n            <mat-hint i18n=\"@@ngx.dashboard.widgets.label.dialog.minSizeHint\"\r\n              >8-24px range</mat-hint\r\n            >\r\n            }\r\n          </mat-form-field>\r\n\r\n          <mat-form-field appearance=\"outline\">\r\n            <mat-label i18n=\"@@ngx.dashboard.widgets.label.dialog.maxSize\"\r\n              >Max Size (px)</mat-label\r\n            >\r\n            <input\r\n              matInput\r\n              type=\"number\"\r\n              [value]=\"maxFontSize()\"\r\n              (input)=\"\r\n                validateAndCorrectMaxFontSize(+$any($event.target).value)\r\n              \"\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              <span i18n=\"@@ngx.dashboard.widgets.label.dialog.maxSizeError\"\r\n                >Must be between 16-128px</span\r\n              >\r\n              } @else {\r\n              <span\r\n                i18n=\"@@ngx.dashboard.widgets.label.dialog.maxSizeRangeError\"\r\n                >Must be greater than min size</span\r\n              >\r\n              }\r\n            </mat-error>\r\n            } @else {\r\n            <mat-hint i18n=\"@@ngx.dashboard.widgets.label.dialog.maxSizeHint\"\r\n              >16-128px range</mat-hint\r\n            >\r\n            }\r\n          </mat-form-field>\r\n        </div>\r\n\r\n        <!-- Template String field -->\r\n        <mat-form-field appearance=\"outline\">\r\n          <mat-label i18n=\"@@ngx.dashboard.widgets.label.dialog.templateString\"\r\n            >Template String</mat-label\r\n          >\r\n          <input\r\n            matInput\r\n            type=\"text\"\r\n            [value]=\"templateString() || ''\"\r\n            (input)=\"templateString.set($any($event.target).value || undefined)\"\r\n            i18n-placeholder=\"@@ngx.dashboard.widgets.label.dialog.templateStringPlaceholder\"\r\n            placeholder=\"Optional: Text to use for size calculation\"\r\n          />\r\n          <mat-hint i18n=\"@@ngx.dashboard.widgets.label.dialog.templateStringHint\"\r\n            >Use when displayed text varies but size should remain consistent</mat-hint\r\n          >\r\n        </mat-form-field>\r\n      </div>\r\n      }\r\n\r\n      <div class=\"row-layout\">\r\n        <mat-form-field appearance=\"outline\">\r\n          <mat-label i18n=\"@@ngx.dashboard.widgets.label.dialog.fontSize\"\r\n            >Font Size (px)</mat-label\r\n          >\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 i18n=\"@@ngx.dashboard.widgets.label.dialog.alignment\"\r\n            >Alignment</mat-label\r\n          >\r\n          <mat-select\r\n            [value]=\"alignment()\"\r\n            (selectionChange)=\"alignment.set($any($event.value))\"\r\n          >\r\n            <mat-option\r\n              value=\"left\"\r\n              i18n=\"@@ngx.dashboard.widgets.label.dialog.alignment.left\"\r\n              >Left</mat-option\r\n            >\r\n            <mat-option\r\n              value=\"center\"\r\n              i18n=\"@@ngx.dashboard.widgets.label.dialog.alignment.center\"\r\n              >Center</mat-option\r\n            >\r\n            <mat-option\r\n              value=\"right\"\r\n              i18n=\"@@ngx.dashboard.widgets.label.dialog.alignment.right\"\r\n              >Right</mat-option\r\n            >\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 i18n=\"@@ngx.dashboard.widgets.label.dialog.fontWeight\"\r\n          >Font Weight</mat-label\r\n        >\r\n        <mat-select\r\n          [value]=\"fontWeight()\"\r\n          (selectionChange)=\"fontWeight.set($any($event.value))\"\r\n        >\r\n          <mat-option\r\n            value=\"normal\"\r\n            i18n=\"@@ngx.dashboard.widgets.label.dialog.fontWeight.normal\"\r\n            >Normal</mat-option\r\n          >\r\n          <mat-option\r\n            value=\"bold\"\r\n            i18n=\"@@ngx.dashboard.widgets.label.dialog.fontWeight.bold\"\r\n            >Bold</mat-option\r\n          >\r\n        </mat-select>\r\n      </mat-form-field>\r\n\r\n      <!-- Opacity Slider -->\r\n      <div class=\"slider-section\">\r\n        <div\r\n          class=\"slider-label\"\r\n          i18n=\"@@ngx.dashboard.widgets.label.dialog.opacity\"\r\n        >\r\n          Opacity: {{ formatOpacity(opacity()) }}%\r\n        </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          i18n=\"@@ngx.dashboard.widgets.label.dialog.background\"\r\n        >\r\n          Background\r\n        </mat-slide-toggle>\r\n        <span\r\n          class=\"toggle-description\"\r\n          i18n=\"@@ngx.dashboard.widgets.label.dialog.backgroundDescription\"\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\r\n        mat-button\r\n        (click)=\"onCancel()\"\r\n        i18n=\"@@ngx.dashboard.common.cancel\"\r\n      >\r\n        Cancel\r\n      </button>\r\n      <button\r\n        mat-flat-button\r\n        (click)=\"save()\"\r\n        [disabled]=\"!hasChanged() || !isFormValid()\"\r\n        i18n=\"@@ngx.dashboard.common.save\"\r\n      >\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(\r\n          --mat-app-surface-variant,\r\n          rgba(var(--mat-app-on-surface-rgb, 0, 0, 0), 0.05)\r\n        );\r\n        border: 1px solid\r\n          var(\r\n            --mat-app-outline-variant,\r\n            rgba(var(--mat-app-on-surface-rgb, 0, 0, 0), 0.12)\r\n          );\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(\r\n          --mat-app-on-surface-variant,\r\n          rgba(var(--mat-app-on-surface-rgb, 0, 0, 0), 0.6)\r\n        );\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>(\r\n    !(this.data.hasBackground ?? true)\r\n  );\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  readonly templateString = signal<string | undefined>(this.data.templateString);\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  private readonly originalTemplateString = this.data.templateString;\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    () =>\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      this.templateString() !== this.originalTemplateString\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    const state: LabelWidgetState = {\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    };\r\n\r\n    // Only include templateString if it has a value\r\n    const templateString = this.templateString();\r\n    if (templateString) {\r\n      state.templateString = templateString;\r\n    }\r\n\r\n    this.dialogRef.close(state);\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  effect,\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 libResponsiveText [minFontSize]=\"12\" [maxFontSize]=\"72\">Dynamic text here</span>\r\n *   <span libResponsiveText [templateString]=\"'Template for sizing'\">Shorter text</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  /** Template string to use for size calculations instead of actual content */\r\n  templateString = input<string | undefined>(undefined);\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 lastTemplateString = '';\r\n  private lastMaxW = 0;\r\n  private lastMaxH = 0;\r\n  private lastFontSize = 0;\r\n  private isViewInitialized = false;\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    // Watch for input changes and trigger refit\r\n    effect(() => {\r\n      // Access the signals to track them (triggers when they change)\r\n      this.templateString();\r\n      this.minFontSize();\r\n      this.maxFontSize();\r\n\r\n      // Only trigger refit if directive is initialized and view is ready\r\n      if (this.isViewInitialized && isPlatformBrowser(this.platformId)) {\r\n        this.zone.runOutsideAngular(() => {\r\n          this.requestFit();\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n  ngAfterViewInit() {\r\n    if (!isPlatformBrowser(this.platformId)) return;\r\n\r\n    // Mark as initialized for the effect to start watching\r\n    this.isViewInitialized = true;\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 actualText = span.textContent?.trim() || '';\r\n    const templateString = this.templateString()?.trim();\r\n    const measureText = templateString || actualText;\r\n\r\n    if (!measureText) {\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      actualText === this.lastText &&\r\n      (templateString || '') === this.lastTemplateString &&\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(measureText, 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 = actualText;\r\n    this.lastTemplateString = templateString || '';\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  // Template string for size calculations (when different from displayed text)\r\n  templateString?: string;\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: $localize`:@@ngx.dashboard.widgets.label.name:Label`,\r\n    description: $localize`:@@ngx.dashboard.widgets.label.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    const state = { ...this.state() };\r\n    // Remove templateString if undefined to maintain backward compatibility\r\n    if (state.templateString === undefined) {\r\n      delete state.templateString;\r\n    }\r\n    return 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  readonly templateString = computed(() => this.state().templateString);\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()\" [templateString]=\"templateString()\">{{ 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 i18n=\"@@ngx.dashboard.widgets.clock.dialog.title\">\r\n      Clock Settings\r\n    </h2>\r\n    <mat-dialog-content>\r\n      <div class=\"mode-selection\">\r\n        <label\r\n          class=\"section-label\"\r\n          for=\"mode-selection-group\"\r\n          i18n=\"@@ngx.dashboard.widgets.clock.dialog.displayMode\"\r\n          >Display Mode</label\r\n        >\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\r\n            value=\"digital\"\r\n            i18n=\"@@ngx.dashboard.widgets.clock.dialog.mode.digital\"\r\n            >Digital</mat-radio-button\r\n          >\r\n          <mat-radio-button\r\n            value=\"analog\"\r\n            i18n=\"@@ngx.dashboard.widgets.clock.dialog.mode.analog\"\r\n            >Analog</mat-radio-button\r\n          >\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\r\n          class=\"section-label\"\r\n          for=\"time-format-group\"\r\n          i18n=\"@@ngx.dashboard.widgets.clock.dialog.timeFormat\"\r\n          >Time Format</label\r\n        >\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\r\n            value=\"24h\"\r\n            i18n=\"@@ngx.dashboard.widgets.clock.dialog.format.24h\"\r\n            >24 Hour (14:30:45)</mat-radio-button\r\n          >\r\n          <mat-radio-button\r\n            value=\"12h\"\r\n            i18n=\"@@ngx.dashboard.widgets.clock.dialog.format.12h\"\r\n            >12 Hour (2:30:45 PM)</mat-radio-button\r\n          >\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          i18n=\"@@ngx.dashboard.widgets.clock.dialog.showSeconds\"\r\n        >\r\n          Show Seconds\r\n        </mat-slide-toggle>\r\n        <span class=\"toggle-description\">\r\n          @if (mode() === 'digital') {\r\n          <span\r\n            i18n=\"\r\n              @@ngx.dashboard.widgets.clock.dialog.showSecondsDescription.digital\"\r\n            >Display seconds in the time</span\r\n          >\r\n          } @else {\r\n          <span\r\n            i18n=\"\r\n              @@ngx.dashboard.widgets.clock.dialog.showSecondsDescription.analog\"\r\n            >Show the second hand on the clock</span\r\n          >\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          i18n=\"@@ngx.dashboard.widgets.clock.dialog.background\"\r\n        >\r\n          Background\r\n        </mat-slide-toggle>\r\n        <span\r\n          class=\"toggle-description\"\r\n          i18n=\"@@ngx.dashboard.widgets.clock.dialog.backgroundDescription\"\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\r\n        mat-button\r\n        (click)=\"onCancel()\"\r\n        i18n=\"@@ngx.dashboard.common.cancel\"\r\n      >\r\n        Cancel\r\n      </button>\r\n      <button\r\n        mat-flat-button\r\n        (click)=\"save()\"\r\n        [disabled]=\"!hasChanged()\"\r\n        i18n=\"@@ngx.dashboard.common.save\"\r\n      >\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}\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: $localize`:@@ngx.dashboard.widgets.clock.name:Clock`,\r\n    description: $localize`:@@ngx.dashboard.widgets.clock.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\r\n      mat-dialog-title\r\n      i18n=\"@@ngx.dashboard.widgets.radialGauge.dialog.title\"\r\n    >\r\n      Radial Gauge Settings\r\n    </h2>\r\n    <mat-dialog-content>\r\n      <mat-form-field>\r\n        <mat-label i18n=\"@@ngx.dashboard.widgets.radialGauge.dialog.value\"\r\n          >Value (0-100)</mat-label\r\n        >\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 i18n=\"@@ngx.dashboard.widgets.radialGauge.dialog.colorProfile\">\r\n          Color Profile\r\n        </h4>\r\n        <mat-radio-group [(ngModel)]=\"localState.colorProfile\">\r\n          <mat-radio-button\r\n            value=\"dynamic\"\r\n            i18n=\"\r\n              @@ngx.dashboard.widgets.radialGauge.dialog.colorProfile.dynamic\"\r\n            >Dynamic (Theme Colors)</mat-radio-button\r\n          >\r\n          <mat-radio-button\r\n            value=\"static\"\r\n            i18n=\"\r\n              @@ngx.dashboard.widgets.radialGauge.dialog.colorProfile.static\"\r\n            >Static (Performance Colors)</mat-radio-button\r\n          >\r\n        </mat-radio-group>\r\n      </div>\r\n\r\n      <div class=\"toggle-section\">\r\n        <mat-slide-toggle\r\n          [(ngModel)]=\"localState.active\"\r\n          i18n=\"@@ngx.dashboard.widgets.radialGauge.dialog.activeDisplay\"\r\n        >\r\n          Active Display\r\n        </mat-slide-toggle>\r\n        <p\r\n          class=\"toggle-description\"\r\n          i18n=\"\r\n            @@ngx.dashboard.widgets.radialGauge.dialog.activeDisplayDescription\"\r\n        >\r\n          Display live gauge instead of passive icon\r\n        </p>\r\n      </div>\r\n\r\n      <div class=\"toggle-section\">\r\n        <mat-slide-toggle\r\n          [(ngModel)]=\"localState.hasBackground\"\r\n          i18n=\"@@ngx.dashboard.widgets.radialGauge.dialog.background\"\r\n        >\r\n          Background\r\n        </mat-slide-toggle>\r\n        <p\r\n          class=\"toggle-description\"\r\n          i18n=\"\r\n            @@ngx.dashboard.widgets.radialGauge.dialog.backgroundDescription\"\r\n        >\r\n          Add a background color to the widget\r\n        </p>\r\n      </div>\r\n\r\n      <div class=\"toggle-section\">\r\n        <mat-slide-toggle\r\n          [(ngModel)]=\"localState.showValueLabel\"\r\n          i18n=\"@@ngx.dashboard.widgets.radialGauge.dialog.showValueLabel\"\r\n        >\r\n          Show Value Label\r\n        </mat-slide-toggle>\r\n        <p\r\n          class=\"toggle-description\"\r\n          i18n=\"\r\n            @@ngx.dashboard.widgets.radialGauge.dialog.showValueLabelDescription\"\r\n        >\r\n          Display numeric value in gauge center\r\n        </p>\r\n      </div>\r\n    </mat-dialog-content>\r\n\r\n    <mat-dialog-actions align=\"end\">\r\n      <button\r\n        mat-button\r\n        (click)=\"onCancel()\"\r\n        i18n=\"@@ngx.dashboard.common.cancel\"\r\n      >\r\n        Cancel\r\n      </button>\r\n      <button\r\n        mat-flat-button\r\n        (click)=\"onSave()\"\r\n        i18n=\"@@ngx.dashboard.common.save\"\r\n      >\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      .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(\r\n    MatDialogRef<RadialGaugeStateDialogComponent>\r\n  );\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}\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: $localize`:@@ngx.dashboard.widgets.radialGauge.name:Radial Gauge`,\r\n    description: $localize`:@@ngx.dashboard.widgets.radialGauge.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// Library version\r\nexport { NGX_DASHBOARD_WIDGETS_VERSION } from './lib/version';\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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"}