{"version":3,"file":"softwarity-timezone-select.mjs","sources":["../../src/lib/timezone-select.component.ts","../../src/public-api.ts","../../src/softwarity-timezone-select.ts"],"sourcesContent":["import {\n  Component,\n  ChangeDetectionStrategy,\n  DestroyRef,\n  ElementRef,\n  Input,\n  model,\n  output,\n  OnDestroy,\n  effect,\n  inject,\n  signal,\n  computed,\n  booleanAttribute\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport type { FormValueControl } from '@angular/forms/signals';\nimport { MatFormFieldControl } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { Subject } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { coerceBooleanProperty, BooleanInput } from '@angular/cdk/coercion';\n\n// Get timezone offset string like \"+05:30\" or \"-08:00\"\nfunction getOffsetString(timezone: string): string {\n  const formatter = new Intl.DateTimeFormat('en-US', {\n    timeZone: timezone,\n    timeZoneName: 'shortOffset'\n  });\n  const parts = formatter.formatToParts(new Date());\n  const tzPart = parts.find(p => p.type === 'timeZoneName');\n  if (!tzPart) return '+00:00';\n\n  // Parse \"GMT+5:30\" or \"GMT-8\" or \"GMT\" -> \"+05:30\" or \"-08:00\" or \"+00:00\"\n  const match = tzPart.value.match(/GMT([+-])?(\\d+)?(?::(\\d+))?/);\n  if (!match) return '+00:00';\n\n  const sign = match[1] || '+';\n  const hours = (match[2] || '0').padStart(2, '0');\n  const minutes = (match[3] || '0').padStart(2, '0');\n  return `${sign}${hours}:${minutes}`;\n}\n\n// Build timezone map grouped by offset\nfunction buildTimezoneMap(): Record<string, string[]> {\n  return Intl.supportedValuesOf('timeZone').reduce((res: Record<string, string[]>, zone: string) => {\n    const offset = getOffsetString(zone);\n    res[offset] = res[offset] || [];\n    res[offset].push(zone);\n    return res;\n  }, { '+00:00': ['UTC'] });\n}\n\n// Convert offset string to minutes for sorting\nfunction offsetToMinutes(offset: string): number {\n  const match = offset.match(/([+-])(\\d{2}):(\\d{2})/);\n  if (!match) return 0;\n  const sign = match[1] === '-' ? -1 : 1;\n  return sign * (parseInt(match[2], 10) * 60 + parseInt(match[3], 10));\n}\n\nconst TIMEZONE_MAP = buildTimezoneMap();\nconst SORTED_OFFSETS = Object.keys(TIMEZONE_MAP).sort((a, b) => offsetToMinutes(a) - offsetToMinutes(b));\n\n// Compile-time check of the Signal Forms contract. `disabled` and `required`\n// are excluded: MatFormFieldControl forces them to be plain accessors, while\n// FormUiControl types them as optional input signals. The `Field` directive\n// detects the `value` model structurally, so `[formField]` binds regardless.\ntype TimezoneValueControl = Omit<FormValueControl<string | null>, 'disabled' | 'required'>;\n\nlet nextId = 0;\n\n@Component({\n  selector: 'timezone-select',\n  imports: [\n    ReactiveFormsModule,\n    MatSelectModule\n  ],\n  template: `\n    <div class=\"timezone-control\">\n      <mat-select\n        [formControl]=\"selectControl\"\n        class=\"timezone-dropdown\"\n        hideSingleSelectionIndicator>\n        @for (tz of filteredTimezones(); track tz) {\n          <mat-option [value]=\"tz\">\n            @if (showDetectButton && tz === browserTimezone) {\n              <svg class=\"browser-tz-icon\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n                <path d=\"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\"/>\n              </svg>\n            }\n            {{ tz }}\n          </mat-option>\n        }\n      </mat-select>\n      <div class=\"offset-nav\" [class.disabled]=\"_disabled\">\n        <svg\n          class=\"nav-icon\"\n          [class.disabled]=\"_disabled\"\n          (click)=\"previousOffset()\"\n          viewBox=\"0 0 24 24\"\n          fill=\"currentColor\">\n          <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"/>\n        </svg>\n        <span class=\"offset-value\">{{ currentOffset() }}</span>\n        <svg\n          class=\"nav-icon\"\n          [class.disabled]=\"_disabled\"\n          (click)=\"nextOffset()\"\n          viewBox=\"0 0 24 24\"\n          fill=\"currentColor\">\n          <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"/>\n        </svg>\n      </div>\n      @if (showDetectButton) {\n        <div class=\"detect-btn-wrapper\" [class.disabled]=\"_disabled || isBrowserTimezone()\">\n          <svg\n            class=\"detect-btn\"\n            [class.disabled]=\"_disabled || isBrowserTimezone()\"\n            (click)=\"detectBrowserTimezone()\"\n            viewBox=\"0 0 24 24\"\n            fill=\"currentColor\"\n            title=\"Detect browser timezone\">\n            <path d=\"M12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm8.94 3c-.46-4.17-3.77-7.48-7.94-7.94V1h-2v2.06C6.83 3.52 3.52 6.83 3.06 11H1v2h2.06c.46 4.17 3.77 7.48 7.94 7.94V23h2v-2.06c4.17-.46 7.48-3.77 7.94-7.94H23v-2h-2.06zM12 19c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z\"/>\n          </svg>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n\n    .timezone-control {\n      display: flex;\n      align-items: center;\n      gap: 0.5rem;\n    }\n\n    .offset-nav {\n      display: flex;\n      align-items: center;\n      flex-shrink: 0;\n      background: var(--mat-sys-surface-container);\n      border-radius: 4px;\n      padding: 2px;\n\n      &.disabled {\n        opacity: 0.38;\n      }\n    }\n\n    .nav-icon {\n      width: 20px;\n      height: 20px;\n      cursor: pointer;\n      opacity: 0.7;\n      transition: opacity 0.15s;\n\n      &:hover:not(.disabled) {\n        opacity: 1;\n      }\n\n      &.disabled {\n        opacity: 0.3;\n        cursor: default;\n        pointer-events: none;\n      }\n    }\n\n    .offset-value {\n      font-family: monospace;\n      font-size: 0.8125rem;\n      min-width: 2.75rem;\n      text-align: center;\n    }\n\n    .timezone-dropdown {\n      flex: 1;\n      min-width: 0;\n    }\n\n    .browser-tz-icon {\n      width: 16px;\n      height: 16px;\n      margin-right: 6px;\n      vertical-align: middle;\n      opacity: 0.7;\n      color: var(--mat-sys-primary);\n    }\n\n    .detect-btn-wrapper {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      flex-shrink: 0;\n      background: var(--mat-sys-surface-container);\n      color: var(--mat-sys-on-surface);\n      border-radius: 4px;\n      padding: 2px;\n\n      &.disabled {\n        opacity: 0.38;\n      }\n    }\n\n    .detect-btn {\n      width: 20px;\n      height: 20px;\n      cursor: pointer;\n      opacity: 0.7;\n      transition: opacity 0.15s;\n\n      &:hover:not(.disabled) {\n        opacity: 1;\n      }\n\n      &.disabled {\n        opacity: 0.3;\n        cursor: default;\n        pointer-events: none;\n      }\n    }\n  `],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [\n    {\n      provide: MatFormFieldControl,\n      useExisting: TimezoneSelectComponent\n    }\n  ],\n  host: {\n    '[id]': 'id',\n    '[attr.aria-describedby]': 'describedBy'\n  }\n})\nexport class TimezoneSelectComponent implements TimezoneValueControl, OnDestroy {\n  private readonly focusMonitor = inject(FocusMonitor);\n  private readonly elementRef = inject(ElementRef<HTMLElement>);\n  private readonly destroyRef = inject(DestroyRef);\n\n  // FormValueControl: the selected IANA timezone. One signal drives every\n  // binding style — `[(value)]`, `[value]` + `(valueChange)`, and Signal Forms'\n  // `[formField]` (which detects the `value` model). The legacy\n  // ControlValueAccessor was removed: Angular forbids implementing both, and\n  // `[formControl]`/`ngModel` never learn about signal controls.\n  readonly value = model<string | null>(null);\n\n  // Emitted when focus leaves the control — lets Signal Forms'\n  // `debounce('blur')` treat this control like a native input.\n  readonly touch = output<void>();\n\n  // MatFormFieldControl properties\n  stateChanges = new Subject<void>();\n  focused = false;\n  controlType = 'timezone-select';\n  id = `timezone-select-${nextId++}`;\n  describedBy = '';\n  // mat-form-field reads this to pick its error-state strategy; there is no\n  // NgControl without a ControlValueAccessor.\n  readonly ngControl = null;\n\n  // Inputs - using @Input for MatFormFieldControl compatibility\n  @Input() placeholder = '';\n  @Input({ transform: booleanAttribute }) showDetectButton = false;\n\n  private _required = false;\n  @Input()\n  get required(): boolean {\n    return this._required;\n  }\n  set required(value: BooleanInput) {\n    this._required = coerceBooleanProperty(value);\n    this.stateChanges.next();\n  }\n\n  selectControl = new FormControl<string | null>(null);\n  private currentOffsetIndex = signal(SORTED_OFFSETS.indexOf('+00:00'));\n\n  // Browser timezone detection\n  readonly browserTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n  currentOffset = computed(() => SORTED_OFFSETS[this.currentOffsetIndex()] ?? '+00:00');\n  filteredTimezones = computed(() => TIMEZONE_MAP[this.currentOffset()] || []);\n  isBrowserTimezone = computed(() => this.value() === this.browserTimezone);\n\n  _disabled = false;\n\n  @Input()\n  get disabled(): boolean {\n    return this._disabled;\n  }\n  set disabled(value: BooleanInput) {\n    this._disabled = coerceBooleanProperty(value);\n    if (this._disabled) {\n      this.selectControl.disable({ emitEvent: false });\n    } else {\n      this.selectControl.enable({ emitEvent: false });\n    }\n    this.stateChanges.next();\n  }\n\n  get empty(): boolean {\n    return !this.selectControl.value;\n  }\n\n  get shouldLabelFloat(): boolean {\n    return this.focused || !this.empty;\n  }\n\n  get errorState(): boolean {\n    return this.selectControl.invalid && this.selectControl.touched;\n  }\n\n  constructor() {\n    this.focusMonitor.monitor(this.elementRef, true).subscribe(origin => {\n      if (this.focused && !origin) {\n        this.touch.emit();\n      }\n      this.focused = !!origin;\n      this.stateChanges.next();\n    });\n\n    // View -> model: the inner mat-select is the only user entry point.\n    this.selectControl.valueChanges\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(value => {\n        if (value !== this.value()) {\n          this.value.set(value);\n        }\n        this.stateChanges.next();\n      });\n\n    // Model -> view: navigate to the value's offset and sync the inner select.\n    // setValue never re-emits, so the subscription above cannot loop back.\n    effect(() => {\n      const value = this.value();\n      if (value) {\n        const idx = SORTED_OFFSETS.indexOf(getOffsetString(value));\n        if (idx !== -1) {\n          this.currentOffsetIndex.set(idx);\n        }\n      }\n      if (this.selectControl.value !== value) {\n        this.selectControl.setValue(value, { emitEvent: false });\n      }\n      this.stateChanges.next();\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.stateChanges.complete();\n    this.focusMonitor.stopMonitoring(this.elementRef);\n  }\n\n  // MatFormFieldControl implementation\n  setDescribedByIds(ids: string[]): void {\n    this.describedBy = ids.join(' ');\n  }\n\n  onContainerClick(): void {\n    this.touch.emit();\n  }\n\n  // Component methods\n  previousOffset(): void {\n    if (this._disabled) return;\n    const idx = this.currentOffsetIndex();\n    // Loop infinitely: go to last offset if at first\n    const newIdx = idx > 0 ? idx - 1 : SORTED_OFFSETS.length - 1;\n    this.currentOffsetIndex.set(newIdx);\n    this.clearSelectionIfNotInOffset();\n  }\n\n  nextOffset(): void {\n    if (this._disabled) return;\n    const idx = this.currentOffsetIndex();\n    // Loop infinitely: go to first offset if at last\n    const newIdx = idx < SORTED_OFFSETS.length - 1 ? idx + 1 : 0;\n    this.currentOffsetIndex.set(newIdx);\n    this.clearSelectionIfNotInOffset();\n  }\n\n  detectBrowserTimezone(): void {\n    if (this._disabled) return;\n    if (this.browserTimezone) {\n      // The model effect navigates to its offset and updates the select.\n      this.value.set(this.browserTimezone);\n    }\n  }\n\n  private clearSelectionIfNotInOffset(): void {\n    const current = this.selectControl.value;\n    if (current && !this.filteredTimezones().includes(current)) {\n      this.selectControl.setValue(null, { emitEvent: false });\n      this.value.set(null);\n      this.stateChanges.next();\n    }\n  }\n}\n","/*\n * Public API Surface of timezone-select\n */\n\nexport { TimezoneSelectComponent } from './lib/timezone-select.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}